Пример #1
0
        public static async Task <LispNode> Send(LispNode content)
        {
            try
            {
                var apiKey = "f6bc77050a4b4d2995b3f51b50155cdd";

                var httpClient = new HttpClient();
                var result     = await httpClient.SendAsync(
                    new HttpRequestMessage(
                        HttpMethod.Post,
                        $"https://icfpc2020-api.testkontur.ru/aliens/send?apiKey={apiKey}")
                {
                    Content = new StringContent(Modulate(content))
                });

                var response = Demodulate(await result.Content.ReadAsStringAsync()).Item1;
                Console.WriteLine($"  -> got {response}");
                Console.WriteLine($"Sent [{Common.Flatten(content)}], received [{Common.Flatten(response)}]");

                return(response);
            }
            catch (Exception e)
            {
                Console.WriteLine($"ERROR: Sent [content], received {e}");
                throw;
            }
        }
Пример #2
0
 public static Tuple <LispNode, string> Demodulate(string s)
 {
     if (s.StartsWith("00"))
     {
         return(Tuple.Create(
                    new LispNode("nil"),
                    s.Substring(2)));
     }
     else if (s.StartsWith("11"))
     {
         var first  = Demodulate(s.Substring(2));
         var second = Demodulate(first.Item2);
         var ans    = new LispNode();
         ans.Children.Add(new LispNode());
         ans.Children.First().Children.Add(new LispNode("cons"));
         ans.Children.First().Children.Add(first.Item1);
         ans.Children.Add(second.Item1);
         return(Tuple.Create(ans, second.Item2));
     }
     else
     {
         var value = DemodulateInt(s);
         var ans   = new LispNode(value.Item1.ToString());
         return(Tuple.Create(ans, value.Item2));
     }
 }
Пример #3
0
        public static LispNode Flatten(LispNode node)
        {
            if (node.Type == LispNodeType.Token)
            {
                return(node.Text == "nil" ? new LispNode() : node);
            }

            if (node[1].Type == LispNodeType.Token && node[1].Text != "nil")
            {
                return(new LispNode()
                {
                    new LispNode(node[0][1].Text), new LispNode(node[1].Text)
                });
            }

            var ans = new LispNode();

            while (node.Type != LispNodeType.Token)
            {
                ans.Add(Flatten(node.First().Last()));
                node = node.Last();
            }

            return(ans);
        }
Пример #4
0
 public static string Modulate(LispNode data)
 {
     if (data.Type == LispNodeType.Token)
     {
         if (data.Text == "nil")
         {
             return("00");
         }
         else
         {
             return(Modulate(BigInteger.Parse(data.Text)));
         }
     }
     else
     {
         return("11" + Modulate(data.Children.First().Children.Last()) + Modulate(data.Children.Last()));
     }
 }
Пример #5
0
        public static LispNode Unflatten(LispNode node)
        {
            if (node.Type == LispNodeType.Token)
            {
                return(node);
            }

            var ans = new LispNode("nil");

            foreach (var child in node.Reverse())
            {
                ans =
                    new LispNode()
                {
                    new LispNode()
                    {
                        new LispNode("cons"), Unflatten(child)
                    },
                    ans
                };
            }

            return(ans);
        }