using System; using System.Collections.Generic; using System.Linq; using aoc2019.lib; namespace aoc2019 { internal sealed class Day11 : Day { private readonly IntCodeVM vm; private Direction heading; private long x, y; public Day11() { vm = new IntCodeVM(Input.First()); } public override int DayNumber => 11; private void Move() { switch (heading) { case Direction.Up: y++; break; case Direction.Down: y--; break; case Direction.Left: x--; break; case Direction.Right: x++; break; } ; } private void Turn(long direction) { switch (heading) { case Direction.Up: heading = direction == 0 ? Direction.Left : Direction.Right; break; case Direction.Down: heading = direction == 0 ? Direction.Right : Direction.Left; break; case Direction.Left: heading = direction == 0 ? Direction.Down : Direction.Up; break; case Direction.Right: heading = direction == 0 ? Direction.Up : Direction.Down; break; } Move(); } private Dictionary<(long x, long y), long> PaintShip(int initialVal) { var map = new Dictionary<(long, long), long>(); vm.Reset(); heading = Direction.Up; x = 0; y = 0; map[(x, y)] = initialVal; var haltType = IntCodeVM.HaltType.Waiting; while (haltType == IntCodeVM.HaltType.Waiting) { haltType = vm.Run(map.GetValueOrDefault((x, y))); map[(x, y)] = vm.Result; Turn(vm.Result); } return map; } protected override string Part1() { return $"{PaintShip(0).Count}"; } protected override string Part2() { var map = PaintShip(1); var minX = (int) map.Keys.Select(x => x.x).Min(); var maxX = (int) map.Keys.Select(x => x.x).Max(); var minY = (int) map.Keys.Select(x => x.y).Min(); var maxY = (int) map.Keys.Select(x => x.y).Max(); return Enumerable.Range(minY, maxY - minY + 1) .Select(y => Enumerable.Range(minX, maxX - minX + 1) .Select(x => map.GetValueOrDefault((x, y)) == 0 ? ' ' : '#') .ToDelimitedString() ) .Reverse() .ToDelimitedString(Environment.NewLine); } private enum Direction { Up, Down, Left, Right } } }