public static async Task Run() { var input = (await File.ReadAllTextAsync("inputs\\17.txt")); var myIntMachine = new SynchronousIntMachine(input); List <char> lines = new List <char> (); if (!File.Exists("outputs\\17.txt")) { while (myIntMachine.RunUntilBlockOrComplete() != SynchronousIntMachine.ReturnCode.Completed) { var o = myIntMachine.OutputQueue.Dequeue(); lines.Add((char)o); } var sb = new StringBuilder(); lines.ForEach(e => sb.Append(e)); if (!Directory.Exists("outputs")) { Directory.CreateDirectory("outputs"); } await File.WriteAllTextAsync("outputs\\17.txt", sb.ToString(), Encoding.ASCII); } var scaffold = (await File.ReadAllLinesAsync("outputs\\17.txt", Encoding.ASCII)).Where(e => e != "").ToArray(); var aparm = 0; for (int y = 0; y < scaffold.Length; y++) { for (int x = 0; x < scaffold [y].Length; x++) { aparm += GetIntersect(x, y, scaffold); } } Console.WriteLine("Part 1: " + aparm.ToString()); myIntMachine = new SynchronousIntMachine(input); myIntMachine.SetMemoryRegister(0, 2); var A = "L,12,L,8,R,10,R,10\n"; var B = "L,6,L,4,L,12\n"; var C = "R,10,L,8,L,4,R,10\n"; var seq = "A,B,A,B,C,B,A,C,B,C\n"; //use these to debug your input lengths //if you are stuck, try outputting the outputqueue after the vm is done running as ascii text // var la = A.ToCharArray ().Length; // var lb = B.ToCharArray ().Length; // var lc = C.ToCharArray ().Length; // var ls = seq.ToCharArray ().Length; myIntMachine.addASCIILine(seq); myIntMachine.addASCIILine(A); myIntMachine.addASCIILine(B); myIntMachine.addASCIILine(C); myIntMachine.addASCIILine("n\n"); var c = 0; while (myIntMachine.RunUntilBlockOrComplete() != SynchronousIntMachine.ReturnCode.Completed) { c++; } var part2 = myIntMachine.OutputQueue.Last(); Console.WriteLine("Part 2: " + part2.ToString()); }
public static async Task Run() { var input = await File.ReadAllTextAsync("inputs\\13.txt"); Dictionary <PointInt, tile_type> tiles = new Dictionary <PointInt, tile_type> (); var intMachine = new SynchronousIntMachine(input); while (intMachine.RunUntilBlockOrComplete() == ReturnCode.WrittenOutput) { while (intMachine.OutputQueue.Count < 3) { intMachine.RunUntilBlockOrComplete(); } var x = (int)intMachine.OutputQueue.Dequeue(); var y = (int)intMachine.OutputQueue.Dequeue(); var tile = intMachine.OutputQueue.Dequeue(); tiles [new PointInt(x, y)] = (tile_type)tile; } var blocks = tiles.Where(e => e.Value == tile_type.Block).Count(); Console.WriteLine("Part 1: " + blocks.ToString()); intMachine = new SynchronousIntMachine(input); intMachine.SetMemoryRegister(0, 2); long score = 0; var blockCount = blocks; var ball = Classes.Point.Empty; var paddle = Classes.Point.Empty; ReturnCode returnCode; while (blockCount > -1 && (returnCode = intMachine.RunUntilBlockOrComplete()) != ReturnCode.Completed) { switch (returnCode) { case ReturnCode.WaitingForInput: if (blockCount == 0) { blockCount = -1; break; } var joystickInput = ball.X.CompareTo(paddle.X); intMachine.InputQueue.Enqueue(joystickInput); break; case ReturnCode.WrittenOutput: while (intMachine.OutputQueue.Count < 3) { intMachine.RunUntilBlockOrComplete(); } var x = (int)intMachine.OutputQueue.Dequeue(); var y = (int)intMachine.OutputQueue.Dequeue(); var t = intMachine.OutputQueue.Dequeue(); if (x == -1) { score = t; } else { var tile = (tile_type)t; if (tile != tile_type.Block && tiles [new PointInt(x, y)] == tile_type.Block) { blockCount--; } tiles [new PointInt(x, y)] = tile; if (tile == tile_type.Ball) { ball = new Classes.Point(x, y); } else if (tile == tile_type.HorizPaddle) { paddle = new Classes.Point(x, y); } } break; } } Console.WriteLine("Part 2: " + score); }