protected override void Solve() { var amp = new Amplifier(ReadText()); var halted = false; while (!halted) { halted = amp.Run(); while (amp.Output.Count > 0) { Console.Write(amp.GetAsciiOutputIfInRange()); } amp.Input(Console.ReadLine() !); } }
protected override void Solve() { var N = 200; var grid = new bool[N + 1 + N, N + 1 + N]; var dir = (R : -1, c : 0); var pos = (R : N, c : N); grid.At(pos) = true; var halted = false; var amp = new Amplifier(ReadText()); // var painted = new HashSet<(int r, int c)>(); while (!halted) { amp.Input.Enqueue(grid.At(pos) ? 1 : 0); halted = amp.Run(); grid.At(pos) = amp.Output.Dequeue() == 1; // painted.Add(pos); dir = amp.Output.Dequeue() == 1 ? dir.Right() : dir.Left(); pos = pos.Plus(dir); } // Console.WriteLine(painted.Count); grid.Iter((_, j, b) => { if (b) { Console.Write('#'); } else { Console.Write('.'); } if (j == grid.R() - 1) { Console.WriteLine(); } }); }
// public static void Run(this Amplifier amp) => Amplifier.Run(amp); /// <returns>True if application halted, otherwise false.</returns> public static bool Run(this Amplifier amp) { while (amp.Ptr < amp.Prog.Length) { var opcode = amp.Prog[amp.Ptr] % 100; if (opcode == 99) { return(true); } // halt var modes = (amp.Prog[amp.Ptr] / 100).ToString("000"); ref long GetParam(int pos, Amplifier amp) { switch (modes[3 - pos]) { case '0': return(ref amp.Prog[amp.Prog[amp.Ptr + pos]]); case '1': return(ref amp.Prog[amp.Ptr + pos]); case '2': return(ref amp.Prog[amp.Prog[amp.Ptr + pos] + amp.Offset]); default: throw new ArgumentOutOfRangeException(); } } switch (opcode) { case 1: { GetParam(3, amp) = GetParam(1, amp) + GetParam(2, amp); amp.Ptr += 4; break; } case 2: { GetParam(3, amp) = GetParam(1, amp) * GetParam(2, amp); amp.Ptr += 4; break; } case 3: if (amp.Input.Count > 0) { GetParam(1, amp) = amp.Input.Dequeue(); amp.Ptr += 2; } else { return(false); } break; case 4: { amp.Output.Enqueue(GetParam(1, amp)); amp.Ptr += 2; break; } case 5: { if (GetParam(1, amp) != 0) { amp.Ptr = GetParam(2, amp); } else { amp.Ptr += 3; } break; } case 6: { if (GetParam(1, amp) == 0) { amp.Ptr = GetParam(2, amp); } else { amp.Ptr += 3; } break; } case 7: { GetParam(3, amp) = GetParam(1, amp) < GetParam(2, amp) ? 1 : 0; amp.Ptr += 4; break; } case 8: { GetParam(3, amp) = GetParam(1, amp) == GetParam(2, amp) ? 1 : 0; amp.Ptr += 4; break; } case 9: { amp.Offset += GetParam(1, amp); amp.Ptr += 2; break; } } }
public static void Input(this Amplifier amp, string command) { command.ForEach(ch => amp.Input.Enqueue(ch)); amp.Input.Enqueue('\n'); }
protected override void Solve() { var text = ReadText(); var pc = new Amplifier[50]; var network = new Queue <(long, long)> [50];
protected override void Solve() { var amp = new Amplifier(ReadText()); amp.Prog[0] = 2; var grid = new int[49, 42]; var p = (R : 0, C : 0); amp.Run(); while (amp.Output.Count > 0) { var o = amp.Output.Dequeue(); if (o == 10) { p = (p.R + 1, 0); Console.WriteLine(); } else { if (!p.OutOfBounds(grid.R(), grid.C())) { grid.At(p) = (int)o; if ((char)o == '^') { } } Console.Write((char)o); p = (p.R, p.C + 1); } } var res = "A,C,C,B,A,C,B,A,C,B\nL,6,R,12,L,4,L,6\nL,6,L,10,L,10,R,6\nR,6,L,6,R,12\ny\n"; var pathInt = res.Select(c => (long)c).ToArray(); pathInt.ForEach(amp.Input.Enqueue); amp.Run(); while (amp.Output.Count > 0) { var outp = amp.Output.Dequeue(); if (outp > 200) { Console.WriteLine(outp); } else { var ch = (char)outp; Console.Write(ch); } } // amp.Input.Enqueue(); // bool[,] scaffold = new bool[grid.L1(), grid.L2()]; // for (var i = 1; i < grid.L1() - 1; i++) // { // for (var j = 1; j < grid.L2() - 1; j++) // { // if (grid.At((i, j - 1)) == (int) '#' // && grid.At((i, j + 1)) == (int) '#' // && grid.At((i + 1, j)) == (int) '#' // && grid.At((i - 1, j)) == (int) '#' // && grid.At((i, j)) == (int) '#') // { // scaffold.At((i, j)) = true; // } // } // } // var path = BuildPath(grid, robot, (-1, 0)); // string BuildPath(int[,] grid, (int r, int c) robot, (int r, int c) dir) // { // bool[,] visited = new bool[grid.L1(), grid.L2()]; // visited.At(robot) = true; // var sb = new StringBuilder(); // while (true) // { // var left = robot.Plus(dir.Left()); // var right = robot.Plus(dir.Right()); // var front = robot.Plus(dir); // // bool Correct((int r, int c) point) // { // return !point.OutOfBounds(grid.L1(), grid.L2()) // && grid.At(point) == '#' // && (scaffold.At(point) || !visited.At(point)); // } // // (int r, int c) GetCorrectPoint() // { // if (Correct(front)) return front; // if (Correct(left)) // { // sb.Append('L'); // dir = dir.Left(); // return left; // } // // if (Correct(right)) // { // sb.Append('R'); // dir = dir.Right(); // return right; // } // // return (-100, -100); // } // // var correct = GetCorrectPoint(); // if (correct == (-100, -100)) // { // sb.Remove(sb.Length - 1, 1); // return sb.ToString(); // } // var count = 0; // while (Correct(correct)) // { // count++; // visited.At(correct) = true; // correct = correct.Plus(dir); // } // // robot = correct.Minus(dir); // // sb.Append(count); // sb.Append(','); // } // } // // Console.WriteLine(path); // var sum = 0; // for (var i = 1; i < grid.L1() - 1; i++) // { // for (var j = 1; j < grid.L2() - 1; j++) // { // if (grid.At((i, j - 1)) == (int) '#' // && grid.At((i, j + 1)) == (int) '#' // && grid.At((i + 1, j)) == (int) '#' // && grid.At((i - 1, j)) == (int) '#' // && grid.At((i, j)) == (int) '#') // { // sum += i * j; // } // } // } // Console.WriteLine(sum); }
protected override void Solve() { var amp = new Amplifier(ReadText()); var grid = new int[40, 24]; var halted = false; amp.Prog[0] = 2; var score = 0; var v = (x : 0, y : 0); var lastPos = (x : 0, y : 0); // amp.Input.Enqueue(0); // amp.Input.Enqueue(0); var tilePos = (x : -1, y : -1); while (!halted) { var move = 0; if (tilePos.x == -1) { move = int.Parse(Console.ReadLine() !); } else { if (tilePos.x == lastPos.x && tilePos.y == lastPos.y + 1) { move = 0; } else { move = (lastPos.x + v.x) - tilePos.x; } } Console.WriteLine("move: " + move); amp.Input.Enqueue(move); halted = amp.Run(); while (amp.Output.Count >= 3) { var x = (int)amp.Output.Dequeue(); var y = (int)amp.Output.Dequeue(); var type = (int)amp.Output.Dequeue(); if (x == -1 && y == 0) { score = type; } else { grid[x, y] = type; if (type == 3) { tilePos = (x, y); } else if (type == 4) { v = (x, y).Minus(lastPos); lastPos = (x, y); } } } grid.Print(lastPos); lastPos.ToString().Print(); score.ToString().Print(); } // '▮' Console.WriteLine("score: " + score); // var c = 0; // for (var i = 0; i < grid.L1(); i++) // { // for (var j = 0; j < grid.L2(); j++) // { // if (grid[i, j] == 2) c++; // } // } // grid.Count(tile => tile == 2); // Console.WriteLine(c); }