Compare commits
10 Commits
add1c06ad0
...
888c04ad33
| Author | SHA1 | Date | |
|---|---|---|---|
| 888c04ad33 | |||
| 39e647519b | |||
| b4ff211359 | |||
| a6032728d4 | |||
| a31005b922 | |||
| d459ff347f | |||
| b15c29a152 | |||
| 6fcf3b80ed | |||
| ab44e440e8 | |||
| 40d93e8927 |
289
Days/Day16.cs
Normal file
289
Days/Day16.cs
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
using System.Numerics;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace AdventOfCode.Days;
|
||||||
|
|
||||||
|
public class Day16 : Day
|
||||||
|
{
|
||||||
|
public override int Number => 16;
|
||||||
|
public override string Name => "Reindeer Maze";
|
||||||
|
|
||||||
|
private const int Size = 141;
|
||||||
|
|
||||||
|
private const char Wall = '#';
|
||||||
|
private const char Empty = '.';
|
||||||
|
private const char Start = 'S';
|
||||||
|
private const char End = 'E';
|
||||||
|
|
||||||
|
private static readonly Point DirectionUp = new(0, -1);
|
||||||
|
private static readonly Point DirectionDown = new(0, 1);
|
||||||
|
private static readonly Point DirectionLeft = new(-1, 0);
|
||||||
|
private static readonly Point DirectionRight = new(1, 0);
|
||||||
|
|
||||||
|
public override void RunPart1(bool display = true)
|
||||||
|
{
|
||||||
|
var (maze, start, end) = ParseMaze();
|
||||||
|
|
||||||
|
var visited = new Dictionary<(Point Position, Point Direction), int>();
|
||||||
|
|
||||||
|
var minimumScore = int.MaxValue;
|
||||||
|
|
||||||
|
var toVisit = new Queue<(Point Position, Point Direction, int Score)>();
|
||||||
|
|
||||||
|
toVisit.Enqueue((start, DirectionRight, 0));
|
||||||
|
|
||||||
|
while (toVisit.Count > 0)
|
||||||
|
{
|
||||||
|
var (position, direction, score) = toVisit.Dequeue();
|
||||||
|
|
||||||
|
if (visited.TryGetValue((position, direction), out var savedScore) && savedScore <= score)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[(position, direction)] = score;
|
||||||
|
|
||||||
|
// Reached end
|
||||||
|
if (position == end)
|
||||||
|
{
|
||||||
|
if (score < minimumScore)
|
||||||
|
{
|
||||||
|
minimumScore = score;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try forward if there is no wall
|
||||||
|
var destination = position + direction;
|
||||||
|
|
||||||
|
if (maze[destination.X, destination.Y] is not Wall)
|
||||||
|
{
|
||||||
|
toVisit.Enqueue((destination, direction, score + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also try changing direction
|
||||||
|
toVisit.Enqueue((position, NextDirection(direction), score + 1000));
|
||||||
|
toVisit.Enqueue((position, PreviousDirection(direction), score + 1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Lowest score: [yellow]{minimumScore}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RunPart2(bool display = true)
|
||||||
|
{
|
||||||
|
var (maze, start, end) = ParseMaze();
|
||||||
|
|
||||||
|
var visited = new Dictionary<(Point Position, Point Direction), int>();
|
||||||
|
|
||||||
|
var minimumScore = int.MaxValue;
|
||||||
|
|
||||||
|
var toVisit = new Queue<(Point Position, Point Direction, int Score)>();
|
||||||
|
|
||||||
|
toVisit.Enqueue((start, DirectionRight, 0));
|
||||||
|
|
||||||
|
// First we need to find minimum score
|
||||||
|
while (toVisit.Count > 0)
|
||||||
|
{
|
||||||
|
var (position, direction, score) = toVisit.Dequeue();
|
||||||
|
|
||||||
|
if (visited.TryGetValue((position, direction), out var savedScore) && savedScore <= score)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[(position, direction)] = score;
|
||||||
|
|
||||||
|
// Reached end
|
||||||
|
if (position == end)
|
||||||
|
{
|
||||||
|
if (score < minimumScore)
|
||||||
|
{
|
||||||
|
minimumScore = score;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try forward if there is no wall
|
||||||
|
var destination = position + direction;
|
||||||
|
|
||||||
|
if (maze[destination.X, destination.Y] is not Wall)
|
||||||
|
{
|
||||||
|
toVisit.Enqueue((destination, direction, score + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also try changing direction
|
||||||
|
toVisit.Enqueue((position, NextDirection(direction), score + 1000));
|
||||||
|
toVisit.Enqueue((position, PreviousDirection(direction), score + 1000));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now that we have minimum score, we need to find all the paths that lead to this score
|
||||||
|
var toVisitPath = new Stack<(Point Position, Point Direction, int Score, List<Point> Path)>();
|
||||||
|
toVisitPath.Push((start, DirectionRight, 0, []));
|
||||||
|
|
||||||
|
var minimumScorePaths = new List<List<Point>>();
|
||||||
|
|
||||||
|
while (toVisitPath.Count > 0)
|
||||||
|
{
|
||||||
|
var (position, direction, score, path) = toVisitPath.Pop();
|
||||||
|
|
||||||
|
if (score > minimumScore)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (visited.TryGetValue((position, direction), out var savedScore) && savedScore < score)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
path.Add(position);
|
||||||
|
|
||||||
|
// Reached end
|
||||||
|
if (position == end)
|
||||||
|
{
|
||||||
|
minimumScorePaths.Add(path);
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try forward if there is no wall
|
||||||
|
var destination = position + direction;
|
||||||
|
|
||||||
|
if (maze[destination.X, destination.Y] is not Wall)
|
||||||
|
{
|
||||||
|
toVisitPath.Push((destination, direction, score + 1, path));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also try changing direction
|
||||||
|
toVisitPath.Push((position, NextDirection(direction), score + 1000, path.ToList()));
|
||||||
|
toVisitPath.Push((position, PreviousDirection(direction), score + 1000, path.ToList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Unique positions in optimal paths: [yellow]{minimumScorePaths.SelectMany(l => l).ToHashSet().Count}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private (char[,] Maze, Point Start, Point end) ParseMaze()
|
||||||
|
{
|
||||||
|
var maze = new char[Size, Size];
|
||||||
|
Point start = default;
|
||||||
|
Point end = default;
|
||||||
|
|
||||||
|
var y = 0;
|
||||||
|
foreach (var line in Input.AsSpan().EnumerateLines())
|
||||||
|
{
|
||||||
|
var x = 0;
|
||||||
|
foreach (var symbol in line)
|
||||||
|
{
|
||||||
|
if (symbol is Start)
|
||||||
|
{
|
||||||
|
start = new Point(x, y);
|
||||||
|
|
||||||
|
maze[x, y] = Empty;
|
||||||
|
}
|
||||||
|
else if (symbol is End)
|
||||||
|
{
|
||||||
|
end = new Point(x, y);
|
||||||
|
|
||||||
|
maze[x, y] = Empty;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
maze[x, y] = symbol;
|
||||||
|
}
|
||||||
|
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (maze, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Point NextDirection(Point direction)
|
||||||
|
{
|
||||||
|
if (direction == DirectionUp)
|
||||||
|
{
|
||||||
|
return DirectionRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (direction == DirectionRight)
|
||||||
|
{
|
||||||
|
return DirectionDown;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (direction == DirectionDown)
|
||||||
|
{
|
||||||
|
return DirectionLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (direction == DirectionLeft)
|
||||||
|
{
|
||||||
|
return DirectionUp;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new ArgumentException("Invalid direction", nameof(direction));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Point PreviousDirection(Point direction)
|
||||||
|
{
|
||||||
|
if (direction == DirectionUp)
|
||||||
|
{
|
||||||
|
return DirectionLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (direction == DirectionLeft)
|
||||||
|
{
|
||||||
|
return DirectionDown;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (direction == DirectionDown)
|
||||||
|
{
|
||||||
|
return DirectionRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (direction == DirectionRight)
|
||||||
|
{
|
||||||
|
return DirectionUp;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new ArgumentException("Invalid direction", nameof(direction));
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly record struct Point(int X, int Y)
|
||||||
|
: IAdditionOperators<Point, Point, Point>,
|
||||||
|
ISubtractionOperators<Point, Point, Point>,
|
||||||
|
IMultiplyOperators<Point, int, Point>
|
||||||
|
{
|
||||||
|
public static Point operator +(Point left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(left.X + right.X, left.Y + right.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator -(Point left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(left.X - right.X, left.Y - right.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator *(Point left, int right)
|
||||||
|
{
|
||||||
|
return new Point(left.X * right, left.Y * right);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator *(int left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(right.X * left, right.Y * left);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static implicit operator Point((int X, int Y) point)
|
||||||
|
=> new(point.X, point.Y);
|
||||||
|
}
|
||||||
|
}
|
||||||
247
Days/Day17.cs
Normal file
247
Days/Day17.cs
Normal file
@@ -0,0 +1,247 @@
|
|||||||
|
using System.Numerics;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace AdventOfCode.Days;
|
||||||
|
|
||||||
|
public class Day17 : Day
|
||||||
|
{
|
||||||
|
public override int Number => 17;
|
||||||
|
public override string Name => "Chronospatial Computer";
|
||||||
|
|
||||||
|
public override void RunPart1(bool display = true)
|
||||||
|
{
|
||||||
|
var (registerA, registerB, registerC, program) = ParseState();
|
||||||
|
|
||||||
|
var toOutput = new List<int>();
|
||||||
|
var instructionPointer = 0;
|
||||||
|
|
||||||
|
while (instructionPointer < program.Length)
|
||||||
|
{
|
||||||
|
var opCode = program[instructionPointer];
|
||||||
|
|
||||||
|
var isComboOperand = opCode switch
|
||||||
|
{
|
||||||
|
0 => true,
|
||||||
|
1 => false,
|
||||||
|
2 => true,
|
||||||
|
3 => false,
|
||||||
|
4 => false,
|
||||||
|
5 => true,
|
||||||
|
6 => true,
|
||||||
|
7 => true,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(opCode))
|
||||||
|
};
|
||||||
|
|
||||||
|
var operand = (isComboOperand, program[instructionPointer + 1]) switch
|
||||||
|
{
|
||||||
|
(false, var literalValue) => literalValue,
|
||||||
|
(true, 0) => 0,
|
||||||
|
(true, 1) => 1,
|
||||||
|
(true, 2) => 2,
|
||||||
|
(true, 3) => 3,
|
||||||
|
(true, 4) => registerA,
|
||||||
|
(true, 5) => registerB,
|
||||||
|
(true, 6) => registerC,
|
||||||
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (opCode)
|
||||||
|
{
|
||||||
|
// adv
|
||||||
|
case 0:
|
||||||
|
registerA = (int)(registerA / Math.Pow(2, operand));
|
||||||
|
break;
|
||||||
|
|
||||||
|
// bxl
|
||||||
|
case 1:
|
||||||
|
registerB = registerB ^ operand;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// bst
|
||||||
|
case 2:
|
||||||
|
registerB = operand % 8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// jnz
|
||||||
|
case 3:
|
||||||
|
if (registerA is not 0)
|
||||||
|
{
|
||||||
|
instructionPointer = operand - 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// bxc
|
||||||
|
case 4:
|
||||||
|
registerB = registerB ^ registerC;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// out
|
||||||
|
case 5:
|
||||||
|
toOutput.Add(operand % 8);
|
||||||
|
break;
|
||||||
|
|
||||||
|
// bdv
|
||||||
|
case 6:
|
||||||
|
registerB = (int)(registerA / Math.Pow(2, operand));
|
||||||
|
break;
|
||||||
|
|
||||||
|
// cdv
|
||||||
|
case 7:
|
||||||
|
registerC = (int)(registerA / Math.Pow(2, operand));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
instructionPointer += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Output: [yellow]{string.Join(',', toOutput)}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RunPart2(bool display = true)
|
||||||
|
{
|
||||||
|
var (_, originalRegisterB, originalRegisterC, program) = ParseState();
|
||||||
|
var toOutput = new List<int>();
|
||||||
|
var instructionPointer = 0;
|
||||||
|
|
||||||
|
var finalRegisterA = 0;
|
||||||
|
|
||||||
|
AnsiConsole.Status().Start("Computing (0)...", ctx =>
|
||||||
|
{
|
||||||
|
for (var initialRegisterA = 0; initialRegisterA < int.MaxValue; initialRegisterA++)
|
||||||
|
{
|
||||||
|
// Reset state
|
||||||
|
var registerA = initialRegisterA;
|
||||||
|
var registerB = originalRegisterB;
|
||||||
|
var registerC = originalRegisterC;
|
||||||
|
|
||||||
|
toOutput.Clear();
|
||||||
|
instructionPointer = 0;
|
||||||
|
|
||||||
|
while (instructionPointer < program.Length)
|
||||||
|
{
|
||||||
|
var opCode = program[instructionPointer];
|
||||||
|
|
||||||
|
var isComboOperand = opCode switch
|
||||||
|
{
|
||||||
|
0 => true,
|
||||||
|
1 => false,
|
||||||
|
2 => true,
|
||||||
|
3 => false,
|
||||||
|
4 => false,
|
||||||
|
5 => true,
|
||||||
|
6 => true,
|
||||||
|
7 => true,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(opCode))
|
||||||
|
};
|
||||||
|
|
||||||
|
var operand = (isComboOperand, program[instructionPointer + 1]) switch
|
||||||
|
{
|
||||||
|
(false, var literalValue) => literalValue,
|
||||||
|
(true, 0) => 0,
|
||||||
|
(true, 1) => 1,
|
||||||
|
(true, 2) => 2,
|
||||||
|
(true, 3) => 3,
|
||||||
|
(true, 4) => registerA,
|
||||||
|
(true, 5) => registerB,
|
||||||
|
(true, 6) => registerC,
|
||||||
|
_ => throw new ArgumentOutOfRangeException()
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (opCode)
|
||||||
|
{
|
||||||
|
// adv
|
||||||
|
case 0:
|
||||||
|
registerA = (int)(registerA / Math.Pow(2, operand));
|
||||||
|
break;
|
||||||
|
|
||||||
|
// bxl
|
||||||
|
case 1:
|
||||||
|
registerB = registerB ^ operand;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// bst
|
||||||
|
case 2:
|
||||||
|
registerB = operand % 8;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// jnz
|
||||||
|
case 3:
|
||||||
|
if (registerA is not 0)
|
||||||
|
{
|
||||||
|
instructionPointer = operand - 2;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
// bxc
|
||||||
|
case 4:
|
||||||
|
registerB = registerB ^ registerC;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// out
|
||||||
|
case 5:
|
||||||
|
toOutput.Add(operand % 8);
|
||||||
|
break;
|
||||||
|
|
||||||
|
// bdv
|
||||||
|
case 6:
|
||||||
|
registerB = (int)(registerA / Math.Pow(2, operand));
|
||||||
|
break;
|
||||||
|
|
||||||
|
// cdv
|
||||||
|
case 7:
|
||||||
|
registerC = (int)(registerA / Math.Pow(2, operand));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
instructionPointer += 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (initialRegisterA % 1000 == 0)
|
||||||
|
{
|
||||||
|
ctx.Status($"Computing ({initialRegisterA})...");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if output is the program itself
|
||||||
|
if (toOutput.SequenceEqual(program))
|
||||||
|
{
|
||||||
|
finalRegisterA = initialRegisterA;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Lowest possible value for register A to output itself: [yellow]{finalRegisterA}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private (int RegisterA, int RegisterN, int RegisterC, int[] Program) ParseState()
|
||||||
|
{
|
||||||
|
var lineIterator = Input.AsSpan().EnumerateLines();
|
||||||
|
|
||||||
|
lineIterator.MoveNext();
|
||||||
|
var registerA = int.Parse(lineIterator.Current[(lineIterator.Current.IndexOf(':') + 2)..]);
|
||||||
|
|
||||||
|
lineIterator.MoveNext();
|
||||||
|
var registerB = int.Parse(lineIterator.Current[(lineIterator.Current.IndexOf(':') + 2)..]);
|
||||||
|
|
||||||
|
lineIterator.MoveNext();
|
||||||
|
var registerC = int.Parse(lineIterator.Current[(lineIterator.Current.IndexOf(':') + 2)..]);
|
||||||
|
|
||||||
|
lineIterator.MoveNext();
|
||||||
|
lineIterator.MoveNext();
|
||||||
|
|
||||||
|
var program = lineIterator.Current[(lineIterator.Current.IndexOf(':') + 2)..]
|
||||||
|
.ToString()
|
||||||
|
.Split(',')
|
||||||
|
.Select(int.Parse)
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
return (registerA, registerB, registerC, program);
|
||||||
|
}
|
||||||
|
}
|
||||||
204
Days/Day18.cs
Normal file
204
Days/Day18.cs
Normal file
@@ -0,0 +1,204 @@
|
|||||||
|
using System.Numerics;
|
||||||
|
using System.Runtime.Intrinsics.X86;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace AdventOfCode.Days;
|
||||||
|
|
||||||
|
public class Day18 : Day
|
||||||
|
{
|
||||||
|
public override int Number => 18;
|
||||||
|
public override string Name => "RAM Run";
|
||||||
|
|
||||||
|
private const int Size = 71;
|
||||||
|
|
||||||
|
private const char Corrupted = '#';
|
||||||
|
private const char Empty = ' ';
|
||||||
|
|
||||||
|
public override void RunPart1(bool display = true)
|
||||||
|
{
|
||||||
|
var grid = ParseGrid(1024);
|
||||||
|
|
||||||
|
var visited = new Dictionary<Point, int>();
|
||||||
|
var toVisit = new Queue<(Point Position, int Score)>();
|
||||||
|
|
||||||
|
var end = new Point(Size - 1, Size - 1);
|
||||||
|
|
||||||
|
var minimumScore = int.MaxValue;
|
||||||
|
|
||||||
|
toVisit.Enqueue((new Point(0, 0), 0));
|
||||||
|
|
||||||
|
while (toVisit.Count > 0)
|
||||||
|
{
|
||||||
|
var (position, score) = toVisit.Dequeue();
|
||||||
|
|
||||||
|
// Cannot go out of bounds
|
||||||
|
if (position is { X: < 0 or >= Size } or { Y: < 0 or >= Size })
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cannot go onto a corrupted space
|
||||||
|
if (grid[position.X, position.Y] is Corrupted)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (visited.TryGetValue(position, out var savedScore) && savedScore <= score)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
visited[position] = score;
|
||||||
|
|
||||||
|
// End
|
||||||
|
if (position == end)
|
||||||
|
{
|
||||||
|
if (score < minimumScore)
|
||||||
|
{
|
||||||
|
minimumScore = score;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
toVisit.Enqueue((position + (1, 0), score + 1));
|
||||||
|
toVisit.Enqueue((position + (-1, 0), score + 1));
|
||||||
|
toVisit.Enqueue((position + (0, 1), score + 1));
|
||||||
|
toVisit.Enqueue((position + (0, -1), score + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Minimum number of steps to reach the exit: [yellow]{minimumScore}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RunPart2(bool display = true)
|
||||||
|
{
|
||||||
|
(int X, int Y)[] bytesToFall = Input.ReadAllLines()
|
||||||
|
.Select(line => line.Split(','))
|
||||||
|
.Select(split => (int.Parse(split[0]), int.Parse(split[1])))
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
var nextByteIndex = 1024;
|
||||||
|
var grid = ParseGrid(1024);
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var nextByte = bytesToFall[nextByteIndex];
|
||||||
|
|
||||||
|
grid[nextByte.X, nextByte.Y] = Corrupted;
|
||||||
|
|
||||||
|
if (!IsGridCompletable())
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
nextByteIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Grid will be blocked at byte n°{nextByteIndex} at position: [yellow]{bytesToFall[nextByteIndex]}[/][/]");
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool IsGridCompletable()
|
||||||
|
{
|
||||||
|
var visited = new HashSet<Point>();
|
||||||
|
var toVisit = new Queue<Point>();
|
||||||
|
|
||||||
|
var end = new Point(Size - 1, Size - 1);
|
||||||
|
|
||||||
|
toVisit.Enqueue(new Point(0, 0));
|
||||||
|
|
||||||
|
while (toVisit.Count > 0)
|
||||||
|
{
|
||||||
|
var position = toVisit.Dequeue();
|
||||||
|
|
||||||
|
// Cannot go out of bounds
|
||||||
|
if (position is { X: < 0 or >= Size } or { Y: < 0 or >= Size })
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cannot go onto a corrupted space
|
||||||
|
if (grid[position.X, position.Y] is Corrupted)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!visited.Add(position))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// End
|
||||||
|
if (position == end)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
toVisit.Enqueue(position + (1, 0));
|
||||||
|
toVisit.Enqueue(position + (-1, 0));
|
||||||
|
toVisit.Enqueue(position + (0, 1));
|
||||||
|
toVisit.Enqueue(position + (0, -1));
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private char[,] ParseGrid(int limit)
|
||||||
|
{
|
||||||
|
var grid = new char[Size, Size];
|
||||||
|
|
||||||
|
var counter = 0;
|
||||||
|
foreach (var line in Input.AsSpan().EnumerateLines())
|
||||||
|
{
|
||||||
|
if (counter >= limit)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var x = int.Parse(line[..line.IndexOf(',')]);
|
||||||
|
var y = int.Parse(line[(line.IndexOf(',') + 1)..]);
|
||||||
|
|
||||||
|
grid[x, y] = Corrupted;
|
||||||
|
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly record struct Point(int X, int Y)
|
||||||
|
: IAdditionOperators<Point, Point, Point>,
|
||||||
|
ISubtractionOperators<Point, Point, Point>,
|
||||||
|
IMultiplyOperators<Point, int, Point>
|
||||||
|
{
|
||||||
|
public static Point operator +(Point left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(left.X + right.X, left.Y + right.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator -(Point left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(left.X - right.X, left.Y - right.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator *(Point left, int right)
|
||||||
|
{
|
||||||
|
return new Point(left.X * right, left.Y * right);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator *(int left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(right.X * left, right.Y * left);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static implicit operator Point((int X, int Y) point)
|
||||||
|
=> new(point.X, point.Y);
|
||||||
|
}
|
||||||
|
}
|
||||||
179
Days/Day19.cs
Normal file
179
Days/Day19.cs
Normal file
@@ -0,0 +1,179 @@
|
|||||||
|
using System.Collections.Frozen;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Runtime.Intrinsics.X86;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace AdventOfCode.Days;
|
||||||
|
|
||||||
|
public class Day19 : Day
|
||||||
|
{
|
||||||
|
public override int Number => 19;
|
||||||
|
public override string Name => "Linen Layout";
|
||||||
|
|
||||||
|
public override void RunPart1(bool display = true)
|
||||||
|
{
|
||||||
|
var (towels, patterns) = ParseInput();
|
||||||
|
var impossiblePatterns = new HashSet<string>();
|
||||||
|
|
||||||
|
var possiblePatterns = 0;
|
||||||
|
|
||||||
|
foreach (var pattern in patterns)
|
||||||
|
{
|
||||||
|
// Check if it's possible to make this pattern
|
||||||
|
if (CheckPattern(pattern))
|
||||||
|
{
|
||||||
|
possiblePatterns++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Number of designs that are possible: [yellow]{possiblePatterns}[/][/]");
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
bool CheckPattern(ReadOnlySpan<char> pattern)
|
||||||
|
{
|
||||||
|
// Console.WriteLine($"Checking '{pattern}'");
|
||||||
|
|
||||||
|
if (pattern.Length is 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (impossiblePatterns.Contains(pattern.ToString()))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var prefix = pattern[0];
|
||||||
|
|
||||||
|
if (!towels.TryGetValue(prefix, out var towelsList))
|
||||||
|
{
|
||||||
|
impossiblePatterns.Add(pattern.ToString());
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var towel in towelsList)
|
||||||
|
{
|
||||||
|
if (pattern.StartsWith(towel) && CheckPattern(pattern[towel.Length..]))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impossiblePatterns.Add(pattern.ToString());
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RunPart2(bool display = true)
|
||||||
|
{
|
||||||
|
var (towels, patterns) = ParseInput();
|
||||||
|
var impossiblePatterns = new HashSet<string>();
|
||||||
|
var knownPatterns = new Dictionary<string, long>();
|
||||||
|
|
||||||
|
var possibleCombinations = 0L;
|
||||||
|
|
||||||
|
foreach (var pattern in patterns)
|
||||||
|
{
|
||||||
|
// Check if it's possible to make this pattern
|
||||||
|
possibleCombinations += CheckPattern(pattern);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Number of combinations that are possible: [yellow]{possibleCombinations}[/][/]");
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
long CheckPattern(ReadOnlySpan<char> pattern)
|
||||||
|
{
|
||||||
|
if (pattern.Length is 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (impossiblePatterns.Contains(pattern.ToString()))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (knownPatterns.TryGetValue(pattern.ToString(), out var count))
|
||||||
|
{
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
var prefix = pattern[0];
|
||||||
|
|
||||||
|
if (!towels.TryGetValue(prefix, out var towelsList))
|
||||||
|
{
|
||||||
|
impossiblePatterns.Add(pattern.ToString());
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var possibilities = 0L;
|
||||||
|
|
||||||
|
foreach (var towel in towelsList)
|
||||||
|
{
|
||||||
|
if (pattern.StartsWith(towel))
|
||||||
|
{
|
||||||
|
possibilities += CheckPattern(pattern[towel.Length..]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (possibilities is 0)
|
||||||
|
{
|
||||||
|
impossiblePatterns.Add(pattern.ToString());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
knownPatterns.Add(pattern.ToString(), possibilities);
|
||||||
|
}
|
||||||
|
|
||||||
|
return possibilities;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private (FrozenDictionary<char, List<string>> Towels, List<string> Patterns) ParseInput()
|
||||||
|
{
|
||||||
|
var towels = new Dictionary<char, List<string>>();
|
||||||
|
var patterns = new List<string>();
|
||||||
|
|
||||||
|
foreach (var line in Input.AsSpan().EnumerateLines())
|
||||||
|
{
|
||||||
|
if (towels.Count is 0)
|
||||||
|
{
|
||||||
|
var split = line.Split(", ");
|
||||||
|
|
||||||
|
foreach (var range in split)
|
||||||
|
{
|
||||||
|
var towel = line[range].Trim();
|
||||||
|
|
||||||
|
var prefix = towel[0];
|
||||||
|
|
||||||
|
if (!towels.TryGetValue(prefix, out var towelsList))
|
||||||
|
{
|
||||||
|
towelsList = [];
|
||||||
|
towels[prefix] = towelsList;
|
||||||
|
}
|
||||||
|
|
||||||
|
towelsList.Add(towel.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!line.IsWhiteSpace())
|
||||||
|
{
|
||||||
|
var pattern = line.Trim();
|
||||||
|
|
||||||
|
patterns.Add(pattern.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (towels.ToFrozenDictionary(), patterns);
|
||||||
|
}
|
||||||
|
}
|
||||||
288
Days/Day20.cs
Normal file
288
Days/Day20.cs
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
using System.Collections.Frozen;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Runtime.Intrinsics.X86;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace AdventOfCode.Days;
|
||||||
|
|
||||||
|
public class Day20 : Day
|
||||||
|
{
|
||||||
|
public override int Number => 20;
|
||||||
|
public override string Name => "Race Condition";
|
||||||
|
|
||||||
|
private const int Size = 141;
|
||||||
|
private const char Wall = '#';
|
||||||
|
private const char Empty = '.';
|
||||||
|
|
||||||
|
private readonly List<Point> _cheatOffsets =
|
||||||
|
[
|
||||||
|
(2, 0),
|
||||||
|
(1, 1),
|
||||||
|
(0, 2),
|
||||||
|
(-1, 1),
|
||||||
|
(-2, 0),
|
||||||
|
(-1, -1),
|
||||||
|
(0, -2),
|
||||||
|
(1, -1)
|
||||||
|
];
|
||||||
|
|
||||||
|
public override void RunPart1(bool display = true)
|
||||||
|
{
|
||||||
|
var (map, start, end) = ParseMap();
|
||||||
|
|
||||||
|
// Find track path
|
||||||
|
var trackPath = new List<Point>();
|
||||||
|
var distanceFromStart = new Dictionary<Point, int>();
|
||||||
|
|
||||||
|
var position = start;
|
||||||
|
|
||||||
|
var distance = 0;
|
||||||
|
while (position != end)
|
||||||
|
{
|
||||||
|
trackPath.Add(position);
|
||||||
|
distanceFromStart[position] = distance;
|
||||||
|
|
||||||
|
// Find next track position
|
||||||
|
distance++;
|
||||||
|
var up = position + new Point(0, -1);
|
||||||
|
if (up is { X: >= 0 and < Size, Y: >= 0 and < Size } && map[up.X, up.Y] is not Wall && !distanceFromStart.ContainsKey(up))
|
||||||
|
{
|
||||||
|
position = up;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var down = position + new Point(0, 1);
|
||||||
|
if (down is { X: >= 0 and < Size, Y: >= 0 and < Size } && map[down.X, down.Y] is not Wall && !distanceFromStart.ContainsKey(down))
|
||||||
|
{
|
||||||
|
position = down;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var left = position + new Point(-1, 0);
|
||||||
|
if (left is { X: >= 0 and < Size, Y: >= 0 and < Size } && map[left.X, left.Y] is not Wall && !distanceFromStart.ContainsKey(left))
|
||||||
|
{
|
||||||
|
position = left;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var right = position + new Point(1, 0);
|
||||||
|
if (right is { X: >= 0 and < Size, Y: >= 0 and < Size } && map[right.X, right.Y] is not Wall && !distanceFromStart.ContainsKey(right))
|
||||||
|
{
|
||||||
|
position = right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also add end
|
||||||
|
trackPath.Add(position);
|
||||||
|
distanceFromStart[position] = distance;
|
||||||
|
|
||||||
|
var cheats = new Dictionary<(Point StartPosition, Point EndPosition), int>();
|
||||||
|
|
||||||
|
// Now return to start and try all possible combination of cheats for each track position
|
||||||
|
foreach (var trackPosition in trackPath)
|
||||||
|
{
|
||||||
|
var originDistance = distanceFromStart[trackPosition];
|
||||||
|
|
||||||
|
foreach (var cheatOffset in _cheatOffsets)
|
||||||
|
{
|
||||||
|
var cheatDestination = trackPosition + cheatOffset;
|
||||||
|
|
||||||
|
if (cheatDestination.X is < 0 or >= Size || cheatDestination.Y is < 0 or >= Size)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (map[cheatDestination.X, cheatDestination.Y] is Wall)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var destinationDistance = distanceFromStart[cheatDestination];
|
||||||
|
var savedDistance = destinationDistance - originDistance - 2;
|
||||||
|
|
||||||
|
// Only take into account real shortcuts, not those that do not save time
|
||||||
|
if (savedDistance < 1)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
cheats.Add((trackPosition, cheatDestination), savedDistance);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Number of cheats that save at least 100 picoseconds: [yellow]{cheats.Count(c => c.Value >= 100)}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RunPart2(bool display = true)
|
||||||
|
{
|
||||||
|
var (map, start, end) = ParseMap();
|
||||||
|
|
||||||
|
// Find track path
|
||||||
|
var trackPath = new List<Point>();
|
||||||
|
var distanceFromStart = new Dictionary<Point, int>();
|
||||||
|
|
||||||
|
var position = start;
|
||||||
|
|
||||||
|
var distance = 0;
|
||||||
|
while (position != end)
|
||||||
|
{
|
||||||
|
trackPath.Add(position);
|
||||||
|
distanceFromStart[position] = distance;
|
||||||
|
|
||||||
|
// Find next track position
|
||||||
|
distance++;
|
||||||
|
var up = position + new Point(0, -1);
|
||||||
|
if (up is { X: >= 0 and < Size, Y: >= 0 and < Size } && map[up.X, up.Y] is not Wall && !distanceFromStart.ContainsKey(up))
|
||||||
|
{
|
||||||
|
position = up;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var down = position + new Point(0, 1);
|
||||||
|
if (down is { X: >= 0 and < Size, Y: >= 0 and < Size } && map[down.X, down.Y] is not Wall && !distanceFromStart.ContainsKey(down))
|
||||||
|
{
|
||||||
|
position = down;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var left = position + new Point(-1, 0);
|
||||||
|
if (left is { X: >= 0 and < Size, Y: >= 0 and < Size } && map[left.X, left.Y] is not Wall && !distanceFromStart.ContainsKey(left))
|
||||||
|
{
|
||||||
|
position = left;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var right = position + new Point(1, 0);
|
||||||
|
if (right is { X: >= 0 and < Size, Y: >= 0 and < Size } && map[right.X, right.Y] is not Wall && !distanceFromStart.ContainsKey(right))
|
||||||
|
{
|
||||||
|
position = right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also add end
|
||||||
|
trackPath.Add(position);
|
||||||
|
distanceFromStart[position] = distance;
|
||||||
|
|
||||||
|
var cheats = new Dictionary<(Point StartPosition, Point EndPosition), int>();
|
||||||
|
|
||||||
|
// Now return to start and try all possible combination of cheats for each track position
|
||||||
|
foreach (var trackPosition in trackPath)
|
||||||
|
{
|
||||||
|
var originDistance = distanceFromStart[trackPosition];
|
||||||
|
|
||||||
|
foreach (var cheatDestination in trackPath.Where(destination => trackPosition.DistanceTo(destination) <= 20))
|
||||||
|
{
|
||||||
|
var cheatLength = trackPosition.DistanceTo(cheatDestination);
|
||||||
|
|
||||||
|
var destinationDistance = distanceFromStart[cheatDestination];
|
||||||
|
var savedDistance = destinationDistance - originDistance - cheatLength;
|
||||||
|
|
||||||
|
// Only take into account real shortcuts, not those that do not save time
|
||||||
|
if (savedDistance < 1)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cheats.TryGetValue((trackPosition, cheatDestination), out var otherSavedDistance))
|
||||||
|
{
|
||||||
|
if (savedDistance <= otherSavedDistance)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cheats[(trackPosition, cheatDestination)] = savedDistance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Number of cheats that save at least 100 picoseconds: [yellow]{cheats.Count(c => c.Value >= 100)}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private (char[,] Map, Point Start, Point End) ParseMap()
|
||||||
|
{
|
||||||
|
var map = new char[Size, Size];
|
||||||
|
Point start = default;
|
||||||
|
Point end = default;
|
||||||
|
|
||||||
|
var y = 0;
|
||||||
|
foreach (var line in Input.AsSpan().EnumerateLines())
|
||||||
|
{
|
||||||
|
var x = 0;
|
||||||
|
|
||||||
|
foreach (var symbol in line)
|
||||||
|
{
|
||||||
|
if (symbol == 'S')
|
||||||
|
{
|
||||||
|
start = new Point(x, y);
|
||||||
|
}
|
||||||
|
else if (symbol == 'E')
|
||||||
|
{
|
||||||
|
end = new Point(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (symbol is Wall)
|
||||||
|
{
|
||||||
|
map[x, y] = Wall;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
map[x, y] = Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
x++;
|
||||||
|
}
|
||||||
|
|
||||||
|
y++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (map, start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly record struct Point(int X, int Y)
|
||||||
|
: IAdditionOperators<Point, Point, Point>,
|
||||||
|
ISubtractionOperators<Point, Point, Point>,
|
||||||
|
IMultiplyOperators<Point, int, Point>
|
||||||
|
{
|
||||||
|
public static Point operator +(Point left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(left.X + right.X, left.Y + right.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator -(Point left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(left.X - right.X, left.Y - right.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator *(Point left, int right)
|
||||||
|
{
|
||||||
|
return new Point(left.X * right, left.Y * right);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator *(int left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(right.X * left, right.Y * left);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static implicit operator Point((int X, int Y) point)
|
||||||
|
=> new(point.X, point.Y);
|
||||||
|
|
||||||
|
public int DistanceTo(Point other)
|
||||||
|
{
|
||||||
|
var distance = other - this;
|
||||||
|
|
||||||
|
return Math.Abs(distance.X) + Math.Abs(distance.Y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
183
Days/Day21.cs
Normal file
183
Days/Day21.cs
Normal file
@@ -0,0 +1,183 @@
|
|||||||
|
using System.Collections.Frozen;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Runtime.Intrinsics.X86;
|
||||||
|
using System.Text;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace AdventOfCode.Days;
|
||||||
|
|
||||||
|
public class Day21 : Day
|
||||||
|
{
|
||||||
|
public override int Number => 21;
|
||||||
|
public override string Name => "Keypad Conundrum";
|
||||||
|
|
||||||
|
private const char Up = '^';
|
||||||
|
private const char Right = '>';
|
||||||
|
private const char Down = 'v';
|
||||||
|
private const char Left = '<';
|
||||||
|
private const char Enter = 'A';
|
||||||
|
|
||||||
|
private readonly Dictionary<char, Point> _numpadPositions = new()
|
||||||
|
{
|
||||||
|
{ '7', (0, 0) },
|
||||||
|
{ '8', (1, 0) },
|
||||||
|
{ '9', (2, 0) },
|
||||||
|
{ '4', (0, 1) },
|
||||||
|
{ '5', (1, 1) },
|
||||||
|
{ '6', (2, 1) },
|
||||||
|
{ '1', (0, 2) },
|
||||||
|
{ '2', (1, 2) },
|
||||||
|
{ '3', (2, 2) },
|
||||||
|
{ '0', (1, 3) },
|
||||||
|
{ Enter, (2, 3) }
|
||||||
|
};
|
||||||
|
|
||||||
|
private readonly Dictionary<char, Point> _keypadPositions = new()
|
||||||
|
{
|
||||||
|
{ Up, (1, 0) },
|
||||||
|
{ Enter, (2, 0) },
|
||||||
|
{ Left, (0, 1) },
|
||||||
|
{ Down, (1, 1) },
|
||||||
|
{ Right, (2, 1) }
|
||||||
|
};
|
||||||
|
|
||||||
|
public override void RunPart1(bool display = true)
|
||||||
|
{
|
||||||
|
var codes = ParseCodes();
|
||||||
|
var complexitiesSum = 0;
|
||||||
|
|
||||||
|
foreach (var code in codes)
|
||||||
|
{
|
||||||
|
// Get first keypad sequence
|
||||||
|
var firstKeypadSequence = new StringBuilder();
|
||||||
|
var currentInput = Enter;
|
||||||
|
|
||||||
|
foreach (var digit in code)
|
||||||
|
{
|
||||||
|
firstKeypadSequence.Append(GetNumpadMoveSequence(currentInput, digit));
|
||||||
|
|
||||||
|
currentInput = digit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get second keypad sequence
|
||||||
|
var secondKeypadSequence = new StringBuilder();
|
||||||
|
currentInput = Enter;
|
||||||
|
|
||||||
|
foreach (var input in firstKeypadSequence.ToString())
|
||||||
|
{
|
||||||
|
secondKeypadSequence.Append(GetKeypadMoveSequence(currentInput, input));
|
||||||
|
|
||||||
|
currentInput = input;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get third and last keypad sequence
|
||||||
|
var thirdKeypadSequence = new StringBuilder();
|
||||||
|
currentInput = Enter;
|
||||||
|
|
||||||
|
foreach (var input in secondKeypadSequence.ToString())
|
||||||
|
{
|
||||||
|
thirdKeypadSequence.Append(GetKeypadMoveSequence(currentInput, input));
|
||||||
|
|
||||||
|
currentInput = input;
|
||||||
|
}
|
||||||
|
|
||||||
|
complexitiesSum += thirdKeypadSequence.Length * int.Parse(code.AsSpan()[..^1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Sum of complexities: [yellow]{complexitiesSum}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RunPart2(bool display = true)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetNumpadMoveSequence(char origin, char destination)
|
||||||
|
{
|
||||||
|
var originPosition = _numpadPositions[origin];
|
||||||
|
var destinationPosition = _numpadPositions[destination];
|
||||||
|
|
||||||
|
var move = destinationPosition - originPosition;
|
||||||
|
|
||||||
|
var moveRight = move.X > 0;
|
||||||
|
var moveDown = move.Y > 0;
|
||||||
|
|
||||||
|
var sequence = string.Concat(
|
||||||
|
new string(moveRight ? Right : Left, Math.Abs(move.X)),
|
||||||
|
new string(moveDown ? Down : Up, Math.Abs(move.Y)),
|
||||||
|
Enter.ToString() // Always end on Enter to press key
|
||||||
|
);
|
||||||
|
|
||||||
|
return sequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetKeypadMoveSequence(char origin, char destination)
|
||||||
|
{
|
||||||
|
var originPosition = _keypadPositions[origin];
|
||||||
|
var destinationPosition = _keypadPositions[destination];
|
||||||
|
|
||||||
|
var move = destinationPosition - originPosition;
|
||||||
|
|
||||||
|
var moveRight = move.X > 0;
|
||||||
|
var moveDown = move.Y > 0;
|
||||||
|
|
||||||
|
var sequence = string.Concat(
|
||||||
|
new string(moveDown ? Down : Up, Math.Abs(move.Y)),
|
||||||
|
new string(moveRight ? Right : Left, Math.Abs(move.X)),
|
||||||
|
Enter.ToString() // Always end on Enter to press key
|
||||||
|
);
|
||||||
|
|
||||||
|
return sequence;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<string> ParseCodes()
|
||||||
|
{
|
||||||
|
var codes = new List<string>();
|
||||||
|
|
||||||
|
foreach (var line in Input.AsSpan().EnumerateLines())
|
||||||
|
{
|
||||||
|
codes.Add(line.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
return codes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly record struct Point(int X, int Y)
|
||||||
|
: IAdditionOperators<Point, Point, Point>,
|
||||||
|
ISubtractionOperators<Point, Point, Point>,
|
||||||
|
IMultiplyOperators<Point, int, Point>
|
||||||
|
{
|
||||||
|
public static Point operator +(Point left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(left.X + right.X, left.Y + right.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator -(Point left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(left.X - right.X, left.Y - right.Y);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator *(Point left, int right)
|
||||||
|
{
|
||||||
|
return new Point(left.X * right, left.Y * right);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Point operator *(int left, Point right)
|
||||||
|
{
|
||||||
|
return new Point(right.X * left, right.Y * left);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static implicit operator Point((int X, int Y) point)
|
||||||
|
=> new(point.X, point.Y);
|
||||||
|
|
||||||
|
public int DistanceTo(Point other)
|
||||||
|
{
|
||||||
|
var distance = other - this;
|
||||||
|
|
||||||
|
return Math.Abs(distance.X) + Math.Abs(distance.Y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
162
Days/Day22.cs
Normal file
162
Days/Day22.cs
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
using System.Collections.Frozen;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Runtime.Intrinsics.X86;
|
||||||
|
using System.Text;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace AdventOfCode.Days;
|
||||||
|
|
||||||
|
public class Day22 : Day
|
||||||
|
{
|
||||||
|
public override int Number => 22;
|
||||||
|
public override string Name => "Monkey Market";
|
||||||
|
|
||||||
|
private const int Iterations = 2000;
|
||||||
|
private const int PruneValue = 16777216;
|
||||||
|
|
||||||
|
public override void RunPart1(bool display = true)
|
||||||
|
{
|
||||||
|
var secretsSum = 0L;
|
||||||
|
|
||||||
|
foreach (var line in Input.AsSpan().EnumerateLines())
|
||||||
|
{
|
||||||
|
var secret = long.Parse(line);
|
||||||
|
|
||||||
|
for (var i = 0; i < Iterations; i++)
|
||||||
|
{
|
||||||
|
var result = secret * 64;
|
||||||
|
secret = (secret ^ result) % PruneValue;
|
||||||
|
|
||||||
|
result = secret / 32;
|
||||||
|
secret = (secret ^ result) % PruneValue;
|
||||||
|
|
||||||
|
result = secret * 2048;
|
||||||
|
secret = (secret ^ result) % PruneValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
secretsSum += secret;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Sum of {Iterations}th secret numbers: [yellow]{secretsSum}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RunPart2(bool display = true)
|
||||||
|
{
|
||||||
|
var maximumBananas = 0L;
|
||||||
|
|
||||||
|
var initialSecrets = Input.ReadAllLines().Select(l => long.Parse(l)).ToArray();
|
||||||
|
var matchSequences = GenerateSequences().ToArray();
|
||||||
|
|
||||||
|
AnsiConsole.Progress().Start(progress =>
|
||||||
|
{
|
||||||
|
var progressTask = progress.AddTask("Finding best sequence", maxValue: matchSequences.Length);
|
||||||
|
|
||||||
|
Parallel.ForEach(matchSequences, matchSequence =>
|
||||||
|
{
|
||||||
|
Span<long> sequence = stackalloc long[4];
|
||||||
|
var currentBananas = 0L;
|
||||||
|
|
||||||
|
for (var initialSecretIndex = 0; initialSecretIndex < initialSecrets.Length; initialSecretIndex++)
|
||||||
|
{
|
||||||
|
var secret = initialSecrets[initialSecretIndex];
|
||||||
|
|
||||||
|
for (var i = 0; i < Iterations; i++)
|
||||||
|
{
|
||||||
|
var previousSecret = secret;
|
||||||
|
|
||||||
|
// Compute new secret
|
||||||
|
var result = secret * 64;
|
||||||
|
secret = (secret ^ result) % PruneValue;
|
||||||
|
|
||||||
|
result = secret / 32;
|
||||||
|
secret = (secret ^ result) % PruneValue;
|
||||||
|
|
||||||
|
result = secret * 2048;
|
||||||
|
secret = (secret ^ result) % PruneValue;
|
||||||
|
|
||||||
|
var lastDigit = secret % 10;
|
||||||
|
var previousSecretLastDigit = previousSecret % 10;
|
||||||
|
|
||||||
|
// Update sequence
|
||||||
|
sequence[0] = sequence[1];
|
||||||
|
sequence[1] = sequence[2];
|
||||||
|
sequence[2] = sequence[3];
|
||||||
|
sequence[3] = lastDigit - previousSecretLastDigit;
|
||||||
|
|
||||||
|
// Check if sequence match
|
||||||
|
if (sequence[0] == matchSequence.Item1
|
||||||
|
&& sequence[1] == matchSequence.Item2
|
||||||
|
&& sequence[2] == matchSequence.Item3
|
||||||
|
&& sequence[3] == matchSequence.Item4
|
||||||
|
&& i >= 3)
|
||||||
|
{
|
||||||
|
currentBananas += lastDigit;
|
||||||
|
|
||||||
|
// Go to next monkey
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stop early if it's not possible to beat current maximum
|
||||||
|
if (maximumBananas - currentBananas >= ((initialSecrets.Length - initialSecretIndex - 1) * 9))
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ExchangeIfGreaterThan(ref maximumBananas, currentBananas);
|
||||||
|
|
||||||
|
progressTask.Increment(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Maximum amount of bananas: [yellow]{maximumBananas}[/][/]");
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
IEnumerable<(long, long, long, long)> GenerateSequences()
|
||||||
|
{
|
||||||
|
for (var a = -9L; a <= 9; a++)
|
||||||
|
{
|
||||||
|
for (var b = -9L; b <= 9; b++)
|
||||||
|
{
|
||||||
|
for (var c = -9L; c <= 9; c++)
|
||||||
|
{
|
||||||
|
for (var d = -9L; d <= 9; d++)
|
||||||
|
{
|
||||||
|
yield return (a, b, c, d);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Source: https://stackoverflow.com/a/13323172
|
||||||
|
private static void ExchangeIfGreaterThan(ref long location, long value)
|
||||||
|
{
|
||||||
|
// Read
|
||||||
|
var current = Interlocked.Read(ref location);
|
||||||
|
|
||||||
|
// Compare
|
||||||
|
while (current < value)
|
||||||
|
{
|
||||||
|
// Set
|
||||||
|
var previous = Interlocked.CompareExchange(ref location, value, current);
|
||||||
|
|
||||||
|
// If another thread has set a greater value, we can break
|
||||||
|
// or if previous value is current value, then no other thread has it changed in between
|
||||||
|
if (previous == current || previous >= value) // note: most common case first
|
||||||
|
break;
|
||||||
|
|
||||||
|
// For all other cases, we need another run (read value, compare, set)
|
||||||
|
current = Interlocked.Read(ref location);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
172
Days/Day23.cs
Normal file
172
Days/Day23.cs
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
using System.Collections.Frozen;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Runtime.Intrinsics.X86;
|
||||||
|
using System.Text;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace AdventOfCode.Days;
|
||||||
|
|
||||||
|
public class Day23 : Day
|
||||||
|
{
|
||||||
|
public override int Number => 23;
|
||||||
|
public override string Name => "LAN Party";
|
||||||
|
|
||||||
|
public override void RunPart1(bool display = true)
|
||||||
|
{
|
||||||
|
var computerLinks = new Dictionary<string, HashSet<string>>();
|
||||||
|
|
||||||
|
// Parse all links
|
||||||
|
foreach (var line in Input.AsSpan().EnumerateLines())
|
||||||
|
{
|
||||||
|
var firstComputer = line[..2].ToString();
|
||||||
|
var secondComputer = line[3..].ToString();
|
||||||
|
|
||||||
|
if (!computerLinks.TryGetValue(firstComputer, out var firstLinks))
|
||||||
|
{
|
||||||
|
firstLinks = [];
|
||||||
|
computerLinks[firstComputer] = firstLinks;
|
||||||
|
}
|
||||||
|
firstLinks.Add(secondComputer);
|
||||||
|
|
||||||
|
if (!computerLinks.TryGetValue(secondComputer, out var secondLinks))
|
||||||
|
{
|
||||||
|
secondLinks = [];
|
||||||
|
computerLinks[secondComputer] = secondLinks;
|
||||||
|
}
|
||||||
|
secondLinks.Add(firstComputer);
|
||||||
|
}
|
||||||
|
|
||||||
|
var sets = new HashSet<ComputerSet>();
|
||||||
|
|
||||||
|
foreach (var (firstComputer, firstLinks) in computerLinks)
|
||||||
|
{
|
||||||
|
foreach (var secondComputer in firstLinks)
|
||||||
|
{
|
||||||
|
var thirdComputers = computerLinks[secondComputer].Intersect(firstLinks);
|
||||||
|
|
||||||
|
foreach (var thirdComputer in thirdComputers)
|
||||||
|
{
|
||||||
|
sets.Add(new ComputerSet(firstComputer, secondComputer, thirdComputer));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var finalCount = sets.Count(set => set.First.StartsWith('t') || set.Second.StartsWith('t') || set.Third.StartsWith('t'));
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Amount of sets that contain at least one computer that starts with t: [yellow]{finalCount}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RunPart2(bool display = true)
|
||||||
|
{
|
||||||
|
var computerLinks = new Dictionary<string, HashSet<string>>();
|
||||||
|
|
||||||
|
// Parse all links
|
||||||
|
foreach (var line in Input.AsSpan().EnumerateLines())
|
||||||
|
{
|
||||||
|
var firstComputer = line[..2].ToString();
|
||||||
|
var secondComputer = line[3..].ToString();
|
||||||
|
|
||||||
|
if (!computerLinks.TryGetValue(firstComputer, out var firstLinks))
|
||||||
|
{
|
||||||
|
firstLinks = [];
|
||||||
|
computerLinks[firstComputer] = firstLinks;
|
||||||
|
}
|
||||||
|
firstLinks.Add(secondComputer);
|
||||||
|
|
||||||
|
if (!computerLinks.TryGetValue(secondComputer, out var secondLinks))
|
||||||
|
{
|
||||||
|
secondLinks = [];
|
||||||
|
computerLinks[secondComputer] = secondLinks;
|
||||||
|
}
|
||||||
|
secondLinks.Add(firstComputer);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<string> largestSet = [];
|
||||||
|
|
||||||
|
AnsiConsole.Status().Start("Starting check...", status =>
|
||||||
|
{
|
||||||
|
var size = 4;
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var ended = true;
|
||||||
|
|
||||||
|
status.Status($"Checking set size: {size}");
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
foreach (var (firstComputer, firstLinks) in computerLinks)
|
||||||
|
{
|
||||||
|
status.Status($"Checking set size: {size} ({i++}/{computerLinks.Count})");
|
||||||
|
|
||||||
|
if (GenerateLargestSet(firstLinks, size, [ firstComputer ]) is { } largest)
|
||||||
|
{
|
||||||
|
largestSet = largest;
|
||||||
|
size++;
|
||||||
|
ended = false;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ended)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var password = string.Join(',', largestSet.Order());
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Password to enter lan party: [yellow]{password}[/][/]");
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
List<string>? GenerateLargestSet(HashSet<string> set, int targetSize, List<string> selected)
|
||||||
|
{
|
||||||
|
if (selected.Count == targetSize)
|
||||||
|
{
|
||||||
|
return selected;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (set.Count is 0 || (set.Count < (targetSize - selected.Count)))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next depth
|
||||||
|
foreach (var computer in set)
|
||||||
|
{
|
||||||
|
var nextSet = set.Intersect(computerLinks[computer]).ToHashSet();
|
||||||
|
var nextSelected = selected.Append(computer).ToList();
|
||||||
|
|
||||||
|
if (GenerateLargestSet(nextSet, targetSize, nextSelected) is { } largest)
|
||||||
|
{
|
||||||
|
return largest;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private record ComputerSet(string First, string Second, string Third) : IEquatable<ComputerSet>
|
||||||
|
{
|
||||||
|
public virtual bool Equals(ComputerSet? other)
|
||||||
|
{
|
||||||
|
return other is not null &&
|
||||||
|
(First == other.First || First == other.Second || First == other.Third) &&
|
||||||
|
(Second == other.First || Second == other.Second || Second == other.Third) &&
|
||||||
|
(Third == other.First || Third == other.Second || Third == other.Third);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int GetHashCode()
|
||||||
|
{
|
||||||
|
return First.GetHashCode() * Second.GetHashCode() * Third.GetHashCode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
370
Days/Day24.cs
Normal file
370
Days/Day24.cs
Normal file
@@ -0,0 +1,370 @@
|
|||||||
|
using System.Collections.Frozen;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.Intrinsics.X86;
|
||||||
|
using System.Text;
|
||||||
|
using Microsoft.CodeAnalysis;
|
||||||
|
using Microsoft.VisualBasic;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace AdventOfCode.Days;
|
||||||
|
|
||||||
|
public class Day24 : Day
|
||||||
|
{
|
||||||
|
public override int Number => 24;
|
||||||
|
public override string Name => "Crossed Wires";
|
||||||
|
|
||||||
|
public override void RunPart1(bool display = true)
|
||||||
|
{
|
||||||
|
var (signals, gates, zGates) = ParseInput();
|
||||||
|
|
||||||
|
while (zGates.Count > 0)
|
||||||
|
{
|
||||||
|
foreach (var (inputLeft, inputRight, output, logicOperator) in gates)
|
||||||
|
{
|
||||||
|
if (!signals.TryGetValue(inputLeft, out var inputLeftValue) ||
|
||||||
|
!signals.TryGetValue(inputRight, out var inputRightValue))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
signals[output] = Compute(inputLeftValue, inputRightValue, logicOperator);
|
||||||
|
|
||||||
|
if (output.StartsWith('z'))
|
||||||
|
{
|
||||||
|
zGates.Remove(output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var zOutputValue = signals
|
||||||
|
.Where(s => s.Key.StartsWith('z'))
|
||||||
|
.Select(s => new { Index = int.Parse(s.Key[1..]), Value = (long)s.Value })
|
||||||
|
.Sum(s => s.Value << s.Index);
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Value output on z signal: [yellow]{zOutputValue}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RunPart2(bool display = true)
|
||||||
|
{
|
||||||
|
var (initialSignals, initialGates, initialZGates) = ParseInput();
|
||||||
|
|
||||||
|
var xInputValue = initialSignals
|
||||||
|
.Where(s => s.Key.StartsWith('x'))
|
||||||
|
.Select(s => new { Index = int.Parse(s.Key[1..]), Value = (long)s.Value })
|
||||||
|
.Sum(s => s.Value << s.Index);
|
||||||
|
|
||||||
|
var yInputValue = initialSignals
|
||||||
|
.Where(s => s.Key.StartsWith('y'))
|
||||||
|
.Select(s => new { Index = int.Parse(s.Key[1..]), Value = (long)s.Value })
|
||||||
|
.Sum(s => s.Value << s.Index);
|
||||||
|
|
||||||
|
// Find wires that need to be changed
|
||||||
|
const long initialZValue = 58740594706150L;
|
||||||
|
var targetZValue = xInputValue + yInputValue;
|
||||||
|
|
||||||
|
var difference = targetZValue ^ initialZValue;
|
||||||
|
var possibleChange = new HashSet<string>();
|
||||||
|
|
||||||
|
for (var i = 0; i < sizeof(long) * 8; i++)
|
||||||
|
{
|
||||||
|
if (((1 << i) & difference) != 0)
|
||||||
|
{
|
||||||
|
possibleChange.Add($"z{i:D2}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find all dependencies
|
||||||
|
int initialSize;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
initialSize = possibleChange.Count;
|
||||||
|
|
||||||
|
foreach (var gate in initialGates)
|
||||||
|
{
|
||||||
|
if (possibleChange.Contains(gate.Output))
|
||||||
|
{
|
||||||
|
possibleChange.Add(gate.InputLeft);
|
||||||
|
possibleChange.Add(gate.InputRight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (possibleChange.Count != initialSize);
|
||||||
|
|
||||||
|
var gatesToSwapIndices = initialGates
|
||||||
|
.Index()
|
||||||
|
.ToList()
|
||||||
|
.Where(t => possibleChange.Contains(t.Item.Output))
|
||||||
|
.Select(t => t.Index)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
// Try out all possible permutations of concerned outputs
|
||||||
|
List<string> changedOutputs = [];
|
||||||
|
|
||||||
|
for (var a = 0; a < gatesToSwapIndices.Count - 7; a++)
|
||||||
|
{
|
||||||
|
for (var b = a + 1; b < gatesToSwapIndices.Count - 6; b++)
|
||||||
|
{
|
||||||
|
for (var c = b + 1; c < gatesToSwapIndices.Count - 5; c++)
|
||||||
|
{
|
||||||
|
for (var d = c + 1; d < gatesToSwapIndices.Count - 4; d++)
|
||||||
|
{
|
||||||
|
for (var e = d + 1; e < gatesToSwapIndices.Count - 3; e++)
|
||||||
|
{
|
||||||
|
for (var f = e + 1; f < gatesToSwapIndices.Count - 2; f++)
|
||||||
|
{
|
||||||
|
for (var g = f + 1; g < gatesToSwapIndices.Count - 1; g++)
|
||||||
|
{
|
||||||
|
for (var h = g + 1; h < gatesToSwapIndices.Count; h++)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"h: {h}");
|
||||||
|
|
||||||
|
ForAllPermutation([
|
||||||
|
gatesToSwapIndices[a],
|
||||||
|
gatesToSwapIndices[b],
|
||||||
|
gatesToSwapIndices[c],
|
||||||
|
gatesToSwapIndices[d],
|
||||||
|
gatesToSwapIndices[e],
|
||||||
|
gatesToSwapIndices[f],
|
||||||
|
gatesToSwapIndices[g],
|
||||||
|
gatesToSwapIndices[h]], permutations =>
|
||||||
|
{
|
||||||
|
if (CheckPermutations(permutations) is { } modifiedOutputs)
|
||||||
|
{
|
||||||
|
changedOutputs = modifiedOutputs;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var swappedOutputs = string.Join(',', changedOutputs.Order());
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Swapped outputs: [yellow]{swappedOutputs}[/][/]");
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
List<string>? CheckPermutations(int[] permutations)
|
||||||
|
{
|
||||||
|
var gates = initialGates.ToArray();
|
||||||
|
var zGates = initialZGates.ToHashSet();
|
||||||
|
var signals = initialSignals.ToDictionary();
|
||||||
|
|
||||||
|
SwapOutput(ref gates[permutations[0]], ref gates[permutations[1]]);
|
||||||
|
SwapOutput(ref gates[permutations[2]], ref gates[permutations[3]]);
|
||||||
|
SwapOutput(ref gates[permutations[4]], ref gates[permutations[5]]);
|
||||||
|
SwapOutput(ref gates[permutations[6]], ref gates[permutations[7]]);
|
||||||
|
|
||||||
|
var zOutputValue = 0L;
|
||||||
|
while (zGates.Count > 0)
|
||||||
|
{
|
||||||
|
// Avoid locks when result is not reachable (infinite loop)
|
||||||
|
var resultsCount = signals.Count;
|
||||||
|
|
||||||
|
foreach (var (inputLeft, inputRight, output, logicOperator) in gates)
|
||||||
|
{
|
||||||
|
if (signals.ContainsKey(output))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!signals.TryGetValue(inputLeft, out var inputLeftValue) ||
|
||||||
|
!signals.TryGetValue(inputRight, out var inputRightValue))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var computed = Compute(inputLeftValue, inputRightValue, logicOperator);
|
||||||
|
signals[output] = computed;
|
||||||
|
|
||||||
|
if (output.StartsWith('z'))
|
||||||
|
{
|
||||||
|
zGates.Remove(output);
|
||||||
|
|
||||||
|
zOutputValue += (long)computed << int.Parse(output[1..]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// No new signal value computed, it's an infinite loop
|
||||||
|
if (signals.Count == resultsCount)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xInputValue + yInputValue == zOutputValue)
|
||||||
|
{
|
||||||
|
return permutations.Select(i => gates[i].Output).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SwapOutput(ref LogicGate first, ref LogicGate second)
|
||||||
|
{
|
||||||
|
var temp = first.Output;
|
||||||
|
|
||||||
|
first = first with { Output = second.Output };
|
||||||
|
second = second with { Output = temp };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int Compute(int inputLeftValue, int inputRightValue, Operator logicOperator) => logicOperator switch
|
||||||
|
{
|
||||||
|
Operator.And => inputLeftValue & inputRightValue,
|
||||||
|
Operator.Or => inputLeftValue | inputRightValue,
|
||||||
|
Operator.Xor => inputLeftValue ^ inputRightValue,
|
||||||
|
_ => throw new ArgumentOutOfRangeException(nameof(logicOperator), logicOperator, null)
|
||||||
|
};
|
||||||
|
|
||||||
|
private (Dictionary<string, int> Signals, List<LogicGate> Gates, HashSet<string> ZGates) ParseInput()
|
||||||
|
{
|
||||||
|
var readingSignals = true;
|
||||||
|
|
||||||
|
var signals = new Dictionary<string, int>();
|
||||||
|
var gates = new List<LogicGate>();
|
||||||
|
var zGates = new HashSet<string>();
|
||||||
|
|
||||||
|
foreach (var line in Input.AsSpan().EnumerateLines())
|
||||||
|
{
|
||||||
|
if (line.IsWhiteSpace())
|
||||||
|
{
|
||||||
|
readingSignals = false;
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (readingSignals)
|
||||||
|
{
|
||||||
|
var signalName = line[..line.IndexOf(':')];
|
||||||
|
var signalValue = int.Parse(line[(line.IndexOf(':') + 2)..]);
|
||||||
|
|
||||||
|
signals[signalName.ToString()] = signalValue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var split = line.Split(' ');
|
||||||
|
split.MoveNext();
|
||||||
|
|
||||||
|
var inputLeft = line[split.Current];
|
||||||
|
split.MoveNext();
|
||||||
|
|
||||||
|
var logicOperator = Enum.Parse<Operator>(line[split.Current], true);
|
||||||
|
split.MoveNext();
|
||||||
|
|
||||||
|
var inputRight = line[split.Current];
|
||||||
|
split.MoveNext();
|
||||||
|
split.MoveNext();
|
||||||
|
|
||||||
|
var output = line[split.Current];
|
||||||
|
|
||||||
|
gates.Add(new LogicGate(inputLeft.ToString(), inputRight.ToString(), output.ToString(), logicOperator));
|
||||||
|
|
||||||
|
if (output.StartsWith('z'))
|
||||||
|
{
|
||||||
|
zGates.Add(output.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (signals, gates, zGates);
|
||||||
|
}
|
||||||
|
|
||||||
|
private record LogicGate(string InputLeft, string InputRight, string Output, Operator LogicOperator);
|
||||||
|
|
||||||
|
private enum Operator
|
||||||
|
{
|
||||||
|
And,
|
||||||
|
Or,
|
||||||
|
Xor
|
||||||
|
}
|
||||||
|
|
||||||
|
// Source: https://stackoverflow.com/a/36634935
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Heap's algorithm to find all permutations. Non recursive, more efficient.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="items">Items to permute in each possible ways</param>
|
||||||
|
/// <param name="funcExecuteAndTellIfShouldStop"></param>
|
||||||
|
/// <returns>Return true if cancelled</returns>
|
||||||
|
private static bool ForAllPermutation<T>(T[] items, Func<T[], bool> funcExecuteAndTellIfShouldStop)
|
||||||
|
{
|
||||||
|
int countOfItem = items.Length;
|
||||||
|
|
||||||
|
if (countOfItem <= 1)
|
||||||
|
{
|
||||||
|
return funcExecuteAndTellIfShouldStop(items);
|
||||||
|
}
|
||||||
|
|
||||||
|
var indexes = new int[countOfItem];
|
||||||
|
|
||||||
|
// Unnecessary. Thanks to NetManage for the advise
|
||||||
|
// for (int i = 0; i < countOfItem; i++)
|
||||||
|
// {
|
||||||
|
// indexes[i] = 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
if (funcExecuteAndTellIfShouldStop(items))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 1; i < countOfItem;)
|
||||||
|
{
|
||||||
|
if (indexes[i] < i)
|
||||||
|
{
|
||||||
|
// On the web there is an implementation with a multiplication which should be less efficient.
|
||||||
|
if ((i & 1) == 1) // if (i % 2 == 1) ... more efficient ??? At least the same.
|
||||||
|
{
|
||||||
|
Swap(ref items[i], ref items[indexes[i]]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Swap(ref items[i], ref items[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (funcExecuteAndTellIfShouldStop(items))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
indexes[i]++;
|
||||||
|
i = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
indexes[i++] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Swap 2 elements of same type
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="T"></typeparam>
|
||||||
|
/// <param name="a"></param>
|
||||||
|
/// <param name="b"></param>
|
||||||
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||||
|
private static void Swap<T>(ref T a, ref T b)
|
||||||
|
{
|
||||||
|
T temp = a;
|
||||||
|
a = b;
|
||||||
|
b = temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
111
Days/Day25.cs
Normal file
111
Days/Day25.cs
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
using System.Collections.Frozen;
|
||||||
|
using System.Numerics;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.Intrinsics.X86;
|
||||||
|
using System.Text;
|
||||||
|
using Microsoft.CodeAnalysis;
|
||||||
|
using Microsoft.VisualBasic;
|
||||||
|
using Spectre.Console;
|
||||||
|
|
||||||
|
namespace AdventOfCode.Days;
|
||||||
|
|
||||||
|
public class Day25 : Day
|
||||||
|
{
|
||||||
|
public override int Number => 25;
|
||||||
|
public override string Name => "Code Chronicle";
|
||||||
|
|
||||||
|
public override void RunPart1(bool display = true)
|
||||||
|
{
|
||||||
|
var (locks, keys) = ParseInput();
|
||||||
|
|
||||||
|
var workingPairs = 0;
|
||||||
|
|
||||||
|
foreach (var lockToTest in locks)
|
||||||
|
{
|
||||||
|
foreach (var key in keys)
|
||||||
|
{
|
||||||
|
if (lockToTest.Height1 + key.Height1 < 6 &&
|
||||||
|
lockToTest.Height2 + key.Height2 < 6 &&
|
||||||
|
lockToTest.Height3 + key.Height3 < 6 &&
|
||||||
|
lockToTest.Height4 + key.Height4 < 6 &&
|
||||||
|
lockToTest.Height5 + key.Height5 < 6)
|
||||||
|
{
|
||||||
|
workingPairs++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (display)
|
||||||
|
{
|
||||||
|
AnsiConsole.MarkupLine($"[green]Amont of unique key/lock pairs that fit: [yellow]{workingPairs}[/][/]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void RunPart2(bool display = true)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private (List<Lock> Locks, List<Key> Keys) ParseInput()
|
||||||
|
{
|
||||||
|
var locks = new List<Lock>();
|
||||||
|
var keys = new List<Key>();
|
||||||
|
|
||||||
|
Span<int> itemHeights = stackalloc int[5];
|
||||||
|
|
||||||
|
var input = Input.AsSpan();
|
||||||
|
foreach (var itemRange in input.Split($"{Environment.NewLine}{Environment.NewLine}"))
|
||||||
|
{
|
||||||
|
var item = input[itemRange];
|
||||||
|
var lines = item.EnumerateLines();
|
||||||
|
|
||||||
|
var isKey = false;
|
||||||
|
|
||||||
|
// Reset item heights
|
||||||
|
itemHeights[0] = -1;
|
||||||
|
itemHeights[1] = -1;
|
||||||
|
itemHeights[2] = -1;
|
||||||
|
itemHeights[3] = -1;
|
||||||
|
itemHeights[4] = -1;
|
||||||
|
|
||||||
|
for (var height = 0; height <= 6; height++)
|
||||||
|
{
|
||||||
|
lines.MoveNext();
|
||||||
|
var line = lines.Current;
|
||||||
|
|
||||||
|
if (height is 0)
|
||||||
|
{
|
||||||
|
isKey = line is ".....";
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < 5; i++)
|
||||||
|
{
|
||||||
|
if (isKey && line[i] is '#' && itemHeights[i] is -1)
|
||||||
|
{
|
||||||
|
itemHeights[i] = 6 - height;
|
||||||
|
}
|
||||||
|
else if (!isKey && line[i] is '.' && itemHeights[i] is -1)
|
||||||
|
{
|
||||||
|
itemHeights[i] = height - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isKey)
|
||||||
|
{
|
||||||
|
keys.Add(new Key(itemHeights[0], itemHeights[1], itemHeights[2], itemHeights[3], itemHeights[4]));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
locks.Add(new Lock(itemHeights[0], itemHeights[1], itemHeights[2], itemHeights[3], itemHeights[4]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (locks, keys);
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly record struct Lock(int Height1, int Height2, int Height3, int Height4, int Height5);
|
||||||
|
private readonly record struct Key(int Height1, int Height2, int Height3, int Height4, int Height5);
|
||||||
|
}
|
||||||
141
Inputs/Day16.txt
Normal file
141
Inputs/Day16.txt
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
#############################################################################################################################################
|
||||||
|
#.........#...........#.................#.......#.............#.....#.#...#...........#.....#.....#...#.......#.....#...........#.......#..E#
|
||||||
|
#.#######.#.#.#######.###.#########.###.#######.#.#.#.###.#.#.###.#.#.#.#.#.#####.#.###.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#####.###.#.#####.###.#
|
||||||
|
#.#.....#.#.#.#.....#...............#.#.#.....#...#...#.#.#.......#...#.#.#.....#.#.#...#.....#.#.#.#...#.#.....#.#.........................#
|
||||||
|
#.#.###.#.#.#.###.#######.###########.#.#.###.#.#######.#.#.#########.#.#.#.#####.###.#####.###.#.#.#####.#######.#.#.#.#.#.#.#.###.#.#.#.###
|
||||||
|
#...#.#.#...#...#...#.....#...........#.#...#.#.#.......#.#.........#.#.#.#.#.....#...#.........#.#.....#.......#.#.#.#.....#.......#...#...#
|
||||||
|
#.#.#.#.#######.###.#.###.#.#########.#.###.#.#.#####.#.#.#.###.###.###.#.#.#.#.#.#.###.###.#####.#.#######.###.#.#.#####.#.#########.###.#.#
|
||||||
|
#.#...#.......#...#...#...#...#.#.....#...#.#.#.....#.#.#...#...#...#...#...#...#.#.#...#.........#.#.....#.#...#.#...#...#...#.......#.....#
|
||||||
|
#.#.#.#######.###.#####.#.###.#.#.#######.#.#.#####.###.###.#.###.###.#########.###.#.###.#.#######.#.###.###.###.###.#.#.#.#.#######.#.#.###
|
||||||
|
#.#.#.......#.#.#.#...#.#.......#.......#.....#...#...#...#...#.#.....#...#.....#...#.#.....#...#...#...#...........#.#.#.#.#.#.....#...#...#
|
||||||
|
#.#.###.#####.#.#.#.#.#.#.#########.###.#####.###.###.#.#.#####.#######.###.#####.###.#####.#.#.#######.#.#.#####.###.#.#.#.#.#.###.###.#.#.#
|
||||||
|
#...#.#.........#...#.#...........#...#.....#...#...#...#.#.........#.....#.#.....#.#.....#.#.#.......#.#...#...#.......#.#.#...#.#.#.....#.#
|
||||||
|
#.#.#.###############.#.#.#.#####.#####.###.###.#.#.#####.#######.#.#.###.#.#.#####.#####.#.#.#######.#.###.#.#.###.#####.#.#.###.#.#.#.#.#.#
|
||||||
|
#.#...#.....#.#...#...#.#...#...#.....#...............................#...#.............#...#...#.................#.#...#...#.....#.....#...#
|
||||||
|
#.#.#.###.#.#.#.#.#.#####.###.#.#####.#.#.#.###.###.#######.#.#####.###.#.#########.#####.#.###.#####.###.###.###.#.#.#.#.#.###########.#.#.#
|
||||||
|
#.#.#...#.#.....#...#.....#...#.#...#.#...#.#...#...#.......#.#...#.....#...#.............#...#.....#.#...#...#...#.#.....#.......#.......#.#
|
||||||
|
#.#.###.#.###.#.#####.#####.###.#.###.#####.#.###.#.#.#######.#.#.###.#######.#############.#.#.###.#.#.#.#.###.#.###.###.#.#####.#.###.#####
|
||||||
|
#...#.#...#...#...#...#.....#...#.#...#...#.#.#...#.#.#.......#.#.#...#.......#.....#.........#...#.#...#.#.#.#.#.#...#.#.........#...#.#...#
|
||||||
|
#.###.#####.#####.#.#######.#.#.#.#.###.#.#.#.###.###.#.#####.#.###.#.#.#######.###.#.###########.#.#######.#.#.#.#.###.#.#####.#.###.#.#.#.#
|
||||||
|
#...#.......#...#.........#.#.....#.....#.#.#.#...#...#.#...#.#.....#...#.....#.#...#.#...#.....#.#.......#.#.#.#.#.....#.#.....#.#...#...#.#
|
||||||
|
#.#.#.#######.###########.#.#####.#######.#.#.#.###.#####.#.#.#######.#.#.#.###.#.#.#.#.#.#.###.#.#.#####.#.#.#.#######.#.#.###.#.#.###.#.#.#
|
||||||
|
#.#...........#...#.....#.#...#.......#...#...#...#.#.....#...#.......#...#.....#.#.#.....#.#.#...#...#...#...........#.#...#...#.#.......#.#
|
||||||
|
#.###########.#.#.###.###.###.#########.#.#.###.#.#.#.###.#####.#######.#########.#####.#.#.#.#######.#.###.#####.###.#.#####.#.#.#.###.#.#.#
|
||||||
|
#.......#.....#.#.............#.........#.#.#...#.#.#...#.#...#.....#.#.#...#...#.......#.#...#.....#.#.....#...#...#.....#...#...#.........#
|
||||||
|
#.#####.#######.###.#.#######.#.#########.#.#.###.#.###.#.#.#.#.###.#.#.#.###.#.###.#.#.#.###.###.#.#.#######.#.#######.#.#.###.#######.#.#.#
|
||||||
|
#...#.#...#.....#...#.....#.#.#...#...#...#.....#.......#.#.#.#...#.#...#.#...#...#.#...#...#.....#.......#...#.......#.....#.#.#.......#.#.#
|
||||||
|
###.#.###.#.#####.#####.#.#.#.###.#.#.#.#######.#.#########.#.#.###.#.###.#.#####.###.#####.#############.#.#######.#.#####.#.#.#######.#.#.#
|
||||||
|
#...#.......#...#...#...#.#.....#...#.#.....#...#.#.........#.#.#...#.#...#.#.........#.....#...........#.#.#.#.............#.#.....#.....#.#
|
||||||
|
#.#.#####.#.###.###.#.###.#######.#.#.###.#.#.###.#.###.#####.#.#.###.###.#.###########.#####.#########.###.#.#.#############.#.###.#.#.#.#.#
|
||||||
|
#.#.....#.........#...#.#.......#.#.#...#.#.#.#...#.....#.....#.#...#.....#...#.........#.....#.......#.....#...............#...#.#.#.....#.#
|
||||||
|
#.#.###.#.###.#########.#######.#.#.###.###.#.###.#####.#.#########.###.#.###.#.###########.###.#.#######.#.#####.#.#.#####.#.#.#.#.#.#.#.#.#
|
||||||
|
#...#...#...#.#...............#.#...#.#.#...#...#.....#.#.#.......#.#.......#.#...#.........#...#.#.......#.......#.#.#.#...#.#...#.#.#...#.#
|
||||||
|
#####.###.#.###.#########.###.#.###.#.#.#.#####.#######.#.#.#####.#.#######.#.###.#####.#####.#####.#############.###.#.#.###.#.###.###.#.#.#
|
||||||
|
#.....#...#.....#...#...#...#.#.#...#.#.#...............#...#...#.#.....#...#...#.........#...#.....#.......#.........#.#...#.........#...#.#
|
||||||
|
#.#####.#.#######.#.###.###.#.#.#.###.#.#####.###############.###.#.###.###.#.#.#####.#.#.#.#.#.#####.#.#.#.#.###.#.###.###.###.#####.###.###
|
||||||
|
#...#.#.......#...#.....#...#.#.#.#...#.#.............#.......#...#...#...#.#.#.#.#...#.#.#.#.#.#.....#...#...#...#.....#.#.................#
|
||||||
|
###.#.###.###.#.#######.#.#.###.#.#.###.#.#####.#######.#.#####.###.###.#.#.#.#.#.#.###.#.#.#.#.###.#####.#####.#######.#.#########.###.###.#
|
||||||
|
#...#.#.....#.#.#.......#.#.#...#...#...#.#.....#.......#...#...#.....#.#.#.#.....#.....#.#...#...#.....#...#...#...#...#...#.....#.#.......#
|
||||||
|
#.###.#.#.#.#.#.#.#######.#.#.###.###.###.#.#####.#####.###.#.###.###.###.###.###.###.###.#.#.###.###.#####.#.###.#.#.###.#.#.#.###.#########
|
||||||
|
#.........#.#...#.#.....#.#.#.#...#...#...#.#.....#.....#.#...#.#...#.....#...#.....#.....#.#...#...#.#.....#...#.#.#.#...#.#.#...#...#.....#
|
||||||
|
#.#.#.#.#.#######.###.###.###.#####.###.#####.#####.#.#.#.#####.#.#.#######.###############.#.#.###.###.#######.#.#.#.#.###.#.###.###.#.###.#
|
||||||
|
#.#.#...#.#.....#...#.#...#...#.....#.......#.....#...#.#.........#...#.................#...#.#...#...#.#...#.....#.#.#.#.#.#.#...#.#...#...#
|
||||||
|
#.#.#####.#.#.#####.#.#.###.###.#####.#####.#####.#.###.#.###########.#.#####.#######.#.#####.###.###.#.#.#.#######.#.#.#.#.###.#.#.#####.#.#
|
||||||
|
#.#.....#.#.#.....#.#.#.........#...#.#...#.....#...#.#.#.........#...#.#.......#...#.#.......#.#...#.#...#.#...#...#...#.#.....#.......#.#.#
|
||||||
|
#.#####.#.#.###.###.#.#####.###.#.###.#.#######.#####.#.###########.###.###.###.#.#.#.#########.#.###.#.###.#.#.#.#######.#############.#.#.#
|
||||||
|
#...#.#.#.#.#.#.#...#.#...#.....#...#.#.......#.#.....#.#...........#.#...#.#...#.#.#...#...#.....#...#...#...#.#.#.............#...#...#...#
|
||||||
|
###.#.#.#.#.#.#.#.###.#.#.#########.#.###.###.#.#.###.#.#.#######.###.###.#.#.###.#.#.#.#.#.###.###.#########.#.###.#.#########.#.#.#.#####.#
|
||||||
|
#.....#.#.#.#.#.#.....#.#...#.....#.#.#...#...#.....#.#...#.......#.........#.....#...#.#.#...#.#...#.......#.#.....#.#.......#...#.#.....#.#
|
||||||
|
#.#####.#.#.#.#.#####.#.###.#.###.#.#.#.###.#########.#####.#####.#.###############.###.#.###.###.###.#####.#.#######.###.#########.#####.#.#
|
||||||
|
#.#.....#.#...#.......#...#.#.#...........#.#...........#...#.#...#.#.#.......#...#.#...#.#.#.....#.....#.#.#.#...#...#...#.........#.....#.#
|
||||||
|
#.#.#####.###.###########.#.#.#######.###.###.#.#########.###.#.###.#.#.#####.#.#.#.#.###.#.###########.#.#.#.#.#.#.###.#.#.#######.#.#####.#
|
||||||
|
#.#...#.....#...#.........#.#.......#.....#...#.#.........#...#.......#.#...#.#.#...#.....#.........#...#...#.#.#...#...#.#.#.....#.#.#...#.#
|
||||||
|
#.###.#####.#.###.#########.###.###.#####.#.###.#.#########.#.#######.#.#.###.#####.#.#.#.#####.###.#.###.#####.#####.#.###.#.###.###.###.#.#
|
||||||
|
#...#.....#.......#.......#.#.....#.....#.#.#...#...#.......#.........#.#.....#...#.#.#.....#...#...#...#.#.....#...#.#...#.#.#.#.........#.#
|
||||||
|
#.#####.#.#.#.#.###.#####.#.#.###.###.###.#.#######.#.#.#######.#####.#.#.#####.#.#.#.#####.#.###.###.#.#.###.###.###.###.#.#.#.###########.#
|
||||||
|
#.#...#.#.#.#.#...#.#.....#.#.#.#...#.....#.......#.#...........#.....#.#.#.....#.#.#...#.#...#.#...#.#.#.....#.....#.#...#.#.#...#...#...#.#
|
||||||
|
###.#.###.#.#.###.#.#.#####.#.#.###.#.###########.#.#######.#.###.###.#.#.#.#####.###.#.#.#####.###.###.###.#####.#.#.#.#.#.#.#.###.#.#.#.#.#
|
||||||
|
#...#.....#.#...#...#...#.#...#.....#.........#.#.#.........#.#...#.#.#.#...#...#...#.#...#.....#.#...#.#.......#.#.#...#...#.......#.#.#.#.#
|
||||||
|
#.#########.###.###.###.#.#######.#.#########.#.#.###.#.#####.###.#.#.#.#####.#####.#.###.#.#.#.#.###.#.#####.#.###.###.###.#.#.#.###.#.#.#.#
|
||||||
|
#.....#.......#.#.....#...#.......#...#...#.....#...#.#.#...#...#.#.........#...#.....#...#.#.#.....#.#.#.....#...#.....#.......#.#.....#...#
|
||||||
|
#####.#.###.###.#.###.#.#.###.###.###.#.#.#.#####.#.#.#.###.###.#.#######.#.#.#.#.#########.#.#######.#.#.#######.#######.#######.#########.#
|
||||||
|
#.....#.#.#...#.#...#.........#.....#.#.#.#.#...#.#.....#...#.....#.....#.#...#.#...#...#...#.........#.#.#.....#.#.......#.#...#.#...#...#.#
|
||||||
|
#.#####.#.###.#.#.#.###########.#####.#.#.#.#.#.#####.###.###.#####.###.#.###.#.#.###.#.#.#####.#######.#.#.#.#.#.#.#.#####.#.#.#.#.#.#.#.#.#
|
||||||
|
#...#.......#.#.#.#.......#.....#.....#.#...#.#.#.....#.......#...#.....#...#.#...#...#.....#.........#...#.#.#.#...#.......#.#...#.#...#.#.#
|
||||||
|
#.#.#####.###.#.#######.###.###.#.###########.#.#.###.#.#####.#.#.###.#.###.#.#####.###.###.#.#.#####.#.###.#.#.#######.###.#.#####.#####.###
|
||||||
|
#.#...#.#.#...#...#...#...#.......#...........#.....#.#.#...#.#.#.....#.#...#.#.......#...#.#.#...#...#...#.#.#...#...#...#.................#
|
||||||
|
#.###.#.#.#.#####.#.#.###.###.#.###.#####.###########.###.#.###.#######.#.#.###.#########.#.###.#.#######.#.#.###.#.#.#####.###########.###.#
|
||||||
|
#.#...#...#.....#.#.#.#.....#.#.#...#.....#.....#...#...#.#.....#.....#...#.#...#...#.........#.#.#.....#.#.#...#.#.#.......#...........#...#
|
||||||
|
#.#.#.#########.#.#.#.#.###.#.#.#.#####.###.###.#.#.###.#.#####.#.###.#.#.#.#.###.#.#.#######.#.#.#.###.#.#.###.#.#.###.###.#####.#.#####.#.#
|
||||||
|
#.#.#.#.......#.....#...#.#.#.#.........#...#.#...#.....#...#...#...#...#.#.#...#.#.#.........#.#.....#.#.#.#...#.#.......#.......#.#.....#.#
|
||||||
|
#.#.#.#.#####.###########.#.#.#########.#.###.#########.#.#.#.#.#.#.#.#.#.#####.###.#######.###########.#.###.###.#######.#########.#.#####.#
|
||||||
|
#.#.......#...#.........#...#...#.#...#.#...#.#...........#...#.#.#.#.#.#.......#.......#...............#.....#...#.....#.#.............#...#
|
||||||
|
#####.###.#.#.#.#######.#.###.#.#.#.#.#####.#.#.###.#######.#.#.###.###.#.#######.#####.###.#.###.#####.#######.###.###.#.#####.#######.#####
|
||||||
|
#.....#.....#.#.....#...#.....#.#.#.#.......#...#.......#.....#...#.............#.....#.....#...#.#...#.#.....#...#...#.#.#...#.#...........#
|
||||||
|
#.###.#.#.#########.#.#######.#.#.#.#############.#####.#.###.###.#############.#.###.#######.#.#.#.#.#.#.###.###.###.#.#.#.#.###.#.#.#.#.#.#
|
||||||
|
#.#.#.#.............#.......#.#...#...............#...#...#.....#.#.........#...#...#.......#.#.#...#.....#.....#...#.#...#.#...#.#.#...#.#.#
|
||||||
|
#.#.#.###.#################.#.###.###.#.#############.#####.###.#.#.#######.#.#############.#.#.###############.###.#.#####.###.#.#.###.#.#.#
|
||||||
|
#.#...#.....................#...#...#.#.#.....#.......#.....#.#.#...#.....#.#.#.....#.......#.#...#...........#...#.#...#...#.#.#.#...#...#.#
|
||||||
|
#.#.#.#.#.#######.###############.###.#.###.#.#####.#.#.#####.#.#####.#.###.#.###.#.#.#######.###.#.#########.#.###.#.#.#.###.#.#.###.#.###.#
|
||||||
|
#.#.....#...#...#.#.......#.......#...#.#...#.#.....#.#.#...#...#...........#...#.#...#.......#...#.#.......#.#...#.#.#.#...#...#.#.#.......#
|
||||||
|
#.###.#.#.#.###.#.#.#####.#.#######.###.#.###.#.#####.#.#.#.#####.#############.#.#####.###.###.#.#.###.###.#.#.#.#.###.#.#.#.###.#.###.###.#
|
||||||
|
#.#...#.#.#.......#...#.#...#.....#.....#...#...#...#.#...#.......#.......#...#.#.#...#.#...#.#.#.#...#...#.#...#...#.....#.#.....#.#.......#
|
||||||
|
#.#.#.###.#.#.###.###.#.#####.###.#########.#####.###.#############.#####.###.#.#.#.#.#.#.#.#.#.#.###.###.#.#########.#.#.#.#######.#.#.###.#
|
||||||
|
#...#...#...#...#...#.#...#.....#.#.......#.....#.....#.....#.....#...#.#.....#.#...#.#.#.#.#.#.#...#.#...#.........#.#...#.#.....#...#.....#
|
||||||
|
#.###.#.###.###.#####.###.#.###.#.#.###.#.#.###.#.#######.#.#.#.###.#.#.###.###.#.###.#.#.#.#.#.#####.#####.#####.#.#.#.###.#.#.###.###.#####
|
||||||
|
#.#...#.....#...#.....#...#.#.#.#.#.#...#.#...#.#.#.......#.#.#.......#.....#...#.#.#.#.#.#...#.#...#.....#.....#.#.#.#.#...#.#.....#.......#
|
||||||
|
###.#.#######.#.#.#####.###.#.#.###.#.###.#####.#.#####.#####.#######.#######.###.#.#.#.#.###.#.#.#.#####.###.###.#.#.#.###.#.#######.#.###.#
|
||||||
|
#...#...#.....#.#.....#.#.....#.....#.#.........#...#...#.....#.....#.#.....#.#.....#.....#...#...#.....#...#.#.......#...#.....#.....#...#.#
|
||||||
|
#.###.#.#.#####.#####.#.#.###.#######.#.###########.#.###.#####.#.###.#.###.#.#.#################.###.#.###.#.#.#####.###.#####.#.#####.#.#.#
|
||||||
|
#.#.......#.#.......#...........#.#...#...#.......#.#...#.......#.....#.#.#...#.#.#.............#.#.#.#.#.#.#.#...#.#.#.#...#.#.#.....#...#.#
|
||||||
|
#.###.#####.#.#####.#.#########.#.#.###.#.#.#######.###.#.#.#####.#####.#.#####.#.#.###.#######.#.#.#.#.#.#.#.###.#.#.#.###.#.#.#####.#.###.#
|
||||||
|
#.#...#...#...#.....#...#...#.....#.....#.#...#.....#...#...#.....#.....#.....#.#.#...#.....#...#...#.#...#.#.#...#.......#.#.#...#...#...#.#
|
||||||
|
#.#.#.#.###.###.#.#.###.#.#.#########.###.###.#.#####.###.###.#.###.#####.#####.#.###.#.#.#.#.#######.###.#.###.###.#######.#.###.###.###.#.#
|
||||||
|
#...#.#.....#.#.#.#.#.#...#.....#...#.#.#...#...#.....#...#...#.....#.#.........#...#.#.#.#.#.....#...#.#.#.....#...#.....#.#...#...#.#...#.#
|
||||||
|
#####.#.#####.#.#.#.#.#####.###.#.#.#.#.###.#.###.#####.###.###.#####.#.#########.#.#.#.#.#.#####.#.###.#.#######.###.###.#.#.#####.#.#.###.#
|
||||||
|
#.....#.#.....#.#.#.......#...#.#.#.#...#...#.....#...#...#.....#.#...#.#.........#.#.#.#.#...#.#.#...#.........#...#.#.....#.#.....#.#...#.#
|
||||||
|
#.#.###.#.#####.#.#####.###.#.#.#.#.###.#.#.#######.#.###.#######.#.#.#.#.#.#######.#.#.#.###.#.#.###.#############.#.#######.#.#######.#.###
|
||||||
|
#.....#...#.....#.#.....#...#...#.#.#.....#.........#.....#...#.....#.#.#.#.#...#...#.#.#.#.#.#.#.#...#.............#.....#.......#...#.#...#
|
||||||
|
#.#.#.#####.#####.#######.#######.#.#.###.###.#############.#.#.#####.#.#.###.#.#.###.###.#.#.#.#.#.#.#.###############.#.#######.#.#.###.#.#
|
||||||
|
#...#.#.....#.#...#.......#.......#...#.#.#...#.#...#.......#.#.#...#...#.#...#.#...#...#.......#...#.#...#...........#.#...#...#...#...#.#.#
|
||||||
|
###.#.#.#####.#.###.#######.###.#######.#.#.###.#.#.#.#.#####.#.###.#####.#.###.#######.#.#######.#######.#.#########.###.#.#.#.#######.###.#
|
||||||
|
#.....#...#...#.#...#.....#.#.#.....#.....#.#.....#...#.#.....#...........#.#.#...#.....#.#.......#.......#...#.....#.....#...........#.....#
|
||||||
|
#.#.#####.###.#.#.###.###.#.#.#####.#.#####.#.#########.#.#########.#.#.###.#.#.#.#.#.#.#.#.#######.#########.#####.###.###.#####.#.#.#####.#
|
||||||
|
#.#.....#.....#.#.#...#.#.#...#.#...#.#.....#.#.........#...#.........#.#...#...#...#...#...#...#...#...#...#...#.....#...#.#...#.#.#.....#.#
|
||||||
|
#.#.###.#####.#.#.#.###.#.###.#.#.#.###.#####.#.#.#.#######.###########.#.#####.###.#.#######.#.#.###.#.#.#.###.#.###.###.#.#.#.#.#.###.###.#
|
||||||
|
#...#.............#...#...#...#...#.#...#.....#.#...#.....#.......#.....#.#.......#.#.......#.#.#.#...#.#.#...#.#...#.#...#.#.#...#...#.....#
|
||||||
|
#.#.#.#####.#.#######.#.#####.#.#.#.#.#########.#######.#.#######.#.###.#.###.#.###.#.#####.#.#.#.#.###.#.#.###.#.#.#.#.###.#.#############.#
|
||||||
|
#...#.#.....#...#.....#.....#...#.#.#.....#.....#.......#.#.....#.#.#...#...#.#.#...#.#...#...#...#.#.....#.#...#...#.#...#.#...#...#.....#.#
|
||||||
|
#.#.#.#.#######.#.#########.#####.#.#####.#.#.###.###.#####.###.#.#.#.#.###.#.#.#.###.#.#.#########.###.###.#.###.#.#####.#####.#.#.#.###.#.#
|
||||||
|
#.#...#.#.....#.#.......#.#.#.....#.#.......#.#.......#.....#.....#.#.#.#...#.#.#.#...#.#.#.......#.......#.#.#...#.......#.....#.#...#...#.#
|
||||||
|
#.#.#.###.#.#.#.#######.#.#.#.#.#####.#.#####.#.#.###.#.#####.###.#.#.#.#.###.###.#.#####.#.#.###.###.#.#.#.#.#.###########.#####.#####.#####
|
||||||
|
#.#...#...#.#.#.........#.....#.#.....#.........#...#.#.#...#...#.#.#.#...#...#...#.....#...#.#...#...#.#...#.#.#...........................#
|
||||||
|
###.#.#.###.#########.#.#######.#.#################.###.#.#####.#.#.#.#####.###.#######.#####.#.###.#.#.#.###.#.#######.#.#################.#
|
||||||
|
#.....#...#.......#...#.........#.#.#.............#.....#.....#.....#.#...#.....#.#.....#.........#.#.#.#.....#.....#...#.#...............#.#
|
||||||
|
#.#.#.###.#######.#.#####.###.###.#.#.###.#.###############.#.#######.#.#.#####.#.#.#####.#######.#.###.###########.#.#.###.#############.#.#
|
||||||
|
#.........#.....#.#.#...#...#.#.#.#.#.#...#.#...........#...#.........#.#.....#...#.....#.#.....#.#...#.#.#.......#.#.#...#...#...#.....#...#
|
||||||
|
###.#.###.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#####.###.#####.#.#####.#######.#####.#########.#.#.#.#.#.###.#.#.#.###.#.#.#.###.###.###.#.###.###.#
|
||||||
|
#...........#.#.#...#.#.#.#.#...#.#...#.....#.#...#...#.#.#.....#...........#.............#.#.........#.#.#...#.#.#...#.#.....#...#.#.#...#.#
|
||||||
|
#.###.#.#.###.#.#.#.#.#.###.#.###.#.#######.#.#.###.#.#.#.#.#####.#########.#####.#########.#########.#.#.###.#.#######.#######.###.#.###.#.#
|
||||||
|
#.#.......#.....#...#.#.....#.#...#...#...#...#...#.#.#...#...#...#...#...#.#...#.#.....#...#.....#...#.#.#...#.......#...#.....#...#.#...#.#
|
||||||
|
#.#.#.#.#.#.#########.#######.#.#####.#.#.#######.#.#.###.#####.###.#.#.#.###.#.###.###.#.###.###.#####.#.#.#######.#.#.#.#.###.#.###.#.###.#
|
||||||
|
#.#.....#...#.........#.....#.#...#.#...#.......#.#.#.#...#...#.#...#...#.#.........#...#...#...#.#.....#.#...#...#.#.#.#.#.#...#.....#.....#
|
||||||
|
#.#####.#.###.###.#####.###.#.###.#.###.#.#######.#.#.#####.#.#.#.#######.#.#.#######.#####.###.#.#.###.#.###.#.#.#.#.###.#.#.###.###.#######
|
||||||
|
#.#...#...#.....#.#.#.....#.#...#.#.....#.......#...#.#.....#.#.#...#.......#.......#...#.....#.#...#.........#.#.#.#...#.#.#.....#.....#...#
|
||||||
|
#.###.#.#.#.#####.#.#.#####.###.#.#.#####.#.###.#####.#.#####.#.###.#####.###.#####.###.#######.#####.###.#####.#.#.###.#.#.#######.###.###.#
|
||||||
|
#.....#.#...#.....#...#...#.....#.#.....#.#.............#...#.....#.#...#.#...#...#...#.....#...#...#.#...#.....#.#...#...#.#.....#.#.#.#...#
|
||||||
|
#####.#.#.###.#####.###.#.#.#####.#####.###.###.#####.###.#########.#.#.#.#.#.###.#.#######.#.###.#.#.#.#.###.###.#.#.###.#.#.#.#.#.#.#.#.#.#
|
||||||
|
#.#...........#.....#...#.#.#...#.#...#.#...#.........................#.#.........#.......#.#...#.#.#...#.#...#.....#.#...#.#.#.#...#.#.#.#.#
|
||||||
|
#.#.#######.#.#.#####.###.#.#.#.#.#.#.#.#.#.#.###.#.#####.#.#########.#.#.#############.#.#.###.#.#.#####.#.#.#####.#.#.###.###.#####.#.#.###
|
||||||
|
#.......................#.#...#.#...#.#...#.......#...#...#.........#.#.#.....#...#...#.#.#.....#.#...#.#.#...#.......#...#.....#...#...#...#
|
||||||
|
#.#####.#####.#########.#.###.#.#####.###.#.#.#######.#####.#######.#.#.#.###.#.#.#.#.#.#.#.#####.###.#.#.###.#.###.#####.#######.#.#.###.#.#
|
||||||
|
#.#.....#...#.#.......#.#...#.......#.#...#.#...#...#.............#...#...#.#...#...#.#.#...#...#...................#.....#.......#.#.#...#.#
|
||||||
|
###.#.###.#.#.#.#####.#.###.#####.###.#.###.#.#.#.#.#####.#######.#######.#.#########.#.###.#.#.#.#.#####.#.#######.###.###.#####.###.#.###.#
|
||||||
|
#...#.....#.#.#...#...#.#.#.#...#.#...#...#...#.#.#.....#.#...............#.........#.#...#...#...#.....#.#.......#.......#.#...#.....#.#...#
|
||||||
|
#.#########.#.###.#.###.#.#.###.#.#.#####.###.#.#.###.###.#.#############.#######.###.###.#############.#.#.#.###.#.###.#.#.#.#.#######.#.###
|
||||||
|
#.....#.........#.#...#...................#.....#...#...#.#...#.........#.......#...#.#...#.....#...#...#.#.#.#.#.......#...#.#.#...#...#...#
|
||||||
|
#.###.#.#########.###.###.###.#.#####.#.#.#.#.#####.###.#.#####.#######.#.#####.###.#.#.###.###.###.#.###.###.#.###.###.#####.###.#.#.#####.#
|
||||||
|
#...#.#.....#.....#...#...#...#...#...#...#...#.#...#.#...#.....#.....#...#...#.....#.#.......................#.....#...#.........#.........#
|
||||||
|
#.#.#.#######.#####.###.###.#######.#########.#.#.###.#####.#####.#######.#.#.#######.#######.###.#.#####.#.###.###.#.#.###################.#
|
||||||
|
#S..#.............#.......#...................#.............#...............#.........#...........#.........#...............................#
|
||||||
|
#############################################################################################################################################
|
||||||
5
Inputs/Day17.txt
Normal file
5
Inputs/Day17.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
Register A: 44348299
|
||||||
|
Register B: 0
|
||||||
|
Register C: 0
|
||||||
|
|
||||||
|
Program: 2,4,1,5,7,5,1,6,0,3,4,2,5,5,3,0
|
||||||
3450
Inputs/Day18.txt
Normal file
3450
Inputs/Day18.txt
Normal file
File diff suppressed because it is too large
Load Diff
402
Inputs/Day19.txt
Normal file
402
Inputs/Day19.txt
Normal file
@@ -0,0 +1,402 @@
|
|||||||
|
wugw, wrrbgr, rbgr, bgbrb, wuwb, bug, wubur, uwbuwbug, wruu, rbbr, wbgrrg, uuwr, bub, brbggggr, brgguw, gwwuu, uwrbggw, wuwrrr, wbuurww, wwwuwru, gubgr, gubu, ug, ubu, gggrgr, wg, wrgbggu, uwgwubw, bgrgb, uu, gbug, gwuwgr, bgwg, rurgb, rr, ubw, wrr, rggw, ubuu, ubr, ugrr, wrbwrruw, uw, ruggrb, urwwurg, gwr, rurwb, bu, uuu, bbuwb, urbu, ugb, uruub, gwgrrw, wbbw, rwgr, wur, bwbu, bbg, wrbugw, brgr, uurrwg, guruu, uurrrbw, bwwbrguw, gbbgu, bgg, bbwwgbw, rww, uurrr, bgubwb, wwgr, gw, wrgub, wgrg, rugwbb, bgwbuguw, brg, ggbw, bgbubb, wwgu, gwgb, grur, gubw, wbruug, rg, brubbgw, uuugr, rru, brbr, rwbuuu, ubuw, rgru, rwrwgb, wub, rwbu, bwwrr, bwrg, uggbur, gwb, gbugwb, br, rbwu, urubg, uuw, rbb, rgrwu, bguuw, w, www, wurgb, rwwu, rwg, uww, gbwurubb, uuugb, rbrurw, gggbwu, rbrwrgwr, bw, uwrw, bugw, brgguugb, brubw, bbrb, bru, urgr, urwu, bwbb, bur, rwrr, wrrbu, guu, ggugwuw, rwrurb, wbur, gbu, bbb, ur, brw, wrwbb, ugbuwgug, rrugbbru, wwggbw, gwgwgur, rgw, rwwr, wrg, wugrwru, ggwr, ggr, wug, ugu, gbbw, wgww, gwwwuw, gbr, rbwwru, bbru, ruw, gbrgw, gug, bwbuwrb, uwg, rbww, bbbrb, ub, rgrbr, ubg, wugwub, bgr, ru, bwr, bwbug, rgr, wwugr, grg, rwu, wbgg, rgwu, ubugubr, buggur, wwb, rub, wugbb, uubb, uwb, wbb, uwgbw, rubrg, rwubgu, wgwbb, bubrbrww, bg, wwrggu, gr, gggr, ggb, wuuuu, bggwb, ubgrwbr, rgubwu, rwr, gbww, wgbub, ubrb, ruu, rgg, wgrwurrw, ubwggr, uubr, wrwrbrr, ruguw, bwu, guwrug, bgggw, urubr, rruruuw, gur, wrgru, wb, rgwwg, rrguu, wwwugg, rgbg, uwwgg, urr, gwu, ruwb, buwbgur, bbwugb, bubu, rwurwg, wgrb, rrw, uwgwr, ugwu, rgrurg, ww, uwgrrrgb, wrub, bgb, grr, bgwbru, wr, brrbg, rurur, wgbbbur, brwgg, bwgwbw, uuurg, rw, uuwguu, guw, bwg, bwrrwrr, ugr, rbwrg, rwb, urw, uubg, bbwrugr, bgw, brb, rb, rbr, ubbwurb, gbw, buu, wgg, wbw, ugguubw, rurbr, rrwbuur, ubwuwr, urg, wwu, wrguwb, bbgbur, grb, gww, gb, buw, bwbg, grgb, bbu, rbw, rrbu, gruwbw, uur, wwbgr, bwbwu, bgug, uwu, wubbw, rgwr, rrgrr, gwg, bbbubu, wwgrbrw, wuuubb, gbg, uwbwbg, wgwbr, ububb, ubbb, rug, gwbbrb, ubrub, urb, ggrwrgg, rrg, wbr, uub, wbrwbb, ugg, wrgb, bbwu, grurwb, uwbr, ugug, grw, gru, rwgu, wrru, rwgggu, rrr, ugwb, rrrw, brr, buwb, rbwbrg, ugw, rwuuguw, bwgggwb, bugr, wggbrr, uwgrrbub, bgbuuwug, burrrbu, wubwuu, ubwur, ubgwb, uru, brrb, wgb, bwuwgbu, wwuwwbu, bgbbg, wwru, wgr, ggg, guwuu, brbg, gbrb, ugrg, wwgur, wbbu, rwug, gbb, wugr, wuur, ubwurrwg, gwruubgu, wrrw, wubwwg, gugur, urgwu, wrbu, wbg, grwb, ugrrrrb, grbg, ggbbu, gbru, wgw, ggug, ubuub, ggu, wuwrbugb, ugrrrr, gbbubrr, rbgbb, bwwbu, uwwu, wwgbbb, gbbu, b, brwgr, wrb, rwrrw, rubwugg, bbr, wwr, wu, bbgwgbb, rbg, rwwgbbu, bgu, wubuug, ubwww, uggr, rbbbw, rbwgwrbw, bbw, bbgr, rur, ubb, uurbg, wguwb, ubbrgug, wrwr, rwwugb, uwrubb, rrgbbru, bwb, gub, ggbu, wwg, bww, ruwrwg, gbwu, wuu, gbbur, wrubru, rgb, grugwbbw, r, rwww, rbbru, wbrrb, rwgub, ubbrr, wuw, uug, rgu, rggg, bb, g, wru, urgw, ggw, ugwwbrg, grrbw, rbu, bbgugrw, grguw
|
||||||
|
|
||||||
|
urwrggwgbrrwggwuubrrwwugbgbubwbuuugwbguggubrgwwrubub
|
||||||
|
wuwguurugggwbbruubbruwbruugwbguuwrwbrbugurbgugrggb
|
||||||
|
wrbgrwbwbgrrguwbwuugruugrwbugrwuuuuurrugrgggugwuububwrwbg
|
||||||
|
bbbrbwrrwrgrwubbwgbbrbwbruuuwuuwwubbwwgwuwgguurbg
|
||||||
|
bguuubgbwggwgurubuubgurruggbgubwrbrrgbbgugbbugruurggwr
|
||||||
|
uwbbgwbrwubrwuwwbrbubbuggbbbbrugbbrwrubwrg
|
||||||
|
rgrrgruwrrrgwwgrrrrwbuuugrgbbrgbwwruggwrwr
|
||||||
|
wgwwuuruuwrbwbuwwwwbrgurgrgrgruwbrbugbbwggg
|
||||||
|
guuuuwuwrwwrggggurwrugugbubrguwbrrwbwurbbrgwbwgu
|
||||||
|
rrrugwggwgwwuugrgrggbbuwgwwrguubbbwuugbgrugwbbwwugrwgu
|
||||||
|
urubuwwurwgurgwbggurrgrugrbwgrubbwwurbwubwgbgrgrb
|
||||||
|
bbbwgwrbbwruubwwwwwbuubrrrguwguubbbugwrwwgugrbwugbubguwgu
|
||||||
|
rurbwuwgugrrwbrgwrwwubgggbwugbbgbruwwbbwrggwbbgwgwgu
|
||||||
|
ggbgbgwruwguwbwwgruwbbrbgburrwgubuwgbwrbwwwrggwgurwbw
|
||||||
|
guwrwuwrrbwrbgugwguburrwbggurwbbrugwbgrbrwwwbwrrbbbubbw
|
||||||
|
gwrgwrggwrgbbwuwbbwuwrgrggwgrbrwrbwbwuugrbubwwwbw
|
||||||
|
bbwguwgwrggubrgbuuurwwwguubgbbuwbrgggguwbubrbwwrrrbwgu
|
||||||
|
wrbwgbgwbbbwrubwbrgrwbrguguwrggbbwguwubgwbbbguu
|
||||||
|
buwuuwurgbbuwgruwwrbbbrbrgggwwuwrubgrrbbbwwrrbwrwrbbwgu
|
||||||
|
urbrbgugbrbgwbgwrwuuwguwgbgubrgguugbwwgbbbwrrrbubgwgu
|
||||||
|
wgwbguwugbwguwburgbwuruuwwuwbgrbbruggbrwwruwwrugu
|
||||||
|
ubburrrbwuwgubrwgrrbbwwrgugwgrwbugwuwrwwuwguru
|
||||||
|
wwrbgugggrwwrbgbbbbuuurubrugrrurgbrrwrurwbwwggu
|
||||||
|
grbuggwbruggrrrbrwbwgwubgwuubwgrwwugbwggrububgrbgrg
|
||||||
|
brubwgubwrbrgruwwrbgruwrrguwuurwwrubrububrbgwrwrbgbbwrgwu
|
||||||
|
wwrburrburbwbbbrrrggrbuwgubbbgwwbgbgwrububgg
|
||||||
|
uurbgrwburugubguuwgbwruuwwubbugbgwbbggggrggrb
|
||||||
|
uuuuurguwwurrbrrgrurwuwgbrwbggbrrugwguurgg
|
||||||
|
rrgubrwbwwuwbbgrgbuuuwuuubgrubbgwrrgrbbrgwb
|
||||||
|
uugwugrrgrbgrwubbrbuwugbrbgbubuubggbbgwguwwgu
|
||||||
|
uruwwgurbrwrgwrggrgubburubrrurrwugrwbrrgbugbbwbgggwubbu
|
||||||
|
rbbgguugrwgurwgguggggwwwwurbrgwbbbgwwruwrbuugwwgrrugurbb
|
||||||
|
gruurgrrgrgubrugrubwugguugwbguugbrgbuuwrurruruggguwgwgu
|
||||||
|
bguugrgrurgwggbbbrguwugbrrrggrwbguwwwrwwurrwuuwgwggbwubwgu
|
||||||
|
gubgbwgbbruwrwwbbgubrwwrwwwgurrbububbwbwgbwuwbgbuwwgbgwgu
|
||||||
|
wwwruwgubrbbgbburrwgwbgbrwgbrguwrbbbruuuwgrrg
|
||||||
|
wuwbwurruwgbgurbgrwggwwwwrggbuuugbugrbwguggwggrr
|
||||||
|
rrrwwwuwurggbbwuggruugwubgwwgbbgrrgwburwruurwugwuu
|
||||||
|
uwwwuuugrbwbbwugrwrruuwrgurbbgbubuubgugbrurwr
|
||||||
|
bbuurbggwuwbwbuurrrgrwbgrggggbwuwgwrwgrwgwg
|
||||||
|
gbwrwwbwruguugwwbgbwbugwggbubgwugwbuwrrgbg
|
||||||
|
wurbwgubrwubrrrgurgrwuguwgrgwuwwwgwguruwwurgwgu
|
||||||
|
uuwgwuuruwuugrrrgugrubbuwgwugrbrgbgrgwwbubrubw
|
||||||
|
wwbbgguwuwurugguugwggwrurguggburgbguruwbrbbgrbgwuwbw
|
||||||
|
uwrgrbuwbrbgugrrbwuubrrbgbgrbbbguurugggurgrur
|
||||||
|
wbbubggwuurugggbubwrrgbgrubggbggugwwgbggwwubugwbgrrwgb
|
||||||
|
rgguwubwwrbwgbgggbwruwuwugrgrggbwrrwbbbugwbwg
|
||||||
|
ubwrbbbbbbrbggbbgrwwuurwwggurrrbrbuwwuwbwrgruubuwuur
|
||||||
|
bwuggrwwgwubbbwrggugwwrbwrrbubbugwggurgurwg
|
||||||
|
bruugbgwbbwwbrguwrubggwwrggwgrrrrrrrruwgu
|
||||||
|
gugbrugurbuwgrrugugbuugugrbbgwgguuuwggburgwubguuugrwggggr
|
||||||
|
rbbrrbrbbwwgruwrwuwgggrbbbgbuwurgwgwggurrgbggubrrrugwubwru
|
||||||
|
guurwbbubrbbrwgrggrbruubwgbuwgrugrggbbbbuubrwugburww
|
||||||
|
bgrubggwwgwgggwuuggwgurbgggbuwurwbwbrgrguwuruwuwu
|
||||||
|
bubwubbburbbggrwgbwurrwgbwuwrbugbwuuruwwgwubrbuburu
|
||||||
|
brbbgrrbbuuggwbrrrwggwwugugwwbwuwgrbuwrurbuuggugbrgr
|
||||||
|
bbuubwuubbgwwbbbgbbwbbbrgbuwwbbbburguwrgwgrbrbbbgrwrbbbr
|
||||||
|
ggwrbwgggrrwbruubururgwruubbgurwbuwbwrwrbrrugguubrrw
|
||||||
|
gwuguurrrwwgwwgwgwgrurgwuugrrugrbwubwrwrwwbubwwgugbbwgwgr
|
||||||
|
rbgbbggrugwwuguuwggbugbrbgwgbbwggugruubbgugwgbb
|
||||||
|
rrgubuubrbgrrubgguuwbrguwwubbubbububgbbgwgu
|
||||||
|
gbgrgrwbwrugbgbgwwwwubwuwbwbwuwbwrwbgwbugwgu
|
||||||
|
wrruguguguugwwwgwwgrrubbbgrgwgugbrbrwrrgbrubb
|
||||||
|
brgbuwgbubgrurrgwrbubbbggbwruurwbrbbuwgrwuurbgrwrbugurbwbr
|
||||||
|
uggrbrwwwbbrwububrrggrwrwubwuwwubgbuwgbrbbrg
|
||||||
|
urgbggrwwwuruugrurgugrrbbbwwgrbuwuruugbbwrrurrwwwuguw
|
||||||
|
brrgbuwwrurguggrrurbrgrgbbrbburgwwbuwuuuggguwbrwbbgb
|
||||||
|
uwggwgrgrbbgwruwbrwubrbbrrurgrbrgwbwbuwgwgwrgubuuwrbgu
|
||||||
|
brurrrruwrgurbgbwuwwwwrrrgwwuuggrwwgbbwgrbggubr
|
||||||
|
ugrwbbwgbbbruggbgrwrgrguubbruuuwwwrrbguguwugurwgbggb
|
||||||
|
ugwrubwrubuuubbbrurruwurgwgbuwbrgugwurrgwwburbubru
|
||||||
|
wwgruuubggbgwbrbwgbuwwgbrubgggrrrwrugrggwrbrrwwuw
|
||||||
|
bwrrrbwbbwrgwguuwubwruwgbbuugrugbggubwuubwwggrrwbrwrbwrgg
|
||||||
|
rbbgrrwrgbrbuwwurbgwrggrbguuburubwbwbuuwguwrbrw
|
||||||
|
ugrbubbugbrbwgbrgbuuuubrubbbrurwgurgbwuggbrurbrggugurruuwb
|
||||||
|
wubuwurubwrrbrgrguwubuwruugugbubuwrrugbwrgwgwug
|
||||||
|
uugurwrgwburwgbuuuwwwwrbgbgrubrrubbuguuuwbbuw
|
||||||
|
gubuwruubgubwbrbrwwuuurwrurbrruuurrggwurwgw
|
||||||
|
wggrbugwuuubbgrbgwuwbrwwbuuuubwurrwgubwuur
|
||||||
|
wubugrubbrwurbuwbbgwubrgrwbubwwggwrbwggrgwbgrug
|
||||||
|
rwwgwbwwbugrbgwbbbbwgwgbbuurrggwbrrgwgbbuwbrguwgu
|
||||||
|
ruwwubrrrrbwrgruwrrgwrgwbwrguruwrgwubbbuggwrugwgur
|
||||||
|
gwgubguwguwgurrruwbwgbubrwwrbggwguwbbrwwurubburwg
|
||||||
|
ugruburuurgggwgbwugbuwgugrgbgrgbwuugruwbwwggugbwrguguuwgu
|
||||||
|
ggubwuwwrbrubgrrrurrurwbugggrguggbwbgbwwuwwwgwggbggbwuuuw
|
||||||
|
rgbggruubugbrurguurggurgwwrgrbubrrrubrwgbrggurguub
|
||||||
|
rgguwwububrwgwgbguwgurbggrrwwrrbgwrgrubwugu
|
||||||
|
burwurwrrgggwrwguburubgrrwrurgrbrrrwguguuwwburgwuuuruwgu
|
||||||
|
wwuwurwrgggrurbbwgrrrrbwgrurrbggguuwuruuugruruuwburwgrwgur
|
||||||
|
gwrrwruurbwgbuggbgbbgubggwwbuubgruugrwuurgbwuwwu
|
||||||
|
bgggwrbrrrubbbbwrrrbburwgurbburwugubbggwuburbwbuwwgwwbuggwgu
|
||||||
|
rgwuwgbbrugrwguguubwguuruubbgwugbguwurgrgbgruuwrwbg
|
||||||
|
ggbrguguruuugwrgwrwbrbwwwgrwwrubbrwuuurbrwrrb
|
||||||
|
bgruwubbbwrgwwbuuwrrwwuwubgrbwwurwbbugurgbgrbgggurrrw
|
||||||
|
uurbugwuwuwwrrrwbbgwgwubwwbrguwuwrgggwuuruwrrgwbwrbbgrbb
|
||||||
|
gwurwbbwurbbwurubbwwgwwwrrrbuwrgubbwbgrbwwbugrggwu
|
||||||
|
wrwugwwugurwrwrurwurrgrugrubggwubwgbbguurbugrwubgwgww
|
||||||
|
gbggrguuwuwgrwgbrgugbwwbbwuwrbwugrguuwururbbgrbwwggu
|
||||||
|
ggruwrburubgubwurbbwbbwbwrbguubbuwwgwbbwrbbuwgrubrwg
|
||||||
|
rbwrubrbgwwrgguwwgwrbwuurubbrguwbwrrrubbrrubbruwubwggw
|
||||||
|
ubbrrubrbwrubbrwwgrbggbgurrwggwbggbrbrrbgurbrbur
|
||||||
|
bwwurruwugubwrgwrwuwbwbwugurggwbwurruggggbbbrwbggbg
|
||||||
|
wurgrugwugbuggbbrgrburgguwurgurrubguwrrgbuwwg
|
||||||
|
buwuwrrurruuruugggggbwurubbggrgwrgrwgwgwgu
|
||||||
|
bggrbbbgbubuuguwwgubgrgrburrrbwrbwrruwwbuwbwwbwgwgu
|
||||||
|
gwurbugurwbbbrbburwggruwgrwburruruwuugggggwuuwbur
|
||||||
|
rrbwgbbwrgwbwuwgwwuwbrubbwrrrubbgruggbggwgu
|
||||||
|
wrrbruuwubugggbubbubwbgbwwbrwbbgguwrwwwwgugggggwurggggu
|
||||||
|
gwgggbrrugrugbuugbbrugrbgugrwrbwbwrwbgwrubwubrwbbwguuruguw
|
||||||
|
wwgbgwruubrbugrwrbuuurbrgwrrbgugugbbrwbubbrrubgrbugw
|
||||||
|
rbbgwrgbgwgubwrguuugwgrbwurbwbbgwbrggurwugbgbbbuw
|
||||||
|
brgbgburgbrugbwrwgrrbgugbrwugbgbgwbrgwwwwgg
|
||||||
|
rgwbugburuwwrrgbgrbgbwrubrwwbgbubrubwurguwu
|
||||||
|
rugurrgrgrrwgwrbbubrbrwwwuwwwwuurwwwwubbbguwuwggwgu
|
||||||
|
ruggbwbgbbuwbugrubgugubgruggwrwwbbwgrwugwurwuuru
|
||||||
|
wbrrwgbwbrbbbgwrgubuuuwwgrgwrbwbggwwwugbwuwwr
|
||||||
|
rwbgwgwgrrbbbwgwurrrrbrugrbrgubrrwgwwwuwgwrwrbrwuwu
|
||||||
|
wuwrbgwrbbuguuurubwrrurwwgrugbrurgbrgrubrurrwwur
|
||||||
|
gugrurgugrwgwgwrwrrggrwgbwwuwurbrbbgbuwuubuggrwuuu
|
||||||
|
brwwwguwbgrubgrgugruwwrbrugggbggbggbgwrrrguug
|
||||||
|
buwuwugggwwwrgwrugubugbrugwrwuubgbbbwwbgrubb
|
||||||
|
wbrguugwrbwgwgggrggbrgurbggrugubbwrbubbwggwrbuubgrrgrwr
|
||||||
|
wrgrbwgwrbwrwgbrubwgwubbrgrguwrgrbuurgggggg
|
||||||
|
wbuuggwurbwgwguugbuuuwugrwbwwuuuggwbuuwwbbruubwwu
|
||||||
|
buwrgbruwbwwrgbbbuwrrrrrugbbrubbgwguuurbrrgrwuubgwguwbb
|
||||||
|
urbuguubguwuwrwwurwwuuwwbwguugbgbgbububwwbwrwgwugwgu
|
||||||
|
ggrgbrwrbwuurggbgbgrbugggwuubbwrgwrgbgwrrwgwgwuug
|
||||||
|
uwwubwurrwgggwbgrbbruuwruuwbgbrgbgrbrubgbwgwwubwgu
|
||||||
|
rrugububgrbwuguguwrrwwwrgwbwurggruwgbubbruwubuwgbgww
|
||||||
|
uwgwgwbuwgrbgrgugwwwrwwwbuuwguwwgwuggrwbrrruwwbuuw
|
||||||
|
bbrgwubwwuwbruuurguuwbgurwurgbgubgbrrbbwwur
|
||||||
|
bubwrgbuwbuwugbbuburbuwggrrbuwuwrbugbbgrurbwgu
|
||||||
|
ruubggwrgbubwbwugwrbubrrbrbrwgbwgbbuguwbrgurwgggbbbr
|
||||||
|
brrggwurbgrrrruugbubruwrrwggugwgwwrbggrwrbguggbbbru
|
||||||
|
buurwrwwuububbuwwuwwwbgwgubuugbrguugububbgggugbwgu
|
||||||
|
brwuguwwggwbuggurwbuwubwgurwruuwbrurgurwuwurggbbwurruugwbg
|
||||||
|
wrbrggrugurwgugwrggrguwrwugubwurwbrgrrbrbwgbrbuwuggbwbru
|
||||||
|
bbbgrbwwwurubrgwwwbwbrrbbrgrruggbwubgwuwurbugrburwgguurwgwgu
|
||||||
|
ggrrggwbrgguugbwbwugwrwuuruwubrbrbgwbbgrru
|
||||||
|
bwggwrbgrgrrwrgwrubggwwrgwwurbwrururubwuwbruwurwgwwuwu
|
||||||
|
urbrrugruuwbrwwrwurrwrrgbwgubuwwbwgggurrgugbwbrgbugwbggbwu
|
||||||
|
gwugbwrugrgbbwrrbwbwgbguwggrrurbbbbugrggbgb
|
||||||
|
brrgwrbwwbuurwuruwbwwwwrwbbbwggwgggugbguwuburr
|
||||||
|
ruuuwgbguurwgwugwggrwwrbbbwugrbururbwburwwruuwwrugrur
|
||||||
|
wrbuuwrwggwwrrbgwwrbuuggbgrugwrgugguruguwb
|
||||||
|
rbrrwwbuubgrrbuwurwwuwgwguubgrgrbubrwgugwrbgruburbrrug
|
||||||
|
gbwgugrbwbwgrwwbgbrrugwgruubwggbgruuwrwgbwrwrgbuw
|
||||||
|
rwgrbbbgwgubrbwuubrrubbrguubbuwbgrbguggwugurgbguwrrgbb
|
||||||
|
rwgbguwuuwgbrbrrgwgrrwuuuguuggbggggbwburugwurg
|
||||||
|
wgrggbbrbrrruwgguwggrgugbrrbrbwbugbwwrubbbbuwu
|
||||||
|
wrurbrubuuugugwggbugrubruwbburrrrwuuwgwuwggbbuguw
|
||||||
|
gbrrwbwruwrrbrruguuwgbwwbugrwwugwbrgubgrur
|
||||||
|
grrrgguwrrwwrwwgbbrgggwgbguwuuubbwugrrrugrggrb
|
||||||
|
uurgrwubwbrrgurrguuwrbgwrbrurwrugrgubwwgwbwgbrugbgwbuguwgu
|
||||||
|
bwbwwgbbgrwwbrbbbrgbrbwwwuruuubgrgguurbuuwgu
|
||||||
|
grggrwbwgggbrgugrwguwrubwbuwgurrruuwbgbrrgb
|
||||||
|
bbrruubuurbguubwuugrurbwrbgbwubwubwwrwguwug
|
||||||
|
uugbrugbgrbugguugwbwbgrgbuurwwbuubgrgrgbrw
|
||||||
|
wbgrbuuurbbruwwwgwrrbguugbuguggwwwuurruuurbbgwwrbgwg
|
||||||
|
ggrrbggbbgbgwrbgggrbbbrububuwrrbuwbbwrbgrgbgrwbb
|
||||||
|
bgwuguuubrwwuwgbbgbbbuurwwwrwwbrgbggrbbwguguwgu
|
||||||
|
rrbgwruwbbuubbuubrbggbugwwwgbgrwgugbubwbgbbbgbbrgug
|
||||||
|
rbwbrgbbggbburrrwguwwuwrugrgggggrwruuggrbrgubgwrwbrrubggwgu
|
||||||
|
guburwgburrgurggurgbgrwwwbuubbwwruwrubbrbbwrgwwrruubbwbu
|
||||||
|
uwbugwbuwrwurbrwrrrwrwwbrgrbbbwuwrrwrrrbbbwwrwrrbwgbrrgwg
|
||||||
|
bruwrgwrugwggrgrwgrrrwwgwwugbwurggwbrrwbgwgrgurru
|
||||||
|
gwuuruurwwguwugwurrgbuwuwwgrwgurgbbrgwurrwwg
|
||||||
|
wgrbrgurburugugbguwwgwbwwgggbuuugwgwrwbrrrbruburwrwwgwbbrb
|
||||||
|
uwggwbggwgggrgrbrubrbruubguuwgurggwbbrbbgrrbug
|
||||||
|
rurbgwgbwuwuwuuubwuguwrbwgbbrururruwbgwwbuwbrrwrrurwgg
|
||||||
|
ugwuuuurubbgbwrwgbuwrbbrwbwgwuugbrguggbubbggggubgrwuwrbbgg
|
||||||
|
wbbugbrbgbrruwguuruwwgwgwrguwubguuwurbgwbbguwrrrwwwburguuu
|
||||||
|
wuugrbbrrgurgbuuuruwbggrggbubwubbrgbuugrugwbgwguwrw
|
||||||
|
guuwwrbuuurwrrwrwrwrbuugwwbuuuuugugrgbguubrrbggbgu
|
||||||
|
rbwbbruuwwbwgwbwgugggbwwrwugguubrugubwgbbrgrbgu
|
||||||
|
bgrgbuugggbugwbbgwurgwguuuruubrubwbubwgwgwgurrgbubrguubr
|
||||||
|
rbggruugwbuwgugbuubugggwbrwuurgrrbwwbrurbgwbgguugbburgwgwg
|
||||||
|
guwuurbbwwbbuwwuwwggurguwuubuwwwgrugwrubgruurwgbwggb
|
||||||
|
gbrgbwwuggwuwgbgwbbgguwrwbwbwrwrwururbuwbgwgrrwrbuubwrrrbu
|
||||||
|
ggbbwgbbbrbwruggurwguubbwbguwguwgbrwrrruwubrurbuguwgurgu
|
||||||
|
bbwbwrugbwuwbwwbuugrgugugugrgwwuugwrurruwbgwwbwbwr
|
||||||
|
gbwwwuwrwwguwburwuggwbruuwbbrubgrbrwrgwrgrgugwgu
|
||||||
|
rrbwwbrrwgwruwwwrrgwubbugruwguggwwubrrbwwwwggg
|
||||||
|
urrrgwgggrrrurubwurgurwgugwgrugwbbwbwwgbbrwgurgwgwbubgwgu
|
||||||
|
rwgbwbrwwbgrbwggwbuuguuuwgbbubrgrggrwguwbrwrbrwrrwwurg
|
||||||
|
grbrwgbrwgwbwubgrbbgwrgrwuugwbuwuuwbwugrrwg
|
||||||
|
rgrurbbbggrrguburrwwugbgbbgbbbwuwbwrgwgwwbruuruww
|
||||||
|
wubbgwgbggwwggwrwubbrbwrwrbruburbgwwwurgguwgr
|
||||||
|
bbrbgbwrrbgwwwurggwgguwruwbuwbugbubbbbrwbggubuwuwgu
|
||||||
|
uwubbwwbrurwrrrwwurbgwwrubgugrbbgwbbbrwrrrgrbruubbbburrgg
|
||||||
|
rugwrbwugrgwwgwbbwguwbuwbugwwbugwwwurwbbguwgbgrwuwrggbgrr
|
||||||
|
rgwgwwwuwbgwbuuwubbuwbruwgugbbugbbwrbwggwbgbwurubbrrgbrw
|
||||||
|
urwwgrbbgbuwuubrubruburgugbgbwuurgguuwuwubwbuggbwbggwugwgw
|
||||||
|
guugrwbbwwbwbwbuguurubuwwwrrbggbrruwwwurwbbbrbbb
|
||||||
|
ggugbrwbgwrbrbbbrgguggwgrrggwgwrgruurgwurggwwgubgwgu
|
||||||
|
wruugbgugwwrgbwbrbbbgrubrwbgwwguwbbgubwrguwuuwubgur
|
||||||
|
bwuwubbugwgbrrwuuwrgbgbguwuurrbbwrwugwwwrbubgrrrwbw
|
||||||
|
buwrbrgwbgwurrrwguuurbrrbuuurwrgwubbgwbgggguruwbgbggb
|
||||||
|
uwbggrgwbubrbrwwwguguwrrugbbbugbbgwrrwwwgrwgbugurwrurr
|
||||||
|
ggurbuwrwgurrgurgbuwrguwbwbrugbgburwuwuuwuubgggwruubgubwgu
|
||||||
|
gwrrbbbgwbwuwgubbugguwurrwwbrugugwwrwbrgurrrwww
|
||||||
|
gwruwggwrubugwgubrruruurwrggbwgrubbuubgrruwgrburwbgrrbuwgu
|
||||||
|
gguugbgwrrbwwrrgrbrwuggrbwbgbgrwrbuwbbubwgubwuwubbg
|
||||||
|
rruburrrwguwrrgwwuuwwbrgwgrurwurwubrubuurbgbbggrgb
|
||||||
|
wbrgwrbgbrbwgwbuwurgrrruwbwrugwbbbgwbgwbruuuguwuwwbuguwrub
|
||||||
|
wwrgrgbuwbbbwwurgugrruuwwwbrrwuwugwwurwgrwurubguwwg
|
||||||
|
ruburgggurruugrubggwgugbuurgwbbrrggbwggwwrbbgrwb
|
||||||
|
wwggruwuwwguuwwrrgubgwgbwwbrrrwwuuggugwbuurub
|
||||||
|
gwrburbbgbrwugbwrbggrwwwwbrrgrrrurggwbbggbgbubgrrbuwrwu
|
||||||
|
wbuubrwbrgwwubrgrrggrrurwbbwrrgwbrguggwuwwugruw
|
||||||
|
ugbbuugguuwgwbubrwrwwrwgbbbwrwgburuwrbbuuwbw
|
||||||
|
uuuuwbwggrrbbwwrwgrwwbwrurrbruubwwwgbgrgrrwggwwuugbgrrb
|
||||||
|
gbbubwubwbgwubwwgruwbgrburbuwwbgwwgbwrwbwbrgwrrubwwbrug
|
||||||
|
rwbwwruwwwgurgurrgbgubuuguwbwrugbggrwurbbrbbrbuwwrrwww
|
||||||
|
wgwrubgwuubgwgwguguugggwwruurwwgguggbuugwbuuwrbr
|
||||||
|
wwgrwrrgrbbwwwbgbgbubuwrwrbbbrwrgrgguwgwwugggbbgbrbwrgug
|
||||||
|
urugwubwgubrwrbuubguggrbuuuuuwwurrgbrgbgbwwubruwuuwwwggugr
|
||||||
|
buwuburbrgugrubggbgbrburgwrgwwgbuuuuuwgbwbrbuugrwbbbwb
|
||||||
|
uuwgwwbwuurbbggbwrbwrbbruuururwgugwuuurwgrgrwbruwuwru
|
||||||
|
ugubbwgubrgwgwwurbuurwwrbrwggubbguwrggrubrrbuwuubbwbrbrb
|
||||||
|
grwwrrgwrubbwggwgwwuuuwwrwbbwbbguwubwgbrgbrgrgguugrrgrgw
|
||||||
|
wrbrgrgwrwbruruwuwurrbwgwwbrrrwwwwrgrbwgurgrwugwuwgu
|
||||||
|
uuguwwrbgguuwgubbwrwugbrwbbbrbugubbrbrgruugbggbwbrubwg
|
||||||
|
wwbwbbwugbggwbguwggwbgrgubgrbrrrgbrugrgwuggubbrrr
|
||||||
|
brgwbubggbrwbwuggububwbuuwgggrgggwgbwuwguwgwgu
|
||||||
|
gwbwuwuuwurwguggbrbbrrwubbrbrwuuwrbbbgrgurggrrwrg
|
||||||
|
ggugugbrgrrrwuurruuwrgbgbgugbbbrwuwbbgrggbwuggugugugb
|
||||||
|
bgwwurubbguruuuwbuuguwwbbuuggwgbbgrbbubgubruwbgbuwwurgu
|
||||||
|
uuguwgrrbubwrgruggubggwrgururbrruurwgrgbrgug
|
||||||
|
ggwubwbwwbwggguugurbwrrbwrrgwrgrgbubuwuurwgbruubbwgu
|
||||||
|
bwgbguwrgwubgrgbwuwgrggbwwrgbgwbruuwgguggu
|
||||||
|
wbgbuwrrggwgbubgrbuugrrrwrrwguurubuurbgbrb
|
||||||
|
wrbwbrurwrubugrrrbugrwugugrugbwuguubbrgrwwgbrruwbbwg
|
||||||
|
gbuguwgwwgwuggrbggwbrruuwubwrgwbrwgwguwrgbwgu
|
||||||
|
gggggbbururwbggwgwwrrguurwwgwugrrwuggbubrgrrugubgbugubwgu
|
||||||
|
wurbgwbuguwbbgubbgwbburbbrwbbubwrbrubgugbbugwuw
|
||||||
|
uugggbugbwwbrwuguwggrgwrbrgwwrugwgruruwgwubbbwwbbguuwugbr
|
||||||
|
brugggrwruuuggbgwguuurwubgwuuwbruguwwrgwgbugrrwbbrug
|
||||||
|
wurrrrbbbggrwurubbruurbrrbwwgrrrrgruubrrwwwr
|
||||||
|
rugugrwbubrgrwbwwbuugwurrwuuguugrwurwrbbbwrbg
|
||||||
|
rrurbgrgwrwuguggurbrbgwbgugwrbrugbggrugrrrggrw
|
||||||
|
ubwwwwbbguugrurbgrwwgruubggbrrwgbgwrwbrgbugbbbbugwbwbb
|
||||||
|
wwgubgrrruurgrguwrgwuwggbwbwruggrbgrbrbwgguruggwgwuurbbuu
|
||||||
|
ggguurwuuruguggrrwgrwurbwwbwwbwrbrugbgwrwugbruugbgg
|
||||||
|
urgbubgwbrwrgrbwgruguwugwbgrgugrgbwubrgrbwrr
|
||||||
|
uwbwbbbbrwggwrrggwbgbwrgugbrggbwuwgubrwbgbuuwugg
|
||||||
|
wwgbbgwrwrwrbgubgggbrbguguguubbrbbrurgbbgubbbbwgu
|
||||||
|
burwbbguggbwwubrbugbrwwbrgwgruwrrbuggugwgu
|
||||||
|
brrbrguwuwbrrrbuuubwwrbgbubugwwurwugrgrwurbugwwrbugbw
|
||||||
|
gburrrgwuwrbwugugrrrurwrrrbuugruurbbguggugubwgb
|
||||||
|
ruugrbbwbubuggbbuwgbbwgwurbrgrbgruwbrburggubrrwuburuugbur
|
||||||
|
wwbwrbwuwguguuuurwubrwbrburbggrugurwbrrrwwbgurwuwg
|
||||||
|
urggurrrgbbrgrwrwrbuuurbgwrugggrwbrwbgggrugg
|
||||||
|
gurrbgbbrugbwrgwwggrururbbgwgwwbwubgwrrbubwbuubggbrbrr
|
||||||
|
bbwwbgbrbwwrgwwrbgwbgugurugbugwubguwubruurru
|
||||||
|
wuurbgrrgrwurrguuwuurwbwubrbgwbbbbugrwwwwbbbwwgwgwru
|
||||||
|
uwgubbbwuwugwbrgwwguubwwugugwbubguugwgbuurgbrwbruuubuurruw
|
||||||
|
bbruwrwuubwbugbbrbgggbwbwbuwuuubrgugugwbwwrbuwgwuwgu
|
||||||
|
wgrgrbbgruwrgrwgbrwrwguggguwwwubgbwuwrgrbguwu
|
||||||
|
bwbrbbwggwrruuguwgwwgubrbgurrgburuuguuguuwggwwbu
|
||||||
|
ugrbrwugrwbwgbwbwbwrgbgugwurwwgrurrrugbwbggu
|
||||||
|
grwrwbuuwbbrbbbuwrwubbugbbbwwgbwgruwbgrgbwguwwbwuww
|
||||||
|
ugrgbwburbwbgrgubbuurwubrgrwubbrrruwubrugrwrwbggb
|
||||||
|
wwrwwrwrgurgggbrubuuuuurbbrgwrgggwgrwbuwrggruru
|
||||||
|
gwwbbrburbuuuguruubbbggwgrgrubwgruwwrbrgrgruugwrrww
|
||||||
|
ugwrwguggubrrwwurwwwbwbwbbwwwwwguubbwwurrgwwgwbwubwb
|
||||||
|
wburwbggrbgurbwubwubggubrwurguwbbbggbwrbbguwbwbwuurgbgg
|
||||||
|
rwwgggwwwbubgugbubuuwwrbbuwrwwgwggbbbugwbrgbwuuuuw
|
||||||
|
brggrwbbwrubburgwwrbburuwuugwrrwuuwgrrrbwwwgguubwwbbbbuwgu
|
||||||
|
wuwrbwuwbwrugbrwubbbgugbgwgwbubwuurbggwwrrgrbggbw
|
||||||
|
uwrrgrrwwugrburbbwbwbwbwuurgrgubbwwuwrgrwgbugg
|
||||||
|
gbuwgwrwbgbgrruwrgugwuwbgwruwrbgbrrwububbrbrrbgugr
|
||||||
|
bgbbbwwwwbbubwrgwbwrrbgggrwggwgwgbgrbbgggugwru
|
||||||
|
wwgwwbguuwrbwuuwugwrwbgrwbururbugrrrgwbuuwrwwuuu
|
||||||
|
brgruuuugrgwuuguwbbwgrwgbggbgrugrwwbbugrwwrrubwgu
|
||||||
|
wburbrwbwrbwrbrrgggurruuguggwuwbrgwbgbwgbrwubgubugbur
|
||||||
|
rgurgwgrubuuwwrugugbbggurbbgwwrrubgurwbwbbbrurburwrwwub
|
||||||
|
wguuuubwubwgwrwuwwuururbggbgwgbubwwrwrwuuwgwbbbrgr
|
||||||
|
uugubgbguwbggguuggrbwgwwrrguwuwbubwwrgggwgbwgrb
|
||||||
|
gbubrbggrwwgurbbbbbuwbbwggbuwbuwurrgruwwgub
|
||||||
|
buwrrwbuwwgwbuwuurguuwbwrbuugwwwuwgrrbubbrgrbubguruwgu
|
||||||
|
ubruwgrwbwuurrruwbbwwwgrbbbburgwwbbuuwrgwrguburwbuggguw
|
||||||
|
gwuuuuwgbbgbwgggubuugrbbwrrurbbrburrrgwgbwguwubwuww
|
||||||
|
rugugrbbwuggrgbbubggubbggbrgwrbrbgubbwgu
|
||||||
|
uuubbbggurgubgrbguuwwrgbrgrbbrbrubwguwbubwrgwwbugg
|
||||||
|
gbwrrgubbrwgbugbrrruwubwgrwurrwwurwgwrwbrguwrgwwbrwwuwgu
|
||||||
|
wwwbwugurwwguugrbwgruurwwrgguwuggwurugrggwguwg
|
||||||
|
ugbrwwbwwwuwwrgrwuwbuwbgwurubwuwuuwguwubwbburwrwubuw
|
||||||
|
grwgrggggbgwgbgbrwguugwrwbgrrurwbbwburgrwwbbwwgggrwwgugwgu
|
||||||
|
gbrbbgbwgburbbbrwbgbuuguuurrrrwwbggbgrubuuwwwwrb
|
||||||
|
brbugwubbrgbuubwbuguguwuugbrubgbrwwugbuwbgbwuwwbrgubrbwruu
|
||||||
|
rbwrwurbbwubwrgrwrggrwugbbuwburwuggwgwbgbwrgwbgw
|
||||||
|
brurwruuubwwruuwuwwwuggugrbruwbgwbugrrwurugrgubrggbwwr
|
||||||
|
gugrwgubbwbuugwgrgrrrgwbbrguwubruwugbugrbbruuurwgbgur
|
||||||
|
ggbrgubuwwururggrburuuguguurgubbrugurbwrggrrwbwgu
|
||||||
|
rwuugubrrurrbguuugguwwwugrrgwgbrguubgrwbrrwguwbw
|
||||||
|
uwuwrrruwrwwgrwgrbbwwwggwgubgrrrwggubuuuuuubrbbwgu
|
||||||
|
ruurrrgrugrgrgwwugrwwgrbuuguurgrbrbgrwbwgwu
|
||||||
|
buubbwwbwwrwbwwbgurgwbbrrgbwbwbuwwbwbggguburrbrrbwgurgu
|
||||||
|
bgrurgbrrurwwbbrrwbrrrwrgrwbbrugrwbwrrgubbubrrbrgbuuwrgww
|
||||||
|
rwbbwbgwbggwwgugrguwgbuwwubwuwwwwuwbugrwgrgguu
|
||||||
|
bggbubgugwbbrurrubwgwbwwwuubbrguuurwruruwrwwubuurr
|
||||||
|
buwuwbrrubbwuurwbrgwwwwrrgruwggruruggbrgwbwwwbwugrwgr
|
||||||
|
ubbuguurburrrwggwgbwuwwrgwurgruwwwwbwwgruwbugbuugrrggbu
|
||||||
|
ubuwrbwgwrbgugrwubbgrbwrggwrgrubbbbgurwrrwuubwbrgbbbbuggww
|
||||||
|
uruwwuubrbgubrurwbguwrugbwruggbbwwuwuggbrwuwbuggbrbrgrbr
|
||||||
|
uubuuruwrbbwguugwgubbwgwubbruggrgwrrgruuwuwbgwrrrgr
|
||||||
|
gwbububbgwbwgggwrwurugrrruwuwurgbrwbgbwuwuggwgbwuwbur
|
||||||
|
ruguuwwuurgwggbbwgggugugbbuuggwbwbbwgrruuubwrguwrruugwrbb
|
||||||
|
bwwrugwwrgwruubbwwgbwwrwuwubbwurrrubrwwwubbubugugbuwb
|
||||||
|
rrbwwggurwuuubgurbbwgbrbruuwbuuwwrbugggugw
|
||||||
|
rwggguuuwbwuwwubwuuurrubgrguwuwbrgbuwbgugbbbbrwuruuurgrw
|
||||||
|
uugubuwwwrwwuwguubgrrbrrrwrrgwubbwwbwrbgguguuguuwru
|
||||||
|
rwugwruubgurrwrbgubuwrwuwugrwggrwwwugbubugwbbwgwburbbubwu
|
||||||
|
bubbbrgrgbwgubwwruurgrbrbbwgbgrwgggwrbburubwb
|
||||||
|
brwgbbwrbruggwrrbuuuuuuuuwrgbwuggrrrugwuwgr
|
||||||
|
wggbubwgwruwrbgrguugwbruuggwbrrwbgwuwrgwwurgugwurbwbb
|
||||||
|
gwwbrgrrrwrbgwubrwgwrwbgbburgrrwbuwgwgrgwgubbgr
|
||||||
|
rurgrubwgwrrubburwurgrbrgurbrguwugwurrbbbbwwbbuw
|
||||||
|
wgwugubruuugbrgrgwgbrurwbgbwbrbuwgrwurrgruwgu
|
||||||
|
gguwggbrwwugugrbwrbrwgwwgruggurgurwrrrrwbwgu
|
||||||
|
wwgbrrgwwuwubbuuuggbgwgrwbbrgubwwuwurwrbubggrgguurgw
|
||||||
|
wrrrgwrubggugwgwburgbbwguguwwgurrwwgggrguguggrugwwwgu
|
||||||
|
ruwwbrburrrrwgurruwbwgruggrbwuwuurrgbuuwbgbg
|
||||||
|
rbugurbwgurwwrbwrruwgbgwwrwgwggrrguugrbrgwwgwwurubbrubrg
|
||||||
|
bbbbguuuwwurwbwbggbrgwwugwbugrugubwuuwggwbwuwwrgbrguuwr
|
||||||
|
buwubggbrwruburgbubwgbwwrwrgbwgwrwuuurrgrrwwbrrrgubb
|
||||||
|
ggurrgbrbggggrbgwbuwurwbrguugrbuurwrgubwwubbbbwrwuwbur
|
||||||
|
ubbwubgbrwwgrgbgrwbrruuurbwrwrgwbgrrgrbgrgwuuwwururrbr
|
||||||
|
rrugruuwgbwuwgwuwruuwwuuguurrwbwrgugbgwwubbg
|
||||||
|
gubuubrbbrrurrbrrwguguwrwgbbubrbuwwbuwwgubguburuggrgwr
|
||||||
|
wguwrwrwruwbbbbwuubwbguuwurwbubgwwwwrbuugww
|
||||||
|
bbggggggbuwgurgwurbubwubgbgburbwrrbrrrwbwubwwruwuwbggrrugg
|
||||||
|
ggwrgbwruubwwuurgbbwrgbbgwrubwgbrbbbggbrurgugbbwgbgrugu
|
||||||
|
ubuwugruwbrwwbbwbbuwwubgrbgbgggurrrrgbbgwbbwuu
|
||||||
|
rrgwwggwgurgurbbbwubuugbbbgwwrrwrburubgwgu
|
||||||
|
ugrgugbrgrwuugbuwgugrwrbwbugbwggwbwubgbruuuwbrrwrbwuu
|
||||||
|
urgwwubwuubruguwwgurgbwgubgggbbwruwrurwwgbuwrrrbwwuw
|
||||||
|
bgrgubruwrurggrbwuwbbwwugwburbubrrwurwubwrruuurgubrrgub
|
||||||
|
rgbrrrwwbbuwrbruuurggurubggwbbrrbwbbrbgwrbuwgbgg
|
||||||
|
rgguwggugruwwwbrbgrrbwugururguwuuubgruubbwwwu
|
||||||
|
bwwbrrwuurgrruwgrguwwbgrrwrbwuuurgggbrwgbuwbguuuwggwbrrgwgu
|
||||||
|
rbwwwrbubwggrugguugwwgwbuurburbrubuwgbururwgrgwwb
|
||||||
|
wwwgubbwbwbgwubrrgbubuwbbbgrrgrwwrbbuwbubrrguuugruwwruwwb
|
||||||
|
ubrbggrwgrwugwwgrugubrburgggbugwbggbburgugggwbugugguguguw
|
||||||
|
rrrgrgrwgbgwgrgwrurwuwgurrbwwwgbgrgwwbwbubrrubrru
|
||||||
|
wbwgrgbwbgwgbuugburrwburbuwrbwgburrgwuwrggwbwuwgbbbguwrbgr
|
||||||
|
rwgburgwgubuugurwbwbwbuburrrbburgwwwwguwgwwbwbbwwwuwbwgwug
|
||||||
|
rwbuuguuwrrgrwrrgruruuguwwwgbbruwbbwrbrguwgu
|
||||||
|
guwbggbgrbbbbuwrwguwguwgrwurrwrbuurrrgruwwurrw
|
||||||
|
wbwuuuggwbgrwggbrggwbwburgbbrwrrugbbrugurbgwgu
|
||||||
|
wrrubbwrrwbruruwggugwwgrrwugugrgrguuggrubrggugggbrwu
|
||||||
|
rugrgguuuubbuugbbrrwuuwgrbrgbgrbbrbugururrg
|
||||||
|
ugggrgrwgbgwbwwrrgggbwwgbgbwrwwgwubbbrbbbuuwgwbbubbbwubw
|
||||||
|
gwgwuwuuwgbuubbwwwrrurrbgbubuuguwwbrgwubuuwbgwwuwbg
|
||||||
|
rurggguuubuuwrbrgwgguurwgrwugruugwwggrbuuugwbwgu
|
||||||
|
gbburubbgbggrwubgrgrurbwgrrubuwrrbbgrgrwgg
|
||||||
|
wgrrgwurbguwgbuwrbrurruwrbgrrbrgggguugrbwgwrbwwbrgwgu
|
||||||
|
rgbwbrwguubrwwrwugbbbwugwurwwgurbbrgwwugbbbwgb
|
||||||
|
ruwwgugrgrgrwgrwrbrrggwurrrwubrrbbrbwubrbwgu
|
||||||
|
brbwrrrggrgrggbwbgubgrrugwgwuubrbwwurbwbru
|
||||||
|
wrbrwgbwbbguburgrrgwrbrwwurugruggwgrrrurggur
|
||||||
|
gggwrgwwbuwwbrbgbrbbgbbubbuggrgrggbwugugggrbub
|
||||||
|
urgbwrgbgwwrgbwurgggrwgbbgwbwgrwwuuuguggbrbggw
|
||||||
|
wwubrgbwrguwrbrurrwwwgrwrbrbrrbrrwwgbbuwwwbbbwbg
|
||||||
|
rrgugrbrbuwwwuuwwurgubgwbbruuggbbbruuwubur
|
||||||
|
urguwgrrrgbrrwbggbgurrrrrwggrggrrburrrgggbu
|
||||||
|
ruwgguwurbbrgbgwgrrubwbwurwrbwgburrbbgrgburgubwwgb
|
||||||
|
wggwubbrwwwububuugwbwbubrubuguwguwrbbrwbgwgurgu
|
||||||
|
uubggrubwgrgbrurgbuwubgbuuwugwbuururrururgggrurwwrrgrrgbgwgu
|
||||||
|
brrwrbrbggggrwrburbrurbuwuuguwbbrgrruwbugwwburuuugubwgu
|
||||||
|
gbwrruugrgwbgrbruwwgrurbgwwubgwwbbggubgrwubrrburrgwuw
|
||||||
|
uburgbbwrgrwurwbuwrrwbbbggrruwrugubruwbgwubggurbuwwbbuwgu
|
||||||
|
wwrwguuwubrbbruguuruugbwwwrbbuubbuuubbbgrgr
|
||||||
|
uuwgbbgguuggrwwrrrubbbbgurgrruuubwwugwgu
|
||||||
|
guggrgrbrburubbugbugrgrggggugwgwggrrwwgbbwgu
|
||||||
|
rbgbbwrbwggugurgubbwwwrggwgwuwgrbrrbgubbbbruw
|
||||||
|
uuuwgrrrubbrwrbggwgguubbwbrbrwbgrgwbubwggwubgrub
|
||||||
|
rurwruuwwgwrguwugruburbgbuugugwuubrbbwurgrbrbugwubr
|
||||||
|
urrruurwuwbbbwububwrgguwbrgrbuubgrwuguwurwrbubrugu
|
||||||
|
gugwgrrrbrrrgrrwwgrggbuggbwbwgbburbwwggguwrub
|
||||||
|
wguwwwgwggwwurrrguwuwbgrgbrgwugbwbwwggbugbggr
|
||||||
|
gwgrwrgwbbburggrbwwurrrgbguurrrgrbrugwgbwurwguwbgbgrbug
|
||||||
|
rbbrrrbuuurgugwgrrbuwrbrrurwuwgrrrgbugbwgu
|
||||||
|
urwgwbuuwrgwwrrggwwubbrbwguuwbwrggbbwwwwbwrrrwwgbwwurbrrg
|
||||||
|
wwbguurugruuwuubugbgrwgwwggrbubrggwrwruubwrgwub
|
||||||
|
ubgruruguugrwbwbuwbbwruubwgrrurwwruwugwbruuurrwwrrgruugw
|
||||||
|
grbubwruwubgugggrrgrbwgurbgwugwwggrrbrgrbuwbbbrbwgu
|
||||||
|
wrgrrubgggrurgwguurubwgggbwuwrrubrugbrgbrbggwgg
|
||||||
|
gwgbrgrrbbrgubgrubrwrwrugrgubrgruuguwrwubwwwrgbubwwggbbwgu
|
||||||
|
bwbwgbgwbwwbuuwbrubggggbugwgbgbuuwggrwuwrbr
|
||||||
|
wugrwurwgrbugrwrwrwrrgwwuugrrwgrgbgbuwgu
|
||||||
|
urbbubruuggrugwwrbrrguugguuwuuwuuubrbgbbggrgbug
|
||||||
|
rrugubrbbgbwrbggguugrbrrrbruugruuggrbgwbuuwuururugwruug
|
||||||
|
burwbgbgruwrurbrwuwrgurgrrbrbbguwwbbrwgbwbgwrwbruuwbgwgww
|
||||||
|
wbubuuwbrwuwwruggbbugbrrrgbgwguwwgrgurgwrugrguurrrrbbgrbbwgu
|
||||||
|
rbwrbubggwuubugbrubuurruguwrrwgubwrwwububwrgrguw
|
||||||
|
gbrgubrugbwrgwwwwrbugwwgwgwrbrgwuuggrubwrbrugwbbruubwgu
|
||||||
|
wbgrubbrgwgrbrbuuuubuugwubbugwbuggwrburgwugw
|
||||||
|
grwgrbgwwrubruuubburwgbwgugwugwwrbwbwwrguwbbubuuwguwr
|
||||||
141
Inputs/Day20.txt
Normal file
141
Inputs/Day20.txt
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
#############################################################################################################################################
|
||||||
|
#.......#...#.......#...#.....#...###...............###.......#...#...#...#.....#.......###.....#...................###.....................#
|
||||||
|
#.#####.#.#.#.#####.#.#.#.###.#.#.###.#############.###.#####.#.#.#.#.#.#.#.###.#.#####.###.###.#.#################.###.###################.#
|
||||||
|
#.#...#.#.#.#.....#.#.#.#...#.#.#.#...#...#...#...#...#.....#.#.#.#.#.#.#...#...#.#.....#...#...#.........#.........#...#.................#.#
|
||||||
|
#.#.#.#.#.#.#####.#.#.#.###.#.#.#.#.###.#.#.#.#.#.###.#####.#.#.#.#.#.#.#####.###.#.#####.###.###########.#.#########.###.###############.#.#
|
||||||
|
#...#.#.#.#.#...#.#.#.#.....#.#.#.#...#.#...#...#...#...#...#.#.#.#.#.#.....#...#.#...###...#...#.....###.#...#...#...#...###...........#...#
|
||||||
|
#####.#.#.#.#.#.#.#.#.#######.#.#.###.#.###########.###.#.###.#.#.#.#.#####.###.#.###.#####.###.#.###.###.###.#.#.#.###.#####.#########.#####
|
||||||
|
#.....#...#...#...#...#.......#.#.###.#.###...#...#.#...#...#.#.#.#.#.#.....#...#.#...#.....#...#.#...#...#...#.#.#.#...#.....#.....#...#...#
|
||||||
|
#.#####################.#######.#.###.#.###.#.#.#.#.#.#####.#.#.#.#.#.#.#####.###.#.###.#####.###.#.###.###.###.#.#.#.###.#####.###.#.###.#.#
|
||||||
|
#.....#.......#.....#...#...#...#...#...#...#...#...#.......#.#.#.#.#.#.#.....###.#...#.....#.###.#.#...#...#...#...#...#...#...###...###.#.#
|
||||||
|
#####.#.#####.#.###.#.###.#.#.#####.#####.###################.#.#.#.#.#.#.#######.###.#####.#.###.#.#.###.###.#########.###.#.###########.#.#
|
||||||
|
#.....#.#...#...#...#...#.#.#.#.....#...#...............#...#...#.#.#...#...#...#.#...#...#.#.#...#.#.#...###.......#...#...#...#...#...#.#.#
|
||||||
|
#.#####.#.#.#####.#####.#.#.#.#.#####.#.###############.#.#.#####.#.#######.#.#.#.#.###.#.#.#.#.###.#.#.###########.#.###.#####.#.#.#.#.#.#.#
|
||||||
|
#.#...#.#.#...#...#...#...#.#.#.#...#.#...#...#.....###...#...#...#.#.......#.#.#.#.#...#.#.#.#...#.#.#.###...#...#.#...#...#...#.#.#.#.#.#.#
|
||||||
|
#.#.#.#.#.###.#.###.#.#####.#.#.#.#.#.###.#.#.#.###.#########.#.###.#.#######.#.#.#.#.###.#.#.###.#.#.#.###.#.#.#.#.###.###.#.###.#.#.#.#.#.#
|
||||||
|
#...#...#...#.#.....#...#...#.#.#.#.#...#.#.#.#...#.#.....#...#.....#.......#.#...#...#...#.#...#.#...#...#.#.#.#.#.#...###.#.#...#...#...#.#
|
||||||
|
###########.#.#########.#.###.#.#.#.###.#.#.#.###.#.#.###.#.###############.#.#########.###.###.#.#######.#.#.#.#.#.#.#####.#.#.###########.#
|
||||||
|
###...#...#.#.###.......#...#.#...#.###.#.#.#.....#.#.#...#.....#.........#.#.#.......#.#...#...#...#.....#.#.#.#.#.#.#...#.#.#...#.........#
|
||||||
|
###.#.#.#.#.#.###.#########.#.#####.###.#.#.#######.#.#.#######.#.#######.#.#.#.#####.#.#.###.#####.#.#####.#.#.#.#.#.#.#.#.#.###.#.#########
|
||||||
|
#...#...#...#...#.........#...#.....#...#.#...#.....#.#.#...###.#.#.....#...#...#.....#...#...#...#.#.....#.#.#.#...#...#...#.#...#...#.....#
|
||||||
|
#.#############.#########.#####.#####.###.###.#.#####.#.#.#.###.#.#.###.#########.#########.###.#.#.#####.#.#.#.#############.#.#####.#.###.#
|
||||||
|
#.............#.#...#...#.....#.#...#...#.....#...#...#.#.#.....#.#.#...###.....#.........#...#.#.#.#.....#.#...#...#...#...#...#.....#...#.#
|
||||||
|
#############.#.#.#.#.#.#####.#.#.#.###.#########.#.###.#.#######.#.#.#####.###.#########.###.#.#.#.#.#####.#####.#.#.#.#.#.#####.#######.#.#
|
||||||
|
#.............#.#.#.#.#.#.....#...#.###.........#...#...#.....#...#.#.#...#.#...#.......#.#...#.#...#.#...#.#.....#...#...#.#.....#.....#.#.#
|
||||||
|
#.#############.#.#.#.#.#.#########.###########.#####.#######.#.###.#.#.#.#.#.###.#####.#.#.###.#####.#.#.#.#.#############.#.#####.###.#.#.#
|
||||||
|
#.............#...#.#.#.#.......#...#...#...###.....#...#.....#.#...#.#.#.#.#...#.#...#...#.###.....#...#...#.........#...#...#...#...#...#.#
|
||||||
|
#############.#####.#.#.#######.#.###.#.#.#.#######.###.#.#####.#.###.#.#.#.###.#.#.#.#####.#######.#################.#.#.#####.#.###.#####.#
|
||||||
|
#.........###.....#.#.#...#.....#.#...#...#.....###...#.#.....#.#...#.#.#...#S..#...#.....#.#...###.....#.............#.#.......#...#...#...#
|
||||||
|
#.#######.#######.#.#.###.#.#####.#.###########.#####.#.#####.#.###.#.#.#################.#.#.#.#######.#.#############.###########.###.#.###
|
||||||
|
#.#.....#...#.....#.#...#.#.....#.#.......#.....#...#.#...###.#.###.#.#.#######...#.......#.#.#.....#...#.....#...#...#.#...........#...#...#
|
||||||
|
#.#.###.###.#.#####.###.#.#####.#.#######.#.#####.#.#.###.###.#.###.#.#.#######.#.#.#######.#.#####.#.#######.#.#.#.#.#.#.###########.#####.#
|
||||||
|
#.#.###.#...#.....#.###.#.#.....#.#...#...#.#...#.#.#.#...#...#.#...#...###...#.#.#...#...#.#.#.....#...#.....#.#.#.#.#.#.....#.....#...#...#
|
||||||
|
#.#.###.#.#######.#.###.#.#.#####.#.#.#.###.#.#.#.#.#.#.###.###.#.#########.#.#.#.###.#.#.#.#.#.#######.#.#####.#.#.#.#.#####.#.###.###.#.###
|
||||||
|
#...#...#...#.....#.#...#.#.....#.#.#.#.#...#.#.#.#.#.#.###...#.#.#########.#.#.#.###...#.#.#.#.#...###.#.......#...#...#...#.#.#...#...#...#
|
||||||
|
#####.#####.#.#####.#.###.#####.#.#.#.#.#.###.#.#.#.#.#.#####.#.#.#########.#.#.#.#######.#.#.#.#.#.###.#################.#.#.#.#.###.#####.#
|
||||||
|
#...#.....#.#.....#.#...#.#.....#...#...#...#.#.#.#...#.#...#.#...#####.....#.#.#.#.....#.#.#.#...#...#.#.....#.....#.....#...#.#.....#.....#
|
||||||
|
#.#.#####.#.#####.#.###.#.#.###############.#.#.#.#####.#.#.#.#########.#####.#.#.#.###.#.#.#.#######.#.#.###.#.###.#.#########.#######.#####
|
||||||
|
#.#.#...#.#.#.....#.....#...#...........#...#.#.#...###.#.#.#.......###...###...#.#...#.#.#...#.......#.#...#.#.#...#.......###.#.......#...#
|
||||||
|
#.#.#.#.#.#.#.###############.#########.#.###.#.###.###.#.#.#######.#####.#######.###.#.#.#####.#######.###.#.#.#.#########.###.#.#######.#.#
|
||||||
|
#.#...#...#...#...#.....#.....#...#.....#.#...#.#...#...#.#.#.......#####.....###...#.#.#.....#.........#...#...#...........#...#.........#.#
|
||||||
|
#.#############.#.#.###.#.#####.#.#.#####.#.###.#.###.###.#.#.###############.#####.#.#.#####.###########.###################.#############.#
|
||||||
|
#...#.......#...#...###.#.#.....#...#...#.#.###.#.#...#...#.#.......#####.....#...#.#.#.#...#.....#.......#...#...###...#...#.#.....#.......#
|
||||||
|
###.#.#####.#.#########.#.#.#########.#.#.#.###.#.#.###.###.#######.#####.#####.#.#.#.#.#.#.#####.#.#######.#.#.#.###.#.#.#.#.#.###.#.#######
|
||||||
|
###...#.....#.###.......#.#.....#...#.#.#...#...#.#...#...#.#.....#.#####...#...#...#.#.#.#.#.....#...#...#.#.#.#.#...#...#...#...#.#.......#
|
||||||
|
#######.#####.###.#######.#####.#.#.#.#.#####.###.###.###.#.#.###.#.#######.#.#######.#.#.#.#.#######.#.#.#.#.#.#.#.#############.#.#######.#
|
||||||
|
###.....#...#.#...#.......#...#.#.#...#.....#.#...###...#.#.#.#...#...###...#.....#...#.#.#...###...#...#.#.#...#.#.#.............#.........#
|
||||||
|
###.#####.#.#.#.###.#######.#.#.#.#########.#.#.#######.#.#.#.#.#####.###.#######.#.###.#.#######.#.#####.#.#####.#.#.#######################
|
||||||
|
#...#.....#...#.....#...#...#...#.#.........#.#.###.....#.#.#.#...#...###.###.....#.#...#...#.....#.......#.#.....#.#.#.........#...........#
|
||||||
|
#.###.###############.#.#.#######.#.#########.#.###.#####.#.#.###.#.#####.###.#####.#.#####.#.#############.#.#####.#.#.#######.#.#########.#
|
||||||
|
#.#...###...#.........#.#.....#...#.....#...#.#...#.....#.#.#.###.#...#E#...#.....#.#.....#.#...............#.......#...#.......#.#.........#
|
||||||
|
#.#.#####.#.#.#########.#####.#.#######.#.#.#.###.#####.#.#.#.###.###.#.###.#####.#.#####.#.#############################.#######.#.#########
|
||||||
|
#...#.....#...#.......#.......#.#.......#.#.#.....#.....#.#.#.#...#...#.#...###...#.#.....#.#.................#...#.....#.........#.........#
|
||||||
|
#####.#########.#####.#########.#.#######.#.#######.#####.#.#.#.###.###.#.#####.###.#.#####.#.###############.#.#.#.###.###################.#
|
||||||
|
#...#...........#...#...#...#...#.........#.....###.....#.#.#.#...#...#...###...#...#.....#.#.#...#.........#.#.#.#...#...#.....#...........#
|
||||||
|
#.#.#############.#.###.#.#.#.#################.#######.#.#.#.###.###.#######.###.#######.#.#.#.#.#.#######.#.#.#.###.###.#.###.#.###########
|
||||||
|
#.#.....#.........#...#...#...#.........#.....#...#...#.#.#.#...#...#...###...#...#.......#.#.#.#...#...#...#...#.#...###...#...#...........#
|
||||||
|
#.#####.#.###########.#########.#######.#.###.###.#.#.#.#.#.###.###.###.###.###.###.#######.#.#.#####.#.#.#######.#.#########.#############.#
|
||||||
|
#.....#.#.........#...#...#...#.......#.#.###...#...#.#.#.#.#...###.#...#...#...#...#.....#.#.#.#.....#...#...###...#...#.....#...#...#.....#
|
||||||
|
#####.#.#########.#.###.#.#.#.#######.#.#.#####.#####.#.#.#.#.#####.#.###.###.###.###.###.#.#.#.#.#########.#.#######.#.#.#####.#.#.#.#.#####
|
||||||
|
#.....#...#...#...#.....#...#.###.....#...#...#...#...#.#.#.#.....#...###...#...#.#...###...#...#...........#.......#.#.#.#...#.#...#.#.....#
|
||||||
|
#.#######.#.#.#.#############.###.#########.#.###.#.###.#.#.#####.#########.###.#.#.###############################.#.#.#.#.#.#.#####.#####.#
|
||||||
|
#...#...#...#...#...#...#...#...#...#...#...#...#...###...#.#.....#...#...#.....#.#.#...###...#.....#...#.........#...#.#...#.#...###.#...#.#
|
||||||
|
###.#.#.#########.#.#.#.#.#.###.###.#.#.#.#####.###########.#.#####.#.#.#.#######.#.#.#.###.#.#.###.#.#.#.#######.#####.#####.###.###.#.#.#.#
|
||||||
|
###...#.......#...#...#.#.#...#...#...#.#.#.....#...#...###.#.....#.#...#.#.....#...#.#.#...#.#...#...#...###...#.......###...#...#...#.#...#
|
||||||
|
#############.#.#######.#.###.###.#####.#.#.#####.#.#.#.###.#####.#.#####.#.###.#####.#.#.###.###.###########.#.###########.###.###.###.#####
|
||||||
|
#...#...#.....#.###...#...###...#.....#...#.......#...#...#.#...#.#.#.....#.#...#...#.#.#...#...#.............#...#.......#.....#...#...#...#
|
||||||
|
#.#.#.#.#.#####.###.#.#########.#####.###################.#.#.#.#.#.#.#####.#.###.#.#.#.###.###.#################.#.#####.#######.###.###.#.#
|
||||||
|
#.#...#...#...#...#.#...#.....#.....#...#...#.....#.......#...#...#.#...#...#.#...#...#.....#...#...........#...#...#.....###...#.....###.#.#
|
||||||
|
#.#########.#.###.#.###.#.###.#####.###.#.#.#.###.#.###############.###.#.###.#.#############.###.#########.#.#.#####.#######.#.#########.#.#
|
||||||
|
#.....#...#.#...#.#...#.#...#.#...#...#.#.#.#...#...#.........###...#...#...#...#...........#.###.#.......#...#.......#...#...#.....#...#.#.#
|
||||||
|
#####.#.#.#.###.#.###.#.###.#.#.#.###.#.#.#.###.#####.#######.###.###.#####.#####.#########.#.###.#.#####.#############.#.#.#######.#.#.#.#.#
|
||||||
|
#.....#.#...###...###.#.....#...#.....#.#.#...#.###...#.....#.....#...#.....#.....#.......#.#...#.#.#.....#...#...###...#...#.......#.#...#.#
|
||||||
|
#.#####.#############.#################.#.###.#.###.###.###.#######.###.#####.#####.#####.#.###.#.#.#.#####.#.#.#.###.#######.#######.#####.#
|
||||||
|
#.....#.#...........#.......#...#...###...###.#.....#...#...#...#...###.......#...#...#...#...#.#...#.......#...#.....#.......###.....#.....#
|
||||||
|
#####.#.#.#########.#######.#.#.#.#.#########.#######.###.###.#.#.#############.#.###.#.#####.#.#######################.#########.#####.#####
|
||||||
|
#.....#.#.........#.........#.#.#.#.........#.....#...###.....#...#.........#...#.....#.......#.#...#...................#...#...#.....#.....#
|
||||||
|
#.#####.#########.###########.#.#.#########.#####.#.###############.#######.#.#################.#.#.#.###################.#.#.#.#####.#####.#
|
||||||
|
#.......#.........#.........#.#...#...#...#.....#.#.#.............#.......#.#.......#.....#...#...#...#...#...#...#...###.#.#.#.#...#.#.....#
|
||||||
|
#########.#########.#######.#.#####.#.#.#.#####.#.#.#.###########.#######.#.#######.#.###.#.#.#########.#.#.#.#.#.#.#.###.#.#.#.#.#.#.#.#####
|
||||||
|
###.......#...#...#.#.......#.#.....#...#.#...#.#...#.#.......#...#...#...#.........#.#...#.#.....#.....#...#...#...#.....#...#...#...#.....#
|
||||||
|
###.#######.#.#.#.#.#.#######.#.#########.#.#.#.#####.#.#####.#.###.#.#.#############.#.###.#####.#.#######################################.#
|
||||||
|
#...#.......#...#...#.........#.........#...#...#.....#.....#.#.#...#.#.........#...#.#...#...#...#.#.......#.....#.......#...#...#...#...#.#
|
||||||
|
#.###.#################################.#########.#########.#.#.#.###.#########.#.#.#.###.###.#.###.#.#####.#.###.#.#####.#.#.#.#.#.#.#.#.#.#
|
||||||
|
#.....#...#...#...#...#...#...#...#.....#.......#...#.......#...#.#...#.....###...#...###...#.#...#.#.#...#...###...#...#...#.#.#.#.#.#.#...#
|
||||||
|
#######.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#####.#####.###.#.###########.#.###.###.###############.#.###.#.#.#.#.###########.#.#####.#.#.#.#.#.#####
|
||||||
|
#.......#...#.#.#.#.#...#.#.#...#...#...#.#.....#...#.###.....#...#...#...#.#...#...#...###.#...#.#.#...#.#...........#.....#...#.#.#...#...#
|
||||||
|
#.###########.#.#.#.#####.#.#########.#.#.#.#####.###.###.###.#.#####.###.#.#.#.#.#.#.#.###.###.#.#.#####.#.###############.#####.#.#####.#.#
|
||||||
|
#...........#.#.#.#.....#.#.........#.#...#...#...#...#...#...#.....#.#...#.#.#...#.#.#.#...#...#...#.....#.#.......#.....#.....#...#...#.#.#
|
||||||
|
###########.#.#.#.#####.#.#########.#.#######.#.###.###.###.#######.#.#.###.#.#####.#.#.#.###.#######.#####.#.#####.#.###.#####.#####.#.#.#.#
|
||||||
|
#.....#...#.#.#.#.#...#.#.....#...#...#.......#...#.###.#...#.......#.#...#.#.....#...#.#...#.#.....#.......#.....#...###.......#.....#...#.#
|
||||||
|
#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#####.#########.#.###.#.###.#######.###.#.#####.#####.###.#.#.###.#############.###############.#########.#
|
||||||
|
#...#.#.#...#...#...#...#...#...#.....#...#...#...#...#.#.###.......#.#...#.###...#.....###...#...#.............#...#...#.....#...#.........#
|
||||||
|
###.#.#.#################.#.#########.###.#.#.#.#####.#.#.#########.#.#.###.###.###.#############.#############.###.#.#.#.###.#.###.#########
|
||||||
|
#...#.#.........#.....#...#.#.......#...#...#.#.#.....#.#.#...#.....#.#...#.....#...#.....###...#.....#.......#...#...#...#...#.#...#.......#
|
||||||
|
#.###.#########.#.###.#.###.#.#####.###.#####.#.#.#####.#.#.#.#.#####.###.#######.###.###.###.#.#####.#.#####.###.#########.###.#.###.#####.#
|
||||||
|
#...#.#.........#.#...#...#...#...#...#.......#.#.###...#.#.#.#.....#.###.......#...#...#...#.#.......#.#.....###...........#...#.....#...#.#
|
||||||
|
###.#.#.#########.#.#####.#####.#.###.#########.#.###.###.#.#.#####.#.#########.###.###.###.#.#########.#.###################.#########.#.#.#
|
||||||
|
#...#...#...#...#.#...#...###...#.....###...###.#...#...#.#.#.###...#.#...#...#...#...#.#...#.........#.#.#...###...###.......#.....#...#...#
|
||||||
|
#.#######.#.#.#.#.###.#.#####.###########.#.###.###.###.#.#.#.###.###.#.#.#.#.###.###.#.#.###########.#.#.#.#.###.#.###.#######.###.#.#######
|
||||||
|
#.......#.#.#.#.#.#...#.#...#...........#.#...#...#...#.#.#.#...#...#...#...#.###...#...#.#.....#...#...#...#...#.#.#...#.......###.#.......#
|
||||||
|
#######.#.#.#.#.#.#.###.#.#.###########.#.###.###.###.#.#.#.###.###.#########.#####.#####.#.###.#.#.###########.#.#.#.###.#########.#######.#
|
||||||
|
#.......#.#...#.#.#.....#.#.###.......#.#...#.#...#...#.#.#...#...#.#.........#.....#.....#...#.#.#...#.........#.#.#.#...#...#...#.#...#...#
|
||||||
|
#.#######.#####.#.#######.#.###.#####.#.###.#.#.###.###.#.###.###.#.#.#########.#####.#######.#.#.###.#.#########.#.#.#.###.#.#.#.#.#.#.#.###
|
||||||
|
#...#...#.....#...###.....#.....#...#...###.#.#...#.###.#.###...#.#.#.#...#...#.....#.#...###.#.#...#.#.....###...#...#.....#...#.#.#.#.#...#
|
||||||
|
###.#.#.#####.#######.###########.#.#######.#.###.#.###.#.#####.#.#.#.#.#.#.#.#####.#.#.#.###.#.###.#.#####.###.#################.#.#.#.###.#
|
||||||
|
#...#.#...#...#.......#...........#.#...#...#.#...#.#...#.#...#.#...#...#.#.#.#...#.#.#.#...#.#.#...#.#...#...#.#.................#...#.#...#
|
||||||
|
#.###.###.#.###.#######.###########.#.#.#.###.#.###.#.###.#.#.#.#########.#.#.#.#.#.#.#.###.#.#.#.###.#.#.###.#.#.#####################.#.###
|
||||||
|
#...#...#...###.....#...#...........#.#.#...#.#.###.#...#...#.#.......#...#.#.#.#.#.#...###...#.#.###.#.#...#...#.###.................#.#...#
|
||||||
|
###.###.###########.#.###.###########.#.###.#.#.###.###.#####.#######.#.###.#.#.#.#.###########.#.###.#.###.#####.###.###############.#.###.#
|
||||||
|
###...#.#...........#.#...#...#.....#.#...#.#.#.#...#...###...#...#...#...#.#...#.#.....#.......#...#.#.#...#...#.....#...#...........#...#.#
|
||||||
|
#####.#.#.###########.#.###.#.#.###.#.###.#.#.#.#.###.#####.###.#.#.#####.#.#####.#####.#.#########.#.#.#.###.#.#######.#.#.#############.#.#
|
||||||
|
#.....#.#.....#.......#.....#.#.#...#.###.#.#.#.#...#.....#.#...#.#.....#.#...#...#.....#...#...#...#...#...#.#.....#...#.#...###...#...#...#
|
||||||
|
#.#####.#####.#.#############.#.#.###.###.#.#.#.###.#####.#.#.###.#####.#.###.#.###.#######.#.#.#.#########.#.#####.#.###.###.###.#.#.#.#####
|
||||||
|
#...#...#.....#...#...........#.#.#...#...#.#...#...#...#.#.#.###.....#.#.#...#...#.......#.#.#.#...#.......#.....#...###...#.....#...#.....#
|
||||||
|
###.#.###.#######.#.###########.#.#.###.###.#####.###.#.#.#.#.#######.#.#.#.#####.#######.#.#.#.###.#.###########.#########.###############.#
|
||||||
|
#...#...#.#.......#.........#...#.#...#...#...#...#...#.#.#.#.#.......#.#...#.....#.......#...#.....#.....#.....#.....#.....#...#...........#
|
||||||
|
#.#####.#.#.###############.#.###.###.###.###.#.###.###.#.#.#.#.#######.#####.#####.#####################.#.###.#####.#.#####.#.#.###########
|
||||||
|
#...#...#.#.#...............#.#...#...#...#...#...#...#...#.#.#...#...#...###.#...#.....#.......#.........#.#...#...#.#.....#.#.#.........###
|
||||||
|
###.#.###.#.#.###############.#.###.###.###.#####.###.#####.#.###.#.#.###.###.#.#.#####.#.#####.#.#########.#.###.#.#.#####.#.#.#########.###
|
||||||
|
#...#.#...#.#.....#.........#.#...#...#...#...###...#.#...#...#...#.#...#...#.#.#.#.....#.#.....#.........#.#...#.#...#...#...#.#...#...#...#
|
||||||
|
#.###.#.###.#####.#.#######.#.###.###.###.###.#####.#.#.#.#####.###.###.###.#.#.#.#.#####.#.#############.#.###.#.#####.#.#####.#.#.#.#.###.#
|
||||||
|
#...#.#.#...#.....#.###.....#.#...#...###...#.....#.#...#.....#.#...#...#...#.#.#.#.......#.....#.........#...#.#.......#...#...#.#.#.#...#.#
|
||||||
|
###.#.#.#.###.#####.###.#####.#.###.#######.#####.#.#########.#.#.###.###.###.#.#.#############.#.###########.#.###########.#.###.#.#.###.#.#
|
||||||
|
###.#.#.#...#.....#.#...#...#.#...#.#.......#...#.#...#.....#.#...###...#.###...#...#.....#.....#.#...#.....#.#.#.....#.....#.....#.#...#.#.#
|
||||||
|
###.#.#.###.#####.#.#.###.#.#.###.#.#.#######.#.#.###.#.###.#.#########.#.#########.#.###.#.#####.#.#.#.###.#.#.#.###.#.###########.###.#.#.#
|
||||||
|
#...#.#.....#...#.#.#.....#...###...#.#...#...#...###.#...#.#.#.........#...#.......#.###.#.....#...#.#.###...#.#...#.#...........#...#.#.#.#
|
||||||
|
#.###.#######.#.#.#.#################.#.#.#.#########.###.#.#.#.###########.#.#######.###.#####.#####.#.#######.###.#.###########.###.#.#.#.#
|
||||||
|
#...#.#.......#...#.#.................#.#.#.#.....#...#...#...#...#.....#...#...#.....#...#...#.###...#...#.....#...#.#...........###.#.#.#.#
|
||||||
|
###.#.#.###########.#.#################.#.#.#.###.#.###.#########.#.###.#.#####.#.#####.###.#.#.###.#####.#.#####.###.#.#############.#.#.#.#
|
||||||
|
###.#.#...#...#...#.#.........#...#...#.#...#...#.#...#.....#...#...#...#.....#.#.###...#...#.#...#.....#.#.#...#.###...#...###.....#...#...#
|
||||||
|
###.#.###.#.#.#.#.#.#########.#.#.#.#.#.#######.#.###.#####.#.#.#####.#######.#.#.###.###.###.###.#####.#.#.#.#.#.#######.#.###.###.#########
|
||||||
|
#...#.###...#...#...#.........#.#.#.#.#.....#...#.....#...#...#.....#...#...#.#.#.#...#...###...#.#.....#.#...#.#.........#.....#...#...#...#
|
||||||
|
#.###.###############.#########.#.#.#.#####.#.#########.#.#########.###.#.#.#.#.#.#.###.#######.#.#.#####.#####.#################.###.#.#.#.#
|
||||||
|
#.....#...#...........#.......#.#.#.#...#...#...#...#...#.#.........#...#.#.#.#...#...#.###...#...#.#.....#.....#...#...........#.....#...#.#
|
||||||
|
#######.#.#.###########.#####.#.#.#.###.#.#####.#.#.#.###.#.#########.###.#.#.#######.#.###.#.#####.#.#####.#####.#.#.#########.###########.#
|
||||||
|
#.....#.#.#...#...#...#.###...#.#.#.#...#.#.....#.#.#...#.#.....#...#.....#.#.#.......#.....#.#.....#.....#...#...#.#.........#...#.........#
|
||||||
|
#.###.#.#.###.#.#.#.#.#.###.###.#.#.#.###.#.#####.#.###.#.#####.#.#.#######.#.#.#############.#.#########.###.#.###.#########.###.#.#########
|
||||||
|
#...#...#.....#.#.#.#.#.#...#...#.#.#...#.#.#...#.#.#...#.#...#...#.......#.#.#...#...#...#...#...#...#...#...#.#...#...#...#...#.#.........#
|
||||||
|
###.###########.#.#.#.#.#.###.###.#.###.#.#.#.#.#.#.#.###.#.#.###########.#.#.###.#.#.#.#.#.#####.#.#.#.###.###.#.###.#.#.#.###.#.#########.#
|
||||||
|
###.............#...#...#.....###...###...#...#...#...###...#.............#...###...#...#...#####...#...###.....#.....#...#.....#...........#
|
||||||
|
#############################################################################################################################################
|
||||||
5
Inputs/Day21.txt
Normal file
5
Inputs/Day21.txt
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
029A
|
||||||
|
980A
|
||||||
|
179A
|
||||||
|
456A
|
||||||
|
379A
|
||||||
2244
Inputs/Day22.txt
Normal file
2244
Inputs/Day22.txt
Normal file
File diff suppressed because it is too large
Load Diff
3380
Inputs/Day23.txt
Normal file
3380
Inputs/Day23.txt
Normal file
File diff suppressed because it is too large
Load Diff
313
Inputs/Day24.txt
Normal file
313
Inputs/Day24.txt
Normal file
@@ -0,0 +1,313 @@
|
|||||||
|
x00: 1
|
||||||
|
x01: 0
|
||||||
|
x02: 1
|
||||||
|
x03: 1
|
||||||
|
x04: 0
|
||||||
|
x05: 0
|
||||||
|
x06: 1
|
||||||
|
x07: 1
|
||||||
|
x08: 0
|
||||||
|
x09: 1
|
||||||
|
x10: 1
|
||||||
|
x11: 1
|
||||||
|
x12: 1
|
||||||
|
x13: 1
|
||||||
|
x14: 0
|
||||||
|
x15: 1
|
||||||
|
x16: 0
|
||||||
|
x17: 1
|
||||||
|
x18: 0
|
||||||
|
x19: 1
|
||||||
|
x20: 1
|
||||||
|
x21: 0
|
||||||
|
x22: 0
|
||||||
|
x23: 0
|
||||||
|
x24: 1
|
||||||
|
x25: 1
|
||||||
|
x26: 1
|
||||||
|
x27: 0
|
||||||
|
x28: 1
|
||||||
|
x29: 1
|
||||||
|
x30: 1
|
||||||
|
x31: 0
|
||||||
|
x32: 0
|
||||||
|
x33: 1
|
||||||
|
x34: 1
|
||||||
|
x35: 0
|
||||||
|
x36: 0
|
||||||
|
x37: 0
|
||||||
|
x38: 1
|
||||||
|
x39: 0
|
||||||
|
x40: 0
|
||||||
|
x41: 0
|
||||||
|
x42: 0
|
||||||
|
x43: 1
|
||||||
|
x44: 1
|
||||||
|
y00: 1
|
||||||
|
y01: 0
|
||||||
|
y02: 0
|
||||||
|
y03: 1
|
||||||
|
y04: 1
|
||||||
|
y05: 0
|
||||||
|
y06: 0
|
||||||
|
y07: 0
|
||||||
|
y08: 0
|
||||||
|
y09: 0
|
||||||
|
y10: 0
|
||||||
|
y11: 1
|
||||||
|
y12: 0
|
||||||
|
y13: 0
|
||||||
|
y14: 0
|
||||||
|
y15: 0
|
||||||
|
y16: 1
|
||||||
|
y17: 0
|
||||||
|
y18: 0
|
||||||
|
y19: 1
|
||||||
|
y20: 0
|
||||||
|
y21: 1
|
||||||
|
y22: 0
|
||||||
|
y23: 1
|
||||||
|
y24: 0
|
||||||
|
y25: 0
|
||||||
|
y26: 1
|
||||||
|
y27: 0
|
||||||
|
y28: 0
|
||||||
|
y29: 1
|
||||||
|
y30: 0
|
||||||
|
y31: 0
|
||||||
|
y32: 0
|
||||||
|
y33: 1
|
||||||
|
y34: 0
|
||||||
|
y35: 0
|
||||||
|
y36: 0
|
||||||
|
y37: 1
|
||||||
|
y38: 0
|
||||||
|
y39: 0
|
||||||
|
y40: 1
|
||||||
|
y41: 0
|
||||||
|
y42: 1
|
||||||
|
y43: 1
|
||||||
|
y44: 1
|
||||||
|
|
||||||
|
x44 XOR y44 -> drc
|
||||||
|
phq OR frm -> hjs
|
||||||
|
vdh AND nwn -> gqd
|
||||||
|
y40 XOR x40 -> vkn
|
||||||
|
x21 XOR y21 -> cnb
|
||||||
|
cnb AND wmb -> vvk
|
||||||
|
dfb XOR bfn -> hbk
|
||||||
|
bhd XOR mmh -> z06
|
||||||
|
fkc XOR bwj -> z22
|
||||||
|
gnj AND jfw -> spq
|
||||||
|
dwh AND kqn -> fhp
|
||||||
|
x19 AND y19 -> kkg
|
||||||
|
drc XOR qqt -> z44
|
||||||
|
fkc AND bwj -> jbb
|
||||||
|
y32 XOR x32 -> qwt
|
||||||
|
y37 AND x37 -> kgg
|
||||||
|
x07 AND y07 -> dqn
|
||||||
|
dsp AND bvp -> hff
|
||||||
|
pmv OR pkn -> wmt
|
||||||
|
cjf OR pfk -> z45
|
||||||
|
hgq XOR phb -> z27
|
||||||
|
qnq OR dpc -> djp
|
||||||
|
x32 AND y32 -> nbb
|
||||||
|
qwt AND jqm -> fdk
|
||||||
|
x18 XOR y18 -> grp
|
||||||
|
vkf OR hdm -> kqn
|
||||||
|
cqv AND jss -> bwd
|
||||||
|
x00 AND y00 -> jfw
|
||||||
|
cjb XOR srm -> z19
|
||||||
|
jss XOR cqv -> z35
|
||||||
|
ntt OR spq -> ndd
|
||||||
|
cqm XOR qqj -> z43
|
||||||
|
x01 AND y01 -> ntt
|
||||||
|
y14 XOR x14 -> dfb
|
||||||
|
nbk XOR wrk -> z05
|
||||||
|
dvw AND rpg -> z23
|
||||||
|
vvc OR kcv -> qqj
|
||||||
|
bqc XOR fwr -> z26
|
||||||
|
dwh XOR kqn -> z41
|
||||||
|
x15 XOR y15 -> bkb
|
||||||
|
rjm XOR gjr -> z24
|
||||||
|
x22 XOR y22 -> bwj
|
||||||
|
y22 AND x22 -> hpj
|
||||||
|
x08 XOR y08 -> hnf
|
||||||
|
y27 AND x27 -> frm
|
||||||
|
wrw OR swr -> fds
|
||||||
|
gtm AND rmt -> mkv
|
||||||
|
kdh AND qvq -> ghr
|
||||||
|
fgv AND mfm -> kcv
|
||||||
|
hnf AND gqs -> pmv
|
||||||
|
kkg OR qvs -> vdh
|
||||||
|
fdk OR nbb -> rmt
|
||||||
|
y29 AND x29 -> cwd
|
||||||
|
hjk OR bts -> vkg
|
||||||
|
vtk AND npm -> tqb
|
||||||
|
dvw XOR rpg -> dbb
|
||||||
|
y39 XOR x39 -> mnm
|
||||||
|
y05 XOR x05 -> wrk
|
||||||
|
djd AND fds -> dqt
|
||||||
|
tvh OR sqm -> npm
|
||||||
|
cdr XOR cmt -> z10
|
||||||
|
x28 XOR y28 -> hgd
|
||||||
|
x33 XOR y33 -> gtm
|
||||||
|
mnm XOR vhv -> z39
|
||||||
|
fbv XOR bwg -> z38
|
||||||
|
hqs AND nhr -> vbt
|
||||||
|
kth OR qcp -> hgq
|
||||||
|
wjj OR scs -> bfn
|
||||||
|
bkv OR vvk -> fkc
|
||||||
|
cmt AND cdr -> pph
|
||||||
|
dqt OR gqb -> bqc
|
||||||
|
y35 XOR x35 -> jss
|
||||||
|
vkb OR krd -> cdr
|
||||||
|
mqf AND cvh -> trj
|
||||||
|
x36 XOR y36 -> dsp
|
||||||
|
y41 XOR x41 -> dwh
|
||||||
|
y38 XOR x38 -> bwg
|
||||||
|
ghr OR tpc -> jqm
|
||||||
|
ckn XOR hqq -> z07
|
||||||
|
vkn AND vkg -> vkf
|
||||||
|
y28 AND x28 -> wkc
|
||||||
|
x31 XOR y31 -> qvq
|
||||||
|
rjm AND gjr -> swr
|
||||||
|
gcb OR dbb -> rjm
|
||||||
|
y18 AND x18 -> z18
|
||||||
|
y24 AND x24 -> wrw
|
||||||
|
x17 XOR y17 -> kbh
|
||||||
|
y24 XOR x24 -> gjr
|
||||||
|
x26 XOR y26 -> fwr
|
||||||
|
y43 AND x43 -> bvm
|
||||||
|
y15 AND x15 -> sbt
|
||||||
|
y12 XOR x12 -> fvh
|
||||||
|
kvn OR ffb -> cjb
|
||||||
|
y31 AND x31 -> tpc
|
||||||
|
y37 XOR x37 -> bnh
|
||||||
|
y11 AND x11 -> scv
|
||||||
|
hgd AND hjs -> phr
|
||||||
|
jfw XOR gnj -> z01
|
||||||
|
fvh XOR sfk -> z12
|
||||||
|
fds XOR djd -> z25
|
||||||
|
qwt XOR jqm -> z32
|
||||||
|
bvp XOR dsp -> z36
|
||||||
|
phr OR wkc -> jdq
|
||||||
|
y07 XOR x07 -> hqq
|
||||||
|
y43 XOR x43 -> cqm
|
||||||
|
bnh XOR kss -> z37
|
||||||
|
trg OR vbt -> kdh
|
||||||
|
cwd OR pkc -> nhr
|
||||||
|
y19 XOR x19 -> srm
|
||||||
|
dkd AND jdq -> pkc
|
||||||
|
wrk AND nbk -> fnk
|
||||||
|
hjs XOR hgd -> z28
|
||||||
|
rnt AND qbs -> rcp
|
||||||
|
djp XOR mft -> z03
|
||||||
|
cht OR mkv -> mqf
|
||||||
|
hbk XOR bkb -> z15
|
||||||
|
x44 AND y44 -> pfk
|
||||||
|
x26 AND y26 -> qcp
|
||||||
|
ndd XOR jgw -> z02
|
||||||
|
x06 AND y06 -> dhs
|
||||||
|
ckn AND hqq -> cpt
|
||||||
|
y13 AND x13 -> wjj
|
||||||
|
x10 AND y10 -> tvr
|
||||||
|
ffr OR gqd -> wmb
|
||||||
|
y09 XOR x09 -> tjb
|
||||||
|
nhr XOR hqs -> z30
|
||||||
|
hgq AND phb -> phq
|
||||||
|
x00 XOR y00 -> z00
|
||||||
|
y16 AND x16 -> prt
|
||||||
|
dqn OR cpt -> gqs
|
||||||
|
x23 AND y23 -> gcb
|
||||||
|
mft AND djp -> tvh
|
||||||
|
bkb AND hbk -> qtw
|
||||||
|
kfk AND chk -> vgb
|
||||||
|
vhv AND mnm -> hjk
|
||||||
|
y42 XOR x42 -> mfm
|
||||||
|
x25 XOR y25 -> djd
|
||||||
|
fgv XOR mfm -> z42
|
||||||
|
grp XOR fgr -> kvn
|
||||||
|
x16 XOR y16 -> chk
|
||||||
|
x09 AND y09 -> krd
|
||||||
|
cqb OR rmg -> mqm
|
||||||
|
y30 XOR x30 -> hqs
|
||||||
|
kss AND bnh -> dvf
|
||||||
|
y11 XOR x11 -> rnt
|
||||||
|
x04 AND y04 -> ptm
|
||||||
|
y13 XOR x13 -> cbr
|
||||||
|
rnt XOR qbs -> z11
|
||||||
|
hff OR fjf -> kss
|
||||||
|
x25 AND y25 -> gqb
|
||||||
|
kdh XOR qvq -> z31
|
||||||
|
y06 XOR x06 -> mmh
|
||||||
|
cnb XOR wmb -> z21
|
||||||
|
y02 XOR x02 -> jgw
|
||||||
|
x17 AND y17 -> hkn
|
||||||
|
y34 AND x34 -> cvh
|
||||||
|
x27 XOR y27 -> phb
|
||||||
|
x42 AND y42 -> vvc
|
||||||
|
x03 XOR y03 -> mft
|
||||||
|
y35 AND x35 -> nvg
|
||||||
|
x10 XOR y10 -> cmt
|
||||||
|
y20 AND x20 -> ffr
|
||||||
|
x30 AND y30 -> trg
|
||||||
|
ptm OR tqb -> nbk
|
||||||
|
bfn AND dfb -> sjr
|
||||||
|
jgw AND ndd -> qnq
|
||||||
|
y39 AND x39 -> bts
|
||||||
|
y38 AND x38 -> knq
|
||||||
|
npm XOR vtk -> z04
|
||||||
|
prt OR vgb -> jqc
|
||||||
|
kfk XOR chk -> z16
|
||||||
|
rvd OR dhs -> ckn
|
||||||
|
fnk OR wkv -> bhd
|
||||||
|
y03 AND x03 -> sqm
|
||||||
|
x08 AND y08 -> pkn
|
||||||
|
y02 AND x02 -> dpc
|
||||||
|
bwg AND fbv -> pdw
|
||||||
|
mqf XOR cvh -> z34
|
||||||
|
tjb AND wmt -> vkb
|
||||||
|
jdq XOR dkd -> z29
|
||||||
|
x34 XOR y34 -> tfn
|
||||||
|
y21 AND x21 -> bkv
|
||||||
|
tfn OR trj -> cqv
|
||||||
|
fgr AND grp -> ffb
|
||||||
|
bwd OR nvg -> bvp
|
||||||
|
cjv OR hkn -> fgr
|
||||||
|
fhp OR rnc -> fgv
|
||||||
|
sjr OR tck -> z14
|
||||||
|
vkn XOR vkg -> z40
|
||||||
|
kbh XOR jqc -> z17
|
||||||
|
kgg OR dvf -> fbv
|
||||||
|
tjb XOR wmt -> z09
|
||||||
|
tvr OR pph -> qbs
|
||||||
|
qqj AND cqm -> gsg
|
||||||
|
pdw OR knq -> vhv
|
||||||
|
gqs XOR hnf -> z08
|
||||||
|
y20 XOR x20 -> nwn
|
||||||
|
kbh AND jqc -> cjv
|
||||||
|
bqc AND fwr -> kth
|
||||||
|
rcp OR scv -> sfk
|
||||||
|
sbt OR qtw -> kfk
|
||||||
|
bhd AND mmh -> rvd
|
||||||
|
nwn XOR vdh -> z20
|
||||||
|
y29 XOR x29 -> dkd
|
||||||
|
y23 XOR x23 -> rpg
|
||||||
|
jbb OR hpj -> dvw
|
||||||
|
cbr XOR mqm -> z13
|
||||||
|
y33 AND x33 -> cht
|
||||||
|
y12 AND x12 -> rmg
|
||||||
|
mqm AND cbr -> scs
|
||||||
|
sfk AND fvh -> cqb
|
||||||
|
y14 AND x14 -> tck
|
||||||
|
x04 XOR y04 -> vtk
|
||||||
|
y05 AND x05 -> wkv
|
||||||
|
rmt XOR gtm -> z33
|
||||||
|
y01 XOR x01 -> gnj
|
||||||
|
srm AND cjb -> qvs
|
||||||
|
x36 AND y36 -> fjf
|
||||||
|
drc AND qqt -> cjf
|
||||||
|
y40 AND x40 -> hdm
|
||||||
|
y41 AND x41 -> rnc
|
||||||
|
gsg OR bvm -> qqt
|
||||||
3999
Inputs/Day25.txt
Normal file
3999
Inputs/Day25.txt
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user