2021-11-09 21:52:21 +00:00
|
|
|
namespace aoc2019;
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
public sealed class Day13 : Day
|
2019-12-13 20:35:49 +00:00
|
|
|
{
|
2021-11-09 21:52:21 +00:00
|
|
|
private readonly Dictionary<(int x, int y), int> board;
|
|
|
|
private readonly IntCodeVM vm;
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
public Day13() : base(13, "Care Package")
|
|
|
|
{
|
2021-12-01 19:56:16 +00:00
|
|
|
vm = new(Input.First());
|
2021-11-09 21:52:21 +00:00
|
|
|
board = new Dictionary<(int, int), int>();
|
|
|
|
}
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
private void UpdateTiles(IEnumerable<long> queue)
|
|
|
|
{
|
|
|
|
var input = queue.Select(i => (int)i).ToList();
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
for (var i = 0; i < input.Count - 2; i += 3)
|
|
|
|
{
|
|
|
|
var x = input[i];
|
|
|
|
var y = input[i + 1];
|
|
|
|
var val = input[i + 2];
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
if (board.ContainsKey((x, y)))
|
|
|
|
board[(x, y)] = val;
|
|
|
|
else
|
|
|
|
board.Add((x, y), val);
|
2019-12-13 20:35:49 +00:00
|
|
|
}
|
2021-11-09 21:52:21 +00:00
|
|
|
}
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
private void PrintBoard()
|
|
|
|
{
|
|
|
|
foreach (var ((x, y), value) in board)
|
2019-12-13 20:35:49 +00:00
|
|
|
{
|
2021-11-09 21:52:21 +00:00
|
|
|
if (x < 0 || y < 0) continue;
|
|
|
|
Console.SetCursorPosition(x, y);
|
|
|
|
Console.Write(value switch
|
2019-12-13 20:35:49 +00:00
|
|
|
{
|
2021-11-09 21:52:21 +00:00
|
|
|
0 => " ",
|
|
|
|
1 => "|",
|
|
|
|
2 => "B",
|
|
|
|
3 => "_",
|
|
|
|
4 => ".",
|
|
|
|
_ => value
|
|
|
|
});
|
2019-12-13 20:35:49 +00:00
|
|
|
}
|
2021-11-09 21:52:21 +00:00
|
|
|
}
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
public override string Part1()
|
|
|
|
{
|
|
|
|
vm.Reset();
|
|
|
|
vm.Run();
|
2021-12-01 19:31:42 +00:00
|
|
|
return $"{vm.Output.Where((v, i) => (i + 1) % 3 == 0 && v == 2).Count()}";
|
2021-11-09 21:52:21 +00:00
|
|
|
}
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
public override string Part2()
|
|
|
|
{
|
|
|
|
vm.Reset();
|
2021-12-01 19:31:42 +00:00
|
|
|
vm.Memory[0] = 2;
|
2021-11-09 21:52:21 +00:00
|
|
|
var printBoard = false;
|
|
|
|
var gameTicks = 0;
|
|
|
|
if (printBoard) Console.Clear();
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
var haltType = IntCodeVM.HaltType.Waiting;
|
|
|
|
while (haltType == IntCodeVM.HaltType.Waiting)
|
|
|
|
{
|
|
|
|
haltType = vm.Run();
|
2021-12-01 19:31:42 +00:00
|
|
|
UpdateTiles(vm.Output);
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
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);
|
2019-12-13 20:35:49 +00:00
|
|
|
|
2021-11-09 21:52:21 +00:00
|
|
|
gameTicks++;
|
|
|
|
if (printBoard) PrintBoard();
|
2019-12-13 20:35:49 +00:00
|
|
|
}
|
2021-11-09 21:52:21 +00:00
|
|
|
|
|
|
|
return $"after {gameTicks} moves, the score is: {board[(-1, 0)]}";
|
2019-12-13 20:35:49 +00:00
|
|
|
}
|
2021-12-01 19:31:42 +00:00
|
|
|
}
|