Compare commits

16 Commits

Author SHA1 Message Date
add1c06ad0 Add day 15 2025-01-14 15:53:32 +01:00
6fc184c9e7 Add day 14 2025-01-14 11:19:02 +01:00
bed0a4eaa0 Add day 13 2025-01-14 09:47:10 +01:00
9097877642 Add day 12 2025-01-10 10:30:32 +01:00
0b4d595ee8 Add day 11 2025-01-09 14:41:42 +01:00
3ba6a067a8 Add day 10 2025-01-09 11:32:31 +01:00
bfe82ec194 Add day 9 2025-01-08 18:40:01 +01:00
43c0bee892 Add day 8 2025-01-08 11:34:45 +01:00
de104a7dfb Add day 7 2025-01-07 17:12:29 +01:00
4ab18103fb Add day 6 2025-01-07 12:06:50 +01:00
975ad80e67 Add day 5 2025-01-07 10:28:52 +01:00
6603aa5754 Add day 4 2024-12-23 11:20:25 +01:00
1458d120de Add day 3 2024-12-17 19:08:28 +01:00
03ad5ab66a Add day 2 2024-12-17 18:30:56 +01:00
d00ffd625b Add day 1 2024-12-17 17:24:26 +01:00
828f9bc3dc Add day 1 2024-06-03 17:29:56 +02:00
35 changed files with 8201 additions and 12637 deletions

View File

@@ -2,9 +2,10 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
</PropertyGroup>
<ItemGroup>
@@ -12,4 +13,9 @@
<PackageReference Include="Spectre.Console" Version="0.45.0" />
</ItemGroup>
<ItemGroup>
<None Remove="Inputs\*" />
<EmbeddedResource Include="Inputs\*" />
</ItemGroup>
</Project>

View File

@@ -7,7 +7,13 @@ namespace AdventOfCode;
[MemoryDiagnoser(false)]
public class DayBenchmark
{
private Day Day => new Day15();
private Day Day { get; } = new Day10();
[GlobalSetup]
public void Setup()
{
Day.ReadInput();
}
[Benchmark]
public void Part1()

View File

@@ -1,3 +1,5 @@
using System.Reflection;
namespace AdventOfCode.Days;
public abstract class Day
@@ -5,9 +7,19 @@ public abstract class Day
public abstract int Number { get; }
public abstract string Name { get; }
protected string Input { get; private set; } = null!;
public abstract void RunPart1(bool display = true);
public abstract void RunPart2(bool display = true);
public void ReadInput()
{
using var inputStream = Assembly.GetExecutingAssembly()
.GetManifestResourceStream($"AdventOfCode.Inputs.Day{Number}.txt")!;
Input = new StreamReader(inputStream).ReadToEnd();
}
public override string ToString()
{
return $"Day {Number}: {Name}";

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,5 @@
using System.Collections.Frozen;
using System.Numerics;
using Spectre.Console;
namespace AdventOfCode.Days;
@@ -5,283 +7,163 @@ namespace AdventOfCode.Days;
public class Day10 : Day
{
public override int Number => 10;
public override string Name => "Cathode-Ray Tube";
public override string Name => "Hoof It";
private const int MapSize = 60;
public override void RunPart1(bool display = true)
{
int cycle = 1;
int x = 1;
long sum = 0;
var hikingTrailsScores = 0;
// Increment sum when needed
void IncrementCycle()
var (heightMap, trailHeads) = ParseMap();
var hikingTrails = new HashSet<Point>();
foreach (var trailHead in trailHeads)
{
cycle++;
hikingTrails.Clear();
// Check for signal stength at the start of a cycle
if ((cycle + 20) % 40 == 0)
{
sum += x * cycle;
}
}
GetHikingTrailScore(trailHead, -1);
foreach (var line in Input.ReadAllLines())
{
// noop
if (line == "noop")
{
// noop finished, go to next cycle
IncrementCycle();
}
// addx
else
{
var split = line.Split(' ');
var v = int.Parse(split[1]);
// Prepare addx
IncrementCycle();
// addx finished, add to x and then go to next cycle
x += v;
IncrementCycle();
}
hikingTrailsScores += hikingTrails.Count;
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Sum of signal strengths: [yellow]{sum}[/][/]");
AnsiConsole.MarkupLine($"[green]Sum of scores of hiking trails: [yellow]{hikingTrailsScores}[/][/]");
}
return;
void GetHikingTrailScore(Point position, int previousHeight)
{
// Out of bounds
if (position is { X: < 0 or >= MapSize } or { Y: < 0 or >= MapSize })
{
return;
}
var height = heightMap[position.X, position.Y];
if (height - previousHeight is not 1)
{
return;
}
if (height == 9)
{
hikingTrails.Add(position);
}
GetHikingTrailScore(position + (1, 0), height);
GetHikingTrailScore(position + (-1, 0), height);
GetHikingTrailScore(position + (0, 1), height);
GetHikingTrailScore(position + (0, -1), height);
}
}
public override void RunPart2(bool display = true)
{
// Setup the CRT
const char litPixel = '#';
const char darkPixel = '.';
var (heightMap, trailHeads) = ParseMap();
const int rowCount = 6;
const int columnCount = 40;
var crt = new char[rowCount, columnCount];
var crtCanvas = new Canvas(columnCount, rowCount);
var totalRating = 0;
// Now cycle is the position where the CRT is drawing (need to offset by 1 in the grid)
int cycle = 1;
// x is the position of the sprite
int x = 1;
// Draw first pixel
crt[0, 0] = litPixel;
crtCanvas.SetPixel(0, 0, Color.Red);
// Increment sum when needed
void IncrementCycle()
foreach (var trailHead in trailHeads)
{
cycle++;
GetHikingTrailRating(trailHead, -1);
}
// We're done drawing the crt
if (cycle > 240)
if (display)
{
AnsiConsole.MarkupLine($"[green]Total rating of hiking trails: [yellow]{totalRating}[/][/]");
}
return;
void GetHikingTrailRating(Point position, int previousHeight)
{
// Out of bounds
if (position is { X: < 0 or >= MapSize } or { Y: < 0 or >= MapSize })
{
return;
}
// Draw a white or black pixel
int row = (cycle - 1) / columnCount;
int column = (cycle - 1) % columnCount;
var height = heightMap[position.X, position.Y];
// The CRT is drawing on the sprite
if (column == x - 1 || column == x || column == x + 1)
if (height - previousHeight is not 1)
{
crt[row, column] = litPixel;
crtCanvas.SetPixel(column, row, (cycle + row) % 2 == 0 ? Color.Green : Color.Red);
return;
}
else
if (height == 9)
{
crt[row, column] = darkPixel;
crtCanvas.SetPixel(column, row, Color.Black);
totalRating++;
}
}
foreach (var line in Input.ReadAllLines())
{
// noop
if (line == "noop")
{
// noop finished, go to next cycle
IncrementCycle();
}
// addx
else
{
var split = line.Split(' ');
var v = int.Parse(split[1]);
// Prepare addx
IncrementCycle();
// addx finished, add to x and then go to next cycle
x += v;
IncrementCycle();
}
}
// Print the CRT
if (display)
{
AnsiConsole.Write(crtCanvas);
GetHikingTrailRating(position + (1, 0), height);
GetHikingTrailRating(position + (-1, 0), height);
GetHikingTrailRating(position + (0, 1), height);
GetHikingTrailRating(position + (0, -1), height);
}
}
#region Input
private (byte[,] HeightMap, List<Point> TrailHeads) ParseMap()
{
var heightMap = new byte[MapSize, MapSize];
var trailHeads = new List<Point>();
public const string Input =
"""
noop
noop
addx 15
addx -10
noop
noop
addx 3
noop
noop
addx 7
addx 1
addx 4
addx -1
addx 1
addx 5
addx 1
noop
noop
addx 5
addx -1
noop
addx 3
noop
addx 3
addx -38
noop
addx 3
addx 2
addx 5
addx 2
addx 26
addx -21
addx -2
addx 5
addx 2
addx -14
addx 15
noop
addx 7
noop
addx 2
addx -22
addx 23
addx 2
addx 5
addx -40
noop
noop
addx 3
addx 2
noop
addx 24
addx -19
noop
noop
noop
addx 5
addx 5
addx 2
noop
noop
noop
noop
addx 7
noop
addx 3
noop
addx 3
addx -2
addx 2
addx 5
addx -38
noop
noop
noop
addx 5
addx 2
addx -1
addx 2
addx 30
addx -23
noop
noop
noop
noop
addx 3
addx 5
addx -11
addx 12
noop
addx 6
addx 1
noop
addx 4
addx 3
noop
addx -40
addx 4
addx 28
addx -27
addx 5
addx 2
addx 5
noop
noop
addx -2
addx 2
addx 5
addx 3
noop
addx 2
addx -25
addx 30
noop
addx 3
addx -2
addx 2
addx 5
addx -39
addx 29
addx -27
addx 5
noop
noop
noop
addx 4
noop
addx 1
addx 2
addx 5
addx 2
noop
noop
noop
noop
addx 5
addx 1
noop
addx 2
addx 5
addx -32
addx 34
noop
noop
noop
noop
""";
var y = 0;
foreach (var line in Input.AsSpan().EnumerateLines())
{
var x = 0;
foreach (var height in line)
{
var heightValue = height - '0';
#endregion
if (heightValue is 0)
{
trailHeads.Add(new Point(x, y));
}
heightMap[x, y] = (byte)heightValue;
x++;
}
y++;
}
return (heightMap, trailHeads);
}
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);
}
}

View File

@@ -1,233 +1,127 @@
using System.Collections.Immutable;
using System.Collections.Frozen;
using System.Numerics;
using Spectre.Console;
namespace AdventOfCode.Days;
public class Monkey
{
public int Number { get; }
public long InspectionCount { get; private set; }
private readonly Queue<long> _items;
private readonly Func<long, long> _operation;
private readonly long _testDivider;
private readonly int _testFailMonkey;
private readonly int _testSuccessMonkey;
public Monkey(int number, IEnumerable<long> items, Func<long, long> operation, long testDivider, int testFailMonkey, int testSuccessMonkey)
{
Number = number;
_operation = operation;
_testDivider = testDivider;
_testFailMonkey = testFailMonkey;
_testSuccessMonkey = testSuccessMonkey;
InspectionCount = 0;
_items = new Queue<long>(items);
}
public void AddItem(long item)
{
_items.Enqueue(item);
}
public bool ThrowItem(IImmutableList<Monkey> monkeys, bool divideWorry = true)
{
// Return false if there's no item to throw
if (_items.Count < 1)
{
return false;
}
// Increment inspection count
InspectionCount++;
// Take next item to throw
var item = _items.Dequeue();
// Apply the operation on worry level
var newValue = _operation(item);
// Divide worry level by 3 before test
if (divideWorry)
{
newValue = newValue / 3;
}
// Even using this simplification, it's still needed to use longs because
// they sometime overflow before being simplified in part 2
newValue = newValue % (2*3*5*7*11*13*17*19);
// Test is a success
if (newValue % _testDivider == 0)
{
monkeys[_testSuccessMonkey].AddItem(newValue);
}
// Test is a fail
else
{
monkeys[_testFailMonkey].AddItem(newValue);
}
return true;
}
}
public class Day11 : Day
{
public override int Number => 11;
public override string Name => "Monkey in the Middle";
public override string Name => "Plutonian Pebbles";
private const int BlinkIterations = 25;
public override void RunPart1(bool display = true)
{
const int roundsCount = 20;
var stones = ParseStones();
var monkeys = ParseMonkeys();
// Do 20 rounds
for (int round = 0; round < roundsCount; round++)
for (var iteration = 0; iteration < BlinkIterations; iteration++)
{
foreach (var monkey in monkeys)
var index = 0;
while (index < stones.Count)
{
// Throw items while there's some
while (monkey.ThrowItem(monkeys)) { }
var stone = stones[index];
var stoneString = stone.ToString();
if (stone is 0)
{
stones[index] = 1;
}
else if (stoneString.Length % 2 == 0)
{
var splitIndex = stoneString.Length / 2;
var leftStone = long.Parse(stoneString[..splitIndex]);
var rightStone = long.Parse(stoneString[splitIndex..]);
stones[index] = leftStone;
stones.Insert(index + 1, rightStone);
index++;
}
else
{
stones[index] = stone * 2024;
}
index++;
}
}
var topMonkeys = monkeys.OrderByDescending(m => m.InspectionCount).Take(2).ToList();
if (display)
{
AnsiConsole.MarkupLine($"[green]Monkey business: [yellow]{topMonkeys[0].InspectionCount * topMonkeys[1].InspectionCount}[/][/]");
AnsiConsole.MarkupLine($"[green]Number of stones after blinking {BlinkIterations} times: [yellow]{stones.Count}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
const int roundsCount = 10_000;
var stones = ParseStones().ToDictionary(s => s, _ => 1L);
var monkeys = ParseMonkeys();
// Do 10 000 rounds
for (int round = 0; round < roundsCount; round++)
for (var iteration = 0; iteration < (BlinkIterations * 3); iteration++)
{
foreach (var monkey in monkeys)
var stonesToIterate = stones.ToList();
foreach (var (stone, count) in stonesToIterate)
{
// Throw items while there's some
while (monkey.ThrowItem(monkeys, false)) { }
var stoneString = stone.ToString();
if (stone is 0)
{
SafeAdd(stones, 1, count);
}
else if (stoneString.Length % 2 == 0)
{
var splitIndex = stoneString.Length / 2;
var leftStone = long.Parse(stoneString[..splitIndex]);
var rightStone = long.Parse(stoneString[splitIndex..]);
SafeAdd(stones, leftStone, count);
SafeAdd(stones, rightStone, count);
}
else
{
SafeAdd(stones, stone * 2024, count);
}
SafeAdd(stones, stone, -count);
}
}
var topMonkeys = monkeys.OrderByDescending(m => m.InspectionCount).Take(2).ToList();
var stonesCount = stones.Sum(p => p.Value);
if (display)
{
AnsiConsole.MarkupLine($"[green]Monkey business: [yellow]{topMonkeys[0].InspectionCount * topMonkeys[1].InspectionCount}[/][/]");
AnsiConsole.MarkupLine($"[green]Number of stones after blinking {BlinkIterations} times: [yellow]{stonesCount}[/][/]");
}
}
private static IImmutableList<Monkey> ParseMonkeys()
private List<long> ParseStones()
{
var monkeys = new List<Monkey>();
var stones = new List<long>();
// Split by monkey description
foreach (var monkey in Input.ReplaceLineEndings("\n").Split("\n\n"))
var span = Input.AsSpan();
foreach (var stoneRange in span.Split(' '))
{
var split = monkey.Split('\n');
var numberLine = split[0];
var itemsLine = split[1];
var operationLine = split[2];
var testDividerLine = split[3];
var testSuccessLine = split[4];
var testFailLine = split[5];
// Monkey attributes
var number = int.Parse(numberLine[numberLine.LastIndexOf(' ')..^1]);
var items = itemsLine[(itemsLine.IndexOf(':') + 2)..].Split(", ").Select(long.Parse);
// Read operation
operationLine = operationLine[(operationLine.IndexOf('=') + 2)..];
long? rightOperand = operationLine.EndsWith("old") ? null : long.Parse(operationLine.Split('+', '*')[1].Trim());
Func<long, long> operation = operationLine.Contains('+') switch
{
true => rightOperand is null
? old => old + old
: old => old + (int)rightOperand,
false => rightOperand is null
? old => old * old
: old => old * (int)rightOperand
};
var testDivider = long.Parse(testDividerLine[testDividerLine.LastIndexOf(' ')..]);
var testSuccessMonkey = int.Parse(testSuccessLine[testSuccessLine.LastIndexOf(' ')..]);
var testFailMonkey = int.Parse(testFailLine[testFailLine.LastIndexOf(' ')..]);
monkeys.Add(new Monkey(number, items, operation, testDivider, testFailMonkey, testSuccessMonkey));
stones.Add(long.Parse(span[stoneRange]));
}
return monkeys.ToImmutableList();
return stones;
}
#region Input
public const string Input =
"""
Monkey 0:
Starting items: 89, 95, 92, 64, 87, 68
Operation: new = old * 11
Test: divisible by 2
If true: throw to monkey 7
If false: throw to monkey 4
Monkey 1:
Starting items: 87, 67
Operation: new = old + 1
Test: divisible by 13
If true: throw to monkey 3
If false: throw to monkey 6
Monkey 2:
Starting items: 95, 79, 92, 82, 60
Operation: new = old + 6
Test: divisible by 3
If true: throw to monkey 1
If false: throw to monkey 6
Monkey 3:
Starting items: 67, 97, 56
Operation: new = old * old
Test: divisible by 17
If true: throw to monkey 7
If false: throw to monkey 0
Monkey 4:
Starting items: 80, 68, 87, 94, 61, 59, 50, 68
Operation: new = old * 7
Test: divisible by 19
If true: throw to monkey 5
If false: throw to monkey 2
Monkey 5:
Starting items: 73, 51, 76, 59
Operation: new = old + 8
Test: divisible by 7
If true: throw to monkey 2
If false: throw to monkey 1
Monkey 6:
Starting items: 92
Operation: new = old + 5
Test: divisible by 11
If true: throw to monkey 3
If false: throw to monkey 0
Monkey 7:
Starting items: 99, 76, 78, 76, 79, 90, 89
Operation: new = old + 7
Test: divisible by 5
If true: throw to monkey 4
If false: throw to monkey 5
""";
#endregion
private void SafeAdd(Dictionary<long, long> dictionary, long key, long valueToAdd)
{
if (dictionary.TryGetValue(key, out var currentValue))
{
dictionary[key] = currentValue + valueToAdd;
}
else
{
dictionary[key] = valueToAdd;
}
}
}

View File

@@ -1,3 +1,5 @@
using System.Collections.Frozen;
using System.Numerics;
using Spectre.Console;
namespace AdventOfCode.Days;
@@ -5,329 +7,149 @@ namespace AdventOfCode.Days;
public class Day12 : Day
{
public override int Number => 12;
public override string Name => "Hill Climbing Algorithm";
public override string Name => "Garden Groups";
public const int EndElevation = 25;
// Color map of elevation: blue -> green -> yellow -> orange -> red
private readonly Color[] _colorMap =
{
Color.Blue1,
Color.DodgerBlue1,
Color.DeepSkyBlue1,
Color.Turquoise2,
Color.Cyan1,
Color.Cyan2,
Color.MediumSpringGreen,
Color.SpringGreen1,
Color.SpringGreen2_1,
Color.Green1,
Color.DarkOliveGreen2,
Color.GreenYellow,
Color.DarkOliveGreen1,
Color.Yellow2,
Color.Khaki1,
Color.Yellow1,
Color.NavajoWhite1,
Color.LightGoldenrod2_1,
Color.Gold1,
Color.SandyBrown,
Color.Orange1,
Color.DarkOrange,
Color.OrangeRed1,
Color.IndianRed1,
Color.HotPink,
Color.MediumOrchid1_1
};
private (int x, int y) _end;
private (int x, int y) _start;
private const int GridSize = 140;
public override void RunPart1(bool display = true)
{
var map = ParseMap();
var canvas = DrawMap(map);
var areas = ParseAreas();
// Test all possible solutions
var minimumPathLength = ExplorePath(map);
var visited = new HashSet<Point>();
var totalPrice = 0;
// Draw solution path
foreach (var (x, y) in minimumPathLength.path)
var currentArea = 0;
var currentPerimeter = 0;
for (var y = 0; y < GridSize; y++)
{
canvas.SetPixel(x, y, Color.White);
for (var x = 0; x < GridSize; x++)
{
// Skip already visited points
if (visited.Contains(new Point(x, y)))
{
continue;
}
var id = areas[x, y];
ComputeAreaPrice(new Point(x, y), id, ref currentArea, ref currentPerimeter);
// Add price of fencing this area
totalPrice += currentArea * currentPerimeter;
currentArea = 0;
currentPerimeter = 0;
}
}
if (display)
{
AnsiConsole.Write(canvas);
AnsiConsole.WriteLine();
AnsiConsole.MarkupLine($"[green]Total pricing: [yellow]{totalPrice}[/][/]");
}
AnsiConsole.MarkupLine($"[green]Minimum path length: [yellow]{minimumPathLength.length}[/][/]");
return;
void ComputeAreaPrice(Point position, byte id, ref int area, ref int perimeter)
{
if (!visited.Add(position))
{
return;
}
// Update area and perimeter
area++;
perimeter += 4;
var left = position with { X = position.X - 1 };
var right = position with { X = position.X + 1 };
var up = position with { Y = position.Y - 1 };
var down = position with { Y = position.Y + 1 };
if (left is { X: >= 0 and < GridSize } && areas[left.X, left.Y] == id)
{
perimeter--;
ComputeAreaPrice(left, id, ref area, ref perimeter);
}
if (right is { X: >= 0 and < GridSize } && areas[right.X, right.Y] == id)
{
perimeter--;
ComputeAreaPrice(right, id, ref area, ref perimeter);
}
if (up is { Y: >= 0 and < GridSize } && areas[up.X, up.Y] == id)
{
perimeter--;
ComputeAreaPrice(up, id, ref area, ref perimeter);
}
if (down is { Y: >= 0 and < GridSize } && areas[down.X, down.Y] == id)
{
perimeter--;
ComputeAreaPrice(down, id, ref area, ref perimeter);
}
}
}
public override void RunPart2(bool display = true)
{
var map = ParseMap();
var canvas = DrawMap(map);
// Test all possible solutions
var minimumPathLength = FindNearestStart(map);
// Draw solution path
foreach (var (x, y) in minimumPathLength.path)
{
canvas.SetPixel(x, y, Color.White);
}
if (display)
{
AnsiConsole.Write(canvas);
AnsiConsole.WriteLine();
AnsiConsole.MarkupLine($"[green]Minimum path length: [yellow]{minimumPathLength.length}[/][/]");
}
}
private (int length, List<(int x, int y)> path) ExplorePath(byte[,] map)
private byte[,] ParseAreas()
{
var height = map.GetLength(0);
var width = map.GetLength(1);
var areas = new byte[GridSize, GridSize];
// Store seen positions with number of steps to reach this position
var exploredPositions = new Dictionary<(int x, int y), int>();
var toExplore = new Queue<(int x, int y, int elevation, int steps, List<(int x, int y)> path)>();
var pathLengths = new List<(int length, List<(int x, int y)> path)>();
int y = 0;
toExplore.Enqueue((_start.x, _start.y, 0, 0, new()));
// Explore all possible path
while (toExplore.Count > 0)
foreach (var line in Input.AsSpan().EnumerateLines())
{
var (x, y, previousElevation, steps, path) = toExplore.Dequeue();
int x = 0;
// If we went out of bound
if (x < 0 || x >= width || y < 0 || y >= height)
foreach (var area in line)
{
continue;
areas[x, y] = (byte)(area - 'A');
x++;
}
// If new elevation is too high
var newElevation = map[y, x];
if (newElevation - previousElevation > 1)
{
continue;
}
// If new path is not better than old path, just skip
if (exploredPositions.TryGetValue((x, y), out var oldSteps))
{
if (oldSteps <= steps)
{
continue;
}
}
// Mark this position as explored and store required number of steps to reach it
exploredPositions[(x, y)] = steps;
// Update path
var newPath = new List<(int x, int y)>(path) { (x, y) };
// If we found the end, note that we could end the search here since it's a bfs, there can't be
// any shorter path to this point
if ((x, y) == _end)
{
pathLengths.Add((steps, newPath));
continue;
}
var nextPositions = new (int x, int y)[]
{
(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)
};
foreach (var nextPosition in nextPositions)
{
toExplore.Enqueue((nextPosition.x, nextPosition.y, newElevation, steps + 1, newPath));
}
y++;
}
return pathLengths.MinBy(p => p.length);
return areas;
}
private (int length, List<(int x, int y)> path) FindNearestStart(byte[,] map)
private readonly record struct Point(int X, int Y)
: IAdditionOperators<Point, Point, Point>,
ISubtractionOperators<Point, Point, Point>,
IMultiplyOperators<Point, int, Point>
{
var height = map.GetLength(0);
var width = map.GetLength(1);
// Store seen positions with number of steps to reach this position
var exploredPositions = new Dictionary<(int x, int y), int>();
var toExplore = new Queue<(int x, int y, int elevation, int steps, List<(int x, int y)> path)>();
var pathLengths = new List<(int length, List<(int x, int y)> path)>();
toExplore.Enqueue((_end.x, _end.y, EndElevation, 0, new()));
// Explore all possible path
while (toExplore.Count > 0)
public static Point operator +(Point left, Point right)
{
var (x, y, previousElevation, steps, path) = toExplore.Dequeue();
// If we went out of bound
if (x < 0 || x >= width || y < 0 || y >= height)
{
continue;
}
// If new elevation is too low, skip
var newElevation = map[y, x];
if (previousElevation - newElevation > 1)
{
continue;
}
// If new path is not better than old path, just skip
if (exploredPositions.TryGetValue((x, y), out var oldSteps))
{
if (oldSteps <= steps)
{
continue;
}
}
// Mark this position as explored and store required number of steps to reach it
exploredPositions[(x, y)] = steps;
// Update path
var newPath = new List<(int x, int y)>(path) { (x, y) };
// If we found a possible start, same as in the 1st part, we could stop here
if (newElevation == 0)
{
pathLengths.Add((steps, newPath));
continue;
}
var nextPositions = new (int x, int y)[]
{
(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)
};
foreach (var nextPosition in nextPositions)
{
toExplore.Enqueue((nextPosition.x, nextPosition.y, newElevation, steps + 1, newPath));
}
return new Point(left.X + right.X, left.Y + right.Y);
}
return pathLengths.MinBy(p => p.length);
}
private byte[,] ParseMap()
{
var lines = Input.ReadAllLines().ToArray();
var lineCount = lines.Length;
var columnCount = lines[0].Length;
var map = new byte[lineCount, columnCount];
for (int i = 0; i < lineCount; i++)
public static Point operator -(Point left, Point right)
{
var line = lines[i];
for (int j = 0; j < columnCount; j++)
{
var elevation = line[j];
map[i, j] = elevation switch
{
'S' => 0,
'E' => EndElevation,
_ => (byte) (elevation - 'a')
};
// Store the end
if (elevation == 'E')
{
_end = (j, i);
}
// Store the start
if (elevation == 'S')
{
_start = (j, i);
}
}
return new Point(left.X - right.X, left.Y - right.Y);
}
return map;
}
private Canvas DrawMap(byte[,] map)
{
var height = map.GetLength(0);
var width = map.GetLength(1);
var canvas = new Canvas(width, height);
for (int x = 0; x < width; x++)
public static Point operator *(Point left, int right)
{
for (int y = 0; y < height; y++)
{
canvas.SetPixel(x, y, _colorMap[map[y, x]]);
}
return new Point(left.X * right, left.Y * right);
}
return canvas;
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);
}
#region Input
public const string Input =
"""
abccccccaaccaaccccaaaaacccccaaaaccccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaaccccccccccccccccaaaccccccccccccaacccccccccccccccccccccccccccccccccccccccccaaaa
abaaaaccaaaaaccccaaaaaccccccaaaaccccccccccccccccccccaaacccccccccccaaaaaaaaaaaaaaaaaaccccccccccccccccaaaaccccccaaacaaccccccccccccccccccccccccccccccccccccccccaaaaa
abaaacccaaaaaaaacaaaaaacccccaaaaccccccccccccccccccccaaaaacccccccccaaaaaaaaaaaaaaaaacccccccccaaccccaaaaaacccccccaaaaaccccaaccccccccccccccacccccccccccccccccccaaaaa
abaaacccccaaaaaccccaaaaccccccaaacccccccccccccccccccaaaaaccccccccccaaaaaacacaaaaaacccccccccccaaccccaaaaacccccccccaaaaaaccaaaaaaccccccccccaaaccccacccccccccccaaaaaa
abaacccccaaaaaccccaacccccccccccccccaaaaacccccccccccaaaaacccccccccaaaaaaaaccaaaaaaacccccccaaaaaaaaccaaaaacccccccaaaaaaaccaaaaacccccccccccaaacccaaaccccccccccccccaa
abaaacccaaacaacccccccccccccccccccccaaaaaccccccccccccaaaaacccccccaaaaaaaaaccaaccaaacccccccaaaaaaaaccaacccccccccaaaaaaccaaaaaaccccccccccccaaaacaaaaccccccccccccccaa
abaaacccccccaaccccccccccccccccccccaaaaaaccccccccccccaaccccccaacccaaaccaaaaccccccaacccccccccaaaacccccccccccccccaacaaaccaaaaaaaccccccccccccajjjjjjjcccccccccccccccc
abcaacccccccccccccccccccccccccccccaaaaaaccccccccccccccccccccaaaaccccccaaaaccccccccccccccaacaaaaaccccccccccccccccccaaccccaaaaaacccccccccccjjjjjjjjjcccccaaaccccccc
abccccccccccccccccccccccccccccccccaaaaaaccaaccccccccccccccaaaaaacccccccaaacccccccccccaacaaaaaaaaccccccccccccccccccccccccaaccaaccccccccaiijjjjojjjjcccccaaacaccccc
abcccccccccccccccccccccccaaacccccccaaacacaaacccccccccccccccaaaaccccaaccccccccccccccccaaaaaaacccaccccccccccccccccccccccccaacccccccccccaiiijjooooojjkccaaaaaaaacccc
abccccccccccccccccccccccaaaaccccccccccaaaaaccccccccccccccccaaaaacccaaaaaccccccccccccccaaaaaacccccccccccccccccccccccccccccccccccccciiiiiiiioooooookkkcaaaaaaaacccc
abccccccccccccccccccccccaaaaccccccccccaaaaaaaacccccccccccccaacaaccaaaaacccccccaaacccaaaaaaaaccccccccccccccccccccccccccccccccccchiiiiiiiiooooouoookkkccaaaaaaccccc
abcccccccccaaccccccccccccaaaccccccccccccaaaaacccccccccccccccccccccaaaaaccccccaaaacccaaaaacaacccccccccccccaacaacccccccccccccccchhhiiiinnnooouuuuoookkkccaaaaaccccc
abcccccccccaaacccccccccccccccccccccccccaaaaacccccccccccccccccccccccaaaaacccccaaaaccccccaaccccccccccccccccaaaaacccccccccccccccchhhnnnnnnnnouuuuuuppkkkkaaaaaaccccc
abccccccaaaaaaaacccaaccccccccccccccccccaacaaccaacaaccccccccccccccccaacccccccccaaaccccccaacccccccccccccccaaaaacccccccccccccccchhhnnnnnnnnntuuxuuupppkkkkkacccccccc
abccccccaaaaaaaacacaaaacccccccccccccccccccaaccaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaacccccccaacccccchhhnnnnttttttuxxxuuppppkkkkkcccccccc
abcccccccaaaaaaccaaaaaaccccccccccaaccccccccccaaaaaccccccccccccccccccccccccaaacccccccccccccccccccccccccccccaaaaccaaccaaacccaaahhhnnntttttttuxxxxuupppppllllccccccc
abcccccccaaaaaacccaaaacccccccccaaaaaaccccccccaaaaaacccccccccccccccccccccccaaacccccccccccccccccccccccccccccacccccaaaaaaacaaaaahhhppntttxxxxxxxxuuuuvpppplllccccccc
abcccccccaaaaaacccaaaacccccccccaaaaaacccccaaaaaaaaaccccccccccccccccccccaaaaaaaacccccccccccccccccccccaaaccccccaacaaaaaaccaaaaahhhpppttxxxxxxxxyuuvvvvvppplllcccccc
abcccccccaaccaacccaacaccaaaaccccaaaaacccccaaaaaaaaaccccccccccccccccccccaaaaaaaacccccccccccccccccccccaaacaaaaaaaccaaaaaaaaaaaaahhppptttxxxxxxyyyyyyvvvppplllcccccc
SbccccccccccccccccccccccaaaacccaaaaacccccccaaaaaaaaacaaaccccccccaacccccccaaaaaccccccccaaaaacccccccccaaaaaaaaaaaaaaaaaaaaaaaaacgggpppttxxxxEzzyyyyyvvvqqqlllcccccc
abccccccccccccccccccccccaaaacccaaaaacccccccaaaaaaaaccaaaccccccccaaacaaccaaaaaaccccccccaaaaacccccccaaaaaaaaaaaaaaaaaaaaaaaaaaacgggpppsssxxxyyyyyyvvvvvqqlllccccccc
abcccaaaccccccccccccccccaaaccccccccccccccccaaaaaaaaaaaaaccccccccaaaaaaccaaaaaacccccccaaaaaacccaaaccaaaaaccaaaaaaaaaaaacccccccccgggppssswwyyyyyyvvvvqqqqlllccccccc
abcaaaaaccccccccccccccccccccccccccccccccccaaaaaaaaaaaaacccccccaaaaaaacccaccaaacccccccaaaaaacccaaacccaaaaaaaaaaaccccaaacccaaaaacgggppsswwwyyyyyyvvqqqqqlllcccccccc
abcaaaaaaccccccccccccccccccccccccccccccccccaaccaaaaaaaaaaaccccaaaaaaacccccccccccccccccaaaaacccaaacaaaacaaaaaaaaccccaaacccaaaaacggpppsswwwywwyyyvvqqqmmmlccccccccc
abcaaaaaacccccccaacaaccccccccccccccccccccccccccaaaaaaaaaaaccccccaaaaacccccccccccccccccaaaccaaaaaaaaaaacccccccaacccccccccaaaaaacggpppsswwwwwwwwyvvqqqmmmcccccccccc
abcaaaaaccccccccaaaaaccccccccccccccccccccccccccccaaaaaaaacccccccaacaaacccccccccccccccccccccaaaaaaaaaccccccccccccccccccccaaaaaagggoossswwwwrrwwwvvqqmmmccccccccccc
abcaaaaacccccccaaaaaccccccccccccccccccccccccccccaaaaaaacccccccccaaccccccccccccccccccccccccccaaaaaaacccccccccccaaaccccccccaaaaagggooosssssrrrrwwwvqqmmmcccaacccccc
abcccccccccccccaaaaaaccccccccccccccccccccaacccccccccaaaccccccccccccccccccccccccccccccccccccccaaaaaaccccccccccccaaaaccccccaaaccgggooosssssrrrrrwwrrqmmmcccaacccccc
abcccccccccccccccaaaacccccccccccccccccccaaaacccccccacaaacccccccccccccccccccccccccccccccccccccaaaaaaacccccccccaaaaaacccccccccccgffoooooosoonrrrrrrrrmmmccaaaaacccc
abcccccccccccccccaccccccccccccccccccccccaaaacccccccaaaaacccccccccccccccccccccccccccccccccccccaaacaaacccccccccaaaaacccccccccccccfffoooooooonnnrrrrrmmmddcaaaaacccc
abccccccccccccccccccccccccccccccccccccccaaaaccccccccaaaaacccccccccccccccccccccccccaaaccccccccaacccccccccccccccaaaaaccccccccccccffffoooooonnnnnnrnnmmmdddaaaaacccc
abcccccccccccccccccccccccccccccccccccccccccccccccccaaaaaacccccccccccccccccaaaaaccaaaacccccccccccccccccccccccccaacccccccccccccccfffffffffeeeennnnnnmmdddaaaacccccc
abcccccccaaaccccccccaccccccccccccccccccccccccccccccaaaaccccccccccccaaaccccaaaaaccaaaaccccccccccccccccccccccccccccccccccccccccccccfffffffeeeeennnnnmddddaaaaaccccc
abcccaaccaaacccccaaaacccccaacccccccccccccccccccccccccaaacccccccccccaaacccaaaaaacccaaaccccccccccccccccccccccccccccccccccccccccccccccffffeeeeeeeedddddddcccaacccccc
abcccaaaaaaacccccaaaaaaccaaacccccccccccccccccccccccccccacccccccccccaaaaccaaaaaaccccccccccccccccccccccccccaacccccccccaaaccccccccccccccaaaaaaeeeeedddddcccccccccccc
abcccaaaaaacccccccaaaacccaaacaaaccccaaaacccccccccaaacaaaccccccaacccaaaacaaaaaaacccccccccccccccccccccccccaaaccccccccaaaacccccccccccccccccccaaaaeeddddccccccccccccc
abccccaaaaaaaacccaaaaaaaaaaaaaaaccccaaaacccccccccaaaaaaacccccaaacccaaaaaaaaaacccccccccccccccccccccccaaacaaaccccccccaaaaccccccccccccccccccccaaaccccccccccccccaaaca
abcccaaaaaaaaacccaacaaaaaaaaaaacccccaaaaccccccccccaaaaaacaaacaaacaaaaaaaaaacccccccccccccccaaacccccccaaaaaaaaaaccccccaaaccccccccccccccccccccaacccccccccccccccaaaaa
abcccaaaaaaaacccccccccccaaaaaacccccccaacccccccccccaaaaaaaaaaaaaaaaaaaaaaaaccccccccccccccccaaaacccccccaaaaaaaaacccccccccccccccccccccccccccccaaacccccccccccccccaaaa
abccaaaaaaacccccccccccccaaaaaaacccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccccccccaaaacccccccaaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccaaaaa
""";
#endregion
}

View File

@@ -1,731 +1,87 @@
using Spectre.Console;
using System.Collections.Frozen;
using System.Numerics;
using System.Text;
using Spectre.Console;
namespace AdventOfCode.Days;
public abstract class PacketElement : IEquatable<PacketElement>, IComparable<PacketElement>
{
public override bool Equals(object? obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
return obj.GetType() == GetType() && Equals((PacketElement) obj);
}
public override int GetHashCode()
{
throw new NotImplementedException();
}
public static bool operator ==(PacketElement left, PacketElement right)
{
return left.Equals(right);
}
public static bool operator !=(PacketElement left, PacketElement right)
{
return !(left == right);
}
public static bool operator <(PacketElement left, PacketElement right)
{
return left.CompareTo(right) < 0;
}
public static bool operator >(PacketElement left, PacketElement right)
{
return left.CompareTo(right) > 0;
}
public bool Equals(PacketElement? other)
{
return other is not null && (this, other) switch
{
(IntegerElement leftInteger, IntegerElement rightInteger) => leftInteger.Value == rightInteger.Value,
(ListElement leftList, IntegerElement rightInteger) => leftList.Elements is [var x] && x == rightInteger,
(IntegerElement leftInteger, ListElement rightList) => rightList.Elements is [var x] && x == leftInteger,
(ListElement leftList, ListElement rightList) => leftList == rightList,
_ => throw new ArgumentException("Can only compare lists and integers")
};
}
public int CompareTo(PacketElement? other)
{
return (this, other) switch
{
(IntegerElement leftInteger, IntegerElement rightInteger) => leftInteger.Value.CompareTo(rightInteger.Value),
(ListElement leftList, IntegerElement rightInteger) => leftList.CompareTo(new ListElement(new PacketElement[] { rightInteger })),
(IntegerElement leftInteger, ListElement rightList) => -rightList.CompareTo(new ListElement(new PacketElement[] { leftInteger })),
(ListElement leftList, ListElement rightList) => leftList.CompareTo(rightList),
_ => throw new ArgumentException("Can only compare lists and integers")
};
}
}
public class ListElement : PacketElement, IEquatable<ListElement>, IComparable<ListElement>
{
public override bool Equals(object? obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
return obj.GetType() == GetType() && Equals((ListElement) obj);
}
public override int GetHashCode()
{
return HashCode.Combine(base.GetHashCode(), Elements);
}
public IList<PacketElement> Elements { get; }
public int Count => Elements.Count;
public ListElement(IList<PacketElement> elements)
{
Elements = elements;
}
public static bool operator ==(ListElement left, ListElement right)
{
return left.Equals(right);
}
public static bool operator !=(ListElement left, ListElement right)
{
return !(left == right);
}
public static bool operator <(ListElement left, ListElement right)
{
return left.CompareTo(right) < 0;
}
public static bool operator >(ListElement left, ListElement right)
{
return left.CompareTo(right) > 0;
}
public bool Equals(ListElement? other)
{
return other is not null && Count == other.Count && Elements.Zip(other.Elements).All(t => t.First == t.Second);
}
public int CompareTo(ListElement? other)
{
if (other is null)
{
throw new ArgumentException("Other can't be null");
}
// Compare elements by elements
for (int i = 0; i < other.Count; i++)
{
// If there's no element in this list anymore, it's that it's lower
if (i >= Count)
{
return -1;
}
// If the two next values aren't equal, return the result, else continue
var compare = Elements[i].CompareTo(other.Elements[i]);
if (compare != 0)
{
return compare;
}
}
// If there's still more elements in this list, it means that it's bigger, else they are equal
return other.Count != Count ? 1 : 0;
}
}
public class IntegerElement : PacketElement
{
public int Value { get; }
public IntegerElement(int value)
{
Value = value;
}
}
public class Day13 : Day
{
public override int Number => 13;
public override string Name => "Distress Signal";
public override string Name => "Claw Contraption";
private const int MaxButtonPress = 100;
private const int ButtonACost = 3;
private const int ButtonBCost = 1;
public override void RunPart1(bool display = true)
{
var pairs = ParsePacketPairs();
var lines = Input.AsSpan().EnumerateLines();
var sum = 0;
var minimumTokensToWin = 0;
for (int i = 0; i < pairs.Count; i++)
while (lines.MoveNext())
{
var pair = pairs[i];
var (aX, aY, bX, bY, goalX, goalY) = ParseMachine(ref lines);
if (pair.left < pair.right)
for (var i = MaxButtonPress; i >= 0; i--)
{
sum += i + 1;
var xOffset = bX * i;
if (xOffset > goalX)
{
continue;
}
if ((goalX - xOffset) % aX != 0)
{
continue;
}
var timesAPressed = (goalX - xOffset) / aX;
if (bY * i + aY * timesAPressed != goalY)
{
continue;
}
minimumTokensToWin += i * ButtonBCost + timesAPressed * ButtonACost;
break;
}
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Right order pair indices sum: [yellow]{sum}[/][/]");
AnsiConsole.MarkupLine($"[green]Minimum tokens to win all prizes: [yellow]{minimumTokensToWin}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
var packets = ParsePackets();
// Add divider packets
var firstDivider = new ListElement(new PacketElement[] { new ListElement(new PacketElement[] { new IntegerElement(2) }) });
var lastDivider = new ListElement(new PacketElement[] { new ListElement(new PacketElement[] { new IntegerElement(6) }) });
packets.Add(firstDivider);
packets.Add(lastDivider);
var orderedPackets = packets.Order().ToList();
var firstDividerIndex = orderedPackets.IndexOf(firstDivider) + 1;
var lastDividerIndex = orderedPackets.IndexOf(lastDivider) + 1;
if (display)
{
AnsiConsole.MarkupLine($"[green]Decoder key is: [yellow]{firstDividerIndex * lastDividerIndex}[/][/]");
}
}
private static PacketElement ReadElement(ref ReadOnlySpan<char> packet)
private (int aX, int aY, int bX, int bY, int goalX, int goalY) ParseMachine(ref SpanLineEnumerator lines)
{
// This is an integer
if (packet[0] != '[')
{
return ReadInteger(ref packet);
}
var lineA = lines.Current;
lines.MoveNext();
// This is a list packet
return ReadList(ref packet);
var lineB = lines.Current;
lines.MoveNext();
var lineGoal = lines.Current;
lines.MoveNext();
return (
int.Parse(lineA[(lineA.IndexOf('+') + 1)..lineA.IndexOf(',')]),
int.Parse(lineA[(lineA.LastIndexOf('+') + 1)..]),
int.Parse(lineB[(lineB.IndexOf('+') + 1)..lineB.IndexOf(',')]),
int.Parse(lineB[(lineB.LastIndexOf('+') + 1)..]),
int.Parse(lineGoal[(lineGoal.IndexOf('=') + 1)..lineGoal.IndexOf(',')]),
int.Parse(lineGoal[(lineGoal.LastIndexOf('=') + 1)..])
);
}
private static ListElement ReadList(ref ReadOnlySpan<char> packet)
{
var list = new List<PacketElement>();
while (packet[0] != ']')
{
// Skip delimiter
packet = packet[1..];
// If it's an empty list
if (packet[0] == ']')
{
break;
}
list.Add(ReadElement(ref packet));
}
// Skip closing bracket
packet = packet[1..];
return new ListElement(list);
}
private static IntegerElement ReadInteger(ref ReadOnlySpan<char> packet)
{
var intEnd = packet.IndexOfAny(',', ']');
var element = new IntegerElement(int.Parse(packet[..intEnd]));
packet = packet[intEnd..];
return element;
}
private static IList<(PacketElement left, PacketElement right)> ParsePacketPairs()
{
var pairs = new List<(PacketElement, PacketElement)>();
foreach (var pair in Input.ReplaceLineEndings("\n").Split("\n\n"))
{
var split = pair.Split('\n');
var leftSpan = split[0].AsSpan();
var rightSpan = split[1].AsSpan();
pairs.Add((ReadElement(ref leftSpan), ReadElement(ref rightSpan)));
}
return pairs;
}
private static IList<PacketElement> ParsePackets()
{
var packets = new List<PacketElement>();
foreach (var packet in Input.ReadAllLines().Where(l => !string.IsNullOrWhiteSpace(l)))
{
var packetSpan = packet.AsSpan();
packets.Add(ReadElement(ref packetSpan));
}
return packets;
}
#region Input
public const string Input =
"""
[[5,[[3,0]],[0,[8,6,9],2,9],[5,6,[2,8,3],[0]],[6,2,[2,6,8],10]]]
[[6,4,[2,[2,2],8,[3,7,0,6,2]]],[4,10]]
[[[6,[10,9,7]],9,[9,[9,0,8,3],[0],3],[8,1]],[2,10,9],[[0,6,[4]],2,[2,3,[6,7,0],[1,4,2]],[[3,7,2],[],0],9],[],[[]]]
[[1,[1,10]]]
[[2,3,[]],[7,[[6,9,9,1,6],[0,3],10,3,[5]],[[]],[9,[],[1,0,0,1,1]]],[7,[1,[3,0],[7,10,8,5,0],2,1],4,7,3],[[5],6,4],[9,3,[4,[0,7,9,9],5,[2,0],[]],[6,[],[4,9]]]]
[[2,[[3,4,7],[7,2,2,6],[8,9,7,7,6],[7,8,1,6,1],[]],[],8]]
[[4,[[9,8,1],2],10,6,[[],[],7]]]
[[9,4,10],[0,[1,[10,4,6],[1],8],[[6,2,7,2,4],[9,3,5,6],[0,3,7],10],3],[[[5,4],2,10],2,9,4,[[6,7,2,3],[6]]],[],[]]
[[0,1],[[7,[10,0,8,1],1,4]],[]]
[[1,3,2,3],[1,[[],7,[6,5,8,7,9],[0,2]],[8],5,[]],[[7,8,[],[8,9,4]],[2]]]
[[7,[[6]],[4,9]]]
[[10],[],[[10,[10,10,5,2,1],[10],5],[4,4],[[2,1],[9]],6],[6,8]]
[[[[],[2,3,7],4],0],[[[6,5,10,2,6],10,[2,7],5,5],7,8,[0]],[[10,1,3,3,[7]],0],[]]
[[[[6,2,2,8],[7,4,9,4],3,[0]],7,10]]
[[6,5,5,1],[8],[]]
[[1,[]],[10],[10,[8,[4]],6,1],[5]]
[[[[1,1,2,4],[7,8,8,7],5,[9,1,7,0,8],[2,10,10,4]],10,[7,[6,10],[6,10,6,9],[0,8,10],7]],[8,[[],[],[1,3,0,5,10],[7,0,7]],1],[]]
[[6,3,[],5],[]]
[[[3],[2,[],[1,10,5,5],[1,0,3,3,1]]]]
[[[6,5,[4]]],[5,10,5,3],[6],[10]]
[[[[],[5,0,8,5,4],[2],0,[]],7,6,10,[7,1,10,9]],[]]
[[[8,[1,2,3]]],[8],[6,9,[3,1,1,[10,10,3,10,0]],3,0],[[[8,7]]]]
[[0,[[0],5,[6,3,3],[10,3,10,9]],4]]
[[],[5],[8],[[[10,8,10,5,3],[3,7,10,9,8],0],[[],[]]]]
[[],[10,[7,3,[6],7],[9,[3],[8],7,[1]],10],[6,9,[9,3],[[4,8,1],[10,1,4,7],7],10],[[],[3]]]
[[[6],5,6,10,6],[[]],[1,[6,10],8,3],[1]]
[[1,3],[10,[2],8,1,[6,6,[5],5,[2]]],[[4]],[],[]]
[[[],[1,0,[8],8,[0,3,6]],1],[[[6,1],8,3,1],1,[6,[6,9,3,8,7]],10,[5,[4]]]]
[[9,[6,2,[],[3,0,2,7]],0],[[[5,4,0],0,[2],[7,3,2,5,1]],9,3]]
[[2,[7,[5,2,4],8,5,[3,0,4,5,4]],0,8]]
[[8,6,3,[[10,1,1,7]],8]]
[[[9,2,5],10,5]]
[[],[6],[[[3,6,3,9]],[[2,0],7,1,[10,10,4,4,10]]]]
[[4,[[6,8,4,9,2],[],5,[10,1]],1,6],[[[4,2,5],4]],[[3,6]],[7,8,[[5,8,9,10],1,[6,8],1,7]]]
[[[[],10,7],[],[1,[]],8,[9,0]],[0,[[6],3,1,[0,7,5]],[[7,6,3,9,3],4,4],[],0],[],[9,2,[9,1,[0,9,4,6],[9,2],10],9]]
[[],[2,5,6,5,8]]
[[[[4,4],5,[7],3,[8,8,4]],2],[]]
[[[[6,5,4,7,1],[0,9,9]],[[7,3,7,6,10],3,[6,4,9,4]],[1,[],[]]],[[7,5,[2,4,1,1]],2,4],[],[[[4,7],[1,7,9],5,[]],4,[[7,5,1,9,10],2,5,[1,2,0,9,9]]],[9,[]]]
[[7,[[8,10,9,4,5],[1,3]],1],[[[1,1],2],[[3]],[[7,9,6,6,8],4,[5]],7],[3],[[9,[3,9],[3,1,0,9,2]],4,5,9,[[1]]]]
[[[4,[9],5],[[2],8,[5,7,0,0],0,9],[[2,1],[],7,[7,1],2],4,7],[[[4,7,0,10,2],[5,5,0,3,6],[10,6,3,3],4,8],2,[[1]],9,9]]
[[[[6,2,4,0]],[],[[8,3,1,5,5],1,7,4,2],5,1]]
[[[],0],[],[4,[[1,6],2,[8,4,1,3,10]],[5,0,[10,1,0]],8,[2,[10,8,4],[6,2,7,10,10],[8,2,4,4],[]]],[[],6],[[4,5,[2],[10,2,2,1],[4,6,5,10]],[5,[],9,[1]],[]]]
[[9]]
[[[],8],[7,[6,4]],[5]]
[[],[[3,5,[1],3,[3]],[5],6,[[7,2,6,9],[1,0,0,1]]],[[[5,5,2,0,10],10,7,8,7],5,7,7,[[],1,[6]]],[[]]]
[[[5,8,10,[9,1,3,2,4],[6,7,0,7,6]],3,[[7],3,9,4,[9]]]]
[[3,1,4,[[6]],[[4,6],1,[4]]],[0],[3,[],7]]
[[7]]
[[4,[[5]],[10,8,5,0]],[4]]
[[7,6,10,[[1],8,0,[10,5,1]]],[[[2,1,6],9,9,[4],9]],[]]
[[7,0,5,3,1],[],[[0,9,[8,4,9]],[7,[10,9,4,1,7],2,6],10,[],10],[]]
[[1,[],[],6,[[],10,3]]]
[[[[1,6]]],[[[5,3,7],[],[10,9,7,3,3],0,[]],3,10,5],[],[10,[2]]]
[[[[1,5],5],[[6],[3,2],9,[2,0,8]],[9,[6,9,4],8,0,6]],[[[8],8,10],0,[],6,[[2,7,8],0,9]],[7,1],[[[0],[9,5,9]],[[2,10]],[]]]
[[1,7,[[9],8,[1,1,8]]],[[[9,10,2,0,1],10],0,[7,[10,10],10],5],[7,1],[9,[[],[7,10]]],[[2,9,8,[0,0],[10,9,4,1]],[5],[[8,6]]]]
[[[[4,7,4],[],6,[5,4]],[],[7,[],[],3],[[9,3,5,1,10],[],[7,2]]],[[6,1],3,[[],[3,2],[],[3],[8,7,3,9]]]]
[[[2],0],[2,[6,1],6,5],[0,[],[[9],[],[],[10,8,6]],[[9,6,8,2,3],8,1,5,1],[[4],2,[]]],[[10,1,0,6,1],6],[4]]
[[1,[[4,10,2],10],[4],6,[[1,0,7],[8,1,9,5,2],6]]]
[[],[9],[[],[[4,4,1,8],3,5]]]
[[[[10,7],6,[]],[[1,3],[8,9,4],8,[],[2,9]],[8,3],10],[7],[8,9,10]]
[[3,[10,[],4],[[8,3],4,6,[0,6,9,3,6],[8,9,5,9]],[10,[7,1,0,1],[7,1,2,1],[],[]]]]
[[7,2]]
[[8,[],2,0],[[1,[10,7],[0],2,0]],[4,0,[10,[0,5,1],[1],[]],6,[9]]]
[[],[6,[[5,1,6,0,5],4],[7,7,[6],8,[2,1]],1,[[3,0]]],[4,10,[[5,10],[4,9,2,1,5],[7,1,5,6]]],[],[1,9,[]]]
[[[[5,7,1,2],[8],[7,0,9,7,3],[4,2,1],1],8,[4,1,[8,6,1,10],[6,8,3,2,0]],[[3],1,[2]]],[[8,[7,10,1,5,2],[1,1],[1,2]],[[0,4],2,1,[4,6,8]],1,0,3],[10,1,[[0,0,7,8,7],3]],[[4,[4],3,7,[]],3,[10,1,5,[9,6,3]],[[3],[2]],[[],1,10,[2,7]]],[[[9],7,3],8,10]]
[[[3]],[[10],2,3]]
[[[10,4],1,[[4,2,5,8],3,6,[6,10,5,5],5],6],[[7,3,4,5],3,[],[]]]
[[[[0,5,8,4],[2,3,9,1],5],[[9,7,1,5,3],6,[4],[9,2]],[]],[10,[4,1,3,2,7]],[2,9,[4,[],8,[8,10,6,10,10]],[5,8,[]]],[10,4,3,3],[]]
[[],[[[0,9,10,9],9]],[3,[[],[10],4,[4,2,7,8]],0,[[9,10,1,2],9,0],[5]]]
[[[[8,2,9,9],9,4,2],[[9,9],0],[9,[4,1],2,[2,5],2]],[]]
[[],[[0,[4,9]],[4,7,[9],7],[[1,8,9,7,5],[1,4],3,[9,1],4],[4,10,[1],[],[]]],[[5,4,2,10,[9,7,0,4]]],[[[0,10],4],1,5,[[10,7,0,8,9],[6,10,6]],1],[[[5,7],7,5,[]],10,[[6,10,1],[0,8,0]],[],6]]
[[7,[[0,5,8,1],[10,10,0,2],[3]],10],[[[0,1,2,7],4],[1,6]],[[[3],[2],[]],6],[[1],[]]]
[[2],[[],2],[3,9],[],[7,[],1,[[4],8,6,[9,4]],9]]
[[7,[[],[2,10,5,10],1,0,[9,2,1]]],[8,[[],0],4,9],[4,[6,3,5],7]]
[[[[5,5,6,3],[2],8,[]],[[10,1,4,7]],8,6],[[9]]]
[[[[8,9],4]],[[[6,0,6],[0,4,2,8,5],2,[5,6,0,9],1],10,4],[]]
[[[[0],10],[[6,2,10,8]]],[],[[[2],10,3],[],2,10,[10,[]]]]
[[[],1,[]],[[],8]]
[[[2,[10,8,8],[7,1,7,1]],7,1,[]],[6,[[5,10,5,6],2],2,[2,2,[6],10,8]],[[[5,1],[7],1],2,2,10]]
[[5,[3,[8,2,10],[3,10,10,10]],2,7]]
[[],[9,1,4,[1]],[10,[[8,9,2,1],8,6,[],6],8,5],[]]
[[[8,5],[[],2,7,[5,0],[10,5,6,8]]]]
[[[]],[[1,1,5,10,[4,0,10,6,1]],[10,[2,4,7,7],[6,0,8,7]],9,0]]
[[[[4,9,6,4,9],2,[5,1,0,1,5]]],[[1,[4,7,5],8,5],[7,[9,4,8,3,7],8,8,[6,8,3,10,2]],[[6],[8],[2,5,8,3],0]],[]]
[[[4,6,[8,2,10],9],[6],5],[[],0,[1,[4,5,9,1],2]]]
[[[],9,[8,6,[4]]]]
[[6,[]],[4,[],[3,[6,8],[1,6,7,6,6]],6],[],[2,5,5]]
[[8,[[5,3],2,2,6,6]],[]]
[[2,[]],[],[[3,9,10],9]]
[[[]]]
[[[9,[8,6,1,5,0],7,[5,0],[5]],[[]]]]
[[7,4,[[6,4,6,5]],[[9,1],[3,0]],4],[0,[[10,4,8]]],[],[],[[6,7],0,[],[]]]
[[9,3,[8],[10,[10],[7,4]]],[1,[[10,9,4],[7,6],[]],10,5,[]],[[5,7,0],[[3,6,2,8,7]],[[2,6],[],[1,3,9,8,8],10,5],6],[10],[[0,3,7],[[7,1,1,2,1],9]]]
[[1,[3,[],[5,3,9,2],[10,5,4,1,7],[1,5,7]]],[[4,[4,0],9,0]],[[1,[9,8,0,6,9]],2,[[7],7,[1],[10]],7],[[0,[],[6],[]]]]
[[6,1,[10,[4,1,3],1,9]],[]]
[[],[],[],[10]]
[[8,[[10],0,1]]]
[[7,2,7,8],[],[6,0,6,4],[[[5,4,5],7],6,[],[]]]
[[],[[[8,2],7,9],4,2],[7,0],[]]
[[0,1,9,7,5],[[[4,1,10]],8,6],[[[8,9,9,10],[6,5],[8,5,3,5]]],[[],8]]
[[[4,5,6,8],[[5,0,7,10,8],0,[],[7,4,9,9,3]],[]],[],[0,5,[6,8]],[4,[2,[0],[10,1,9,7]],8,3],[]]
[[],[]]
[[[4],4,9],[],[[[3,1],[4,2,5,10,1]],3,[[5,1,0,1,2]],10,[7,[10,5,9,9,9],[2,3,4,10],[2,1],9]]]
[[6,[10,[10]],[7,[4,0,4]],[[0,3,10],7]],[[[9,7,2],7,9,[7,4,8,4,9]],2]]
[[7],[[3,[],[5],[0,6]],[[3,10,5]]]]
[[3,[4,7,[9,0,1,1,7]],0],[[8]]]
[[9,4]]
[[9,[[5],2]],[3,3,[4,[9,3,8],0,5],3,7],[9,5,6],[10,9,2,5,1]]
[[[],[6],8],[[[8],9,[5],1],[6],4,6],[[[]],6],[],[5,[8,8,[10],[5,1,5,9],4],[5,7]]]
[[6,[[],2,9,3],7],[4,[[5,9],3,[3,5,5]],7,7],[[],[[2,0,2,9,3],6],[],[[9,6]],2],[5,9,[[],2,[9,10,10],[7,0,4,1],9],9,[[8,2,2]]]]
[[[7,5,[5,10,1,9],[2,9,9,3]],1,[6,9,[7,9,6]],9,[[5,1,9,10,0]]],[6,8,[]],[],[[2,[2,5,4,9,10],[3,3,3],1],7,[2,9],[4,7,7,[5],[1,2,5,9,8]]],[4,[[],[7]],8,2,1]]
[[4,9,3],[6,[],[6,[7,7,9,1,5],[10,4],10],10,3]]
[[[2,3,[7,5,1,0],5,[10,2,0]]],[7,6],[[[1,0,8,10,2],1]],[0],[6]]
[[10,6],[7,10],[[4],[]],[8,[],[[],10,2,10],[[9,3],[6,9,8],[10,2,4,1],8],2]]
[[[],4],[10,8,[3,9,[]],9],[8,5,[],2],[[8,[10,5,7,2,10],[4,10,7,9],[4,4,5]],[[5,4,6]],[],4]]
[[],[0,8,[5,[6,3,0,7],1,9,6],[3,8,[10,3,8,10],4],[8,[10,6,10],10,[],4]]]
[[[[],6,[5,5],8,[0,5,1]],[7,4,4,[4,1,3,0],8],3,[5,6],8],[9,[4]],[[0,[6,5],1],2,[],[],[2,[8,0,2,10,6],1,[5,8,9,9,4]]],[9,9,[],0]]
[[2,[[7,9,8,8,10],[],[4,5]],[[1,10],7,[1,9,1,0]]],[[4,[6,10,1,5],5,6],[],[[4,9,2,3,2],6,[3,0,2,2]],9,[]],[5,[[10,0,10,6,4],1]],[9,[0,[8,2,2],8,[5],4],[]]]
[[[8],[7,6,10]],[2,5,[[9,9,1,2],[],[],2,4],1],[],[[[7,3,8],1,1,0],[[4,8,7,10,3]],6]]
[[],[[9,9,[4,2]],[7,[],9,[3]],[[1,5,0],[9,3,6,1,2]],[[9,9],4,10,1],1]]
[[],[[0,[9,6],[2,4],9,3],[]],[5],[],[6,[[4,1,0,7,7],[]]]]
[[8,10,6,[],4],[[9,7,2,8]],[0,[5,10,[3],[6,5,9],[4,4]],[],6],[[[],2],8,[9,[3],5,[10,1],8],0],[[3]]]
[[[4,5,[],6,[]],[0,6,[2,4]],10],[[1,[10,6,4,10],[10,4]],1,7,10,7],[],[[],[4,10,[9,0]]],[[6,[10,7,0,7,10]]]]
[[3,[3,[4,1,1,10,10],[8,4]],4],[]]
[[10,[10,4,7]],[7,[1,2,[0,8,6,7]]],[4,6,4]]
[[10,10],[[[2,4,4],0],4]]
[[[[10,4],[1,4,7,1]],2],[[[]]],[3]]
[[[[],[5,4,5,9],8,5],[[],0,4,[1,0],6]],[[3],[[],6,7,0,[7,1]],8,7,8]]
[[[[6,6,5,8],[10,2],[4,10,0]]],[[[1],[4],[0,3,5],[0,1]],[6,[0]],8,1],[1,10,8]]
[[[10,3],[6,[2,2],5]],[[10],[],[[7]],[[],3,[0,0,1,8,0],3,[]],2],[],[]]
[[6],[[],7,[[1,2,0,1]]],[[7]]]
[[[[],[],3]],[]]
[[1,[[5,2,1,10]]]]
[[],[6,1,[]],[1,10,5,6,[[1],[10],2,[2],[4,6,10]]],[]]
[[10,[2,[6,9,4,10,7],[5,8],0],8,10,6],[[[4,10,1]],[[7],[7,4,10,0],[7]],10],[],[[2,[0,2,10,10,1],7,8],[9],[1,[0],[2]],[8,7,[]]],[[]]]
[[1,2,3,[3],[]]]
[[[],1,10,3],[],[5,2,0]]
[[10],[5,1,[8,[9,0,9,10]]],[],[[0],[10,10],4,1]]
[[0,[[0,5],5,2,3]]]
[[],[[],5],[],[0]]
[[3,[9,1,3,[0,9,1,4]]],[],[3,6,[3,10,6]]]
[[9,[[],[7,6],[9],1,10],7,[[4,0],[7],[1]],[1,1,3,[4,5,3,10],1]],[7,4,[[2,9,1,9,3],5,[4]],[8],8]]
[[[[4,5,7],[0],6,[6,7]],8,4]]
[[4,3,[[7,4,6],0,2]],[3,3,8,[[5,5,1,8],[8,2,3],7,3,10],7]]
[[[[7],3,7],0,7,2],[7,[[4,6,8,2,4]],[[6,6,5],[4,4,5,6,6]],[],5],[10,9],[]]
[[2,[[6,2,7,5,7],5,1,3],8],[5,[8,[5,9,8],[],[7,5,3],[4,9,0,2]]]]
[[[2]],[3,[0]],[9,10,2,[],[[7,0,8],4]]]
[[[6,[],7],6,5,9,7],[9,[5,[10,1]],[6],3],[0],[4,4,9,7,[3,6,3,8]]]
[[6,0]]
[[4],[[[4,6],[4,10,3],2,[]],3]]
[[6,8],[[],[5,8,7,3,[]],2,[5,10,[0,5]]],[10,[3,7,[0,5,6,3],1,[9,4,5,1]],5],[[],[7,0,0],[7,6],[7,[7,3,1,1,1],0],[[],8,[]]]]
[]
[[[1,[6]]]]
[[[8,[],[6,9,0,9,7],3,0],4,5,5,[[],8]],[0,5,7,[10,9,[]]],[],[[],[10],[5,8,7]],[6,[[6,10,1],0,[4,9,8,4,7],6,[0,4,9,2]],[5,[1,5,7,1]],3]]
[[10,[0,1,[10],[]],[]],[[8,6],4,9,8,0],[5,[[3,0,6,7],1],4,8],[5,[8,[3]],9,3,[[10,5]]]]
[[[[1,10],[5],[6,2,2],5],[8,5,8,[6,0,0],3]],[]]
[[1,[9,[3,6,3,9]],[[10,4,2],4,4],[[5,10,4]]],[2,[[10],3],[6,[],[2,10],1,[2,4,6,8]],[8,[8,8,9,2],[],7,[2]],[[10,5,5,10],[3,0,10,2,6],[2,2,7,8]]],[[[6,7,1],[8,7],[4,4,4,4],[],9],3,9,0],[[4,2,[2,3],0],[[10],8,1,5]]]
[[[],[10,[2,10,8]]],[]]
[[2,9,4,2,[[2,6,4,9],[10,4,4],[],0,[]]],[[[9,0,9,5],[0,1,0,6,10],[10,2,0,6],10]]]
[[[],7,[3,9,[],2,[2]],10],[],[7,1,[[4,1],[],[5,3,1,8,2]],4,4]]
[[10,[[6],[10,8,1,5],[2,3],3],[[6],8],[5,[4,6],[5,2]],[[8,8,2]]],[2],[[[],[5,3,7],5,[8,2,6]]],[[[2]]]]
[[10,8,9,4,[8,[],8]],[5,7],[]]
[[5],[],[[[1,8,0,8],[1,7,4],5,[]],[],[[]],[2,8,[6],10,10]],[[[0],9,[],[1,0]],10,7,3]]
[[3,[],5,[[10],[9],5],[[10,3,6,9],[8,7],2]],[8,9],[7,[]],[[5],[],8,0]]
[[10,[[9,2,3,7],10,[3,8,4,3]],[10,[3],[4,4]],[2]],[],[3,[7,[9,8,10,10,1],10,[10],1],[7,8,6,[4,8,7],2],6],[[[10]],[[10,7,1],2],0,[[]],8],[]]
[[3,0,1,[7,[0,7,5,2],[],[],[6,5,0]]],[],[],[10],[9,5,[]]]
[[0,8,[],[[1,0],[5,8,3]],[9,8,10]]]
[[],[8,[]]]
[[[7,9],[]],[],[[[1,10,3,8,4]],[9]],[]]
[[[],6,[4,1],2],[9,10],[6,0,1,3],[3,[],[],[7,2]]]
[[[10,[],8,9,[0,1,7,3]],[[10,4,10]]],[],[[5,[5,7,6,7],5,4],3,8,[6,[],[3,2,10],[5,6,2,7]],8],[7,[[9,7,2],8,3,0,9],[5,4,4],7]]
[[[]],[],[2,[],0],[[2,[],4,4]],[[10,[4,7],[1,3,2,4,2]],[],[6,[8,1,3,2],2],6,[5,10,[8,10,6,8,2],6,[]]]]
[[[[7,6,1,3],8,[]],3,1,[0,[5,0,9,8],4,9]],[[[3,10,5,8],[2,2,4],[9,7,6],[7,7,10],0],5,[[0],[4,9,3],3,1,1],[[9],6,5],[]]]
[[3,1,[6,[9,0,3],[2,9,1,2,7],2,[9,9,5]],[0,0,0],3],[8,4,[[2,10,9,6,2],0,[7,5]],[7,2,[9]]]]
[[[10,[],[1,9,4],[0,7,10]],10,10,[[],[7,1,1,9],[4,5,7,2,0],9]],[[[8,7,7,7,10],2,9],[],[[4,10,6,6],[]]],[]]
[[[[],8,[6,0,1],9,9],3],[],[]]
[8,3,10,5]
[8,3,10,5,4]
[[[10,8,1,6],9],[4],[[8],10,[[1,3,2,10],[1,1,8,8,4],10,6]],[9,2],[[[8,9],5,9]]]
[[[[1,5,1,8],[3,6],5],7,10,7,4],[[9,4,6,5,9],[[0],3,[2,2,10,1,1],1],[2,2,[2,10,7],5,10]],[7,6,[4],[[],3,10]]]
[[4,[],[9],7],[5],[[7]],[8,[[3,9,10],10,[4,4,1,7],[7,1,0]],[[2,3,1,7,10],1],5],[9,10,9,[]]]
[[1,1,8,1],[]]
[[[[0,9,3,8],9]],[7,[[8,7,6],4,1,5,[10]],2,[5,[9,6,4,9],[6,7,5,8],10]],[[5,4],8,1,8],[]]
[[7,10,10,[[2,6,6],2],[[]]],[],[5,7,[1,[]],[[4,8,7]],1]]
[[9],[2],[],[]]
[[[],[0,1,4,4],[],[[10,8,8,4],9,[0,2,4,6],[],[7,2,8,9]]],[6,[[2,5,5,8],6,1,[7,1,7,2],[6,9]],[[4,5,6],5,4]],[[]],[],[4,4,[[9],[],9,0,2]]]
[[],[[0,[10,3,3],4,5],[6,9,4]]]
[[9,[[],2,[1],[4,4,6]],[[9],[6,5,2],[6,3,7,4],4],[]],[2],[],[[[2,7],[1,1,10,2,9],7]],[[],[[10,6,4,3],[]],0,[4],[[4],1,10,5]]]
[[[[3],5],[7,9,10]],[2,[1,7,8,[3]],[]],[]]
[[7,6,[],0],[],[[[7,6],[10],1,2,10],1,1,[6,10],[[4,10,4]]],[0,[],[],8,[[5,6,0,1,0]]],[6]]
[[3,[9],[2,[5,0,5,8],[],4],[9,[8],[2,5,4]],[2,[4,7,2],[10,0,3,8,8]]],[[10,2],7,3,9,[[4],1,[1,9,6,9],10,10]],[1],[4,4],[[[7,1],1],10]]
[[[[4,2,1,3],7,[6,0,9,6,8],[3,0,10],8],6,[],3],[[[6],[0,10,5,4,6],7],10,[9,7,[10,3,0,4,0],2,[9,4,2,5]]],[3,[0],[[9,0,1,6,1]]],[[4,1,8,8],[[5,0,6,3,8],[7,8,7],7,[10,6,5]],5,[0],[[],9,9]],[[5]]]
[[[6,[0],[0]],9,[10,7,[10,1,6,8],10],[[],3,2,9],3],[7]]
[[[[9],[8,5,4,6]],10,[[9,6],4,5],6,4],[[10,[]],10,2],[],[[[8,10,9],7,0],[[4],[5,9,8,1,2]],[[8],[10,9,3],[2,6,3,2,6],1],[[6,8],[5,5,4],3]],[[8,1],[5,10],6,0,1]]
[[8,[0,1,6,6,8]],[],[[1,9,2,[4,5,2,4]],4,[],[7,1,7],7]]
[[[7,[7,1],4,10],5,5],[[[1,6,8,9,2],[4],[5,5,7]],1,10,[0,[10,6],3]],[],[[[6],[6,2,0,10]],[[6,6,4,1,3],1],[]],[1,[[7,2],5],[],[2,8,10,[10,1,2,2],4]]]
[2,0,1,0,6]
[2,0,1,0]
[[],[5,[],3,[[1,9,3]],2],[[[],[3,2,3,2,7],[1,10,6,3,9]],1,8]]
[[6],[[[1,0,6],[6,4]],7,1,[2,[5]],7]]
[[9,0,4]]
[[1,10,5,9,[5,5]],[[[3,8,10,8],0,[4],[8],[9,7]]],[[[1,5,4],10],9],[4,[[5,2,8,8],[10,5]],4]]
[[7,6]]
[[[],[[10],0,8],0],[1,5]]
[[[[2],4,[8,7,7,0,4],[3],7],[],[[3,6,6,1]],6],[[[7,0]],1,[1]],[[0,10,[1,0,5],[0,5]],8,4,[9],[0]],[[3,0]],[9]]
[[],[[[0,6,6]],[[8]],3,[1],9]]
[[[4,[0,2,0],8],[[5,10,6,6],[2]]],[],[]]
[[0,6,4],[8,[5,[]],[[9,3],[9],[2,5,0]]],[[10,8,2,[3,0,4,9]],[6,6,5],[4,[],5,9],9],[[[5,0,10,5],5,3],6,4]]
[[0,4,[],4]]
[[[1,[]],6,9,[[4,0],[]]]]
[[0,[[1],10,[4,7],4]],[[10],1,[3],6],[[[7,2,0,7,0],9,[0,8,4],1,6],[[9,2,0]],8,6,[10,8]],[[],10,[9,[8,5,0]],[10],3],[]]
[[1,[[],9,[7],[7,6]],[3,5,1]]]
[[6],[1,6,[[2,3,2],[7,9,4,3,5],5,[6,6]],[9,5,2,0],[3,[7,1,4,1,2],4,[2,7,7,9],[8,8,4,10]]],[]]
[[[10,7,[],[3,4],[8,1]],[5,[9],3]],[[3,[8,7,0,8,6],[0],[5,3,1,0,5]],[9,[4],10,[8,0,2,10],2]],[[[10,10],0],[]]]
[[2,[[7,5,10,9]],5,5,[]],[[[1,6,5,10,6],[5,8,4,10],[2,5,3,8]]],[[],[[2,10,1],[],8],5],[]]
[[3,[10],9,[5,[],[2,3],6,7]],[[],4,9],[],[[[1,10,4,10]],0,10]]
[[],[10,[2,[0,8],[7,4],6],2,2,[[2,2,7,2,9]]],[0,[]]]
[[[[10]]],[],[],[[[2,2],6,0,[]],[],10,3,[[4,7,1],[6,10],2]]]
[[[4],[],5]]
[[],[[],3,8,8,10],[7]]
[[]]
[[[3,5,1,[0,8,0,7,6]],[2,10,1,[]],[[8,8,3,8,2]],[[10,1],1,[0,2,6],[10]]],[[[1,2],[5,2,6,7,9],10,1],2,5,[]],[[7],[6,9,10],[2,[6,4,10,1]],3,[[10,5,8],9,[2,5,10,2]]],[[5,6,[7,7,8]],[7,[],7],[],[6,10,[7,7,5]]],[]]
[[[5,[5],[],10,[3]]],[],[],[5,3,4,8,[[0,10,7,3],[5,5,6],[10,7,9,2,7],[6]]],[[],[[6,0,5,10]],[[10,1,1,5,7],[8,6],[],[5,5,5],2]]]
[[8,[9,4,[8,0,3],[0,4],2],[[3],1,1,4]],[5,[1,[],6,5,[4,7,0,8]],3,[[3,8,10,0]]],[7,4,[],1,6],[[[7,4,9,10,8],[],10,[7,9],[2,1,3,8]],2],[[[8,5,1,6,6],[3,9,3,1],[2,10,0,3,5]],7]]
[[7],[2,[10,[9],[9,10],[1,5,8,8,3]],[[3,7,0],3,[9,1,0,9,10],8,[5]],[[1,6,10,9]],3],[[9,1],[[10,1,7]],6]]
[[9,[],4,[[],5],5],[8,[5,6,3,[5,8],[4,10,0]],[3,8]],[8,[[0,1],3,0,1],4,[[2,9,3,1]]],[[5,3,5,1,[6,5,6,3,6]]],[1,[[]],[5],[2],7]]
[[10,9,9,2],[[10,6,7,6,[0,1,10,10,0]]],[2,[3,[6,9,5],9,[]]],[8,2,[]]]
[[],[[7,[8,10,7],[7,8,10,6],3,[]]],[],[[[5,5,1,4,2],6],[],0],[2,4]]
[[5,[8,0,[7,10,7],9,[1,6,9,2]],7],[[10,9,[7]],2,[4,[10,7,0,8,6],[],[4,1],5]],[]]
[[6,2],[0,[],6,[[1,10,4,8,8]]]]
[[[5,[]]]]
[[6,[],2],[0],[[],10,[[1,8],4,[9],[5,2,0,6,9]],[]]]
[[10,[[],[5,8,10]],2,[10,1],[]],[[],5,[6],[3,[2,0,4],6,4,3],[7,4,[],1,7]]]
[[[[5,0],[10,10,3],[9,10,10,10,5],5],5,[[0,1,10,9],10,[8,8,6]],5,9]]
[[4,[[]],[]],[],[[10,[7],0,[3,10,1]]],[[6,3],10,10,[2]],[3,4,[3,6,10,0],[[5],8,[3],[6,2,8,2,2]]]]
[[2,[0,[3]]],[9]]
[[[2,5,[9,10,7],[0]],[[4]]],[9,3,[3,10,9],[9,[3,9,10],[6,3,10]]]]
[[],[8],[[[],10,[],8],5,4],[[6,10,[],5],[8]],[[8,[9,10]],[[9,0,3,4,10],[7,9,4],8]]]
[[5,7,5],[1],[1,[],10],[[9],5,10,0,[]]]
[[7,0],[[],9,4]]
[[3,[]],[[]],[[0,[7],[8,2,9,0]],[[3,2],[3],[3,3,3]],[]]]
[[[[],5],7,[[0,0,1]]],[9,[6,[10,8],[6,7],1],0,[6,0],0],[2,5,[9,3,6],[[5],8,2,5]],[[[],4],[]]]
[[9,10,2,[5,[],[3,7,0,8,3]]],[[9],4],[2,[[3],[9,2,0,3,8],[9,4,2,9,10]],[[5],[4,2,0,8],9,[],[1,6,6,7,8]],10,8],[9,2]]
[[0],[10,[[2],3,2,[9]],[0]],[9,[8]],[1,[],[2,2],8],[7,6,[8,[],5,8],[[6]],7]]
[[0],[[5,7,3,8],[[1,5,2,2,5],9,3],[],[],[[0,0,5,6,1],9]],[[9]]]
[[3,[[3,6,8,3],[]],4],[[9]],[1,[0]]]
[[[1,[6,3,1,4,4],[]],10,10],[[[],[4,6,2,8],[7,3,8]],[],[8],[[9],[4],[5,8]]]]
[[8]]
[[],[8,[[0,2,0],[4],2],[8,[]],10,[]],[0],[[7,2,[6,4,10,7,8],[8,2,10],[3,10,9,5]],[],[1],3]]
[[8,3],[[[7,2],[4]],[],[7,10,[7,7,4],[0,5]]],[10,6,8,8,[[10,9],[9,7],[0,10],[10,6,5,6,2]]],[10,7,8,[[7],3,6]]]
[[[10,[7,6,5,8,7],10,4]]]
[[[9,2,7,2],[[8]]]]
[[],[[0,[8,5,1],2],[[5,9,4,1],8,2],[[3,6,1],[5,4,4,7],[6]]],[],[4,8,[[5,9,6,4],9,[10,6],[0,8,9,1,10]],[4],2]]
[[6,2,[[7,10,2,8,5],2]]]
[[3,[],0,[]],[2,8,[[5]],[2,6,[0,7,0,1]]]]
[[2,[[3,4,9,9],[],[6,6,5,3],9],0],[],[9],[[],[8,2,2,[9,6,0,5],[0]],5,6]]
[[[],8,5],[10,[[8],6]]]
[[[8,5],2,5],[],[]]
[[10,10,[0,0,[4,1,10,5,6]],0,[[7,2],5]],[],[[[10,9],[1,2],[8,1]],6,2,10],[[[10,7],8,[1,9,6,6,10],5,5]]]
[[[[10,10,2],[6,6,6]],[5,5,[4,8,10,5,9]],5,[],[[2,6],4,7,[8,5,6],[2,3,9,2,1]]],[[5],7],[1,[2,3,[1,6,8,8,4]],9]]
[[9],[3],[2,[[],7,4,4,[7,2]],[1,[4,5,6,3]],5,[[7],9,9]]]
[[6],[[5,[8,7]],[[4,4,8,2],9]],[1,7,4,[[5],4,[2],10],10],[6,10,10,[]]]
[[10,4,[[5,0],[2,0,2,4,7],[8,3,7,1],8],[],6],[[4,[10,9]],1,10],[[[1,5,6,2,7],3],[[7,0,2,3],1],[[]]],[[5,[2,1,8],[2,3,9]],[[9,1],[3,3,1,2],[10,6,3,5,2]]],[]]
[[[1,6],[6,2,[3,8,10],[],[7]]],[],[8,[9,[9,1,2,4,10]],8,[],0],[]]
[[[[0],[0,10,7,8],10,9],3]]
[[8,1],[[[2,8,1,1],[],0]],[[],10,3,7]]
[[[1]],[[5,[3,3,0,8],[8,8,5,5,8],7,6],[6,[2,10,3,9],[4],[5,6,1,8,7],[0,9]],[[0,2,2],1,1,5,8],10],[2,3,[6,[9,9,8,1],[],2],7,5],[0,0,1,[],[9]]]
[[9,5],[8,[[10]]],[[[7]],8,2],[3,4],[9,[],[[4,4],3,[3],[9],[5]],[2,[7,3],[0,0],[10,8,2]],10]]
[[[[3,1,7,9],2,[0,0,1,4]],8],[[[7,4],9],[7,9,[],2,10],10],[[[0,2,2],4,6,3,6],2,4],[[8,[4,1,9,3],8,7],[[1],[1,0,6],9,9,5],4],[]]
[[7,2,[[6,5],[6,1],[3,5,5,3,3],9],[[0,7,2],[5,0,2,10,4],[8,3],[],10],0],[]]
[[2,9,1,10]]
[[],[9,10],[8,[[10,10,7,0],[10,2,1,9,3],1,[6,8,8]]],[],[[[10,2]],[[6,0,9,6,4],7],7]]
[[5,4,8,4]]
[[],[[6]],[[8,2,0,[]],[],2],[6,1,[10,2,5],[[],[10],[8,0]]],[[6,2],7,[8,[1]],[]]]
[[[5,6,[1,8],10],[9,[2,3,5,6,10],0,[4,3,5]],2],[],[1,9,1,9,[[],[1],4,10,[2,1,9,5,5]]],[3,2,[],6],[[],[],3,6,2]]
[[1,[[3],10,2,6]],[],[[10,7],2,[],[[],5,6,[2,10]]],[[[9,2],9],[[],4,[10,4,3],10,1],[[4,1,10],[0,3],7],[2,5,7,[0,9,8,5]]]]
[[[],8,[],3],[8,[4,[3,0],[6,6],7,[0,3,5,6]],10,[[10,8,1,1,1]],[]],[4],[4,7],[10,[],1,[9,[0,2],4,2,2],[[5],[1,2,3,7],0,7]]]
[[[10,4,[10,2]]],[[[7,5,8],4,[2,1]],4,9]]
[[0],[],[2,[[1,6,3,5,4],7],4,9]]
[[[2,[6,10,2,10],1,8,[]],10,[7,[],2],[[],5,1,[],4],1],[3,[[10,5,7],[1,5,8,3,9],[7,10,0,5,8]],[[0,4,7,2,1],[6,2,1],[3],0]],[0,2,3]]
[[9,10,3],[[3,[2,8,3],6,2,8],[0,[7]],0],[1,8,[[5,2]],[[7,6,6,5]]]]
[[[]],[10,10,9],[[[2],8],10,[]],[[],[7,[7,9,0],[],0],[2]],[[],[[10],[9,9,2,1,4]],7,4]]
[[2,4],[[1,7,3,5],8]]
[[],[5],[5,9],[2,3,[8,3,[0],2,6]]]
[[[[0,3],[9,2,5,9,4],[5,2,9,8],[5],9],[9,7,[2,4,8]],8,3,[[6],[2]]]]
[[7],[[],10,1,[[8,5,8],[8],[5],[1,2],6]],[9,[[2,2],10,[],4],[],[[3],9,[0,10,8,9]],5]]
[[[[]]],[8,6],[[]],[],[[6,2,5]]]
[[[2,10,[7,6,2]],[10,2],0,10],[[0,6],1,5,7],[10,[]]]
[[],[7,1,[]],[9,3,9],[6],[0,4]]
[[],[[[4,1,3],[10,9,8,7,9],7,[1,2],[8,0,2,5]],[6],6],[]]
[[],[[],[8],[[0,4],8,[7,8,3,9,9]],[],[[],[6,6,10],0]],[[1,1,[],[10,2,8,7]],[[9,6],[9,6,2,10],2,10,10]],[[8,[5,5,7]],[3,8],3],[[[6,0,2,2],[],8],[0,[7,5,4],4,[4],[1]],[8,6],5,3]]
[[[10,3],[[1,0,7,3],6,[1,1,2,10],5,[6,7,4]],[],[5]],[],[],[3,4,[[3,7,9,3,0],6,4]],[0,3,0]]
[[],[],[4,[10,7,[2,9,5]],[],[9,1],10]]
[[[],[2,[1,9],[]]],[],[],[],[6,9,[[6,8],5,2,[4,3,4,6,6]],[[5,2,3,8]],[[3,8],4,5,[4,2,4,1]]]]
[[7,[5,[4],4],1,[[2,5,8,2],0,[9,4]],1],[[9,4,8,[0],5]],[],[8,[5,[2,5,8,6,8],3,1]],[]]
[[[0,[9,6,2,7,9]],[8,[1,1,8]],4,[3],8],[[5,[8,6],3,1,5],4,8,[],[[1,1]]]]
[[],[[3,3],[[8,8],10,2],9,4],[0],[3]]
[[3],[],[8],[]]
[[[5,[8,5]],[9,2]],[[[4,9],[3,1],[2,7,5],[2,9,2]],0],[[2,10,2,[],[4,4,4]]],[[7,[1,2,5],[],9],[8,3,[3,8,0,1,10],0,5],1,7],[[[8,0,6,2],[],4,[10]],3,[],4,8]]
[[[[9,8,4,2,4],[0,2,0],5],[7,[4,7,10],[]],[[4,0],2],[8,[2,0,10,4],[7,6]]],[],[1,[[1,4,9,8,6],4]]]
""";
#endregion
}

View File

@@ -1,582 +1,151 @@
using System.Drawing;
using System.Collections.Frozen;
using System.Numerics;
using System.Text;
using Spectre.Console;
using Color = Spectre.Console.Color;
namespace AdventOfCode.Days;
public enum CellType
{
Air = 0,
Rock,
Sand
}
public class MapPath
{
public IEnumerable<Point> Points => _points;
private readonly IList<Point> _points;
public MapPath()
{
_points = new List<Point>();
}
public MapPath(IEnumerable<Point> points)
{
_points = new List<Point>(points);
}
public void AddPoint(Point point)
{
_points.Add(point);
}
public void DrawPath(CellType[,] map, int xOffset, int yOffset)
{
if (!_points.Any())
{
return;
}
// Draw each point
var previousPoint = _points.First();
foreach (var point in _points.Skip(1))
{
// Draw horizontally
if (previousPoint.X != point.X)
{
var xStart = Math.Min(previousPoint.X, point.X);
var xEnd = Math.Max(previousPoint.X, point.X);
for (int x = xStart; x <= xEnd; x++)
{
map[x + xOffset, point.Y + yOffset] = CellType.Rock;
}
}
// Draw vertically
else
{
var yStart = Math.Min(previousPoint.Y, point.Y);
var yEnd = Math.Max(previousPoint.Y, point.Y);
for (int y = yStart; y <= yEnd; y++)
{
map[point.X + xOffset, y + yOffset] = CellType.Rock;
}
}
// Use current point for next point drawing
previousPoint = point;
}
}
public void DrawPath(IDictionary<Point, CellType> map)
{
if (!_points.Any())
{
return;
}
// Draw each point
var previousPoint = _points.First();
foreach (var point in _points.Skip(1))
{
// Draw horizontally
if (previousPoint.X != point.X)
{
var xStart = Math.Min(previousPoint.X, point.X);
var xEnd = Math.Max(previousPoint.X, point.X);
for (int x = xStart; x <= xEnd; x++)
{
map[point with { X = x }] = CellType.Rock;
}
}
// Draw vertically
else
{
var yStart = Math.Min(previousPoint.Y, point.Y);
var yEnd = Math.Max(previousPoint.Y, point.Y);
for (int y = yStart; y <= yEnd; y++)
{
map[point with { Y = y }] = CellType.Rock;
}
}
// Use current point for next point drawing
previousPoint = point;
}
}
}
public class Day14 : Day
{
public override int Number => 14;
public override string Name => "Regolith Reservoir";
public override string Name => "Restroom Redoubt";
private readonly Point _sandSource = new(500, 0);
private Point _offsetSandSource;
private const int Height = 103;
private const int HeightCenter = Height / 2;
private const int Width = 101;
private const int WidthCenter = Width / 2;
private const int Iterations = 100;
public override void RunPart1(bool display = true)
{
var map = GenerateMap();
var robots = ParseRobots();
// Draw canvas
var canvas = GenerateCanvas(map);
canvas.SetPixel(_offsetSandSource.X, _offsetSandSource.Y, Color.IndianRed1);
// Simulate sand fall
int sandBlocksCount = 0;
while (GenerateSand(map, canvas, _offsetSandSource))
for (var i = 0; i < Iterations; i++)
{
sandBlocksCount++;
foreach (var robot in robots)
{
robot.Position = new Point(
Math.Abs((Width + robot.Position.X + robot.Velocity.X) % Width),
Math.Abs((Height + robot.Position.Y + robot.Velocity.Y) % Height)
);
}
}
// Compute safety factor
var safetyFactor =
robots.Count(r => r.Position is { X: < WidthCenter, Y: < HeightCenter }) *
robots.Count(r => r.Position is { X: > WidthCenter, Y: < HeightCenter }) *
robots.Count(r => r.Position is { X: < WidthCenter, Y: > HeightCenter }) *
robots.Count(r => r.Position is { X: > WidthCenter, Y: > HeightCenter });
if (display)
{
AnsiConsole.Write(canvas);
AnsiConsole.MarkupLine($"[green]Total sand blocks: [yellow]{sandBlocksCount}[/][/]");
AnsiConsole.MarkupLine($"[green]Safety factor: [yellow]{safetyFactor}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
var map = GenerateDictionaryMap();
var robots = ParseRobots();
// Compute ground level
var yMax = map.Keys.Max(p => p.Y);
var groundLevel = yMax + 2;
var canvas = new Canvas(Width, Height);
// Simulate sand fall
int sandBlocksCount = 0;
while (GenerateSand(map, _sandSource, groundLevel))
for (var i = 0; i < int.MaxValue; i++)
{
sandBlocksCount++;
}
for (var x = 0; x < Width; x++)
{
for (var y = 0; y < Height; y++)
{
canvas.SetPixel(x, y, Color.Grey23);
}
}
foreach (var robot in robots)
{
robot.Position = new Point(
Math.Abs((Width + robot.Position.X + robot.Velocity.X) % Width),
Math.Abs((Height + robot.Position.Y + robot.Velocity.Y) % Height)
);
if (display)
{
AnsiConsole.Write(GenerateCanvas(map, _sandSource));
canvas.SetPixel(robot.Position.X, robot.Position.Y, Color.Green1);
}
AnsiConsole.MarkupLine($"[green]Total sand blocks: [yellow]{sandBlocksCount}[/][/]");
// Display grid
if ((i + 1 - 46) % 101 == 0)
{
AnsiConsole.Write(canvas);
AnsiConsole.WriteLine();
AnsiConsole.Write($"Seconds elapsed: {i + 1}");
var key = Console.ReadKey(true).Key;
if (key is ConsoleKey.Enter)
{
AnsiConsole.WriteLine();
AnsiConsole.WriteLine();
AnsiConsole.MarkupLine($"[green]Image at instant: [yellow]t={i + 1}s[/][/]");
break;
}
AnsiConsole.Clear();
}
}
}
private static bool GenerateSand(CellType[,] map, Canvas canvas, in Point sandSource)
private List<Robot> ParseRobots()
{
// Stop if source is blocked
if (map[sandSource.X, sandSource.Y] == CellType.Sand)
var robots = new List<Robot>();
foreach (var line in Input.AsSpan().EnumerateLines())
{
return false;
var positionX = int.Parse(line[(line.IndexOf('=') + 1)..line.IndexOf(',')]);
var positionY = int.Parse(line[(line.IndexOf(',') + 1)..line.IndexOf(' ')]);
var velocityX = int.Parse(line[(line.LastIndexOf('=') + 1)..line.LastIndexOf(',')]);
var velocityY = int.Parse(line[(line.LastIndexOf(',') + 1)..]);
robots.Add(new Robot(new Point(positionX, positionY), new Point(velocityX, velocityY)));
}
var width = map.GetLength(0);
var height = map.GetLength(1);
var sandPosition = new Point(sandSource.X, sandSource.Y);
// Make sand fall till we don't go outbound
while (sandPosition.X >= 0 && sandPosition.X < width && sandPosition.Y >= 0 && sandPosition.Y < height)
{
// Fall outbound below
if (sandPosition.Y + 1 >= height)
{
return false;
}
// Try below
if (map[sandPosition.X, sandPosition.Y + 1] == CellType.Air)
{
sandPosition.Y += 1;
continue;
}
// Fall outbound on the left
if (sandPosition.X - 1 < 0)
{
return false;
}
// Try on the left
if (map[sandPosition.X - 1, sandPosition.Y + 1] == CellType.Air)
{
sandPosition.X -= 1;
sandPosition.Y += 1;
continue;
}
// Fall outbound on the right
if (sandPosition.X + 1 >= width)
{
return false;
}
// Lastly try on the right
if (map[sandPosition.X + 1, sandPosition.Y + 1] == CellType.Air)
{
sandPosition.X += 1;
sandPosition.Y += 1;
continue;
}
// Can't go anywhere, stop
break;
}
map[sandPosition.X, sandPosition.Y] = CellType.Sand;
canvas.SetPixel(sandPosition.X, sandPosition.Y, Color.SandyBrown);
return true;
return robots;
}
private static bool GenerateSand(IDictionary<Point, CellType> map, in Point sandSource, int groundY)
private class Robot(Point position, Point velocity)
{
// Stop if source is blocked
if (map.GetValueOrDefault(sandSource, CellType.Air) == CellType.Sand)
public Point Position { get; set; } = position;
public Point Velocity { get; } = velocity;
}
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 false;
return new Point(left.X + right.X, left.Y + right.Y);
}
var sandPosition = new Point(sandSource.X, sandSource.Y);
// Make sand fall till we don't go outbound
while (true)
public static Point operator -(Point left, Point right)
{
// Sand is touching ground, stop here
if (sandPosition.Y + 1 >= groundY)
{
break;
}
// Try below
var below = sandPosition with { Y = sandPosition.Y + 1 };
if (map.GetValueOrDefault(below, CellType.Air) == CellType.Air)
{
sandPosition = below;
continue;
}
// Try on the left
var left = new Point(sandPosition.X - 1, sandPosition.Y + 1);
if (map.GetValueOrDefault(left, CellType.Air) == CellType.Air)
{
sandPosition = left;
continue;
}
// Lastly try on the right
var right = new Point(sandPosition.X + 1, sandPosition.Y + 1);
if (map.GetValueOrDefault(right, CellType.Air) == CellType.Air)
{
sandPosition = right;
continue;
}
// Can't go anywhere, stop
break;
return new Point(left.X - right.X, left.Y - right.Y);
}
map[sandPosition] = CellType.Sand;
return true;
}
private static Canvas GenerateCanvas(CellType[,] map)
{
var width = map.GetLength(0);
var height = map.GetLength(1);
var canvas = new Canvas(width, height);
for (int x = 0; x < width; x++)
public static Point operator *(Point left, int right)
{
for (int y = 0; y < height; y++)
{
canvas.SetPixel(x, y, ColorCellType(map[x, y]));
}
return new Point(left.X * right, left.Y * right);
}
return canvas;
}
private static Canvas GenerateCanvas(IDictionary<Point, CellType> map, in Point sandSource)
{
// Compute dimensions
var xMin = map.Keys.Min(p => p.X);
var xMax = map.Keys.Max(p => p.X);
var yMin = map.Keys.Min(p => p.Y);
var yMax = map.Keys.Max(p => p.Y);
var width = xMax - xMin + 1;
var height = yMax - yMin + 1;
var canvas = new Canvas(width, height);
// Fill background
for (int x = xMin; x <= xMax; x++)
public static Point operator *(int left, Point right)
{
for (int y = yMin; y <= yMax; y++)
{
canvas.SetPixel(x - xMin, y - yMin, Color.Grey23);
}
return new Point(right.X * left, right.Y * left);
}
// Fill canvas
foreach (var (point, cellType) in map)
{
canvas.SetPixel(point.X - xMin, point.Y - yMin, ColorCellType(cellType));
}
canvas.SetPixel(sandSource.X - xMin, sandSource.Y - yMin, Color.IndianRed1);
return canvas;
public static implicit operator Point((int X, int Y) point)
=> new(point.X, point.Y);
}
private CellType[,] GenerateMap()
{
var paths = Input.ReadAllLines()
.Select(line => new MapPath(line.Split(" -> ")
.Select(p => p.Split(','))
.Select(s => new Point(int.Parse(s[0]), int.Parse(s[1])))))
.ToList();
// Compute xMin, xMax, yMin, yMax
int xMin = paths.SelectMany(p => p.Points).Min(p => p.X);
int xMax = paths.SelectMany(p => p.Points).Max(p => p.X);
int yMax = paths.SelectMany(p => p.Points).Max(p => p.Y);
// Construct 2D map
var width = xMax - xMin + 1;
var height = yMax + 1;
var map = new CellType[width, height];
// Fill rocks
paths.ForEach(p => p.DrawPath(map, -xMin, 0));
// Compute new sand source
_offsetSandSource = _sandSource;
_offsetSandSource.Offset(-xMin, 0);
return map;
}
private static Color ColorCellType(CellType cellType)
{
return cellType switch
{
CellType.Air => Color.Grey23,
CellType.Rock => Color.LightSlateGrey,
CellType.Sand => Color.SandyBrown,
_ => throw new Exception("Invalid CellType")
};
}
private static IDictionary<Point, CellType> GenerateDictionaryMap()
{
var paths = Input.ReadAllLines()
.Select(line => new MapPath(line.Split(" -> ")
.Select(p => p.Split(','))
.Select(s => new Point(int.Parse(s[0]), int.Parse(s[1])))))
.ToList();
// Construct 2D map
var map = new Dictionary<Point, CellType>();
// Fill rocks
paths.ForEach(p => p.DrawPath(map));
return map;
}
#region Input
public const string Input =
"""
521,171 -> 525,171
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
503,109 -> 507,109
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
503,150 -> 503,154 -> 501,154 -> 501,162 -> 513,162 -> 513,154 -> 507,154 -> 507,150
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
503,150 -> 503,154 -> 501,154 -> 501,162 -> 513,162 -> 513,154 -> 507,154 -> 507,150
481,79 -> 481,81 -> 478,81 -> 478,89 -> 490,89 -> 490,81 -> 485,81 -> 485,79
488,38 -> 493,38
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
482,93 -> 496,93 -> 496,92
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
497,29 -> 502,29
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
501,32 -> 506,32
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
490,16 -> 490,20 -> 484,20 -> 484,26 -> 499,26 -> 499,20 -> 494,20 -> 494,16
503,115 -> 507,115
524,173 -> 528,173
481,79 -> 481,81 -> 478,81 -> 478,89 -> 490,89 -> 490,81 -> 485,81 -> 485,79
486,47 -> 490,47
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
490,16 -> 490,20 -> 484,20 -> 484,26 -> 499,26 -> 499,20 -> 494,20 -> 494,16
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
495,50 -> 499,50
492,41 -> 496,41
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
522,177 -> 522,178 -> 536,178 -> 536,177
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
503,121 -> 507,121
503,150 -> 503,154 -> 501,154 -> 501,162 -> 513,162 -> 513,154 -> 507,154 -> 507,150
515,121 -> 519,121
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
498,35 -> 503,35
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
503,171 -> 507,171
509,121 -> 513,121
494,12 -> 494,13 -> 507,13 -> 507,12
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
500,112 -> 504,112
488,124 -> 488,126 -> 485,126 -> 485,129 -> 496,129 -> 496,126 -> 491,126 -> 491,124
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
488,124 -> 488,126 -> 485,126 -> 485,129 -> 496,129 -> 496,126 -> 491,126 -> 491,124
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
512,173 -> 516,173
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
502,38 -> 507,38
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
503,150 -> 503,154 -> 501,154 -> 501,162 -> 513,162 -> 513,154 -> 507,154 -> 507,150
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
506,169 -> 510,169
490,16 -> 490,20 -> 484,20 -> 484,26 -> 499,26 -> 499,20 -> 494,20 -> 494,16
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
503,150 -> 503,154 -> 501,154 -> 501,162 -> 513,162 -> 513,154 -> 507,154 -> 507,150
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
488,124 -> 488,126 -> 485,126 -> 485,129 -> 496,129 -> 496,126 -> 491,126 -> 491,124
491,121 -> 495,121
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
518,173 -> 522,173
501,50 -> 505,50
497,115 -> 501,115
498,47 -> 502,47
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
518,169 -> 522,169
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
489,44 -> 493,44
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
481,79 -> 481,81 -> 478,81 -> 478,89 -> 490,89 -> 490,81 -> 485,81 -> 485,79
509,167 -> 513,167
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
487,133 -> 487,134 -> 501,134
481,79 -> 481,81 -> 478,81 -> 478,89 -> 490,89 -> 490,81 -> 485,81 -> 485,79
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
512,118 -> 516,118
490,16 -> 490,20 -> 484,20 -> 484,26 -> 499,26 -> 499,20 -> 494,20 -> 494,16
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
512,165 -> 516,165
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
491,35 -> 496,35
500,173 -> 504,173
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
490,16 -> 490,20 -> 484,20 -> 484,26 -> 499,26 -> 499,20 -> 494,20 -> 494,16
503,150 -> 503,154 -> 501,154 -> 501,162 -> 513,162 -> 513,154 -> 507,154 -> 507,150
483,50 -> 487,50
481,79 -> 481,81 -> 478,81 -> 478,89 -> 490,89 -> 490,81 -> 485,81 -> 485,79
500,118 -> 504,118
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
492,47 -> 496,47
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
495,38 -> 500,38
494,12 -> 494,13 -> 507,13 -> 507,12
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
494,118 -> 498,118
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
488,124 -> 488,126 -> 485,126 -> 485,129 -> 496,129 -> 496,126 -> 491,126 -> 491,124
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
488,124 -> 488,126 -> 485,126 -> 485,129 -> 496,129 -> 496,126 -> 491,126 -> 491,124
509,115 -> 513,115
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
506,173 -> 510,173
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
481,79 -> 481,81 -> 478,81 -> 478,89 -> 490,89 -> 490,81 -> 485,81 -> 485,79
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
505,35 -> 510,35
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
506,118 -> 510,118
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
503,150 -> 503,154 -> 501,154 -> 501,162 -> 513,162 -> 513,154 -> 507,154 -> 507,150
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
509,171 -> 513,171
494,12 -> 494,13 -> 507,13 -> 507,12
509,38 -> 514,38
488,124 -> 488,126 -> 485,126 -> 485,129 -> 496,129 -> 496,126 -> 491,126 -> 491,124
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
495,44 -> 499,44
482,93 -> 496,93 -> 496,92
515,171 -> 519,171
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
481,79 -> 481,81 -> 478,81 -> 478,89 -> 490,89 -> 490,81 -> 485,81 -> 485,79
522,177 -> 522,178 -> 536,178 -> 536,177
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
497,147 -> 497,137 -> 497,147 -> 499,147 -> 499,146 -> 499,147 -> 501,147 -> 501,142 -> 501,147 -> 503,147 -> 503,144 -> 503,147 -> 505,147 -> 505,140 -> 505,147
515,167 -> 519,167
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
506,112 -> 510,112
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
522,177 -> 522,178 -> 536,178 -> 536,177
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
488,124 -> 488,126 -> 485,126 -> 485,129 -> 496,129 -> 496,126 -> 491,126 -> 491,124
487,133 -> 487,134 -> 501,134
497,121 -> 501,121
476,63 -> 476,58 -> 476,63 -> 478,63 -> 478,55 -> 478,63 -> 480,63 -> 480,56 -> 480,63 -> 482,63 -> 482,57 -> 482,63 -> 484,63 -> 484,55 -> 484,63 -> 486,63 -> 486,55 -> 486,63
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
489,50 -> 493,50
465,76 -> 465,71 -> 465,76 -> 467,76 -> 467,72 -> 467,76 -> 469,76 -> 469,68 -> 469,76 -> 471,76 -> 471,73 -> 471,76 -> 473,76 -> 473,71 -> 473,76 -> 475,76 -> 475,70 -> 475,76 -> 477,76 -> 477,71 -> 477,76 -> 479,76 -> 479,73 -> 479,76 -> 481,76 -> 481,74 -> 481,76 -> 483,76 -> 483,72 -> 483,76
512,169 -> 516,169
490,16 -> 490,20 -> 484,20 -> 484,26 -> 499,26 -> 499,20 -> 494,20 -> 494,16
494,32 -> 499,32
490,16 -> 490,20 -> 484,20 -> 484,26 -> 499,26 -> 499,20 -> 494,20 -> 494,16
488,106 -> 488,97 -> 488,106 -> 490,106 -> 490,100 -> 490,106 -> 492,106 -> 492,101 -> 492,106 -> 494,106 -> 494,105 -> 494,106 -> 496,106 -> 496,96 -> 496,106 -> 498,106 -> 498,102 -> 498,106 -> 500,106 -> 500,101 -> 500,106 -> 502,106 -> 502,102 -> 502,106 -> 504,106 -> 504,100 -> 504,106
""";
#endregion
}

View File

@@ -1,292 +1,193 @@
using System.Collections.Concurrent;
using System.Drawing;
using System.Collections.Frozen;
using System.Numerics;
using System.Text;
using Spectre.Console;
namespace AdventOfCode.Days;
public class SensorBeaconPair
{
public Point SensorPosition { get; }
public Point BeaconPosition { get; }
public int SensorRange =>
Math.Abs(SensorPosition.X - BeaconPosition.X) + Math.Abs(SensorPosition.Y - BeaconPosition.Y);
public SensorBeaconPair(in Point sensorPosition, in Point beaconPosition)
{
SensorPosition = sensorPosition;
BeaconPosition = beaconPosition;
}
}
public class CoverRange
{
public int Start { get; }
public int End { get; }
public int Covered => End - Start + 1;
public CoverRange(int start, int end)
{
Start = start;
End = end;
}
public CoverRange(CoverRange coverRange)
{
Start = coverRange.Start;
End = coverRange.End;
}
public CoverRange Subtract(CoverRange other)
{
// Overlap on left
int newStart;
if (other.Start <= Start && other.End >= Start)
{
newStart = other.End + 1;
}
else
{
newStart = Start;
}
// Overlap on right
int newEnd;
if (other.Start <= End && other.End >= End)
{
newEnd = other.Start - 1;
}
else
{
newEnd = End;
}
return new CoverRange(newStart, newEnd);
}
public static CoverRange operator -(CoverRange left, CoverRange right)
{
return left.Subtract(right);
}
}
public class Day15 : Day
{
public override int Number => 15;
public override string Name => "Beacon Exclusion Zone";
public override string Name => "Warehouse Woes";
private const int Size = 50;
private const char Wall = '#';
private const char Box = 'O';
private const char Empty = '.';
private const char InstructionLeft = '<';
private const char InstructionRight = '>';
private const char InstructionUp = '^';
private const char InstructionDown = 'v';
public override void RunPart1(bool display = true)
{
const int targetY = 2_000_000;
var (map, position, instructions) = ParseMap();
// Parse pairs
var pairs = ParsePairs();
var ranges = new List<CoverRange>(pairs.Count);
// Get which columns are included on line targetY, remove the ones which already contains a beacon
var beaconsOnTargetY = new HashSet<int>();
foreach (var sensorBeaconPair in pairs)
foreach (var instruction in instructions)
{
// Get covered columns on y line
var xCenter = sensorBeaconPair.SensorPosition.X;
var coveredColumns = sensorBeaconPair.SensorRange - Math.Abs(sensorBeaconPair.SensorPosition.Y - targetY);
if (coveredColumns > 0)
var direction = instruction switch
{
ranges.Add(new CoverRange(xCenter - coveredColumns, xCenter + coveredColumns));
InstructionLeft => new Point(-1, 0),
InstructionRight => new Point(1, 0),
InstructionUp => new Point(0, -1),
InstructionDown => new Point(0, 1),
_ => throw new ArgumentException($"Invalid instruction: {instruction}")
};
// Check if the beacon is on targetY
if (sensorBeaconPair.BeaconPosition.Y == targetY)
var destination = position + direction;
// Destination is free, just move
if (map[destination.X, destination.Y] is not (Wall or Box))
{
position = destination;
}
// Destination is a box, check if there is a free space further up and move accordingly
else if (map[destination.X, destination.Y] is Box)
{
var pushTarget = destination + direction;
while (map[pushTarget.X, pushTarget.Y] is Box)
{
beaconsOnTargetY.Add(sensorBeaconPair.BeaconPosition.X);
pushTarget += direction;
}
}
}
// Remove overlapped ranges => inner.Start >= outer.Start && inner.End <= outer.End));
ranges.RemoveAll(inner =>
ranges.Where(outer => outer != inner).Any(outer => inner.Start >= outer.Start && inner.End <= outer.End));
// Compute unique number of x columns
long totalCovered = 0;
for (int i = 0; i < ranges.Count; i++)
{
var range = ranges[i];
var coverRange = range;
// Add number of covered columns and then subtract common ones
for (int j = i + 1; j < ranges.Count; j++)
{
var exclude = ranges[j];
coverRange -= exclude;
}
totalCovered += coverRange.Covered;
}
// Remove lines which contains a beacon
totalCovered -= beaconsOnTargetY.Count;
// Print total covered columns on line Y
if (display)
{
AnsiConsole.MarkupLine($"[green]Number of positions that cannot contain a beacon: [yellow]{totalCovered}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
const int xMin = 0;
const int xMax = 4_000_000;
const int yMin = 0;
const int yMax = 4_000_000;
bool IsOutbound(Point point) => point.X is < xMin or > xMax || point.Y is < yMin or > yMax;
// Parse pairs
var pairs = ParsePairs();
// Find all points that are just outside a sensor range
var possiblePoints = new ConcurrentBag<Point>();
Parallel.For(0, pairs.Count, i =>
{
var pair = pairs[i];
var sensor = pair.SensorPosition;
var distance = pair.SensorRange + 1;
for (int x = -distance; x <= distance; x++)
{
var y = distance - Math.Abs(x);
var positivePoint = new Point(sensor.X + x, sensor.Y + y);
var negativePoint = new Point(sensor.X + x, sensor.Y - y);
// If both points are outbound, just skip
var positiveIsOutbound = IsOutbound(positivePoint);
var negativeIsOutbound = IsOutbound(negativePoint);
if (positiveIsOutbound && negativeIsOutbound)
// Cannot move anything since there is a wall
if (map[pushTarget.X, pushTarget.Y] is Wall)
{
continue;
}
// Check if this point is just outside at least one other sensor range
for (int otherIndex = 0; otherIndex < pairs.Count; otherIndex++)
// Move robot and boxes (only need to move first and last box of a chain)
position = destination;
map[destination.X, destination.Y] = Empty;
map[pushTarget.X, pushTarget.Y] = Box;
}
// Else destination is a wall, do nothing
}
var coordinatesSum = 0;
// Count gps coordinates
for (var x = 0; x < Size; x++)
{
for (var y = 0; y < Size; y++)
{
if (map[x, y] is Box)
{
if (otherIndex == i)
{
continue;
}
coordinatesSum += 100 * y + x;
var otherPair = pairs[otherIndex];
var otherSensor = otherPair.SensorPosition;
var otherDistance = otherPair.SensorRange + 1;
if (!positiveIsOutbound)
{
var distancePositive = Math.Abs(positivePoint.X - otherSensor.X) +
Math.Abs(positivePoint.Y - otherSensor.Y);
if (distancePositive == otherDistance)
{
possiblePoints.Add(positivePoint);
}
}
if (!negativeIsOutbound)
{
var distanceNegative = Math.Abs(negativePoint.X - negativePoint.X) +
Math.Abs(negativePoint.Y - negativePoint.Y);
if (distanceNegative == otherDistance)
{
possiblePoints.Add(negativePoint);
}
}
}
}
});
// Keep the only outside detection point
var finalPoint = possiblePoints.First(f =>
pairs.All(p => Math.Abs(f.X - p.SensorPosition.X) + Math.Abs(f.Y - p.SensorPosition.Y) > p.SensorRange));
var tuningFrequency = finalPoint.X * (long) 4_000_000 + finalPoint.Y;
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Tuning frequency: [yellow]{tuningFrequency}[/][/]");
AnsiConsole.MarkupLine($"[green]Sum of boxes GPS coordinates: [yellow]{coordinatesSum}[/][/]");
}
}
private static IList<SensorBeaconPair> ParsePairs()
private static void DisplayGrid(char[,] map)
{
var pairs = new List<SensorBeaconPair>();
foreach (var line in Input.ReadAllLines())
for (var y = 0; y < Size; y++)
{
var span = line.AsSpan();
for (var x = 0; x < Size; x++)
{
AnsiConsole.Write(map[x, y]);
}
// Parse sensor position
int sensorXStart = span.IndexOf('=') + 1;
int sensorXEnd = span.IndexOf(',');
var sensorX = int.Parse(span[sensorXStart..sensorXEnd]);
span = span[sensorXEnd..];
int sensorYStart = span.IndexOf('=') + 1;
int sensorYEnd = span.IndexOf(':');
var sensorY = int.Parse(span[sensorYStart..sensorYEnd]);
span = span[sensorYEnd..];
// Parse beacon
int beaconXStart = span.IndexOf('=') + 1;
int beaconXEnd = span.IndexOf(',');
var beaconX = int.Parse(span[beaconXStart..beaconXEnd]);
span = span[beaconXEnd..];
int beaconYStart = span.IndexOf('=') + 1;
var beaconY = int.Parse(span[beaconYStart..]);
pairs.Add(new SensorBeaconPair(new Point(sensorX, sensorY), new Point(beaconX, beaconY)));
AnsiConsole.WriteLine();
}
return pairs;
AnsiConsole.WriteLine();
}
#region Input
public override void RunPart2(bool display = true)
{
public const string Input =
"""
Sensor at x=1384790, y=3850432: closest beacon is at x=2674241, y=4192888
Sensor at x=2825953, y=288046: closest beacon is at x=2154954, y=-342775
Sensor at x=3553843, y=2822363: closest beacon is at x=3444765, y=2347460
Sensor at x=2495377, y=3130491: closest beacon is at x=2761496, y=2831113
Sensor at x=1329263, y=1778185: closest beacon is at x=2729595, y=2000000
Sensor at x=2882039, y=2206085: closest beacon is at x=2729595, y=2000000
Sensor at x=3903141, y=2510440: closest beacon is at x=4006219, y=3011198
Sensor at x=3403454, y=3996578: closest beacon is at x=3754119, y=4475047
Sensor at x=3630476, y=1048796: closest beacon is at x=3444765, y=2347460
Sensor at x=16252, y=2089672: closest beacon is at x=-276514, y=2995794
Sensor at x=428672, y=1150723: closest beacon is at x=-281319, y=668868
Sensor at x=2939101, y=3624676: closest beacon is at x=2674241, y=4192888
Sensor at x=3166958, y=2890076: closest beacon is at x=2761496, y=2831113
Sensor at x=3758241, y=3546895: closest beacon is at x=4006219, y=3011198
Sensor at x=218942, y=3011070: closest beacon is at x=-276514, y=2995794
Sensor at x=52656, y=3484635: closest beacon is at x=-276514, y=2995794
Sensor at x=2057106, y=405314: closest beacon is at x=2154954, y=-342775
Sensor at x=1966905, y=2495701: closest beacon is at x=2761496, y=2831113
Sensor at x=511976, y=2696731: closest beacon is at x=-276514, y=2995794
Sensor at x=3094465, y=2478570: closest beacon is at x=3444765, y=2347460
Sensor at x=806671, y=228252: closest beacon is at x=-281319, y=668868
Sensor at x=3011731, y=1976307: closest beacon is at x=2729595, y=2000000
""";
}
#endregion
private (char[,] Map, Point Start, List<char> Instructions) ParseMap()
{
var readingMap = true;
var map = new char[Size, Size];
Point start = default;
var instructions = new List<char>();
var y = 0;
foreach (var line in Input.AsSpan().EnumerateLines())
{
if (line.IsWhiteSpace())
{
readingMap = false;
continue;
}
if (readingMap)
{
var x = 0;
foreach (var symbol in line)
{
map[x, y] = Empty;
if (symbol is Wall or Box)
{
map[x, y] = symbol;
}
else if (symbol is '@')
{
start = new Point(x, y);
}
x++;
}
y++;
}
else
{
foreach (var instruction in line)
{
instructions.Add(instruction);
}
}
}
return (map, start, instructions);
}
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);
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -5,365 +5,105 @@ namespace AdventOfCode.Days;
public class Day3 : Day
{
public override int Number => 3;
public override string Name => "Rucksack Reorganization";
public override string Name => "Mull It Over";
public override void RunPart1(bool display = true)
{
long sum = 0;
var result = 0;
foreach (var line in Input.ReadAllLines())
var input = Input.AsSpan();
var mulStart = input.IndexOf("mul(");
while (mulStart != -1)
{
var middle = line.Length / 2;
var firstCompartment = line[..middle];
var secondCompartment = line[middle..];
input = input[(mulStart + 4)..];
var common = firstCompartment.Intersect(secondCompartment).First();
// Start of a mul operation, search the ending parenthesis and make sure it's before the next mul
var mulEnd = input.IndexOf(")");
var nextMulStart = input.IndexOf("mul(");
sum += CharToPriority(common);
if (mulEnd != -1 && (nextMulStart == -1 || mulEnd < nextMulStart))
{
var operands = input[..mulEnd];
var separator = operands.IndexOf(",");
if (separator != -1
&& int.TryParse(operands[..separator], out var left)
&& int.TryParse(operands[(separator + 1)..], out var right))
{
result += left * right;
}
}
mulStart = nextMulStart;
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Sum of priorities is: [yellow]{sum}[/][/]");
AnsiConsole.MarkupLine($"[green]Result: [yellow]{result}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
long sum = 0;
var result = 0;
foreach (var group in Input.ReadAllLines().Chunk(3))
var input = Input.AsSpan();
var mulStart = input.IndexOf("mul(");
while (mulStart != -1)
{
var firstBag = group[0];
var secondBag = group[1];
var thirdBag = group[2];
// Check if there is a "don't()" before next mul
var dontStart = input.IndexOf("don't()");
var common = firstBag.Intersect(secondBag).Intersect(thirdBag).First();
if (dontStart < mulStart)
{
// Search for next "do()"
input = input[(dontStart + 7)..];
sum += CharToPriority(common);
var doStart = input.IndexOf("do()");
if (doStart == -1)
{
break;
}
input = input[(doStart + 4)..];
// Update next mult position
mulStart = input.IndexOf("mul(");
if (mulStart == -1)
{
break;
}
}
input = input[(mulStart + 4)..];
// Start of a mul operation, search the ending parenthesis and make sure it's before the next mul
var mulEnd = input.IndexOf(")");
var nextMulStart = input.IndexOf("mul(");
if (mulEnd != -1 && (nextMulStart == -1 || mulEnd < nextMulStart))
{
var operands = input[..mulEnd];
var separator = operands.IndexOf(",");
if (separator != -1
&& int.TryParse(operands[..separator], out var left)
&& int.TryParse(operands[(separator + 1)..], out var right))
{
result += left * right;
}
}
mulStart = nextMulStart;
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Sum of priorities is: [yellow]{sum}[/][/]");
AnsiConsole.MarkupLine($"[green]Result: [yellow]{result}[/][/]");
}
}
private static int CharToPriority(char c)
{
if (char.IsLower(c))
{
return c - 'a' + 1;
}
return c - 'A' + 27;
}
#region Input
public const string Input =
"""
DsPhSBQQQhqmBDhPDsFwjwsLjlRjlttvjvvtRb
rNJMNNbrHrtjHLHjvwtg
fNbNzZdrZnMnMPnQShFPDmnqFm
QWVCFfQffgQCVZzVVpHsHJBqtpspJFRHqq
mwDbmnnGNlNcwNDDNRbnNDlJTpBJBtJGtPTLsBGqTqqsqp
MlSdnScRnnmmDjSdNSdCzvggWzrgzjvfvrgVzW
gsMljbrjlZlWcWMJrWwTwbmwQbmmLDQQLhwL
CdgpzdgpgnfThHfFRwhfRf
SptgpSpnCNpVSGNPvPGSddcMWjMrjqBsJcWqMcBWcVlZ
JcJLQQFWhQJPJpWcwjHvMQvnnlMvzBHd
tCtGZrmVRmVGTVTtCfRTCHHNNvdNzmdMvMlNzvwdvw
CTGGRftfSGtGTGDLbFchSgSWWWcM
QcMFQrvrQbvtczbVbjbMzZzRpqmDDmqqnNzCDCDC
SHHfPJssGLPSdHThLhHdRmqNmNssnNmNCNnpjmsn
LhLJfTdLJwfgPTdfGccrtjcMrccwvcrrFr
jFLLLqDGjbtqLCChpMMhMBvpwMTmffpZ
ZnJHRncHHgnrsrZffTdMdMBfmMvfvR
NWWPnZrVHrZPCDDQtzDCPLCq
jpFjvBZhDFHZdwcmslcslBLLNl
dVtTVVCzzfrrMPNLLcnVcPLRns
CrzWzTqdWtGCzJtbJCrMjjDFHZQjZSpvFGFgHhHp
JjJqMctnhtDZDQtf
TrFFlrrCCHPwHwlPHFPzDhsffQQDsVfWwVJQJB
HHHGdFlHldTpCCFFlLHdCRJccMnqvqMgnNjjMjjvLMLcSv
cMfFcMFcrqgJLFZdrTDdthPGsGmtGs
WwjNwnjjBQzVVQHwRDnmtPGhPPsPnnTGld
bWHBjWVzpbRzbmScqgZMFcqf
RJjPTBJhTNNjfPhRBdqtlgdbGldwtCPgdb
ZmrHHmzpvSvvpzvmvDVCGlWVwCWtGtWCddggqf
QQpzFrHHQnzHvfTcNshcLRNFJhcR
QrPQDrppBQmCmFQm
TzqzsLfmsfSTfqzVLftNdJJNJGCwwGdgCwSGNC
TVHTfzWsfftsZstnbvrbWbrbppPbrmmP
BQrfqrLtJnttqqtQBJDDtBnDzRgldhVVpJlgzpzhpzsgslhV
TTNcPZCvZjmPFZjvPHLlWdNLghVhzzlllpVd
jcFPbTcZTFcmcjMjjFjbLwbnDBtfqbtBwfwSBnrbGw
SZJNJtrNzjjNCzlBBmqmQDBBmDBBjB
PGPbGwhLsnvwnVbGPVMZsDsTBBgcZgBBDBfDBf
pnnhhvphGVpvRPnJlSFRNNJHZHSdSR
hbmDDmwnnVGbhmjNrrWwLNLsWBrw
dMrgvcQqdjlBLlfW
HzzPSrcHqFHQgzpPcMpQqrtmbbbRhHHVGnZDnVHhVbVZ
RwtvdPRvSlTQmHHBQBRL
FjVSjrsFVnFQnTHmnT
VCVVMrWWjVGgbcNVGCCVdlvfdqfvwbSzwqfwZzwv
fmPDwJPDFRmRgPdwwwDNwgwPzhSQzVSzVTQdzHZzHhzQMQzQ
sWtGCWtpcqqpNnQjjzhVTTVQczhj
tWBGntsCNlqrWswDRfFrbFrPDbPf
dmzmjcbQjjQztFNqsqBcMJqNPF
nlTWnClWwQDTVnTrsMsCRBPZRJRJqRJq
wTrhwpVVvgvlDpTvVWVDdLfzgbLtbzSQLSzzjzLz
RWZdHvRdBRGbbvCjJnbn
pqqpSwzpSSbCwPwjlwjl
gDzzqSVzqrThpDBtRtCZdQRQLrQQ
GRqTGqtmTVdGHHVVNNlhPlMqbNqNDbqW
LzQSdFnfznfwBcLcnFppBBDDMPMPhDbhlwbWPlbWMjrD
QznFnLZFvVvHRgsddG
BBHBfBHFdSltmWJvqtNtHq
TQDrrVMzVDnWnNZDJc
gWzprTCrCMQzGGjjhwFwdffjfl
LLLSSSzBBlBLsszncCBZSPSMMMpdWTdrmmnfVGVmMfmrmm
DghttvwhHRvjJthNJwhVtDHGpddMWdMmrMmfGdppjWTfpq
gbJRthQDDRvwtDhQhDFPcVcbPczLzPBScBBF
sZsZpTtLCsbspZtTwrCwrwtDmNNdJmmqSJfqmfNGNmHqGdqb
nQvjTcjQglFVlllMFMVFqWfNqnNHHHdfSfHqfSJq
hFvvgFcFVzphpTrrwZDp
qJqfhsBpfSpchpqcrqwCDvvCDQndmpwDtnRQ
jWHPZWWjZsCmCWRDmQ
PPzMGHlzMNsPLPlZsllgsNrhNVBqhFVBbBSqFFBFrV
RnRsFFdSzmgwvQsqwc
lbgHGMBHlWWWlfWGGBtGwqDpDwmcpMrrqrQDZrMZ
GGJLBVJbVGjGtHVfJtWGHBLLPdzdCghnRnRnSShgNnhnddhj
VgzLFjjwhhSwFhVZgRhRgHHCCvdZdrqqCTvBCrqvvr
ncnNbGMcPpvHFrssdBHM
cnctcNNbQGWFJctftgVmzShzzwwVwgmwfR
pFWmSSFGQlvTbwWTwH
jdBgNhRgMftNBhPbhHnZHlTTZcwZ
lfBNRjCtCfMjsBfCjgfNBRMppGpJqsJQGrrmmJDpGmDDFG
GznngnhzccVdgjbbVjVjVbVLwwQJmQMrLTZhJmZLQTJWmm
pDBSslPCFPCpvCqvpPBQTlQLrdlJWrLJLmrlrr
psSsBptpCBdjtcjNVcGG
sssppsmchwspFLtvHhQJMtFb
rRLDqRVLNSMvFSSV
WDrLnzrDqzRqRzzfLgRnzrnsssZZZsZBgCwwmBppwBspZc
MtPbwvzzVtzfsqGGVpdSjsLd
DnNRCDJBnHJDHDnrDTRcnNZpZSsSLqjpdqqqSMqdddTj
CFRFRFHgDRnRgMtfFvvwzwvwvzWv
PNpFPncvvchPpNjpFhvPhPLmBwMgDRRwRgMDhBmLzBDD
trHSrdTtslWrSWmfzgmMnfBzmn
JsrQsJHHlsVqTjjpbbNnQNNpGG
sVQCdsmGlnlCmnGmQQhGCJJNvNjpgqhqhvPgpgPqjpcpcW
DMSfSbHLHbSDBBzLNvccWRcddvPjNj
FSwHfTFdFsmJlnTTmV
FctwtTTCScvShFqtwScrcTSCJQGNndGHWJNQHWHZdgJrJgGN
jspLlfPlpfsDjBspfllWgdWHQggZHngHNGdsWJ
lRMpBlPmSFRTcvZv
TVZpRRVvFRVpTZRfFhFvvzGVwrwwwdDBMwQrgcDtMtDDwZrL
jsNsWqWjNQCNWbjPMcBLPgBtrdMwdrdL
SJSsmqlSNljbmlNjsbQVffzGRvzmmVhQpVGz
BFFMvcwMwwpFFfpbDMqPVgLVgmLDPR
JtSsSzJssQJJWjRZzgLnDgqLPZgzbg
dsdtWQWdRGjTRNQNQvGfHCCFpvfGwlCfCp
zzWGqWnqnwWCvCrHffHRpBpBBRSJzRFFDhSQFR
VPVsZMNTLsMvPsmBJhllFpFBTJFQpl
sZtsNsZtdZgjbwggjnbvqr
QpTvrphmDvvddfcJJHTTncMlMG
bRZZPRwjgzzlSSjGlnlSJS
BZzBzssWgwzzwNBsgsPBgszmQptqrrGdvdWmqdhhFQDpQF
FfMtzSqlDlzfMhPFhPtffNRsCgSgCCGspRpRGSsgsg
WTcWLTTVnWmrVdLrcHmNGNCZwCCggpgDRwpCnR
JcdWJHTJWdJdjJccrLvlFltFQQvPFDMjqqlP
NfjFNNZPDQVJVWpCbQpJ
lcmdzlmzBtRSTlTTcncsVSbhpLWpWgsWghgsVS
mBTRRmGccRtBwDbrGPbrMMrF
VVQqlsGrVsMWBNFNMQHF
TfzZfDgjgnLGjjztTncCFwwNmdvNcwwNBvHNFwvd
jzjDgZzjntGJZzCnhrrSlPVsJslpslPq
dVhpjGPdjHhqHgtHJJ
sFzrzllQswDwFbcmBlgvZTCgvqTCfgHQJtqT
nDbBsFzzrrtFrlwzPdSVMWMVVMSnGNLd
wqJCjqChmwMLmMmprNgG
DNTtdsdWcHdNspGQggnrgLnQpc
SZvFftdddDsDTtttTDJNCCwJJZzbbCjwwVPj
VstwZCwslBZQDBjfDDBDfS
rvHnmMRrTzmMrmhRppbhDfpjfbjbctjD
rPFLRLmFvvLvHvTCtqsVVwldGZGPGV
SNZDJGfvwgMgfgmLmLcmBqgWgQWr
hPnPTnVGsPRqLWpTmQqQ
tsbnFhhjhSdGJNCjSf
QSbGgBjfTCMWFNPFFtDghPrP
JqHqJVzZzwJJHLlqQptDhPrctpPDtnLF
zZmwJwdwdvHddVJvZqdzHlfGBbsCmMTsWCBCjsGGBbMQ
gVmLtpWrFTFBLtpcFNbvhNNnTnvnQRlQQv
GHjjqsMqwZZJdqGfZjfZGjQDDhvQNzznzRzRwDNbvgzv
sZGPgssMqHZpPptmCcpCrP
CZCNNLmwzwCGMZQMQsFNWplvpsJBWpFHBp
SPbSbDRRbnDqggnbVbVrbRWHJFTlBBcTvWvsPvFpHTcl
tVgSvqVbnqDdgQzMQMGMmzthCw
mpbPQlblbwSlfSPGBpBGPpBFgMMtLFSHMLVVDVdtHLNctF
WnhZsrJhTnWrgZdZgHNLcLtt
hjCsCWRhjzhTjnWnQBbmPQQPLBGfqjwQ
BFrzdtmRmpFtFwwmjjzNQllPshqHvjNh
fWCLLCMJnCDbgfMJhPsPHvqvqVsssQ
WbLnCZnvprpmZrGd
gjMzTGBjWFBCCSSrBC
bddJJndbdJfwPPthrrSSSsFSSg
NJHbZbbvvWGgjWgT
dpfphMggHdQcwftMMgdtzWGfGWnDBnmvnVJVvfmn
CqPFTZPSNCTsZZZRLzGmcGVzDLGvLWBWJm
TCrTNSScPlplpHrQrQ
lqrCvhWFvMGWgfHPgLfjfdgG
zjmbjSnzRzVVRmzBRtwjVQnNLfdPgfLdfTtNLPHTNNpppf
mbSZRzQRBnnzbQJbmjmSbmVhlslZMrclWFrrqWCWsFhchF
mpfNshshflNthWfJCBBdmnQbQBZQdn
VFVRccgGTqTrHTbWBFjJBCFFJCCQ
PvTDHqHqPPGVqqhwfNlWlDhMltlh
HmLLgWVjJwhwWLgjjhmVHLLLlSzBlBlSvBvBFGvtdStJSSvq
TRRrPMsfQTbRRCZRnTMRZZTCcvSccqBqBBlzdFvBqFsGBcts
bRNPbRCZMCrQNfPLdhVpLDVgDhNHWV
sPJFDsSsVLgHjLHPbj
vCnRQhhRQdVQZlZdbHNMlqNNjgjbpbBL
ChhCCCWTWnnmvmGtztStzScwrcVcFW
NRBTNDBglSSgDwCClQQSFFHdLLsFbPFFLt
McpmWccMWHZPcLstbt
MWnWphVMvvzJzpWJWmVphjrDDBBTRwRDDDRRCnPDnqgg
hsnnhhLljLPTmZwvdZdZjmmz
RQNNDpNMSZwvsmqstN
QFMFRDVDsHSpRpHSMRHfGGGTLhCChBGhBhBFBJ
TTbltCvClzvzCZtwtwLTtQQQgjNgmjgQRRRQSjQLjR
HPpnZHcJsdnnfsdVHHSSqghhmqBSSqSmBfNj
VMJJdnMPrMGVrzvCZwZWCzCt
CcQnBBCfBvRzDlsS
PdbPPCbhGGpDSDlDDhvDJl
HmHWPWdbHnCwCHCr
JHlmJcMWHQcPmlmJMmMZPfwTTRDfgdDBfRtgQgdfBw
zVvFrqGjzWGVrqvjvNFpspvVBgNNddtTgghhRTwgdDwwwBfT
bVFrrvsvjWGVsCsqpSHZmMPJlJnCcLcPZZ
QrrQZFZnRtnFRTrnlFTtRZwpGGwzGszhjzbsGzzhmjjhhmhf
SgvpDSJSgPBSDPDNgpggmsMhMmffsMmzfJmzHHMj
WNVcCPgSSDCddSdWCpNBclCQQFRQQlnTLFLRZQnLtt
tgvqWqzvntdlzNzzHrbPrMhHMhhrVrjPmC
FGTGGRGTffcJRpQcJJwmjhPLhjnCQPrLPVQrMr
SppRSDRwFnJJwwswTDdtzBzqWWzZDldNgtvl
sjzPjLphMSrlppSp
fbGqgwTqgVTFFcgGTTGcQvfHQZRlSrSlSmMNMBRNNNrZmm
MVcFGTFtqjsJLjjtCd
jVJqTRHjjtDjZnVJVVjnNdwfCFPZmPgCCgCZGCFFrrFg
LSLBMBWsbBBCgfdrFd
ShbbzdzQRNNNVhDN
JwbSRqmSwRwcpmbSSVfhNBTVGGRnNNzRNh
ZPfQPjZZrffQZszhzTnVGBvntsNz
rLjggjQgQgFdPQjLFQZgwLMbWccLSwWHqHfSqpwc
cBhzNpztzHNrpHSHQrhZjZqdJRRgPqjhjqqP
bQwsMTswwVjdZMVRJM
vGWCTDCTQvvtlvQQ
mHVmTTsmzRmRHffmmfMGBzSPMhSWWdDWDSGB
VNcnNbtqqJbcbvgvWhShDBDPhjgPhSjB
FrrbCnqJcbCJcFFbnqJlppCTfQmfmZQTLVswRLZp
rWWppSStfRBLfHPdHHDzlldZ
QrTnQmmVCqvrvJvzJZPHvzHsDs
qgMMmrTTCcnQQmCNQNQmgTpwRWRtwtpcBWwjSRSSpttW
SzWQwwqVbQzwGSfVwffVwbqhFGFFMgGLGMlNMcnNgcvlMg
ddZHHsrCdBssDsHmChFLNNnMvmNnnnFncL
rpJJdHZJdZHQSRJbSfVhww
jLtFhNwNNvHnjFVvQLQLHhfbGDMPfffpllpttZMPPZZb
VmrqszVmgCWWggbPGclPlZbcZCbf
JdrTmVTVsqsRJHvQnnhwhBLH
vpdBvsvdVvSPhvQFCgrRmhjqqRgWcWWgmf
tJDGbZHbjRHNrrBj
DnMnzGJJwtzVSzzBzTBSTF
hZMDbQhMhlMDJrDrPMJRRqGJSvFvSwFSVdvGvwSFqq
HjjzcRTnpGVSGGFWHH
pssmjctLzpsRRnhlQbPfPrgDbZls
FJMhPhnTMGmBFdnmlrfqfCcwlwCwCv
pjHLsLbjjRHsHsjDjVsgDRjzCnfCfzqrqvwgflcvcvvgqz
njtpHZnLLQGhTtTWSSSh
NMddMTDrrjNnrnMWMrlnPwNwftBtGvptGjBHgBgpfCCSfgvf
mqRqLFZRVFbtgBSCbGWWHp
LZZRmQhVLLFzZdTQPndPNTTnQW
CprQrcpqhHhpppchpphdcdpLMRMGsVGGsMsLbZbtbfMRmtbG
DzlgTjwPTlSSSCDSlggNmMRtbsstsMfbwtVssMmt
TNCNSBNJJTNPJjCTBDzjlJrvvcQrrhphWBqHhHdqrnrr
ScbcbglMPRSmvclTlzMTdhVHhhjfdsdhrVDzfjrD
LJGtpQwpQBBCttJLGqtqGHhPfDdHwjjhrVrhdrdshr
WCpZQCGqtqQWtQWplZPcvMmgmvPccbvT
tGWqthqGVdzBWwdd
BZvZHFFHZrHZvZNRRHHZNHrMMTzRMTdTzbgDVMVssTDTwg
JnNmrHHNrCGBPPnGGc
wvFvZBmppBdSLcvshcLrgl
bTQqJJHJzJjDQjQtzRVJztDHslgNNVLcgSrsSsWrSslWgrgL
TqHHjQnbHTbbmZBBcFMpmBwn
ZFCqSlCPdCRTLWWTQQLLQS
GjggHcvsggHVTVBLnlcpBQ
hvGhlrtjmjrHHhjsMPFNPdtqMPqqRfCf
cgRwVfVzrgqqwZctTztFMFMTCdPmmF
bWJsSJHpTDRDTWMC
sHHNbshnlJhJjBsjsbnBHbZcqrZZQwqvvZcrwwvRcZnr
ttgVBtMbttngmHJVpzlzZlppzw
cPcsRPmPPQfGcccRQSSZzzvzlflzZHvJppzJzT
sQPSCPPWccWWWqsQqRCQFNRMmnbnjjNbgDdBjhBrdbdDbd
gSsZDSgdQZgWSgddwLDLLfCDBqvlhBlClqtqjhvBhB
RMcsVMcsbVsrPrmJcPHHVvfjjCnvvfCqhlqvqqqq
NFMRRpHPgzszGppG
WmmZZNJCgCBZCzPvmBCmjWjjqFtFqjFjbVwqwjtt
ppDMpdMfSfSSNtlwqbqwwq
dTGDhdnfLMLhfDDpQvZNZgmrmrQJgrLQ
jrqRqfNNhrVvcTVdpTscpd
tGWBlLggWGddTspZZd
JJzWtQgQsDbBgDWsgbFrPrRJNMJMPqMNfHjH
GdvVbbWsWdvWGDvWZcbFBTBZCzCjwzrhPBJjzF
nQPfSHnglfpnMSngnMgJTprJCCwwrwCwpTpCFj
SQQHSttRqggmlVsNcvWdRvbWPN
WLNLCWLsSJgHFrSHrM
gDbzRTcmbzPPgPPdtBctfHfrMMQfGFJrhQnMfGJR
dmmzzqZdDqqTLLwjgZgNljws
TCqsDHssmDsDGVGlVcMccGDV
FLntWWnnFzFgzzbtbznLBtlfjGZmcfFGVNFGlVZcMNlN
PpbLLmpgbRzqpCHwChQqwh
lVBPVgflgBVVrVTTwgwBPmgflDQjnnGvqjGDDFjGlGnvqHHJ
ScCLzdCZdbLSbFdFqvDDdGMQGQ
bchNCLRWSbzCbNRzbWRmsrhQwVVwBhmQpPwpgV
GmfHCCPqWqHLWLCfRJpbrrbQphwZbZ
STVDQzNnzMzNdstMDzzNtZwFhrlwVJJrJlFFJRFwFR
DzSvzstnszMnjQcqggjPqQBcqq
BzNwLTqwTjrBrljWpBlrQpBpsCGGCtpssCMttDtHsttMDCHp
mnrJVmRhhvJVcHtsGHMCnZCPZM
bvSmVbRhbgmmSJflzNLrzqzfWfqBWr
qsZLqqFNhfrGnJFv
DVjVmWlcjVjdDTDlbbTDTzmrCnMmJGnHnmCHfJGfvnfM
lVRdDglTlTgVlVjbWWVzVjvNZqSBsLZNtqRsLBqLqQtL
ffRRfLVHZHfJHVJcMrMZZwwTzGBBzBTBjGTwrwdSCj
qmWbWQbqnbvWhbQPGnGNnpvwSzltpBldtSdzllptCSjTTt
vWsbnbWnNvQQQQvsRRLfJRRVGfDcfV
PpqrvswPvvvPsNqmDLDttCCcHHZVrCtW
hgSddBhghQMdbhbwhgSdQgCCctZcDtLntLttCVLtSLCc
dGzdQMFzQMdgGGlGJMzBgBwRqNNfmmTsvfRfJTpwjmpP
pcphpdrWDmTgHWMtRWqHRVVH
SbGcGGQnvNQGvsjBtVHBLjvqVPVB
lzbQCzbZllSzQslpCJpJJDggcggfDT
ffrTlhrVrfCsDVTsWzGBBZcBRBqRBWtGtZcq
QNFmFHrHNSSmSLJdJrNGZLbGjbcBjBGjqcbgjc
ddQvPnHddnQJHSHSFPdnFfDDTfDMMCrwMlPTwDCsrC
NBnrNHQHBscvhfBM
bbGtgWWWqZFmnZGZbmVCdMzvvShfzfGcdcfMSS
WqbjnmbnjWgmFFgtWVbWZwNTNLjNprNwQLDwrTrHQr
lwwlcjlzQRBcBccbdLCVnNVWJJzfLndd
pZDMtZpSDMZpMZMsPtHVNJVfRCRddVndnJLSJd
mDTZvTqtDDHttRPcqhQlwgGlghbqBh
DTspTqssqTbdmCMwVmnmlfCD
PLPWjjrSjvPzqZvjvRqjLtPwnnHCmWVcncMnnwmncHcHll
RFztFjjqjQFQTbdTbQ
hTFSVSdhMMVMFjjgbthcbzczcg
DvwCJVJWWJDRnfmbDmccfmmgfb
QrJvPGWWnpVMqdZsZpqM
gRLcHbgnfpgpJjlqqp
SFwrTHFBqlZtBPZq
HTzDwmSvCvCmsmmvTSwvFwcfRRNRLcQRWNssNNbRWLWL
PpMgDMDnsWSnjBQnrjbn
LFcVVGChCFdhdVFZVpVCdVbvQbRrbvBBbBjQSJZrrJrR
FNwGNCCFHcVTHcFdHHHTDzMzfsgzwpPWMmPflmtt
""";
#endregion
}

File diff suppressed because it is too large Load Diff

View File

@@ -5,592 +5,117 @@ namespace AdventOfCode.Days;
public class Day5 : Day
{
public override int Number => 5;
public override string Name => "Supply Stacks";
private IDictionary<int, Stack<char>>? _stacks;
public override string Name => "Print Queue";
public override void RunPart1(bool display = true)
{
_stacks = InitStacks();
var result = 0;
foreach (var line in Input.ReadAllLines())
var precedences = new HashSet<int>?[100];
var readingPrecedences = true;
foreach (var line in Input.AsSpan().EnumerateLines())
{
var split = line.Split(' ');
var moveCount = int.Parse(split[1]);
var fromStack = _stacks[int.Parse(split[3])];
var toStack = _stacks[int.Parse(split[5])];
for (int i = 0; i < moveCount; i++)
if (line.IsWhiteSpace())
{
toStack.Push(fromStack.Pop());
readingPrecedences = false;
continue;
}
if (readingPrecedences)
{
var split = line.Split('|');
split.MoveNext();
var ruleTarget = int.Parse(line[split.Current]);
split.MoveNext();
var ruleNumber = int.Parse(line[split.Current]);
if (precedences[ruleTarget] is not { } precedenceSet)
{
precedenceSet = [ ruleNumber ];
precedences[ruleTarget] = precedenceSet;
}
else
{
precedenceSet.Add(ruleNumber);
}
}
else
{
result += CheckLine(line);
}
}
if (display)
{
for (int i = 1; i <= 9; i++)
AnsiConsole.MarkupLine($"[green]Sum of middle page numbers: [yellow]{result}[/][/]");
}
return;
int CheckLine(ReadOnlySpan<char> line)
{
Span<int> positions = stackalloc int[100];
// Read line to get positions
var position = 1;
foreach (var range in line.Split(','))
{
AnsiConsole.Markup($"[{(i % 2 == 0 ? "yellow" : "green")}]{_stacks[i].Pop()}[/]");
var number = int.Parse(line[range]);
positions[number] = position;
position++;
}
AnsiConsole.WriteLine();
var middlePosition = (position - 1) / 2;
var middleNumber = 0;
var index = 0;
// Check if positions respect precedence rules
foreach (var range in line.Split(','))
{
var number = int.Parse(line[range]);
// Fetch middle number
if (index == middlePosition)
{
middleNumber = number;
}
index++;
if (precedences[number] is not { } precedenceSet)
{
continue;
}
var numberPosition = positions[number];
// Check all precedence rules for numbers in the list
foreach (var nextNumber in precedenceSet)
{
var nextNumberPosition = positions[nextNumber];
if (nextNumberPosition != 0 && numberPosition >= nextNumberPosition)
{
return 0;
}
}
}
return middleNumber;
}
}
public override void RunPart2(bool display = true)
{
_stacks = InitStacks();
foreach (var line in Input.ReadAllLines())
{
var split = line.Split(' ');
var moveCount = int.Parse(split[1]);
var fromStack = _stacks[int.Parse(split[3])];
var toStack = _stacks[int.Parse(split[5])];
// Push items in reverse order and remove them from the other stack
var items = fromStack.Take(moveCount).Reverse().ToArray();
foreach (var item in items)
{
toStack.Push(item);
fromStack.Pop();
}
}
if (display)
{
for (int i = 1; i <= 9; i++)
{
AnsiConsole.Markup($"[{(i % 2 == 0 ? "yellow" : "green")}]{_stacks[i].Pop()}[/]");
}
AnsiConsole.WriteLine();
}
// if (display)
// {
// AnsiConsole.MarkupLine($"[green]Number of safe reports: [yellow]{xmasCount}[/][/]");
// }
}
#region Input
private static IDictionary<int, Stack<char>> InitStacks()
{
var stacks = new Dictionary<int, Stack<char>>
{
[1] = new("SLFZDBRH".Reverse()),
[2] = new("RZMBT".Reverse()),
[3] = new("SNHCLZ".Reverse()),
[4] = new("JFCS".Reverse()),
[5] = new("BZRWHGP".Reverse()),
[6] = new("TMNDGZJV".Reverse()),
[7] = new("QPSFWNLG".Reverse()),
[8] = new("RZM".Reverse()),
[9] = new("TRVGLCM".Reverse())
};
return stacks;
}
public const string Input =
"""
move 6 from 1 to 7
move 2 from 2 to 4
move 2 from 7 to 4
move 6 from 4 to 3
move 1 from 5 to 1
move 3 from 8 to 3
move 15 from 3 to 4
move 6 from 5 to 9
move 14 from 4 to 2
move 3 from 2 to 7
move 1 from 2 to 7
move 9 from 9 to 1
move 3 from 2 to 1
move 7 from 6 to 7
move 1 from 6 to 8
move 2 from 9 to 1
move 9 from 2 to 3
move 8 from 3 to 9
move 1 from 1 to 4
move 1 from 8 to 6
move 1 from 6 to 2
move 5 from 9 to 8
move 2 from 9 to 1
move 1 from 4 to 2
move 17 from 1 to 9
move 1 from 3 to 1
move 3 from 2 to 3
move 2 from 4 to 5
move 12 from 7 to 3
move 16 from 9 to 2
move 5 from 7 to 5
move 2 from 1 to 2
move 1 from 3 to 6
move 1 from 4 to 6
move 1 from 7 to 3
move 1 from 6 to 3
move 7 from 3 to 4
move 5 from 8 to 3
move 1 from 6 to 7
move 7 from 3 to 4
move 6 from 3 to 1
move 2 from 4 to 8
move 1 from 5 to 2
move 10 from 4 to 5
move 3 from 5 to 2
move 2 from 8 to 9
move 5 from 2 to 8
move 1 from 3 to 5
move 2 from 5 to 8
move 12 from 5 to 7
move 1 from 4 to 2
move 5 from 9 to 4
move 1 from 2 to 5
move 6 from 1 to 3
move 6 from 3 to 5
move 10 from 7 to 4
move 2 from 7 to 3
move 4 from 7 to 6
move 1 from 9 to 5
move 12 from 2 to 1
move 1 from 8 to 7
move 3 from 7 to 4
move 4 from 4 to 8
move 7 from 5 to 3
move 1 from 2 to 4
move 10 from 1 to 5
move 2 from 1 to 2
move 4 from 6 to 7
move 8 from 8 to 3
move 5 from 4 to 9
move 12 from 3 to 8
move 4 from 3 to 8
move 2 from 9 to 2
move 3 from 5 to 4
move 1 from 3 to 5
move 1 from 7 to 6
move 14 from 4 to 6
move 6 from 5 to 9
move 8 from 2 to 8
move 3 from 5 to 7
move 21 from 8 to 4
move 16 from 4 to 9
move 8 from 6 to 2
move 4 from 6 to 1
move 1 from 4 to 6
move 2 from 4 to 8
move 3 from 1 to 8
move 2 from 4 to 6
move 1 from 6 to 2
move 3 from 8 to 4
move 2 from 2 to 5
move 2 from 5 to 7
move 1 from 8 to 9
move 1 from 4 to 9
move 1 from 1 to 6
move 3 from 6 to 3
move 3 from 2 to 3
move 1 from 4 to 6
move 3 from 6 to 7
move 10 from 9 to 7
move 1 from 4 to 7
move 6 from 8 to 3
move 1 from 6 to 8
move 2 from 2 to 5
move 1 from 2 to 1
move 1 from 8 to 9
move 1 from 2 to 8
move 1 from 1 to 9
move 7 from 9 to 1
move 1 from 8 to 5
move 7 from 1 to 7
move 3 from 5 to 8
move 3 from 7 to 2
move 1 from 8 to 4
move 1 from 2 to 4
move 2 from 4 to 6
move 5 from 3 to 1
move 9 from 7 to 2
move 6 from 3 to 8
move 8 from 2 to 7
move 2 from 6 to 4
move 2 from 1 to 7
move 2 from 1 to 4
move 24 from 7 to 4
move 4 from 8 to 9
move 2 from 7 to 5
move 1 from 5 to 2
move 1 from 3 to 8
move 4 from 2 to 8
move 13 from 9 to 2
move 2 from 8 to 6
move 3 from 9 to 6
move 26 from 4 to 2
move 1 from 5 to 7
move 2 from 6 to 2
move 2 from 4 to 1
move 7 from 2 to 1
move 15 from 2 to 6
move 8 from 2 to 8
move 4 from 6 to 8
move 9 from 2 to 9
move 13 from 6 to 7
move 6 from 1 to 9
move 2 from 2 to 4
move 4 from 1 to 6
move 3 from 8 to 3
move 1 from 4 to 9
move 2 from 6 to 7
move 1 from 4 to 3
move 3 from 3 to 2
move 14 from 7 to 4
move 5 from 9 to 5
move 9 from 8 to 5
move 7 from 9 to 6
move 2 from 5 to 6
move 2 from 9 to 2
move 10 from 5 to 1
move 1 from 3 to 1
move 2 from 8 to 1
move 1 from 9 to 2
move 1 from 7 to 5
move 4 from 2 to 1
move 1 from 9 to 8
move 3 from 4 to 1
move 1 from 8 to 6
move 12 from 1 to 5
move 1 from 1 to 6
move 1 from 7 to 5
move 4 from 6 to 9
move 2 from 2 to 4
move 1 from 9 to 6
move 1 from 1 to 5
move 2 from 9 to 7
move 10 from 6 to 5
move 1 from 6 to 7
move 20 from 5 to 1
move 1 from 7 to 9
move 2 from 9 to 1
move 3 from 5 to 1
move 2 from 8 to 4
move 2 from 8 to 7
move 1 from 5 to 9
move 1 from 8 to 4
move 22 from 1 to 7
move 5 from 4 to 8
move 1 from 5 to 9
move 19 from 7 to 4
move 2 from 9 to 1
move 1 from 5 to 9
move 10 from 1 to 8
move 1 from 9 to 1
move 1 from 8 to 3
move 8 from 4 to 7
move 1 from 5 to 6
move 3 from 4 to 5
move 1 from 5 to 9
move 11 from 7 to 4
move 4 from 4 to 9
move 1 from 6 to 2
move 1 from 3 to 9
move 5 from 9 to 4
move 5 from 7 to 9
move 23 from 4 to 2
move 17 from 2 to 7
move 2 from 2 to 8
move 4 from 4 to 7
move 1 from 4 to 5
move 2 from 5 to 2
move 5 from 8 to 9
move 5 from 2 to 7
move 9 from 7 to 5
move 11 from 9 to 2
move 1 from 4 to 3
move 5 from 8 to 7
move 3 from 8 to 5
move 2 from 1 to 3
move 2 from 3 to 9
move 1 from 5 to 8
move 5 from 7 to 5
move 15 from 5 to 4
move 2 from 8 to 1
move 2 from 5 to 1
move 4 from 4 to 1
move 1 from 8 to 7
move 8 from 2 to 1
move 4 from 2 to 8
move 2 from 7 to 4
move 5 from 8 to 6
move 5 from 7 to 9
move 4 from 6 to 5
move 7 from 4 to 8
move 1 from 6 to 1
move 1 from 3 to 1
move 2 from 5 to 1
move 7 from 1 to 5
move 5 from 1 to 3
move 4 from 7 to 9
move 4 from 3 to 9
move 2 from 9 to 7
move 6 from 9 to 2
move 1 from 4 to 1
move 1 from 3 to 5
move 1 from 2 to 5
move 5 from 9 to 4
move 4 from 4 to 6
move 1 from 8 to 9
move 8 from 4 to 3
move 7 from 7 to 3
move 5 from 1 to 3
move 11 from 5 to 9
move 1 from 7 to 6
move 2 from 3 to 5
move 1 from 3 to 1
move 3 from 6 to 2
move 2 from 5 to 1
move 2 from 1 to 2
move 3 from 1 to 5
move 5 from 9 to 2
move 2 from 6 to 8
move 2 from 3 to 8
move 4 from 9 to 7
move 3 from 5 to 2
move 2 from 1 to 8
move 1 from 9 to 8
move 1 from 9 to 2
move 4 from 7 to 9
move 11 from 8 to 7
move 1 from 8 to 2
move 6 from 9 to 7
move 3 from 7 to 1
move 13 from 2 to 7
move 24 from 7 to 1
move 2 from 2 to 6
move 1 from 8 to 3
move 1 from 9 to 3
move 5 from 2 to 4
move 1 from 2 to 5
move 1 from 6 to 2
move 1 from 6 to 3
move 1 from 2 to 4
move 3 from 7 to 3
move 2 from 1 to 7
move 2 from 3 to 8
move 2 from 7 to 8
move 9 from 3 to 2
move 3 from 4 to 8
move 1 from 5 to 1
move 9 from 2 to 1
move 3 from 4 to 9
move 1 from 7 to 8
move 6 from 3 to 9
move 2 from 1 to 5
move 15 from 1 to 3
move 13 from 3 to 9
move 11 from 1 to 4
move 5 from 4 to 1
move 6 from 3 to 6
move 4 from 4 to 8
move 6 from 1 to 4
move 1 from 5 to 2
move 1 from 2 to 1
move 3 from 4 to 2
move 2 from 8 to 5
move 2 from 4 to 2
move 9 from 9 to 3
move 9 from 3 to 5
move 2 from 9 to 4
move 5 from 2 to 6
move 1 from 1 to 8
move 1 from 4 to 1
move 10 from 9 to 2
move 9 from 2 to 4
move 10 from 4 to 1
move 3 from 1 to 3
move 4 from 1 to 2
move 5 from 2 to 4
move 2 from 5 to 2
move 4 from 1 to 7
move 10 from 5 to 4
move 2 from 2 to 4
move 1 from 9 to 2
move 2 from 3 to 5
move 1 from 3 to 5
move 3 from 6 to 7
move 8 from 4 to 9
move 6 from 6 to 1
move 4 from 9 to 5
move 2 from 9 to 1
move 1 from 2 to 6
move 6 from 5 to 2
move 3 from 7 to 9
move 4 from 8 to 2
move 1 from 7 to 9
move 1 from 5 to 3
move 2 from 7 to 4
move 1 from 7 to 1
move 14 from 1 to 9
move 1 from 1 to 9
move 1 from 3 to 8
move 3 from 2 to 5
move 2 from 4 to 2
move 6 from 8 to 1
move 1 from 2 to 1
move 5 from 1 to 9
move 1 from 1 to 7
move 2 from 8 to 5
move 1 from 5 to 4
move 1 from 6 to 1
move 8 from 2 to 7
move 2 from 6 to 1
move 9 from 9 to 5
move 11 from 4 to 8
move 4 from 7 to 4
move 6 from 4 to 6
move 1 from 7 to 4
move 6 from 6 to 7
move 1 from 5 to 9
move 6 from 8 to 9
move 8 from 9 to 5
move 1 from 4 to 5
move 15 from 9 to 3
move 3 from 1 to 4
move 6 from 7 to 2
move 3 from 4 to 9
move 2 from 7 to 3
move 1 from 7 to 3
move 1 from 7 to 2
move 2 from 8 to 1
move 3 from 8 to 5
move 2 from 1 to 7
move 8 from 3 to 6
move 3 from 6 to 5
move 1 from 6 to 1
move 10 from 5 to 7
move 6 from 5 to 4
move 4 from 2 to 4
move 6 from 5 to 1
move 6 from 1 to 8
move 2 from 9 to 2
move 2 from 9 to 7
move 6 from 3 to 7
move 1 from 3 to 5
move 1 from 1 to 9
move 2 from 8 to 1
move 2 from 5 to 4
move 3 from 3 to 7
move 10 from 4 to 6
move 1 from 9 to 7
move 12 from 7 to 3
move 12 from 3 to 8
move 2 from 1 to 5
move 1 from 1 to 3
move 13 from 8 to 1
move 7 from 7 to 1
move 13 from 6 to 9
move 1 from 7 to 4
move 6 from 5 to 3
move 3 from 4 to 3
move 6 from 3 to 1
move 10 from 9 to 4
move 2 from 7 to 6
move 8 from 1 to 9
move 3 from 2 to 9
move 1 from 3 to 5
move 1 from 3 to 5
move 1 from 1 to 4
move 6 from 9 to 3
move 2 from 6 to 7
move 4 from 9 to 5
move 4 from 1 to 6
move 1 from 2 to 4
move 6 from 1 to 4
move 3 from 9 to 3
move 3 from 6 to 8
move 3 from 8 to 7
move 5 from 5 to 1
move 1 from 3 to 9
move 1 from 9 to 5
move 1 from 3 to 2
move 2 from 5 to 1
move 1 from 6 to 9
move 1 from 6 to 3
move 2 from 9 to 7
move 2 from 8 to 1
move 1 from 3 to 2
move 1 from 2 to 5
move 1 from 7 to 1
move 7 from 7 to 9
move 12 from 1 to 9
move 1 from 5 to 2
move 1 from 7 to 1
move 13 from 4 to 7
move 1 from 9 to 4
move 5 from 7 to 3
move 4 from 9 to 1
move 8 from 7 to 9
move 3 from 2 to 3
move 4 from 3 to 7
move 5 from 4 to 6
move 3 from 9 to 4
move 10 from 1 to 5
move 3 from 4 to 7
move 16 from 9 to 2
move 3 from 9 to 2
move 6 from 5 to 3
move 4 from 6 to 2
move 1 from 4 to 6
move 2 from 6 to 8
move 1 from 5 to 2
move 1 from 5 to 8
move 7 from 7 to 2
move 16 from 2 to 1
move 1 from 5 to 1
move 10 from 2 to 8
move 14 from 8 to 5
move 2 from 2 to 6
move 1 from 2 to 5
move 2 from 2 to 1
move 8 from 1 to 7
move 4 from 1 to 7
move 2 from 1 to 7
move 5 from 3 to 2
move 1 from 1 to 6
move 2 from 2 to 5
move 4 from 1 to 7
move 1 from 2 to 8
move 1 from 2 to 8
move 3 from 6 to 7
move 10 from 7 to 5
move 1 from 2 to 8
move 27 from 5 to 9
move 1 from 5 to 6
move 1 from 6 to 4
move 1 from 4 to 3
move 3 from 3 to 7
move 4 from 3 to 6
move 2 from 6 to 4
move 3 from 8 to 1
move 2 from 6 to 1
move 12 from 7 to 8
move 2 from 3 to 9
move 1 from 9 to 2
move 1 from 2 to 8
move 2 from 1 to 2
move 6 from 3 to 8
move 1 from 7 to 4
move 15 from 9 to 5
move 7 from 9 to 4
move 1 from 2 to 1
move 16 from 8 to 2
move 8 from 5 to 2
move 24 from 2 to 9
move 3 from 1 to 2
move 24 from 9 to 1
move 5 from 5 to 9
move 3 from 4 to 1
move 1 from 7 to 6
move 1 from 6 to 3
move 1 from 3 to 2
move 3 from 2 to 3
move 1 from 5 to 6
move 1 from 2 to 7
""";
#endregion
}

View File

@@ -1,3 +1,4 @@
using System.Numerics;
using Spectre.Console;
namespace AdventOfCode.Days;
@@ -5,75 +6,189 @@ namespace AdventOfCode.Days;
public class Day6 : Day
{
public override int Number => 6;
public override string Name => "Tuning Trouble";
public override string Name => "Guard Gallivant";
private const int GridSize = 130;
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)
{
int position = 0;
HashSet<Point> visited = [];
var direction = DirectionUp;
// Store the last 4 characters in a stream (kind of like a sliding window)
var charStream = new Queue<char>();
charStream.Enqueue(Input[0]);
charStream.Enqueue(Input[1]);
charStream.Enqueue(Input[2]);
var (obstaclesGrid, position) = ReadInputGrid();
for (int i = 3; i < Input.Length; i++)
visited.Add(position);
// Move the guard till it leaves the grid
while (true)
{
charStream.Enqueue(Input[i]);
var destination = position + direction;
// Check if all 4 chars are different
if (charStream.ToHashSet().Count == charStream.Count)
if (destination.X is < 0 or >= GridSize ||
destination.Y is < 0 or >= GridSize)
{
position = i + 1;
break;
}
charStream.Dequeue();
// Check if it's possible to move or if there is an obstacle
if (obstaclesGrid[destination.X, destination.Y])
{
direction = NextDirection(direction);
continue;
}
position = destination;
visited.Add(position);
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Position of start-of-packet marker is: [yellow]{position}[/][/]");
AnsiConsole.MarkupLine($"[green]Amount of distinct positions: [yellow]{visited.Count}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
const int length = 14;
int position = 0;
var possibleLoops = 0;
var (initialGrid, startPosition) = ReadInputGrid();
// Store the last 14 characters in a stream (kind of like a sliding window)
var charStream = new Queue<char>();
for (int i = 0; i < length - 1; i++)
for (var y = 0; y < GridSize; y++)
{
charStream.Enqueue(Input[i]);
}
for (int i = length - 1; i < Input.Length; i++)
{
charStream.Enqueue(Input[i]);
// Check if all 14 chars are different
if (charStream.ToHashSet().Count == charStream.Count)
for (var x = 0; x < GridSize; x++)
{
position = i + 1;
break;
}
// Store obstacle state
var initialState = initialGrid[x, y];
charStream.Dequeue();
// Check if grid is a loop after adding an obstacle there
initialGrid[x, y] = true;
if (IsLoop(initialGrid, startPosition))
{
possibleLoops++;
}
// Restore obstacle state
initialGrid[x, y] = initialState;
}
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Position of start-of-message marker is: [yellow]{position}[/][/]");
AnsiConsole.MarkupLine($"[green]Amount of possible loop positions: [yellow]{possibleLoops}[/][/]");
}
return;
bool IsLoop(bool[,] obstaclesGrid, Point position)
{
HashSet<(Point position, Point direction)> visited = [];
var direction = DirectionUp;
visited.Add((position, direction));
// Move the guard till it loops or leaves the grid
while (true)
{
var destination = position + direction;
if (visited.Contains((destination, direction)))
{
return true;
}
if (destination.X is < 0 or >= GridSize || destination.Y is < 0 or >= GridSize)
{
return false;
}
// Check if it's possible to move or if there is an obstacle
if (obstaclesGrid[destination.X, destination.Y])
{
direction = NextDirection(direction);
continue;
}
position = destination;
visited.Add((position, direction));
}
}
}
#region Input
private (bool[,] ObstaclesGrid, Point Start) ReadInputGrid()
{
var grid = new bool[GridSize, GridSize];
Point start = default;
public const string Input =
"""
rgffbnnqvqhhmtmzzmmpmllcggsdswwvvwzzpptbppgngsnncwcnwcwnwgwrwrrnqnlqlccwggrcgrccjgcgwghgffjgjgrgmmsrrhchfcfdccjwwzdzcdcbcjjtfjjltlvvtstvttszsvsmmfccwcjwwzmzhhjvjpvjpppcwppdtdvtdvtvztzvzffdfqqgbgffrgrpgphhbcctssncsnncfcppvnpvnvfnfvnnfggtpplggwsggldllzvzrznncbbjpplbbrrnsrssmrsrhhmqmnqqhpqqnrqnrrtrnnrwrwhhpjhphlhvvgbgzztqtvvmssdshhqnhnjjvhjhqqbrqrrmrlrdllvrlvlccfvcffhfssgvsswhwqqfwfwhhcffjmmjrrbgrgjgrrvsrvvwmwsmmszzvmzvmmwmtthvvfbfllpjpwpwjpwpnpjpqqwtqtwwqpwqqrsqqcpqqssrgsrrjwwqmwmgwgrggmvmgmfgmffjfhjfjttcztccmtmmccnznhhcgcffmnfmmqjjhwwtccbzbhhwnhnsnmsnmnqqchhhnggbzbjzjzszsfsjfjvffnlffvrvddbhhqccdnnzwnznjnpnmppthhqddjhddqjqlqplqqjpjwppqttswsvwvfwflfplffnbfbwfwhhlhtlhtltzzmlmslmlwwgzwzrrwhhlnnrfnnmpppjpgpbbhpbhppbrppbhhzgzczqcqvqggwppcnnhnznvznzhhcpctptpjtppdhhprhrcrpcprpplrprzrnrfnrnlrlvrrfqqnnsqsqrssnrnvvvghvvbzzqppjsjnnrprwrrmqqtfqfwwrdrsddprddbdzbdbndbdjdljjrtjrrnzrzjrzzpssftfmfbflbbcpcsppwrppntnhthlthtbbsmsbmsmggpssnhnjjtsjjwssdjdwwppcbpcclmccwzzrggmgmnnwjnnqppjttvllmhhvcctptbpbdpdhdqqgggbnnqcchlhssltstllvqlvqvdvjdvvqvsvfvhfhlfftqffztzdttfvvzmvzznvnsnjjvqjvjljplpvvzlzhzghgddbbzbmbnztgthrnpsqhhdvprtpdftmqfvgjzgdvqwmvgwbczvbschqfhdvqcfnmbgmtqmlmsqcbfhshrzzbrtpgnwwtzgnjghzrlwhntprqhvshjcfvlnchccbtnswfnmpccdppqrqrhngvlwrpplbnpgzbzwtzwrsptmsmlndcfmbnqgvnqvzwpvrtfsrwfvfwdvplrfdddwcnwhzchmwfjsfvbtbrjchmgqwfvvmpzhqcbzhrcmjrzmgrtnzrcqdqdqnpwjctlhrjcphbbcvhvqnhtwjrvrbzfzfzzplshvrcchvtgtjcnhlzsttwdhcmdvrdlgsngvtzqsjrcptwwbgvfbsvgnmfhmvgqtfzbhhmdznjlsghhnlwzhvplfvlqzbrsjhdvrshjbnfqgpscbpzmnmmcsdbtwbwmsvfjwdvtctslcqfssrhczdptlrjbfzjctqrcbppcfcbqqzhhftdjchtscwgwcnpvrrjvnnwrqtrqmbgdfcpqhddnvdnmlmqcgsndwbcfvfrzsrflsnqrpmszqrdlshlcsfrmnsqmtrvjwqcllftscwrtmvcjsmrlqvdfjzgfdtswqzldqgjvhczpqrfbclnbwcjprjncvhgfmjhgfgnvfzfnvbbstgsgtspdhtfsncttlwmllbbvqftjtshfjlqtjwlvrbwmzfhdmcbhtqdzqtzmdljqprwhqwcvbtfqbpjwztgqrvlrqdwmqrqzvptsgjdqnqdfwfpjdglwgpdrcfrrzmpjmtbwwrqqcsnmphcqtthlnlzlfftrjmtjwwqrldcfjjclzrsqvltsfchfggcwbzbtpqcjfvgpwnwwqrdbdvjplgsgctdhqvttmtpmmjfcqdslhjgtdppbmzbrfbrrjncfdhlmjgdwjrmbgpcgctghbvphpgfvvfvtplqrhnjjhqntjvbsggvrvjgrwptcgqgrmjtprvhnvjsdsfqrqrrltlhvfsjsqpbwndbsnjzplcfqtfbdqdzdvnljcsmjnrmwwjzqwsjbdlclsmccbqwnlpltqhqhmthhrdjwlqwrbltghsvblqntvjqzpmmpqwrrwvhmtfqzhrmjfglwfpthhgbhdmrtprtqgqbdcfqlbbvmzmchzglmpzdvhpqchhclbcvrcmhtzqfzrplbvmdhghsttzgdjbgmmtvlqjsstgwlwchhwmflwbgljgszghvfdsngbtbcnhzmmdmsjqfbcsmgpjwjqgwqdlrgznnmhphbrzcgnqczpcbljjmhnnrmzlpqbswwcjpjqcrtdmgprpmmbprwlmpzcmwlnbzqjsgftrncvmjmjwvqgszsrmrczhjnwlghgndhbthwlhfbncrwqfgnshrmdfhwmfvllhvbmmllwfbgrnrttpzffzvcfjfbrmdqfcfrdqsltpbbttnqnbncfhwghfbgwrltbhwmmlpczsvvdnwhchgfplnjsttsqvsznwvlwzgfnhfrrgplsfwrwnbfhblwtjpldjmzrglhppgsjsgzssbbgrrbdmpwhgjjmlfnpdbvtntcwrvltgfnrgwttvvjhqljjvvnmztwgzcclgbjnjspzwnpgtgvhhhqbzrnvmdcljcdncvpnpdhrhqwvlhllbsrmjbzlgczwjsrvqrqfqmtjrnpbtdhsrfbhrgtgnrmlgcwcmrvrdfcqbfcqczjchgrjpzqfqqmcpvnvbrssfrfsrjmlngplqqsnclgvpfhjbzdppjftlgbmcgdbrvqrclvtdnzhhcmzlrdrgbrqrlvfcnvznnqwswvhdpbbjmsqzcrmjngzmdftjzsjvgfdtcvdwhnwwjlcgcmflzzpzpgzrvmptbjgrdjbzscrglhcjppdjdshnvvbsnnddtbwsdrpnbnlrtppcrzbbjrfzhbwgmjqtmgjvmrjgfdndlmqvhgwprsjnhcmrnfdfdzggjjzcccnsnwwbjzmsfjjfhclptfcwqjhnphpwzszjmsrtnbqpqsvcfcvrrgclwlbrqngdcdlzrdfpvbgtznjzdvjngrgswhjnrpgswtqflpgvnpbsvcrtgtzcbhdjpbjwnpdzcmprtzlppbqvpzrrlbssmwhhvqqpmwggnzwcfdnzccjrrncnvjqgbpstctwpqvhdsbcsjrpbzbdlwwvjngtbnvpthppglgsnrbwnvpzldhsgwqhclgwrdsvcfdclvdsbrhcfnbgrtqswstnjfmfrdgphpvgjfqzcwnpcghdhtflgdnhhnnnwrpnmppszgqdcqjqpnccfsqjsmwtqvzwfqvtwtthwswmcqqcqjwcgwgzgmnpzbfpzrqbvqhbhtsvvbppbmqzfnsmwppzvsctgcncztsqdfhnlwjjtvwcchvnphwpnpzqsjhlrcmnbthtqlfclnsfdtpwfzljdpfszvhgzdpzhbjtphbfbmwgfrfplntfqhgpbjzghmblzzhdcbptngqwrtfmvtbhphpvdwpswbscrwzhnvqfwlbwwqqgstgmbqlllspbhbpjmmrfhmjwzdnsdwmpvlrspgzmdjwqwcjpbgwspsghjdvrbbsbtgwptqdvvdhbhqbdhpbzdsdwsjdbjnztdqqrdhwhtpvcbblbmjgmbpqghdsfthzjffrdvldfsnpcsmnzwzcqlnvcrcbqnfcdrfbffrvhqsbqjnnbzsqvqqdqwmsvbqvtgmnnlthpngfsljqnrdhhzpmwsnqvrgdnvlbgnndfcpjfgmzqssvnnrwbmslcqpnhnnwzggsjvqcsqpfzjcmcppntmsdtfggzdncqbfjsqvbzgnnlsdbgjqffsmvnbqlsrjwdmcjbrsrpchnnhdtlcdhfdltmlvtrwjpzphtbhzzrlrwbbhhpntgbcfmphnbrjdhrhvmvhfglrncngjdsvbfrqtqzsgvlzjqzcqnwdcfgvnpsqpphwfsdvpgnchjnnjhsqgvlqcvhzzzcrsqcvrbsbjbdbgddlbb
""";
var y = 0;
foreach (var line in Input.AsSpan().EnumerateLines())
{
var x = 0;
#endregion
foreach (var symbol in line)
{
if (symbol == '^')
{
start = new Point(x, y);
grid[x, y] = false;
}
else
{
grid[x, y] = symbol switch
{
'#' => true,
_ => false
};
}
x++;
}
y++;
}
return (grid, start);
}
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 readonly record struct Point(int X, int Y) : IAdditionOperators<Point, Point, Point>
{
public static Point operator +(Point left, Point right)
{
return new Point(left.X + right.X, left.Y + right.Y);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -1,314 +1,169 @@
using Spectre.Console;
using System.Collections.Frozen;
using System.Numerics;
using Spectre.Console;
namespace AdventOfCode.Days;
public class Day8 : Day
{
public override int Number => 8;
public override string Name => "Treetop Tree House";
public override string Name => "Resonant Collinearity";
private const int GridSize = 50;
public override void RunPart1(bool display = true)
{
var grid = CreateGrid();
HashSet<Point> antinodePositions = [];
var valid = new HashSet<(int, int)>();
var frequencyAntennas = ParseAntennas();
// Check each line from left to right
for (int i = 0; i < grid.GetLength(0); i++)
// Find antinodes for each frequency
foreach (var (_, antennas) in frequencyAntennas)
{
int previousTreeSize = -1;
for (int j = 0; j < grid.GetLength(1); j++)
// Take antennas by pair to find antinodes
foreach (var firstAntenna in antennas)
{
var size = grid[i, j];
// The tree on the left is blocking the view, stop searching on this line
if (size <= previousTreeSize)
foreach (var secondAntenna in antennas.Where(a => a != firstAntenna))
{
continue;
}
var firstAntinode = firstAntenna + (firstAntenna - secondAntenna);
var secondAntinode = secondAntenna + (secondAntenna - firstAntenna);
valid.Add((i, j));
previousTreeSize = size;
if (firstAntinode is { X: >= 0 and < GridSize, Y: >= 0 and < GridSize })
{
antinodePositions.Add(firstAntinode);
}
if (secondAntinode is { X: >= 0 and < GridSize, Y: >= 0 and < GridSize })
{
antinodePositions.Add(secondAntinode);
}
}
}
}
// Check each line from right to left
for (int i = 0; i < grid.GetLength(0); i++)
{
int previousTreeSize = -1;
for (int j = grid.GetLength(1) - 1; j >= 0; j--)
{
var size = grid[i, j];
// The tree on the left is blocking the view, don't take it
if (size <= previousTreeSize)
{
continue;
}
valid.Add((i, j));
previousTreeSize = size;
}
}
// Check each column from top to bottom
for (int j = 0; j < grid.GetLength(1); j++)
{
int previousTreeSize = -1;
for (int i = 0; i < grid.GetLength(0); i++)
{
var size = grid[i, j];
// The tree on the top is blocking the view, stop searching on this column
if (size <= previousTreeSize)
{
continue;
}
valid.Add((i, j));
previousTreeSize = size;
}
}
// Check each column from bottom to top
for (int j = 0; j < grid.GetLength(1); j++)
{
int previousTreeSize = -1;
for (int i = grid.GetLength(0) - 1; i >= 0; i--)
{
var size = grid[i, j];
// The tree on bottom is blocking the view, stop searching on this column
if (size <= previousTreeSize)
{
continue;
}
valid.Add((i, j));
previousTreeSize = size;
}
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Total viewable trees: [yellow]{valid.Count}[/][/]");
AnsiConsole.MarkupLine($"[green]Unique antinode positions count: [yellow]{antinodePositions.Count}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
var grid = CreateGrid();
HashSet<Point> antinodePositions = [];
var maxScenicScore = 0;
var frequencyAntennas = ParseAntennas();
// Compute scenic score for each tree
for (int i = 0; i < grid.GetLength(0); i++)
// Find antinodes for each frequency
foreach (var (_, antennas) in frequencyAntennas)
{
for (int j = 0; j < grid.GetLength(1); j++)
// Take antennas by pair to find antinodes
foreach (var firstAntenna in antennas)
{
var size = grid[i, j];
var score = ComputeScenicScore(grid, i, j, size);
if (score > maxScenicScore)
foreach (var secondAntenna in antennas.Where(a => a != firstAntenna))
{
maxScenicScore = score;
// Always add antinodes on antennas if a pair is formed
antinodePositions.Add(firstAntenna);
antinodePositions.Add(secondAntenna);
// Compute potential antinode positions
var firstAntinodeOffset = firstAntenna - secondAntenna;
var secondAntinodeOffset = secondAntenna - firstAntenna;
for (var i = 1; ; i++)
{
var firstAntinode = firstAntenna + (i * firstAntinodeOffset);
if (firstAntinode is { X: >= 0 and < GridSize, Y: >= 0 and < GridSize })
{
antinodePositions.Add(firstAntinode);
}
else
{
break;
}
}
for (var i = 1; ; i++)
{
var secondAntinode = secondAntenna + (i * secondAntinodeOffset);
if (secondAntinode is { X: >= 0 and < GridSize, Y: >= 0 and < GridSize })
{
antinodePositions.Add(secondAntinode);
}
else
{
break;
}
}
}
}
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Max scenic score: [yellow]{maxScenicScore}[/][/]");
AnsiConsole.MarkupLine($"[green]Unique antinode positions count: [yellow]{antinodePositions.Count}[/][/]");
}
}
private int ComputeScenicScore(int[,] grid, int i, int j, int size)
private FrozenDictionary<char, List<Point>> ParseAntennas()
{
var visibleTreeCountLeft = 0;
var visibleTreeCountRight = 0;
var visibleTreeCountTop = 0;
var visibleTreeCountBottom = 0;
var antennas = new Dictionary<char, List<Point>>();
// Look on left
for (int x = j - 1; x >= 0; x--)
var y = 0;
foreach (var line in Input.AsSpan().EnumerateLines())
{
visibleTreeCountLeft++;
var nextTreeSize = grid[i, x];
var x = 0;
// Blocking the view
if (nextTreeSize >= size)
foreach (var frequency in line)
{
break;
if (frequency is '.')
{
x++;
continue;
}
if (!antennas.TryGetValue(frequency, out var list))
{
list = [];
antennas[frequency] = list;
}
list.Add(new Point(x, y));
x++;
}
y++;
}
// Look on right
for (int x = j + 1; x < grid.GetLength(1); x++)
{
visibleTreeCountRight++;
var nextTreeSize = grid[i, x];
// Blocking the view
if (nextTreeSize >= size)
{
break;
}
}
// Look on top
for (int y = i - 1; y >= 0; y--)
{
visibleTreeCountTop++;
var nextTreeSize = grid[y, j];
// Blocking the view
if (nextTreeSize >= size)
{
break;
}
}
// Look on bottom
for (int y = i + 1; y < grid.GetLength(0); y++)
{
visibleTreeCountBottom++;
var nextTreeSize = grid[y, j];
// Blocking the view
if (nextTreeSize >= size)
{
break;
}
}
return visibleTreeCountLeft * visibleTreeCountRight * visibleTreeCountTop * visibleTreeCountBottom;
return antennas.ToFrozenDictionary();
}
private int[,] CreateGrid()
private readonly record struct Point(int X, int Y)
: IAdditionOperators<Point, Point, Point>,
ISubtractionOperators<Point, Point, Point>,
IMultiplyOperators<Point, int, Point>
{
var lines = Input.Split('\n').Select(s => s.Trim()).ToArray();
var grid = new int[lines.Length, lines[0].Length];
for (int i = 0; i < grid.GetLength(0); i++)
public static Point operator +(Point left, Point right)
{
for (int j = 0; j < grid.GetLength(1); j++)
{
grid[i, j] = int.Parse(lines[i][j].ToString());
}
return new Point(left.X + right.X, left.Y + right.Y);
}
return grid;
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);
}
}
#region Input
public const string Input =
"""
220102001303332210111144403232401113333122342344231242454143210203320302212443030013122003001101100
002012111323310331302003042221132010432132445255133124455255223004414440440003301012203200022100210
200201202011003110423331304200331011531224544245554512113213335525210302033141324322321031312102110
100020212221032131124244103404003222433224521422334123232422124515312313433224100204010121132311000
200113321032110240111004030043155443522233113242534443312241445211112450323031312112213000023232100
000123222130133422212242344055134444215311551422533215421415442551425225432130430124043210211111310
220013001310041302023441034332322423241253523413533421512551432233114553552003013120121302130121320
103122021001324130041021443134551553414353255343356623553131221454542451225451442032131420112320101
012123121220242033212021343121244143344324534625253522262464534215422121222134240012234133102111220
330310331223230000003152443554413335326665536266322522652335566553114314142351411020403401413302112
033203120011110011132251145135331144533354253453463224233644324632453434135523253300131220303213123
320111230330142103134512313345346434643654336344264466663434525446644113511452351451422214014013322
001132233321313303345535112443242622242446334234425332545346556362543355243332135453212444110331303
112033313244310423153325243233225655536462366623456645652435535435325433454445524512423111021132122
313313043314211444453212142362452645555543222645663664243443432442223333565131234141351344321344102
131230133213133211232332525334634543566623665537334334547734623265434432455254451425235432443212211
033344041000113254352455455346236225633465644343664557364344535543336532242444234311533433344140212
213210413044552341333323656654354424366446744766744473434577534775255332236334522521333331002022121
223112203001555435245233523555243667443447767433564533557556755677732432236462355155425414244240300
031112340101154335334634566542526467535374465476634474475365364377737233444423444335143215320411041
010203132113252122424352345322745777347553756767766736766655557657446763326426264545545441510322304
321034434351253424555342636457546533636345766763737363536656637564757633453436366225532223151301123
140333103113245552456543556436376775537436555564765867677377566536736367466446544545111231522432042
344202325543255413523362252766476773354345756567775846446585764655346457333656245566142114252141442
300442033331415536626644654454735373634646576484854768867856765345656633644236246242335514321313432
422444251112412665556253554536437336675554766648744646768865576456545754676632532244262315154431312
202304543452455552253665657746647784558765457564785778845788767784833536336745445354462312521531440
443202253112536253525354345435633886668445868754667447674764886554756567546737654246334325241222041
444423415155442365223265743454556684558776766888858567565767784775755635475565754224462452335222241
344303321125225553466564654375755674684544768955877976656855558645744675543644552655335222244234041
300235531322254555657355344757787845684787759755989576658884775746464854347454745445252251123331200
202355355135453623555734775437867546864765789685787875887555685885564677653753475626332543431524440
123112125155234436477477667347767767746589595765887578895688659457644647637353775542533353231324344
410231223354354564265577744565557576558859695696978987776856795557766747576576743622336235154122541
144345221145432366464547578854445477995896778965569886979678656986544557875776343376245336222211154
041355524153432432536456778856655655586558689789676558987567866689878584574356765462664355555422315
043213424536224446535754387584686658555998969679778967988975666897764557557733673744622262412325233
101514245332544663477377677875765977975768579996797978899567698975768865784644537776543454651544223
055515332353232236436447686544477656596959996666689896787797795969665874555543664764442344265232243
222545542226664544634434558757485778565956766669899769668998978795896868888674777634532432531545351
434314333334362377634654477865886799965779778887799678789966958767788684856666356767346645644343444
052335546342344533746576644847456965678786776877897777697767787998596844688878543443425354265524523
245321436235332754756734464668569895557967788998689969678678888859577664555777765333674636253522234
222511135542326767344777655475586999669889777967697967976779776769789666884457455657536456246131555
254433214252433545454764655656756765598866789679798998989699886966798756574757563674433652342254411
252443455634345774563668584548569877777679776897897977978768868758769758655687433345452443435424512
312151563634655557774676587765775678576967989777779888989698876657887877756744456665655635556644123
255315424526333665355778666668586665799969869877998777889777988668875966868565465457776522236513141
141324353246555364776377784867669969887687879788978777778977696768597689744655653757436644265454325
354554356562633675467576477485995977969979699799889979879876989688558895876557644555777244452335314
235324556262356365436555887646778779897999678779989989789867689977685966845857674434347554655643252
413432246554227346473675665849975567696667989798798778788967877675576875667875866434546262246521543
552324452542255347547654567456656665796776679978889979999797899897878689747764654756336634422352455
132142446224635664776385465487598668797987978789877989998967699965559668558447437465553652345225512
535121326642222474774354544766768756799778998798789898877898889965958696446887843476762526426515244
345151122435326774546477755588766796667978679897798799788798667756596585444845757774352236466242124
324135422245435777577646446776855665599676997689997887788889876766665986567668467764463526524522524
325343515546653536653454765454579566578777977788879878787979966579696677474785343347473444324354355
411221244324436736446567757755797766577698989699898679769679676797557885877546755664674522365314215
011225512566433343766434774658485575577887896689896789789788897667989867646846655537445534555245154
353122224246523453336574684477667558859686788676888887889677967668868867745484457553323245424151214
025211533334552466553436874465855779555988968677869768998666855765958765844553645533522566662215435
011144555564545656657564766665457958988879979779789696768889888785895588848586367454333255641115431
312135513646235366335766645784546897755855986679986669787888667577687576776674647476324553225412153
401131435555652456777737485558685475567889776796686996966887777867565457675674635564364663332115334
111542111546535443776533554556858445867565786988765999858788986988467667765674337645225253433114412
324152522543244453747533764587454556659676798855686758699569787576577568846344576564242526335344431
123513525116652325364735577676854466795879775965858579978758766786788576585574533555234644544424444
201422231514666656435556464744556487779676697575668797755696587875664885475643663462362633532152224
443133412441244332664735557756557478667877999697777576977768645754645558333564346654626425334525344
431015242443666335263335435575686474856864565688697865686896558787678553436564534565256645251434512
010022255222133364253766673665475577467776484765858776654564844676776444447654375652434614143215022
112002141144134663334274465647734767886457477454887888474577867446657475453544742245245225443332224
331232153352336525225567445365565486747774487468877475878758554778586376763333443326544225345123013
320123541455416433363426343365775545857885758565575848877877686547673556675754423464442514232324111
042432343324232554524246554574474345666464658776446546567878767443577744556362465553665411142432422
142111123322431534522545253754364545474457775847846786887674646573467346333352524442333115335223141
344133332441235422454233333556736343777476764657687856476465776533456554442553426542432524345343333
200031013552112555654336435633347655674473538755855765665344475745556736546535462654344221551230302
304022204315531423544354645467655764773637456746376536645753764476654735362436623665431353330033320
001214000225135351445433524663673656735567443667544556374445736766637732424362445435124235202421144
133240444115255522316642262344554645657446334644647444534543345455733253453543223511253231133210321
324313341004114352115254632235242543363566666546735757746734646346355536356645334223223155213043334
322012103401425423541123244634634342577565467364645454366476547536536356344363313411143511003322321
030233343013121433455142565364335554237444577544465747334546363663525346435245514412331312412441220
210201421410133422542335534522343332455655473755663556635632662655563553445642432325453033042340112
012224401212432145413124536446542562653225343456763356434464356455233544345355532151231212104022112
312232323430402414252325451525553345425256326265324326656464322435443535213233315511433100124021321
010230232102113031224241215434543254266544664634225463436365465636465234441113521431122331212121101
212212302203143433332245352152333246623456656325435343642442543354454522241344343333411433411331230
011102200023414304323524211214225553365332454633645434256444354263245252314454334421304444012133303
120113010124021413002342554241434235565233233626345455655236425423152444344321441224210011210001020
101033322321412021400115241224135351431466535533654236552223322311141154321444212340220200110122301
011220031300131001424314223221135334414132553352224226351421342145342332444324224232200001102210233
121312303322224212003013214154522352135431322413434142221234334123523122531033230010321012211132201
012020110022314203102101331443513341244141113213442111455332441213534235144341443443042312110221221
100013222332201123334301101412554224524144445454322353452424512151232340130231214403422202221333120
211200011012011223124042241233103554151124335225451435512351451314113131210120200021021301331230211
222211000301233212310103403144201411351211113145331241322345244155131304344032001313100223022021012
""";
#endregion
}

File diff suppressed because it is too large Load Diff

1000
Inputs/Day1.txt Normal file

File diff suppressed because it is too large Load Diff

60
Inputs/Day10.txt Normal file
View File

@@ -0,0 +1,60 @@
670107898789217654342123456782345678011256767898765465432101
789234567654308210256034105891089019100349897767874376569101
658341234530989300107845234521078323270110588758901287478272
345450347621895418916976367652569454589223679643210896564383
430569678934786917014989898743458765678334534554034787665898
521678432825677806323876321212345107895450128765125693456721
437876501910543215214985400303434234784966549834296502107610
108978967865676784305673212345125105672877838126787411098523
232169054654985895676894501876056216781236923035498321015432
147054103023984104389087662943237645890321015676325677896761
058943212110873201243179879850198732765430234588714986234890
167687601101164012652234568766784321887342101899603215105659
678996511231054873701221978955693870996456701234514504378778
982123490543123964823400876554212987345980896785603673069867
765010587650123455916512345443403456287671015498512982154956
876523018567656996507845678932212310196542564321027854323241
985452109898743887765930987821054321203433473452567761018130
784343216789212701894321076543065010012128982867658956789021
891238345323105611256232565332170321234089801998943441034330
760189653410134320347183423469981236985178767870832332125545
654308754589823412398094012578876547876589454561221089076556
569210345676210503480189017665014566981074305432012670988987
778123216784345676503276328984323475212565213456587521267981
898014505891256985214965410810012984303456432347895430345670
785210676540787694345898325723678778984234541056498741234321
654321987034896001256763676554569560128105650110345657876434
321039654126789123347854985438765430439876763431233054965235
490318743256770104098923821129654321540569892343212123452196
581401232149863265121012530034341013691456701456504567861087
672310345038054396432343448101231012782347650987623438932387
965498786521178987503453559874342103452878943298510129873498
878945697810265089612354567565213478501987801123456018784567
969034398924354108743543658106904569612016772010567105695436
450123454589443298874632109237876548743125983400198234306721
343210545476554581965549434312361039654334876510256543217810
012654556321055670123678323403456128761242108981347789878934
101763217898765432252101410589567545650543567432098236712125
249890106789854501343234521673498432787694656548123145601016
432187678768763312854145636762876501098781067439054006432567
243014569659643210965098745891985411239872358928765419647898
156103012346501349876787876740694320540965443210474328756787
067612101236432358565678945056543217601453456754389845643896
198787656345678967632365432127680108912322589863265434512387
234594565676589874541050121218998012301011267770172123001989
109683410789490163698210930300107321694120178089085012123476
658762125610301252784327845451256430783243569172196781018565
567891034521212341075456786965344567654652410234505492109410
656900347234301056789845697874498698676701322343012343478326
543211298165692345698926543289567789589887011452321034567567
432104347076780434767810432101125654434996320961478933003498
218765456987101229896321101911036763221745467870567122112567
309894365896234310785410110876545894100876786987651033678985
456789223345985401656789212567030345210965495698776544543234
787650110276576564565094303498121236321234324308989434350198
896343023183465433004185478767870387123456710217375621060167
125432134092174332113276769365968791001249854567434789871256
034334547894089211223498853478959601098345983098723348964343
301227656323456200124567942562344512367896572129810254328321
212018965214387103438901231001123201456087561234722167219450
323127656103898234567872102121010126545123450165621098308761

1
Inputs/Day11.txt Normal file
View File

@@ -0,0 +1 @@
0 7 6618216 26481 885 42 202642 8791

140
Inputs/Day12.txt Normal file
View File

@@ -0,0 +1,140 @@
MMNNPPPPGGGGAGGPPPPPPPPPZZZZZZZLLLLLLLEEEEEEEEEEEEEEEAAAAAAAAAAAAAAAAAAAAMMMMNNMMMMMMMMMMMMMMMMAARRRRRRRRRRRRRRRRRRHHHHHHHHHHHHHAAAAAAAAAAAA
MNNNPNPPGGGGGGGPPPPPPPEPZZZZZZZLLLLLLLWWEEEEEEEEEEEEEAPAAAAAAAAAAAAAAAAAAMMMMMMMMMMMMMMMMMMMAMMAARRRRRRRRRRRRRRRRQRHHHHHHQHHHHHHHWAAAAAAAAAA
NNNNNNNPGGGGGGGGPPPPPPPZZZZZZZZZLLLLLLLEEEEEEEEEEEEEEPPPPAAAAAAAAAAAAAAMMMMMMMMMMMMMMMMMMMMMAAAAAAAAAVRRRRRRRRRQQQQHHQQHQQQHQHHHHWWWWAAAAAAA
NNNNNNNNGGGGGGGPPPPPPPPPZZZZZZLLLLLLLLLLEEEMEEEEEEEEEEPPPPAAAAAAAAAAAMMMMMMMMMMMMMMMMMMMMMMMMAAAAAAVVVVRRRRRRRQQQQXQQQQQQQQQQQQHHHWWWWWAAAAA
NNNNNNNYYGGGGGGPPPPPPPPPZZZZZZZLLLLLLLLMMMMMEEEEEEEEEPPPPPPAAAAAHAAAAMMMMMMMMMMMMMMMMMMMMMMMMMMAVVVVVVVRRRRRQQQQQQQQQQQQQQQQQQQHHWWWWAAAAAAA
NNNNNNNXYYYCCCIPPPWZPPPPPZZZZZZLLLLLLLSSMMSSEEEEEEEPPPPPPPPPPAAHHAAAAHMMMMMMMMMMWWMMMMMMMMMMMMMMMDDVVVVRRRRRRQQQQQQQQQQQQQQQQQQHHWWWWWAWAAAA
NNNNNNXXYCCCCCIPPPPZZPPPZZZZZZZZLSLSSSSMMMSSEEEEEEEPPPPPPPPPPPAAHHAAAHHMMMMMMMMMMWMTTMMMMMMMMMMDDDDVVVVRRIIMRMMMQQQHTTQQQQQQQQQQQWWWWWWWWWWA
NNNXXXXXXCCCCCCXPZPZZZPZZZZZZZZZZSSSSSSSSSSSEEEEEEEEPPPPPUUXXXHAHHHAHHHMMTMMMTMMMMTTTMMMMMMMMMDDDDDVIIIRIIMMMIMZQQQHTHQQQQQQQQQQAAWWWWWWWWAA
NNNNXXXXCCCCCCCZZZZZZZZZZZZZZZSSSSSSSSSSSSSSSSEEFFPPPPPUUUXXXHHHHHHHHHHHTTMMMTMMMMTTTTTMMMMMMDDDIDDVIIIIIIIMMMMMQQQHHHQQQQQQQQQQAAAWWWWWAWAA
NNNNNXXXXCCCCCAVVZZZZZZZZZZZUUUSSSSSSSSSSSSSSFEFFFFPPPPUUUXXXXHHHHHHHHHHHTMTTTTTMMTTTTTTMMMDMDDIIIVVIIIIIIIMMMMMMQQHHQQQQQQQQGGGQAAAWWWAAAAA
NNNNNXXXCCCCCVVVVVVZZZZZZZZUUUUSSSSSSSSSSSSSFFFFFFFPPPUUUUXUXHHHHHHHHHHHHTTTTTTTMMTTTTTTMMDDDDDDIIIIIIIIIIIMMMMMMQIHAQQQQQQQQQQQQAAAAAWAAAAA
NNNNNNXCCCCCCCVVVVZZZZZZZZZUUUUSSSSSSSSSSSSSSFFFFFFPPPUUUUUUXHHHHHHHHHHHHHTTTTTTTTTTTTTTTTTDDDAAAAIAIIIIMMMMWMMDDGGGAQQQQQQQQQQQQQAAAAAAAAAA
NNNNNNNCCCCCCCCVVZZZZZZZUZZUUUUSSSSSSSSSSSFFFFFFFFFFPPUUUUUUUHHHHHHHHHHTTTTTTTTTTTTTTTTTTTDDVVAAAAAAIIIIIIIMMTTDDGGGAQQQQQQQQQQWWWUUUAUUUAAA
NNNNNNNNCCCCCCCCVVZZZZZZUUZUUUUSSSSSSSSSSSSSFFFFFFFFPPUUUUUUHHHHHHHHHHHHHHTTTTTTTTTTTTTTTTTDVVXAAAAAIIIIIIIMTTTTTTTGGQQQQQQQQQQWWWUUUUUAAAAA
NNNNNNNNNNNCCCCCCCZZZZZZUQUUUUUUUSSSSSSSSXSSOFFFFFFFFPPPPUOOHHHHHHHHHHHTTTTTTTTTTTTTTTTTTTTDVVVAAAAAAIIIIIIMTTGTTGGGGQQQQQQQQQQWWWUUUUUUAAAA
NNNNNNNNNNCCCCCCCCZZZZZUUQUUUUUUUSSSSSSSSSSOOOOFPFPFPPPPPPPPPPHHHHLHHHHTTTTTMMMTTTTTTTUTTTTDDVVVVAAAAIIIIIIMTTTTTGGGGQGGGQQCQQWWWWUUUUUUUUUA
NNNNNNNNNNNNCCCCCBBMZZZUUUUUUUUUUSSSSSSSSOOOOBBPPPPFPPPPPPPPPPXHHHHHHHHTTPTTMMMTTTTUTUUUUUUUVVVVVVVAAAIIIIIITTTTTGGGGGGGGQFFWWWWWWUUUUUUUUUU
NNNNNNNNTNCCCCCCBUBBHCCCUUKUUUUUSSSSSSSSOOOOOBBPPPPPPBPPPPPPPPHHHSSSSHPPPPPMMMMMTTTUUUUUUUUOUVVVVVVAAIIIIIIITTTTGGGGGGGGGFFFWWWWUUUUUUUUUUUU
NNNNNNNWCCCCCCCBBBBBBCCCCCUUUUUUSSSSSRRRROROOOBBBBBBBBBBPPBBBBHSSSSSSSPPPPPMMMMMTTUUUUUUUUUUUVVVVVVVVVVVVXIITTTGGGGGGGFFFFFFSSKWUUUUUUUUUUUU
NNNNNWWWWCCCCCCCBBBBHCCCCCUUUUUUUSSTGRRRRRRRRBBBVBBBBPPPPPBBBBSSSSSSSSPPPPPPMMMMMTTUUUUUUUUUUVVVVVVVVVVVVXXUUGGGGGGGGGFFFFFNSSKKJUUUUUUUUUUU
MMMWWDWWIWWCCCCBBBBBBCCCCCCCCCCCCCGGGGRRRRRRRVVVVBBXXXXXPPBBSSSSSSSSSPPPPPPPMMMMMUTUUUUUUUUUUUUVVVVVXXXXXXXUUGGGGGGGGGFFFFFSSKKKJUUUUUUUUUUU
MMMMWWWWWWWCCCCBQBBBBCCCCCCCCGGCGGGQGGRRRRRRRVZZZZZXXXXXBBBSSSSSSSPSPPPPPPPPPMMMMUUUUUUUUUUUUUUFVVVVXXXXXXXUUUUGGXGGGGGFFFFAAAKKJUUUUUUUUUUU
MWWWWWWWWWCCCCCCQBQBCCCCCCCCCCGCGGGGGGRRRRRVVVVVZZZXXXXXZBBSSSSSSSPPPPPPPPPPPMMMMMUUUUUUUUULFFUFFVXXXXXXXXXUUUUGXXGGGEFFFKKKKAKKKKKUUUUUUUUU
WWWYWWWWWWKCCCQCQQQCCCCCCCCCCGGGGGGGGGGGGGGVVVVVVZZXXXXXZZBBSBBSSSPPPPPPPPPEEMMMMMGUUUUUUUULFFFFVVXXXXXXXXXUUUUUBBUUGEFFFKKKKKKKKKUUUUUUUUUU
WWWWWWWWWWWQQQQQQQQCCCCCCCCCCGGGGGGGGGGGGGGVVVVVVVZXXXXXKKKBBBBSSSSUUPPPPPPEMMSMMGGVAAAUUQFFFFFFVVVVVXXXXXUUUUBBBUUREEEMMKKKKKKKKKKKUUUUUUUU
RWWWWWWWWWWQQQCQQQCCCCCCCGGGGGGGGGGGGGGGGGVVVVVVVVVXXXXXKKKKKBBBBBSSUPPPPPSMMMSSMMGVVVVVVQFFFFFFFFVVVXXXXXUUBUBBBBBREEEMMMMKKKKKKKKKUHUUUUUU
WWWWWWWWWWWQCCCQQQQCCCCCCCCCGGGGGGGGGGGGGGGVVVVRVVRXXXXXKKKKBBBBBBBBPPPPPPSSSSSSMMMVVVVVVVFFFFFFFFFFFXXHXUUBBBBBBBRRREMMMMMKKKKKKKKKKHHHUUUU
WWWWWWWWWWWCCCCQQQCCCCCCCCCIGIIGGGGGGWGGGGVRRRRRRRRXXXXXKKKKKKKBPBBPPPPPPSSSSSSSSMVVVVVVVVVVFFFFFFFFFHHHUUBBBBBBBRRRMMSMMMKKKKKKKKKKKUHUUUUU
WWWWWWWWWWWWCCCCCCCCCCCCCCIIIIGGGGGGGWGGGVVRRRRRRRXXXXXXKKKKKBBBPPBPPRPPPPPSSSSSSVVVVVVVVVVVAFFFFFFFFFHHHHIBBBBBRRRRMMMMMMSKKKKKKKKVVUUUUUUU
WWBBWWAWWUUUCCCCCCIQQCCCCIIIIRRRRRRRWWWGGVRRXXXXXXXXXXXXKKKKBBBBPPPPPPPPPPPPSSSVVVVVVVVVVVVVAFFFFFFFFFHHHBBBBBHHHRRRMMMMMMMKKKKKKKKVUUUUUUUU
WWWAAAAWUUCCCCCCCIIICCCCCIIIIRRRRRRRWWGGVVVVXXXXXXXXXXXOBKBBBBBPPPPPPPPPPPPPPPPPLVVVVVVYVVVEFFFFFFHHHFFHHHHHBBBBHHHMMMMMMMMMKKKKKUUUUUUUUUUU
WWWAAAAUUUUCCCCCCIIIIIIIIIIIURRRRRRRRRGGXXXXXXXXXXXXXXXRBBBBBBBBPQPPPPPPPPPUPPXEEVEVVVVVVVEFFFFFFFHHFFHHHHHHHHBHHMMMMMMMMMMMKKKKKKKKUUUUUUUU
WWWAAAAUAUUCCCCCCLLIIIIIIIIUURRRRRRRRRGGXXXXXXXXXXXXXXXRRBBBBBBBPPPPPPPPPPPUPVEEEEEVVVVEVEEEEEFFFFHHHHHHHHHHHHHHHHMMMMMMMMMKKKKKKKKUUUUUUUUU
WWAAAAAAAAUEEEOOOLIIIHIIIIIIURRRRRRRRRXXXXXXXXXXXRXXXXXXRBBBBBBBBPPPPBPPPBEBBBEEEEEVVVEEEEEEEEEEFHHHQHHHHHHHHHHHHHMMMMMMMMMMMKKKKKUUUUUUUUUU
OOAAAAAAAAUOOOOOOLLLLIIIIIIIURRRRRRRRRXXLLLLXXXXXRXXXXXXRRMBBBBPBPPPPBBTPBBBBEEEEEEEEVEEEEEEEEEEFQQQQHHHHHHHHHMMMMMMMMMMMMMMMMMKKKKUUUUUUUUU
OACCAAAAAGAOOOOOOELLLLIYIIRRRRRRRRRRRRXLLLLLXXXXXRRRRXXXRRRBBBBJKKPPPBBBBBBBBBEEEEEEEVEEEEEEEEEEEQQQQQHHHHHHHHHMMMMMMMMMMMMMMMMKKKUUUUUUUUUU
AAAAAAAAAAAOOOOOEEELLLIYYVRRRRRRUUUUXXXLLLLLXXXXXRRRRXXXRMRBBBBJKJUBBBBBBBBBBBCEEEECEEEEEEEEEEEEQQQQQQHHHHHHHHHMMMMMMMMMMMMMMMWDDDWUUUUUUUUU
AAAAAAAAAAAOOOOOUULLLYYYRRRRRRRRUUUUXXXXLLLLXXXXXXXXXXXXXMMCCBLJJJUBBBBBBBBBBQCCCCCCEEEEEEEEEEEEEFQQQHHHHHHHHMMMMMMMMMMMMMMMMWWWWWWWUUUUUUUU
AAAAAAAAAAROOOOORRRRRRRRRRRYYDUUUUXXXXXXXLLLXXXXXXXXXXXXXCCCCCJJJJUUUUUBBBBCCCCCCCCCCEEEEEEEEEEEEEQQQEEHHHHHHHMMMMMMMMMDDDDDMWWWWWWUUUUUUUUU
ZZAAAAAXAAROOOOORRRRRRRRRRRDDDUOUUAAXXXXWWLLLLRRXXXXXXXXXCCCCJJJJJJJJJJBBBLLLLLCCCCCEEEEEEEEEEEEEEEEEEEHEEEHHHMMMMMMMDDDDDDWWWWWWWWWWUWUUUUU
ZZZAAAAOOOOOOOOORRRRRRRRRRRYDUUOUUUAXXXXXAAAALRRXXXXXXXXXCCCCCCCJJJJJLLLLLLLLLCCCCCCEEEEEEEESEEEEEEEEEEEEEHHHMMHMMMMDDDDDDDWWWWWWWWWWWWWWUUU
ZZZAAAUOOOOOOOOORRRRQYYYYYYYYOUOUUAAAAAAAAAAALRRXXXXXXXXXCCCCCCJJJJJJLLLLLLLLLCCCCCCCCEEWWEEEEEEEEEEEEEEEEEHHHHHMHHHQQQQQQQQWQWWWWWWWWWWWWUU
ZZAAXAUOOOOOOOOORRRREYYYYYOOOOOOOOAAAAAAAAAAAARAAAAAZXXXCCCCCCCJJJJJJJLLLLLLLLCCCCCCCCEEWWWEEEEIEEEEEEQQHHHHHHHHHHHQQQQQQQQQQQWWWWWWWWWWWWUU
ZZAAXAUOOOOOOOOORRRROOYYREOOOOIOOOAAAAAAAAAAAARAAAAAZZZYYCCCCCCJCJJJJLLLLLLLLLCCCCCCCCCWWWEEEEIIEEEEEEEQQHHQHHHHHHQQQQQQQQQQQQWWWWWWWWWWWWUU
ZZAAUUUOOOOOOOUUEEEEEEEEREOOOOIOOOAAAAAAAAAAAAAAAAAAZZZYYYYCCCCCCCCLLLLLLLLLLLLLCCCCPCWWWWEEEEIIIIEEEEEQQQQQHHAQQQQQQQQQQQQQQQWWWWWWWWWWWUUU
PPPPPYUOOOOOOOEEEEEEEZEEEEOOOIIIIOAAAAAAAAAAAAAAAAAYYYYYYYYCCCCCCCCLLLLLLLLLLLLLCCCPPCWWWWWEEEIIIIEEEEQQQQQQQJJJJQQQQQQQQQQQQQQQQWWWWWWWUUUU
PPPZYYYOOOOOOOOOOOEEEEEEEEIIIIIIIIAAAAAAQQAQAAAAAYAYYYYYYYYCCCCCCCLLLLLLLLJJLFLFFCTFFWWWWBBEEIIIIIKQQEQQQQQQJJJJJQQQQQQQQQQQQQQQQQWWWWWWUUUU
PPPZYYYYYYYYYOOOOOEEEEEEEIIJIIIIIIACAAQQQQQQQAAYYYYYYYUYYYYCCCCCCCCLLLLLLLFFJFMFCCFFFSBBBBBBIIIIIIIQQQQQQQQQQQJJJJQQQQQQQQQQQQQQQQQWWKWWWUUU
PPPYYCYYYYYYYOOOOOOEEEEEEIIIIIICCCCCCCCCCQQQQQYYYYYYYYYYYYYCYCCCCCCCLOOOLLFFFFFFFCFFFSSBBBBBIIBIIIBBQQQQQQQQQQQJJJQQQQQQQQQQQQQQQQQWLWWWWUUU
PPYYYYYYYYYYYOOOOOOEEEEEEEIIIIICCCCCCCCCCQQQQQQQQYYYYYYYYYYYYCCCCCCOOOOOLHHFFFFFFFFFFFSSBBBBBBBIBBBQQQQQQQQQQQQQJJJQNQQQQQQQQQQQQQHHHHWWWWUU
PYYYYYYYYYYYYOOOOOOEEEEEEEIICCCCCCCCCCCCCQQQQQQQQYYYYYYYYYYCCCICKITOOOOOHHHFFFFFFFFFFFFFBBBBBBBBBQQQQQQQQQQQQQJQJJJOQQQQOQQQQQQQQQQHHHHWWWHH
PYYYYYYYYYYYYOOOOOOEEEEEIIIICCCCCCCCCCCCCQQQQQQQQYYYYYYYYZYSCCIIKIIOOOOOHHFFFFFFFFFFFFFFFFBBBBBBBBQQQQQQQQQQQQJJJJOOOQQQOQQQQQQQQQHHHHHHWWHH
PYYYYYYYYYYYYOOOOOOEEIIIIIIICCCCCCCCCCCCCQQQQQQYYYYYYYYYYYYIIIIIIIIOOOOOHHFFFFFFFFFFFFFFFBBBBBBBBBQCQQQQQQQQXXXJJKKOOQQQQQQQQQQQQQHHHHHHHHHH
PPPPYYYYYYYYYOOOOOOIEIIIIZZZCCCCCCCCCCCCCQQQQQQQPYYYYYYYYBYBIIIIIIIOOOOOIHHFFFFFFFFFFFFFFBBBBBBBBBBQQQQQQQQQXXXKKKKKKKKKKKQQQQQHHHHHHHHHHHHH
PPPYYYYYYYYYYOOOOOOIIIIIIZZZCCCCCCCCCCCCCQQQQQQPPPYYYYYYYBBBIIIIIIIOOOJJIIFFFFFFFFFFFRFFFBBBBBBBBBBBQQQQQQQQXXXKKKKKKKKKKKQQQQQHHHHHHHHHHHHH
PPPPPYYYYYYYYOOOOOOIIIIIIZZZCCCCCCCCCCCCCMQQQQQQQYYYYYYYYYYBBIIIIIIOOOOOOFFFFFFFFFFRRRFBBBBBBBBBBBBBBBQQQQQQQXKKKKKKKKKKKKQQQKQKHHHHHHHHHHHH
PPPPPYYYYYYYYIIIIIIIIIIIIIZZCCCCCCCCCCCCCCCCCCCCCGGYYYYYBBBBIIIIEEIIOOOOODFFFFFFVBBRRRRBBBBBBBBBBBBBWBQQQQQQQQIIIKKKIKKKKKKKKKKKDDDDDDHHHHHH
PPPPYYYYYYYYYIIIICIIIIIIIIIZCCCCCCCCCCCCCCCCCCCCCGGYYBBBBBBIIIEEEEEEOOOOOFFFFFFBBBBBRRBBBBBBBBBBBBBBWWWWQQQQPQIIIIIIIKKKKKKKKKKKKKDDDDHHHHHH
PPPYYYYYYYYYYICIICCIIIIIIIZCCCCCCCCZZZCCCCCCCCCCCYYYYBBBBBBBIIEEEEEEOOOOOEEFFFFCBBBBRRBBBBBBBBBWWWWWWWWWQWWIIIIIIIIIPIKKKKKKKKKKKKDDDDDHHHHH
PPPPYYYYYYYZYZCCCCIIIIIIIIZZCCCCCCCZZZCCCCCCCAQQAGLYBBBBBBBBBBEEEEEEOOOOOEEEFFWBBBBBBBBBBBBBBBBBWWWWWWWWWWIIIIIIIIIIIIIKKKKKKKKKKDDDDDDDDHHH
PPPPYYJJYZZZZZCCCCIIIIIIIIIFZZZZZZZZZZCCCCCCCAAAAGGGGGGBBBBBBBEEEEEEOOOOOEEEEFWWBBBBBKKBKKBBBBBWWWWWWWWWWWWIIIIIIIIIIIKKKKKKKKKKKDDDDDDHHHHH
PPZPPYJJYZZZZZZCCCCIIIIIFIIFFBFFZZZZAACCCCCCCAGAGGGGGGGGGBBBBEEEEEEEOOOOOEEEEWWHZZZBBWKKKKKBBWWWWWWWWWWAWWWWIIIIIFIIIIKKKKKKKPKKKDDDDNDHHHHH
ZPPPPPZZZZZZZZZCCCCCCUIIFIIFFFFOOZZZAAACCCCCAAGGGGGGGGGGBBBBBEEEEEEEOOOOOEEEXHHHZWWWWWKWWKKWWWWWWWWWWWAAAWWWIIIIIFFIKKKFFFKPKPKKKKDDDDHHHHHH
ZZZPZZZZZZZZZZZCIIRCUUUIFFFFFFFOFBZAAAACCCCCAAGGGGGGGGGGGGBEEEBEEEEEDEDDEEEEXHHHHHHWWWWWKKKKWWWWWWWWWWAAARRWIIIIFFFIFKFFFFPPPPKKKKKPHHHHHHHH
ZZZZZZZZZZZZZZZIIIIIUUUFFFFFFFFFFZZZNANCCCCCAGGGGGGGGGGGGGBBBBBEEDDDDDDDDEEEEEHHHHHWWWWWWKWWWGWWWWWWWWAAARRRIIIIFFFFFFFFFFFPPPKPKKKPPPHHHHHH
ZZZZZFZZZZZSSZZRIIIIUUUFFFFFFFFFFFFFNNNCCCCCGGGGGGGGGGGGGBBBBBBBDDDDDDDDDDEEEEHHHHWWWWWWWWWWWWWWWWWWAAAAARRRIIIIIFFGFFFFFFFFPPPPKPPPPPPHHHHH
FFFFFFZZZZZZSSSIIIIIUUUUUUUFFFFFFFWNNNNNNANGGGGGGGGGGGGGBBBBBBBBDDDDDDDDDDDDEHHHHHWWWWWWWWWWWWWWWWWWAAARRRRRIRIIFFFFFFFFFFFWPPPPPPPPPPPHHHHH
GFFFFFLZZZXZSSSSSSSIUUUUUUUFFFFFFFFFNNNNNNNNNGGGGGGGGGBBBBBBBDBDDDDDDDDDDDDDHHHHHHWWWWWWWWWWWWJJJWAAAARRRRRRRRRIFFFFFFFFFFFWWPPPPPPPPPPPHHHH
GFFFFFFFFZFQFSSSSSSUUUUUUUUUFFFFFLFYNNNNNNNNGGGGGGGGGGBBBBBBBDBDDDDDDDDDDDDDHHHHHHHWWWWWWWWWWWWWJAAAARRRRRRRRRRQFFFFFFFFFFFFWPPWWPPPPPPPHHHH
GGFFFFFFFFFFFSSSSSSUUUUUUUUUUFFFZNNNNNNNNNNNUUUGGGGGHIIBBBBBDDDDDDDDDDDDDDDDHHHHHHHWWWWWWWWWWWWUAAAAAAIRRRRRRRQQFFQRFFFFFFFFWWWWWPPPPPPUIISS
FFFFFFFFFFFFIFSSIIIIUUUUUUUUFFFFINNNNNNNNNNNNNUGGGGIIIIIIIIIDDDDDDDDDDDDDDDHHHHHHHHWWWWWWWWWWWWWCACCCQQQRRRQQQQQQFFRCFFRRFFWWWWWWPPPPPPUUIIS
QQQFFFFFFFFFIFIIIIIIUIUUUUUUUIIIIIINNNNNNNNBNNUUGGGIIIIIIIIIDDDDDDDDDDDDDOEHEHHHHHHWWWWWWWWWWSWCCAACQQQQQQQQQQQQQQQRRRRRRRRWWWWWWPPPPPPPPIIS
QQQQFQFFFFFFFFPIIIIIIIUUUUIIIIIIIIINNNNNNNNNNUUUUUIIIIIIIIIIAADDLDDDDDDDDOEEEHHHHHWWWWWWWWWWHHCCCCCCQQQQQQQQQQTTQQRRRRRRRRRWWWWPPPPPPPPPIIIS
KQQQQQFFFFFFFFFIIIIIIIUUUUIIIIIIIIINNNNNNNNNNUUUUUUIIIIIIIIIADDDLDDDDXXEEEEEEHHHHHHHWWRQQQHHHHCCCCCQQQQQQQQQQTTTTTRRRRRRRRRRPPPPWPPPPPPIIIII
KKKQSSSSFFFFFFFIIIIIIIUIIIIIIIIVIIIVVVNNNNNNNNUNUUUIIIIIIIIDDDDDLDXDDXXEEEEEEEHHHHHHWRRQQQHHHHCCCCCQQQQQQQQQQTTTTRRRRRRRRRSSSPPPPPPPPIIIIIII
SKVSSKSSALLLNLLRIIIIIIIIIIIIIIIVVVVVNNNNNNNNNNNNUUUIIIIIWWDDDDDDDDXXXXXEEEEEEEEHHHHHHRRQQQHHHHHHHCCCQQQQQQQQQTTTTRYRRRRRRRSSSSSSPPPPPIIIIIII
SSSSSSSSLLLLLLLRIIIIIIIIIIIIIIIVVVVVVVNVNNNNNNNUUUUIIIIIDDDDDDDDDDDXDXXEEEEEEEESAHHHHRRQQQQQHHHHHHHHHHHQQQQQQTTTTYYYRRRRRRSSSLLLPPPIIIIIIIIW
SSSSSSSSLLLLLLLLIIIIIIIIIIIIIVVVVVVVVVVVNNNNNNNNNUUIIILDDDDDDDDDDDDDDDDEEEEEESSSSQQIFFFFFFFFUHZHHHHHNNHQQTQTTTTTTYYYYRRVLLLLLLLLBIIIIIIIIIIW
WWWSSSSSLLLLLLLLINNIIIIIIIIIVYVVVVVVVVVVNNNNNNNNUUUUUUUBBDVDDGDDDDDEEEDEEEEESSSSSQQQFFFFFFFFQZZZZHHHHNNNTTTTTTTTYYYYYRRLLLLLLLLLBBIIIIIIIIIW
WWSSSSSSSSLLLLLNISNIIIIIIIIIVVVVVVVVVVVVVNNANNNNNUUUUUULLMLDDGGDDDDEEEEEESSSSSSSQQQQFFFFFFFFQQZZHHHNNNNTTTTTTTTHHYSYYYYLLLLLLLLLBIIIIIIIIIII
WWWSSSSSSSSSSSNNNNNNIIIIIVVVVVVVVVVVVVVVAAAANNNNNUUUUUUULLLDDDLLDDDDEEEEESSSSSSSSSQQFFFFFFFFFFFZZZHNNNNTTTTTTTTHYYYYYYYLLLLLLLLLBIIIIIIIIIIX
WWWSSSSSSSSSSSNNNNNIIIIIIVVVVVVVVVVVVVVVAAANNNNTTTUUUUULLLLLLLLNDDDDMEESSSSSSSSSSQQQFFFFFFFFFFFZJJJJNNNNNTTTTFFFFYYYYYYLLLLLLLLLLLBIXIIIIIXX
WZWZSSSSSSSSSSNNNNNNIIIIIVIVVVVVVVVVVVVVAAAAANNTUUUULLLLLLLLLLLLQDLDEEESSSSSSSSSSQQQFFFFFFFFFFFJJJJNNNFFNTTTTFFFFKKYYYYRLLLLLLLLTTTIIHHIIMMX
ZZZZSSSSSSSSNNNNNNNNIIIIIIIIVVVVVVVVVVVVAAAAETTTQUUUULLLLLLLLLLLLWLLEEESSSSSSSSSSQQQFFFFFFFFFFFJJJJJJJFFFFFFFFFFKKKYYYRRRLLLLLTTTTTHHHHIMMMM
ZZZZSSSSSCCCNNNNNNNNNIIIIIIIVIVVVVVVVVAAAAAEETTTQQUUULLLLLLLLLLLLLLLEESSSSSSSSSSSQSQFFFFFFFFFFFFFFFJJWFFFFFFFFFFKKKKYRRRRRLLLLTSTTTTHHHHMMMM
ZZZZSSSCCCCCYNNNNNNNNIIIIIIIIIVVVVVVAAAAAEEEETTQQQUUULLLLLLLLLLLLLLLEEQSSSSSSSSSSSSQFFFFFFFFFFFFFFFJJFFFFFFFFFFKKKKKKRRRRRLLLLTTTUTTTHMMMMMM
ZZKKCCCCCCCCCCNNNNNNIIIIIIIIIIIIRVVVVAAAAAEEEEEEEQUQLLQLLLLSSSSLLQQLQQQSSSSSSSSSSSSCFFFFFFFFFFFFFFFTJTFFFFFFFFPFKKKKKKRRRLLLLLLLTUTTTHHMMMMM
KKKKCCCCCCCCCCNNNNNNIIIIIIIIIIIIIIAAAAAEEEEEEEEEEQQQQQQLLLLLESSSSQQLQQQSSSSSSSSSSSSSFFFFFFFFFFFFFFFTTTTFFFFFFFFFFKKKRRRRRRLLLLLLTTTTTTHHMMMM
UKKKCCCCCCCCCNNRYYIIIIIIIIIIIIIIIIAAAAAEOEEEEEEEEEQQQLLLLLLLESSSQQQQQQQQSSSVSSSSSSSJFFFFFFFFFFFFFFFTTFFFFFFFFFFFKKKKKRRRRRLLLLLLLLTTTTHHMMMM
UKKCCCCCCCCCCCNCYYIIIIIIIIIIIIIIIIAABAAAEEEEEEEEEQQQQQLLLLLLEEQQQQQQQQQQSSVVSSSSSSSSFFFFFFFFFFFFNNNNTNNFFFFFFZKKKKKKKRRRRLLLLLLLLLTTTTHHMMMM
UKKCCCCCCCCCCCCCYYIIIIYYYYYIIIIIAAABBBBEEEEEEEEEQQQQSSLLLESSEQKQQQQQQQQQSVVVVSSSSPPSFFFFFFFFFFFFNNNNANNNFFFFFFKKKKKKKIIRILBULLLLLLTTMMMMMMMM
UKKKCCCCCCCCCCYYYYYIIIYHYYYYYYIAAAABBBBBEEEEEEQQQQQQSSSSSSSSEQQQQQQQQQQQQQVVQPPPPPSSSYFFFFFFFFFFNNNNNNNNNNFFFFKKKKKKKIIIIIUUUULUTTTTTTMMMMMM
UUKKKCCCCCCCCYYYYYYIYIIHHHYAAAIAAAABBBBBBEEEEEEESSSSSSSSLLSSQQQQQQQQQQQQQQQQQPPPPPSYYYYJFFFFFFFFNNNNNNNGNMMMFFKKKKKKIIIIIIUUUUUUUTTTTMMMMMMM
UKKCCCCPCCCSSYYYYYYYYYYHHFAACAAAAAAABBBBBEEEDDSSSSSSSSSSLSSSHVQQQQQQQQQQQQQQQQQPPPYYYYEEEEEJJJJNENENNNNNNMMMMFKKKKKKIIIIUUUUUUUUUTUTMMMMGMMM
UKKKKKCCCCCYYYYYYYYYYYYHHHAAAAAAABBBBBBBBEEBSSSSSSSSSSSSSSSHHVQQQQQQQQQQQQQQQQQPPPYYYYYEEEEEEEEEENENNNNNNMMMMMKKKKKKIEEIIUUUUUUUUUUUDMMMGMMZ
UKKKKKKKCCCAAAYYYYYYYYYHHHTAAAAAAAABBBBBBBBBBBBSSSSSSSSSSSSVVVQQQQQQQQQQQQQQQXXPPYYYYYYHEEEEEMEEEEEENNNNNMMMMKKKKKIIIEEEEUUUUUUUUUUUMMMMMMMZ
KKKKKKKKTTCCCYYYYYYYYYHHHAAAAAAAAAJJBBBBBBBBBBBBSSSSSSSSSSSSVVQQQQQQQQQQQMQDQXXPYYYYYYEEEEEEEEEEEEEENNNNMMMMMMMMKKEIEEEEEEEPUUUUUMMMMMMMMZZZ
KKKKKKKTTTMMKBYYYYYYYYHHHHHAAAAAAAJJBBBBBBBBBBSSSSSSSSSSSSSVVVVVQQQWQQQQMMXDQXXPYYYYYYYYEEEEEEEEEEEENNMMMMMMMMMKKKEEEEEEEEEEUUZUIMMMMMMMMZZZ
KKKKKKTTTTTMKKYYYYHHHHHHHHHUAAAAAAJJBBBBBWWBBSSSSSSSSSSSSSVVVVVVQTQWQMMMMMXXQXXXXYYYYYEEEEEEEEEEEEEENNNNMMMMMMMKRKEEEEEEEEEEUZZZMMMMZMMMZZZZ
KKTTTTTTTTTTKKYYKKKKKHBHHHHZLAAAAAAJJBBBNWWWRWWSSSSSSSSVVVVVVVVVVVVVQMMMMXXXXXXXPXXYYYYYEEEEEEEEEEENNNNNMWMMMMSSRRREEEEEEEEZZZZZZMMMZMMMMZZZ
KKTTTTTTTTTTKKKKKTKKKHBHHNZZLLLAAAJJJJBJWWIWWWWWSSSSSSSVVVVVVVVVVVVMMMMMMXXXXXXXXXXXYYYYEEEEEEEEEEEEEWWWMWWMMMSSRSSSEEEEEEEEZZZZZZMZZZMZZZZZ
TTTTTTTTTTTTJTTTTTTKKKKHHHZZZZLAAAAAAJJJJWWWWMMMMSSSSSVVVVVVVVVVVVVMMMMXXXXXXXXXXXXXYYYYYYEEEEEEEOWWNWWWWWWWWMSSSSSQESEEEEEEZZZZZZZZZZZZZZII
TTTTTTTTTTTTTTTTTTTKKKKKHHZZZAAAAAAJJJJJWWWWWMMMMSSSSSSVVVVVVVVVVVVVMMMMXXXXXXXXXXXXYYYYYIIIIEIHEOWWWWWWWWWMMMSSSSSSSSSEEEEEYYZZZZZZZZZZZIII
TTTTTTTTTTTTLTTTTTTKKKKKKKKKAAAAAAAAAJJJJJWWWMMMMSSSSSSSVVVVVVVVVVVVVMMXXXXXXXXXXXXXXYYYIIIIIIIWWWWWWWWWWWWMMMSSSSSSSSSEEEDEYYYYZZZIIIIIZIII
TTTTTTTTTTTTTTTTTTTKKKKKKKKAAAAAAAAAJJJJWWWWWMMMMSSSVSSVVVVVVVNVVNNNVMMXXXXXXXXXCXYXXYYIIIIIIIIIWWWWWWWWWWWWMMMSSSSSSSSEEYDYYZZZZZIIIIIIIIII
TTTTTTTTTTTTTTTTTTTTTKKKKKKAAAAAAAAAWWWWWWWWWMMMMCVVVVVVVVVVVNNNNNNNXNNXXXXXXXXXYYYYYYYIIIIIIIIIGWWWWWWWWWWWMMSSSSSSSSSYYYYYYKKZZIIIIIIIIIII
TTTTTTTTTTTTTTTTTTTTTKKKKKKKKAAAAAAAWWWWWWWWWMMMMCVVVTVVVVVVVNNNNNNNNNNKKXXXXXXXYYYYYYIIIIIIIIIIWWWWWWWWWWWWSSSSSSSSSSSZZYYYYYYZJIIIIIIIIIII
TTTTTTTTJTTTTTTTTTTTTTYKKKKKKAAAAAAAWWWWWWWWWMMMMWVVVTVVVNVVNNNNNNNNNNNNKXXXXXYYYYYYYYYYIIIIIIIIWWWWWWWWWWWWSSBSSSSSSZSZZZYZYYZZIIIIIIIIIIII
ZTZTTTTTTTTYYTTTTTTTAAYKKKKKKAAAAAAWWWWWWWWWWMMMMMMMMMMMMMVVNNNNNNNNNNKKKXXXKKYYYYYYYYYIIIIIIIIIIIWWWWWWWWWWSASSSSQSZZZZZZYZYZZZZIIIIIIIIIII
ZTZTTTAYYYYYYTTTTTTTTYYYYTTAAAAAAAAWWWWWWWWWWMMMMMMMMMMMMMNNNNNNNNNNNNNKKKKKKKKYYYYYYYYKIIIIIIIIIIWWWWWWWWNWAASSSSSSZZZZZZYZZZZZZIIIIDIIIIII
ZZZZTHAAAYYAYYTTTTTTTTYYYYYUUAAAAAAUWWWWWWWWWMMMMMMMMMMMMMNNNNNNNNNNNNNKKKKKKKKYYYYYYYKKKIIIIIIIIIWWWWWGNNNNNNSQSSZZZZZZZZZZZZZZZZIIDDIIIIII
ZZZZZZAAAAYAYYYYTTTTTTYYUUUUUUAUUUUUWWWWWWWWWMMMMMMMMMMMMMNNCNNNNNNNNKKKKKIIIKIIIYYYYYYYKIIIIIIIIWWWWWWWNNNNNNPPSSPPZZZZZZZZZZZZZZZDDDIIIIII
ZZZZZAAAAAAAAAYTTTTTYYYYYUUUUUAUUUDUWWWWWDWWWMMMMMMMMMMMMMNNNNNNNNNNNKKKKIIIIIIIIIRYYYYKKIIIIIIIINWUWIWNNNNNNNNPPPPPZZZZZZZZZZZZZZDDDDDIIIII
ZZZZZAAAAAAAAAAANTTTTYYYYYUUUUUUUDNNNNDDDDWWDMMMMMMMMMMMMMTTNNNNNNNNNKKKKIIIIIIIIIIIYYKKKKIIIIIINNNNIIIINNNNNNPPPPPPPPZZZZZZZZZZZZDDDDDDIIII
ZZZZZAAAAAAAAAAAAJJTTYYYYUUUUUUUAAAAAAAAADDDDMMMMMMMMMMMMMTTNXXXNNNNRKKKKKIIIIIIIIIIJYYKKKKIIIINNNNNXXXIINNJJNPPPPPPPZZZZZZZZZZZZDDDDDDDDIII
ZZZZZAAAAAAAAAAAAYYYYYYYYUYYUUUUAAAAAAAAAAADDMMMMMTTTTTTTTTMMXXXXNNNRRKKRROIIIIIIIBBYYYKGKIIIINNNNNNXXXXNNJJJNPPPPPPPZZZZZZZZZZZDDDDDDDDDDII
ZZZZZAAAAAAAAAAAAAYYYYYYYYYYUUULAAAAAAAAAAADRMMMMMMTTXXTXTTTPPXVVNNNRRRKRIIIIIIIIIBGGGGGGKIIIBNNNNNXXXXXXNNJXNPPPPPPPPPPPPSSZSSZSDDDDDDDDDII
ZZZZZAAAAAAAAAAAAAAAYYYYYYYLLLLLUDNNNNNAAAADURRRRMMTTTXXXTMTBPPPPPRRRRRRRRIIIIIIIIBGGGGGKKKIIBBNNNXXXXXXXXXXXPPPPPPPPPPPSYSSSSSSSUDSDSDDIIII
ZZZZAAAAAAAAAAAAAAAAYYYYYYYYLLLLLDNNNNNAAAADURRRRRMTTXXXTTTPPPPPPPVRRRRRRRRLIIIIIIIGGGGGKKNYIBBNNNNEXXXXXXXXXPPPPPPPPPPSSSSSSSSSSUDSSSIIIIII
ZZZZZAAAAAAAAAAAAAAXYYYYYYYYYLNNNNNNNNNAAAARRRRRRRRRXXXXXTTPPPPPPRRRRRRRRRRLLIIIIIIGGGGKKNNYNNNLNNNXXXXXXXXXXPPPPPPPPPPPPSSSSSSZZZZZIIIIIIII
ZZZZZAAAAAAAAAABBBAXYYYYYYYYLLNNNNNNNNNAAAAAAARRRRRRRXXXXPPPPPPPPRRRRRRRRRRLLIIIINIGGGSKSXNNNNNNNKKXXXXXXXXXXPPPPPPPPPPPKSSSSSSZZZZZZIIIIIII
ZZZZZZZZEAAAABBBBYYYYYYYYYYLLLNNNNNNNNNAAAAAAARRRRRXXXXXXXPPPPPPPRRRRRLMRRLLLLLIINNGGSSSSSNNNNNNKKKXXXXXXXXXXPPPPPPPPPPSKSSSSSSZZZHHHLIIZIIU
ZZZZZZZZEEEEAABBYYYYYYYYYLLLLLNNNNNNNNNAAAAAAARRRRRXXXXXXXXPPPPPPRRRRRLLLLLLLLLLLLLLLLSSSANNNNNNNKKXXXXXXXXXPPPPPPPPPPPSSSSSSSSZZHHHHHHIHHIH
ZZZZZZZEEEEEEBBBYYYYYYYYYLLYRLNNNNNNNNJAAAAAAARRXXRXXXXXXXXXPPPPPRRRRRRRLLLLLLLLLLLLOSSSSANNNNKKKKKKKKXXXXXPPPQQPPPPPIISSSISSSSSZHHHHHHHHHHH
ZZZZZZEEEEEEGGBBYYYYYYYYYYYYRRNNNNNNAAAAAAAAAAXXXXXXXXXXXXXXXXPPPPRRRRRRRLLLLLLLLLLLLRRNNNNNNNNKKKKKKXXXXKKPPPQQQPPPPIIIIWISSBSSSSSHHHHHHHHH
ZZZZZZEEEEEEGYYYYYYYYYYYYYYYRRNNNNNNAAAAAAAJRXXXXXXXXXXXXXXXXXPPPRRRRRLRRLLLLLLLLLLLLLLKNNNNNNNNKKKKKKKKXKPPPQQQQQQQPIIIIIIIIBSSSHHHHHHHHHHH
ZZZEEEIEEEGGGGGYYYYYYYYYYYYYRYYRRJJJAAAAAAAWXXXXXXXXXXXXXXXXXXXPPRRRRRLLRLLLLLLLLLLLLLKKNNNNNNNNKKKKKKKKKKKQQLQQQQQQPIIIIIIIIBBBSHHHHHHHHHHH
ZZZZZEEEEEGGGGGYYYYYYYKKKKYYYYYRRRJJAAAAAAAAAAXXXXXXXXXXXXXXXXJPRRRRROOLLLLLLLLLLLLLKKKKKNNSNNKKKKKKKKKKKEEQQQQQQQQQQIIIIIIIIIIIIHHHHHHHHHHH
ZZZZZEEEEEZZGGGGYGYYYYKKKKKKKKRRRRJJAAAAAAAAAAQNNXXXXXXXXXXXBXJPBRRROOOOOQQQQLLLLLLKKKKKKNNNNNKKKKKKKEEEKEEEQQQQQQQQQIIIIIIIIIIIIIIHHHHHHHHH
ZZZZZZZEZZZZZZGGGGGGGYKKKKKKKRRRRJJJJJJJAAAAAAQNNXXXXXXXXXXXBBBBBBBOOOOOOOOQLLLLLLQKKKKKKKKKKKKKKKKKKKEEEEEEQEQQQQQIIIIIIIIIIIIIIIHHHHHHHHHH
ZNZZZZZZZZZZZZZGGGGGGKKNKKKKKKRRRRJNNNNNAAAAAANNNNXXXXXXXBXBBBBBBBAOOOOOOOOQLLLLLQQQKKKKKKKKBKKKKBKKKEEEEEEEEEEQQQQIIIIIIIIIIIIIIIHHHHHHHHHH
NNZZZZZZZZZZZZZZGGGGKKKKKKKKKKKKNNNNNNNNAAAAAANNNNSSSSSBXBBBBBBBBBOOOOOOOQQQQQLLQQQQQKKBKKKBBBBBBBBKEEEEEEEEEEEQQQQIIIIIIIIIIIIIDIHHHHHHHHHH
NNNNZZZZZZZZZZZZGGGGKKKKKKKKKKKNNNNNNNNNNNNNNNNNNNSSSSBBBBBBBBBBBBOOOOOOOQQQQQQQQQQQQKKBKKKBBBBBBBBBMEEEEEEEEEEQQQQIIIIIIIIIIIIIDHHHHHHHHHHQ
NNNNZZZZZZZZZGGGGGGGKKKKKKKKKKKNNNNNNNNNNNNNNNNNNNSSSSBBBBBBBBBBBBIOOOOOOOQQQQQQQQQQKKKBBBBBBBBBBLBEEEEEEEEEEEEQQQQIIIIIIIIIIIIIDHHHHHHHHHHH
NNNNNNNNZZZZZGGGGGKKKKKKKKKKKKKNNNNNNNNNNNNNNNNNNXSSSSBBBBBBBBBBBBIOOOOOOOOOQQQQQQQQQBBBBBBBBBBBBEEEEEEEEEEDEQQQPQQFSSIIIIIIISIIDDHHHHEHHHDD
NNNNNNNNNZZZGGGGGGGKGKQKKKKKKKXNNNNNNNNNNNNNNNRNSXSSSBBBBBBBBBBBBBIIIIIOOOLQQQQQQQQQOBBBBBBBBBBBBEEEEEEEEEEDEFQQPQFFSSIIIIIISSSSDDDHHEHHHHDD
NNNNNNNNNZNNGGGGGGGGGKKKKKKKKXXNNNNNNNNNNNNNNNSSSXXSSSBBSBBBBBBBBBBBBIIOOOQQQQQQQQQQQBBBBBBBBBBBBBEEEEEEDDDDFFQQQFFFSSSSSSSIISSSSSDDDHHHDHDD
QNNNNNNNNNNGGGGGGGGGGKGGKKKKKKXXNNNNNNNNNNNNSSSSSXSZSSZBBBBBBBBBBBBBBIIIOIQQQQQQQQQQKBBBBBBBBBBBBBBDDEEDDDDDFQQFFFSSSSSSSSSSSSSSSSDDDDDDDDDD
NNNNNNNNNNNNNGGGGGGGGGGGKKIKKXXXXNNNNNNNSNSSSSSSSSSZSZZZZZBBBBBBBBBBBBIIOIIIQQQQQQABBBBBBBBBBBBBBBBBDDEEDDDFFFFFFFSFSSSSSSSSSSSSSDDDDDDDDDDD
NNNNNNNNNPNGGGGGGGGGGGGGGKKXXXXXXNNNNSSSSSSSSSSSSSSZZZZZZZBBBBBBBBBBBIIIIIQQQQQQQQQBBBBBBBBBBBBBBBDDDDDDDDDFFFFFFFFFSSSSSSSSSSSSDDDDDDDDDDDD

1279
Inputs/Day13.txt Normal file

File diff suppressed because it is too large Load Diff

500
Inputs/Day14.txt Normal file
View File

@@ -0,0 +1,500 @@
p=84,26 v=99,-23
p=98,17 v=-41,-46
p=3,84 v=-17,-23
p=92,66 v=36,-4
p=16,102 v=95,-60
p=14,90 v=-71,-62
p=26,29 v=91,-20
p=74,36 v=67,30
p=59,66 v=86,-4
p=32,47 v=-79,7
p=82,42 v=3,-84
p=61,16 v=28,34
p=82,9 v=-84,-78
p=5,71 v=16,84
p=15,79 v=-48,75
p=76,92 v=-32,68
p=43,93 v=54,78
p=22,73 v=-49,68
p=79,13 v=-78,-55
p=61,17 v=1,90
p=71,58 v=-73,16
p=60,63 v=-31,87
p=8,41 v=-17,-96
p=13,51 v=-16,-51
p=86,15 v=12,-65
p=35,71 v=57,3
p=77,81 v=89,86
p=100,37 v=93,-84
p=31,38 v=22,20
p=9,98 v=99,-47
p=29,21 v=72,-76
p=67,99 v=76,-25
p=62,67 v=54,78
p=80,79 v=-1,91
p=74,7 v=51,-42
p=31,57 v=30,70
p=7,74 v=57,-75
p=49,29 v=-9,34
p=27,70 v=-45,-54
p=96,30 v=47,-77
p=7,22 v=-65,52
p=50,53 v=15,-1
p=37,44 v=46,-96
p=85,87 v=-10,-25
p=91,8 v=47,-56
p=96,11 v=-50,-67
p=75,85 v=80,90
p=51,72 v=41,79
p=81,67 v=-93,-25
p=78,51 v=65,-99
p=94,21 v=15,38
p=41,63 v=-77,89
p=98,11 v=-52,31
p=97,53 v=67,12
p=10,93 v=78,-74
p=13,23 v=53,40
p=73,39 v=-11,58
p=82,54 v=45,-39
p=4,14 v=-52,60
p=69,85 v=-93,86
p=88,27 v=-98,-64
p=54,88 v=50,-27
p=53,84 v=-82,-15
p=47,51 v=24,61
p=100,94 v=-54,-52
p=91,23 v=1,-66
p=95,45 v=-42,7
p=76,92 v=80,53
p=29,0 v=13,-29
p=38,46 v=40,2
p=29,19 v=-24,-59
p=4,53 v=-74,11
p=77,87 v=45,-13
p=75,12 v=-82,-52
p=95,84 v=38,93
p=52,52 v=20,17
p=16,0 v=-83,51
p=68,21 v=98,-72
p=9,54 v=-76,20
p=27,9 v=9,-55
p=32,44 v=-11,-96
p=90,59 v=67,6
p=68,52 v=65,30
p=71,44 v=-3,11
p=6,14 v=16,44
p=10,0 v=18,-40
p=85,41 v=17,90
p=15,4 v=-59,57
p=44,65 v=2,97
p=15,78 v=53,-48
p=34,12 v=46,53
p=43,45 v=86,-83
p=76,52 v=-92,-81
p=11,80 v=97,-24
p=37,3 v=48,63
p=1,54 v=49,-5
p=45,61 v=-5,81
p=71,63 v=87,95
p=72,40 v=-83,32
p=10,9 v=-83,47
p=3,23 v=-10,-73
p=84,1 v=85,52
p=52,24 v=-18,36
p=76,37 v=21,-84
p=49,26 v=20,11
p=66,54 v=30,-4
p=24,66 v=-61,79
p=34,22 v=41,-90
p=43,6 v=-52,-66
p=15,30 v=68,6
p=72,74 v=-55,93
p=35,25 v=24,-66
p=80,21 v=56,36
p=43,67 v=59,95
p=61,39 v=-69,-88
p=61,93 v=-66,65
p=18,94 v=97,74
p=4,43 v=13,-75
p=13,62 v=-74,-91
p=61,27 v=32,-59
p=28,88 v=55,-19
p=52,55 v=-94,-60
p=83,37 v=46,97
p=2,72 v=-52,-77
p=35,31 v=-33,23
p=75,73 v=30,-12
p=55,7 v=87,-70
p=48,52 v=-41,-22
p=50,15 v=39,-54
p=35,69 v=63,-92
p=40,55 v=-20,-84
p=51,27 v=61,-67
p=24,29 v=62,21
p=12,14 v=86,45
p=57,29 v=-99,-66
p=82,74 v=16,26
p=2,40 v=-32,-69
p=23,14 v=-81,49
p=89,70 v=-32,99
p=4,27 v=60,-67
p=34,10 v=-77,-57
p=40,73 v=88,73
p=26,38 v=-90,21
p=31,25 v=45,15
p=93,8 v=-65,54
p=61,25 v=-69,-79
p=13,63 v=19,27
p=58,13 v=15,-42
p=29,1 v=3,65
p=65,59 v=41,15
p=86,69 v=-89,-14
p=23,63 v=-87,-79
p=14,7 v=81,-54
p=3,92 v=-96,61
p=78,24 v=-34,-70
p=48,30 v=-22,10
p=59,79 v=85,66
p=91,7 v=5,-60
p=61,25 v=-20,41
p=5,90 v=60,87
p=68,9 v=-24,25
p=27,55 v=42,9
p=48,41 v=37,-78
p=43,44 v=80,-68
p=73,20 v=30,-49
p=13,62 v=-19,-3
p=46,11 v=24,50
p=17,90 v=86,75
p=77,18 v=-84,79
p=5,52 v=4,-30
p=28,63 v=34,41
p=72,83 v=87,-15
p=11,16 v=51,-60
p=4,33 v=-63,-71
p=70,77 v=34,-25
p=37,46 v=22,-20
p=87,49 v=-25,2
p=89,16 v=45,-59
p=9,82 v=-33,97
p=66,27 v=87,-72
p=64,97 v=-38,-40
p=51,90 v=-73,76
p=25,57 v=-68,-95
p=41,13 v=8,-48
p=39,13 v=59,29
p=42,51 v=13,9
p=70,102 v=-14,-54
p=41,69 v=2,83
p=74,7 v=-10,39
p=91,63 v=32,-99
p=6,22 v=-70,-55
p=78,5 v=-12,37
p=54,76 v=-46,-84
p=17,19 v=-4,-62
p=70,101 v=76,58
p=71,94 v=41,74
p=16,91 v=18,-32
p=10,90 v=95,-53
p=97,61 v=71,5
p=63,49 v=-73,-70
p=85,27 v=-76,-56
p=98,11 v=47,47
p=58,7 v=-5,46
p=5,48 v=-6,-94
p=4,90 v=-87,-16
p=55,84 v=-3,-29
p=74,1 v=95,-35
p=3,43 v=35,28
p=11,29 v=91,40
p=10,11 v=38,31
p=61,44 v=-19,10
p=87,52 v=76,96
p=3,92 v=27,67
p=68,64 v=87,-6
p=74,88 v=87,-34
p=24,52 v=43,-61
p=91,10 v=-65,-63
p=65,98 v=49,-21
p=88,66 v=-71,-46
p=21,84 v=-26,93
p=7,69 v=84,81
p=43,21 v=6,-9
p=43,64 v=-73,-19
p=35,47 v=79,-88
p=54,21 v=39,-62
p=20,63 v=-33,27
p=21,51 v=99,10
p=16,82 v=-72,-31
p=23,10 v=-2,-45
p=37,33 v=-22,21
p=41,74 v=-9,88
p=31,96 v=-15,65
p=37,12 v=46,55
p=72,54 v=-54,-52
p=9,58 v=-28,-87
p=0,13 v=-96,-50
p=65,70 v=18,11
p=32,38 v=90,-84
p=97,67 v=40,-3
p=45,17 v=90,57
p=36,85 v=2,83
p=29,39 v=63,78
p=51,99 v=-7,-40
p=18,93 v=18,-30
p=75,93 v=-12,65
p=1,85 v=27,-20
p=17,84 v=97,72
p=3,68 v=-74,96
p=72,22 v=-49,52
p=18,65 v=-50,1
p=71,16 v=63,-59
p=36,44 v=-20,85
p=77,21 v=-27,96
p=70,54 v=95,-70
p=20,5 v=-44,-9
p=97,64 v=55,94
p=49,82 v=35,-16
p=63,54 v=2,-51
p=88,101 v=1,65
p=1,3 v=-89,-34
p=29,97 v=-24,-42
p=45,46 v=-66,14
p=51,33 v=68,35
p=91,29 v=-78,-35
p=10,56 v=-83,31
p=11,94 v=-41,-15
p=63,76 v=19,90
p=84,84 v=21,84
p=24,41 v=-79,25
p=94,82 v=23,85
p=60,52 v=-48,-4
p=47,36 v=66,-51
p=0,49 v=-6,-90
p=40,23 v=-99,-63
p=21,79 v=-64,-40
p=71,18 v=-14,-67
p=53,44 v=-51,7
p=71,40 v=83,51
p=96,87 v=93,-29
p=46,64 v=22,88
p=3,53 v=44,-52
p=54,57 v=74,-95
p=61,63 v=-95,-12
p=96,82 v=3,-17
p=41,96 v=5,89
p=7,46 v=-19,20
p=2,7 v=55,33
p=27,15 v=29,33
p=54,64 v=-7,2
p=84,58 v=-93,59
p=80,24 v=56,5
p=23,13 v=66,-56
p=93,100 v=-89,45
p=89,82 v=91,69
p=55,90 v=96,-5
p=43,41 v=16,-93
p=54,70 v=28,-85
p=50,64 v=-33,-22
p=99,35 v=71,17
p=23,77 v=11,-3
p=78,99 v=43,-38
p=3,80 v=-57,8
p=22,75 v=-48,-18
p=3,94 v=-98,-33
p=72,89 v=-90,39
p=87,84 v=67,61
p=28,0 v=22,55
p=65,55 v=82,70
p=55,48 v=17,-96
p=11,37 v=-33,52
p=63,63 v=-94,9
p=0,10 v=-78,59
p=91,17 v=23,-58
p=56,77 v=72,81
p=99,47 v=14,19
p=15,18 v=31,24
p=47,9 v=56,-13
p=38,11 v=-9,-50
p=93,2 v=-76,47
p=97,52 v=-45,-32
p=51,44 v=-65,68
p=15,2 v=-83,72
p=15,99 v=97,54
p=85,81 v=45,78
p=11,57 v=3,-13
p=91,30 v=11,56
p=42,90 v=-75,73
p=24,7 v=99,-68
p=55,58 v=83,-7
p=35,4 v=15,31
p=21,39 v=42,27
p=62,9 v=6,-48
p=59,99 v=-20,46
p=93,71 v=1,96
p=31,3 v=77,-47
p=98,11 v=25,-52
p=28,41 v=92,22
p=90,64 v=93,81
p=64,93 v=-71,-28
p=31,65 v=-74,-47
p=62,44 v=21,30
p=35,22 v=-76,5
p=69,2 v=-4,47
p=34,28 v=52,32
p=3,37 v=-17,21
p=43,92 v=90,-50
p=16,59 v=29,-1
p=41,6 v=57,-50
p=93,58 v=-74,-16
p=88,60 v=-2,-10
p=62,19 v=-51,37
p=30,80 v=79,83
p=75,14 v=-84,79
p=77,10 v=-34,-71
p=92,60 v=21,13
p=21,25 v=-26,-67
p=88,101 v=57,80
p=60,93 v=14,-99
p=55,33 v=61,-77
p=76,51 v=-60,67
p=23,31 v=-48,25
p=47,28 v=71,18
p=6,10 v=-6,55
p=74,29 v=-51,-56
p=43,49 v=-66,15
p=53,15 v=17,46
p=34,89 v=-90,-28
p=53,12 v=26,-53
p=68,96 v=32,68
p=10,50 v=-6,5
p=30,7 v=69,80
p=2,69 v=60,84
p=78,74 v=32,-12
p=83,87 v=-8,-31
p=86,86 v=48,-45
p=19,6 v=7,-48
p=53,32 v=-55,-89
p=32,35 v=-23,-39
p=95,23 v=-87,43
p=56,82 v=50,-22
p=28,101 v=99,-36
p=8,77 v=5,-13
p=74,21 v=-27,-90
p=68,59 v=98,-6
p=83,93 v=21,76
p=80,24 v=-91,-78
p=7,78 v=47,-8
p=19,81 v=90,-14
p=96,20 v=-30,44
p=70,54 v=-14,10
p=93,25 v=-65,33
p=51,76 v=26,90
p=79,25 v=45,-69
p=89,6 v=-47,-54
p=32,78 v=62,18
p=98,32 v=57,23
p=34,30 v=-22,-91
p=37,94 v=-72,86
p=81,94 v=-45,63
p=20,37 v=-24,29
p=2,63 v=-26,-19
p=4,29 v=-72,-68
p=18,95 v=45,71
p=64,84 v=28,-25
p=8,32 v=84,-93
p=15,3 v=-6,-41
p=42,53 v=81,-92
p=20,73 v=79,72
p=43,3 v=28,-38
p=86,85 v=-21,72
p=97,29 v=69,36
p=23,74 v=-55,72
p=83,87 v=45,-26
p=70,0 v=-93,57
p=61,0 v=-25,74
p=22,0 v=-35,56
p=12,8 v=-70,34
p=27,24 v=66,-74
p=27,87 v=29,78
p=36,98 v=68,72
p=26,40 v=40,-82
p=38,34 v=-80,6
p=34,83 v=33,74
p=23,24 v=9,27
p=46,96 v=96,-43
p=80,41 v=52,19
p=33,10 v=37,-47
p=47,15 v=74,73
p=25,102 v=-3,-72
p=73,63 v=-71,-1
p=27,78 v=-2,83
p=28,8 v=18,55
p=95,102 v=-39,-42
p=65,69 v=-38,-16
p=54,17 v=-18,48
p=63,64 v=96,96
p=3,32 v=-37,33
p=96,84 v=36,61
p=67,9 v=67,-54
p=88,54 v=-74,-52
p=70,52 v=52,14
p=97,81 v=-55,-56
p=4,11 v=40,54
p=51,9 v=-16,-97
p=59,88 v=85,75
p=58,24 v=72,-67
p=73,59 v=76,-93
p=34,40 v=81,2
p=38,22 v=94,52
p=77,27 v=78,39
p=65,50 v=28,16
p=63,14 v=-38,-48
p=13,70 v=-24,75
p=60,16 v=12,-9
p=43,65 v=92,50
p=66,31 v=-24,-65
p=67,32 v=10,4
p=20,27 v=-27,97
p=87,35 v=-52,38
p=69,86 v=80,-41
p=55,81 v=4,-15
p=11,102 v=-28,54
p=34,74 v=52,-16
p=74,90 v=19,77
p=100,71 v=-63,-17
p=16,27 v=-52,30
p=77,75 v=-59,-50
p=18,76 v=27,81
p=65,99 v=42,-45
p=30,15 v=-79,48
p=4,95 v=80,-31
p=81,87 v=83,15
p=22,31 v=33,34
p=46,77 v=-43,-42
p=36,37 v=-99,27
p=35,86 v=29,20
p=54,16 v=-9,-77
p=58,5 v=-38,-34
p=40,26 v=4,-53
p=31,36 v=56,-5
p=46,101 v=-5,97
p=99,97 v=47,88
p=52,42 v=94,-81
p=92,100 v=95,65
p=86,19 v=-78,-48
p=75,100 v=-23,63
p=74,38 v=98,-99
p=61,92 v=-42,-40
p=70,98 v=8,63
p=4,82 v=-74,-32
p=79,1 v=63,-33
p=5,49 v=-17,11
p=55,39 v=-82,-68
p=91,98 v=-96,64
p=55,82 v=24,77
p=54,48 v=83,13
p=0,23 v=-19,-74
p=25,50 v=48,36
p=99,21 v=36,-68
p=26,33 v=9,9

71
Inputs/Day15.txt Normal file
View File

@@ -0,0 +1,71 @@
##################################################
##...OO.O.#.O..........OO..#.#..O.O.O.....O......#
#O.O#.OO.O#..O.....O..#..O........OO...O...#.....#
#O#..O........O.O.O.O......O.O##...#.O....O.O#.O.#
#...O.O...O..O..O..O.O..OO.O....O....OO.......##.#
#O...O......#O.#...O.O.....#O.....O....#.........#
#..OOO.....#.O.O#.........O#.OO.O.OO......OO...#.#
#OO.O...#.O.....O#O....O#.........O........O#OO#.#
#.#OO......O...O.O.#...........OO......O.#.OO....#
#.#O..O.O..O...O.O......OO.......OO#..O.OO#OO....#
#.O......#..OO.O...........O........O.O#.OO......#
#O..#..#...#...............O.#......OOO.OO.....OO#
##..OO.....#O##...O.O...##......#OOO..OO...O..O..#
#..OO..O..#O...O.O..O.#.O#O##.O..O..O..OO.#O.#.O.#
#...O..........OO........#...OO..O...O....O.OOO.O#
#...O.......O...OO.#O....O....O.O.O.O.#.O#..OO...#
##..O...O.O.......#O.OO.OO.OOO...O.OO....O..#....#
#O..#...O.......O#OO.O...OO...O...#....O.OO.OO..##
#...O..OO.#O.....O.OO..OOO.O........OO.O...#OOO.##
#.#......#..OO..OO.O.O.........O..#...O........O.#
#O...O..O.......O.O..#.OO.OO....#O....O....O...#.#
#.##O.#...O.#.......#O.O..O.OOO.......O..O..O..O##
#...OO.O..O......##...#.#.....O#O...O..O......#O.#
#..O#OO.O.OO..#O........OO..##..O...O......OO.O..#
#O..O.O.......OO.OO.....@O#.....#.O..#O........O.#
#...........O#.....O....OO..OO...O..OO...O..OO..O#
#O#...OOO................O.###.O...O.......O.....#
#.OO.O...OO#O..O#..OO.OO...O.......OO.O.....O...O#
#.O..#.O......OO..O.......#.OO.##OOOO..O....#.#O.#
#.............O...O..O.OO#OO.O#..OO.OO#O.##.....##
#..#O.OO.O.#..O#......O#.O....O.OO.O..O...O....###
#O.O.O.O...OOO..O..O..........O#.OO..#...#O.###..#
#..O#.#O.OO.....#OO.O....O..#......O.#O##..#...O##
###.O.....O.....O.#OO.....O........O.OO#....O....#
#O..#O.O.O.....O#.O..O.O#O...#.............O...#.#
#..............#O.#.#....O.OO...O...O......#...#.#
#OOOO...O.#..O..O#.#O....OOO........O.....O...#..#
#OOO.O.#.OO..O.#.O..O.O........#..O...#O.....O.O.#
#.....##.O.#OO.OO#.OO..OO.OO...OO...O....O#.#O..##
#O.O.O.O..O.....O......OOO...O..O...O#OO...O..O..#
#OO..OO..O......#....OO..#.O...OO..O....#O..#....#
#OO....OO..OOOO....O.OO.....O.O#.....#O....O.OOOO#
#........O.....#O..#O......O....O.#.O#..##..O..OO#
#.#....#...O.O.O....O.......OO#.OOO#.#....#..#...#
##O.O.#.....#O.......O.OO.#O...#OOO.O.#....OOO...#
#..O.O#.O..OO..O.........O......O..OO.OO.OO......#
#.O.....#.#O.O...OO................O.O.#O..#...O.#
#...O......O.OO..OO..OO....#O.O..#O..O#....O...#O#
#OO.O....O#..O.#.OOO.#............O.O.OO.O#.O.#O##
##################################################
v>>^vv>>>^v>v^^>vv^><^vv^^^<^^<^>>^<>><^^>v>vvv<>v><>>v<v<<^^^vv<v^^><vvv<v<<<<^>^>>><><^>^>^^^>>^^^<<v^v^>^^<>^v<^v<<>^^vv<^>v>v<<>v^<<>^><<>>vv>^<>vv>v>>><<^>^^>v<>>v^<^<^>vvv<>^v<^<<<^>^^v<vv<^><vv<>>^<^^v<^<<^<^^>vv^<>^<>>><^<<^v<v<>vvvv<^<^v<>>v<><vvvv^v^<v<<v>^^>^^v^vv<<^^v>v<^vv>^vv><vv<<>v>v<>vv<<<><v>vv<^<><^><<<>^><<<<^>v^v<>vv^^<v^>>>v>^><v>v^^<v<^v>v>><^^<>>v<>v>>^<<v<^vvvv<vvv>^<v^<vvv<v^>^^>>v^^^<<^<<>^^<>><v>^>>^>>^>>vv>v^<v>vv<><<>><<<>v>>vv^^>v<vvv<v>>><<><><v^^>^v<^<>v<<^><><^^>^>^^vv<^vv><v^^><<<<<<<<v<^<<^v^^^><>v>^^^<><^v>v<^v><<<<<><^vv>^v>v^<<>v^>v<^>^<>^<v^v^>v^v^<^<><>>^<<^vv<>>vv^v^^<^<v<v^v^><>^^<>^><>^^v<^v<<v^^<>^v<v^^v^v>v^>><^^<><>>^v><v>><<>v>>>>v<<<^v^^v<<<<^v<><^<^^<v<>>^^>>>v>v>>><^<vv^<<^vvv>^<>^v<<^^>v^<^<v>v><vv^<v>>^^<>^v^^^<>v^v>v^><><v<v>v<^v>^vv<>><>>^>v^^<v<<^^><<^<^^^v><<^><>>v<<<v<<>><v<><<v>><<<^^^^v^v>v<vv><^^>>^^v>v<<<^<<>^v>>>v^v^v<<v^v<<><><><^<v^>v<><<>><>^^^><v^>^v<v<vv>v^<^^>><^^^vv^>v^<<v^>^^v^v>>v><<<>vv^><>v<>>>v^^^vv<v<<>>>>v<><^
<vvv>v>v>>^v^<<<>>><>><<<^v^v>^^<v><vv>>^v<^<<>>^^^^v^><^^^v>v^vv^v<>>v>>>><v>^vv<<v<v<>>vvv^<>vvvv^>><<>^^<<^><><^<>v<^<<<v^>>^>^<<^^>>>^^v^vv>^><vvv^vv>><><>>^<v>>^v<>>><>v^v<vvvv<v^vvv^^^<^<^>v<>^v>><v>^^>^<v^<<v>v^>^v^^>vv<v^<><^<^<^<^>v<<<>>>v^v<^v<<<>^<<v^<>>>v><>>v<>>^><^>>v<^>v>v<><vv^<^^vv><^^v<v>vvvv<v<<^<>^>^^>^>>>vv>vv>v<^>v>^<<>^v<<<<v>^^vv>^v<^v>^>>^^^><v^>^>>^v<>v^<^v><>v><<<><<v<^^^^vv>^v><<<vv<<vv>^^v>><v<^vv<^<>v<vv^^v^vv<>v^^v<^^><<>^^>>v>v^>v<<vvv><^>v<<>v<<v<<><>^^^><^^^<<>v>v<<><<><^<v<<<>>v^<<v><<><^>^v>>>>><>v<<v>^^^>^>^v^v>><>>>>vvv^<v><^>^<^>v<^>^v>^<^^<vv<<v^<^^><<>v^<>^vv>^<>v>vv>v^^^<v^><^v^^^vv>vv>v^>^<<v><^vvv>v<vv<<^^>v^>v><>v^^^^<^v^v^<><vv<^<<vv>v>v^>>^<v>v>^<vv>>v<><^^<><vv>><<v<>^<>v<^>vvv<<>v<v^v>>^>><v^>^^><>vvv^^^v>^^<v>>><>v>^<^^^>vv<<<^>vv<^<^<>vvv<>^v^^>^^<^^^v^<v<^><>v<^^>^^>>v^v<><^v<>><>^<<<<v^v<^>v>>v><vv<v^<v^^v><vv^vv>>>^>^v>^^^vvvvvv>^vv>v>v<>^^><><^>^<>>^^^v^<<v<<v<v<<vv^^^vv>v^<^<<<^<vv<><>><<<vv><<<^^<<><<><>^<<vv<v^<v>><^v^^v><^v>>vv
^<<<>>v>>^^v<>><^><^^>v>>^^^<>^>>^>v>>^>><^><^>v<v>v^v>v^v>vvv<<^>>vv>^<vv^v^^^v<^^v<^>v>v<>^<<v<<<>>^>^^v>>v<<vvv<^<^^>^<^>><^v^v><<>v>>><<>v^<^><v<v<vv^v<<><v>vv^v^v^v>^>v<^><><<v<v>^><v<^<v<^>>><^>v>^><<<vvv<vv<^v>v>^<vv^>>>v^<v^<<^>^<<<>>v<v<v>^^v>v<^>>>v^^^<<^<^v><^><^>vv>>^>>>v>^<^<v<v>vv><^^>>^<<^>><<<v^<<<v>v<^<v>^^v<<>v>vv^<vv>^v<>v^v>>^>^^><>v><v>v^>>>>>vv^><^>v<^^vv^^>>><<<><^<v<<>^><>>>v>>^<<<<>^v^v><^v^^^<<v<v<^>>^<^<<<v^<<<>v^<>^v>v^>^<>^>^<v<><^^<<<v<<v>><>^<^<^>^v^v><<>>>v>^vv^v<>>>><v<>v^<v<<vv<v<>>v>vv><>><<v^<>^<>v^<<<vv^>>>v^^v^vv><vv^^v<^<>>^<v^>v>><>><v<^v<>v^>>><>^^>v><><>^^v^vv<^v><v<>^^v>>v>^vv<<v^^<><v><v^<><v<^vv>v<^^^^^v<>>vv^^v<^>v<v>v^v<>><><v>>v<^<^^<<v^>>>v<v^v<v>><<v^<>v<^>^^<v^>v^<v<v>v>><v>v>vv>^^v^<<>>v>>>^<v>^<><vv>><v<>vv<vv>v^v<^>vv<^>>v><^^>^><>>vv<><<<v<v>^<^^^v^v>^vv><>>>><v<>^>^<<^^^^>v^^vv<vv^^v>^^<^<^<>>^^>v><^>v>><^<^<vv^><^><<>v^v^>>^><<><v^^>>vv<v^<<^v>^<v<v><v<vv^>>v<>>v<^v<vv^v<v<<<>><><v>>^<vv<^<<><>>>><^v><^>^v<v<v^v^>^><<>^^<v>><><^^
>^>vv^v<>>><^^^<v<v^<v^^<>^^^^^^<>^><><^<v>v><<v<v<^v<<<^v^^v>>v>^v<<><^^v^v^v^v^v><^>>>^v><v^^^v<^v^^<<^<<><vv<>vvv^^<vv>>v^<^^>>v>vvv>^^v^^<^>><v^^v<^^>v>^<<v^><<>v^^^^<^<>^^>>v<^^^>vv>>>>>v>^<<>vv^<><v^<>>v^>vv^vvvv><^^<>v>v<vv>v><v>vv<v<v^^v<^><><vv>v><>^^vv^<v>v><<^vvv<>>^v<><>>^<<^v^<><<v<>v><>^vvvv^^v<<^^^<><<<>^^^>v^^<<>^<>^<><v^>v>>^<<<^^<>^v>^><<<^v<><v>^^>>^><<>^^v^><^v>^^<>>v<v^<<^v^v><<<<><^v<>>v^v<><v>^^vv>^^<>>^<v^<^^^<v>^v<><>>^^>v^v>v^><v>v<<^>>><^<<>^<vvvv^^><^v^>v>>v>^>^>^<^<><<^^<<<v^v<<<v^>^><v<^^<<^v><><><^vv^>vv<><<^^<<<v^v<>>^^><v<^<v^v>v>v^v<^>v>>>>><^^>>^v<<vv>^>v>v<><><<<v<>^>vv^<^^>>>><<<<>>v>v<<<^^<^>vv<^<v^>>><vv>>><>vv<v>v^^^><<>>>>^vv><^v^<<><v<<v^<vv<v<^v>vv^v<<>v<^vv><<v^>^^^^^<><^<><v>^<vv<^<^<^^<>>^<>^v^<<v^>^<^<v<^>><<><>vvv>vv>vvv<v^>><^^>^>v^^<v>^><v><^><>^><>^>>^vv<><^v^^<^>^v<^^^<>><>>^^vv^<>^v^>><<^^v<>^v^v^^v>^vv<^v^><^<v<<>>^^>>><^<<>><>v>^vv^^vv<><>>v><<^v><v><vvv>vv<>^vv<<v<>^vv>^<vv>v>>vvvv^><<<<vvv^>^<v^<<v<^vv>^<><v^^vv>>v>v>^>v^v>>><>vv
^v>v<^<vv^>^vv^>>^>>v<<<<^v^<<<>>^^><<>>v>>><^<vv<v>^>>^<^><v>vv<^v^>^^<>^<<v>><>vv<<vv>v<^^<<<><<><>^>>v<>><^<v>^v>v<vvvv<>>>><>vv<v>>^>>>>>^vv^v^v><^^<<<v^^vv<><>^<^^>><>vvv^>v^<v^<v^^<<^<<v>^>^^<>>v^^<>v<>^>>^<>><^^v<<>^vv^<v>^^>><<<<>vvv><<v>>^v^<^^<>>><>v>^>v<>^><>^><vv>^>><^^<>v>v<>v><v><>v<<v>^v><<>^>v>^vv><^>><v^vv<v^^v<v^>^<^v^<^v><<^v<<<^><<<<<^v^<vvv<><^>>>>>>v>vv>v<^^<^>>^^^vvv^v^^vv>^<>v>><><<<>>v^^>^<^><v<>^v><<v>^<<^><<<v>vv>^>>v<><^v^vv<v>v^<v><^>^<>^^v>v>vv<><<^<<^<<^>vv^>^>v>><v>^<>^^^^v<v^>v^v><<^>^v^<v^>>>^><<^vvvv<vv><^v>^<v^v^<<^<^<>>^^>>><^^><><^^vv<v<v<><^<>^<vvv<v<^>^><^vv<v>^<vv<<<^vvv^>>^>><<>><<<vv>><><<v^<^v<<<<>>v^<^^<v<>^^vv>>^^^>^^^^^^v>^^<<<>v>^<^v>^^^^>>v><<v>^v><v<<>>>^<<<>>v<>vv>><<><<v<>vv^><^<><v<^><>>^>vv^>v^v^>><>vv><v^<v^>^<>^>v^<>v<<v^v<><<><>>>^>v<<^<v^<<^^v^v^><^<><<>>>^v<^>>^^v<<<>>>^^v^><>>v<<<<>v>^^>v><v>>>v<<<<^^^<^>>^^v>^>v^<>^^^<v><<v>^<<v<v^^<^vv>^v<>^^^>^^<>vv^^>vv>^<<><><^^^<>^<v^^>><v^>>v>v<^^vvv<^>><<<<^>^^v<v><<v<<^><v>v>v>^v><^^<
^>>>^^^v^v^vv<v<vv^>v<^><>^>><^<vv>^vv>^^><v>v^v>>vv<^^<^<<v>^v^<>v>vv^v^^>v^^^^^^<>^^vv<<^vv^v<v<>v^^vv<>^^^^^><>v<v>vv><<v^>^^<>v<>>v<^v<vv^<^^<<^>v<v<>vv><v>^v><v<vvv^v^>v<^<vv<<v^<<v<><v><v^<>vv<^^v>>><<<>v^^>>^<><>>><^<v>>vv^v>^><vv^>v<<<>^v^^><<<^>v<vv^>v<><vv>vvv><><>>>^<<vv>>^v>><>v^^<<<^vv><^^>^vv><<<^>>^<v^^>>^>>^<^^>><><v^^<><><^^^^v^<^^vv<<>v^^v>>v^<<^^v^v^^<>v^<<<v<>>^><><^v^^vvv^>^><<^vv>^^^>><>vv^^>v^^^<v<>>^><^>>v><^<<^>>>>^v<<<>^>^<>v^>^^>>^^^^>v<vvv<vv^<v^v>v^<<>v^v><<><v<v^>vv>^<<<<v><<<v>^>v^<>v<>^<^^>>v^vvv>^<<>^vv<vvv>>^>>><>vv^^>vv>^>><^>v^>^<vv>><<^^^<v^^^<>v<><<<^^^>><><^vvv<^v^^v<<v<<v<>><<>>v^v><v^<^>><^^v>^^>>><vv<v<^>v^^v<^<^>v>>^<v^v<v^^>^v><><<^^^><^>>v^>v^^<>>><>><<^^v^>v>^>^<v^vv^vv<>^vv>>^>vv<^v>^^v<>v><>vv^<v^>>v^><vv<^<v^<<<<^^vvv^>^<>>><vv^^vv<^v<v^>v><^^^><v<<^v>v^v>vv<>^><>^v^>^>v<vvvv<v^^v<v>^^<<><>>><v><><v><^>>^^^>vv^<>v><<^^>v^vv^v<v>>v><>^vv<>v<v><^>^>>v^><>^<>^>>^<v^v^>^>><v><<v^^<v^^>^>v><^^^<v<<>vv^><v^^^<v^^<<^<vvv<v<>^>^>^vv>v<>>><^vv^v^
^v>^vv<^<v><^<^><><v^<^<<^^v<v^<>^<v<<>^>v^v>v<v^<^^<<>^><^v^>v>^vv^vv><><>^^v<<v>>v<<>>^^^v^<^^><>^<^><vv<v^>^>>^v<>v^^<v<^^v>^v>^>>>^vv^^<^><^^<^>^>v>v<^<><vvv^>><>v<>^>v>>>v^<^^<>^v^^<<^>v<>v<><^v^<^>v>><^^><v<^^^>>v>vv<>vv^^<>v^v>^v<<<>^>>^<>^<vv><^>><^>v>^vv^^<><v^<^>>v>^^v<^v>^^>^<<vv>v><v^>>>v>>v^v<^<v<>>^v^^>^^<>><><>><<^<^>^v^<>>^vvv><^v><<>><>^vvv<>v><v<<>^v^v<v<vv<>>>v^<<vv<^>vv<^v<^^<>>>><^v>v>vvvv^>v<^^><><v<v^^<<>><>>>><vvv^v>^v^^^<>v>^v^^<v>><<vv><vv><v<^>>^^v>^<<<v<vv<<^^>>v>>vv>^>>v<^>>>><<^>v<^v^<<v<^^v<>v^<^^^v>^^^^<<><v>^^^vv<>>vv^v>vv<<<<^v>vv>><<^<<>^^<v^>>v><<>v<<^^><<vv>^vv^>v^v^>^>>>v<>^^^vv<^v>^v<><<v<^<<^vv^vv>v<<>^>^>>>v^<^>>v>v<<^v^><v<<^>^><v^^>^<^vv<^><v<v<^>^<<<<<^^^<v<>v><<<v>>>^<vv<v<v^^^>v<v<^>^v<^>vv<vv^<v^>^v<^<<<^<^<^><>^^v<v<^^>><>>>>v^>^<v<v>^^<v>^^^^^<^>v>^^<<^^<v^<>>v><v>>^>>v<^^>^^<vv><<>^<>^><^<v<<>^<<<<^>^>>^<<^>>v^><v<>>^vv^>^<>v<<>^<^^v^><v<>v<>^v^v<v>v>^>v>v>>>^>>^<v<><<>^>>^v^><^^^v>>>>v^<<vvvvvv<>^<^>>^^v^^>>^<<vvv^<vv^>^<^v<v><vv<^v<><
>^vvv^><v^<<<<><><<v<^^<>v><v^<>v^>^<><vv><<^<v^v<v>^^><>>>v<v^>v^v<^<><vvvv<^>>>><<^vv<^^>v<^^v<>>^^v^^><^^^<<vv>>vv^v>>>>^^^>v^v>^^^<<^<vv^v>^^>^v>>v<^vv>^>>vvv>v^<<^v>^>>^<>><<vv<<v^^^<^v<>>v^v^v>>^>v^^^^<<>v><^<<<^>^v>>v<>v^>>>>^vv><>><^^^><^>>v<^^<v<^<v<>><^>>vvv>vv^^^<^><><vv^>v>^v^^<<<v^<>^<>>^^>v^vv^>^>v>^<^><v>v>^><>^<^<v<><v<^><^^^vv^^>><^><v<v^<v<v<>><<^v>>>v<>>>>^<v>^vv<<>v>v^^vv^v<>>>v>^^>>^^>v<^^<^v>^v<<v><<>^>^v^<<v>>>^v<>^v^<<^<>v<v^<^vv<>>v>v><^v>>v>v^^<v<v<>v>><vv^vv^<vvvv<<>>>>>>^v^><<<<v<>^v^<v^v>><<^<<^v^^v><<>v>^>v>>^<>^<>^^><v<v>><>^vv<>vv^<^>^>v>v<^^>>^<^v^<vv^^<v^><^<<<^vv<vv>v<vv^<v>>^^<<>vv<v<^v>vv<v>^^^<^>^^v<^^^>^v<>vvv>^>><<v^^>v>v<v>v<><^^^>>><>^^><v<<<^^>>vv<><><<^^<<v>v>^>v>^^>^vvv<vv<v>v>v^>v<<>><<v>>v<v>><^^<^^v<>^<vvv^><>><><v^>>^<^<><>>v>vvv^<<>vv<^><^<<v<<<>vv^<v<v>v>>^vvv<^^<^v<<><<>^^v^<^v^<<^<^>vv>vv^^v>^v<v<^v>^<<^vv^<<<vv<v><>v^><<^>v>^^^<>v<v^vv>v>v^><v>v<^>>>^<^<<^<v<><v<^>^>^v<^<^^>vv^><>^^^<>>v^>^^^^v<v^><^<>^>v>^><^<^v>>v^<<^v^v^^<<v<>v>v
>v^v^<>^<v><^>v>v>^^v^><v^<vv>>^v^<<>v<<^^<>v<<<<^>>vv<^><>><vvv>>v><>^><<<^><>>>v^>^vv^v<v^^<<^v>^v><^vv^>v>v<<<^^vvv>v<^v>^<<<^>^<v<><>v<vvv^><^^<vv^><^v<<>^v^v^^^^>>>><<<<<^^<^<^<v<<<>>v^>>v^v<<v^<^^vv<^<v>^<>v^v^>^>>>^<^<><^^^vv^v<^^^<^^>vv^v<^<<^^<v<^<^^^>v^vv><<^<>>^>^>^>><^vv<^v^^<v<<v>>v^v<^^^>v^<v<v^<v<<^<v^>v^<^>><<v<^<vv><>v<<<>>vvvv>v>v^vv^<<<^v<^vv^v>v^^>><^v>v><^>vvv>vvv^<>v^><>^<<^v>>><<<<^<v^<vv<v<<v>^^^><^v^<^<<><v<^^<><^>^^<vvvv^v<^^^^<^>v>>vv^<^v^vvv<^<<vv^>^<<<v^><>^^v>^<v^^^v<^^^^>>>v^^^v<<^<>vv>><<>>^<<vv^v^<^>>v>^><<<<^v^^<v^><v>v^^<<<>vvvv<<^v^>>>^v<v<^><v><^v<^<v^<<v<v^<^^v^<v><<^>v^^<><^<>vv>>>>>^<<^<v>v<>^v>^<<>v^<><vv>vv>^v^>><<>v<^vv^v>^v><^vvv>v<v>^>>v<<^^^<^v>^^><^^vv<^<^v<^^^^>>v>v<^>>>>><>vvv^<^vvv^<v<^<>vvv>^>^<^v^<<^>^v<<>vv>v^^<<>>v<>^^^^<>^>vvv><<^v>^vv>v<v^<v^<^<><<<>vv<^><vv<v^v<^^^>v<>>^vvv^vv^^>v>>v^^>vv><>^^v>>^vv<><v<v<^><^><<><^v<v<>v>^>vvv<^<>>^^<<^>>>^>v<><><^^><>>>^^vvvv<>^<v><v<<^<^^v<>>>>><^^<>vv<v^>><<v<^<v^v^<><<v^v>>>^^vvvvv<^<v><<<vv
<<v^><<><^vv^^>^<>^<<v<>^<^^>><>v>>vv<^^>vvv<<>>v^<>^<<>v^vvv>vv^^>^><>><<v<<^>>>>^v^>v<<<v>v<<v>^>v>>^<<v^><^^>>v^v^^v^v<v^^<^vv>v<^^<><v^>><<<>^<v^^<<v<>v<^vv<^v^^^<^<v>v<<^^v<<>^<<^v>><^<v^^><^^><>^>v^v^^v>>>v^^><><><v^v^^^v<vv>^v<^v^>>^vv>v^<v<^v<v<v^^^>v<^<^<^^<^><><vv>vvvvv<>>^<vvvvvv><<>>^<<><>>^v>vvv<v<<^>>v<vv<v<^>^<vv>v<^^<v>v^>^v>>><vv<<>>>>>>>^<<>^vv^<v^<<v<^>v>^>v<>^<^v^><<>v>^<v^^^<>>>^^v^<v^^^^vv<v^^^>v^>v<><>^^<>^<>><v><><^<^<^v^<<^vvv^v><^^>>v^^vvvv><^v>>>^><v<>^vv>^>^<vv>>>v><><>>^vv^v<>^v<^<<v>>>><vv>>v^^>^^><<^<><>^<<v<>v^v^vvv^>v^>>>^v><<>^^v<v<v^><<>>>>^>>vv>><v<^>>^<>><>^<v>v^^^>vvv<<>v>^>^>^>v>^v>>v>^>v<>v^>^>>>v>>^><>^>>><^^><>^^v^<v>v^>v^v>>v<>v><>^<>^>^>>v>v>^<<<^^^>^<<^<<<<^><^vv>>>^><^<<<v>>^>v<>^vv^<^v^<<>^^v<<<vv<>^v>^<v<<>v<vv<^<^v<>^<<><<v<v><>^<<>v^^vv>><v<vv>^><<^<v^<v><<vvv>^^^<^^v>^>>^><>v^^><v^v^v^<<>vv>v^v>^><^>^>^^<^v^v<v>v>>^^^^>^<<^<^vv<^<v>v^>^>>vv>^<<<<^v^^vv>v^^<vv>>^<<v^v^vv<^>><v>>v><<^>v>^^v^vv<<>vvv><<v>v<><v^>>^>v<><v<<v^><<>v<<vv^><v<<
<<^<v>>vv>v^v<>^>^>v<v><v<<<vv<>v<^^^^^^<<^^v>>>>^<^<><v^<vv>^>>>^^<>>^>><<^<<<<<>><v^>^><v<<>>>^v^<><^^^v>vv><<>><^v<<v>^^vvv>v^v^v<>><v^<^^<><v<><><<<<<<>><>v^<>v^^^>>vv^<>><^><^^v^v^^^^>^^><<v^^<<^>v^v^<vv<v<>v>v<^<><^><>>v><>v^vv<<<><>>vvv^^vv^v>>>>v<^vv>>vv<>>v^<>v^^^^<<^>^^>^>^^v<v<<><vv^v^<v^><v><<^^<^^v>^^^v<^^<>vv>vv>v^v>v<>^v>^<<v>>^<v<><<>v^^>>>^>^^<<vv<^^<^>>>><^vv><<v>v<>>v^v>^vv^>^^vv><^<>>v^<v<vv<^>^<>v><v<vv>><v>^<vv<^><<<^>^<^>^^^vv^v>><^<><^vvv>>>^<v>^>vv>>^<^v><>^>>^>><^<^^>><vv^^^v><^<^^<>>v<<^^>>><vvvvvv<vv^<>>><vv^><<^vv<^v><v><^^><^v<v^><<v<<v^vv^>^<>>>v><<<^><^<^<><>^>^>>v^v^^v^<^^v^>v^<^><>>^>^<><v>>>v^>^>>vvvv^>^>>v<^>vv<<>^v<><^<>>><>^<<vv^>^>>^v>v<<^^vv<^v<<v^v>v<^<><>v>v<<<<<^^vvv^^><>>vvv<^^v^>vvvv>^vvv^>v<v<<<v><^><<v<<^^<^<<vv<<v><<^vv>>>vv>>>^^v^vvv^<<<vvv^v^>^>^<^v<^^>^^v><v<v>^^v^vv><^<>^^^v><^v^v>^vv<^>><>^^^>^<^v>vvv><v^v^><<^<^<^^v>>v^vvv>v^v>>>>v^><v>v<<>^^>><>>^^v^<v^^^v>>^><^^<^vvvv^>v<<vv<<^>^><v>>>v^<^>>><^<^^^^>^<vvv<^><>>>v>^v<^<^v<<^<<^v>v^
^>^><<<>><<<<>>vvvv^vv^^^v>><>^^>v<^^v<^>^v^<<^><^v<>v<v>>>^>>>v<^<>>>^<v<^<>vv><>v<v<v<v>v>v<v^vv^<>^<vvv<^^v<^>>>^vvv><v<>^<><>vvv<<<>^v>v>^^v<<^vvvv<v^<<>^<>><v>>><>^^>^v^^>^<>v^>^<>v^>v>>vv<<><^v<^vv>vv>^<>vvvv>>>>^^>v^v<^^<^<v<>^^^v<>><^^><^><>v^>^<>v^v^<v^><<^>>>^vv>>><>v<>>^v>^^<v<^<^^^^><^v<<^<v<v>>v^<<>v>>^<^^v>vvv<<v^>v><^>^>^>v>>^<>^^<>><>^vv><v<^v>v<vv>v^v<^><v^<<vvv>^^>^^^vv^<^>^v><^<^<<v>v><<^<<vv^>><<^^<v<^><>><^><<<<vvv^vv<>v^><<^^^<<<><<v^^<<<vv<v<>>>v<<v<<^v<<<v^<^^<v^>>^><<^^v>v>>>vv><v^vv<vv^^>v^^v^><vvvvv>^<^^<<>v<v^>>>^>>vv<^<<<^<^>>^v>^<>^>vv><>><<^<<v>>^<v<>v>^>^<v^v<<v>vv^<<^>^^<vv^<<><<>>>v><<vv<^^v<v<>v><v>v^^<<<v^vv><<<<^^<v<v>v^<>><><vv>>^>vv>^<>>v<>v^^<vv><>>^v>v><<>^^>vv^^v^^vvv><v><^v<v^<<v<><>v^>vv^^^^<^>^<v>^^>>>>><>>vv><>^><vv^^<v<<>v^<^^^>^>vv>>v<vvvv>^<v<>^^^^v><<^v^<<<<^>>><^<^^^<>^<>^^v>v^<^^vvv^^<vv<v>^>vv^>^v<^vv<>><<<^vvvv^>>v^^>^>><<>^v>vv>^^v<<<><v^^>^><<<^<v<^^v^^<^>^v<^<v>^>v>v<<><v>>>vv<<<v>^v>><v>>^^><<vvv><<>><^<<>^<vv^<>v<^<<^<v^<v>vv<<
^v>v^<v>^vv^<vv^<vvv<^>^<<<><^<>v>vv<<>>v>^^v<^>>v<^^^^^v>><<v<^v^><>v<>v<<^<<vv<^vv^>^vv^^<^<>v<>^^>><^v>>^v<^^^^<^<><<v>^<^>><>><vv><<<<^^v<v<^v<^>v<<^><^v^<<<^^v>>v<v>><v>v^<<>v^<<^^^>>>vv^v<v<^v<vv<<>^><<vvvv^v^^v^>^^>>><^v>>>^<v>^><<>v<^vvv^<^^<<^<vvvv>^^v^^^<><<v<<^v^v^><v^^><>v^vv>^v<<v^^v^v<v>v^<<vv^<<<>>v>vv<vv^v<>^>><><v><^^^^v^v>^<^>^^^<<>><<<v<v<^>>^v>v<><<v<^^vv<>^vvv>v^^^vv^<v><<^>vv>>>^v<^^><v<^<vv^^^><>>^v^<^v<><v><v>v^>>^<v<^<v>><>v>v><^^v>v<v^vvv^v^<^<^>^><^><<>>v<^^^>>^^^<>^^>v><^<>v^><^<>v^>>^^^<vv<vvvvv^^>v^<vv>v<><><<^><v^v<>^><v<<^vv>v><^<<>><^>^v<v>^^<<>^v<v><vv>^<^>><^^v^>^v^^<^<^<>>>^v^<<<<v>^>v<vvvv>><<v>^vv<<<<v>>>vv>>>^^><><v>^^<^v^<v^^^>v>v>>>^><<^>^v<<<<^<vv>v<v<<^>^<<^^>v^v^><^v^^v>v>>^vvv<<v>>vvv^^^>v^^>^v<^<<^<>>>><^<^><>^>^<<<v<<>v>^v^>>>v^vv>^vvv<>vv>^>^^>v^^^<^>>^vv><<><^>v>^<^>><><v>><^v<<<vv<>vv>><^^^^v>^<><v<^>>>>vv<>v>>v^><>v^vv^vv^>><^^^<>v<>vv<<v<>^<^^^<>^vv><<<>>v<><<^>>vv<>^>>>^v^>v<>v><<^^v^<<>v^v<>^>v<^>^>^vvvv^>^<<<>>>><^>>^>^^v>^vvv<vv><
>>v><^>>>v<>><^><v^v<>><<vv>>v<v>v<>^>^<<>v>><>v<<v><v^<<v><^^>vv^>v^v><>^>^v>v<<^<v<v<v^vv>^^>>>vv>>v<^v^^^<^<>>^>^<<^^>v<><^><v^>>><vv^^v>>>>>>^<v<<^v<v><v<v<v>>v>^><^><<v^>>>>^v<<<>><<v^^^v>>vv^<<^>><^v>vv>>^v<<><>>v>>>><vv><v><v^<>^>^vv^<<><<v^^><>^>v<vv<vv^vv^<^<<^<^vv<<<^>>><^^v^<v^^v^>^v><>^<>^^v>^>vv>><>^<^>^>^><>^^^<><<<^v^<vv<^<^^v^>v<vvv^>^>>>>^v>>>^>^^<v<^>>^><>v<>v>^<vv<^v<>v^^^>v<<<>^<<<vv^v^>vvv^<v^v^><><^vv^v<^^<v<^v^vv^<>>^<^<>><<<>v><^^^v^^>^<>>^<v^<<><v><>v>^v><v>^v<^^v<>v><v><^<v^^^v^>^^<<v>v<^v>v>v^vv>^<vv>^vv><^>vv>v>>v^>^<v^v>v<<>v><><>vv^>v>^vvvv>^v<v<^v^>^>v>>v^>v<v>v>v^^^>v>>>v>v^vv<<>^>><^<^v>v^<v>^<v^^^<v<><v^>v<^v<>^><^>^v<v<<>>>>v^<>^>vv^^vv>v>^>>^>^<^^><^v^<v<v^<^><^vv<vv^v>^v<><>vvv<>^^^>v><^<<vv><vvv>>v>><<^vvv<v^>><<<v^>^<^<vv>^vvv<<>^<<>^<^><><>>>>^>^>^^><<<^<^v^<<<>><>>><<v><^v><vv^v>>v^<<>^v<>^^<>v<>>^<<>^<<<>vv<^^v<^^<<>^v^><^^vv^<v><<<^><>>vv><^<>>vvvvv^<^<<^>>v<<^^v>><>^><<<vv^^v^^<>>v<v^<^^^^^^v><^<^>><^>>v>^>>vv^>^<^><v^^>^^>><vv^^<vv^<vvv<><v>
vv^^v^<^>>v><^^><v<<v^^<vv>^v>v^>v^v<>>>><^<^v>v>>><>vvvv<<<><>^^v^^>v>>^><v^>^>^^>><v<^<>v^v<^<vv>v>^^v^^v<^v^>v><><>>^>vv^^<<v<^^^<^v<vv^vv^^<>>v<>vv>^<>^v>>v^><<^^v<^><<v^^^^<>>^^<<^>^<v>^v^^>>^^>^^^><><<<<<>^^<^v^^><^<>v^>>v^^>^<^<><>>^v<v<<<^^v><<v>^<<<<^<><v<^v<<<>^>>v^v<^v<<^>^^<>^v<<v^><vv^><>>^^>v^<>>v>^<v^>v<><>>>v><v>v><><>>^>vv<v^>^<<><>>^<<^^<<vv>v^<vv>><v^^>v>>^<>^>v<>>>^vv<<<<<^^>^<<<><<><^^^<v>v<><<<^v><^^^v<^<vv<^>>^^<><v^^<^^^v<v<<<<v^<<v^<v<><^^<^vv^^v<^<<><^^^^>v<vv<v>^<<<v>v^^>>v<v^>><>>>>>><v><v>^^<>><v^^><<vvvvvv>>>v^<v>v><><>v>v<><<v<<>v>v<>>>^^<<^v>v^v>v<>v><>vv^><vv^>vv>>>vvv<>^<v>^><<><<^<^^<>v<>^<v<><<<<><<><vv>v<vv<^v^<^^<<v>v<v<<^^<<>>vv^v>v^>^>v>>^<^^^<^<v^v^^v^^v^<<>^v<^vv<^<<>>^>>>v><^v^<v>v>^^^^<^v>><^<><^>^<^vvvv><>v^vv>vv^<v<v^^v^>v^<>v^>^^^^<^<<>^v<<>^^>>v<^><>^<<<^^^>>vv^^^><<v^<^v<v^^v<><vvv^^v^>^v<<>v^v^<><v^<v^^>v>^<<^<v^>^^<^^v^>v<v^^<<v>^v<>v^^>><^v<^>^v<v<>^>>^>v^vv^<v>^v^>>v^^<^v^^^<<vv^<><>^vvvv<>v<v^v^v^>>^<v>><>><vv<<>>v<>^<^>^^>^vv^<<<<>
vv<^vv<^^^v>^>><>><^v><><v^>^^v^><>v>^v>^^v<>>>^^^>>^v^v>^<v>^^<>^<>>^<v>><^^v<><v^>^<v>>^^^vv<^^v<<^vvv^<^vv<<<^v^v<v><v<^<<<<v^<^^vvv^^<v^vv>vv>v<<^v<vv<<<<v>^vv>^^^^<<v^>^v^<><<><v^><<>>>><^><<^<v^v^<<^v<<>^>v>^^^>vvv^<v<<>>v>>>^vv>>^<<^><<^^<<v^v^<v<<<<^<v<><vvv^^^>^^><<v^v^v^^v^<v<^<vvv>>^^vv>>>v^^>>><>^<<^<><<v>>^^^v<^^<v<<v<<v^v<^^v><vv>^<>v<<^^^^>^<^^^v>^<<><><vv^^<<>>>^<vv>v^>vvv<<^>><^^<<<><<<><>>^<<v<v<^^>v>>^^v>^>^^v<^<<<v>v><^>^^^^>^^<>^<<<<>^^^vv<^<^^<v<<v^^<<<v<v<^>v^<>>>>^^<v>v<v^<<<<v<<>v<v>^v>^vvvv><vv>v>^<^<>^<>v^<v>>v^>v<^><<v^^v>^<<v<v^^^<><^>v><>v<v>>v<><>v^^^vv<>v>v^^<^<<^>>^<v<>>^<^>v^^^<>>^<vvv<v>v>>^vv>^^v>><><<<>^vvv<vv^>^v^vv>v><v><v><v><vv>v<<>>><<>>^v^>^v><v^>v<^v<v<vv>><^<<<v<^<^<><<^<<>^>vv^v^>^>v>>><^v<v^vv^>^^<v>vvv^^<<^<v<vv<^<<v<>vvv<^<v^v>v>>>vvvv^>>^v>^^>>>^v>v^^vv^v^^>><v<^<<><>^<<v^v>vvvv<^<^vvv>v^<<><>^><^vv<^^^><>v<^>v<v<v<v<v<>v>^<<>v<vv>>vv<>^^v>>>>^>>vv>v<<v<><^^^<<>>vv><<^<^><>^<v<>v<v>>>^^>v<^><^<<><<^v^>^<^<^>v^vvv^v<><^>vvv>^v<^^>>v<<v><
v^v<^^>>>^>>>>v^>>^>vv><>^vv^v>vv^v>v<^^<<^<^<<>>^>^<^<vv^^>^<>vv>vv<<<>v^<^v>^^<v<<>v><v<v>>>><v>v^^v>^^v^v<<<<^v<^^^><vvv<v>^^v<><vv><^v<<<v><v<>^v<^v<><^<v<^<>><^>><^<v<v<^>>>>^><vv><^>>^^v><>v^vv<<^<>><^^<vvv>><>>>>v><><>^^<<^^^v<><<>^>v>>><^^<<<<<<vv^>>v^^vv<v>>v<<<v><>v^>vv<>>v<^v^>>>v<>^^><^^vvv^^<^<>><<<v^^v>vvvv^<<<vv^^^>>^><v>>>>><<^<^v^<<^v^>^>vv><^^><<<v<^^^v>vvv<<vvv>^>^<^^<v><<^<^vv<><>><^><v>^>^<^vvv^<<<v<>v^<v<^v<v<v<><<v^^<><<<v^v>^>>^v^^<<<^<v>v^^v<><v<>v>>v<>><>v<>^<v^<^<>v<^>vvv<^v^><<<><^v^^>>v<<v^>^<>^^>><^vv^^^^vv><<vvvv<>^>v^<^v<>vvv<<>^<v>v^v^v<>>^^vv<v^>v>v<<^>>><<^v^vv^>v>><>>^v<>>^^v<<>^^^<<^^^<^>^<<>>>^vv<v>><v^v<<vv<^v^>><>vvvvv^<^>>^v><>>^^<>^v<^v<<><<>v><<^^vv<<>vvvv<v>v^>>>>v^^<><^<>^><v^>v^v<<>>vvv<^v^v^<v<^><>>v<<v>^>v^^^vvv>>^>v>v><<<>^^vv^^v^>vvv^<^>>v>v<vv>v>^^<^^^v<v>^<^<v^><<<>>^<<v>><<<>>>>>v<^v<>vvv<<><<^<^^<><^<<vvv^<<^^>^>^^^<^<vv<v<<<<vv^^>v>v<v<^<<>vv<^v>v>v^<>v>>>v<v^^<^<<v^v<<^^>^^><v><>>><<v<<>>>>^><><<<>^<><>v^>>^><><<<<>^><<v>>vvvv>^v<
<^vv<><<>v<<^^>^>>>>^<^>><>vvv><<v>vv^v><^>><^vv<vv^^>v>vv^^>^<v<^<<^^v><^>v<<v>^^vv^<<^vvv<>>^>>vv<>^vv<v^^^^>>^^<><vv>^><v<>>^^v^^>><<<>><<<v^<>^<^^^<>^><>^v<v<^<><^<^>>^v>v^<^<>v^v>vv<^vv^v<v<v>>^^^<v<<vv>v><><<^<><vvvv<vv<v^^vvvv<^>v<v^><v<>><v<vv^^<^^>><^vvv^<><>^>>><>v><>^>vv>^<>v<v<><>>>v<^<v>vv^^v<^<v><v>v<^<vv>>v<vv<>vv><^>><^^>><vvv<<><v<v<<<^v^^vv>>v>v^><<>v^>v<vv>v<><v^>v^<v<^v^<<v<<>v^<vv^>^<^v>>v>>^^<^v^><v^>><^^v<<<vvv<>v>^<><>vv^^<^^>v^>>^<vv^><<<v<>>^vv<><^>^^^v^>v>>v<^^<v<^v^>^<^>v^^v>v^v^<>v<<vv^v^v<<v>^>^^^<vvv<v^^>vvv<^>v>vv><<v><v^>v<v<^<>^<>>^><><v<<<^><v<<><^>vvvv>^vvvv^<>vv^<<^><^<v>^v^v^<vvvvv>v<v<<<^<v>><^>vv><^>v>><>^v^>^<>>v<v<<>^vv>v^^^<^vv^><<>v<v^v^^<<>^^>vv><<v><><^v^>>v>^>^<v^^<<^^^><<v><^v<^<>v^>vv^<^^>^<vvvv>^v<v<>v>><^^<v^<><^<<><>^v<<vv^vv^<^vv^v><v^<>v^<^<>vv>vvv>^vv^>^<><<^^^^>v>>^<>v>v^^<^>>v<<<^v>>>>>^<><<<vvv<v<v<v><v^^^^<^<<>vv<^<v<><v>^>>^v^<<>v^<v^<v^^><><<^vv<<<<^<^^^<<v<<^>^^>>vv>^^>^vvv>v^>^<<>vv>v<v><^^vv^v><<v>^^vv><^v<v>^v>v^<^vv^v^vv
v<><<^^^v>^v^><^<><><>>^>^>v^<<>v<><^<>>v^^v<<vvv^^><^^>>v>^>^<^<^^^^<>vv<>^>^vv^^>^>v>^v<v>><v^>^<v<^><^>^vv<><>>v<<<^v<>vv<v>vv^>>vvv^<><^>>^^>>^>vvv>v><^><<^v<^>>v^^vvv^^<^v>v^vvv^>v>>>vv>v><^><><<^>><^v<<^>v<>^vv>>^^^^v<vvv<><>v>><v<v<><<<<^^^v^v>^v>vvv>><vvv>><^>^<>vv^^<>v^>^^<>>^vv><^^>vv^v<>^>>^v^<^<>^vv>^v^>>><^<>v<>^v<^>><<>><>v>>>^v^^^<^^<>>^^^<v>^v>^^vv>><v<^^^^>>vvv>vv>>>v<^v^v^^><^<>><v<v<>vv<>v^v<v<vv><><<<^vv^^^<^><<^^^^v>>^<v<^><><v^><<<v>>v<><><>v^<<>v^>><v<>>^>^^^<><>^>>>v^>v<v>>>v<^v^^>^^^^>>v^>>><<<>>><>>>^>v^v^v>v^v^<>>>vvv^vv^<vv><>^v<>v^^<<^><v<^<^<<vv^vv>^<>^<^>>v^v>>v^<<v>^>^^<^^^>^v>^^>vv<vvv^>>vv<v<v<>^v>v^v^<<vvv<v<<>>v^>vv^^^v<vv<<<><<^vv<>>^>^<>vv<^>>>><>^><v>^v<<^v>v<<v><^<v^v^^>>^<^^^>>v>v>v<^v><<><v<^>v<<^><><>><v>^^vv<^v<><<>^^v>^^^v^v^<<^v^<>^<^<^vv^^v><<^vv^<v<<^^<>v<<v<>^^<<v>^><^>^><^^><>>>^v<^<>^^>><<^v<^<<<<><vv>>v^>^v^v<>>^^<<v^><^^>>v>^><>^^^<^>>vv^><<<^<>>^v>>v<<>>^>^^><v>^^<v^^v>^<>v^vv><^^^^v>^>><>v<>v>^v^^^^^v^>^^v<<>>^<<<>v<<vv^^><><^<<v<v
vvv><<^^<^>><^^^v^>v^>^v<v>>v<<<>>^<<>><vv<<<v^>^v><<<^<>>>>>^v<v><>><>^>>>>>>v<<^^^^v^vv<^^^>v^v<>^vvv^^v<><^v<^v<vv^v>>>^^^<^<v^>vv>>><^>>>v>^<><><<<>>^^^><v^<v>v<v>v<>>^><>><<vvvvv><vv<>v<><^>v>>v><>>>v^^>^><<<^<>^^^<<<<>vv<^vv<>>^><^><>v<vv^^^>^>^<<v<^v<>v>>^>^^>vv<>^v<^^<><<>^^<>^>^^^^^^<^^<<vv<^^^><<<<v<^v>>^^>^v^^^>vvvv<^v^<^<^^<^v>^^^^>^<>v>><<<vvv<<>^<><v><^^>v<v><v^<^vvv<<v<>>v^<<<vv^>>^>><^<^><<^v^^<v>>>>^<vv^<<^<<v^^^^v^<<^<><v^>><>><<<><vv<<<<^>^<<v<><><^>^>>v^^><^<^v^<>^vv<<v>^<<vv>^<^^<v^v^^^<<>v>vv>^>>v^<<v^v>^<^<>^<v><v<vv><vv><>^<v^v<^>vv^^vv>v>><^>>><<^^^vv^<^^<v^^<<^<^<><^<v>>^v>^<>^v><>^v^><>>^<<vv>vv<>vv<<<<^^vv<^<v^^><v>>^^>v^vv>^<<^v<^vv>v^^^^v^^v^vvvv>^><<^^>v^<^v<>>^^<>^v^<<<^>><>^vv^<v^^>v><v<<<^v><<>v<<v<^<vvv<^^^<>v><vv<<^>>>v^^v^<<vv<<>^><v^<^>v<^vvv<<v<v>^<<<><>>^<<<>v^vv^<^^^^>>>v^v<^vvvv>^<v>^^^^>vv^^v>vvvvv^<<<v<<v>^v^v<v>^<<<>^>^><^>>v^<v<>v^<><^<^vv>vv<v^vv^>>v<v<<><<<<<<>>>v^>^^>>^v<>v<v<>v^<><>^^^>v>v><<<<^<v^><<><v<><>>^v>>>v^v^^v<>><<vv^>><><v<^>

1000
Inputs/Day2.txt Normal file

File diff suppressed because it is too large Load Diff

6
Inputs/Day3.txt Normal file
View File

@@ -0,0 +1,6 @@
where())what()@)select()why()?mul(371,776)/%how()'~+:how()mul(977,266)@$@mul(749,170)how()<;$^#what()select()mul(338,975)>from()+,{select()!!mul(626,938)%/>^{((}]mul(733,977)>)() +$)mul(695,376)!%#how()mul(767,788)<(mul(876,501)mul(18,72)[*when(625,65)<mul(515,137)>*('what()mul(491,884)from()?{>how()mul(645,385)/[when(){what()why()mul(802,476)#'select()who(327,719)+-,##mul(103,807)#(mul(192,909):@'^where(247,392)!who()</mul(305,182)[@[;!;mul(553,402)<%mul(247,89)!mul(91,152)$@mul(502,543)+why()what()[when()@>^mul(875,344)why()mul(205,505)?;?when()!],mul(165,670),#$++'>)'mul(503,815):mul(483,302)~+*}!$where()why()&mul(785,794)/,{why();where(218,722)}when()don't();!mul(405,577)where()@mul(521,472){how()what()'what() where(55,484)mul(360,384)%mul(176,384)}%when()-$%what(436,501)mul(652,387)mul(758,52)-~@,*-@mul(343,835)when()select()](;#mul(76,425)from()>})]mul(720,464)#~)why()why()mul(619,682))mul(15,67)mul(569,569)]where()++&@:[#mul(844,620)select()+^*what()why(197,509) mul(280,807)%^mul(233,435)}?*:+^^what()!when()mul(69,464)& )]$mul(393,827)@]^mul(64,552):^)*<&where()?#mul(51,727)mul(159,242),+what())>+mul(140,116)do()~?mul(590,950)};[*;;when()mul(186,556)]&;#&##*!mul(806,651)^select()who()[mul(820,386);?from()mul(771,404)-$+#]&where()}mul(473,823)don't()when(874,250)'}mul(916,835)mul(432,92)how(), :mul(2,546)who(61,440), -mul(486,858)where(869,462)do()'select()&?+&why()where()>>mul(796,512){~(when():^>*&'mul(927,22)%;where()who()^$mul(203,851)%how()mul(820,954)from())~#<don't()select();@??]?mul(693,878)from()when()@/mul(202,438)mul(266,957)from()])[/how()select()don't()+>mul(741,967)select()what()+[[why()&]mul(42,517)>]why()<mul(577,659)&['<where()>,select(297,821):mul(324,191);%{->:!#mul(567,73)don't()?why():^{$*]why()mul(504,229)'mul(40,787)/select()?who();[who()where();$mul(537,42)[#@&*~<@mul(418,58);{}how()*-don't()[<'@from() mul(38,329)-*mul(381,685)what()</:)^(',when()mul(850,565)@,,%select(95,745)#mul(99,343),]^who()[mul(46,377)mul(788,562)?<mul(101,829)]$#-]select()mul(536,292)who(419,754)mul(933:[>?+,,*%)mul(740,7)#)<how()mul(44,988)mul(693,770)why()-;[mul(76,905)where()];mul(457,100)what()mul(63,750)where()!&who()$>#)?^mul(211,355){~#who()<]who()@>~mul(135,667)-^)]'mul(165,161)<;,mul(350,311);%?~}$how(768,325)*mul(773,359)~!(select()?{why()mul(269,149)when()}*who()}mul(536,90)don't()>$ &!where()*who()&mul(405,425)!+mul(304,694)'<#$<<,#select()<mulselect()<?mul(448,840)!]-;mul(79,274)>):%:* -why()#mul[who()when(918,883){ ^''mul(907,968)what()when()[who()>mul(81'how()+what()select()<mul(66,242)mul(32,790)why()why()mul(707,867);{+[@select()@,mul(183,895)~mul(570)],:select(),%{%from()mul(568,881)[{@/}*mul(989,413)^($who()!}<&;mul(380,574)+why()?select()#mul(812,587)why()when()mul(772,647)>;&'']+how()mul(745,379)]^-mul(403,82)mul(840,830)when()+what()how()[!select()mul(827,564)?:]mul(602,333){what()[[mul(606,272)
,who()>}who():#from()mul(960,322)where()'<from()why()what()%where()mul(282,700)mul(591,113)<where()%, )mul(17}{')~!-mul(462,619)]mul(422,776)mul(250,987){((mul(880,386)(<>)?,+when() mul(59,855)'mul(308,433)~<how()>[;<why(98,720)@*mul(406,466)-what()when()'do()^mul(293,490)-@;{^why()who()mul(811,340)]^*what()[mul(705,73),:mul(557,31)mul(678,868)how()how()(when()mul:what(),how()where()when(354,851)who(418,214)when()where()mul(500,581)~what()how()mul(109,217)@>$;:mul(486@!>mul(508,605)what()from()mul(597,956)>#' *mul(834,240)}![{who(983,119)]#what()where()mul(533,711))}what()'/-mul(189,207)^*--$?mul(424,618)mul(407,288)why()<[+mul(170,906)&select()[,#who()+,mul(508,516)?who()!}+select()mul(963,397)*/]mul(129,895)$select()'when()^?mul(604,838)>mul(38,524)?why()~)[#*+:mul(793,697))what();}who())]mul(286,779)--where()![@(/}:mul(156-<%mul(862,26)select()mul(679,658);+mul(492,253)/;?$&}#mul(761&'[/*?mul(31,877)^where()mul(366,701)#mul(519,128)what()select():when()* mul](mul(46,247);mul(864,153)*mul(93,786)[$&&+mul(349,493,'~mul(161,724)~+$what():mul(326,607)what()select()mul(108,288)@(where(287,297)~how()<when()how()from()mul!^@->mul(15,832)select()!%( mul(233,322*;%],&@why(660,737)mul(47,778)?mul(68,311)}do()^/>[mul(572,909)^(,$,*~?mul(550,192){select()$${mul(949,906)?[^]@@^what()do()'<what()$mul(318,25)mul(406,742)'mul+['&{[^++@mul(550,647)'@)-mul(339,137),mul(412,523)(select()what()mul(234,64)!$[>mul(581,669)who()how()$~;(where())how()<mulwho()&?]%don't())~@~+mul(879,734)from()))*@#:$?where()mul(954,523)@what()<mul(481,127)]}<'/[who()why()+mul&%mul(244,792){[~mul(706,361)!;mul(658,168)$]mul(386,274)?what()* who()select()where(685,196)$what()mul(929,590)when()who()who()'mul(122,764)^%:@mul(315,523);~+;?/%&mul(97,566)~>what();<>^mul(859,756)mul(323,125%?}%where()mul(694,499),[mul(290,758)how()from()-/*<mul(179,392)how(930,981) ^())*}'$mul(446,657)*why()?]how()how()?from()mul(685,212)%when()' ;;from()?[mulwho(612,115)select()mul(56,213)[]}who()%,mul(241,98)^</%<&~from()mul(786,775) what()mul(748,183)'from()mul(388,111)where(){*}?&select()who()mul(108,115)mul(795,158) (~don't()*select()@:'!^mulselect()mul(838,249)@do() (~%[from()*)mul(327,71)what()%who(142,172)select()[!,what()}]do()>who()&'where()what()where()when()mul(286,592);: how(824,40)^mul(341,311)'&how()};^how()mul(479,155)-&when()%>!from() mul(743,297)/+% mul(785,803)~&/}#($?select()from()mul(378,606)/%when()mul(304,253)who())mul(19 mul(358,187)!/mul(61,423):%: )mul(773,349)select()mul(380,503)where()#%;do()who()$!(:&where()where()mul(25,688who()mul(539,689)?[/(>mul(915,247)how()@ when()why();;from()mul(192,625)?how()who()why()+<~where()!mul(922,457)how()@:+}[&{don't()mul(663,641)& :*]select()from()^>who(646,961)mul(302,499)mul(779,59)#+ /~;}mul(489]mul(883,556)from()#what()#:when():@$^mul(857,680)why(836,2)[mul(815,638)&why()~:why()~mul(960,833)<>from()where()where()$:who()mul(853,356)%;)+ where()from())do()<]mul(139,315){&+why(765,155),what()>@mul(281,247)mul(797,456) <>/:mul(785,173)when()$~-?:select()when()&mul(185,8)mul(510,671)%,when()how()where()from()who()mul(654,885)*who()mul(227,178)} !mul(256,394)
mul(888,165);]~mul(93,961)do();where(449,598)*-& #mul(364,267)how()what()where()&@%mul(173,845)+?>({]^-}!mul(500,764)why() , ;where()}mul(509,958)~#when()&'^(#*}mul(567,675)!why()%:(~where(){mul(659,362/<@+mul(442,603)where(232,716)!how()!;)$what()mul(47,742)don't()&{ what()mul(201,59)-how()where()&select()mul(564,724)&when(){><{who(56,63)>#mul(750,782)$,mul(713,443)(^>*who()mul(255,743)+< what()mul(13,455^when()%';how()<<&'%mul(909,623)[?%when()~[$mul(647,666)+why()mul(303,514)mul(866,565)why()*@what()(mul(528,440)mul(580,935)mul(621,192)(from()?who(),!*-mul(834,426),!]/)how()]why()do()how()}!{why()'@~^who()mul(114,512[#^~ select()*who(){^;mul(813,830)+;[#/[do()select()}/^(@!;*mul(667,761;#why()!(+(mul(427,964)why()^where()!;mul(816,813)&select()what()why()$><do()where();)<mul(238~/]^&when()what()what(181,18)mul(755,285) from()how():mul(452,659)#!}]$/what()mul(64,590)%?where()}&}/'}mul(948,939)~what();^+'~mul(688,702)'mul(557,538):'why()(why()from()%mul(731,311)>from()mul(204,891)*#^[-how()how(275,54)mul(862,293)^^/~>,*)mul(858,212)[how()?>where()mul(45,936)select())select() <)where()how()mul(617,746)/ ~%from()~mul(466,629)mul(604,220)why(235,921)^what()^select()who(540,898)what()>mul(893,561),%~(who()how())#+#mul(845};mul(795,975)who(),',mul(988,400)/$+,!$~mul(931,322)( <:%+when()mul+%<&<where():$&where()mul(795,328)'+][{mul(466,329)^mul(190,896){mul(367,236){ --<{~#where()mul(181,169)how(833,790)[/who()mul(876,536)how()(%;/>mul#'mul(892,416)what()why()mul(369,579)''mul(384,303)when()where()[what()-?$[when()mul(179,420):?:select()}when()when();,mul(246,209)select()mul(966,243)[mul(153,599)when()mul(914,433)[from()when()[--#;'!mul(810,766)select()why()$>!when()mul(931,687);select()how()@&mul(98,464)]mul(652,409)#:mul(516,121){<{() @~;how()mul(123,360))^](mul(277,239)mul(840,613)what()%mul(586,205)^]@#/don't()'[;^,$ from()mul(628,557)<)>];+who()mul(878,975from()mul(143,987)+when()*])%what()mul(603,174-from()~?mul(943,847)where(170,904)&#%]who(888,776)mul(302,183)mul(443,591),why():]~:%mul(77,426)when()where()mul(950,995)&mul(274,396)?[from()where()from()mul(409,518)$do()#^{why()mul(613,963)&^ >>;^how()mul(925,923);}mul(852,446*;& mul(743,312)do()%/who()*$]?mul(475,555)(>select();when()[mul(976,68)select()]what() +when()from()><mul(389,991)select(),mul(309,286)who(),where()why()^what(),^mul(400,11){/what()mul(152,74)/why():<*#++^mul(345,21)]who()}!'how()%(mul(679,89)>why()mul(976#>>how():''%what()mul(828,766)!@(mul(798,719)$]*<how()where()[mul(296,310)mul(681,531[>mul(646,954)@why()}from():$why()%/select()mul(741,161)+mul(91,115)^-}when()%++mul(933,749)from()<{when()(mul(909,579)#>;where()mul(211,740)$where()from()who()&mul(255,95)mul(511,373)&@!who()when()$@$?select()mul(2,521)^{)#mul(294,886)why()(!@mul(7,438)%*~(#{'$mul(234,87){+,how()how()mul(890,233)mul(801,729),;&(&mul(421@/+/from()when()/don't()/mul(672,498)what()mul(14,796)^![*what()when()# mul{!where()$where(871,580)}mul(717,476)&)'%?why(905,632)when()what()mul(815,617),how()mul(827,71)>?mul(837,520)*how()select()what())select(),how()$from()mul(952,273 &@mul(106,964)-[where()mul(778,265)}$'mul(947,970)who()<mul(832,154)}{}%[@mul(78,394)#select()[do()^select(){}#!/usr/bin/perl[@'/?~&>?>mul(780,897)
/,mul(904,917)how()from()] :%where()why(824,519)$}mul(433,689)-/{where()%>how()mul(232,555)&'@mul(170,145)?-{#?[mul(130<select(954,54)why():when() mul(152,582);{+?%,mul(911,198)+(}why()^!>?from()mul(575,167;~,${;-/)what()when()mul(688,24)&)#^*mul(251,895)(>from()#}]select()?}%mul(583,40)@what()!-mul(396',)!>%%when()}mul(127,975)#mul(986,310)what();from() <{'<mul(818,513))-[^&[mul(788,658who()*who(180,634)what()mul(183,781)mul(973,625)%how()mul(163,168)#%select())()mul/<mul(995,378)>?from()[&who()when()when()[mul(910,515)$mul(261,324)~</-'where(39,447)mul(872,74)mul(622,70)select() mul(648,514)[who(242,434)]<;?+>-mul(124,305)~select()mul(323,359)*~~mul(524}(;mul(145,708) %}what(487,689)%from()mul(371,88)~!)mul(883,681)why(621,555)from()-mul(175,888)&{];-what(569,630):?mul(229,850)&>'where()'mul(269,654]-why()//from()select()}mul(545,830)[?:}mul(849,642)/;(:)}<~mul(928,739)mul(216,77)select():;(when()@(}*]mul(113,497)(!~~;^[!mul(447,997);select()~[>]}~who()don't());}#why(326,879)+)-<(mul(581,152)> ;mul+how(771,784)+&why(582,346)'select()~what()<,mul(239,575)<(]+*from()]~'<mul(828,834)'mul(58,537)}]<mul(116-**><}@who()<-mul(473,971),:($when()from(41,290)what()];do())@^[@ from()mul(603,541)}mul(811,508)*?/!what()[-{mul(994,800 ?/!where()<why(104,314)mul(281,392)who();{who() ;(]when(133,642)mul(207,843)/%'mul(354,644)mulwhen()*;{mul(300,946)>who()where()what()}:what(){^[do()when(284,569)}>mul(150,172,]/<mul(972,952)~]do()how()>when()^mul(231,419)/do()select() }-#mul(671,892)<>/how(789,349)from()@what()#@)mul(315,222)from()}when()/}mul(930,682)>'where()?who()mul(132,978);;:@/#^}do()+mul(447,390): mul(723,622)?(how();$select()mul(980,864);>^why()[?#mul(734,179)# where(),@how()mul(838,788)/{++%mul(272,849):*%/^</$from()mul(453,461))mul(962,132)mul(375,359)!)%how()(?select()who()mul(142,910)?how()from()<$!mul(298,364)#who()+*who()!don't()mul(816,177)+mul(702,924)}(what()mul(989,523)<,,mul(735,588)how(489,394)mul(484,416)+#do()from()^^ $mul(123,782)mul(853,914)mul(203,868){'mul(909,468)why()/?where()$what()who(401,657)mul(786,343)mul(961,300)]{(!<do()^mul(936~mul(793,152)where()from()'-from()<+do()where(){+:mul(859,728)-where()%select()(mulwhat()mul(806,696)@<-mul(684,756),}who()how()~?:select()select()mul(471,727)from()<<why()what()how() }how()]mul(623,35)when():mul(871,956)mul(400,531)]where(), ;select()from()@select()don't()$/{[mul(519,781)[*mul(746,603 -from(112,309)]+ who()mul(217,136)-{+?select()#@%/mul(899,418)*!$+ *mul(154,146) +~where()mul(859,846)!<~%[{do():!(!{~mul(408,608)},/who()!, -mul(744,613)mul(829,465);~}/,'#+#mul(674,197)what()>%mul(466,441how()who()who()<why()where()select()mul(427,642)where();@+where()how(610,397))^mul(731,688)}())~why(29,145)do()(^{select(),<>'@(mul(692,669)#&mul(39,354)-where()from()who()~don't()*( {where();what()#mul(526,300)select(552,879), when()where()select()&-mul(283,140)&&?^ mul(243,254)how()/}who()mul(282,199)select()!](?'what()@&+mul(31,366)}who()mul(640,530)mul(565,470)mul(290,665){what(445,299)}<#%~ ][mul(320,303)-~from()(who()>[('why()don't()~&{)]mul(720,131)#~!!select()mul(3,408)-[where()from()who()}&}mul(558,189)!?[&(do()-^>mul(429,22)$!:>how()<,select()select(629,810)mul(748,450)(/<]?select()!//mul(679,551)how()who();?what()from()-mul(225,868)@{why()mul(177,830),{?^what())mul(229,827)~what()]'how(958,802)?who() (mul(676,215)[)mul(999,210)?]$*,?]-$,mul(661,825)
from()<#from()[@>?$(mul(631,608),+mul(946,420),( (^[^+/{mul(569,409),what()who()~mul(702,265);mul(88,623)}who()what()&mul(676,744)from() !+[do():who()^?mul(336,740)?mulwhy()from()!}where()%%mul(571,353)>$,& }>{*mul(276,415)><-do()~(]}mul(308,489)/from()when(579,867)what()~when()?&mul(633,256)how(){?~mul^why()who()>mul(223,473);why()when(),mul(722,306)from()^mul(200,701)!select()?,mul(711,878)how()where())##'+}#@mul(56,894)@[what()mul&-who()when()when()[%>?mul(281,311)where()where()how(){select()'%mul(949#[?:mul(895,313)/mul(25,736)mul*&):-/%who())mul(301,39)what()(mul(767,317)&!what()mul(271,721)(:where() :*&/mul(881,552)mul(117,678)> #),where()%)&$mul(394,101)<)>&who()what()'+mul(496,283)mul*]@+mul(331,181)select()'?:how()!what()-how()]mul(629,183){{(mul(980,656)! when()@{'-,what(),mul(93,847)++where();@select()when()mul(544,305)'#'<,from()>why()>mul(219,755)what(){ ~]}don't()-when();^^when())?~how()mul(590,547)(!from()when()[?}where()mul(930,301)where()^+when()what(733,168){>mul(899,94);:?mul(928,368)mul'what()how() >($mul(625,960)%'&where()select()~mul(584,72)^!mul(55,527);mul(492,224)?($:,',*select()mul(180,326)<what() mul(268,667)?+mul(235,375) *!]!mul(141,332);mul(356,884)from(695,588){{when()*&mul(711,131)*select()-*&mul(143,130)[select()[from(204,615) what()(mul(653,542)>select():{where()mul(824,130)what()mul(683,478)from(918,839)what()mul(582,660)<@*how()*(mul(681,373)(~~>@::]$mul(873,698)<@+when()-^mul(100,128)[^+:where()how(542,879)&{mul(327,603) $+!when()$mul(505,966) ,$~)>mul(193,642){!/,}* mul(784,245)}?what()when()#mul(4,692)<+&%!)mul(184,826)+mul(469,907)from()how(601,83)mul(307,230),@}where(318,472)from()}:})-mul(898,829?$^@where();what()(mul(258,499)mul(212,108){{!&<who()where()mul(38,864) :'#mul#where()mul(119,346)when()from()how()mul(979,593)~when()who()mulwho()where()from()*?who()])!)mul(941,717)what()from(){select()mul(29,799){{({;$don't()&/mul(321,8)mul(593,740)&:when()>what()who()who()mul(983,25)*);who()!, [don't()select();-%*@mul(798,455)when()$>from()where():do()mul(707,598)how())!:select()how()#do()mul(81,685)who()+where()mul(292,774)?/mul(80,716who()*{#;;*do()&%why()+mul(554,30)!select()],{%/what()mul(600,514)#when())do()@what()'%when()mul(955,368)[#/>:?-how() select()mul(170@?)mul(584,682)what()^,?]#@mul(623,37) ;mul(650,391)/%mul(535,768)how()when()mulwhere()when()when()*(mul(193,547)$)[why()'select()$$who()]mul(446,367),what()~@%*mul(675,581)mul(637,187){mul(727,146)}where()<how() mul(800,526)where()from(970,555)+when(),who()##mul(331,931)+[when()mul(604,25)who(265,522)select(330,185)when(){mul(893,602)select()#'(mul(280,461)-what()'-?)?mul(711,860)%&$^;]mul(389,793) }~from();from(233,583)&#)^mul(502,146)where()[mul(66,348):who()-?mul(511,100)+]@mul(329,746)<+how()$}how()/#where()don't(){~how()when()@where()'mul(479,879)why()who()who()who()}when()!from()+^mul(290,234)where()do(),how()mul(740,873):@who()mul(315where(744,335)(->)mul(896,767)select()'-mul(980,725)select()[ *#mul(159,247)!what()who(560,832){-why()what()~&#mul(567,372)-:!]?/why()+:{mul(277,161)-where()'-who()$how()<what(203,370)]do()/??:#[mul(524,458)why()*@!-}$$<:mul(903,579)&why()-$from()!()mul(102,88)-/]~mul(311,176)who(707,558)where(){what()^]mul(410,763)*&how()~;from():%@%mul(606,429<>who()from()'how(),$$when()mul(429,870):@;<#mul(587,942*&;*do()$$select()mul(3,25)when(),-%+:# from(872,943)}mul(782,821)
!>mul(851,461)+!where()$!{@!:)mul(93,494):!mul(951,143)+>)why()-{from()what()mul(988,791)mul(931,510)(:where(245,25){'mul(117,354)'what(); [[<don't()what())]:~#who()+mul(225,504%{]who();why()where()@<$<mul(639,292)&(from(),^ mul(104,198)&~ don't();&&[*when()?mul(181,83){why();>@how()select()do()when()?:from()mul(778,261):,+,mul(314,222);<?;who()what(){+mul(816,477)why()from()'where()^+<mul(199,340){-select()&mul(950,14){how()who()<don't()$}%mul(101,370)mul(615,41)how()>,^what(190,985)select() ?<mul(116,361)!@>*,[who()+:-mul(796,495)~/>do()<,}who()^mul(187,492)>'*$!what()mul(991,172)^&}:-mul(458,567)?mul(883,842)mul(755,150),!:%why()}mul(428,866)why()%why()where() (~:mul(352,708)what(370,596)$mul(898select()$why()~from()select()-when()mul(160,761)who(700,128)*mul(944,190)*#}^}from()where()mul(530,978):,+where()[?>mul(553,289)*$@/mul(286,141)what()@':~mulhow(116,291)%[mul(151,627)mul(362,891)~ %-<?;~mul(440,308)from()?<])mul(721,908)mul(45,682)*where(549,565)?~why()how()when()# mul(283,656)#!$when()~what()how()(mul(645,350),what()~^:select()-mul^<)what()what()do();$$when()mul(174,89)^mul(316,811)<~;:<select(619,564)mul(265,577)&why();why()where()&+ 'mul(365,604)?@&*,~what()$mul(568,621){+select():'[/select()mul(765,39!what())+mul(571,963)-:<+who()why()>/:%mul(275,35)@?&mul(276,797)who()/;who())why()when() ~)mul(400,219)where(757,508)}+'+>do()~?from()]~?why()${mul(674,313)]/!#select()^>how()&[do()mul(763,291)[?}><mul(424,631)#:]]mul(283,356)#/mul(999,277)[;;]mul(475,763)>$:;]/ @]mul(923,77)+:/,mul(974,68)}^<}*?(mul(573,391)?^mul(882,854)what()(from(){%!@+when()mul(263,665)'%/<[who(257,651)mul(131,306)#+[why()&,@{who()!mul(378,207)mul(830,423)how(180,743)[<$-)}-don't()mul(104,63)'$~+)/!(do()(?*when()/<:mul(184,312)-mul(457,714)?how()&where():!<(who()mul(832,385)?;&>select(),'[}-mul(409,111)<'who()who()}what(39,120)!<(@mul(466,625))from()'{:;what(),mul(833,127)$+!]mul(107,815)/ {what()what()mul(37,91)[-, what(812,83)?&mul(376,103)};-mul(640,727)select()[$-mul(64,181)mul(734,97)&@why()<#select()/?/mul(164,82)mul(786,473)@{'}mul(206,560)&~mul(784,62)@*^+what():!from()^[mul(206,626)what()[(,{where()from()why()?who()mul(533,212)#where()+how()']}where()((mul(301,424):what()#what()@ >'!do()@what()<what()when()'mul(89,449)select(871,600)+mul(438,837)-('mul(382,10)mul(547,112)mul(27,677)&]/<!#mul(141,36) where()select()$<why()!+mul(333,145)who()!)>mul(965,812)mul(3,550)from()who()!mul(965,728)#>#!)where()*)mul(497,530):when()#mul(352,808)!~{how()*!&mul(552,920)/where()+where()@-#/?mul(896,130)mul(347,579)~@ /^mul(727,709)#-how()&!&&@why()]mul(475,103)*how()/)~who()mul(542,160)mul(743,692)mul(561,997)why()mul(124,866)+}{why() mul(278,696)how()'what()$;?//where()when()mul(17,188)-+where()why();don't()--%<@why()+mul(356,107)%what()^,select()select(607,736):how()-mul(633,572)who()from()/;}select()mul(772,944)]@+/<]select()*?where()mul(858,850)(select()select()where()mul(181,712)~mul(979,178)#?}%?%do():who(268,689)*mul(941,59))-{&&(mul(296,702):@)where()don't()why()when(),mul(405,639)~$),who(575,232),%mul(671,828)

140
Inputs/Day4.txt Normal file
View File

@@ -0,0 +1,140 @@
MSAMXXMASXSXMMSASXMASMXMASXSXSSMSSSMMMSSSSMSAMXASAMXXAXMSMMMAXMAMSAMXAMXMXXMXMASMXSAXMXMAMXSXSXXMSSXMSSMMSSMMMMXSXAXMXMAMMASMSXSXSSXMSSMSSMM
MSASASAAXSMAMMSAMXSXXMAMXSASAAAASMSASAASAAAMMMSXXMMMSMMXAAASMMMMSAMXSAXASMMSSMMXAXXMSSXXMSMMASMXMASXAAXAAAAAAMAASXSAMAXSMSMMASAXAXAAAAAMAAAS
ASAMASMMMASXMAMAMXXAXSMSAMAMMMMMMAMMMMXXMMMMSASXXMAXAASXSSMSASAMXMSAMXSASAMAASAMXMAAAMXMASAMAMXMMASMMMSMMSSMMMMMSAAASMSMAAMSAMAMXMXMMXSMXXMM
MMAMAMAAAMAMMASMMXMMMXAAMMXMMXXXMXSXASXSMSXXMASAMSSSMSMAAMASXMASAAMASXSAMXMSSMMXSMMMXSAXAXAMSSMAMASXMASXMAMMSMMASAMXMMAMMMMMXSXMSMXMASMXSASA
XSAMAXSMSXAMSASASXMAAXSSMXXXAXMXSAAXXSAAASASMAMAXAXAMXMSMMMMMSAMMMSXMMMAMXAXAAAAMXMSAXMSSMSMASASMAMXMASXMAXAAAMMSAXXSSXMXSXMXXAMXMMMSMAASMMS
MSXMMXMXXMMMMASAMMSMXXAAXXSASMMAMAMMXMMMMMAMMASAMMSAMSXMASXXXSAXSXSMSAMASXMSSMMSXAXMASMXMAXMMXSAMSSSMXSASAMXSSMXSASAMXMAXMASMSSMASAXAMMMSMAM
XMAMSAMMSAMXMMMMMAASMMSAMXXMMAMASMXSAMASXMXMXASASXAAASASAMMMASXMSXMASXSASAMAMXAMMSMMXMXAMAMAMSMMSAMAAMSAMXSAAXMASAMXMXMASMXMASASASXSMAXAXMAS
SMAMXASAMAMXMMXAMSSSXAMASXXXXXSASAAXASASXMAXMXXXMMXMXSAMXSXAXSMMMAMAMAMMSXMMSMASAAAMXSSMMXSXMAAXMASMMMMAMAMMMMMXSXXAAASAMXAXXSAMXSAMXSMMXSAS
XSXSSMMXSAMXMMMMMMAMMXSAMMMMSXMAMMMSAMASASMSSSXAXMAMXMMMMMXSAMAAXAMASXSAMXXSAMXMMSMMAXASAAMASXSMSMMMAAXAMSMSAMSASXSMSMSAMSMMMMMMSMMMAMASXMAS
MAMXAAAAXMMAMAAMAMSMSXMASAAAAAMXMAASXMMMMMAAAXSXASAXMXMAXSAMXSSMSSSXSXMXSAXXMSAMXXXMXSAMMMSAMAAAAMASXMXMMMAMAMSAMAXAMASMMAMASAMXAAAMAMAMAMAM
SAAMSMMSSXXAXSMSAXXASXMXSXMMSAMXMMMSXSXSAMMMSMMSMMAXSASASMAMAXAAAAAAMMSXMXSXASMSAMAMAMAMXAMAXXXMAMASAMASAMAMMAMAMSMMMAMASXSASASAMSMSMSSSSMAM
SXMAAXXAAMSXXAASMMMMMAXMSAMXXAMXXMXMXXAXAXXMAAMXXMSMSASXXMSMMSAMMSMAMAMAMAMMXMXMAXAMASAMMMXSMXMASMMSASASASXSMMMMAAAXMASMSAMXXAMMXAXAMXMAMSAS
SAASAXSMXMAMMMMMMAXASXMASMMMSAMMSMAMSMSMSMAMSXXASMMAMMMMSMMAMSXXAXXXMMSAMASASXSXMMXMAMASAMAAMMMAAAASXMASMMXXXXAASXXMXAAXMMMSMMSAMXSMSSMAMSXS
SAMAAMSXSMMSMAAXMMSMMMAMSXAAXSMSASASXAAAMSSMMMSXSAMXMAMASASAMXMMMSAMXAMASXXASMSAMSSMSSXMAMSSSXMXSMMSXXXSAMXAXMMMMASXSMMXXSAMXAAAMAAXAXMAXXAM
MAXXSXSAMMXAXMSSMMMXMMSMMMSSXXXSAXXXMXMXMAXXAXMASMMSSSMASMMAMAAMAXAMMSSMMXMMMAMAMAAAAXAMMMXAMMMMXXAMXMMSAMMMMAMSMAMAAAMMMMAMMXSMMMXMASMMSMAM
XMMMXMMAMSSMSXAXMAASMAXAXAAXMMMMSMASXXSAMAMSMSMAMXSXAAMAMMXMSSMSMSAMAAXAAXMASMSAMSMMMXMMAXMAMAAMMMXXAAAXXMAMMAXXMASMMMMAMMAMSMMAAXSAMXXAAMXM
AMAXAMSMMMAASMMSXMXMMAMMMSXMAAAAMMMMAASASAAAAAMXXXMMMMMSMSAMXMAAXSAMMSSMMSSMMAXXMAMASAXMMMSAXMSSMAAXSXMSASXSMMXSAMXMXSXSMMAMXASXMSXXMAMXXSXM
XXAMXMAAASMMMAMAMSMSMSSXAXMASXMSMMXMXMXASASMSMSSXSMSXSAXXXASAMXMMMAMAMXAXAMXMASXSMSASXSAAXSMSMXAMMSXMAXXMAMAAAMAMXASXSAXAMMSMXMAXXMSMSSSSMAX
MXSXMMSSMSAMXSMMMAASAXMMXSAMAAMAXSAMXXMAMAXAXAAXAXAAAMXSMSMMASAMXSXMASXSMSMXMMSAAAMASASMMMMAAXMXMMMAMXMASMSSMSSSMSXSAMAMMXMAMXXMMSMSAAAMXSMM
SAMAAAAAXSXMAXAXSMSMXMASMSXSXXMAXSASMSXMMSMAMMMMMMMMSMMXMAMXAMASAAXSSSMMAMAAMXMMMMMAMXMAAASXMMXMMXMXMSMXAAAAAXAMXXAMAMAMXXSASMMXAMAMAMSAAAMA
MASXMMXSMMMMMSXMASXMMAAXASAMXSXSASAMMXXAAAASXMMXMXMAXAAASASMASXMXSXXAXAMAMSSSSSXMAMAMAXSMXXAASMASAXMXAXAXXMXSMSMXMSMASXSAXMASAAASMXMXXXMSSMS
MAMMXSAMASXAMXASMMMASMSMMMXMMMAMMMAMAMSMSSXXAXSAMMSMMSSMSASXXSMSAMMMMMSSXXAMMAXMMMXAXXXXMMSMMAASMXXAXMSMSXSAMMXSXXXSMSAMMSMAMMMSMAMXXMSXMAXA
MMSMAMXMXMMMMMAMAXMAXMAMXSXSAMMMXSAMAMXAMXASAMSASAMXAXAMXXMASMAMMMMAXXXMMMASMSMMXMASMSXSAAXASMSMSMMXAXAXMXMASXAAMXMMMMXMSXMXMMXXXXSXASMASMMM
MSAMMSMSSSXSAAAXXMMAMSAMASASAMMSXMXSAMMAMMMMMXSAMXAMXSAMXMXXXMSMXXMMSMSMXSSMAXAXAMAMAXAXMMSXMXAMAMASASMXSAXMMMMSMASAMXAXXAMASMMSMMSXMXSXMXAX
MXASAAAXAAASXXMXSAMXAMASXMMMXSSMMSASAXSSMSXASMMXMMXMMSAMMXSMMMXMAXSAAAAAAMAMMMMSASXMSMSMMAXXXMXSAXMAMXMASMMMXAMAXXSXSXMASAMASAAAAAMAMMMMMSSM
SSMMXXSMMMMMAMSASXSMMSASXMAMMMXAASMMSMAAXASAXASXSMSXASASAMXAMSAXAMMSMSMSXXAAMXXMAXAAMMMAMXSSSSMSMXMAMAMMMXAXSXSASMSAMXXAMAXASMMMSMXAMAAAXAAS
XAMXMMMAXXXMXMMASAXAAMXMASMSASMMMSXAXMSMMMAXSAMXSAXMXSAMMMSXMXMXASAXXAAAXSSSMXXXMMMMMASAMXAAMSASASXSSSSMSMMXAAMASXSAXAMMSSMMSMSXMMSSSSSSMMSM
SAMXSASXSXSMMXMAMAMMMSASXMASMSAAAMMSSMXAMXAAMAMAMXMMMXXMAMXSAAMSXMASXMSMMMMAMXMMMASXSMSASXMXMMXMAMAAXAAAAASMXMMXMASXMMSMAMAXMAMAXMAMXMAMXXAM
MMSMMMSASAMXAXMASXSXSAMXAMMMXSXMMXAXAAXMAXMXMAMASAMMASASXXAAXMMASMAMAXXXAASAMASASASAXXXXMAXSMSMMMMMMMSMMMAMAAXMSAMXMXAAMMSSMMAXMMMASMMSMSMMS
MAAXAXMAMXMASXMXMMXMAXXSAMXSMSMMMMXXMMMSSSMXXASAXXXAMXAXAMSSMSXASMXSXMXASMXASMSASAMXMMSMSXMMAAXAXXXMAXXXMASMMSAMMMAXMASMMMASXAASASASMAMASAMX
MSSMMSXXAAMXXXMAAMMSSXMMXXMSAXMAASMSMXXAAAASMMMMSMSSSMXMMMMAAXMASXMAMXMMMXMAMXMMMMXMSXAASXSMSMSMSSMMSMMXMAXMASASXSMSXAXAASAMXXSAAMASMXMASAMM
XAMAXMMXSXSASMMSSMAAMXMAASAMMMMSXMAAXAMMSMMMAXMXAAXAAXMAMASMMMMXMASXSXXSAXXAMXSXASAAMMMMMASAMASAAAMMAAMSSMMAMSXMAMSSXMMSMMASMMMMAMXMXAMAMASX
MAXSASXAMAMMSSMXAMMSSXMAMMAMXXAXAMSMSXXAMAXSXMASMSMSMMMXSASASAXASXMAMAMMASAAMAXSAMMSMMAAXAMAMAMMSSMSMSMAAAXSXSAMMMASASAXXSAMXSASMSAMSMSMSAMX
MMMMAXMMMAMASAXSAMAMMMMXSSSMMMMSMMAAMAMASMMMMMXXAMAMAMSAMMSASMSASAMAMAMXAMMSMAMSMSMXASMSMASXMAMMAMAXAAXSSMMMASMMXMASXMASAMSSMSASASAMSXAMMASX
SASMSMAAMXMXSAMSAMXXAAAMMAMMMAMAASMMMAAXMAMAAXMMXMASAMMASAMMMAXAMAMXSMSMSSXMMXXMAAASAMAAMAXXSXXMAMSMSMXMMMAMXMXMXMASAMAMAMMXMMXMMSAMMMSXSMMM
MASAXSSMXSMAMMMMXAXSSXXAMAMXSSSSMMAMSMSSSXSSSSMSASXSASMXMMSAMSMMSASASXAXAMAXMMMMSMXMSMSMSMSASAXSXMMMMMMSXSASXXAMSMMSAMXMXMMMSXSAXMAMAAXMMSAS
MSMMMMMSAAMXXAAMAMXXMAXSSMSMMMAMXMAMAMAAXAMXAXAMMSXSXMASXXMAAMAMSAMASXMMMMMMMAXAXXSAMXXAMAMAMXMMAMXAASAAASASAMASXAXMXXSXSMSAMAMXMSSMMMSAMMXM
SAAXXAAMSSMMSSSSSMXMMMMMAMXAMMSMASXSSSSMMSMMSMSMXMAXASAMMASAMMAMMAMAMAMAXAAMXXMASAMXMXMAMSMAMMMSAMXSSSMMMMXMMSMXXMMASMSAMAAXMSMAMAXAMAMAMAAM
ASMMSMXMAMXAAAAAMXAMAXASXMMSXAAMXSAAAAMXAXASXAAXMASXXMASMMMSMSMXSAMXXAMXMSMSASMMSAMXSXSXMXSAXAMSXMXMAMAMSMSSXAMMMSMMMAMSMAMSMAXAMMSMMAMXMSAS
MMMXXXXAASMSMMMMMMXSMSASAAAMMSMSAMMMMMMMSXMMMSMSMAMXMXXMAAAMMAAXMMXXXASAMMASMXAASXMXSAMAMAMMMSMMMSMMAMAAAAXASASAASAMMMAAXAMAMMSMMXAXMSSMXMAA
XMMXMASMXSAXMXMXSAMAAMXSXMXSAXAMMXXASXSAXAMXAAMAMXMAMMSMSMMXSMMMAMAXMMMMXSASXMMMMAMAMAMAMSSMAAAAAXXMASMSMMMMSXMAMSAMAMSSSXSXXXAXASMSMMAMAMXM
AMXMSAAXAMXMSXSASAXXXXXXMSMMMMAMSSMXSAMASAMSSMSXSASASAXAASMMSAXSSMSMXAAXAMXMAXSXSAMMSMSMSXAMSSSMSSXAMAMXAMSXMASXMSAMXMXAXASAMSAMXSXAMSAMAMMX
SAAMMSSMMSASXSMASMMSSMMSAMXAMSSMMAMAMXMASAMAXXAMSASASMMSMXSAMXMMAAAASXMMMSAMXMAASXSXAAAMMMAMXMMAXMAXSAMXSAXMAMXMASXMXXMMMMMAMMMMMMMAXMXMAMXM
MXMMAMXAXSXSXAMAMAXAAAAASMMAXAXXXAMXSXSASXMASXSMMAMAMXAAAXMMMAAXMMMMMAAMASXSMAMXMMMXMSMSAMMSMSMMMSAXSASAMMMSAMAAMMMMXMMMSMMMMMAAASXMMSMMAMAA
SAMMSMXAMXMMXAMASMMSXMXSMMMSMASMSMSASMMASMSAMXMAMSMMMMASAMXSMXSXSMXXXSMMASXMAXMXMAAAXMAMXSAAMMASAMXMSAMXSXAXAMSSXAASAAAASAAAAXMXMMAAAAMMSSXS
SAMMAASXMSAXSXXXAMAXXMMXASAAMAMMAXMASAMAMMXXMASAMAAAXMAMAXAXSAXMASXMAXAMXMAXXASXSMSSSMAMAMXXSSMMXSXMMMMMSMMSSXMXMSSXMMMXSAMSASXSSSSMMXXMXAMX
SAMMMMMAASMMXASMXMASAMXXAMSMMSXSXSMMMXMXSSSMSASMXSSMAMASMMSSMXXAMXMAMXAXSSSMMMAAXMAXXMAMMXSXAAXAXSMMAAAMXAAAMXAMMMAMMASAMXMMXXAAAMXXSMSXMASX
SMMXSASMMMAMMMMXAMAXAMXMSMMXAXAXAMXSAXXSMAMAMXMAAXAMXSXSXAMAXSMSXXXASMSMAAMXASMAMMMSSSXMSASMSMMMSMASXSSSSMMSSMMMAXMASASASMXXMMMMMMMAAAAXSAMM
SAMXSAXAASAMAMASXMASXSSXAASMMMXMASAMXSMMMAMSMAMMMXAMASASMSSMMSAMASMAMAAMMMMSASAAMAMMAMAAMAMAAAMMMMMMAAAMAASXMAXSMSXAMASAMAAXXAAAAAXXMXMMMASA
SAMXMAMSMSSXXMMAMXXMAAASMSMASAMSMMASMMXMAMMXMXSASXMMMMMXAXMAAMAMAMMSMSMMMAASXSXMMAXSAMXMMMMSSMMMAMXMXXSXSMMASMMMASXMMAMAMSMSMMMXXSSXMXSASAMX
SSMXMAMAAXAXSMSMSMMMMMMXMXMAMMMAAXXMAXMAASMSXMXXMASMSMXMSMXMMSAMXSAAAAXMXMXMAMXSSSXSASMSASAAAAMMAXXXMXMAMXMXMAMMAMAXMAXXMAMSASMSMAMXMAXMXMAS
SAXMMMSXSMMMXAAAAAASXSASMAMMMASXSMSSSMASMSAMASXMSMMAAMAMAMXXMXASMMMSSMXSAMXMSMAXAMASAMAAAMMSSMMSSSMASAMXMSSMSMMMASMMSASAMXXSAMAAMAMMMASMXSSM
SMMSAMXMMAXAMSMSMSMSASAMMXSASMSAXAXXXAXXAMMSAMMAAMMSMSXXAXXMSSMMAMMMAXAMAXMMMAMMMMMMAMMMMMAMXXMAMAAMMASMAAAAAAASXMXMXMAXMMASMMXMSMXSMASMAMAM
SXASMSAMSSMSAMAMAXAMXMAMAXSXSAMMMXMXMSMMMMAMASXMASAXXAASMSMAAXMASAASXMMSAMSASAMAAAXSAMASXMASMMAMMMMXMAMMMMMSMSMSAMXMAMAAXSASMSMXMMAXMXMMAXMM
XMAMXMAMAXAXMMAMXSAXXAMMMXMASASMSAAXAAXAXMXSMMAMMMXSXMAMAAMMMMXAASAMXAMMMMSASMMXMXXSASAMASXSAMMMASXMSSXXAXXXMMASAMAMAMXMMMAXAASAAMMSSMMSSSXS
SSMMSSSMMSXMASXMASAMSSMAXASASAMAMXXXSSSMXAMXXMMSAAAXAXMMSAMXSMMMMMSSMSAXAAMMMAASXMMSMMXSXMASMMASMSAMAMASMSMAMMMMSSMSMSAXMMSMSMSMSAAMAAXAASMS
AAAXAAXMAXAAXXAMXMAMAAXXMAMXMMMAMMMMAAAMMSASAMAMMSMMMMXAMASAMXAMXAAXXAMMMMXAMXAAAAMXMAXXAMAMASAMXSAMAMXMAAMAMAMMASMAASAMXAMXMAXAMMXSSMMMSMXX
SXMMMMMMMSSSXSXXXMAMMSMXAAMAAAXAXSAAXMAMAAMSAMASXMXAMXMAMAMASMSSMMSSSMXAAMSMSMSMSXMAMMMSMMASXMMSMMXMAMAXXMSSSMSMAXSMXMMMMAMAMMMMMAXMASASAMMS
MASAMXAXXAAXXAMXSMMMAAAXMASMXMSMSAMMMXMMSSMSAMXXAAMMSAXXMSSMMAMXMAMXMXAXMXAAXXXAXMMXSAAAASASMSMAASMSSSSMMXMXAAAMSMXXMASXXAMSMSAMMSMMASXSASAX
SAMASXMMMMSMSXMASAAMSSSMSMXMXXAMAMSXSAXAAAAXXAMSMMMXMASXXAAAMSSSSSSSSXSSSSMSXMMSMMSAMMMSMMASAAXMXMAAXSAASMXSMMMAMASXMXAAMMMXASXSAAMMXSMSMMXS
MXSAMMSAAXMAMXMAXAMXXAXAXXAMXMASAXAAMAMMSMMMSXMAMASXMASXMMSXMMAAXAAAXAXAAXMMAMMAASXSMAXXAMXMMMXSAMMMMSSMMMASXMXASMMAMXMMAAAMXMMMMSSMXSAMAMAS
MMMMSASXSMMAMMMMSSXSSMMMMMSMSSMMMMXMMAXMAXSAXAMMSASAMSMMAXAAMMMMMMMMMXMMSMASAMSMSMAMMXMXAMMMMSAMMXXMXMAXAMASASMMSXXAMAXXSMMSMMXSAMXMAMSMAMAS
AAAMMASXXASAMMAMXMAXAXAXSAAAAMSAXMMMSXSMXMMMSSMMMMXAMAAXSMMSMMASAMAXAMXXXMASXMAXAMXMSSSSSMAAAMAXSAMSMMMSMMASMMAMSMMMMXMMXMXXAMASAMXMMMAXSXMS
SMSSMSXMMAMAXSXSAMSMXMMMAXMXMMSMMSAMAMXMAMXMAMAXAMSSSMSMAMAAMMASASXMXAXSXMASASAXMAMXSAXAAXXMXXXMMASAAAAAAMAXMSSMMAASMMXSAMXSSMASMSMMMMMSMAAX
XAMXMMAMSSXMAAASMXAAASXSSSSXXXXAASXSSSMSSSMMASMMSAAAMAMXAMSSSMASAMXXASAMAMAMMMMSXAASMMMSMMSMSMAMSMMXSMSSSMSSXAXMMMMMAAAMASMAXMASAAAAAASAMAMS
MAMAMSMMAXAMXMXMASMSMSAXMAMMMSMMMSAXXAMXAAAMAMAAMMSMSMSSXXXAMMAMASAXMMASAMMMSAASMSMMAXAXMXAAASXMAXMAMMMAMAMAMMSMMSMSMMMSAMMMMMAMMMSMSXSAXSSM
AXSAMAMMMMXMMMMSMMXAAMMMMAMAAXAASMMMSMMMSMMMASMXMAMASAAMXMMMMMMSAMMMXSAMASXAXMXSAXAMXMMSSSMMMSXMMMMMMXMAMSMXMXAMXAAAAMXMMMAMXMSXXMAXXMMMMXAX
SASMSXSAAMSMMAASXSSMSMSXSXSMSSSMSAAMMAMMMMXSXSXXMMSAMMMMAMMXSAMMASXMAMMSXMMXSXMMMMMASMMAAAASXMAMAASXMASXMAMMXMAMSMSMMSAMSSSXMAMAAASAMXASXSSM
XXSXMMSMSMSAXMMXAAAAAAMXXMSAMAAAMXMMSAMMAMASAMAXSMMASXMXMSAASAMSAMAMASAAXSMXAXMAXSMAAAMMSMMMAAXMAMSAXXSASXSAAMXMSXMAAMXXAXMAMAMSMMMXSSSSXAXX
MMSAMASMMAMAMSMMSMMSMSMAXAMAMSMMMAMMSXMMAXAMAMMMSASAMXSAMMMXSAMMSSXMXSMMMAMMMXXAAXMAXXXAXMASMMMAMSMXMAMASAMMXSAMXAMMMSMSMSSXMAXAAASAMMMMMMMM
AAMXMASAMMMSMMAAXAXXAMAMXSMMMMXAMAXAXSSSSMSXMMMXSAMASAMMSXMMMXMAMMMSAMXXSAMAAMASXMSSMMMSSSMMMASXMAAAMXMSMAMAMSASMSMSXAAAXAAXSSSSSMSAMXAMAAAX
SSMAMAMMXSAXAMMMSMMMSMMXAXAXXXMMMSMMMMMAXAMXSAMMMMSXMASAMXSSXMMMSAAMAXXASMSMMSAMAMAAAAXAAXAXSASXSMSMSXMAMXMAXSAMAAAMAMXMMMMMAMXXMASAMXMXSSSX
AAXSMXMXXMASXMSXSXMAXAMMMSSMMAASAXASXAAAMXMAXASMAAAAMAMMSAAMSMAAMMMSAMSXMXAXMMASXMMSMMMMSMMMMASXMXXAMMXAMMSXMXMMSMSMXMAAAAXXXXAMXASXMASAMAMX
SSMMAMSMSMAMAMSAMXSASAMSMAMXASMSASAMXMMXMAMMSMXMMXSAMASXMMMMASMSSMAMAXMASXMSXSAMXSXXXAXXAAXXXMSAMAMASMSXMAXSXAMXXAXMASXSMSSSMMSSMXMASASAMAMM
MMAMXMAASMSXSMMAMAMXSXMXMASMXXAXAMAMXSAXSAMXAMSMMMXMXMXAXSXSAMSAXMXMXAXXMAAAXMASAASMSSSMMSMSAMXAMMSAMMAXASMMSXMAMMMMXAMXMXAAXAAAXSMMSMMMMMSS
MMMMSSMSMAXSMASXMXSASAASMXSAMMMMMMXXXAAXMMSSMXAAAAMAAMXMMMAMASAMXASXMMSSSMMMSXAXXAMXAASAAMASMASAMXMASMSMMXAMSMSXSASXSMSASASMMMSSMSAMMAXMSAAA
MAAAAXXMMAMAXXMXAAMASXMAXMXXMAXMSAMXSMMMMAAMMSSSMSSSMXAAAXSMMMMXXMASAAAAMMMXXMMSMXAMMSSSMMAMMMAAXAXXMAXXXSAMXASXSASXAASMSAAXMAMAASMXMSMAXMAS
SSSMMSSMMSSMMSMXMXMAMASXSSSMSSSXMASAXXSXMSSMAAMXAAAAAXSXMSMMSAXSASASMMMMMASASXAAASMSMAMAMMXMASMMMSMAMMMMMSXMASMAMMMMMMMAMMMMMMSMMMXMSMAMAXSM
XAAXXAMAAXAXAAXAMSMMSAMMAAAAAAMXSAMXSAMXAAAMMSXXMMXMMMMASAMAMASXXMASXSXXMAXMXMMXMAAAMAMAXXMMXMAMAXMASAAAMXMAMAMXMASAMMMMMMXAAMXXXMAMAASXMSAS
MSMMMASMMSMMSSSXSAAXMASAMSMMMXMAMXMAMXAMMMSMMAXXASXAMSSMMAMXMMSAMXXMASMMMSSMAMSSMXMMSSSXSAXXASAMXXSASMSSSMXMMSMXSASMSAAMAXSXMSASMSSSSSMAMAMX
AAXMAMMXMAXAXXMXAXXMMXMXMXMXMAMAMAMSSSXSAAXMMSSMAMXSXAAXSAMXSMMMSSMMXMSXAAAXASAAXSXXMAAASMMMXSXSAAMXSAMAAAASXXAAMMSXSXSSMXSASMAMAXMAMXMXMMXX
XSAMXMXSMMSMMMXXMAMMMXXAMAMASASASAMAAXAMMMMAAAAMAMMMMSSMSASXSAAAXMAMXXAMMSXMMMXSMMASMMMMMXSXMMMSXXXAMXMSMSMSASMMSXMASXMAMAMMMAMMSMMSAMXMXXXX
MXXMASASAMMMAMMMXSAASMSASASMSXSMSASMSMMMSMSMMSMSASXAAXAMXXMASMMMSSSMSSMSAMMSXAAMAMAMAXXXXAXAAAAXAXMXSAAXAXXMXMASXASAMASXMASAMXMAXXXMMMAMXMMM
MMSMXMASXMSMXSASAMSMAASASASASAMASAMAXXXXAAAXXMASASXMSSMSAAMXMASXMAAAMMXMAMASMMXSAMASXMSXMASXMMSMMXMASMSMSMXXASMMSXMAMXMAMXMXXSMXXSXMASAMXASX
AAAAAMXMMXSAASMMXMASMAMAMXMXMMMAMMMSMMMAMSMMAMXMAMAMXMASXXSASAMAMSMMMXMMAMMMAAAXASASAMXAMASASMXAXASAMAAAAXMXXMSAMXMSSMMSMMMSMMMMMSASASAXSAMX
MMSSXSMMSAMMMMMSMXMSXAMSMSMSMXMXSXAAAAXXXMMSSSMMXSAMXMXMMMSXMASAMAMSMAXSAMXSMMSSMMASMMASMASMMAMMXMMAXSMSMMMSMMMMSAMAAXAAMAAAAAAAXSAMAMXXMASX
SXMMASAXMMSMXAXXASMMXSSXAXAAMASMMMSSSMSXAXAAAAXSASASXMMAAAXMAMXMXMXAMAMSASXSXAMAXMMMASAXXXMMMSMSSMMSMXAMXSASAAAASAMXSMSSXMSSXSSSMMMMMMSXMMSA
XAASAMSXXXMXSMSMXMXAAXMMMMSMSASAXXAAXAMMMMMMMSMSASAMASMXMXSAMXXMASXMXSASAMAMMMSMMMXSAMMSMMSMXMAMAAAMAXXMXMAXSMMMSAMXXAXAAXAMAMAMAMXMSAMASAMM
SXMMAMMMMSXAMSAXASMXMMXAAXXAMMSXMMMXMXMAXAXMMXASXMAMAMMMSAMXMXMMAXAXXMAMAMAMSAAMASAMSSMAMMAMMMAMXMMSSMXAXMSMXMSAXMSSMMMSMMASXMAMASAXMASXMASX
AMSXSMAAAAMXSAMSXSAAMMMSMSMAMASASXXXAASASXSXAMAMAMXMAXAMXXMASAAMXSSMSMAMXSSXMSAXAMASAXXASXASXSMMXSAMAMMXSAMXAXMMMMSXASAMXMMMMSMSAMXSXAXASAMA
SASAXXSMSXAXAXMAAXXSAAAAXMMMMMSAMAMMSMMMAMMMXMAMAMXXMSMSMMSASMSMMXMAMSASAMXAMMXMASMMMMMMMMAMXAMXAMXSAMMMSAMMMSASXMXXAMXAAXAAXAAMMSMMMMSMMMSS
MAMAMAXAMXSASXMSSMMXAMSSSMSMMMMMMXMAAXMMMXAMAXSMSMSMAAMAAAMASAXXAAMAMMXSAMSMMAAXMMXAAAASXSASXSAMXSAMASAAXAMXAXAXMASMSSMSMSMSSSSMAAAXAMAMAXAA
MXMSMSMSAAXSMAXAAAXSSXAMMAAAAAMMSXMSSXMASMSSSXMAXASMSMSMMMSASASASMXMXSXMXMAMMMXAAASXMSAXXMAMAMMXMXMSMSMSSSMXMMSSMXMAMAMXXXXAXAMMXXXXMMMMXSSM
MXMXAXAMMMSASMMSSMMMMMXSMSMXMXXASAMXAMSSMAAAMAMXMXMAXAXXXXSAXAAMXMASAAAAMSXMAAMMMMSAMMMMMMSMMMMSMMXAMXAAAAAXXAAAAXMMSSMXXSMSSMXMSSSSMXSAMXAX
MXMMMMXMMXMMAMXAXAMXXMMMAMAMSSMMSAMMMMXAMXMAMMMXAXMXMXMMSMMMMMMXMSXMASXMAMMSMXSXAAMMXAAMMAAAASAAAXSMSMMMSMXSMMSSMMSAAXMXMMAAXXXMAAAXAAMAMXMX
SXMAMSMXXMMMSAMXSXMXAMXSMMAMAAAMMAMMXMSXMASMXAMXSAMASAXMAXAMXAXAXXAMAMXAXXAAXAXXMMMXXMMMMSMSMSXSMMXXAAAAXAAAMAMAAASMSMSAMMMMSSSMMSMMMMMAAAMM
AMMAMMXXASMAMXSXMASMMAAXMSXMSSMMSSMSAMXAMASAMXAMXMSASMSSMXXSSSSMASAMSSMSMMSSMMMAMXXSXXAXMMMMASAXMSSSXSMSSMMXMASMMMXAAMMAMXMASMAAAAXXXAXSSMSA
MSSMSAAMSMMMSMMASAMASAMXMMMMAAAXAMASXSXSMMSMAMAXAXMXSAXAMSMXMMAMMAMMMAAMXXAMXXAMXSMSASMMMAAMAMAXMAAMMMXMXMSXSASXSMMMMSSSMMMSSSSMMMXAMMXMAMAX
XMAMXMASXAAAAAXXMASXMMMAAXSSSMXSAMXMASAMAMXXMASMMXSAMXMAMAAAMSXMMMXAXAMXXMSMASXMMXAMAMAASMMSAMXMMMSMASAXMXMAMAMAAXMAXXAAAMSMMXXAXXMXXMAMAMMS
SMMMSXMAXXMMXMXSSMMASASXSMAAAXASAMXAASASMMSXMAMAMXMMSXSAMMSSXMASXXSXXSAMXSAMXXAAMXMMAMXMMAASAMXSMMMXAMAXXSMMMXMSMSXMXMXMMMMAMXSXMXMASMMSMSAS
MAAAXMAMAMSXSMXMAASMMAAAMMMMMMASAMXMAMAMAXXAMASAMMSXXAXAXXMAXSAMMXMASMAAXSMSXSSMMMASXSASMXMSAMAAAAAMMXSASAAXXMAMAAXAMSAMXMXAMMMSAXMXXAAXAMAM
SAMSSXXXMAMAAXAMMMMXMSMAMAAMXSASXXXXXXSSMMMXMASAMASAMXMMMSAMXXSXXAMXMSMSMMXAAXMASXMMASASAMASXMASMMSSMAMXAXMMMSAMXMXXAXMXASMXSAXXSXSMSMMMMMSM
MXAAMMMXMAMXMSXSXMASAMXXMXMSASAMXSMMMMMAMMSAMXSAMSXMXAXMAXXXMMMMSSSSXMXAAMMMMMSXMAXMAMASAMXMXMAXAAAXMXMSXXSXMASAXSMSSXMMMXAASXMXMXMAAXMXSAMX
MMMASXSSSSSSXAASXSAMASXSSMAMAXAMAMMAAAXXMASASASXMAMXSMSMSSXXMASASAAMMSMSXMAAAAXMMXMMXSASXMSSMXAXMMSMMSXMAXXAMXMMSXAAXAMASMMMMXMASAMXMSAXMASA
XASAMAMAAXAAMMSMAMXSAMAAAMAMMXMMXXASMMSAMXXMMMMXSSMXAAXXMXMXMSSSMMMMAXMMMMSSMSSSMSAXAMAMAAAAAMSSXAMAAXAMXMSSMMAXMMMMSXSAMAAMXSMMSASAAMMMMXMX
SXMMMAMMMMMMXSAMXMMMXMMSMMMSMXSASAAXAXMASAXSASXMAMASXAMXAAAXMAMMMMMMSSXSAXAXXAAAASXMMSSSMMMMMMMAMSSMMSSMXMAMASXXAAAXXMMMSSMSAAMAXAMMXMXASAMX
MMSASXSAMXMMXMXXXSXMXSAMXSAXAAMAMMXMMMSAMXMMASMMAXAAXAAMSMSMMASAAMAMXMASXMMSAMMMMMXSXAAAAMXMAXXAXXAAXAMXXMXXMSMSSSSSMXAMAXXMASMSSMMMMMSXXASX
AAXAMASMSMSMMMSSMMAMASAMXMMMMMSASXXMXAMXSSSMAMXSMMSSSMSMMMAASMSMSMSSMMAMAMAXMXSXXXSAMSSXMMXXAMSXMSXMMSSMMMSXXMAXAAXAXSSSMSMSXXAMXXAXAAMXSAMA
MMSAMXMXAAAXXAAAASXMASAMXXAAAASXSASAMXSXMAAMMMXAXAMAMXAAXSSXMMSXMAXXAMXSAMXXXASXMMXMAXMASMSMXXMAMAASAMAAAAXXAMXMMMMSMMXAXSAMXMAMXSSSXSAAMAMX
XXAXXXMSMSMSMMSSMMAMXXXAMXSMMMSMMAMSAMXAMXMMMSSMMMMMAXXMMXXXMASAMMMSMMXSMSMSMMMAXAAXMXMASAAXMASXMSSMASMMMSSXSMMXXXAAAXSXMMSMXSAMXMXSAMXXSAMM
XMASMAMMXMXXXAXXMSXSMSXMXAAMMAMAMXMXXMXAMAXAXAAASASXSSSSXMAXSXMMMAAAAAAMXMAAMXSMMSMMSASAMXMMSAMXXXAMXMXMSAMAXASXSMSSSMXASAMXMSXSMSAMXMSASASM
MXAXMAMMMSXMMMMMXXAAXMASMSSXMASXMMSXXMASXMSMSSSMMASAAAAXMXSXMAXAMXMMSMXXAMSMSMMSAAMAXXXASXMAMMSSXXMMSMAMMAMMXAMMAAMMXMSSMMSSMMXMAMAXSAMXSAMX
SXMSSMXSAAAAASASMMMMAMXMAAAASXMXMASXMASXAXAAMMMAMSMMMMMMAAXASMSMSXSAXXXXMXAMXMAASXMASMSMMAMXSXAXASAMXMASMXMXMSMMMXMMAMXMASAMAXSMASMMXXSAMXMX
SASAMXAMMXXMAMASMAAXSSSMSMSMMASXMASMAXMSMMMMMASAMAMSMMMSMMSAMAAXAAMMMXSAMSAMAMXMXXMAMXAMXXSSMMXSMAAMXSMSAASXMAAXXMASASMSMMMSMMAXAXXAMMMXSMSS
SXMASMMXXXSXSMAMMSSMMAMAAXMASAMAAXSMMMMXXAAASXXMMAXMAAAAAXMXMMMMMSMSAMXAMAASMSMSSXMXSSMMSMMAAMAMXAAXMSAMMMSASMXMSSMMAMMAXAAAXAMMSXSAAASXMMAS
SMSAMAXMSMMAMMXMAXXASAMMMMSAMMSMMMMXAAMSMXSMSAMXMMSMMMXXSMMASXSAXAAMSSMSMMXMAAAXMXSAAAXAAAMSXMXSMSSXAXXXXXSMMSAAAMXMSMSSMMSXSSXAMMSXSMSASMAM
SAMXSSMMSAMXMASMMSSXMAMXAMMASASMSMAXMSMAMMMAMMMAASAMXXSAMXSXSAASXMXMMXAXMAXMSMMMMAMMSMMSSMMMSMMXMAMMSMSMSMXSAXMMMSAMXASAAAAXSXMXSAMMXASAMMSS
MAMXAXMASMMMAMMAAXMMSAMSSMMAMXMAXMMSMAXXSAMAMAMSSMASAAMMMXMMMMMMMMMXMMSMAXXMXXMXMASAMXXMAASAMXAAMASMAXAAAXMMSSMSXSASXMMSMMSSMAMAMMMAMMMXMAMX
SAMMMXMAMAMMAMSMMSAAMAXMAAMSSSMSMMAAXMASMMSSMMXMAMAMMSMAMSASXSXAAAXMMAXXASMMAXAASXMASMSMSMMASMSXSAXXMMMSMMSAAMXMASMMAMXXXXXXMAMASXMXSXMSMSMM
XAXASXMASAMSAXAAMMMMSMMMMXMAAXAMAMSMSMMAMXAAXXASXMXSXAXAXSAMAMXMSMSASAMSXSASAMSASAMXXAXXMASAMXMAMMSMSAAAAAMMMSAMMMAMAMAMMASMXXSAXAMAMAAMAAMA
SMSMSASASAMSXSMSMXAAXAAXXSAMXMAMSMMAAXXMMMMSMSXSAMXMXMMMXMSMSMAMAMSXMAMAAMMMXXXAMMSSMMMMXMAMXAMAMSAASMSMMMSAXSXSMSSMASASXASASXMMSMMASAMMMMSS
AXAAXAMXSXMSAXMMMMMSSSMSAMAXMMXMAAMSMMXXAAMXAMXMAMASAXASAMXMAXMMAMMXSXMMMMASXSMSMAAXAAASAMMMMMXAMMMMMAAXXXMMXMXSXAXXXMAAMAMXAXSAAASASXXSAAXX
MSMSMXMXSMMMXMAMSASAMXAAASAMXSASMSMMXMSMSMSMSMSSMSASASASASXSMSXSXMXAMMMSXSAMAMAMMMMSSMXXASXMASMMSXMAMMMXSMMSXMASMMMMMMSMMASAMXMMSXMASXAXMXMX
XAXAAXMASAXAMMXAAMMSSMMSMMMMXSASAMXMAMAMMAMAXXMAMSXSXMASMMAAAAXAXSMSXSAAXMASAMAMASMMMSMSMMMMXSAAAASXSMXAAAAXAMASXXAAMAXXMASAXAXMMMMXMMMXMAAX
SSSMSXSAXXMMMSAMMXMAXAXMASXSMMAXXAAMSSSXSAMAMXSXMMAMXMXMXMSMMMSMSMAMAMMSSMXAMSASASASAMXAXAMSASMMMMMMAAMSSMMSAMXSMMMSMASXSMSMSMSMAAAAXAXAXXSA
MAMAMMMAXSAMASXXAAMXXSASMXAAXMAMMSXAAAMASASMMASMMMAMMMMSAMXMAMAXAMAMXMAXAXMAXAXXXSAMXSSMXMSMASASXXAMMMMXAXAAASAMASAAMXMASAMAMXAMMMXMMMMAASMX
MAMAMAMAMXAMASXMSXSMMMASXMSMMXXMMAAMMSMASMMAMAXAASASAASMMMXSAXSSSMSSSMSSSMSAMXMXMMMMXMXXAMAMXMASMSSSXXSXMMXXXMAMAMSSSSMMMAMAMMSSMSAMSSSMMXAX
SXMAXMMASXMMMXMAAAXAAMAMAXXAAAMSXMMSAXMASMSASMSSMSASMSMMXSAXMSMAAAXAMAMAMAXMAAMAAAAMSMSAMMAMXSAXMAXMAMSXSASMSSSMAMAMAAASMXMXSXAAAMASAAAXXMXM
SMSMSASAMAMAMSXXMSMMSSMSSMMSXXAAAAAMXXMXSASXMAXMASXXMMXXSMAXSAMMMMMAMXMAMMMMMSSMSSXSAAXASXSMMMASMMXSMMMXMASAAAMAXMASMXMMAAXAMMMMMSSMMSMASMMM
MAAAAAMMMASASAAMXMAXAAXAMXAXMASXSMMSMSMXMAMAMXMMMMMSXMASMMMMMASMMSMSMMSAMMASAMAXAAMMMXMAMAAMSMMMMMASAXSAMAMMMMSSMSMMXSMXXMMASAXXAXAAMAMAXXAX
MXMSMMMSSXMXXMXAAXXMSSMSSMMSSMXAMMMAAAAMMXMMSMAMMAAXAAXAMASXSMMAMSAAAASAMSAMASXMMSSMASAMMSMMXAXSAMMSAMMAMXSAMXAAAXXSAMSAAMSAXMSMMXMXSASMSSSS
XSXXXXAXMMSSSXSSSSMMXMAMAXMAASMMMMXMSMSAMXMAAXMMSMSSSMSMSASAAXMAMMMMMMSAMMASAMAAXAMXMMMSAMAXSMMSASAMAMSXMAXAMXSMMXXMAMXSSMMMSXAASAXMSXSAAXAA
MAAMAMXXAXAAAAAXMAMMAMMMAXMSMMXMASAMXMAXXAMXMMSAAXXAMAAXMASMMMSSSMSSSMXAMSMMMXSXMMSMSMXMASMMMAASXMMSMMAMMSSMMMXAMAMSSMAMXMASAMXMMASAMXMMMMMM
AMXSMMXSMMMSMMMMMAMXAMAMASXMAAMMASASAMXMSMSSXAMXSSMMMMMMSASASAXAAMAAMASAMXMAMMMASXMAAAASMMXAXSMSMMAMAXMXAAXAAASAMXAAXXXMASXMXSSSSXMXXMMAXASX
SXAAXMAAAAMAAAXAMSSSXSXSSMMSMMSMASAMXMAMXAAXMMMXXMAXAXSXMASXMAMMMMSSMMMXMASASMSAMMMMMSMMSASMMXAXAMAXMMXMMSXXMXSMASMSXMMMMMSMXAAXAXAXMMSAMXSS
MMXMAMSSSMSSSMXSXXAMAAXSAMAXAAXMAMXMASXMMMMXSAAMSSMMMXMAMXMASXMSXAAXAXMASMSASAMXMASXMMAAMMMMSMSMSSMSAMXAAMMSMMMXAXXMASASAAMXMMXMMMXSXAMXMMXX
MSMSMAAXAXMXMMSMMMAMXMXSAMSMMMMMAMXXAMAXXMAASAAXXAXMMASAMASAMAASMMSSMAXASAMXMAMXSAMXSSMMMSAAAAAAAAXSAMXMXSAXAAAMMSMXMMASMXMAXXASXSMAMXMSAMXM
SAAAAMMSMMSAMXAAASAMAXAXXMAMASASMSSMSSMMSMMXSMSXSAMXSASASMSAMMMMAMMAMAMSMMMXSXMMMXSMXASAAMMSSSMSMSMMAMAMMMASMMMMSAAAMSASASMSMMASAMAMSMAMXMSM
SMSMSMAAXAMASXSSMSASXMMSMSMSASXSAAMAMAXAAASAXAAXXMAMMASAMXSAMXAASMXAMASAAAMAMAAASAMXSAMMMSAAAAAXMAXSASASAMXMMAAXSMSMXAAXASAMXMAMAMSXXMASAXAX
XMAXXMMSMMSXMXMAXSXMXXXAXSXMXSXMMMMASXMASAMXMXMMAXSAMXMXMASAMSSSXASXSXSMSMMXSMMSMXSAMXMSAAMMSMMMXAASXSXSXSMMSMMMMXAXAMXMXMAMXMASAMAXXMASXSAS

1379
Inputs/Day5.txt Normal file

File diff suppressed because it is too large Load Diff

130
Inputs/Day6.txt Normal file
View File

@@ -0,0 +1,130 @@
........#...........................#...........#............................................................................#....
...........#..............................................##.#....................##.......#.............##..............#........
...................#..#........#..#..##.................#......##..................#.....#....#.............#...........#...##....
..........#......#..................................................#...................#........#..#.....#.......................
.........#...#......#...................................#............#...#........#.............#..#........................#.....
..##.#...........#......#.....#.#...#..............#.#......#.......#..............#.............#..................#.......#.....
...#.................................####...........#..........#..#.....#........#...........................................#....
..........#......................#............................#....................#..............#......#....#.................#.
...#.................#.........#.........#.#.....#....#.................................................................#.#.......
.......#.......................#...........#..................................#.............#..................#......#.#.........
....................#.#.........#.........#................................#........#.#.........................#..#....#.........
........#.............#....#.....#................................##.....#..................#.....................#...............
..............#...................#..........................................#..........#........................#................
...........#...................................................................................#..........#.........##.#..........
............#....................#...................#.................................#.......#............#.......#.............
..........................................#.....#.............#.#.......................##......#.....#...........................
........................#...#..................#......................................................#.#..#......................
...#.....#.....................#..........................................#................................................#.....#
..##....................................#.....................#.............#.......#.............................................
........#..................#......#................................#.......................................................#......
.........#................#...............................##.#.....................#...........................#...........#.#....
............#.....#..................................#.....#........#................#............................................
.....................................................##..............#.....#.....#.......#........................................
..........#..#..............#..#...#.......................#..........................................#...........................
...............#.............................................................#..#......#.......#..#....................#..........
.#......................#....##.#....................#..#...#............................#............................#....#....#.
...#...................................................................................................................#.......#..
.#....#..............#....................#......................................#.......................#....#..#................
........#.....................#............................................#...............#......................................
....#........#..........................................................................#..............................###.......#
........#..#.....................#..................#..................##..........#..............................................
..........................#...#................#....................................................#..#............#.............
......#..............#................................#.....................#.................................#............#......
...................................................#....................#.................#.....#................................#
..........................#...............#....#........................#.............................................#...........
##..............#..............................#....#.......................#.................................................#...
...........................#.............................................................#.#................#......#........#.##..
........#..................#...#..............#..............................#.....#..........#...................................
..........#......#.##..#.....#.......##.....#......................................................#..................#...........
....#.........#................#............................................#..#...#............#.....#..#........................
#.......#..............#.....................#..........#....#......#......................................#........#.............
.........#..........................................................................#.........#............................#......
..........................#...#.......#...............#..............#.......................#...#................................
.......................................................................#.........................................#...............#
...................#.....#.......................................................#.............................................#..
...##.....................#....#................................#........#...#....#.......##......................................
.................................................................#.......#................................#.........#.............
#..........................#.#........................#............................................#...#.........#................
................#.#........#...................#...............................#.........#............#.........#.................
...#...................................#.....................................................................#..#......#..........
.................................................#..........................................#....#................................
..............##.#...............................................#......................................................##........
...........#..............................................#.....................................##.....#.........#................
#.......................#..........................#......#...................#.#.................................................
..............##..........................#............................................................#................#.........
.......................#...#.........#....................................................................#............#..........
.....#.................##.................................................#...........#..............#....#.................#.....
.........#................................................#....................#.......#.........................##.#.............
...........#............#...#...................#.........#....................................................#..................
....................#.....................................................................#..........#.#..........................
............................##..#.......................#.......#...................#.#..........#..........................#...#.
..................#...........#.......#.............................................................#.............................
...##......................#....##..................................#...............#.#..#........................................
..#..............................##..................................................................#.......#....................
...#.......#..........#.#.................................................##....#...............#...............#..........#.....#
.....................................................##....................#..#..#...........................#....................
...#......................#........#..................#.##..............#..............#....................................#.....
...............#..........................#..........................................................#.#..#..............#........
....................##....................#..#...................................#................................................
...........................#..............#.....................................#.........................##......................
...............#.................................................................#.....................#..........................
......#..........#...#...........#................................................#...#.................................#..#......
..........#............................#.............#.....................#........#............#.........#......................
...........#...........#..........#....#......................................................................#........#.........#
......................#...............##.................................................................................#.....#..
...#................#........#..........#...................#............^...........#.................#.#......##.#.............#
.......................##..............#......#.....................................#.....#.........................#.#.#.........
.................#..#..........................................#...................#...#.........#................................
..#.#.....#.............................................................#.#.......................................................
..............................#...............###...............#..........##..........................#...#..#..........##.......
.................................#.....#.........#......................................................#................#........
...............##.#..................................................#........................#...................#.........#..##.
.........#.................................#......#...............................................................................
..................#......................#.#.........................................................#.....#......................
.#..................#.............................#...............................................................................
...................#...................#.#........#......#...........................#......................#..........#..........
.............#...................................................................................................#................
..........................#................................................#........#..#..........................................
.#........................................................#.......#......#..#.....................................................
..................##..............#.............#................#...............................#......#......#........#....#.#..
#.............#....................................#.....................................................#........................
............................#................................................................#....#.....#................#........
.........#.......................................................................................................................#
..#.........................................................................................#........#.#...........#..............
...........#......................#.......#................................#...#.......#...............#..........................
.......................#...#..#.......#..................#........#.....#.........#...............................................
..#..##...................#..........#................................................#.........#...................#.............
........................##..........................#.......#..........................#...#.#....................................
..........................................................................................#.............#...........#............#
..............................#.............................................................................................#.#..#
.............#..........#...........................#.........................#........#.....................#............#......#
....................................#..........................................................................................#..
.........#.................................#...........................................................................#..........
.#..............................#......#......#.#................................#.................#......#....#..#..#...........#
.#...#................#.......#............#.........#...#..........#......#.........................#....................#.......
..............#........................#................................................................................#.........
.........#........#..#.........#........#......#..#..............................................#................#...............
...........#......................#.......#..................................#....#...#......#..........#.........................
...........#........................................................#.#...........#................#..............................
.#...........................#...................#...#..................................................................#........#
....................................................................#...................#.....#......#...........................#
...#..#..............#......................#......#..#...............#..............#..............#..............#..............
...........#........................#............#.#...........#..................................................................
............#........................#.................................................#..............#.#....................#....
............................#...........................#............................#........#..........................#........
#................................................................#...........................#.............#.#........#.#.......#.
............#..........#..............#.......#...#................................#.........#.#................#........#....#...
...#.....................#..........#.............#....................................................#.#........................
...............#..................................................#......................#...............#........................
......#............................#..................#.....#...........................................................#...#.#...
#................#..........................................................................................#..........#.......#..
.................................................................#..............#...................#...................#.#.......
...............#..............................................#.................#...............#...........................#.....
.............................#...#........................#....................#........#.....................................#.##
...............##..#.....#..#....#.#...#...........................................#.#........#........#.......#..................
.......#........................#....#..#............................................................#.......#....................
........#....................#........#....#.................#........................#.............#.............................
#...#...........#......................................................#...............#...........#..#..#....#................#..
................................#........................................................#...#..#......#....#.....#....#...#......
..#..............#............................#........#....#......#.................................................#............

850
Inputs/Day7.txt Normal file
View File

@@ -0,0 +1,850 @@
453693978: 7 219 8 44 2 9 3 2 6 4 1 6
61192589: 81 8 83 9 879 6 4 2 6 7 9
6066: 65 29 87 9 14 5 21 3
1957116: 171 37 224 6 42
198050: 342 577 3 2 711
41665119255: 7 7 8 124 371 3 6 2 51 5
3166026: 5 33 9 66 6
1662321: 5 4 7 622 17 6 1 52 43 2
265653132: 630 1 4 9 22 8 498 8 5 7
1060: 88 9 55 4 39 73
157494755: 3 1 4 98 951 5
1952833595452: 7 234 5 550 3 483 3 82
467: 2 71 5 251 5 64
7316189440: 6 2 6 443 1 512 7 4 8 8 7
33138: 4 8 8 8 7 1 49 99 2 6 5 1
913284: 2 89 585 39 270 2 1 3 6
1215195700: 81 4 79 913 52 4
298632108: 6 6 3 6 15 73 210 5
318936618: 150 160 832 403 693
2102812: 3 323 434 5 82
3848880609: 716 5 82 59 651
4940008: 658 1 935 55 31
311641: 23 9 1 6 8 7 6 7 3 5 1 586
722421: 81 9 30 3 8
33606277360: 672 5 6 277 36 1
13106566: 2 73 2 1 24 38 63 66
54290459591: 4 9 7 1 554 6 7 2 62 859
4886125: 1 56 5 829 2 7 5 1 1 4 9 2
274540788: 6 3 715 6 3 68 51 3 3 2 3
34447941395840: 3 1 852 309 9 70 2 4 7 5
4575402861600: 15 153 1 35 5 6 68 740
13778598989: 459 3 85 989 89
105779: 3 6 584 993 7
146019901569: 1 460 1 98 94 1 5 6 9 69
1993182: 51 58 924 451 460
6265483638730: 9 93 62 2 98 7 570 89
196996630250: 7 2 76 3 3 1 3 8 57 56 3 4
3944294: 2 21 4 7 4 996 1 5 7 3
1427032798: 13 9 65 228 823 178 1
480: 7 4 5 30
356848870313: 574 635 862 9 69 8
4991679: 9 6 6 59 9 79 1 1 29 81 2
96014924: 2 899 48 230 3 10 34
530314220: 68 99 15 786 18
27235017: 353 75 890 751
28227685247: 1 8 889 21 8 8 5 6 3 7 8
23386943686: 7 5 3 54 2 9 12 7 5 5 3 49
4671109: 7 7 85 18 6
65643: 8 55 6 9 449 1 6 3
28442705797959: 9 2 8 7 507 6 579 795 9
604412418874: 85 90 73 6 79 8 8 62 8 6
142652179: 24 680 578 6 82 82 7 9
318206557831966: 3 24 7 98 55 7 83 1 966
940: 1 33 4 93 6 9 2 2 79 1 67
5659883: 5 285 2 661 9 5 6 310 7
462378: 66 6 319 910 244
16578901: 69 8 624 6 3 1
58541640192: 4 9 4 7 92 907 8 6 9 1 8
7340642493: 67 5 39 72 39 8 7 95
452912147: 461 214 982
48011225806: 4 80 112 25 556 249
994133176: 5 7 9 7 3 5 696 3 31 68 5
1671942: 6 5 943 3 41 4 59
2011: 854 1 663 74 419
2350244: 39 17 3 2 2 2
599522955: 1 6 3 192 1 733 89 298
150499563: 3 660 5 348 118
1974967: 405 9 758 5 82
1526491271: 309 9 717 22 817 4 6
291350: 32 91 81 72 1
2331564579753: 4 208 7 8 5 6 542 4 7 7 6
9094800: 3 50 44 53 26
8558953: 3 82 5 89 50
5818: 578 3 8
101507885: 3 65 33 89 9 10 5 77 5
234179567: 8 3 993 765 301 62
13394703: 4 615 99 55 3
12726838: 50 6 7 8 3 4 2 936 83 2 9
159408: 4 908 174 1 720
257838: 444 5 58 28
134142820: 6 8 99 1 9 7 28 3 4 3 4 7
99344148: 2 1 788 29 5 9 6 544 7 9
2522113308: 5 331 6 9 1 6 3 4 39 99 2
140321: 4 3 5 4 31 9
20942125931928: 68 562 429 219 8 89
253357107: 361 41 7 341 2 19 7 58
2576029514834: 5 1 3 605 83 1 4 834
3812481: 8 507 2 74 1
38667377388: 3 5 77 23 47 73 32 6 47
154599952490: 3 2 3 671 64 6 87 8 3 1
6771960: 3 9 66 3 3 337 6 90 3 1 8
43692: 90 7 45 4 2
318124: 1 8 497 80 44
172874771: 2 8 9 1 3 9 7 63 2 7 63 8
4129352: 502 4 4 8 511 4 2 469 1
30132480: 4 148 672 59 5
390439859: 29 8 6 4 6 9 81 9 9 27 2 7
65515806624: 5 663 155 373 639 98
5014677: 2 758 9 202 633
1490: 81 7 16 78 3
23528003: 4 9 8 6 6 7 5 7 83 13 5 1
7929094: 23 407 7 2 121 85
276945: 37 5 91 94 5
561691819: 1 6 7 682 5 5 7 9 86 17
12070408538: 9 163 43 3 5 1 1 8 7 5 38
14816: 4 37 3 6 54 16 544
9301982: 903 906 6 857 18 89
236: 7 8 131 90
924816: 14 66 8 16
94248002483: 6 8 22 816 165 247 8 3
775651572420: 98 383 3 6 3 73 210 2
31344: 4 4 8 5 821 6 8 59 4 388
30930: 6 15 50 119 62
154217932: 22 13 1 719 67 6 8 498
23474981: 3 65 250 41 18 65 81
178893876: 3 7 7 8 96 9 33 33 4 7 2 6
618737127839: 39 61 312 801 195
4517: 6 3 1 1 5 236 925 52
1014255: 7 727 51 99 9 3 1 856 7
1588: 87 7 32 9 671
112938355813: 21 9 573 9 5 580 4 3 5
12794721648: 3 99 764 6 65 2 8 8 2 48
784111270947: 4 542 47 29 35 9 970
133997465978: 4 69 2 4 4 31 3 2 1 5 97 5
16625917453: 222 5 591 66 8 6 2 4 13
145: 70 69 4
1756138126: 20 15 121 1 5 7 81 126
928811: 7 190 65 680 986
21408695: 2 9 5 690 8 6 1 3 47 2 2 5
368451: 66 302 4 4 8
27863124: 3 19 5 1 995 89 216 7 4
957338381: 354 2 3 9 6 3 823 7 8 1 1
44521661: 48 680 341 4 1 76 625
10437926: 148 585 4 89 10 2 3 2
88019880: 3 312 7 30 884
791624: 8 79 5 8 9
89138231364: 274 609 3 533 609
4293432: 3 6 4 5 9 5 8 9 528 72 39
6358683: 4 1 6 21 5 8 31 37 4
3764592: 51 1 324 4 591
19530679599: 882 5 415 5 2 26 53 3 6
87417: 3 280 24 19 99
533489: 4 9 37 4 1 5 90
5011: 3 6 5 22 490
73338720: 293 93 52 23 91 80
126: 9 1 1 1 13 1 93 9
3615788: 90 4 1 57 85
147888: 4 79 17 485 78
193516984: 487 87 2 76 6 65 8 68
2589283728: 2 58 9 2 19 5 46 9 4 730
64553362: 645 533 60
22331998272: 2 642 77 7 845 4 23 2
8657594: 778 86 6 6 5 5 9 4
5562082: 2 88 21 180 82
44600739: 88 9 78 223 3 25 2 89
1175: 8 2 6 68 87
77262: 97 784 353 4 857
1958152581: 847 682 3 1 231
89632318: 9 7 56 145 172 6 20
29470: 459 49 58 4 5
5458120200000: 4 6 815 6 65 36 90 530
683299: 7 276 8 5 59 44 419
7405744: 25 715 574 2 1
15815402: 3 546 7 1 7 8 7 4 5 4 9 9
4153776591: 13 577 8 2 88 320 271
5994590716: 99 787 8 926 1 73
1905139223188: 945 8 6 457 6 95 42
154417: 193 8 17
168145522524: 957 766 7 66 38 96 7
4795006: 2 21 5 204 9 59 47
7043070062: 6 8 1 6 85 8 33 7 4 2 9 2
62697036236: 28 3 70 82 722 3 236
12178755: 8 8 77 4 3 558 5 3 81 5
32779766156: 693 473 93 773 156
115249713: 90 243 4 29 2 596
68054: 73 4 951 2 1 4 52 2 1 9
802077409221: 92 7 3 17 848 2 2 3 1 5 3
142074998208: 640 71 85 7 8 44 719
8632: 5 9 7 58 4
2624715: 4 1 5 8 619 8 1 1 4 3 4 8
4759740: 937 8 357 79 9 60
4635323000: 9 8 284 8 368 2 7 79 77
248375402756: 2 34 2 32 3 910 68 9 4
125065077: 8 41 531 78 6 35 79 4 7
182358: 4 182 3 855 30 8 1 2
3812369: 77 29 2 2 493
1609831: 218 737 251 7 654
2024734: 756 4 8 37 9 94
552808080: 8 72 93 12 626 22 5
52118327: 2 161 674 6 790 4 9
160697381: 2 89 8 7 39 16 10 2 6 53
275832: 26 8 34 39 24
144618480: 398 5 757 8 3 8 11 3 3 4
2550199: 6 8 7 8 41 137 79
212959799662: 2 660 8 15 979 9 661
173540566353: 22 8 3 9 180 6 2 1 8 7 51
4867527232: 4 46 54 108 9 7 9 6 4 8 2
30630: 6 36 258 6 30
912202863: 5 86 2 15 1 5 286 1
400914580: 371 29 914 5 80
43596216103: 768 89 2 2 2 3 7 9 9 5 9
8946096736: 4 2 710 32 23 3 4 5
15609768411359: 9 707 567 4 4 8 67 60
4122784380: 280 748 89 165
10977874: 68 6 1 16 3 7 2 81 91
2908919: 99 976 2 315 30 1 689
29609: 1 4 19 17 3 86 681 28 4
245700: 12 1 351 5 3 45
367: 1 3 3 55 37
62951499517: 9 32 5 73 8 364 520
734005: 73 39 74 24 6
124853195948528: 88 69 9 482 698 6 79 9
3636750240572: 5 6 5 9 5 5 210 6 6 4 5 74
112035399: 651 10 169 326 3 99
84854: 9 4 8 831 89 3
233936125149: 9 6 811 648 97 261 44
5809: 5 5 7 17 5 62 2
87092610443: 9 9 84 1 8 78 4 14 4 4 3 1
15382371424083: 9 6 3 8 919 69 92 95 85
117071: 291 4 1 57 1 2 90
487732407: 6 4 63 10 8 973 4 406 1
1157798799: 5 82 8 78 383 798 799
11910216899: 5 69 842 1 7 13 6 8 6 3 9
906: 4 5 6 87 803
7607716138743: 73 89 98 986 911 486
8026454: 2 91 49 28 9
987004: 1 8 2 274 5 8 26 474 44
402628876: 5 7 82 2 409 833 77 76
30661956: 8 6 491 5 81 9 20 9 3 13
33657773: 4 7 13 803 39 770
23941915: 73 49 5 4 3 98 5 12
19880498446: 763 46 620 1 7 2 2 3
1382284: 91 83 9 7 79 24
20366858: 45 1 5 731 84 102 4 5 6
93755256: 30 71 7 1 44 5 7
164884487835: 850 4 722 4 4 487 835
1341603775: 52 860 1 3 775
1072: 16 225 1 88 742
7246685: 74 704 4 97 9
1427830680364: 48 392 9 5 2 590 358 6
47410058: 39 84 17 2 4 5 7
428546912: 2 9 3 971 6 4 6 7 3 3 5 12
9674801499: 276 42 29 4 875
33994953: 679 868 31 5 3
10034366578321: 4 3 6 27 6 80 7 753 23
21580: 8 37 695 90 26
2831604330: 7 831 8 39 3 9 3 6 5 56
103563266: 6 9 7 7 5 6 2 4 1 98 64 8
34404349: 1 772 7 1 40 9 8 9 7 4 4 7
59764: 1 66 90 1 32 34 569 67
3837946112: 4 1 7 9 320 9 7 884 308
392845: 490 4 80 59 467
2237: 354 6 6 93 3 2 11
530442: 22 1 6 4 41
667875343107: 1 9 540 5 5 76 3 28 2 1 7
27334270016: 77 6 74 857 80 68 1 7
9133: 64 4 493 8 34
1093: 1 6 63 471 184
2345410: 2 3 45 407 3
698287110552: 775 867 7 5 672 9 2 70
18068437: 4 104 61 20 956 37
368540: 2 606 3 43 6 41
864: 9 6 9
1418: 75 9 1 16 74
30118881: 6 5 1 4 4 9 992 1 3 88 5 1
311278809: 432 33 2 4 9 4 1 9 3 4 3
46589936700: 88 21 8 9 58 5 7 75 4
8569194: 4 15 54 8 3 58 7 2 3
481417: 937 5 73 8 1 7
2397863: 6 80 45 286 8 2 8 23
24256960: 5 28 442 4 98
22569840: 94 68 6 36 645
42699365540: 6 70 4 37 656 6 554 10
38737384769: 8 5 392 5 2 863 7 8 94
2389502926: 95 2 805 6 2 60 24 52 7
5752: 86 9 3 579 82 4
63029652680: 1 7 3 3 50 701 5 7 6 683
3090035: 3 7 5 618 35
1373: 28 1 4 6 247
2919: 7 6 3 9 34 385
67269: 9 4 5 6 6 5 9 680 7 157 5
6172980: 6 1 944 59 9 2 55
161860638588: 3 56 58 473 38 5 89
664801: 1 3 8 9 490 979 60
3317827: 8 42 394 1 348
187757: 872 5 43 220 57
12552562: 5 25 525 62
29106: 4 4 6 10 9 5 2 4 12 4 62 7
202769: 18 2 25 2 65 4
481787: 489 31 82 23 8
243818: 72 72 815 43 9 9 3 9 3 8
255915710: 365 584 9 8 4 7 6 18
649896756: 40 922 81 675 6
90209784: 86 4 8 4 8 2 9 41 7 553 4
1938043461875: 585 2 316 1 60 6 6 46
344395030560: 68 321 1 8 570 346
68445524: 58 9 95 45 5 24
101817063790: 29 7 5 5 1 74 9 1 2 758 5
8208761: 5 5 5 5 8 5 6 617 69 7 1
120768: 98 9 6 8 17
3116048: 3 3 11 4 1 7 1 7 8 6 253 6
2514187687609: 251 41 876 87 607 2
816971: 99 6 3 82 3
1132216: 92 246 837 148 4
22172: 7 6 3 37 633 31 7
2749313: 6 218 82 3 1 112 7
4280: 385 42 2 5 5
2653814829: 9 3 9 176 3 37 7 19 54
2862201: 9 7 5 80 67 6 133 3 4 4 9
3370: 5 3 21 85 560 5
33510727: 5 336 55 7 745 4 8 3 5 2
8542478027: 7 9 6 423 8 1 96 973 54
625114645518: 598 7 791 132 1 51 7
94520255: 14 36 8 9 30 8 7 603 5 3
269825453: 8 5 54 424 5 94 333
8990: 54 35 90
1939417840: 58 41 62 83 40
25841539: 82 340 8 764 8
5583873650: 5 3 508 2 6 4 3 1 3 4 9 48
2487933: 8 69 8 5 3 11 1 3
1270416845906: 973 680 98 91 1 211
46166671264: 4 54 5 8 601 4 83 871
115632308: 472 81 410 51 8
206282: 293 1 6 9 7
21933071: 57 5 579 1 846 35 775
1729624: 4 27 1 1 1 328 9 5 4 6 5 6
75757: 941 8 2 60 412
1352210: 1 598 3 777 83 7 6 8 1 2
347983: 5 8 4 832 9 2 53 4
53321843: 8 9 1 555 117 69 5 7 40
509941350: 8 160 89 2 5 73 4 510
16749548152: 933 6 735 9 548 152 2
182715414753: 653 6 6 453 7 658 7 53
22751389220402: 34 82 726 135 6 90 2
7477875: 53 6 73 255 75
17145951: 557 66 95 16 465 6
29997394: 688 436 5 93 1
830276218: 88 468 801 8 93 99 21
413822746: 4 902 530 227 46
8475989: 61 731 55 523 5 3 751
213173385: 7 419 5 82 91 143 244
8476: 315 34 6 16 9 1 4
215132022208: 651 865 7 571 33 382
1737558: 5 8 9 328 1 3 4 42 2 6 3 9
7212898: 98 8 92 74 27
3376916: 422 8 323 579 9 7
21912156: 22 6 166 15 7 2
2424528990: 7 4 84 7 410 39
399686: 7 4 27 2 84
479369: 51 9 87 6 6 2 34 1 68
5366794: 3 264 201 94 2
24942: 917 2 938 9 9 3 4 766 7
45408317: 82 66 264 8 318
955693: 41 3 911 6 93
1763: 11 7 8 32 5 2
7137940: 7 8 86 68 6 46 50 123 4
375924: 644 6 5 97 631
51789: 970 83 5 409 9 1 724
4633540: 927 4 891 1 336 8 3 5 5
3827074: 2 4 7 5 3 3 9 6 234 8 53 3
174783: 8 76 5 59 7 525 798
18220965653: 3 5 796 308 2 6 6 929
450081: 923 64 456 1 8
1580629050: 6 907 7 60 4 7 8 975 7 6
53908033: 71 857 9 97 8 90 883
200570582525: 8 532 2 2 6 6 770 3 34 8
2049329780118: 75 90 11 9 2 667 3 10 9
335240782: 85 493 8 78 5
515973: 2 7 3 30 63
491045376: 520 8 93 5 378
52900144900: 730 2 89 93 37 22
411113430: 485 53 6 4 9 1 5 909 7
428079459263: 850 1 6 5 7 945 8 9 3 6 3
10267334400: 2 8 1 1 29 879 4 6 911 8
1148385886: 4 2 5 3 9 8 8 49 4 3 91 8
5042966021: 6 59 634 1 4 8 955 6 2 9
153826991: 64 742 8 3 99
84651: 1 84 54 6 5 1
38009515: 36 7 791 6 328 743 6
10646: 5 20 4 361 98 82
58142385: 3 6 4 8 6 4 1 4 1 8 7 63
11447010: 899 6 590 85 82 32 90
148080024328: 16 411 9 662 417 1 6
415528025: 1 29 2 8 3 7 7 117 7 178
940546890: 3 62 7 237 68 183 31 3
9075990043624: 8 9 28 76 525 41 2 626
424464: 424 459 5
8532951: 73 18 762 29 51
9591544: 83 491 557 30 4
34543862: 6 864 32 5 1 9 1 537 6 2
335: 23 11 82
30000: 5 561 53
228530406544: 5 2 952 2 1 4 60 65 4 7
117821: 34 38 9 9 4 730
294451: 985 78 277
67315140: 54 2 1 4 6 963 188 4 2
767382521: 1 5 3 186 1 5 385 6 4 1 8
72: 5 1 2 9
4199365273188: 5 307 59 92 758 86
36909183: 9 205 3 5 3 6 91 6 6 3 7 3
4228426: 86 9 2 3 79 44 3 351 6
3101601: 5 1 31 88 1 5 6 594 5 2
14125920447: 5 92 1 8 3 3 397 7 771
74256718132: 9 9 44 403 5 8 939 423
14732109: 8 501 4 408 9 3 42
881310249: 979 9 2 10 251 1
126469: 9 45 4 715 98 471
674696887: 2 4 842 4 55 7 88 26 5 2
1665232268: 1 6 65 2 3 138 8 6 802
2499735: 51 574 42 56 5 2 95
134637242: 138 8 97 503 739
18438: 15 82 960 391 53 7
121068: 158 1 3 76
139306754996: 5 4 62 6 25 283 4 9 1 9 6
12209400: 8 2 3 9 48 918 95 2
6913282747: 864 5 7 1 5 8 52 9 6 4 6 7
18079451: 451 8 9 8 9 4 316 7 7
358746938735: 7 751 8 51 6 29 6 8 2 6 2
354669920028: 510 3 31 715 84 972
38034: 607 48 58 1 44
349019647: 2 2 974 479 2 8 64 32
15031: 6 74 619 5 5 21 8 64 70
31157828: 519 2 587 4 68 3
121029120588: 29 1 4 824 4 85 5 7 8 9 9
5203105: 518 2 30 65 38
1787278: 102 584 5 6 235
1818: 51 327 53 2 956
23589640: 24 54 2 91 9 5 5 5 38 2
11185866008155: 3 54 5 984 659 3 81 5 4
5159414: 12 8 8 1 258 37 26
943: 27 4 6 8 5 26
1507815: 218 56 55 3 68 10 5
781435: 2 6 3 1 436
404002479853: 4 8 5 6 6 9 921 8 6 1 1 74
117808: 7 3 1 90 119
13344: 76 61 1 1 96
29321: 291 1 40 69 9
8616607: 2 78 583 60 86 524
7794317578: 9 2 3 9 9 5 8 43 4 6 35
2845227: 2 2 845 809 78 22 9 90
415532023: 9 50 35 9 3 41 7 8 75 1
24380364: 405 3 3 7 394 6
5561933: 2 64 71 612 77
43868704: 69 4 3 3 27 538 3 4 88 8
2030282568: 6 2 7 5 9 43 5 7 7 680 24
27749412203: 360 5 76 9 408 3 1 201
27842: 64 7 5 60 662
767760: 457 20 4 7 3
58361: 88 829 4 500 7 2 9
817389: 28 193 15 1 2 36 95 9
696008: 26 73 83 239 2 5 8
1586875: 9 90 30 110 65 225
22312441922: 8 3 4 60 2 488 3 75 5 45
153426394832: 27 4 311 1 4 7 2 4 4 7 3 2
205905: 25 9 795
55771301: 94 593 6 23 301
76140038424: 47 2 300 5 9 62 5 6 92 4
19026558: 2 27 9 9 639 2 3 4 5 4 12
10591093: 7 3 6 5 5 1 82 6 7 4 65 4
34476157: 8 38 67 38 86 156
236957826051: 383 42 690 3 618
41953947120: 6 962 46 6 57 8 95
91726: 9 364 4 7
103501474: 5 906 6 136 28 25 8
2306986833: 233 33 95 610 3
5183417876687: 4 89 106 178 766 85
1613979: 1 160 3 9 80
6211199231: 97 252 8 63 21 192
1075782: 2 8 30 1 78 20 452 22
97694735: 3 2 370 47 96 72 5 7 7 5
137890590151: 1 3 9 7 67 7 6 489 6 80 9
2910853: 3 2 292 60 5 178 9 10 9
231046: 19 16 660 5 43
3745: 89 2 5 4 2 5
1244: 7 438 68 9 6 223 493
1590: 55 908 46 581 1
9887612034: 318 619 910 5 1 203 4
648753846: 700 57 89 856 6
69616: 1 69 6 41 102 4 7 304
726504624: 72 6 504 607 14
7366176: 9 9 1 7 938 7 8 8 43 7 5
961848: 957 9 39 51
1207774165: 6 6 3 93 5 3 83 7 416 1 4
2179548541632: 21 7 426 173 56 264
2520: 21 19 3 21 1
1360262: 90 7 2 182 80 48 7 90
1927043167: 29 662 72 43 167
10689713431: 9 6 4 83 6 57 4 83 923 7
946187: 1 38 24 10 185
8362219: 96 26 19 867 4
264: 13 2 4
2784905: 5 8 5 44 388 552 905
78379479: 38 5 9 3 2 456 7 6 2 8 79
76: 4 6 3 60 5
10715175424869: 855 4 225 17 66 84 71
1509802788: 2 7 6 4 9 64 70 7 7 83 4
132789652: 9 154 89 44 9 5 2
17956425: 46 399 387 5 8
660210: 4 2 1 3 22 22 631 961
192932438388: 304 366 382 3 578
239253759: 4 8 136 13 4 5 8 757
732994: 739 16 97 64 7
26087: 4 62 72 814 401
160480426: 89 15 579 18 1
379310: 35 31 30 4 34 74
207366390: 5 898 893 46 268 385
15765: 1 7 563 4
2266789870: 4 341 73 557 997 9 3 6
96665484: 2 964 43 13 9 484
365768: 79 3 7 121 768
142963608282: 2 6 9 5 7 8 22 380 8 2 83
2498: 2 850 2 729 37 30
11935499: 3 6 323 852 5 4 54 43
71923: 222 576 3 9 77
3431484: 240 3 68 21
100190754049: 555 31 52 42 41 992
5751501: 5 7 51 223 275
122835227404: 89 1 373 37 63 27 404
4837305: 432 8 95 3 454 5 9 829
3649109600: 4 7 2 21 9 3 365 20 152
655120053: 27 478 2 84 5 129 2
3576368741749: 946 7 8 1 6 3 9 4 175 1 1
2893325: 78 22 2 42 177 40 5
1924937835: 20 3 2 5 4 307 9 5 66 5 4
643751: 650 99 24 7 4
45: 3 3 26 9 3
660: 2 4 87 559 8
2539: 4 403 892 35 1
3674: 362 8 46
1162251792: 62 6 5 7 36 39 474 542
2368091154: 3 2 8 575 13 858
66120: 64 4 5 8 10 19
7486826365: 4 5 4 7 31 205 3 4 3 7 2 7
386307741: 9 1 70 7 1 63 675 4 7 9 6
10230561458: 8 9 14 10 69 5 8 9 7 821
154794180: 85 6 226 79 17
159148110: 81 246 4 235 93 22
984556511: 62 9 27 1 97 4 18 978
23606766469: 389 4 446 5 5 25 3 42 4
5939892044: 54 700 81 2 970 3 41
32603669: 649 9 21 5 3 200 2 470
980: 58 7 512 60 4
140631198724: 2 5 7 4 92 39 217 8 724
122630144587: 4 41 1 589 3 28 94 590
28426054754: 61 237 9 10 699 951 3
26993694: 9 260 1 8 36 94
5508: 56 4 83 37 491
2566794: 47 946 3 1 83 838
730292037: 9 5 3 89 783 725 5 4 37
7719: 4 61 95 388 738
1371461493: 150 71 91 4 79 2 9
305217: 8 54 1 66 26 91 3
33935249: 5 75 1 9 2 6 95 3 459 1 4
16749: 8 7 937 712 98
151413850: 1 6 650 7 3 13 4 745 5 1
8008143: 773 5 3 7 5 69
121022047: 3 2 6 3 3 702 4 3 4 3 60 6
3488486358: 329 31 654 1 523
184688494: 1 1 3 1 6 89 2 127 4 2 9 5
1711196664021: 63 980 41 26 328 5 22
6581064: 76 10 5 24 86
137584: 5 10 98 4 7 384
3890756: 1 29 363 1 99 57
24153773792: 8 69 616 19 752 2 8 3 6
16858296: 6 738 83 39 7
12071831817: 9 5 9 2 5 210 5 7 5 384 7
1675: 96 335 312 8 2 173
713182: 701 5 7 18 2
1462: 2 2 7 1 30 6 7 9 2 8 2 993
4012: 434 9 66 6 1 5 1 3 8 4 5 7
2509636115739: 883 3 449 211 573 8
441509: 734 2 9 282 251
1587801154: 494 29 6 3 801 1 52 1
423094: 6 389 3 89 27 31 251 4
1757133170: 872 31 764 54 65
247757499: 147 3 8 3 4 4 9 88 42 1 1
1727313: 65 11 28 5 2 809 98
70450601: 99 3 4 89 20 372 5 55 2
4541108057: 805 161 564 1 8
24042847: 9 5 9 3 243 4 7 9 2 9 83 6
2108110977: 398 1 23 93 1 999 23
5610241: 6 935 2 39
72098: 1 60 19 9 99
1197518856112: 9 9 8 84 8 3 76 6 10 1 4
158774: 7 3 97 37 3 711 62
11060285775: 8 1 4 836 3 7 10 7 7 25 3
8140: 27 96 1 3 3 2 95 7 3 727
10121438: 1 436 9 92 70
860403: 710 4 3 6 302 5
927083: 542 74 7 5 43
16882215034: 57 894 9 5 5 9 1 4 9 6 3 1
63578: 7 2 1 563 77
4088249760043: 32 12 234 760 70 20 2
31374736: 6 5 364 6 2 8 1
4399214: 936 47 13
23925060150: 53 16 68 60 2 75
2543: 6 547 3 5 871 8
122579998: 3 78 11 7 748
291594: 444 470 57 97 3
2409360: 343 3 3 3 9 824 7 4 5
1238038362: 5 5 509 92 5 36 9 7 97
525001557: 8 4 1 7 7 140 3 5 1 434 3
390649328: 477 8 1 90 44 5 328
17363355: 77 26 6 289 3 7 806
19956: 97 24 2 20 486
91153855713: 2 3 1 3 6 6 7 7 989 7 34 3
5739997: 951 603 4 418 59 65 4
626980232: 6 202 67 80 18 5 2
4747733: 47 321 8 147 95 38
107928: 5 9 3 170 2 6 4 61 508 4
23558102: 7 2 16 4 7 5 6 6 5 9 1 99
3185485154: 88 48 4 6 6 1 2 593 6 55
23136: 238 3 96 1
638: 1 4 6 487 5
1708208892: 2 9 45 187 58 43 1 2
14968528167: 8 579 51 5 28 167
9945460932: 6 9 5 6 8 5 916 360 4 33
5557436: 4 1 3 63 44 7 73 1 2 1 6 9
862: 674 190 1
250758036025: 3 330 120 753 27
3525594141: 71 8 8 6 1 1 2 8 9 49 44
7239: 721 2 9 1
9508: 479 638 2 36 4 421 7
103: 3 1 1 5 98
390780: 49 452 4 195 1
363428: 790 17 41 116 377
155757666973: 7 2 2 8 8 44 9 6 66 9 7 5
7060895263377: 38 393 7 47 43 559 7
691906033: 3 6 48 49 33 6 247 7 8
34158764: 853 835 4 536 4
80088635: 23 201 42 96 2 1 3 5
13013: 18 7 77 3 332
50774459: 837 8 35 80 5 2 91 6 2
327169: 390 7 824 33 8
376192: 43 970 80 9 79 3
730012804: 78 709 2 165 8 1
4787861: 477 823 956 7 1
2115126258: 787 5 79 756 9 789 9
10684275841: 9 98 3 1 4 79 6 7 48 40 9
8744258566: 152 1 94 34 6 82 3 4 1 3
57560529: 5 49 985 234 40
91086832317: 3 7 91 8 68 318 4 6 5 4 1
10313078819: 515 650 2 7 875 6 6
134021197048: 40 67 423 94 5 45
3004143: 6 9 8 43 5 269 3
29492: 6 649 28 696 4
2597274: 6 4 395 9 9 626
68091255: 6 714 82 12 5 5 3 9 86 5
2845: 7 4 44 1
104652062010: 95 153 72 620 10
1170739907: 282 106 415 2 5
1267124: 2 239 86 545
73548167869: 5 8 41 3 762 2 7 742 4 8
97610: 536 45 168
30385962006: 5 45 2 157 5 4 6 9 5 5 5 6
34136389: 1 453 7 836 9
2859663: 6 641 303 7 83 4 4 9 3
831006074: 220 4 26 58 65 54
5595: 3 78 66 3 246
19003371840: 39 10 44 2 9 5 895 192
1551347724: 2 5 950 622 9 3 3 1 1 3 6
13541596: 728 186 7 93 2
649502: 76 4 3 468 4 6 24 9 2 1
19761: 9 12 941
795078: 107 4 894 2 9 6 9 6 2 6
837304819: 6 834 6 4 83 4 5 3 4 3 4
5986344: 2 36 8 25 8 2 9 7 6 8 78
88505841: 436 3 5 9 7 2 9 816 8 41
24532: 82 32 8 94 9
467483: 9 13 512 25 2
6636537605: 3 53 1 8 1 56 5 40 4 33 5
8150: 56 25 53
689417616: 2 334 21 41 7 616
639347: 63 90 3 38 9
3941: 16 7 16 4 3
55039: 417 64 8 7 54 39
46002735: 89 813 51 718 17
456590: 43 6 1 34 47 37 587 7 8
1991724104: 18 3 2 1 4 1 136 4 1 10 4
59472469157: 3 33 12 6 469 157
714290736: 868 1 991 1 8 9 9 7 7 8 6
3612781652: 2 7 3 3 73 274 427 410
15855368368: 3 321 62 77 914 368
1785304: 1 3 4 9 7 3 9 339 56 6 3 8
248248: 1 409 22 33 8
85008: 73 2 408 8 22
275270328357: 9 6 8 9 9 2 6 930 54 6 34
5663910: 79 34 7 500 671
11127: 79 967 3 4 630
179132250: 9 5 3 3 69 909 2 7 8 962
4158095: 7 9 35 58 93 8 62 499
3554470140: 6 5 2 73 324 99 4 3 23
24449671: 8 7 5 8 83 29 4 2 1 4 70 1
13718997648: 507 762 349 27 650
1149: 3 51 11 406 149
364809367069: 4 2 5 95 4 3 9 4 117 7 6 7
78161431493: 76 2 161 35 3 2 49 495
149614581: 149 60 78 1 66 84
147777: 829 5 602 20 31
767044338: 451 3 9 345 9 632 6 79
36147907: 3 6 14 76 72 238
3552: 8 8 5 1 32 960 1
127596066: 3 7 20 343 66
525466393: 3 93 4 82 45 8 6 66 394
67036412837: 6 6 9 321 543 161 645
49566812: 486 9 620 47 6 5 49 1
36941: 2 4 614 8 92
232740: 7 13 69 7 2 4 56 8 4 6 36
103981615845: 259 984 9 8 51 6 38 6 1
192070: 305 15 2 22 3 1 3
668719800: 41 7 906 13 3 2 611 5 8
93386: 2 25 79 881
4979436: 65 5 9 415 714
1514021: 16 43 1 1 2 858 365
6538594: 90 8 9 2 7 4 9 54 6 9 11 4
23056640: 9 70 2 74 493 5 8 1
1530672212: 1 78 4 2 3 6 663 9 1 4 7 2
4062698: 577 89 61 90 3 8
28841858187: 331 51 87 48 8 18 7
267849863: 666 3 62 464 4 5
50616209: 7 1 6 666 209
51813: 5 17 6 9 44
43065: 69 12 6 96 74
1265168131485: 8 6 8 4 41 9 95 5 8 8 9 9
277830795: 1 371 7 735 795
670242195: 1 69 551 81 95
351738: 878 88 6 41 4 1
60511327: 9 160 6 4 5 6 7 25 876 3
8723027848: 3 49 34 74 62 481 8
376702259433: 76 970 413 109 429 8
981338733: 3 845 75 9 387
332372089: 217 4 14 4 93 7 65 6 7 7
13062184: 32 55 7 55 35 4 28 5 85
555428252: 8 226 8 48 5 7 2 4 7 8 1 9
153435: 6 11 35 84 778 387 3
8052295745: 67 6 44 705 48 8 63
9637546: 23 1 419 470 73
235413707139: 8 7 89 17 2 326 64 71
152664989: 9 2 6 861 5 54 2 2 67 8 9
10599157: 47 425 401 7 520
321048168: 437 4 8 91 168
6133466570: 613 338 4 82 570
364395: 2 670 5 3 4 4 71 9 9 651
96144271: 93 41 273 426 6 3
296100266: 7 416 700 262 7
12: 3 4 5
316640576: 765 5 3 80 3 8 10 69 64
3742903512: 440 341 55 4 85
2424885: 999 485 97 365 5
1109686976: 3 564 542 680 6 9 73
130649102: 87 2 180 48 2 813 2
351996258059: 1 841 90 8 12 3 31 5 56
19712180: 69 7 5 3 2 42 952 6 1 61
161820433: 174 6 500 62 85 5 6
1751: 893 698 6 11 7 136
865218480617: 7 3 564 5 4 7 840 3 1 5 4
29024: 56 2 173 5 24
137761920: 77 281 755 384
234: 18 2 6 9
85892: 8 749 98 99 249 5 39
6668277571: 6 9 7 140 8 20 139 986
58381: 138 21 556 4 872
39749790: 2 659 9 5 2 6 5 2 8 331 3
16910718: 54 86 5 73 726
196244: 2 301 436 924 44
680: 3 1 76 7 46 3 5
24098: 21 3 8 5 651 9
72406081: 76 1 987 9 964 4 2 7
401310: 9 4 69 824 4 441
482255395: 9 533 25 55 395
336753: 86 5 76 995 3
2009631: 2 7 488 4 70 6 1 50 878
39840: 7 32 108 6 20
5677304803: 3 8 989 803 48 8 759 7
109641032174: 3 61 289 561 76 40 14
509254455841: 4 26 69 895 172 461
30807424: 1 489 63 42 4
1305895444: 65 557 83 24 6
36122860: 7 665 97 80 60
432561944: 465 50 6 465 1 6 5 8 8
1598755: 13 2 1 1 6 8 5 3 6 7 295 5
214270585186: 5 2 479 31 90 3 8 497
820817: 5 250 3 227 94 11 9 2
87935: 6 8 8 81 5 34 384 5 4 8 1
3181124: 4 2 356 6 5 79 45
57558: 9 306 260 55 1
469698: 3 376 14 76 698
427158: 348 601 75 18 6
259325: 47 42 9 54 99 8 32 3
1854090496: 3 7 6 2 7 70 27 3 1 48 1 6
951: 8 7 21 93 109 4
805719131: 6 7 8 2 6 3 102 7 23 9 7 7
3719908556832: 499 91 4 1 2 4 640 8 8 4
144066: 29 108 3 559 39
258758334: 2 586 1 58 1 334
12025: 665 7 2 662 9
87559383: 9 179 7 2 32 7 6 90 3
288550536146: 5 476 74 4 2 606 145
275093262: 4 430 760 7 834 860 4
6227179152: 5 496 7 872 73 17
254426: 31 350 1 453 8
28668: 6 3 3 6 246 317 4 5 3 4
204246: 7 8 1 34 2 460 5 3 7 6 1
966451: 533 5 8 36 933 5 43 3
1000614359: 1 8 794 8 4 2 908 7 3
54277578: 180 4 5 252 6 3
960344059020: 8 5 1 745 7 4 1 47 5 4 9 8
1794254145263: 84 471 547 987 84
61238: 3 50 359 7 96 38
262072: 1 76 9 4 7 34 238
163767141: 35 56 9 1 9 4 178 1 8 1
4278695529: 62 69 695 526 3 1
657492404523: 491 13 72 355 65 2 62
12144984: 121 3 5 9 986
2877557499: 57 484 9 129 531
588122: 5 6 3 48 65
6876603: 176 5 719 1 21 43
1275198662: 2 83 751 6 662
12739432716: 53 290 76 543 6 5 9 5 9
412298231633: 9 34 9 4 5 3 3 25 5 63 1 7
277472967211: 41 445 9 5 4 76 4 7 209
20790: 45 7 15 9 7
48961044215: 8 5 8 80 4 7 6 9 1 26 84 5
270911: 2 83 25 215 518
1640: 795 3 8 7 6 805 2 3 1 7 3
111034: 33 35 5 37 7 41 6
72864: 61 91 55 4 11 8
5341448448: 1 88 5 8 7 4 9 3 7 6 4 392
849: 801 3 1 45
1677855061: 414 49 9 919 1
1954728: 839 9 384 93 52 6 60 6
3579938: 8 838 89 6 2
54951093321: 5 495 109 332 3
779284807: 9 463 784 5 234 5 2 65
295479: 2 312 5 47 4 4 297 6
86113396: 5 877 30 976 5 908
417248766: 6 6 84 542 8 26 14 61 6
7928: 7 925 6
2561662: 88 3 24 3 76 39 90 676
17824: 126 3 9 947 45 62 4
474147901: 10 53 1 4 2 5 30 90 5 9
332807: 61 5 135 318 6 6 599
248428: 9 46 15 7 4
5058558453: 35 239 55 261 2
203986: 44 83 9 124 161
5566: 602 8 1 9 8 5 29 4 7 3 6 5
71442: 904 36 38 2
52410: 5 2 90 6 3 9
9126793: 39 2 520 67 93
285020268: 315 28 3 59 358 39

50
Inputs/Day8.txt Normal file
View File

@@ -0,0 +1,50 @@
.....wV....q.....................................n
.......w......q.h.....Vn.........................D
............w.S..G.....................DT.........
......S........h......e..T.....y......D...........
......m.......Ae.......T........o.................
....m....S........................................
...m..........................n........8..........
.........2...G......................n.............
..2........V.......h................Q.............
............................o.....................
.Z......I..U....e...u.....G....o..................
...N..G.........................................y.
.....I............q.......h...................s...
......U........qI....o.V..Rz........8........k....
......d.Z.........................R.......8y......
.........e..............T.....l...................
.......2.........................u...R............
.....d.............................Q..............
...................v.....................s.Q....M.
........2..........4.....................8..7.k...
...........x..N..................A..........k.....
...........ZN...........v...............K.........
...d.......N.....................Ky.6.............
...........................l6.....................
....L....g.................4.......k..K.......0...
..............L...........4R................s.....
U......r..............H.4.........................
.......U.............a.......H.............u......
......xY...............l..........................
...................................6..u...........
........Y......L......l............0..............
......9..L...........A.....v..HEa........K........
..................v........6.EX.............z.....
d..Y.............m......A.........................
......................a.i......M...........z......
...................g.......................0......
...............................H.........i........
..........3................W........E...i...0.....
.................t.a....g.................5.......
.r...t...........................7.....5..........
....................................7....5........
....................g.Y...wMz.....................
9..........O....3................W.7..E..XD...1...
t..............3.x.....9..........W.M.............
...9............W.................................
Z.............x................X.i......5.........
...........3.....................................1
...................O.......s....X.................
..............r...................................
..........................O.................1.....

1
Inputs/Day9.txt Normal file

File diff suppressed because one or more lines are too long

View File

@@ -25,6 +25,19 @@ var selectedDay = AnsiConsole.Prompt(select);
var stopWatch = new Stopwatch();
// Read input
try
{
selectedDay.ReadInput();
}
catch (Exception e)
{
AnsiConsole.WriteException(e);
Environment.Exit(1);
}
// Part 1
AnsiConsole.MarkupLine($"[cyan]Running [yellow]{selectedDay}[/]...[/]\n");
AnsiConsole.MarkupLine("[cyan]Part [yellow]1[/] result:[/]");
@@ -44,7 +57,9 @@ catch (Exception e)
stopWatch.Reset();
// Part 2
AnsiConsole.MarkupLine("\n[cyan]Part [yellow]2[/] result:[/]");
try
{
stopWatch.Start();

View File

@@ -14,4 +14,25 @@ public static class StringExtensions
{
return new StringReader(text).ReadAllLines();
}
public static char[,] AsCharGrid(this string text)
{
var lines = text.ReadAllLines().ToArray();
var lineCount = lines.Length;
var columnCount = lines[0].Length;
var grid = new char[lineCount, columnCount];
for (int i = 0; i < lineCount; i++)
{
var line = lines[i];
for (int j = 0; j < columnCount; j++)
{
grid[i, j] = line[j];
}
}
return grid;
}
}