public override string?CalculateSolution() { IDynamicIndexable2D <int> screen = new DynamicIndexable2D <int>(); using IEnumerator <long> e = new IntcodeComputer(_initialMemory).Execute().GetEnumerator(); while (e.MoveNext()) { int x = (int)e.Current; if (!e.MoveNext()) { break; } int y = (int)e.Current; if (!e.MoveNext()) { break; } int id = (int)e.Current; screen[x, y] = id; } return(Solution = screen.Count(t => t == ScreenObject.Block).ToString()); }
public override string?CalculateSolution() { var computer = new IntcodeComputer(_initialMemory); var inputQueue = new Queue <long>(new[] { 0L }); IDynamicIndexable2D <bool> panels = new DynamicIndexable2D <bool>(); Position pos = Position.Zero; Direction direction = Direction.North; var paintedPanels = new HashSet <Position>(); using IEnumerator <long> e = computer.Execute(inputQueue).GetEnumerator(); while (e.MoveNext()) { long color = e.Current; long turn = e.MoveNext() ? e.Current : throw new InvalidOperationException(); panels[pos] = color == 1; paintedPanels.Add(pos); direction = turn == 1 ? direction.ToRight() : direction.ToLeft(); pos += direction * 1; inputQueue.Enqueue(panels[pos] ? 1 : 0); } return(Solution = paintedPanels.Count().ToString()); }
public override string?CalculateSolutionPartTwo() { var computer = new IntcodeComputer(_initialMemory); var inputQueue = new Queue <long>(new[] { 1L }); IDynamicIndexable2D <bool> panels = new DynamicIndexable2D <bool>(new[, ] { { true } }.AsIndexable()); Position pos = Position.Zero; Direction direction = Direction.North; using IEnumerator <long> e = computer.Execute(inputQueue).GetEnumerator(); while (e.MoveNext()) { long color = e.Current; long turn = e.MoveNext() ? e.Current : throw new InvalidOperationException(); panels[pos] = color == 1; direction = turn == 1 ? direction.ToRight() : direction.ToLeft(); pos += direction * 1; inputQueue.Enqueue(panels[pos] ? 1 : 0); } return(SolutionPartTwo = panels.ToString(b => b ? '#' : ' ', screenMode: true)); }
public static IDynamicIndexable2D <T> ToDynamicIndexable <T>(this IEnumerable <IEnumerable <T> > source) { var dindexable = new DynamicIndexable2D <T>(); using IEnumerator <IEnumerable <T> > e0 = source.GetEnumerator(); int i; for (i = 0; e0.MoveNext(); i++) { using IEnumerator <T> e1 = e0.Current.GetEnumerator(); int j; for (j = 0; e1.MoveNext(); j++) { dindexable[i, j] = e1.Current; } } return(dindexable); }
public override string?CalculateSolutionPartTwo() { IDynamicIndexable2D <int> screen = new DynamicIndexable2D <int>(); var computer = new IntcodeComputer(_initialMemory); computer.Memory[0] = 2; using IEnumerator <long> e = computer.Execute(PaddleMovesEnumerable()).GetEnumerator(); bool draw = false; long score = 0; int blockCount = 0; bool scoreDrawn = false; if (draw) { Console.Clear(); } while (e.MoveNext()) { int x = (int)e.Current; if (!e.MoveNext()) { break; } int y = (int)e.Current; if (!e.MoveNext()) { break; } int id = (int)e.Current; if (x == -1 && y == 0) { score = id; if (draw) { Console.SetCursorPosition(0, 0); Console.WriteLine($"Score: {score}"); Console.SetCursorPosition(0, 0); scoreDrawn = true; } } else { if (id == ScreenObject.Block && screen[x, y] != ScreenObject.Block) { blockCount++; } else if (id != ScreenObject.Block && screen[x, y] == ScreenObject.Block) { blockCount--; } screen[x, y] = id; if (draw) { Console.SetCursorPosition(x, y + 1); Console.Write(screen[x, y] switch { 1 => '+', 2 => 'x', 3 => '_', 4 => 'o', _ => ' ' });