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; } }
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)); } }
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); }
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())); } }
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); }