diff options
Diffstat (limited to 'Day13.cs')
-rw-r--r-- | Day13.cs | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/Day13.cs b/Day13.cs new file mode 100644 index 0000000..c666c72 --- /dev/null +++ b/Day13.cs @@ -0,0 +1,90 @@ +using aoc2019.lib; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace aoc2019 +{ + internal class Day13 : Day + { + public override int DayNumber => 13; + + private readonly IntCodeVM vm; + private readonly Dictionary<(int x, int y), int> board; + + public Day13() + { + vm = new IntCodeVM(Input.First()); + board = new Dictionary<(int, int), int>(); + } + + private void UpdateTiles(IEnumerable<long> queue) + { + var input = queue.Select(i => (int)i).ToList(); + + for (var i = 0; i < input.Count - 2; i += 3) + { + var x = input[i]; + var y = input[i + 1]; + var val = input[i + 2]; + + if (board.ContainsKey((x, y))) + board[(x, y)] = val; + else + board.Add((x, y), val); + } + + } + + private void PrintBoard() + { + foreach (var tile in board) + { + var (x, y) = tile.Key; + if (x < 0 || y < 0) continue; + Console.SetCursorPosition(x, y); + Console.Write(tile.Value switch + { + 0 => " ", + 1 => "|", + 2 => "B", + 3 => "_", + 4 => ".", + _ => tile.Value + }); + } + } + + public override string Part1() + { + vm.Reset(); + vm.Run(); + return $"{vm.output.Where((v, i) => (i + 1) % 3 == 0 && v == 2).Count()}"; + } + + public override string Part2() + { + vm.Reset(); + vm.memory[0] = 2; + var printboard = false; + var gameTicks = 0; + if (printboard) Console.Clear(); + + var haltType = IntCodeVM.HaltType.Waiting; + while (haltType == IntCodeVM.HaltType.Waiting) + { + haltType = vm.Run(); + UpdateTiles(vm.output); + + var (ball, _) = board.First(t => t.Value == 4).Key; + var (paddle, _) = board.First(t => t.Value == 3).Key; + vm.AddInput(ball > paddle ? 1 : ball < paddle ? -1 : 0); + + gameTicks++; + if (printboard) PrintBoard(); + } + + return $"after {gameTicks} moves, the score is: {board[(-1, 0)]}"; + } + } +} |