diff --git a/AdventOfCode.2016/Day01.cs b/AdventOfCode.2016/Day01.cs
index 6f62ba9..fce0559 100644
--- a/AdventOfCode.2016/Day01.cs
+++ b/AdventOfCode.2016/Day01.cs
@@ -21,7 +21,7 @@ public Day01()
[Fact]
public void Part1()
{
- int answer = EnumPositions().Last().Distance;
+ int answer = EnumPositions().Last().Manhattan;
Assert.Equal(226, answer);
}
@@ -34,7 +34,7 @@ public void Part2()
{
if (!visited.Add(pos))
{
- answer = pos.Distance;
+ answer = pos.Manhattan;
break;
}
}
diff --git a/AdventOfCode.2016/Day22.cs b/AdventOfCode.2016/Day22.cs
index b533328..a9df198 100644
--- a/AdventOfCode.2016/Day22.cs
+++ b/AdventOfCode.2016/Day22.cs
@@ -167,7 +167,7 @@ private static int SearchComparsion(SearchNode lhs, SearchNode rhs)
static int WeightedDistance(in SearchNode n)
{
- return n.Steps + n.Data.Distance + n.EmptyTarget.Distance + n.Empty.DistanceFrom(n.EmptyTarget);
+ return n.Steps + n.Data.Manhattan + n.EmptyTarget.Manhattan + n.Empty.ManhattanDistanceFrom(n.EmptyTarget);
}
}
diff --git a/AdventOfCode.2017/AdventOfCode.2017.csproj b/AdventOfCode.2017/AdventOfCode.2017.csproj
index 587224d..a2fd697 100644
--- a/AdventOfCode.2017/AdventOfCode.2017.csproj
+++ b/AdventOfCode.2017/AdventOfCode.2017.csproj
@@ -1,7 +1,7 @@
- net5.0
+ net6.0
AdventOfCode._2017
false
@@ -31,7 +31,8 @@
-
-
+
+
+
\ No newline at end of file
diff --git a/AdventOfCode.2017/Day10.cs b/AdventOfCode.2017/Day10.cs
index f436062..4d5652b 100644
--- a/AdventOfCode.2017/Day10.cs
+++ b/AdventOfCode.2017/Day10.cs
@@ -1,5 +1,7 @@
using System;
+using System.Collections;
using System.Collections.Generic;
+using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -10,6 +12,77 @@ namespace AdventOfCode._2017
{
public class Day10
{
+ private class KnotHash
+ {
+ private int[] _list;
+ private int _current;
+ private int _skip;
+ public KnotHash(int size)
+ {
+ _list = Enumerable.Range(0, size).ToArray();
+ _current = 0;
+ _skip = 0;
+ }
+
+ public void Apply(int length)
+ {
+ int begin = _current;
+ int end = begin + length - 1;
+
+ for (int i = 0; i < length / 2; i++)
+ {
+ int tmp = _list[Index(begin)];
+ _list[Index(begin)] = _list[Index(end)];
+ _list[Index(end)] = tmp;
+
+ begin++;
+ end--;
+ }
+
+ Advance(length);
+ }
+
+ public IEnumerable Enumerate() => _list;
+
+ private void Advance(int length)
+ {
+ _current = Index(_current + length + _skip++);
+ }
+
+ private int Index(int i) => i % _list.Length;
+ }
+
+ [Fact]
+ public void Part1()
+ {
+ int[] lengths = File.ReadAllText("Inputs/Day10.txt").Split(',').Select(int.Parse).ToArray();
+
+ KnotHash hash = new KnotHash(256);
+ foreach (int length in lengths)
+ hash.Apply(length);
+
+ int answer = hash.Enumerate().Take(2).Aggregate((x, y) => x * y);
+
+ Assert.Equal(23715, answer);
+ }
+
+ [Fact]
+ public void Part2()
+ {
+ int[] lengths = File.ReadAllText("Inputs/Day10.txt").Select(c => (int)c).Concat(new[] { 17, 31, 73, 47, 23 }).ToArray();
+ KnotHash hash = new KnotHash(256);
+
+ for (int i = 0; i < 64; i++)
+ foreach (int length in lengths)
+ hash.Apply(length);
+
+ string answer = hash.Enumerate()
+ .Chunk(16).Select(chunk => chunk.Aggregate((x, y) => x ^ y))
+ .Select(n => string.Format("{0:x2}", n))
+ .Aggregate(new StringBuilder(), (sb, s) => sb.Append(s), sb => sb.ToString());
+
+ Assert.Equal("541dc3180fd4b72881e39cf925a50253", answer);
+ }
}
}
diff --git a/AdventOfCode.2017/Day11.cs b/AdventOfCode.2017/Day11.cs
new file mode 100644
index 0000000..5639b13
--- /dev/null
+++ b/AdventOfCode.2017/Day11.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+using static System.Math;
+
+namespace AdventOfCode._2017
+{
+ public class Day11
+ {
+ string[] _input;
+
+ public Day11()
+ {
+ _input = File.ReadAllText("Inputs/Day11.txt").Split(',').ToArray();
+ }
+
+ [Fact]
+ public void Part1()
+ {
+ (int q, int r, int s) p = (0, 0, 0);
+
+ foreach (string dir in _input)
+ Move(dir, ref p);
+
+ int answer = Distance(p);
+ Assert.Equal(670, answer);
+ }
+
+ [Fact]
+ public void Part2()
+ {
+ int answer = Steps().Select(Distance).Max();
+ Assert.Equal(1426, answer);
+
+ IEnumerable<(int, int, int)> Steps()
+ {
+ (int q, int r, int s) p = (0, 0, 0);
+ foreach (string dir in _input)
+ {
+ Move(dir, ref p);
+ yield return p;
+ }
+ }
+ }
+
+ private static void Move(string dir, ref (int q, int r, int s) p)
+ {
+ switch (dir)
+ {
+ case "n": p.r--; p.s++; break;
+ case "ne": p.q++; p.r--; break;
+ case "se": p.q++; p.s--; break;
+ case "s": p.r++; p.s--; break;
+ case "sw": p.q--; p.r++; break;
+ case "nw": p.q--; p.s++; break;
+ default: throw new InvalidOperationException();
+ }
+ }
+
+ private static int Distance((int q, int r, int s) p) =>
+ (Abs(p.q) + Abs(p.r) + Abs(p.s)) / 2;
+ }
+}
diff --git a/AdventOfCode.2017/Day12.cs b/AdventOfCode.2017/Day12.cs
new file mode 100644
index 0000000..0547a51
--- /dev/null
+++ b/AdventOfCode.2017/Day12.cs
@@ -0,0 +1,78 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace AdventOfCode._2017
+{
+ public class Day12
+ {
+ List> _graph;
+
+ public Day12()
+ {
+ string[] lines = File.ReadAllLines("Inputs/Day12.txt");
+
+ _graph = new(lines.Length);
+ for (int i = 0; i < lines.Length; i++)
+ _graph.Add(new());
+
+ for (int i = 0; i < lines.Length; i++)
+ foreach (int sink in lines[i].Split("<->")[1].Split(',', StringSplitOptions.TrimEntries).Select(int.Parse))
+ _graph[i].Add(sink);
+ }
+
+ [Fact]
+ public void Part1()
+ {
+ bool[] visited = new bool[_graph.Count];
+ int answer = Traverse(0, ref visited);
+
+ Assert.Equal(380, answer);
+ }
+
+ [Fact]
+ public void Part2()
+ {
+ bool[] visited = new bool[_graph.Count];
+ int count = 0;
+ for (int i = 0; i < _graph.Count; i++)
+ {
+ if (!visited[i])
+ {
+ count++;
+ Traverse(i, ref visited);
+ }
+ }
+
+ Assert.Equal(181, count);
+ }
+
+ private int Traverse(int start, ref bool[] visited)
+ {
+ Queue toSearch = new Queue();
+
+ toSearch.Enqueue(start);
+ int count = 0;
+ while (toSearch.Count > 0)
+ {
+ int current = toSearch.Dequeue();
+
+ if (visited[current])
+ continue;
+
+ visited[current] = true;
+ count++;
+
+ foreach (int next in _graph[current])
+ if (!visited[next])
+ toSearch.Enqueue(next);
+ }
+
+ return count;
+ }
+ }
+}
diff --git a/AdventOfCode.2017/Day13.cs b/AdventOfCode.2017/Day13.cs
new file mode 100644
index 0000000..e4e55ac
--- /dev/null
+++ b/AdventOfCode.2017/Day13.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Xunit;
+
+namespace AdventOfCode._2017
+{
+ public class Day13
+ {
+ private class Scanner
+ {
+ public readonly int Depth;
+ public readonly int Range;
+
+ private readonly int _modulo;
+
+ public Scanner(int depth, int range)
+ {
+ Depth = depth;
+ Range = range;
+ _modulo = (range - 1) * 2;
+ }
+
+ public int PositionAtInitialTime(int t0) => (t0 + Depth) % _modulo;
+ }
+
+ Scanner[] _scanners;
+
+ public Day13()
+ {
+ _scanners = File.ReadAllLines("Inputs/Day13.txt")
+ .Select(s => s.Split(':', StringSplitOptions.TrimEntries).Select(int.Parse).ToArray())
+ .Select(tok => new Scanner(tok[0], tok[1]))
+ .ToArray();
+ }
+
+ [Fact]
+ public void Part1()
+ {
+ int answer = _scanners.Where(s => s.PositionAtInitialTime(0) == 0).Sum(s => s.Depth * s.Range);
+
+ Assert.Equal(1704, answer);
+ }
+
+ [Fact]
+ public void Part2()
+ {
+ int time = 0;
+ while (!_scanners.All(s => s.PositionAtInitialTime(time) != 0))
+ time++;
+
+ Assert.Equal(3970918, time);
+ }
+ }
+}
diff --git a/AdventOfCode.2017/Day15.cs b/AdventOfCode.2017/Day15.cs
index 03bcdfe..3bb7bc6 100644
--- a/AdventOfCode.2017/Day15.cs
+++ b/AdventOfCode.2017/Day15.cs
@@ -57,20 +57,8 @@ public static IEnumerable Generate(uint factor, uint seed)
[Fact]
public void Part1()
{
- //int count = 0;
- //for (int i = 0; i < 40_000_000; i++)
- //{
- // _genA.Tick();
- // _genB.Tick();
-
- // if (_genA.Checksum == _genB.Checksum)
- // count++;
- //}
-
- int count = Enumerable.Zip(
- Generator.Generate(16807, 722),
- Generator.Generate(48271, 354)
- )
+ int count = Generator.Generate(16807, 722)
+ .Zip(Generator.Generate(48271, 354))
.Take(40_000_000)
.Count(pair => pair.First == pair.Second);
diff --git a/AdventOfCode.2017/Day21.cs b/AdventOfCode.2017/Day21.cs
index 916ade6..81e7899 100644
--- a/AdventOfCode.2017/Day21.cs
+++ b/AdventOfCode.2017/Day21.cs
@@ -140,33 +140,7 @@ public void CopyTo(Tile other)
class RuleMap
{
- struct RuleKey : IEquatable
- {
- public readonly int Size;
- public readonly uint Id;
-
- public RuleKey(int size, uint id)
- {
- Size = size;
- Id = id;
- }
-
- public bool Equals(RuleKey other)
- {
- return Size == other.Size &&
- Id == other.Id;
- }
-
- public override bool Equals(object obj)
- {
- return Equals((RuleKey) obj);
- }
-
- public override int GetHashCode()
- {
- return HashCode.Combine(Size, Id);
- }
- }
+ readonly record struct RuleKey(int Size, uint Id);
Dictionary _rules;
@@ -192,10 +166,8 @@ public void AddRule(string rule)
_rules.Add(new RuleKey(ruleTile.Size, id), matchTile);
}
- public bool TryGetMatchedTile(int size, uint id, out Tile matched)
- {
- return _rules.TryGetValue(new RuleKey(size, id), out matched);
- }
+ public bool TryGetMatchedTile(int size, uint id, out Tile matched) =>
+ _rules.TryGetValue(new RuleKey(size, id), out matched);
private Tile ParseTile(string[] parts)
{
@@ -237,13 +209,13 @@ private Pattern(int size)
public Pattern ApplyRules(RuleMap rules)
{
- GetTileSizeAndCount(out int tileSize, out int tileCount);
+ (int tileSize, int tileCount) = GetTileSizeAndCount();
int nextTileSize = GetNextTileSize(tileSize);
int nextSize = nextTileSize * tileCount;
Pattern nextPattern = new Pattern(nextSize);
- foreach ((Tile currentTile, Tile nextTile) in Enumerable.Zip(GetTiles(tileSize), nextPattern.GetTiles(nextTileSize)))
+ foreach ((Tile currentTile, Tile nextTile) in GetTiles(tileSize).Zip(nextPattern.GetTiles(nextTileSize)))
{
if (!rules.TryGetMatchedTile(currentTile.Size, currentTile.GetPrimaryId(), out Tile matchedTile))
throw new InvalidOperationException();
@@ -272,33 +244,29 @@ private IEnumerable GetTiles(int tileSize)
yield return new Tile(tileSize, _array, (i, j));
}
- private void GetTileSizeAndCount(out int tileSize, out int tileCount)
+ private (int size, int count) GetTileSizeAndCount()
{
int remainder;
- tileCount = Math.DivRem(_size, 2, out remainder);
+ int count = Math.DivRem(_size, 2, out remainder);
if (remainder == 0)
{
- tileSize = 2;
- return;
+ return (2, count);
}
- tileCount = Math.DivRem(_size, 3, out remainder);
+ count = Math.DivRem(_size, 3, out remainder);
if (remainder == 0)
{
- tileSize = 3;
- return;
+ return (3, count);
}
throw new InvalidOperationException();
}
- private int GetNextTileSize(int currentTileSize)
- {
- return currentTileSize == 2 ? 3 : currentTileSize == 3 ? 4 : throw new InvalidOperationException();
- }
+ private int GetNextTileSize(int currentTileSize) =>
+ currentTileSize == 2 ? 3 : currentTileSize == 3 ? 4 : throw new InvalidOperationException();
}
- RuleMap _ruleMap;
+ private readonly RuleMap _ruleMap;
public Day21()
{
diff --git a/AdventOfCode.2017/Inputs/Day11.txt b/AdventOfCode.2017/Inputs/Day11.txt
new file mode 100644
index 0000000..d08625e
--- /dev/null
+++ b/AdventOfCode.2017/Inputs/Day11.txt
@@ -0,0 +1 @@
+ne,nw,se,nw,ne,s,s,s,sw,ne,sw,sw,sw,sw,sw,nw,nw,sw,se,ne,nw,nw,nw,nw,nw,nw,n,n,s,nw,n,n,nw,n,n,n,n,ne,n,n,ne,n,n,s,n,se,ne,ne,ne,n,se,ne,ne,ne,ne,se,ne,ne,ne,ne,ne,ne,ne,sw,ne,ne,s,se,se,se,s,ne,ne,se,ne,ne,sw,ne,se,se,se,se,se,se,s,s,se,se,ne,se,se,se,se,ne,se,se,s,se,se,s,n,s,se,s,ne,se,se,nw,ne,s,n,s,se,se,s,se,se,se,s,sw,se,s,s,s,n,se,se,s,se,s,se,se,s,se,se,s,s,ne,s,s,se,n,s,s,s,s,sw,s,s,n,s,sw,n,s,s,s,s,s,sw,s,s,s,s,s,sw,s,se,ne,s,s,s,s,s,sw,s,sw,s,nw,sw,s,s,sw,sw,nw,s,sw,se,sw,sw,sw,s,se,s,sw,se,nw,sw,s,n,s,sw,n,sw,n,sw,sw,sw,nw,nw,sw,sw,sw,s,sw,s,sw,sw,sw,sw,sw,sw,sw,se,n,nw,s,se,sw,sw,se,sw,se,sw,nw,sw,s,sw,sw,sw,sw,s,s,sw,n,nw,nw,se,sw,nw,sw,sw,sw,nw,ne,s,sw,nw,n,nw,n,sw,nw,ne,n,n,sw,nw,sw,nw,nw,n,nw,nw,nw,se,nw,sw,se,nw,sw,nw,nw,nw,nw,sw,nw,n,sw,nw,nw,nw,nw,nw,nw,sw,nw,nw,sw,nw,sw,nw,sw,nw,sw,sw,nw,nw,nw,sw,nw,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,s,nw,nw,nw,sw,se,nw,nw,nw,nw,nw,nw,n,nw,sw,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,sw,s,ne,nw,nw,s,se,ne,nw,nw,nw,nw,nw,sw,nw,ne,se,nw,nw,nw,s,n,ne,n,nw,nw,n,s,nw,se,nw,s,sw,n,n,nw,n,nw,nw,nw,n,n,nw,n,nw,nw,n,ne,s,n,n,n,sw,nw,nw,ne,ne,n,nw,n,nw,n,n,se,nw,n,s,n,nw,n,n,nw,se,sw,nw,n,nw,n,n,sw,n,n,n,nw,n,nw,n,n,n,n,ne,n,n,nw,n,nw,n,n,n,nw,n,s,nw,n,n,se,sw,n,n,n,ne,se,n,n,se,s,n,n,n,nw,n,n,n,ne,n,n,n,n,n,s,n,n,n,n,n,n,n,n,n,ne,n,n,n,n,ne,n,ne,se,n,n,n,n,sw,sw,n,n,ne,n,n,n,sw,ne,n,n,s,ne,n,ne,n,ne,ne,n,s,nw,sw,n,n,ne,ne,n,n,n,n,n,n,nw,ne,n,n,n,n,ne,n,ne,ne,n,se,n,s,n,n,n,n,n,s,n,ne,n,n,ne,sw,ne,ne,ne,n,ne,nw,ne,n,n,n,se,n,se,ne,ne,ne,se,ne,n,n,ne,nw,n,n,n,ne,sw,n,ne,nw,nw,ne,ne,ne,ne,ne,sw,se,ne,ne,ne,ne,n,ne,n,n,sw,ne,nw,n,ne,ne,ne,ne,ne,sw,ne,n,ne,n,ne,nw,ne,ne,sw,ne,nw,nw,ne,ne,ne,ne,n,sw,se,ne,ne,ne,ne,ne,ne,ne,n,n,sw,ne,ne,se,n,ne,sw,ne,ne,ne,n,ne,ne,ne,ne,sw,ne,ne,ne,ne,sw,ne,ne,ne,ne,ne,nw,ne,ne,ne,ne,ne,ne,nw,ne,ne,se,ne,ne,se,ne,ne,ne,ne,ne,ne,s,se,s,ne,ne,ne,n,ne,ne,n,ne,ne,ne,nw,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,ne,ne,se,ne,ne,s,s,nw,ne,ne,ne,se,ne,s,n,se,n,ne,ne,s,se,se,se,ne,ne,ne,se,sw,se,ne,ne,nw,ne,se,ne,ne,ne,ne,se,ne,nw,ne,ne,ne,se,ne,se,s,se,se,ne,ne,ne,ne,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,nw,ne,ne,se,sw,ne,se,ne,nw,se,n,se,n,ne,ne,ne,ne,s,se,ne,se,se,ne,ne,ne,ne,ne,se,ne,se,ne,se,ne,se,se,se,ne,nw,ne,nw,ne,ne,se,s,ne,s,n,se,sw,ne,se,ne,ne,ne,se,se,ne,ne,se,se,se,se,ne,n,sw,ne,se,ne,sw,sw,nw,s,se,se,ne,se,n,ne,se,s,sw,ne,se,se,s,se,se,se,se,se,sw,ne,se,s,se,se,s,se,ne,se,ne,ne,se,ne,se,ne,se,se,ne,ne,ne,se,ne,se,n,se,se,se,s,ne,se,se,ne,s,s,nw,ne,se,se,ne,se,se,se,se,se,se,se,s,se,se,sw,se,sw,se,se,se,ne,se,s,se,se,se,se,se,se,se,se,ne,se,s,se,se,se,se,sw,n,se,se,se,ne,se,se,se,se,s,se,se,sw,se,se,se,sw,se,n,se,se,se,se,se,nw,se,se,sw,se,se,s,se,se,se,ne,se,se,se,se,s,se,se,se,se,s,se,se,se,s,se,se,s,se,se,se,se,se,se,se,se,se,se,n,se,s,se,se,se,se,se,ne,se,se,se,ne,se,se,se,se,n,se,se,se,se,se,se,se,se,se,se,s,s,se,ne,s,se,s,se,s,se,se,s,s,s,se,s,se,se,ne,s,s,se,se,se,s,s,se,se,se,s,se,se,ne,s,n,s,s,se,ne,se,se,sw,se,se,se,se,s,n,s,s,sw,sw,se,s,se,ne,se,se,se,s,se,n,s,s,sw,se,se,se,s,se,se,s,sw,s,s,se,se,nw,s,s,se,nw,n,s,se,s,se,se,sw,s,s,se,se,s,se,n,nw,se,se,s,s,s,se,s,s,se,s,se,se,s,n,s,se,s,se,s,sw,nw,ne,s,s,se,se,se,se,s,se,se,s,s,s,se,se,se,sw,se,se,n,se,se,n,s,se,se,s,s,se,ne,sw,se,se,s,se,s,s,se,se,s,se,se,s,s,nw,se,se,s,se,n,s,n,n,se,s,se,se,se,sw,s,s,n,s,s,se,ne,se,nw,se,s,s,s,s,s,se,ne,s,se,s,se,n,sw,nw,s,s,s,s,nw,se,sw,se,s,s,sw,s,nw,se,nw,s,s,nw,n,s,sw,se,s,nw,s,se,se,n,ne,s,s,s,s,se,s,se,s,se,s,s,s,se,s,s,s,sw,s,s,s,se,s,s,s,s,se,s,s,s,ne,se,s,se,s,s,s,se,n,s,se,se,s,se,ne,s,n,s,s,se,ne,s,s,s,s,s,s,s,s,s,s,s,s,s,nw,se,s,n,se,s,se,s,ne,s,s,s,ne,n,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,se,s,s,n,s,n,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,s,n,s,s,s,s,s,s,s,s,s,sw,s,nw,sw,s,nw,s,s,s,nw,s,se,nw,s,s,s,s,s,s,sw,s,s,nw,s,sw,s,s,sw,s,s,s,s,ne,s,s,s,sw,sw,s,sw,s,s,s,s,se,s,s,sw,sw,s,s,s,s,s,n,nw,s,s,s,ne,s,n,s,s,sw,s,s,s,s,s,s,n,s,s,ne,s,ne,sw,s,ne,sw,s,s,ne,s,s,s,s,s,sw,s,s,s,s,sw,sw,sw,sw,s,se,sw,s,s,s,s,s,s,s,s,s,n,sw,s,s,s,sw,s,sw,sw,n,ne,s,s,s,s,s,s,s,s,s,n,s,sw,sw,s,s,s,sw,s,s,s,sw,s,s,se,sw,s,sw,sw,sw,s,ne,nw,sw,n,s,s,sw,s,s,s,nw,s,s,sw,s,se,sw,sw,sw,s,sw,s,s,n,ne,s,nw,s,s,s,n,ne,s,s,sw,sw,sw,nw,s,s,sw,s,sw,sw,sw,s,sw,sw,se,se,s,s,s,s,s,sw,se,s,s,sw,s,s,nw,s,s,sw,sw,s,s,s,s,s,sw,n,sw,sw,sw,sw,sw,sw,s,sw,s,s,se,sw,s,sw,sw,sw,sw,s,n,s,s,sw,s,nw,s,s,ne,nw,sw,sw,sw,sw,s,s,s,s,s,sw,s,s,s,sw,sw,s,sw,s,s,s,sw,sw,s,s,s,nw,sw,s,sw,ne,s,sw,sw,nw,s,sw,s,sw,nw,sw,ne,ne,sw,sw,sw,sw,s,sw,s,sw,se,n,s,s,sw,sw,se,nw,sw,sw,sw,ne,sw,sw,se,sw,sw,se,s,ne,s,se,nw,sw,sw,sw,sw,s,s,sw,sw,sw,se,sw,nw,sw,se,ne,s,sw,sw,n,s,s,sw,nw,s,sw,sw,sw,s,ne,sw,nw,n,sw,n,sw,s,sw,sw,sw,s,sw,s,s,s,nw,s,sw,se,sw,sw,s,sw,s,s,s,sw,sw,n,sw,sw,sw,ne,sw,se,sw,s,nw,ne,ne,s,s,s,sw,ne,sw,sw,sw,sw,sw,sw,se,sw,s,sw,sw,sw,s,ne,s,sw,sw,s,nw,sw,sw,s,sw,s,s,sw,n,sw,s,sw,nw,nw,sw,sw,sw,s,ne,s,sw,sw,sw,s,n,sw,sw,s,sw,sw,sw,sw,n,sw,sw,ne,sw,ne,nw,sw,n,nw,s,s,sw,s,sw,sw,sw,sw,sw,sw,sw,se,sw,sw,sw,nw,sw,sw,n,ne,sw,sw,sw,sw,ne,sw,sw,sw,sw,sw,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,ne,s,sw,n,s,sw,sw,sw,sw,sw,sw,ne,s,sw,sw,nw,s,sw,sw,sw,nw,sw,sw,sw,sw,sw,sw,sw,ne,sw,sw,sw,sw,sw,sw,sw,nw,se,sw,sw,sw,sw,se,sw,sw,se,sw,sw,se,sw,sw,nw,sw,sw,sw,sw,sw,sw,sw,sw,nw,sw,se,sw,s,sw,sw,sw,n,sw,sw,nw,sw,sw,sw,sw,sw,nw,sw,sw,sw,sw,sw,sw,sw,n,ne,n,sw,sw,nw,sw,sw,sw,nw,sw,sw,n,n,sw,sw,sw,sw,sw,se,n,nw,sw,nw,nw,ne,n,s,n,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,sw,sw,sw,sw,se,se,sw,sw,nw,sw,sw,nw,sw,s,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,nw,sw,ne,sw,sw,sw,se,sw,sw,sw,ne,n,s,sw,nw,sw,ne,ne,sw,sw,sw,sw,sw,nw,sw,nw,sw,sw,sw,sw,nw,s,nw,sw,sw,sw,se,n,sw,sw,sw,sw,sw,nw,sw,sw,sw,sw,nw,sw,nw,sw,sw,nw,s,s,sw,sw,ne,nw,sw,sw,sw,sw,sw,sw,n,ne,ne,sw,se,n,nw,nw,nw,s,sw,ne,sw,se,ne,sw,sw,sw,sw,sw,sw,s,sw,nw,sw,n,sw,nw,nw,sw,sw,sw,sw,sw,sw,ne,nw,sw,sw,n,sw,sw,sw,sw,sw,n,sw,nw,nw,sw,sw,sw,sw,s,sw,sw,se,sw,sw,nw,sw,sw,sw,nw,sw,nw,n,sw,sw,sw,n,sw,nw,nw,sw,nw,nw,nw,n,sw,s,nw,nw,sw,sw,ne,sw,sw,s,s,se,nw,sw,n,se,sw,nw,sw,n,nw,nw,se,nw,nw,sw,nw,sw,nw,s,sw,sw,sw,sw,ne,sw,sw,sw,sw,nw,nw,se,nw,nw,sw,nw,nw,sw,sw,ne,n,sw,nw,s,ne,sw,ne,sw,sw,sw,sw,nw,nw,sw,sw,sw,sw,sw,sw,sw,s,sw,n,nw,sw,sw,sw,sw,nw,sw,s,nw,sw,sw,nw,nw,sw,sw,nw,sw,nw,sw,sw,sw,nw,nw,sw,sw,ne,nw,nw,sw,sw,sw,sw,sw,nw,ne,nw,sw,sw,ne,sw,nw,n,se,nw,sw,sw,se,se,nw,s,sw,sw,sw,sw,sw,s,nw,nw,sw,sw,sw,nw,sw,nw,n,nw,nw,s,s,sw,ne,n,sw,nw,sw,nw,sw,nw,nw,sw,sw,sw,sw,nw,sw,s,nw,nw,sw,sw,nw,nw,nw,sw,se,ne,sw,nw,nw,n,sw,nw,s,se,nw,nw,nw,ne,nw,sw,sw,nw,s,ne,n,s,nw,nw,nw,sw,n,nw,s,se,nw,nw,nw,sw,nw,ne,nw,nw,nw,sw,sw,se,nw,nw,sw,ne,sw,nw,sw,nw,sw,sw,sw,nw,n,nw,sw,s,sw,nw,sw,sw,sw,nw,s,ne,sw,nw,nw,sw,se,sw,nw,nw,nw,nw,nw,nw,sw,n,nw,nw,nw,s,nw,sw,nw,sw,sw,s,nw,sw,nw,sw,nw,sw,sw,sw,nw,nw,sw,sw,nw,sw,nw,nw,nw,sw,sw,nw,sw,nw,sw,nw,se,nw,nw,s,sw,sw,nw,nw,nw,sw,nw,nw,n,nw,sw,sw,nw,sw,ne,s,nw,sw,sw,nw,sw,sw,sw,nw,nw,sw,nw,ne,nw,nw,nw,n,ne,nw,sw,sw,nw,sw,n,nw,sw,nw,sw,sw,nw,nw,ne,nw,se,sw,nw,se,sw,nw,nw,s,nw,s,nw,nw,nw,s,nw,sw,nw,nw,nw,sw,nw,nw,se,nw,nw,nw,nw,sw,n,s,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,s,nw,s,sw,nw,n,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,se,ne,nw,s,se,nw,nw,nw,nw,nw,se,nw,nw,nw,nw,sw,sw,se,sw,nw,nw,ne,nw,sw,nw,nw,s,n,nw,sw,s,nw,sw,ne,n,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,s,nw,nw,s,se,nw,nw,nw,ne,nw,nw,nw,nw,nw,sw,nw,n,n,se,nw,nw,nw,nw,sw,nw,nw,se,nw,nw,sw,nw,nw,nw,nw,sw,nw,ne,nw,nw,sw,nw,nw,nw,n,nw,se,nw,nw,ne,nw,se,nw,sw,nw,nw,n,nw,nw,s,nw,nw,nw,ne,nw,nw,nw,nw,sw,ne,n,sw,n,se,nw,sw,s,nw,sw,nw,sw,nw,nw,nw,nw,nw,nw,se,se,nw,nw,nw,s,nw,nw,nw,sw,nw,nw,se,nw,sw,nw,nw,ne,ne,nw,s,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,se,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,n,nw,nw,nw,s,s,se,nw,nw,nw,ne,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,n,nw,se,nw,n,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,sw,ne,nw,nw,nw,nw,nw,ne,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,se,n,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,se,nw,nw,nw,nw,nw,nw,s,nw,nw,nw,n,nw,nw,nw,n,nw,nw,nw,nw,n,nw,sw,n,nw,se,n,nw,ne,nw,n,n,nw,s,nw,se,sw,n,nw,nw,nw,n,nw,nw,nw,n,n,nw,nw,ne,sw,nw,ne,nw,nw,nw,sw,s,nw,nw,nw,se,nw,nw,sw,n,sw,nw,sw,nw,nw,n,nw,nw,n,n,nw,nw,nw,nw,nw,ne,se,nw,nw,n,nw,nw,nw,nw,nw,ne,nw,nw,n,nw,nw,n,ne,nw,ne,ne,n,nw,nw,nw,nw,n,nw,n,nw,nw,nw,nw,nw,nw,ne,se,nw,nw,n,nw,n,sw,nw,n,s,sw,n,n,ne,sw,nw,n,s,n,se,nw,se,n,ne,nw,nw,nw,s,nw,nw,nw,nw,se,se,nw,n,nw,nw,nw,nw,nw,nw,nw,n,n,nw,n,n,sw,sw,n,nw,n,nw,nw,s,nw,nw,n,nw,nw,nw,nw,n,se,s,nw,n,nw,nw,se,s,sw,n,nw,nw,nw,ne,nw,nw,n,s,nw,n,n,se,n,n,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,ne,n,s,nw,nw,nw,ne,ne,n,nw,nw,n,s,nw,n,n,n,n,nw,s,n,n,nw,nw,n,nw,n,nw,nw,nw,n,nw,n,nw,ne,nw,nw,nw,nw,nw,nw,s,n,nw,n,nw,nw,n,nw,n,n,nw,n,nw,n,n,n,n,n,n,n,ne,n,nw,nw,n,s,n,n,nw,nw,nw,s,n,nw,nw,n,sw,n,nw,n,s,nw,nw,n,se,n,s,n,nw,n,n,nw,n,nw,n,s,n,n,nw,s,nw,n,n,n,n,nw,nw,n,nw,nw,nw,nw,s,nw,n,nw,n,nw,n,nw,se,nw,nw,n,ne,sw,sw,nw,nw,nw,n,nw,nw,n,nw,ne,nw,n,n,n,nw,n,nw,se,se,n,nw,nw,nw,n,s,s,nw,n,nw,nw,s,nw,n,n,n,nw,ne,nw,nw,nw,sw,nw,nw,ne,nw,ne,nw,sw,se,nw,n,nw,nw,n,nw,sw,n,n,n,n,n,nw,s,nw,nw,nw,nw,nw,s,nw,n,nw,nw,n,n,n,ne,n,nw,nw,ne,sw,nw,nw,nw,s,n,n,ne,sw,se,n,nw,n,nw,n,n,nw,nw,nw,nw,n,n,se,s,n,n,n,nw,n,n,n,nw,nw,nw,nw,nw,n,n,n,se,nw,se,n,n,n,n,ne,nw,se,n,n,n,n,nw,se,nw,nw,nw,n,se,n,nw,n,nw,nw,nw,n,s,n,ne,nw,s,n,nw,n,nw,nw,n,nw,nw,ne,ne,se,n,n,n,n,n,nw,n,n,se,nw,n,n,n,sw,sw,n,n,se,nw,n,n,n,n,n,sw,s,n,n,nw,nw,n,n,nw,n,nw,nw,se,nw,n,n,n,n,n,n,nw,nw,ne,nw,n,nw,sw,n,n,n,n,sw,nw,n,n,n,nw,n,n,s,nw,s,n,sw,nw,nw,n,nw,s,se,nw,nw,n,n,n,n,nw,n,n,n,nw,nw,sw,s,nw,n,nw,n,nw,s,n,nw,nw,n,n,nw,n,n,n,nw,n,se,nw,se,n,se,n,ne,s,n,n,n,s,sw,nw,s,n,n,n,n,nw,n,nw,nw,sw,s,nw,nw,n,nw,ne,nw,n,sw,n,se,n,n,n,nw,nw,ne,nw,n,n,n,n,s,n,n,n,nw,n,nw,n,nw,n,sw,s,n,nw,n,n,n,n,s,n,n,nw,n,nw,nw,nw,nw,n,n,n,n,n,n,n,nw,sw,se,s,nw,n,ne,sw,n,nw,nw,n,n,n,n,n,n,n,n,nw,nw,n,s,n,n,s,n,ne,sw,nw,s,nw,n,n,n,se,n,n,n,nw,ne,n,nw,n,n,n,n,n,n,se,s,n,n,n,nw,ne,se,n,se,n,nw,n,n,nw,n,n,sw,nw,n,n,n,ne,n,n,n,n,nw,n,n,n,se,nw,n,n,n,n,n,n,nw,nw,n,n,nw,nw,n,n,nw,n,n,n,n,n,n,nw,nw,n,n,n,se,n,n,se,n,nw,nw,nw,ne,n,se,s,nw,n,nw,n,n,n,n,n,s,se,n,n,n,n,n,nw,sw,sw,ne,n,nw,nw,ne,se,n,n,sw,se,n,n,n,nw,se,n,nw,n,n,s,ne,ne,nw,n,nw,n,n,nw,n,nw,nw,n,n,n,n,n,n,nw,sw,n,sw,n,n,nw,n,n,n,n,n,se,n,n,se,n,se,n,n,n,n,n,ne,n,ne,n,ne,n,sw,n,sw,n,n,n,n,n,n,n,n,se,n,n,n,ne,n,n,n,n,n,n,s,nw,n,n,n,nw,n,n,n,n,n,n,ne,sw,n,ne,n,n,n,n,n,n,n,n,nw,n,n,n,n,n,n,n,n,se,n,n,n,n,n,n,s,nw,n,ne,n,n,sw,sw,n,n,n,ne,n,n,n,n,n,n,n,sw,n,n,n,n,ne,se,se,s,n,n,n,n,n,n,n,n,nw,ne,n,n,nw,n,se,n,sw,n,n,n,nw,n,s,se,n,se,n,n,n,n,n,sw,ne,sw,n,s,n,nw,n,nw,n,s,n,s,se,ne,nw,n,n,n,n,n,n,n,n,n,ne,se,n,n,n,ne,n,n,n,se,n,n,n,n,nw,n,n,n,n,n,n,n,ne,sw,n,n,n,se,n,sw,nw,n,nw,n,ne,n,n,n,n,n,s,n,n,n,n,n,se,ne,n,sw,s,s,n,n,n,n,n,n,n,n,n,s,s,n,n,n,n,n,sw,nw,n,n,n,n,n,se,n,n,n,sw,n,n,n,n,n,n,n,n,ne,n,s,n,n,n,n,se,n,n,n,n,n,n,ne,n,n,s,n,s,n,n,n,n,n,sw,n,n,n,se,n,n,n,se,ne,n,ne,n,n,n,n,n,s,n,n,n,n,n,se,n,sw,nw,s,n,n,n,s,n,n,n,n,n,n,sw,n,n,n,n,n,n,n,n,n,n,n,n,ne,n,s,s,n,ne,n,n,n,se,ne,ne,n,nw,nw,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,ne,n,n,n,n,ne,sw,n,nw,sw,ne,s,n,n,n,n,se,n,sw,n,n,ne,n,n,n,n,ne,ne,n,n,n,n,n,n,n,ne,ne,n,se,n,s,n,se,n,se,n,nw,n,sw,n,n,n,n,n,ne,ne,se,nw,ne,n,nw,n,n,ne,ne,n,n,n,ne,n,n,ne,ne,n,n,n,n,n,n,n,n,s,n,n,n,ne,ne,n,sw,n,n,n,n,n,ne,n,n,n,sw,n,n,n,n,n,n,ne,ne,n,n,se,n,ne,n,ne,n,n,n,n,n,n,sw,n,n,ne,n,ne,n,nw,ne,ne,n,n,n,n,n,ne,n,ne,sw,n,n,n,n,nw,ne,n,ne,n,n,ne,nw,n,se,se,n,n,n,ne,nw,sw,ne,ne,ne,n,ne,n,n,n,n,n,s,n,ne,n,n,ne,n,n,n,nw,ne,n,nw,n,nw,n,se,s,n,n,n,n,n,n,n,n,n,ne,se,n,ne,n,n,nw,ne,n,n,s,ne,n,n,n,n,n,ne,n,n,ne,ne,n,n,n,n,n,n,sw,nw,n,n,nw,ne,sw,n,n,n,n,n,n,n,nw,n,se,sw,ne,n,se,ne,sw,n,n,n,n,n,s,n,ne,n,n,n,n,ne,n,ne,se,n,n,n,n,n,ne,nw,ne,n,n,n,ne,sw,se,n,s,n,n,sw,n,n,n,n,sw,ne,n,ne,ne,n,n,n,ne,se,ne,n,n,ne,ne,n,se,ne,ne,ne,n,n,se,n,n,n,ne,n,se,ne,ne,sw,n,ne,se,ne,ne,n,se,n,n,nw,n,n,n,ne,n,ne,ne,ne,ne,ne,n,n,n,ne,n,n,n,nw,n,n,n,n,n,s,n,ne,ne,n,ne,nw,ne,n,n,n,n,ne,n,ne,ne,sw,ne,nw,se,n,ne,nw,ne,ne,n,n,n,s,s,s,ne,sw,ne,ne,s,sw,ne,se,se,n,n,n,sw,n,n,ne,n,ne,n,n,n,n,n,n,ne,n,n,n,ne,se,n,n,n,n,ne,n,n,se,n,sw,n,n,ne,n,ne,ne,n,ne,nw,sw,se,n,n,ne,n,se,ne,n,ne,ne,n,ne,ne,ne,nw,s,ne,nw,ne,ne,n,sw,n,n,n,n,ne,n,s,n,n,ne,sw,s,n,n,n,n,sw,n,sw,n,n,se,s,n,se,n,n,ne,ne,n,ne,s,n,ne,n,n,n,se,n,n,ne,ne,sw,se,n,ne,ne,n,ne,ne,n,ne,ne,ne,n,ne,n,ne,n,n,ne,ne,ne,ne,se,ne,se,ne,ne,sw,n,n,ne,ne,ne,n,n,ne,n,n,se,ne,ne,ne,ne,se,n,ne,n,ne,ne,se,ne,s,ne,n,n,n,ne,se,nw,ne,ne,sw,ne,n,ne,n,sw,ne,ne,sw,ne,n,n,se,ne,ne,ne,n,n,n,ne,n,n,ne,n,n,se,ne,n,ne,n,n,ne,ne,ne,n,ne,ne,n,n,ne,ne,ne,se,ne,ne,ne,n,n,sw,s,ne,ne,n,sw,n,ne,sw,n,ne,sw,n,n,ne,ne,nw,sw,ne,s,ne,ne,n,s,se,nw,s,ne,n,n,s,ne,ne,ne,n,ne,ne,ne,ne,se,ne,ne,ne,se,ne,ne,ne,n,n,n,n,nw,ne,ne,ne,n,n,n,n,ne,nw,n,n,n,ne,nw,n,sw,ne,n,ne,ne,ne,ne,sw,ne,nw,nw,ne,ne,n,ne,n,s,ne,sw,s,ne,ne,n,ne,n,n,sw,ne,n,ne,n,ne,ne,sw,se,ne,n,n,sw,ne,ne,nw,n,sw,ne,n,ne,ne,nw,n,ne,ne,n,se,n,s,ne,ne,ne,s,n,n,ne,n,ne,n,ne,ne,se,ne,ne,n,ne,ne,ne,ne,n,ne,ne,nw,ne,se,ne,ne,ne,ne,n,ne,ne,ne,ne,ne,se,ne,n,n,ne,ne,n,nw,ne,n,ne,ne,ne,ne,ne,ne,ne,ne,ne,n,n,n,ne,ne,sw,n,ne,ne,se,s,ne,n,sw,ne,n,ne,n,ne,n,ne,ne,ne,ne,ne,n,ne,ne,n,sw,n,ne,ne,ne,n,ne,n,se,n,n,ne,n,n,n,n,ne,ne,ne,s,n,ne,ne,ne,ne,ne,ne,ne,ne,n,n,ne,sw,ne,n,s,n,ne,se,ne,ne,ne,ne,nw,n,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,n,sw,ne,n,n,n,ne,s,ne,ne,n,s,ne,sw,nw,ne,s,ne,ne,ne,se,ne,n,ne,ne,sw,ne,n,ne,ne,se,s,s,n,n,ne,ne,se,ne,ne,ne,n,ne,ne,n,sw,ne,ne,ne,ne,s,ne,se,ne,ne,ne,ne,ne,n,ne,ne,se,nw,ne,nw,ne,ne,ne,ne,n,se,ne,n,nw,ne,ne,ne,n,ne,ne,ne,n,ne,n,n,ne,ne,ne,ne,ne,s,n,n,ne,se,ne,sw,n,se,sw,ne,n,ne,ne,ne,ne,ne,s,nw,n,ne,ne,ne,ne,sw,n,ne,ne,ne,ne,sw,s,ne,ne,ne,ne,nw,n,n,ne,ne,se,ne,ne,se,ne,sw,ne,sw,ne,ne,ne,n,ne,s,se,ne,ne,n,ne,n,n,sw,ne,sw,ne,ne,ne,ne,ne,ne,n,ne,ne,n,ne,ne,ne,ne,ne,ne,ne,n,ne,n,sw,ne,ne,ne,ne,n,s,se,ne,ne,s,ne,n,ne,ne,n,n,ne,ne,ne,se,ne,n,s,n,ne,s,ne,ne,se,ne,ne,s,n,se,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,n,ne,s,ne,ne,ne,sw,n,ne,ne,ne,ne,ne,se,nw,n,n,ne,ne,n,ne,ne,ne,ne,ne,ne,ne,ne,ne,nw,se,n,ne,se,n,ne,n,ne,ne,n,n,ne,ne,ne,ne,ne,ne,ne,sw,sw,n,ne,s,se,ne,ne,ne,se,ne,ne,ne,se,nw,nw,ne,ne,sw,n,ne,s,se,n,s,ne,ne,ne,ne,ne,ne,s,ne,s,nw,n,ne,ne,se,ne,nw,sw,ne,s,ne,ne,ne,ne,ne,nw,ne,ne,ne,n,ne,se,n,ne,ne,ne,ne,se,ne,ne,ne,sw,ne,ne,ne,ne,ne,se,ne,ne,n,ne,ne,ne,sw,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,ne,sw,n,ne,sw,ne,ne,ne,sw,nw,ne,ne,ne,se,ne,ne,n,ne,ne,ne,ne,ne,se,ne,se,ne,ne,ne,ne,ne,ne,ne,s,ne,ne,ne,ne,sw,ne,ne,ne,ne,ne,ne,s,ne,ne,ne,ne,ne,ne,ne,ne,sw,ne,ne,ne,ne,ne,sw,n,nw,ne,ne,ne,n,ne,ne,ne,n,ne,ne,ne,ne,se,ne,ne,s,nw,ne,ne,ne,sw,ne,ne,n,ne,n,ne,ne,ne,s,ne,sw,ne,n,ne,ne,ne,ne,nw,nw,nw,sw,sw,sw,ne,sw,nw,s,s,se,s,n,s,s,s,s,se,se,se,sw,nw,se,n,se,se,ne,sw,sw,ne,ne,ne,ne,ne,s,ne,ne,n,ne,ne,nw,ne,n,se,n,n,ne,ne,ne,ne,nw,n,n,ne,n,n,n,n,n,n,nw,n,n,s,n,n,s,n,nw,n,ne,n,n,n,n,ne,nw,ne,n,nw,nw,nw,n,n,nw,nw,nw,nw,nw,nw,n,nw,nw,sw,sw,nw,nw,nw,nw,nw,nw,nw,sw,nw,nw,nw,nw,n,sw,nw,n,nw,nw,sw,sw,sw,nw,sw,nw,sw,sw,sw,sw,ne,nw,sw,s,n,sw,sw,nw,nw,n,se,sw,s,sw,se,s,nw,nw,sw,se,sw,sw,sw,nw,sw,sw,sw,sw,sw,sw,sw,sw,sw,nw,sw,s,sw,n,sw,se,s,sw,sw,sw,s,s,sw,s,sw,ne,sw,s,sw,s,sw,s,s,s,nw,s,s,s,sw,s,sw,s,s,ne,s,s,s,s,sw,s,ne,s,n,sw,s,s,s,s,s,se,n,s,s,s,s,n,n,s,nw,se,s,s,s,se,sw,s,ne,se,n,s,s,s,s,s,n,se,s,se,s,se,s,se,n,se,sw,sw,s,se,s,s,s,s,sw,s,s,s,se,se,s,s,se,se,s,se,n,s,n,s,se,se,n,s,sw,s,ne,se,sw,se,se,n,s,s,se,nw,se,s,s,n,se,se,se,se,se,se,s,s,nw,se,s,se,se,se,se,se,se,s,s,s,se,ne,n,se,s,se,se,s,s,sw,se,se,nw,sw,se,se,se,se,ne,se,se,sw,se,sw,s,sw,n,se,se,se,se,se,ne,se,se,se,se,se,se,se,ne,se,se,se,s,ne,se,n,ne,sw,ne,ne,se,nw,se,sw,se,se,ne,n,se,se,se,ne,se,se,s,ne,ne,nw,se,se,n,se,se,sw,ne,se,ne,se,se,ne,se,se,nw,ne,ne,se,ne,n,ne,ne,se,ne,ne,ne,ne,ne,ne,se,se,ne,se,ne,se,se,ne,ne,se,s,ne,ne,ne,ne,ne,ne,s,ne,ne,se,se,ne,ne,se,ne,ne,ne,se,se,se,se,ne,ne,ne,ne,ne,ne,se,nw,ne,ne,se,ne,ne,s,se,ne,ne,s,ne,ne,ne,ne,ne,nw,ne,ne,ne,ne,ne,ne,ne,se,ne,ne,ne,s,ne,n,ne,ne,ne,ne,ne,s,s,n,ne,ne,ne,ne,ne,ne,ne,ne,se,ne,n,sw,ne,ne,ne,ne,se,ne,ne,ne,n,ne,ne,ne,ne,ne,nw,ne,n,ne,ne,ne,n,nw,ne,ne,nw,n,ne,ne,ne,se,ne,ne,ne,n,ne,nw,n,ne,se,ne,se,n,se,n,ne,n,ne,ne,se,ne,ne,ne,ne,nw,n,ne,n,ne,n,ne,ne,se,sw,n,se,ne,nw,n,ne,s,s,n,ne,ne,s,ne,nw,ne,ne,ne,ne,n,n,s,n,s,s,n,ne,n,ne,n,nw,sw,s,n,s,n,n,n,sw,ne,n,n,ne,n,se,nw,n,n,ne,n,n,nw,s,n,ne,n,ne,n,ne,n,n,ne,n,ne,ne,n,ne,n,ne,ne,n,sw,ne,nw,n,n,n,ne,n,n,n,ne,sw,n,n,n,n,se,sw,n,se,n,nw,ne,n,ne,ne,n,sw,n,se,n,n,sw,nw,n,n,ne,s,n,n,n,n,n,n,n,n,n,n,n,n,ne,s,n,n,n,n,n,sw,nw,n,n,n,n,n,nw,n,n,n,ne,ne,n,ne,nw,n,n,nw,n,ne,n,n,sw,n,s,n,nw,n,se,n,n,s,s,ne,ne,nw,n,nw,nw,n,n,n,sw,ne,n,n,n,n,n,n,n,n,n,n,s,ne,se,nw,n,nw,n,ne,se,nw,nw,n,n,n,ne,nw,n,n,s,n,nw,n,n,nw,se,nw,n,se,n,n,n,sw,nw,nw,n,n,n,nw,nw,nw,n,n,n,n,n,ne,n,n,sw,n,n,n,n,nw,n,sw,n,n,ne,n,ne,nw,se,nw,ne,n,sw,nw,s,n,n,n,n,nw,n,nw,n,n,sw,n,ne,n,nw,ne,n,nw,nw,nw,nw,n,nw,sw,n,nw,n,n,nw,nw,nw,nw,n,ne,sw,nw,n,n,ne,nw,nw,nw,nw,nw,nw,n,ne,n,nw,nw,nw,nw,nw,nw,nw,nw,nw,sw,n,nw,sw,nw,nw,n,nw,n,nw,nw,se,n,s,n,n,nw,nw,nw,nw,nw,nw,n,nw,nw,nw,nw,nw,nw,nw,nw,n,nw,nw,n,nw,nw,nw,ne,nw,n,nw,nw,se,s,nw,nw,ne,ne,nw,sw,nw,nw,se,se,nw,nw,nw,nw,nw,n,n,nw,nw,ne,n,nw,se,nw,nw,nw,nw,nw,nw,sw,nw,nw,n,nw,nw,s,nw,nw,n,nw,n,sw,nw,nw,nw,nw,nw,nw,nw,s,nw,se,nw,nw,nw,nw,se,nw,sw,nw,nw,nw,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,ne,nw,nw,nw,nw,nw,se,nw,nw,s,nw,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,s,n,nw,nw,nw,nw,n,sw,nw,nw,nw,sw,nw,nw,nw,nw,s,sw,sw,s,s,nw,s,nw,se,nw,nw,sw,nw,nw,nw,nw,nw,nw,nw,nw,nw,nw,ne,nw,nw,nw,nw,nw,sw,s,sw,nw,nw,se,nw,nw,nw,nw,nw,nw,sw,s,nw,ne,sw,nw,nw,nw,s,sw,nw,nw,nw,nw,nw,sw,ne,nw,ne,sw,sw,sw,nw,nw,nw,sw,se,nw,s,sw,ne,nw,nw,nw,sw,ne,sw,s,nw,nw,nw,sw,nw,nw,nw,n,sw,nw,nw,s,nw,se,nw,sw,nw,nw,sw,s,sw,nw,sw,s,sw,nw,sw,nw,n,nw,sw,sw,nw,sw,nw,nw,n,sw,sw,nw,nw,sw,s,sw,ne,n,nw,sw,sw,nw,nw,sw,s,nw,sw,nw,s,nw,sw,nw,sw,nw,sw,sw,nw,sw,sw,nw,nw,nw,ne,sw,nw,sw,sw,nw,nw,nw,se,sw,nw,sw,s,se,sw,nw,sw,nw,nw,nw,se,sw,nw,nw,sw,ne,sw,sw,n,nw,n,n,sw,sw,nw,sw,sw,sw,sw,sw,s,n,sw,sw,sw,s,sw,se,n,nw,sw,sw,ne,nw,sw,sw,s,sw,sw,sw,nw,nw,sw,nw,sw,n,sw,nw,n,ne,sw,sw,nw,sw,s,nw,sw,sw,nw,s,sw,s,sw,nw,nw,nw,sw,sw,sw,nw,n,n,sw,s,sw,s,nw,ne,nw,nw,nw,sw,sw,sw,se,nw,sw,sw,nw,s,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,sw,ne,sw,sw,sw,nw,sw,sw,nw,nw,sw,sw,sw,nw,n,sw,sw,sw,sw,se,sw,se,sw,nw,sw,sw,sw,sw,se,nw,ne,sw,sw,sw,sw,sw,nw,nw,sw,sw,sw,sw,s,nw,sw,n,sw,sw,se,sw,sw,nw,nw,sw,sw,nw,nw,sw,sw,sw,ne,s,sw,sw,s,sw,sw,sw,nw,sw,sw,sw,sw,sw,sw,s,se,n,sw,s,sw,sw,sw,sw,sw,sw,ne,se,sw,sw,sw,sw,sw,n,sw,sw,s,sw,n,sw,sw,sw,sw,sw,sw,sw,se,se,sw,sw,sw,sw,ne,sw,nw,sw,sw,sw,sw,sw,sw,n,ne,ne,sw,sw,sw,sw,sw,sw,sw,sw,se,sw,sw,ne,sw,sw,sw,sw,sw,nw,sw,sw,sw,ne,sw,n,sw,sw,sw,se,sw,sw,sw,sw,ne,sw,sw,sw,se,s,sw,sw,ne,sw,sw,sw,n,sw,sw,sw,sw,sw,ne,s,sw,sw,se,ne,sw,sw,sw,nw,ne,sw,s,s,sw,s,s,s,sw,sw,s,sw,se,sw,nw,sw,s,sw,ne,s,sw,s,sw,n,sw,sw,sw,sw,sw,sw,sw,ne,n,sw,n,sw,s,sw,sw,s,sw,ne,se,sw,s,s,sw,s,sw,sw,ne,s,sw,sw,sw,sw,s,sw,sw,nw,sw,sw,s,sw,n,s,s,nw,se,sw,sw,se,sw,sw,sw,ne,s,sw,sw,s,sw,sw,sw,sw,s,sw,s,s,ne,sw,sw,s,ne,s,se,sw,ne,s,s,sw,sw,s,nw,n,ne,sw,sw,s,s,nw,nw,sw,sw,sw,sw,sw,sw,ne,s,sw,s,sw,s,s,sw,s,sw,s,sw,sw,s,sw,se,sw,nw,nw,ne,ne,sw,sw,sw,sw,s,s,sw,sw,sw,sw,sw,nw,se,nw,sw,sw,sw,n,s,sw,sw,se,sw,sw,s,nw,sw,s,s,sw,sw,sw,s,sw,s,sw,sw,n,sw,s,sw,s,sw,ne,s,s,sw,sw,sw,s,s,sw,s,sw,s,s,se,s,sw,s,s,sw,se,sw,nw,s,sw,s,s,s,s,s,s,s,n,sw,sw,sw,sw,s,nw,s,s,sw,s,sw,sw,s,sw,se,sw,sw,s,s,sw,s,s,s,s,s,sw,nw,s,ne,sw,s,sw,sw,s,s,s,sw,sw,s,s,s,sw,nw,se,s,s,s,sw,s,s,sw,s,se,s,se,se,sw,s,s,nw,sw,s,s,s,sw,s,ne,sw,sw,sw,s,s,s,s,s,s,sw,s,sw,sw,s,s,s,s,sw,s,s,ne,ne,nw,ne,n,s,sw,s,s,nw,s,n,sw,ne,s,s,sw,sw,s,s,n,s,ne,s,sw,n,s,sw,sw,s,sw,sw,sw,se,se,s,s,s,sw,ne,s,s,s,s,n,sw,sw,s,n,s,s,s,s,nw,se,s,sw,sw,s,s,s,ne,nw,s,s,s,n,sw,s,s,s,s,s,s,s,s,s,ne,s,s,s,s,s,sw,sw,s,se,nw,s,s,se,s,s,nw,nw,s,s,s,nw,s,s,ne,sw,s,s,s,s,sw,sw,s,s,s,s,s,s,s,s,s,s,s,s,se,s,ne,sw,s,n,s,s,s,s,sw,se,sw,ne,s,sw,ne,s,n,s,n,s,se,s,s,s,sw,s,se,s,s,s,ne,s,s,s,s,s,s,s,s,s,sw,s,s,s,s,s,s,se,sw,s,s,n,s,s,s,s,nw,s,s,sw,s,n,se,nw,s,sw,s,s,s,ne,se,s,se,s,s,s,nw,nw,se,n,s,s,s,s,s,ne,se,se,nw,s,s,s,s,s,s,s,s,nw,se,nw,s,n,s,s,ne,n,n,se,s,s,s,s,s,se,sw,ne,s,s,s,s,s,s,s,s,se,nw,s,s,se,nw,s,sw,s,se,s,s,s,s,s,s,s,n,s,se,ne,se,se,s,s,s,s,se,s,s,se,se,s,s,s,se,sw,s,s,s,sw,se,s,s,nw,ne,n,nw,nw,se,s,s,se,s,s,ne,s,s,n,s,s,n,s,s,sw,s,s,s,s,s,ne,se,s,sw,nw,s,s,s,sw,n,ne,nw,s,se,ne,s,s,s,ne,se,s,n,nw,s,s,s,s,s,s,s,s,s,se,se,sw,s,s,s,s,se,se,s,n,s,s,s,s,s,s,se,se,s,s,s,se,se,se,s,ne,s,s,s,nw,s,sw,s,s,s,nw,s,nw,s,s,se,s,s,s,s,ne,s,s,s,s,s,sw,n,s,s,s,s,se,se,s,s,n,s,nw,sw,se,s,s,se,nw,s,s,s,se,sw,se,s,s,s,s,se,se,s,s,s,s,nw,se,se,s,se,ne,s,s,se,s,se,s,sw,sw,s,s,s,s,s,se,s,se,se,se,s,ne,s,nw,s,se,se,nw,s,s,ne,s,s,s,s,sw,s,n,s,s,s,s,sw,se,s,s,nw,s,ne,se,se,s,s,s,se,s,s,s,se,sw,se,n,sw,sw,se,s,s,s,s,s,s,s,s,ne,se,nw,sw,ne,s,s,s,s,sw,nw,se,s,n,nw,se,se,se,s,s,s,se,s,se,se,s,se,s,se,se,sw,nw,se,se,s,se,s,se,nw,ne,s,se,s,se,sw,s,s,se,s,n,nw,s,se,s,ne,sw,s,s,s,n,se,s,se,s,sw,se,s,sw,se,s,s,se,se,se,s,sw,se,se,s,s,s,s,n,se,s,se,nw,nw,s,se,s,s,s,se,s,se,ne,se,s,se,se,se,se,sw,se,se,se,se,se,se,n,s,se,se,n,nw,s,s,s,s,nw,se,s,s,se,s,s,nw,sw,se,s,s,s,se,se,s,se,s,se,s,sw,se,se,s,s,se,se,se,ne,n,s,s,se,se,se,se,s,s,se,se,s,se,s,s,se,sw,se,s,se,se,s,sw,se,s,sw,sw,se,s,s,s,se,sw,s,se,se,se,se,sw,se,s,s,se,se,s,s,s,s,ne,ne,s,s,se,se,se,s,se,se,se,se,se,se,s,se,se,se,n,se,se,s,se,sw,se,se,se,ne,se,se,se,se,se,nw,se,se,se,se,se,se,s,nw,se,se,se,s,se,se,s,se,s,s,ne,sw,se,se,se,s,s,se,se,s,se,se,s,se,n,se,se,s,s,se,se,ne,se,se,n,n,ne,s,se,se,s,n,s,sw,n,se,s,se,se,se,se,s,n,se,se,se,se,s,se,se,se,nw,se,se,s,se,se,se,se,sw,ne,s,se,s,se,se,se,se,n,se,se,se,se,se,se,se,se,se,se,se,se,se,se,sw,sw,se,se,se,nw,s,nw,se,se,se,se,se,se,s,s,se,se,nw,se,se,nw,nw,se,se,s,se,sw,se,se,se,se,n,ne,se,s,se,se,se,se,se,se,se,se,sw,s,se,se,sw,se,se,se,se,se,se,se,se,se,se,s,se,se,se,ne,nw,s,se,se,se,se,ne,se,s,se,se,se,se,se,se,nw,se,s,se,se,se,se,s,se,se,n,se,se,se,sw,se,sw,se,se,n,se,se,se,s,se,se,sw,ne,sw,s,se,se,se,se,sw,se,s,se,se,se,se,se,s,se,se,se,se,nw,ne,nw,se,se,n,se
\ No newline at end of file
diff --git a/AdventOfCode.2017/Inputs/Day12.txt b/AdventOfCode.2017/Inputs/Day12.txt
new file mode 100644
index 0000000..9940700
--- /dev/null
+++ b/AdventOfCode.2017/Inputs/Day12.txt
@@ -0,0 +1,2000 @@
+0 <-> 780, 1330
+1 <-> 264, 595, 1439
+2 <-> 296, 531, 1440
+3 <-> 207, 235, 1038
+4 <-> 554, 1295
+5 <-> 159, 568, 1381
+6 <-> 1134
+7 <-> 1472, 1977
+8 <-> 704
+9 <-> 783, 1082, 1795
+10 <-> 46, 653, 958
+11 <-> 55, 1931
+12 <-> 12
+13 <-> 537, 940
+14 <-> 1066, 1411, 1997
+15 <-> 1528
+16 <-> 27
+17 <-> 113, 370, 450, 982
+18 <-> 571
+19 <-> 1606
+20 <-> 803
+21 <-> 956
+22 <-> 181, 1126, 1431, 1737
+23 <-> 131, 162, 967, 1973
+24 <-> 526, 1914
+25 <-> 551, 1057
+26 <-> 1162, 1922
+27 <-> 16, 533, 1125
+28 <-> 468, 902, 1159
+29 <-> 29
+30 <-> 749, 1079, 1684
+31 <-> 1909, 1992
+32 <-> 1666
+33 <-> 426, 1662, 1883
+34 <-> 109
+35 <-> 307, 577, 727, 1763, 1948
+36 <-> 578
+37 <-> 92, 503, 1203, 1255
+38 <-> 38, 471
+39 <-> 615
+40 <-> 584, 1787
+41 <-> 591, 756
+42 <-> 888
+43 <-> 952
+44 <-> 1029
+45 <-> 45, 300, 596, 1393, 1486
+46 <-> 10, 1887
+47 <-> 592
+48 <-> 108
+49 <-> 1583
+50 <-> 1200
+51 <-> 51, 857
+52 <-> 965
+53 <-> 702, 1428
+54 <-> 1525
+55 <-> 11, 610
+56 <-> 1703
+57 <-> 1449
+58 <-> 1097
+59 <-> 1316, 1461, 1932
+60 <-> 107, 1010, 1504, 1824, 1912
+61 <-> 1677
+62 <-> 691, 714, 1530
+63 <-> 672, 1263, 1956
+64 <-> 825, 1016, 1370
+65 <-> 539, 1055, 1290
+66 <-> 1287
+67 <-> 338, 1195
+68 <-> 108, 296, 1787, 1821
+69 <-> 436, 1015, 1633
+70 <-> 262, 407, 592, 1414
+71 <-> 420, 797
+72 <-> 1393
+73 <-> 616, 993
+74 <-> 168, 175
+75 <-> 590, 1103
+76 <-> 271
+77 <-> 1309, 1496, 1627
+78 <-> 569, 1888
+79 <-> 1289, 1925
+80 <-> 193, 993
+81 <-> 500
+82 <-> 1069
+83 <-> 83, 1518
+84 <-> 1465
+85 <-> 1614
+86 <-> 474, 749, 1286, 1678
+87 <-> 160
+88 <-> 1026, 1732
+89 <-> 317, 422, 917
+90 <-> 517, 1362
+91 <-> 136
+92 <-> 37, 703
+93 <-> 1738, 1827
+94 <-> 345, 907, 1180
+95 <-> 95
+96 <-> 406, 1086, 1258
+97 <-> 97, 157
+98 <-> 1002
+99 <-> 109, 198, 654
+100 <-> 555
+101 <-> 101
+102 <-> 939
+103 <-> 616, 1266
+104 <-> 1526
+105 <-> 306, 1276, 1330
+106 <-> 1395
+107 <-> 60, 288, 1971
+108 <-> 48, 68
+109 <-> 34, 99, 578, 1042
+110 <-> 906, 1567
+111 <-> 917, 1347
+112 <-> 1291, 1384, 1695, 1988
+113 <-> 17, 1173
+114 <-> 297, 1576
+115 <-> 361
+116 <-> 117, 1084
+117 <-> 116, 164, 683, 1454
+118 <-> 1956
+119 <-> 1198
+120 <-> 171, 416
+121 <-> 1949
+122 <-> 233, 770, 1012
+123 <-> 801
+124 <-> 1406
+125 <-> 769
+126 <-> 418, 1038, 1273
+127 <-> 611, 1060, 1241
+128 <-> 576, 665, 1568
+129 <-> 862
+130 <-> 1607, 1644
+131 <-> 23, 812
+132 <-> 1097
+133 <-> 1403, 1992
+134 <-> 232
+135 <-> 959
+136 <-> 91, 1354, 1868, 1932
+137 <-> 766, 1049
+138 <-> 138
+139 <-> 139, 355
+140 <-> 1858
+141 <-> 703, 1319
+142 <-> 424
+143 <-> 869
+144 <-> 231, 338
+145 <-> 1163, 1345
+146 <-> 431, 940, 1389
+147 <-> 1282, 1784
+148 <-> 218, 1137
+149 <-> 378
+150 <-> 257, 798
+151 <-> 1603
+152 <-> 152, 189, 1151
+153 <-> 623, 1228
+154 <-> 154
+155 <-> 376, 808
+156 <-> 1726
+157 <-> 97
+158 <-> 482
+159 <-> 5
+160 <-> 87, 504, 1775
+161 <-> 873, 1047
+162 <-> 23
+163 <-> 291
+164 <-> 117, 229, 371, 1427
+165 <-> 487, 1683, 1844
+166 <-> 508
+167 <-> 278, 1228, 1453
+168 <-> 74, 1210
+169 <-> 396, 410, 1256
+170 <-> 555, 1624
+171 <-> 120, 340, 1713
+172 <-> 1748
+173 <-> 880, 1306
+174 <-> 1052, 1697
+175 <-> 74, 995
+176 <-> 1421
+177 <-> 551, 640
+178 <-> 1611
+179 <-> 1504
+180 <-> 310, 1432, 1722
+181 <-> 22
+182 <-> 1175
+183 <-> 1115
+184 <-> 184
+185 <-> 708
+186 <-> 1130
+187 <-> 944
+188 <-> 451, 593
+189 <-> 152
+190 <-> 885, 1491
+191 <-> 191
+192 <-> 1751
+193 <-> 80, 931
+194 <-> 544, 826
+195 <-> 1354
+196 <-> 705
+197 <-> 1646, 1693
+198 <-> 99
+199 <-> 1681, 1818
+200 <-> 200
+201 <-> 678, 691
+202 <-> 1084
+203 <-> 446, 1232
+204 <-> 337, 826, 1919
+205 <-> 440, 818
+206 <-> 618, 898
+207 <-> 3
+208 <-> 208
+209 <-> 574, 1760, 1774
+210 <-> 960, 1315
+211 <-> 525, 670
+212 <-> 453, 1552
+213 <-> 1164
+214 <-> 893, 1597
+215 <-> 386, 1412, 1752
+216 <-> 1800
+217 <-> 1103
+218 <-> 148, 218
+219 <-> 1135, 1216, 1404
+220 <-> 1899
+221 <-> 987, 1248
+222 <-> 706, 1199, 1916
+223 <-> 816, 1079, 1703
+224 <-> 726
+225 <-> 797
+226 <-> 396, 1482
+227 <-> 844
+228 <-> 703, 972, 1275
+229 <-> 164, 377, 662, 1048
+230 <-> 230, 661
+231 <-> 144, 1358
+232 <-> 134, 793, 1433, 1730
+233 <-> 122
+234 <-> 882
+235 <-> 3, 489
+236 <-> 945, 1346
+237 <-> 480
+238 <-> 702
+239 <-> 1008
+240 <-> 1078
+241 <-> 1103, 1844
+242 <-> 666, 1299
+243 <-> 1489
+244 <-> 423, 827, 860, 868
+245 <-> 1747
+246 <-> 659, 1446
+247 <-> 679
+248 <-> 1467, 1942
+249 <-> 1678
+250 <-> 284, 1223
+251 <-> 1513
+252 <-> 1673
+253 <-> 1084
+254 <-> 747, 1705
+255 <-> 255
+256 <-> 390
+257 <-> 150, 1439, 1804
+258 <-> 1302, 1626
+259 <-> 259, 1519
+260 <-> 449
+261 <-> 269, 641
+262 <-> 70
+263 <-> 1334, 1358
+264 <-> 1, 1843
+265 <-> 1316
+266 <-> 1045, 1053, 1264
+267 <-> 364, 1198
+268 <-> 501, 594, 732, 1919
+269 <-> 261, 681
+270 <-> 670, 1283, 1531
+271 <-> 76, 1817, 1858
+272 <-> 625, 757, 1236, 1793
+273 <-> 1255, 1539
+274 <-> 442, 1406
+275 <-> 706, 1760
+276 <-> 841, 1553, 1764
+277 <-> 1133
+278 <-> 167, 908
+279 <-> 1771
+280 <-> 280, 1583
+281 <-> 702
+282 <-> 282, 1712, 1776
+283 <-> 820, 981
+284 <-> 250
+285 <-> 680, 880, 1896
+286 <-> 286, 489
+287 <-> 608, 1204, 1423
+288 <-> 107, 1353, 1729
+289 <-> 289, 299
+290 <-> 761, 1134
+291 <-> 163, 801, 1435
+292 <-> 1217, 1525
+293 <-> 1206
+294 <-> 797, 1124, 1371
+295 <-> 335, 704
+296 <-> 2, 68, 1516
+297 <-> 114, 1036, 1987
+298 <-> 298, 588, 1430
+299 <-> 289
+300 <-> 45, 1965
+301 <-> 773, 1591
+302 <-> 1122, 1341
+303 <-> 450, 1786
+304 <-> 304
+305 <-> 724
+306 <-> 105, 1861
+307 <-> 35
+308 <-> 308, 1015
+309 <-> 930, 1011
+310 <-> 180
+311 <-> 1513
+312 <-> 646
+313 <-> 1381
+314 <-> 511, 804, 1079
+315 <-> 399
+316 <-> 948, 1169
+317 <-> 89, 725
+318 <-> 318
+319 <-> 319
+320 <-> 787
+321 <-> 1132
+322 <-> 322
+323 <-> 1376
+324 <-> 1540
+325 <-> 1448, 1944, 1995
+326 <-> 1828
+327 <-> 1886
+328 <-> 639
+329 <-> 831, 959
+330 <-> 527
+331 <-> 1399, 1535
+332 <-> 1843
+333 <-> 333, 522
+334 <-> 1512
+335 <-> 295, 885
+336 <-> 1651
+337 <-> 204, 1164, 1874
+338 <-> 67, 144, 584, 621
+339 <-> 1887
+340 <-> 171, 1861
+341 <-> 1555
+342 <-> 507
+343 <-> 1441
+344 <-> 409, 527, 1364, 1756
+345 <-> 94
+346 <-> 357, 499
+347 <-> 795, 1065, 1191
+348 <-> 914, 1800, 1982
+349 <-> 349
+350 <-> 436
+351 <-> 1472, 1514
+352 <-> 375, 884
+353 <-> 499, 567
+354 <-> 1033, 1218
+355 <-> 139
+356 <-> 866
+357 <-> 346, 1665
+358 <-> 1225
+359 <-> 359, 1429
+360 <-> 1512
+361 <-> 115, 920, 1975
+362 <-> 507, 682, 1116, 1762
+363 <-> 1583, 1737
+364 <-> 267
+365 <-> 1878, 1885
+366 <-> 1060
+367 <-> 421
+368 <-> 1362
+369 <-> 532, 1140
+370 <-> 17, 1065, 1117
+371 <-> 164
+372 <-> 372
+373 <-> 373
+374 <-> 1050
+375 <-> 352, 1311, 1446
+376 <-> 155, 1928
+377 <-> 229, 636
+378 <-> 149, 1897
+379 <-> 936
+380 <-> 1193, 1963
+381 <-> 1783
+382 <-> 1900
+383 <-> 383
+384 <-> 1630
+385 <-> 441
+386 <-> 215
+387 <-> 795, 946
+388 <-> 1457
+389 <-> 731, 1973
+390 <-> 256, 1706, 1900
+391 <-> 391
+392 <-> 1400
+393 <-> 818, 1244
+394 <-> 394, 1881
+395 <-> 395, 1656
+396 <-> 169, 226
+397 <-> 1790
+398 <-> 1260
+399 <-> 315, 399
+400 <-> 1204
+401 <-> 1606
+402 <-> 1191, 1726, 1853
+403 <-> 403
+404 <-> 1470
+405 <-> 1924
+406 <-> 96, 413, 1201
+407 <-> 70
+408 <-> 1063, 1216, 1586
+409 <-> 344, 409, 1625, 1803
+410 <-> 169, 1732
+411 <-> 1599
+412 <-> 889, 1460
+413 <-> 406, 761, 1918
+414 <-> 661
+415 <-> 442, 962, 1200
+416 <-> 120, 503
+417 <-> 446, 612, 1007
+418 <-> 126, 797, 1478, 1857
+419 <-> 1060, 1350, 1459, 1736
+420 <-> 71, 978, 1215
+421 <-> 367, 665, 1385, 1415
+422 <-> 89, 679, 1418
+423 <-> 244
+424 <-> 142, 1813
+425 <-> 627, 981
+426 <-> 33
+427 <-> 1172, 1495, 1740
+428 <-> 1869
+429 <-> 966, 986, 1162, 1658
+430 <-> 1866
+431 <-> 146, 1523, 1934
+432 <-> 558, 811, 944
+433 <-> 693, 1291
+434 <-> 766
+435 <-> 1784
+436 <-> 69, 350, 1064
+437 <-> 766, 817, 882, 1481
+438 <-> 742, 1159
+439 <-> 724, 1518
+440 <-> 205
+441 <-> 385, 1206
+442 <-> 274, 415, 442, 821
+443 <-> 1088, 1533
+444 <-> 666, 1260
+445 <-> 591, 1030, 1395, 1722
+446 <-> 203, 417, 1278, 1494, 1507
+447 <-> 447
+448 <-> 1599, 1882
+449 <-> 260, 1758
+450 <-> 17, 303, 1970
+451 <-> 188
+452 <-> 658, 763, 769
+453 <-> 212
+454 <-> 605
+455 <-> 478
+456 <-> 720, 1139, 1546
+457 <-> 598, 1127, 1496, 1518
+458 <-> 635
+459 <-> 1068
+460 <-> 1080, 1088, 1857
+461 <-> 739
+462 <-> 1344
+463 <-> 1775
+464 <-> 593, 1957
+465 <-> 703, 745, 1145
+466 <-> 1550, 1980
+467 <-> 467
+468 <-> 28
+469 <-> 1278
+470 <-> 470
+471 <-> 38, 996, 1626
+472 <-> 1933
+473 <-> 799
+474 <-> 86, 696, 1228
+475 <-> 491, 1250, 1739
+476 <-> 726
+477 <-> 1687
+478 <-> 455, 834, 835, 1389, 1983
+479 <-> 479
+480 <-> 237, 576
+481 <-> 791, 1370
+482 <-> 158, 1365
+483 <-> 761, 893
+484 <-> 1192
+485 <-> 1301
+486 <-> 1431
+487 <-> 165, 1119
+488 <-> 789
+489 <-> 235, 286
+490 <-> 490
+491 <-> 475, 1775
+492 <-> 1280, 1758
+493 <-> 1007, 1152
+494 <-> 1747
+495 <-> 495, 879
+496 <-> 1219
+497 <-> 643, 1118
+498 <-> 1010, 1529
+499 <-> 346, 353, 697, 1303
+500 <-> 81, 1700
+501 <-> 268
+502 <-> 502
+503 <-> 37, 416, 1121, 1740
+504 <-> 160, 909
+505 <-> 525, 1686, 1940
+506 <-> 1292, 1380
+507 <-> 342, 362, 969, 1674
+508 <-> 166, 1233
+509 <-> 1069
+510 <-> 636
+511 <-> 314, 1759
+512 <-> 1218, 1726
+513 <-> 1008, 1361, 1679
+514 <-> 1280
+515 <-> 1789
+516 <-> 619, 1835
+517 <-> 90, 1362, 1537
+518 <-> 880
+519 <-> 1329
+520 <-> 1248, 1441
+521 <-> 743, 1141, 1534, 1743
+522 <-> 333, 689
+523 <-> 1233
+524 <-> 860
+525 <-> 211, 505
+526 <-> 24, 984, 1503
+527 <-> 330, 344, 771, 1243
+528 <-> 898
+529 <-> 597
+530 <-> 1220, 1282
+531 <-> 2
+532 <-> 369, 821, 1806, 1937
+533 <-> 27, 1102
+534 <-> 1643, 1870
+535 <-> 569, 772
+536 <-> 536
+537 <-> 13
+538 <-> 1060, 1710
+539 <-> 65, 1002
+540 <-> 833, 1021, 1301
+541 <-> 1677
+542 <-> 542
+543 <-> 1242
+544 <-> 194, 698, 716, 1895
+545 <-> 1348, 1584
+546 <-> 797, 1622
+547 <-> 871, 1761
+548 <-> 1666
+549 <-> 1485
+550 <-> 1363, 1587
+551 <-> 25, 177, 645, 1311
+552 <-> 1208
+553 <-> 840
+554 <-> 4, 1454
+555 <-> 100, 170, 898, 1075, 1828, 1989
+556 <-> 924, 1614
+557 <-> 557
+558 <-> 432, 558
+559 <-> 1680
+560 <-> 1667
+561 <-> 760
+562 <-> 1668, 1799
+563 <-> 738
+564 <-> 1062, 1142, 1313
+565 <-> 750
+566 <-> 1104, 1614
+567 <-> 353, 744
+568 <-> 5, 568, 1338
+569 <-> 78, 535, 881
+570 <-> 600, 1516
+571 <-> 18, 1312, 1414, 1669
+572 <-> 572, 1958
+573 <-> 967, 1419
+574 <-> 209
+575 <-> 1013, 1087
+576 <-> 128, 480
+577 <-> 35, 577, 580
+578 <-> 36, 109
+579 <-> 1417
+580 <-> 577, 601, 700
+581 <-> 815, 1327, 1749
+582 <-> 891, 1263
+583 <-> 1652
+584 <-> 40, 338
+585 <-> 585
+586 <-> 640, 688, 1258, 1331
+587 <-> 1472
+588 <-> 298
+589 <-> 1170
+590 <-> 75, 1054
+591 <-> 41, 445
+592 <-> 47, 70
+593 <-> 188, 464, 1259, 1579
+594 <-> 268, 1194
+595 <-> 1, 1367, 1501
+596 <-> 45
+597 <-> 529, 626, 1237
+598 <-> 457, 648, 699
+599 <-> 1108, 1592
+600 <-> 570, 789, 1672
+601 <-> 580, 1298
+602 <-> 861, 1394
+603 <-> 1297, 1994
+604 <-> 1136
+605 <-> 454, 605
+606 <-> 832, 1109
+607 <-> 954, 1138
+608 <-> 287, 1971
+609 <-> 888
+610 <-> 55, 1580
+611 <-> 127, 710, 1087
+612 <-> 417, 950, 1428, 1464
+613 <-> 672, 1426
+614 <-> 794, 1724
+615 <-> 39, 848
+616 <-> 73, 103, 616
+617 <-> 726, 1026
+618 <-> 206, 1676
+619 <-> 516, 1204
+620 <-> 925
+621 <-> 338
+622 <-> 989
+623 <-> 153
+624 <-> 824, 1566, 1966
+625 <-> 272, 1326
+626 <-> 597, 750
+627 <-> 425
+628 <-> 1181, 1541, 1704
+629 <-> 1370, 1805
+630 <-> 630, 763
+631 <-> 1709
+632 <-> 1315, 1848
+633 <-> 1501
+634 <-> 674, 871
+635 <-> 458, 811
+636 <-> 377, 510, 1488
+637 <-> 1337
+638 <-> 781
+639 <-> 328, 1399
+640 <-> 177, 586, 1202, 1332, 1847
+641 <-> 261, 1942
+642 <-> 819
+643 <-> 497, 1089
+644 <-> 1661
+645 <-> 551
+646 <-> 312, 938, 1642, 1764
+647 <-> 1437
+648 <-> 598
+649 <-> 784, 1154, 1746
+650 <-> 1207, 1268
+651 <-> 1240, 1797
+652 <-> 1254
+653 <-> 10, 739, 764
+654 <-> 99, 1759
+655 <-> 895, 1784
+656 <-> 656, 701, 738
+657 <-> 1170
+658 <-> 452
+659 <-> 246
+660 <-> 809
+661 <-> 230, 414
+662 <-> 229
+663 <-> 1133, 1231
+664 <-> 745, 820
+665 <-> 128, 421
+666 <-> 242, 444, 926
+667 <-> 955, 1762
+668 <-> 1843
+669 <-> 1384, 1849
+670 <-> 211, 270, 1836
+671 <-> 1415
+672 <-> 63, 613, 1864
+673 <-> 964, 1973
+674 <-> 634, 1479, 1554
+675 <-> 1390
+676 <-> 1468, 1855
+677 <-> 1632
+678 <-> 201, 1445
+679 <-> 247, 422, 1401, 1484
+680 <-> 285
+681 <-> 269, 1115
+682 <-> 362, 682
+683 <-> 117, 1826
+684 <-> 977, 1458
+685 <-> 812
+686 <-> 1214, 1690, 1886
+687 <-> 1752
+688 <-> 586
+689 <-> 522
+690 <-> 1077, 1454
+691 <-> 62, 201, 815, 1019
+692 <-> 1454
+693 <-> 433, 941
+694 <-> 852
+695 <-> 695
+696 <-> 474
+697 <-> 499
+698 <-> 544
+699 <-> 598, 1448
+700 <-> 580
+701 <-> 656
+702 <-> 53, 238, 281
+703 <-> 92, 141, 228, 465, 1326
+704 <-> 8, 295, 1939
+705 <-> 196, 1099
+706 <-> 222, 275, 885, 905, 1531
+707 <-> 707, 1981
+708 <-> 185, 708, 1182, 1891, 1999
+709 <-> 1911
+710 <-> 611
+711 <-> 711, 1150
+712 <-> 1833
+713 <-> 713
+714 <-> 62, 1011, 1096, 1666
+715 <-> 1094
+716 <-> 544, 992
+717 <-> 1297
+718 <-> 718, 1727
+719 <-> 996
+720 <-> 456, 1388, 1748
+721 <-> 1331, 1458
+722 <-> 1535
+723 <-> 723
+724 <-> 305, 439
+725 <-> 317, 1854
+726 <-> 224, 476, 617, 1123
+727 <-> 35, 1249
+728 <-> 1369
+729 <-> 1537
+730 <-> 730, 1212
+731 <-> 389, 1815
+732 <-> 268
+733 <-> 1199
+734 <-> 919
+735 <-> 1627, 1694
+736 <-> 1036, 1319
+737 <-> 1345
+738 <-> 563, 656
+739 <-> 461, 653
+740 <-> 1069
+741 <-> 1436
+742 <-> 438, 1879, 1895
+743 <-> 521, 1657
+744 <-> 567
+745 <-> 465, 664
+746 <-> 873, 998
+747 <-> 254, 1380
+748 <-> 1089, 1329
+749 <-> 30, 86
+750 <-> 565, 626
+751 <-> 1362
+752 <-> 752
+753 <-> 840, 1066, 1424, 1745
+754 <-> 854, 1534, 1964
+755 <-> 1516, 1907
+756 <-> 41, 1069
+757 <-> 272
+758 <-> 1792
+759 <-> 1068
+760 <-> 561, 1048, 1377
+761 <-> 290, 413, 483, 1457
+762 <-> 1170
+763 <-> 452, 630
+764 <-> 653, 1521
+765 <-> 1928, 1986
+766 <-> 137, 434, 437
+767 <-> 1664
+768 <-> 924, 1562, 1923
+769 <-> 125, 452
+770 <-> 122, 851
+771 <-> 527, 1046, 1767
+772 <-> 535, 1056
+773 <-> 301, 1613, 1751
+774 <-> 903, 1110, 1318, 1849
+775 <-> 1640
+776 <-> 776
+777 <-> 777, 1593, 1880
+778 <-> 1194, 1524
+779 <-> 1299
+780 <-> 0
+781 <-> 638, 1434, 1448
+782 <-> 1540, 1554
+783 <-> 9
+784 <-> 649, 1017
+785 <-> 840, 915, 1325
+786 <-> 1424
+787 <-> 320, 1049
+788 <-> 1273
+789 <-> 488, 600
+790 <-> 924, 1085, 1775
+791 <-> 481
+792 <-> 1796
+793 <-> 232, 1860
+794 <-> 614, 1309
+795 <-> 347, 387
+796 <-> 796, 1059
+797 <-> 71, 225, 294, 418, 546
+798 <-> 150, 1818
+799 <-> 473, 1224
+800 <-> 1864
+801 <-> 123, 291, 1546
+802 <-> 802, 1648
+803 <-> 20, 803
+804 <-> 314
+805 <-> 1721
+806 <-> 1520
+807 <-> 1476
+808 <-> 155, 808
+809 <-> 660, 1880
+810 <-> 1816
+811 <-> 432, 635, 847
+812 <-> 131, 685, 1411
+813 <-> 1083
+814 <-> 1348
+815 <-> 581, 691
+816 <-> 223
+817 <-> 437, 1702
+818 <-> 205, 393, 1751
+819 <-> 642, 1161
+820 <-> 283, 664, 839, 1157
+821 <-> 442, 532, 1310, 1618, 1992
+822 <-> 1743
+823 <-> 1174
+824 <-> 624, 1051
+825 <-> 64, 1838
+826 <-> 194, 204, 1149
+827 <-> 244
+828 <-> 1791, 1930, 1936
+829 <-> 829, 1398
+830 <-> 1816
+831 <-> 329, 943, 1612
+832 <-> 606, 1223
+833 <-> 540, 833
+834 <-> 478
+835 <-> 478, 835, 1160
+836 <-> 906, 1558, 1905
+837 <-> 837, 1544
+838 <-> 883
+839 <-> 820
+840 <-> 553, 753, 785
+841 <-> 276
+842 <-> 1639
+843 <-> 843
+844 <-> 227, 1436
+845 <-> 845
+846 <-> 1266
+847 <-> 811, 1268, 1386, 1766
+848 <-> 615, 949
+849 <-> 1616
+850 <-> 1334, 1567, 1698
+851 <-> 770, 1807
+852 <-> 694, 1293, 1946
+853 <-> 967
+854 <-> 754
+855 <-> 1655
+856 <-> 959, 1706, 1733
+857 <-> 51
+858 <-> 866, 1949
+859 <-> 859
+860 <-> 244, 524, 999
+861 <-> 602, 1369, 1568
+862 <-> 129, 863, 1179
+863 <-> 862, 912, 1688, 1707, 1884
+864 <-> 916
+865 <-> 865, 1808
+866 <-> 356, 858
+867 <-> 1624
+868 <-> 244
+869 <-> 143, 916
+870 <-> 1030
+871 <-> 547, 634, 1638
+872 <-> 901, 1155, 1300
+873 <-> 161, 746, 1413
+874 <-> 874, 1985
+875 <-> 900, 1212, 1616
+876 <-> 876
+877 <-> 1197
+878 <-> 1732
+879 <-> 495, 1090
+880 <-> 173, 285, 518, 1400
+881 <-> 569, 1109
+882 <-> 234, 437, 1829
+883 <-> 838, 1416, 1492
+884 <-> 352, 1108
+885 <-> 190, 335, 706, 1802
+886 <-> 1930
+887 <-> 986
+888 <-> 42, 609, 1710
+889 <-> 412, 1242
+890 <-> 1116, 1335
+891 <-> 582
+892 <-> 1072, 1378, 1510
+893 <-> 214, 483, 1421
+894 <-> 1329
+895 <-> 655, 1480
+896 <-> 907
+897 <-> 897, 1191, 1753
+898 <-> 206, 528, 555, 1572, 1783
+899 <-> 1885
+900 <-> 875
+901 <-> 872, 1322
+902 <-> 28, 1490
+903 <-> 774, 1839
+904 <-> 904, 1392
+905 <-> 706, 1984
+906 <-> 110, 836, 1000, 1232
+907 <-> 94, 896, 907
+908 <-> 278, 1136
+909 <-> 504
+910 <-> 1938
+911 <-> 1507
+912 <-> 863, 1581, 1849
+913 <-> 1694
+914 <-> 348
+915 <-> 785
+916 <-> 864, 869, 1771
+917 <-> 89, 111
+918 <-> 1146, 1397
+919 <-> 734, 1647, 1936
+920 <-> 361, 1287
+921 <-> 977
+922 <-> 922
+923 <-> 1669
+924 <-> 556, 768, 790
+925 <-> 620, 1207, 1765
+926 <-> 666, 1801
+927 <-> 1083, 1151
+928 <-> 1265
+929 <-> 1082
+930 <-> 309, 1663
+931 <-> 193
+932 <-> 932, 1018
+933 <-> 991
+934 <-> 1554
+935 <-> 1826
+936 <-> 379, 988, 1011, 1871
+937 <-> 1585, 1694
+938 <-> 646, 1935
+939 <-> 102, 1355
+940 <-> 13, 146, 1337
+941 <-> 693, 1789
+942 <-> 1083, 1723
+943 <-> 831, 1471
+944 <-> 187, 432
+945 <-> 236
+946 <-> 387
+947 <-> 1579
+948 <-> 316, 1044, 1574
+949 <-> 848, 1914
+950 <-> 612
+951 <-> 1012, 1271
+952 <-> 43, 1535, 1574
+953 <-> 1986
+954 <-> 607, 1055, 1452
+955 <-> 667
+956 <-> 21, 1869
+957 <-> 957
+958 <-> 10
+959 <-> 135, 329, 856
+960 <-> 210, 1885
+961 <-> 1904
+962 <-> 415, 1658
+963 <-> 1156
+964 <-> 673
+965 <-> 52, 981
+966 <-> 429, 1734
+967 <-> 23, 573, 853
+968 <-> 1975
+969 <-> 507, 1865
+970 <-> 1870
+971 <-> 1175
+972 <-> 228
+973 <-> 1068
+974 <-> 1421
+975 <-> 975
+976 <-> 1401
+977 <-> 684, 921, 1798
+978 <-> 420
+979 <-> 1485
+980 <-> 1867, 1893
+981 <-> 283, 425, 965
+982 <-> 17, 1638
+983 <-> 1542
+984 <-> 526
+985 <-> 985
+986 <-> 429, 887
+987 <-> 221, 1784
+988 <-> 936
+989 <-> 622, 1114, 1154
+990 <-> 1023, 1027
+991 <-> 933, 991
+992 <-> 716
+993 <-> 73, 80
+994 <-> 1221, 1905
+995 <-> 175
+996 <-> 471, 719, 1379
+997 <-> 1790
+998 <-> 746
+999 <-> 860, 999, 1346
+1000 <-> 906
+1001 <-> 1171, 1649, 1850
+1002 <-> 98, 539, 1998
+1003 <-> 1244
+1004 <-> 1473
+1005 <-> 1706
+1006 <-> 1685
+1007 <-> 417, 493, 1845, 1980
+1008 <-> 239, 513, 1536
+1009 <-> 1202, 1442
+1010 <-> 60, 498, 1641
+1011 <-> 309, 714, 936, 1958
+1012 <-> 122, 951
+1013 <-> 575, 1239
+1014 <-> 1014, 1555, 1961
+1015 <-> 69, 308, 1559
+1016 <-> 64
+1017 <-> 784, 1586, 1643
+1018 <-> 932
+1019 <-> 691
+1020 <-> 1877
+1021 <-> 540, 1743, 1798
+1022 <-> 1900
+1023 <-> 990
+1024 <-> 1024
+1025 <-> 1444
+1026 <-> 88, 617
+1027 <-> 990, 1027, 1345
+1028 <-> 1228
+1029 <-> 44, 1264
+1030 <-> 445, 870, 1130
+1031 <-> 1158, 1610
+1032 <-> 1400
+1033 <-> 354
+1034 <-> 1802, 1849
+1035 <-> 1474
+1036 <-> 297, 736
+1037 <-> 1473, 1949
+1038 <-> 3, 126
+1039 <-> 1046
+1040 <-> 1082, 1100
+1041 <-> 1043
+1042 <-> 109
+1043 <-> 1041, 1520
+1044 <-> 948, 1977
+1045 <-> 266, 1189, 1972
+1046 <-> 771, 1039
+1047 <-> 161, 1168
+1048 <-> 229, 760
+1049 <-> 137, 787, 1738
+1050 <-> 374, 1925
+1051 <-> 824, 1631, 1989
+1052 <-> 174
+1053 <-> 266
+1054 <-> 590
+1055 <-> 65, 954, 1235
+1056 <-> 772, 1368
+1057 <-> 25, 1098
+1058 <-> 1792, 1819
+1059 <-> 796
+1060 <-> 127, 366, 419, 538
+1061 <-> 1665, 1887, 1983
+1062 <-> 564
+1063 <-> 408
+1064 <-> 436, 1073
+1065 <-> 347, 370
+1066 <-> 14, 753
+1067 <-> 1622
+1068 <-> 459, 759, 973, 1844
+1069 <-> 82, 509, 740, 756, 1099, 1259, 1351
+1070 <-> 1498
+1071 <-> 1935
+1072 <-> 892, 1072
+1073 <-> 1064, 1908
+1074 <-> 1609
+1075 <-> 555
+1076 <-> 1076
+1077 <-> 690
+1078 <-> 240, 1433
+1079 <-> 30, 223, 314, 1112
+1080 <-> 460
+1081 <-> 1574
+1082 <-> 9, 929, 1040, 1382
+1083 <-> 813, 927, 942
+1084 <-> 116, 202, 253, 1084, 1465
+1085 <-> 790
+1086 <-> 96, 1190
+1087 <-> 575, 611, 1412
+1088 <-> 443, 460
+1089 <-> 643, 748
+1090 <-> 879, 1208, 1288
+1091 <-> 1091, 1716
+1092 <-> 1456, 1606, 1925
+1093 <-> 1158, 1997
+1094 <-> 715, 1297, 1313, 1412, 1508
+1095 <-> 1095
+1096 <-> 714
+1097 <-> 58, 132, 1587
+1098 <-> 1057, 1254
+1099 <-> 705, 1069
+1100 <-> 1040, 1813
+1101 <-> 1101
+1102 <-> 533
+1103 <-> 75, 217, 241, 1188
+1104 <-> 566, 1792
+1105 <-> 1646
+1106 <-> 1107, 1574
+1107 <-> 1106
+1108 <-> 599, 884, 1144, 1476
+1109 <-> 606, 881
+1110 <-> 774
+1111 <-> 1475, 1560, 1663
+1112 <-> 1079
+1113 <-> 1113, 1715
+1114 <-> 989, 1910
+1115 <-> 183, 681, 1476, 1866
+1116 <-> 362, 890, 1271
+1117 <-> 370, 1757
+1118 <-> 497, 1977
+1119 <-> 487
+1120 <-> 1164
+1121 <-> 503
+1122 <-> 302, 1655
+1123 <-> 726, 1856
+1124 <-> 294
+1125 <-> 27, 1570
+1126 <-> 22
+1127 <-> 457, 1587
+1128 <-> 1320
+1129 <-> 1129, 1230
+1130 <-> 186, 1030, 1145, 1628
+1131 <-> 1151
+1132 <-> 321, 1902
+1133 <-> 277, 663, 1577
+1134 <-> 6, 290, 1976
+1135 <-> 219
+1136 <-> 604, 908
+1137 <-> 148, 1383
+1138 <-> 607
+1139 <-> 456, 1654
+1140 <-> 369
+1141 <-> 521
+1142 <-> 564, 1143
+1143 <-> 1142
+1144 <-> 1108
+1145 <-> 465, 1130, 1842
+1146 <-> 918
+1147 <-> 1282
+1148 <-> 1148
+1149 <-> 826
+1150 <-> 711
+1151 <-> 152, 927, 1131
+1152 <-> 493, 1720
+1153 <-> 1865
+1154 <-> 649, 989
+1155 <-> 872
+1156 <-> 963, 1668
+1157 <-> 820
+1158 <-> 1031, 1093, 1790
+1159 <-> 28, 438
+1160 <-> 835
+1161 <-> 819, 1789
+1162 <-> 26, 429, 1374
+1163 <-> 145
+1164 <-> 213, 337, 1120, 1366
+1165 <-> 1843
+1166 <-> 1884
+1167 <-> 1494, 1799
+1168 <-> 1047
+1169 <-> 316
+1170 <-> 589, 657, 762, 1685
+1171 <-> 1001
+1172 <-> 427, 1226
+1173 <-> 113, 1621
+1174 <-> 823, 1174
+1175 <-> 182, 971, 1405
+1176 <-> 1462
+1177 <-> 1177
+1178 <-> 1858, 1920
+1179 <-> 862, 1664
+1180 <-> 94
+1181 <-> 628, 1321
+1182 <-> 708
+1183 <-> 1693
+1184 <-> 1879
+1185 <-> 1674
+1186 <-> 1186, 1575
+1187 <-> 1341, 1718
+1188 <-> 1103
+1189 <-> 1045, 1433
+1190 <-> 1086
+1191 <-> 347, 402, 897
+1192 <-> 484, 1603, 1615
+1193 <-> 380, 1193
+1194 <-> 594, 778
+1195 <-> 67
+1196 <-> 1747
+1197 <-> 877, 1197
+1198 <-> 119, 267, 1380
+1199 <-> 222, 733
+1200 <-> 50, 415
+1201 <-> 406
+1202 <-> 640, 1009
+1203 <-> 37
+1204 <-> 287, 400, 619
+1205 <-> 1294
+1206 <-> 293, 441, 1444, 1899
+1207 <-> 650, 925
+1208 <-> 552, 1090
+1209 <-> 1797
+1210 <-> 168, 1264
+1211 <-> 1784
+1212 <-> 730, 875, 1515, 1636
+1213 <-> 1989
+1214 <-> 686, 1214
+1215 <-> 420
+1216 <-> 219, 408, 1651
+1217 <-> 292
+1218 <-> 354, 512
+1219 <-> 496, 1905
+1220 <-> 530
+1221 <-> 994
+1222 <-> 1222
+1223 <-> 250, 832
+1224 <-> 799, 1224
+1225 <-> 358, 1527
+1226 <-> 1172, 1619, 1721
+1227 <-> 1509
+1228 <-> 153, 167, 474, 1028
+1229 <-> 1538, 1959
+1230 <-> 1129
+1231 <-> 663
+1232 <-> 203, 906
+1233 <-> 508, 523, 1638
+1234 <-> 1693
+1235 <-> 1055
+1236 <-> 272
+1237 <-> 597, 1729
+1238 <-> 1656, 1933
+1239 <-> 1013
+1240 <-> 651
+1241 <-> 127, 1689, 1741
+1242 <-> 543, 889
+1243 <-> 527
+1244 <-> 393, 1003
+1245 <-> 1245
+1246 <-> 1733
+1247 <-> 1357, 1543
+1248 <-> 221, 520, 1810
+1249 <-> 727
+1250 <-> 475, 1372, 1444
+1251 <-> 1313
+1252 <-> 1364
+1253 <-> 1274
+1254 <-> 652, 1098
+1255 <-> 37, 273
+1256 <-> 169, 1671
+1257 <-> 1257
+1258 <-> 96, 586, 1474, 1513
+1259 <-> 593, 1069
+1260 <-> 398, 444, 1937
+1261 <-> 1684
+1262 <-> 1328, 1631
+1263 <-> 63, 582, 1284, 1637
+1264 <-> 266, 1029, 1210
+1265 <-> 928, 1376, 1629
+1266 <-> 103, 846
+1267 <-> 1733
+1268 <-> 650, 847, 1902
+1269 <-> 1269
+1270 <-> 1754
+1271 <-> 951, 1116, 1772
+1272 <-> 1453
+1273 <-> 126, 788
+1274 <-> 1253, 1420, 1503
+1275 <-> 228
+1276 <-> 105
+1277 <-> 1979
+1278 <-> 446, 469
+1279 <-> 1334
+1280 <-> 492, 514, 1405, 1941
+1281 <-> 1399
+1282 <-> 147, 530, 1147
+1283 <-> 270
+1284 <-> 1263
+1285 <-> 1976
+1286 <-> 86
+1287 <-> 66, 920
+1288 <-> 1090, 1588
+1289 <-> 79, 1619
+1290 <-> 65, 1368
+1291 <-> 112, 433
+1292 <-> 506
+1293 <-> 852
+1294 <-> 1205, 1813
+1295 <-> 4, 1542
+1296 <-> 1767
+1297 <-> 603, 717, 1094, 1340
+1298 <-> 601, 1387
+1299 <-> 242, 779, 1677
+1300 <-> 872
+1301 <-> 485, 540
+1302 <-> 258
+1303 <-> 499
+1304 <-> 1382, 1906
+1305 <-> 1305
+1306 <-> 173
+1307 <-> 1389, 1589
+1308 <-> 1308
+1309 <-> 77, 794, 1477
+1310 <-> 821, 1317
+1311 <-> 375, 551
+1312 <-> 571, 1843
+1313 <-> 564, 1094, 1251
+1314 <-> 1590
+1315 <-> 210, 632
+1316 <-> 59, 265, 1436, 1872
+1317 <-> 1310
+1318 <-> 774, 1511
+1319 <-> 141, 736
+1320 <-> 1128, 1799
+1321 <-> 1181, 1833
+1322 <-> 901, 1558
+1323 <-> 1846, 1906
+1324 <-> 1981
+1325 <-> 785
+1326 <-> 625, 703
+1327 <-> 581
+1328 <-> 1262
+1329 <-> 519, 748, 894
+1330 <-> 0, 105, 1851, 1979
+1331 <-> 586, 721
+1332 <-> 640
+1333 <-> 1544
+1334 <-> 263, 850, 1279
+1335 <-> 890
+1336 <-> 1336
+1337 <-> 637, 940
+1338 <-> 568
+1339 <-> 1383, 1449
+1340 <-> 1297
+1341 <-> 302, 1187, 1686, 1830
+1342 <-> 1553, 1658, 1725, 1822
+1343 <-> 1821
+1344 <-> 462, 1508
+1345 <-> 145, 737, 1027, 1947
+1346 <-> 236, 999
+1347 <-> 111
+1348 <-> 545, 814
+1349 <-> 1349, 1773, 1969
+1350 <-> 419
+1351 <-> 1069, 1384, 1946
+1352 <-> 1410
+1353 <-> 288, 1862, 1919
+1354 <-> 136, 195, 1739
+1355 <-> 939, 1366
+1356 <-> 1623
+1357 <-> 1247, 1650, 1949
+1358 <-> 231, 263
+1359 <-> 1422
+1360 <-> 1676
+1361 <-> 513, 1361, 1852
+1362 <-> 90, 368, 517, 751
+1363 <-> 550
+1364 <-> 344, 1252
+1365 <-> 482, 1968
+1366 <-> 1164, 1355
+1367 <-> 595
+1368 <-> 1056, 1290, 1634
+1369 <-> 728, 861, 1884
+1370 <-> 64, 481, 629
+1371 <-> 294, 1825
+1372 <-> 1250
+1373 <-> 1373, 1732
+1374 <-> 1162
+1375 <-> 1572, 1615
+1376 <-> 323, 1265
+1377 <-> 760
+1378 <-> 892
+1379 <-> 996
+1380 <-> 506, 747, 1198, 1545
+1381 <-> 5, 313
+1382 <-> 1082, 1304
+1383 <-> 1137, 1339
+1384 <-> 112, 669, 1351
+1385 <-> 421
+1386 <-> 847
+1387 <-> 1298, 1463
+1388 <-> 720
+1389 <-> 146, 478, 1307
+1390 <-> 675, 1390
+1391 <-> 1475, 1950
+1392 <-> 904
+1393 <-> 45, 72, 1815, 1954
+1394 <-> 602, 1594
+1395 <-> 106, 445, 1863, 1952
+1396 <-> 1495
+1397 <-> 918, 1925
+1398 <-> 829
+1399 <-> 331, 639, 1281
+1400 <-> 392, 880, 1032, 1422, 1673
+1401 <-> 679, 976
+1402 <-> 1830
+1403 <-> 133
+1404 <-> 219
+1405 <-> 1175, 1280
+1406 <-> 124, 274
+1407 <-> 1980
+1408 <-> 1624, 1717
+1409 <-> 1560
+1410 <-> 1352, 1410
+1411 <-> 14, 812, 1968
+1412 <-> 215, 1087, 1094
+1413 <-> 873, 1413
+1414 <-> 70, 571, 1701, 1943
+1415 <-> 421, 671
+1416 <-> 883, 1416
+1417 <-> 579, 1870
+1418 <-> 422, 1460
+1419 <-> 573
+1420 <-> 1274, 1864
+1421 <-> 176, 893, 974
+1422 <-> 1359, 1400
+1423 <-> 287
+1424 <-> 753, 786
+1425 <-> 1685
+1426 <-> 613, 1514
+1427 <-> 164
+1428 <-> 53, 612
+1429 <-> 359, 1556
+1430 <-> 298, 1927, 1955
+1431 <-> 22, 486
+1432 <-> 180
+1433 <-> 232, 1078, 1189, 1869
+1434 <-> 781
+1435 <-> 291, 1599
+1436 <-> 741, 844, 1316, 1577
+1437 <-> 647, 1722
+1438 <-> 1438
+1439 <-> 1, 257
+1440 <-> 2
+1441 <-> 343, 520
+1442 <-> 1009
+1443 <-> 1443, 1869
+1444 <-> 1025, 1206, 1250
+1445 <-> 678
+1446 <-> 246, 375
+1447 <-> 1981
+1448 <-> 325, 699, 781
+1449 <-> 57, 1339
+1450 <-> 1668
+1451 <-> 1692, 1802, 1911, 1951
+1452 <-> 954
+1453 <-> 167, 1272
+1454 <-> 117, 554, 690, 692
+1455 <-> 1581
+1456 <-> 1092, 1696
+1457 <-> 388, 761
+1458 <-> 684, 721
+1459 <-> 419, 1608
+1460 <-> 412, 1418, 1460
+1461 <-> 59
+1462 <-> 1176, 1571, 1979
+1463 <-> 1387, 1771
+1464 <-> 612
+1465 <-> 84, 1084
+1466 <-> 1553
+1467 <-> 248, 1709
+1468 <-> 676
+1469 <-> 1603
+1470 <-> 404, 1647
+1471 <-> 943, 1471
+1472 <-> 7, 351, 587, 1903
+1473 <-> 1004, 1037
+1474 <-> 1035, 1258
+1475 <-> 1111, 1391
+1476 <-> 807, 1108, 1115
+1477 <-> 1309
+1478 <-> 418
+1479 <-> 674
+1480 <-> 895, 1559
+1481 <-> 437
+1482 <-> 226
+1483 <-> 1510
+1484 <-> 679
+1485 <-> 549, 979, 1650
+1486 <-> 45, 1675, 1684
+1487 <-> 1632
+1488 <-> 636, 1590
+1489 <-> 243, 1489
+1490 <-> 902
+1491 <-> 190
+1492 <-> 883, 1661
+1493 <-> 1636
+1494 <-> 446, 1167
+1495 <-> 427, 1396
+1496 <-> 77, 457
+1497 <-> 1497
+1498 <-> 1070, 1498
+1499 <-> 1499
+1500 <-> 1781
+1501 <-> 595, 633
+1502 <-> 1502, 1782
+1503 <-> 526, 1274
+1504 <-> 60, 179
+1505 <-> 1646
+1506 <-> 1506
+1507 <-> 446, 911, 1978
+1508 <-> 1094, 1344, 1805
+1509 <-> 1227, 1979
+1510 <-> 892, 1483
+1511 <-> 1318
+1512 <-> 334, 360, 1642
+1513 <-> 251, 311, 1258
+1514 <-> 351, 1426
+1515 <-> 1212, 1580
+1516 <-> 296, 570, 755
+1517 <-> 1901
+1518 <-> 83, 439, 457
+1519 <-> 259
+1520 <-> 806, 1043, 1566
+1521 <-> 764
+1522 <-> 1912
+1523 <-> 431
+1524 <-> 778
+1525 <-> 54, 292, 1525
+1526 <-> 104, 1526
+1527 <-> 1225, 1527
+1528 <-> 15, 1683, 1794
+1529 <-> 498
+1530 <-> 62
+1531 <-> 270, 706
+1532 <-> 1942
+1533 <-> 443
+1534 <-> 521, 754
+1535 <-> 331, 722, 952, 1551
+1536 <-> 1008
+1537 <-> 517, 729, 1667
+1538 <-> 1229
+1539 <-> 273, 1582
+1540 <-> 324, 782
+1541 <-> 628
+1542 <-> 983, 1295, 1755
+1543 <-> 1247
+1544 <-> 837, 1333
+1545 <-> 1380, 1704
+1546 <-> 456, 801, 1717, 1993
+1547 <-> 1555
+1548 <-> 1745
+1549 <-> 1634
+1550 <-> 466, 1982
+1551 <-> 1535
+1552 <-> 212, 1594, 1613
+1553 <-> 276, 1342, 1466
+1554 <-> 674, 782, 934
+1555 <-> 341, 1014, 1547
+1556 <-> 1429
+1557 <-> 1787
+1558 <-> 836, 1322
+1559 <-> 1015, 1480
+1560 <-> 1111, 1409
+1561 <-> 1561
+1562 <-> 768
+1563 <-> 1563, 1567
+1564 <-> 1847
+1565 <-> 1743
+1566 <-> 624, 1520
+1567 <-> 110, 850, 1563
+1568 <-> 128, 861
+1569 <-> 1569
+1570 <-> 1125, 1769
+1571 <-> 1462
+1572 <-> 898, 1375
+1573 <-> 1846
+1574 <-> 948, 952, 1081, 1106, 1927
+1575 <-> 1186
+1576 <-> 114
+1577 <-> 1133, 1436
+1578 <-> 1821
+1579 <-> 593, 947
+1580 <-> 610, 1515
+1581 <-> 912, 1455
+1582 <-> 1539
+1583 <-> 49, 280, 363, 1779
+1584 <-> 545, 1902
+1585 <-> 937
+1586 <-> 408, 1017, 1605
+1587 <-> 550, 1097, 1127
+1588 <-> 1288
+1589 <-> 1307, 1823
+1590 <-> 1314, 1488
+1591 <-> 301
+1592 <-> 599
+1593 <-> 777
+1594 <-> 1394, 1552
+1595 <-> 1665
+1596 <-> 1909
+1597 <-> 214
+1598 <-> 1703
+1599 <-> 411, 448, 1435
+1600 <-> 1600
+1601 <-> 1822
+1602 <-> 1816
+1603 <-> 151, 1192, 1469, 1797, 1967
+1604 <-> 1688
+1605 <-> 1586
+1606 <-> 19, 401, 1092
+1607 <-> 130, 1770
+1608 <-> 1459, 1654
+1609 <-> 1074, 1728
+1610 <-> 1031
+1611 <-> 178, 1724
+1612 <-> 831
+1613 <-> 773, 1552
+1614 <-> 85, 556, 566
+1615 <-> 1192, 1375
+1616 <-> 849, 875, 1917
+1617 <-> 1791
+1618 <-> 821
+1619 <-> 1226, 1289
+1620 <-> 1620, 1832
+1621 <-> 1173
+1622 <-> 546, 1067, 1754
+1623 <-> 1356, 1652
+1624 <-> 170, 867, 1408, 1868
+1625 <-> 409, 1629
+1626 <-> 258, 471
+1627 <-> 77, 735
+1628 <-> 1130
+1629 <-> 1265, 1625
+1630 <-> 384, 1808
+1631 <-> 1051, 1262, 1784, 1833
+1632 <-> 677, 1487, 1709
+1633 <-> 69
+1634 <-> 1368, 1549
+1635 <-> 1635
+1636 <-> 1212, 1493
+1637 <-> 1263, 1990
+1638 <-> 871, 982, 1233
+1639 <-> 842, 1639
+1640 <-> 775, 1843
+1641 <-> 1010
+1642 <-> 646, 1512, 1816
+1643 <-> 534, 1017, 1929
+1644 <-> 130, 1820
+1645 <-> 1863
+1646 <-> 197, 1105, 1505, 1719
+1647 <-> 919, 1470, 1975
+1648 <-> 802
+1649 <-> 1001, 1676
+1650 <-> 1357, 1485, 1984
+1651 <-> 336, 1216, 1888
+1652 <-> 583, 1623, 1652
+1653 <-> 1745
+1654 <-> 1139, 1608
+1655 <-> 855, 1122
+1656 <-> 395, 1238
+1657 <-> 743, 1812
+1658 <-> 429, 962, 1342
+1659 <-> 1792
+1660 <-> 1764
+1661 <-> 644, 1492
+1662 <-> 33, 1726
+1663 <-> 930, 1111
+1664 <-> 767, 1179, 1913
+1665 <-> 357, 1061, 1595
+1666 <-> 32, 548, 714
+1667 <-> 560, 1537
+1668 <-> 562, 1156, 1450
+1669 <-> 571, 923
+1670 <-> 1674
+1671 <-> 1256
+1672 <-> 600
+1673 <-> 252, 1400, 1673, 1901
+1674 <-> 507, 1185, 1670
+1675 <-> 1486
+1676 <-> 618, 1360, 1649
+1677 <-> 61, 541, 1299
+1678 <-> 86, 249
+1679 <-> 513, 1700
+1680 <-> 559, 1920
+1681 <-> 199
+1682 <-> 1895
+1683 <-> 165, 1528, 1988
+1684 <-> 30, 1261, 1486
+1685 <-> 1006, 1170, 1425, 1980
+1686 <-> 505, 1341, 1720
+1687 <-> 477, 1977
+1688 <-> 863, 1604
+1689 <-> 1241
+1690 <-> 686
+1691 <-> 1785, 1890
+1692 <-> 1451
+1693 <-> 197, 1183, 1234
+1694 <-> 735, 913, 937
+1695 <-> 112
+1696 <-> 1456, 1921
+1697 <-> 174, 1768
+1698 <-> 850
+1699 <-> 1699
+1700 <-> 500, 1679
+1701 <-> 1414
+1702 <-> 817
+1703 <-> 56, 223, 1598
+1704 <-> 628, 1545
+1705 <-> 254
+1706 <-> 390, 856, 1005
+1707 <-> 863
+1708 <-> 1815
+1709 <-> 631, 1467, 1632
+1710 <-> 538, 888
+1711 <-> 1742
+1712 <-> 282
+1713 <-> 171
+1714 <-> 1714
+1715 <-> 1113
+1716 <-> 1091, 1729
+1717 <-> 1408, 1546
+1718 <-> 1187
+1719 <-> 1646, 1719, 1735
+1720 <-> 1152, 1686
+1721 <-> 805, 1226
+1722 <-> 180, 445, 1437
+1723 <-> 942
+1724 <-> 614, 1611
+1725 <-> 1342
+1726 <-> 156, 402, 512, 1662
+1727 <-> 718
+1728 <-> 1609, 1827, 1881
+1729 <-> 288, 1237, 1716
+1730 <-> 232
+1731 <-> 1863
+1732 <-> 88, 410, 878, 1373
+1733 <-> 856, 1246, 1267
+1734 <-> 966
+1735 <-> 1719
+1736 <-> 419
+1737 <-> 22, 363
+1738 <-> 93, 1049
+1739 <-> 475, 1354
+1740 <-> 427, 503
+1741 <-> 1241
+1742 <-> 1711, 1853
+1743 <-> 521, 822, 1021, 1565
+1744 <-> 1989
+1745 <-> 753, 1548, 1653
+1746 <-> 649
+1747 <-> 245, 494, 1196, 1810
+1748 <-> 172, 720
+1749 <-> 581
+1750 <-> 1768
+1751 <-> 192, 773, 818
+1752 <-> 215, 687
+1753 <-> 897
+1754 <-> 1270, 1622, 1945
+1755 <-> 1542
+1756 <-> 344
+1757 <-> 1117
+1758 <-> 449, 492
+1759 <-> 511, 654, 1938
+1760 <-> 209, 275
+1761 <-> 547
+1762 <-> 362, 667
+1763 <-> 35
+1764 <-> 276, 646, 1660
+1765 <-> 925
+1766 <-> 847, 1875
+1767 <-> 771, 1296
+1768 <-> 1697, 1750, 1768, 1780
+1769 <-> 1570, 1896
+1770 <-> 1607, 1770
+1771 <-> 279, 916, 1463
+1772 <-> 1271
+1773 <-> 1349, 1894
+1774 <-> 209
+1775 <-> 160, 463, 491, 790
+1776 <-> 282
+1777 <-> 1952
+1778 <-> 1952
+1779 <-> 1583
+1780 <-> 1768
+1781 <-> 1500, 1800
+1782 <-> 1502
+1783 <-> 381, 898
+1784 <-> 147, 435, 655, 987, 1211, 1631
+1785 <-> 1691, 1792
+1786 <-> 303
+1787 <-> 40, 68, 1557
+1788 <-> 1788
+1789 <-> 515, 941, 1161
+1790 <-> 397, 997, 1158
+1791 <-> 828, 1617
+1792 <-> 758, 1058, 1104, 1659, 1785
+1793 <-> 272
+1794 <-> 1528
+1795 <-> 9
+1796 <-> 792, 1933
+1797 <-> 651, 1209, 1603
+1798 <-> 977, 1021
+1799 <-> 562, 1167, 1320
+1800 <-> 216, 348, 1781
+1801 <-> 926, 1859
+1802 <-> 885, 1034, 1451
+1803 <-> 409
+1804 <-> 257
+1805 <-> 629, 1508
+1806 <-> 532
+1807 <-> 851
+1808 <-> 865, 1630
+1809 <-> 1809
+1810 <-> 1248, 1747
+1811 <-> 1911
+1812 <-> 1657
+1813 <-> 424, 1100, 1294
+1814 <-> 1906, 1937
+1815 <-> 731, 1393, 1708
+1816 <-> 810, 830, 1602, 1642
+1817 <-> 271, 1817
+1818 <-> 199, 798, 1818
+1819 <-> 1058
+1820 <-> 1644
+1821 <-> 68, 1343, 1578, 1904
+1822 <-> 1342, 1601
+1823 <-> 1589
+1824 <-> 60
+1825 <-> 1371
+1826 <-> 683, 935
+1827 <-> 93, 1728
+1828 <-> 326, 555
+1829 <-> 882
+1830 <-> 1341, 1402
+1831 <-> 1831
+1832 <-> 1620
+1833 <-> 712, 1321, 1631
+1834 <-> 1834
+1835 <-> 516
+1836 <-> 670
+1837 <-> 1837
+1838 <-> 825
+1839 <-> 903
+1840 <-> 1840
+1841 <-> 1841
+1842 <-> 1145
+1843 <-> 264, 332, 668, 1165, 1312, 1640
+1844 <-> 165, 241, 1068
+1845 <-> 1007
+1846 <-> 1323, 1573
+1847 <-> 640, 1564
+1848 <-> 632
+1849 <-> 669, 774, 912, 1034
+1850 <-> 1001, 1873
+1851 <-> 1330
+1852 <-> 1361
+1853 <-> 402, 1742
+1854 <-> 725
+1855 <-> 676, 1908
+1856 <-> 1123
+1857 <-> 418, 460
+1858 <-> 140, 271, 1178
+1859 <-> 1801
+1860 <-> 793
+1861 <-> 306, 340
+1862 <-> 1353
+1863 <-> 1395, 1645, 1731
+1864 <-> 672, 800, 1420
+1865 <-> 969, 1153
+1866 <-> 430, 1115
+1867 <-> 980
+1868 <-> 136, 1624
+1869 <-> 428, 956, 1433, 1443
+1870 <-> 534, 970, 1417
+1871 <-> 936
+1872 <-> 1316
+1873 <-> 1850
+1874 <-> 337
+1875 <-> 1766
+1876 <-> 1876
+1877 <-> 1020, 1877
+1878 <-> 365, 1878
+1879 <-> 742, 1184
+1880 <-> 777, 809
+1881 <-> 394, 1728
+1882 <-> 448
+1883 <-> 33
+1884 <-> 863, 1166, 1369
+1885 <-> 365, 899, 960
+1886 <-> 327, 686
+1887 <-> 46, 339, 1061
+1888 <-> 78, 1651
+1889 <-> 1889
+1890 <-> 1691
+1891 <-> 708
+1892 <-> 1892
+1893 <-> 980, 1941, 1947
+1894 <-> 1773
+1895 <-> 544, 742, 1682
+1896 <-> 285, 1769
+1897 <-> 378, 1993
+1898 <-> 1981
+1899 <-> 220, 1206
+1900 <-> 382, 390, 1022
+1901 <-> 1517, 1673
+1902 <-> 1132, 1268, 1584, 1959
+1903 <-> 1472
+1904 <-> 961, 1821
+1905 <-> 836, 994, 1219
+1906 <-> 1304, 1323, 1814
+1907 <-> 755
+1908 <-> 1073, 1855
+1909 <-> 31, 1596
+1910 <-> 1114, 1915
+1911 <-> 709, 1451, 1811
+1912 <-> 60, 1522
+1913 <-> 1664
+1914 <-> 24, 949
+1915 <-> 1910
+1916 <-> 222
+1917 <-> 1616
+1918 <-> 413
+1919 <-> 204, 268, 1353
+1920 <-> 1178, 1680
+1921 <-> 1696
+1922 <-> 26
+1923 <-> 768
+1924 <-> 405, 1924
+1925 <-> 79, 1050, 1092, 1397
+1926 <-> 1926
+1927 <-> 1430, 1574
+1928 <-> 376, 765
+1929 <-> 1643, 1947
+1930 <-> 828, 886
+1931 <-> 11, 1960
+1932 <-> 59, 136
+1933 <-> 472, 1238, 1796
+1934 <-> 431
+1935 <-> 938, 1071
+1936 <-> 828, 919
+1937 <-> 532, 1260, 1814
+1938 <-> 910, 1759
+1939 <-> 704
+1940 <-> 505
+1941 <-> 1280, 1893
+1942 <-> 248, 641, 1532
+1943 <-> 1414
+1944 <-> 325
+1945 <-> 1754
+1946 <-> 852, 1351
+1947 <-> 1345, 1893, 1929
+1948 <-> 35
+1949 <-> 121, 858, 1037, 1357
+1950 <-> 1391
+1951 <-> 1451
+1952 <-> 1395, 1777, 1778
+1953 <-> 1953
+1954 <-> 1393
+1955 <-> 1430
+1956 <-> 63, 118
+1957 <-> 464
+1958 <-> 572, 1011
+1959 <-> 1229, 1902
+1960 <-> 1931
+1961 <-> 1014
+1962 <-> 1962
+1963 <-> 380
+1964 <-> 754
+1965 <-> 300
+1966 <-> 624
+1967 <-> 1603
+1968 <-> 1365, 1411
+1969 <-> 1349
+1970 <-> 450
+1971 <-> 107, 608
+1972 <-> 1045
+1973 <-> 23, 389, 673
+1974 <-> 1974
+1975 <-> 361, 968, 1647, 1994
+1976 <-> 1134, 1285
+1977 <-> 7, 1044, 1118, 1687
+1978 <-> 1507
+1979 <-> 1277, 1330, 1462, 1509
+1980 <-> 466, 1007, 1407, 1685
+1981 <-> 707, 1324, 1447, 1898
+1982 <-> 348, 1550
+1983 <-> 478, 1061
+1984 <-> 905, 1650
+1985 <-> 874
+1986 <-> 765, 953
+1987 <-> 297
+1988 <-> 112, 1683
+1989 <-> 555, 1051, 1213, 1744
+1990 <-> 1637
+1991 <-> 1991
+1992 <-> 31, 133, 821
+1993 <-> 1546, 1897
+1994 <-> 603, 1975
+1995 <-> 325
+1996 <-> 1996
+1997 <-> 14, 1093
+1998 <-> 1002
+1999 <-> 708
\ No newline at end of file
diff --git a/AdventOfCode.2017/Inputs/Day13.txt b/AdventOfCode.2017/Inputs/Day13.txt
new file mode 100644
index 0000000..f9bf33d
--- /dev/null
+++ b/AdventOfCode.2017/Inputs/Day13.txt
@@ -0,0 +1,45 @@
+0: 3
+1: 2
+2: 9
+4: 4
+6: 4
+8: 6
+10: 6
+12: 8
+14: 5
+16: 6
+18: 8
+20: 8
+22: 8
+24: 6
+26: 12
+28: 12
+30: 8
+32: 10
+34: 12
+36: 12
+38: 10
+40: 12
+42: 12
+44: 12
+46: 12
+48: 14
+50: 14
+52: 8
+54: 12
+56: 14
+58: 14
+60: 14
+64: 14
+66: 14
+68: 14
+70: 14
+72: 14
+74: 12
+76: 18
+78: 14
+80: 14
+86: 18
+88: 18
+94: 20
+98: 18
\ No newline at end of file
diff --git a/AdventOfCode.2018/AdventOfCode.2018.csproj b/AdventOfCode.2018/AdventOfCode.2018.csproj
index 4941c78..56048a9 100644
--- a/AdventOfCode.2018/AdventOfCode.2018.csproj
+++ b/AdventOfCode.2018/AdventOfCode.2018.csproj
@@ -1,7 +1,7 @@
- net5.0
+ net6.0
AdventOfCode._2018
false
diff --git a/AdventOfCode.2018/Day22.cs b/AdventOfCode.2018/Day22.cs
index b75b265..c8c211d 100644
--- a/AdventOfCode.2018/Day22.cs
+++ b/AdventOfCode.2018/Day22.cs
@@ -33,48 +33,15 @@ enum Tool
}
[DebuggerDisplay("{Coord}, {Terrain}")]
- private readonly struct Region
- {
- public readonly IntVec2 Coord;
- public readonly int Index;
- public readonly int Erosion;
- public readonly Terrain Terrain;
-
- public Region(IntVec2 coord, int index, int erosion, Terrain terrain)
- {
- Coord = coord;
- Index = index;
- Erosion = erosion;
- Terrain = terrain;
- }
- }
+ private readonly record struct Region(
+ IntVec2 Coord,
+ int Index,
+ int Erosion,
+ Terrain Terrain);
- private readonly struct SearchCoord : IEquatable
- {
- public readonly IntVec2 Coord;
- public readonly Tool Tool;
-
- public SearchCoord(IntVec2 coord, Tool tool)
- {
- Coord = coord;
- Tool = tool;
- }
-
- public bool Equals(SearchCoord other)
- {
- return Coord.Equals(other.Coord) && Tool == other.Tool;
- }
-
- public override bool Equals(object obj)
- {
- return obj is SearchCoord other && Equals(other);
- }
-
- public override int GetHashCode()
- {
- return HashCode.Combine(Coord.X, Coord.Y, Tool);
- }
- }
+ private readonly record struct SearchCoord(
+ IntVec2 Coord,
+ Tool Tool);
[DebuggerDisplay("{Tool}, {Region}, {Time}")]
struct Node
@@ -89,7 +56,7 @@ public Node(Region region, Tool tool, int time)
Region = region;
Tool = tool;
Time = time;
- Distance = region.Coord.DistanceFrom(TargetCoord);
+ Distance = region.Coord.ManhattanDistanceFrom(TargetCoord);
}
public SearchCoord SearchCoord => new SearchCoord(Region.Coord, Tool);
diff --git a/AdventOfCode.2019/Day03.cs b/AdventOfCode.2019/Day03.cs
index fccfa84..17b8849 100644
--- a/AdventOfCode.2019/Day03.cs
+++ b/AdventOfCode.2019/Day03.cs
@@ -60,7 +60,7 @@ public Day03()
public void Part1()
{
int answer = _map.Where(kvp => kvp.Value.mask == 3)
- .Min(kvp => kvp.Key.Distance);
+ .Min(kvp => kvp.Key.Manhattan);
Assert.Equal(248, answer);
}
diff --git a/AdventOfCode.2019/Day10.cs b/AdventOfCode.2019/Day10.cs
index d9984f0..6b82094 100644
--- a/AdventOfCode.2019/Day10.cs
+++ b/AdventOfCode.2019/Day10.cs
@@ -72,7 +72,7 @@ public void Part2()
{
slopeSearch.Add(minSlope, vector);
}
- else if (vector.Distance < minVector.Distance)
+ else if (vector.Manhattan < minVector.Manhattan)
{
slopeSearch[minSlope] = vector;
}
diff --git a/AdventOfCode.2019/Day15.cs b/AdventOfCode.2019/Day15.cs
index 163c017..80ecdc6 100644
--- a/AdventOfCode.2019/Day15.cs
+++ b/AdventOfCode.2019/Day15.cs
@@ -80,8 +80,8 @@ public void Part1()
PriorityQueue<(IntVec2 position, int distance)> toExplore =
new PriorityQueue<(IntVec2, int)>(Comparer<(IntVec2 position, int distance)>.Create((left, right) =>
{
- return (left.position.DistanceFrom(_oxygen) + left.distance) -
- (right.position.DistanceFrom(_oxygen) + right.distance);
+ return (left.position.ManhattanDistanceFrom(_oxygen) + left.distance) -
+ (right.position.ManhattanDistanceFrom(_oxygen) + right.distance);
}));
HashSet visisted = new HashSet(_map.Count);
toExplore.Enqueue((IntVec2.Zero, 0));
diff --git a/AdventOfCode.2020/Day12.cs b/AdventOfCode.2020/Day12.cs
index a193a41..638d8d9 100644
--- a/AdventOfCode.2020/Day12.cs
+++ b/AdventOfCode.2020/Day12.cs
@@ -54,7 +54,7 @@ public void Part1()
}
}
- int answer = pos.Distance;
+ int answer = pos.Manhattan;
Assert.Equal(1441, answer);
}
@@ -97,7 +97,7 @@ public void Part2()
}
}
- int answer = pos.Distance;
+ int answer = pos.Manhattan;
Assert.Equal(61616, answer);
}
}
diff --git a/AdventOfCode.2021/Day01.cs b/AdventOfCode.2021/Day01.cs
index f079bbb..0fba72c 100644
--- a/AdventOfCode.2021/Day01.cs
+++ b/AdventOfCode.2021/Day01.cs
@@ -25,6 +25,5 @@ public void Part2()
}
private int Counter(int count) => _input.Skip(count).Zip(_input).Count(pair => pair.First > pair.Second);
-
}
}
diff --git a/AdventOfCode.2021/Day09.cs b/AdventOfCode.2021/Day09.cs
index 2c844b2..7e9211a 100644
--- a/AdventOfCode.2021/Day09.cs
+++ b/AdventOfCode.2021/Day09.cs
@@ -41,7 +41,7 @@ private IEnumerable GetLowPoints()
private int GetBasinSize(IntVec2 start)
{
Queue toSearch = new();
- HashSet visited = new();
+ bool[,] visited = new bool[_bounds.X, _bounds.Y];
int count = 0;
toSearch.Enqueue(start);
@@ -49,15 +49,14 @@ private int GetBasinSize(IntVec2 start)
{
IntVec2 current = toSearch.Dequeue();
- if (visited.Contains(current))
+ if (visited[current.X, current.Y])
continue;
- visited.Add(current);
+ visited[current.X, current.Y] = true;
count++;
- foreach (IntVec2 next in current.Adjacent(_bounds).Where(adj => _map[adj.X, adj.Y] != 9))
- if (!visited.Contains(next))
- toSearch.Enqueue(next);
+ foreach (IntVec2 next in current.Adjacent(_bounds).Where(adj => !visited[adj.X, adj.Y] && _map[adj.X, adj.Y] != 9))
+ toSearch.Enqueue(next);
}
return count;
diff --git a/AdventOfCode.2021/Day10.cs b/AdventOfCode.2021/Day10.cs
new file mode 100644
index 0000000..6539719
--- /dev/null
+++ b/AdventOfCode.2021/Day10.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Security.Principal;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace AdventOfCode._2021
+{
+ public class Day10
+ {
+ string[] _lines;
+
+ public Day10()
+ {
+ _lines = File.ReadAllLines("Inputs/Day10.txt");
+ }
+
+ [Fact]
+ public void Part1()
+ {
+ int total = 0;
+ Action corrupted = c =>
+ {
+ total += c switch
+ {
+ ')' => 3,
+ ']' => 57,
+ '}' => 1197,
+ '>' => 25137,
+ _ => throw new InvalidOperationException()
+ };
+ };
+
+ foreach (string line in _lines)
+ {
+ ParseLine(line, corrupted, null);
+ }
+
+ Assert.Equal(343863, total);
+ }
+
+ [Fact]
+ public void Part2()
+ {
+ List totals = new();
+ long total = 0;
+
+ Action> incomplete = s =>
+ {
+ foreach (char c in s)
+ {
+ total = total * 5 + c switch
+ {
+ '(' => 1,
+ '[' => 2,
+ '{' => 3,
+ '<' => 4,
+ _ => throw new InvalidOperationException()
+ };
+ }
+ };
+
+ foreach (string line in _lines)
+ {
+ total = 0;
+ if (ParseLine(line, null, incomplete))
+ totals.Add(total);
+ }
+
+ totals.Sort();
+ long answer = totals[totals.Count / 2];
+
+ Assert.Equal(2924734236, answer);
+ }
+
+ static bool ParseLine(string line, Action? corrupted, Action>? incomplete)
+ {
+ Stack stack = new();
+ foreach (char c in line)
+ {
+ if (c is '(' or '[' or '{' or '<')
+ stack.Push(c);
+ else
+ {
+ if (c == s_Pairs[stack.Peek()])
+ stack.Pop();
+ else
+ {
+ corrupted?.Invoke(c);
+ return false;
+ }
+ }
+ }
+ incomplete?.Invoke(stack);
+ return true;
+ }
+
+ private static Dictionary s_Pairs = new()
+ {
+ { '(', ')' },
+ { '[', ']' },
+ { '{', '}' },
+ { '<', '>' }
+ };
+ }
+}
diff --git a/AdventOfCode.2021/Inputs/Day10.txt b/AdventOfCode.2021/Inputs/Day10.txt
new file mode 100644
index 0000000..e96e352
--- /dev/null
+++ b/AdventOfCode.2021/Inputs/Day10.txt
@@ -0,0 +1,90 @@
+([<([{{<<(<<{[<><>)}<([][])<<>{}>>>{[{(){}}(()[])]<{()()}<()()>>}>([<<{}<>>(<><>)><[{}[]](<>())>][
+({{<<(<<<<{{[({}{})<[]()>]<([]{}){[]<>}>}{([{}[]]}}}>({(((()()))<{<>()}[<>()]>)[{(<>{})(()[])}[{[]
+[{{[([<({[([<{[]}({}<>)>]{(([]())[()[]]){<[]<>>[<><>]}}>{<[(()<>){[]<>}][[<>{}]<()()>]>[[[<>[]][()
+{(<<{([([<(<{(<>[])<()<>>}>){[[<<>()>[<>[]]]{[{}{}]{[]<>}}]{<{{}<>}{{}()}>{[()()]<[]<>>})}>[{({[{}
+<{<<<<<{{{({<<[][]>[()[]]><<(){}>([]{})>}{{<[]{}><{}[]>}{<{}{}>({}<>)}}){([(()[]){[]()}][<[]()><[]{}>])
+<{({{<{{{<(({(<>)({}[])}{<()>{(){}}})[[(<><>)[[]]]<[{}[]]{<>()}>])>{<<([{}()]{[][]})({{}{}}{()})><
+<([[<<[{[{({{({}<>)[(){}]}{[{}<>]{[]{}}}}({[()()]<<><>>}(<{}[]><[]{}>)))}<({<<[]<>>({}[])>
+[[{<{{[{<{<[{[()[]]<()()>}][<(<>[]){<>()}>[{<><>}(<>())]]><[{{{}<>}<{}{}>}{[{}[]][[][]]}]<[([]<>){[]{}}]<(
+[({[<([[{<[{{(()[])<[]{}>}<[{}<>>{[][]}>}(<<[]{}>([]<>)>[([]){()[]}])]<[[[[]()][<>{}]]<(<>{})((
+<{[[{{{[([([{[<>()]{[]{}}}<{[][]}[<>()]>](<<<><>>{()()}>))<<{{<><>}[{}()]}{(<><>)[<>{}]}>>])]{[<<[<([]
+[[(<<<({[(((([<>()]([]{}))((<>){[]()})})[[<[[]<>]<{}<>>>[<()()>[()<>]]][[[<>{}]{[][]}]]])<<(({{}[
+{{{[[<<{{[{<[[{}()]]>[{[<>[]]([][])}<{{}()}{{}[]}>]}([[{()}{(){}}]([<>{}]<{}<>>)][{{[]<>}}[{{}{}}[{
+{[{[(<{{([{<<<[][]><()<>>>[{{}()}{[]<>}]>({<{}()>[()[]]}<<()[]>([][])>)}{[([[]{}][<><>]){{{}[]}<
+{[({<{[<{{[(({()<>}({}[]))([()]{<>[]}))({{[]{}}<<>[]>>)]{((<()[]>{(){}})[{[]<>}])}}}<[[<<<(){}><()
+[[[[[{{[{<<[<<{}<>>>{<()()><{}[]>}]>(<([()<>}<<>[]>)(((){})<()[]>)><({{}{}}<[]()>)<{{}<>}(
+{{<<[<{(<[([(<{}<>>[[][]])[(()())]]{[([][])({}<>)]<(<>{}){[][]}>})([{(<>{})<()<>>}])]>(([[[(<>{})](<[]
+<<([{<(<{({<{({}<>)<()()>}{<<>[]>[{}{}]}>(<((){})>(<[]()>[<><>]))}<<(([])[()])<([][])(()<>)>>>)([{([<>{}]([]<
+{[[{{[[({{[([{<>[]}[{}[]]]){(<[]{}>[()()]){[<>{}][<>]>}]}{<{<<{}()>({}())>}{[[<>[]]{<>{}}]<[{}[]]{{}{}}>}
+{<[[{({<{<[<(<(){}><<>{}>)>{[[(){}]]{({}())({}[])}}]{[{{(){}}}]}>}(<{{{([]{})[{}<>]}(<<>{}>)}(
+<[[<(<([[({(<{<>()}([][])><(<>[])[<>{}]>)((<<>()>[[]()])<{()<>}<()()>>)}>[[({{{}<>}[[]<>]}
+<{([{({[[({([[{}()]<()()>][<()[]>[[]<>]]}([<(){}>{<><>}][<{}<>><<>{}>])}[(([<>[]][<>[]])){
+<{[<(<(<[[[{[{<>{}}]((())({}()))}][(([{}<>]{{}{}}))[{[[]()]((){})}<[<>[]]([][])>]]]][[((({
+({[<<([[[<[[<(<>{}){{}[]}>[((){})[<><>]]][{{<>{}}{(){}}}(<[]{}}({}<>))]]{((<{}[]>({}<>))<<<>{}>[[]{}]>)[((
+{[<<[([[([{<<[{}{}]({}[])><<{}<>)(<>[])>>[([()()]{<><>}){[[]{}]{(){}}}]}{<([<>]([]())){<(){}>{()<>}}><<{
+[<[[[[({{([{{(<>[])<<><>>}<{[]{}}<<>>>}(<{[]{}}<<>()>>)][{(<<><>><()[]>){[{}()]>}<[{{}{}}{<>[]}]>]
+{<{[<(([{{({[<<>[]><{}[]>]<{<>{}}{()()}>}([<{}{}>{[]<>}]{<{}<>><[]>}))<([([]<>){[]{}}]<{[]<>}
+[<<(({<<[{[([[<>]<()[]>]{[[]<>]{()<>}}){{<<><>>{[]<>]}[({}<>){()<>}]}](<{{()[]}}({{}[]}<{}[
+({(<{<{<([([[((){})<{}<>>]<[{}[]](<>{})>])])<<[{<<<>[]>>}<[(<><>){<>{}}][(()[])(<>{})]>]<(<{<>{}}
+([<{<<[([({<<<()()>(())><[[]<>]{<>[]}>>([(()())]{[[]()]<{}<>>})})[<[[(()<>){<>{}}]][<(<><>){<>[]}>]><<([{}
+([[<[[[({[<<[[{}()](()<>)]<{()[]}>>{<[{}<>]<()[]>><<[][]>>}>]<(<<[{}<>){<>}>{<[]()>[[][]]}>)>}({
+(<[(<[([<{<{<[(){}][<>()]><(<>())(()<>)>}{{[{}>([]<>)}[<<>{}>(()())]}>[{([<><>]<()()>)}{([()]{()<
+({{{{<[{{<{<<(()[])>{[(){}]{[]{}}}>}{{([<><>][<><>])<(()<>)[[][]]>}<<(()<>)><{<>()}>>}>}}][(<{(<[{<><>}[{}[
+<{[{((([({{({<()()>(())}){([()<>]((){}))<(()<>)[(){}]>}}{[{([]())((){})}[{[]<>>{<>{}}]]<<<()[]><()<>>>((()()
+{([({[(<[<([{[<>[]][()<>]}{[(){}]{{}<>}}][<<{}()>>[<<>()>[()}]])<((({}{})[[]<>]))<{[[]{}]([]<>)}>>><{
+([[[{<[<([{(<<<>()>({}<>)><[<>{}]>)[[<<><>><()[]>](<()<>>(<>[]))]}([({()()}([]())){<[]{}>[[]<>]}][<
+<<((<({{(<((<({}[])(<>())>{({}[])({}<>)}))<<<([]<>)[()[]]>{<()<>>[[]<>]}>>)({(<[<>{}]((){})><{()()}[{}(
+{({([(({{<{{{<[]()>{{}[]})[[(){}](()<>)]}(([[]{}]{()<>}))}>{(<[{()()}]{[<>[]][()()]}>{{<()()
+{[(<{<[<<[{<<<<>{}>>[[[]{}]<<>()>]>((<[]{}>{{}()}))}{({[{}()](()<>)}<<[][]>[{}<>]>)({[{}[]]}<<{}[]
+{{{<{<{[[{([{{[]()}}({()[]}(<>))]<((<><>)({}{}))>)}]]{[({<(<{}[]>{<>{}})((()<>)([]()))>})[<[[{<>{}}<<><>>]<{<
+[[<{<<[(<<<([<{}()>[{}()]](<{}[]>[{}()]))[([[]<>][{}{}])[<[]()><[]()>]]><[[[[]<>]({}{})][{[]}{<>[]}]][<[<>
+(<<<<(<<[<[(({[]()}[[]<>]))({(())(()[])}[<<>[]>{()[]}])]{<({{}{}}(<>{}))><[[<>[]]<[]()>]>}>{({{(<>()){
+<<(<[(<<<{({[<()>{()()}][([]{})([][])]}{({{}}{<>{}})<(())[{}()]>})}[[{<[[][]]{()}){[{}<>]<{}(
+<<{<{{[<[(({({[][]}<<><>>)}<((<><>)[{}[]])<<[]<>>>>)[{{[()[]][[]<>]}{({}())<(){}>}}])({[([[]<>](<><>))<
+<<{<[(<(<([[{{()()}{<>()}}(<<>()>({}[]))]<<{{}{}}{()<>}>(({})(()()))>])[[([(<>[])(<>)](<(){
+({[((({[([<{[{<><>}[()[]]][{[][]}{(){}}]>>(<{{[]{}}<()[]>}<{()<>}<[]()>>>[{({}<>)<{}()>}])])]<(<{{{<[]()
+<[{<<{<<{<(({[<><>]{{}<>}})){<[{<>[]}({}{})]([{}()]{<>()})>[<{<><>}<<>{}>}([<>[]]<[]()>)]}>(
+(<<(({<<(<(({[<>[]]<[][]>}({<>()}[[]()])){((<>[])){([]{}){[][]}}}){{[[[]{}][{}[]]][<{}[]>([]<>)]}[(({
+<(<(<<<[<{({([<>()])[[[][]]{<>[]}]}[<[()]<{}<>>><[(){}]<()()>>])((<(()[])<{}{})>)((([][]))))}>]<[<([[<<>()
+{{<[<<<{((([[([]{})][[<>[]]]])(<[[(){}]<<>[]>]>{[({}())([]<>)][<<>{}><[]()>]}))){{<[[[[][]
+{([<{[<<[{({({<>{}}[[][]])[{(){}}{{}()}]}[[[{}()]<()()>]])({<[{}{}]>({{}{}}[[]{}])}{{({}())<()()>}{{<><>}<[]
+[<{[{<{{<{<[{{{}{}}[[]()]}([{}[]]<{}()>)](<{()()}{<>[]}><(<>[])>)>}{{{((()<>)[<><>])[[()()]
+([{[<[({([<<<([][])<{}{}>>[[()<>](<>{})]>{{({}<>)}([<><>]<()<>>)}>](<(<<[]<>>({}[])>[<<>{}>[()()]])(<<()[]>((
+(<[{<({<([<({<<>()><{}()>}(<[]{}>({}<>)))[([[]()][<><>>){[<>[]]{{}<>}}]>({[{[]{}}({}[])]<{[
+<<[<(<({<(<({<()><[]()>})>{[{[[]()]<{}>}<(()<>)(<>())>)(((()())[<><>])([(){}]))})([(<{<>()}([]())>{[{}{
+[{<{<{<[<((({[()[]]{{}}}[[<><>]<<>{}>])<({[][]}{()[]})<([]())([]{})>>))((<([{}<>]{(){}})>[
+[[[[([<{[[(<{{{}[]}[<>()]}<{[]}{<><>}>><{({}<>){()<>}}[{[]{}}{<>[]}]>)[([({}<>}([]<>)]{{{}{}
+<{{[[<{[(({({<{}>[(){}]}(<[]()>))}<<<[{}{}]>(<[]{}>(<>[]))>([{{}<>}(()())]<{<><>}{<>()}>)>)<[<<
+{[{{{(<<([([((()[])[[]<>])({{}{}}({}<>))]<({{}[]}{[][]})<{[][]}>>){<<({})[[]<>]>(<[][]>(<>{}))>}]<[
+<[<(<{<[([[[{[()[]][<>{}]}[{(){}}{<><>}]]{<([]{}){()<>}>[({}<>)<<>[]>]}][<[({}[]){()[]}][<<>{}><()<>>]>]]<(
+([<{(([[<<{([([]{})([]())]<{(){}}{[]<>}>)([<<>{}>[()()]]{[[]{}]<[]<>>})}[({{()()}<<>{}>>){[<()
+([({{{[[[([{<{<><>}{()()}>(<[]())[<>])}{([<><>]<(){}>){(<>())[{}()]}}]<{[[<><>]{{}[]}]([{}<>]{[]()
+[[<<<{{({[{[({{}{}}<(){}>)<[[]{}]({}<>)>]}][(<{<<>{}>}{{[]{}}{()[]}}>[{[<>{}]<[][]>}<{<><>
+[([{(([{(([{[{[]()}[{}]][[[]<>]{<>{}}]}{[<{}{}>({}[])][<<><>>(()<>)]}]{<({[]{}}{<>{}}}>}){
+(<<<<<[{<{({({[]{}}({}())){([][])[{}{}]}}([{<><>}{{}{}}][[{}[]]({}{})]))[[[{{}()}[<>{}]][{{}<>}{()}]
+(([{<(<[(<{{{[[]<>](<>[])}{[()<>]<()()>}}}>)<{{({<{}<>>[{}{}]}({<>[]}[()()]))}([([<>[]][[]{}])(<<><>
+((<{[(([{{([<[<>()]<<>[]>>{((){})([])}][<{[]()}<<>()>>(<{}()>(<>))])}[{{{{[]()}}{(<>[])[()<
+<[[{{[<<({[<<{(){}}{(){}}>>(<{[]<>}<<>()>>({()<>}{{}<>}))]{[([[][]][{}<>])][((<>{})(()[]))[<()[]>{<>()}]]}
+{<{<<[{[([{{{{{}()}<()<>>}<[()[]]>}<[<[]<>><()<>>](({}())<{}>)>}<<({[]()}(()()))({{}<>}{{}<>
+{{[<{[<{[[{{({[]<>}<{}[]>)((<>{})({}{}))}([[[]{}]<{}[]>]<({}()){()<>}>)}[<([{}<>}<<><>>)><{[()[]][<>[]]}{
+([{{{[{(<<<[<{<>[]}{()[]}>(([]())<<>{}>)]>[[(<{}()><[]<>>)][{[[][]]<(){}>}<<()()>({}[])>)]>>)<<[[(<(<>())((
+<({[{{(({(<<<{[]()}(<>{})>{(()<>)[[]<>]}><[[<>()]]{([]{})[[]()]}>>)})({[{<(<[]<>>{{}[]])[<<>{}>[(){}]]><(({}(
+((<(([{([{<[{<[]()>(()[])}<({})[<>[]]>]>}]{[<<{[[]()]<<>()>)<<{}[]>{<><>}>>>[[([(){}](<>[]))]{{<
+[([<<([(<[<<([[]{}]<(){}>)([()[]][{}{}])>([([]<>)<(){}>]([[][]]{[]<>}))>{{[{[]<>}[{}[]]]{([]
+[<{<[[<{<({<[<()<>><[]<>>][<{}<>><<>()>]><{((){})(()())}>}{[([{}<>]({}{})){(<>{})}]([[<><>](<>)])})><{<{
+[(<[[<({{<<([<(){}><<><>}]<<{}()>({}<>)>){[(<>())[(){}]]<<<><>>[{}<>]>}><{[{(){}}][<{}{}>[()(
+<[<{[{{<([{<[{()<>}{()<>}]]{<[{}<>](<>{})>([{}<>]{{}()})}}<[([(){}](()[]))<{{}{}}>]{{{<>}<[
+(<{[[{[[{[[(<[[][]][<>{}]>(<()<>>(<>{})))[{([]{}}<{}[]>}[[[]{}]{()()}]]]{<[<<>{}>(()<>)]<{{}<>}<[
+(<<<[[(<{<({{(<>())<(){}>}<(()())<()[]>>}<[({}{})[()[]]]>)>}{<{[<[()<>][<>[]]>[([]{})(()())]][({{}{}}
+({({[[[(<<[{<<<>[]][{}()]>(({}())([]()))}]{<{[()[]]({}())}>({<()[]><[]{}>}[{<>()}<[]{}>])}>>)]]]}[({[[{({(((
+((([[<{[(<({<{<><>}[[]]>[{(){}}>}((<()<>>{()()})<<<>()>({}())>))((([<>()]{[][]})[[(){}]<{}
+<[{([(<[({[[([{}()]({}{}))([<><>]({}()))](({(){}}{()[]}><[[]()]<<><>>>)](<([(){}][{}{}])[{
+{<((({<((<[[<{()[]}<{}{}>>](<<[]>{<>}><[[]{}]({})>)]<<{[{}{}]}[{<>{}}}>>><(([<<>>(()())]<(
+{[[[<<(<{(<(<[{}<>]<[]()>>[{{}{}}{()<>}])[<{{}()}{{}{}}><{[]<>}({}())>]>)<<(<<()<>><<><>>>)>>}[(
+[<{<[([({([[[{{}()}{{}()}]([[]()])]])}<<<[<<<>{}>[<><>)><{[]<>}(()<>)>](({{}<>}[()<>]){{<>[]}((){})})>({(
+([[{{[[[<(<({(()())<{}[]>}<({}<>){[][]}>)[<{()()}[[]<>]>]>)([[({<>[]}[()()])[{[]<>}[{}{}]]][[<
+({[(<<<{((<{<[()()][[]<>]>{<{}<>><()()>}}<{[()[]]([]<>)}<<{}()><{}{}>>>>[<<{(){}}[()[]]>[([]<
+([({{{<[{[{{[([]{})<[]{}>][<<>[]>[{}[]]]}}[{[<<><>>{[][]}]((<>()){<>{}})}]]]][[(<({[[]()][[]{}]
+(((<{{<<<([[{(<><>)<{}>}<{{}{}}[{}<>]>]{[(()())[{}<>}]}]{<(<[]()>)>([<()[]>{{}()}]<({}()){(){}}>)})<[({(<>()
+[{(([[<(<<(<{<[]()>(<>{})}[{()[]}[()()]]><[<[]()>[[]<>]]>)<{<[[]<>]<()<>>>{[()[]]<{}[]>}}>>([((<[][
+{<{<{[([(<<[{<()<>>(<>[])}[(<><>)[[]<>]]]<<<[]<>><(){}>>{{{}<>}<<><>>}>>(<{{<>()}[()<>]}><[
\ No newline at end of file
diff --git a/AdventOfCode.Common/AsyncQueue.cs b/AdventOfCode.Common/AsyncQueue.cs
index bcef828..5e09cf6 100644
--- a/AdventOfCode.Common/AsyncQueue.cs
+++ b/AdventOfCode.Common/AsyncQueue.cs
@@ -20,18 +20,20 @@ public AsyncQueue(IEnumerable items)
public void Enqueue(T item)
{
+ TaskCompletionSource outstandingRequest = null;
lock(_lock)
{
if (_outstandingRequests.Count > 0)
{
- var request = _outstandingRequests.Dequeue();
- request.SetResult(item);
+ outstandingRequest = _outstandingRequests.Dequeue();
}
else
{
_items.Enqueue(item);
}
}
+
+ outstandingRequest?.SetResult(item);
}
public Task Dequeue(CancellationToken cancellationToken = default)
@@ -42,7 +44,7 @@ public Task Dequeue(CancellationToken cancellationToken = default)
return Task.FromResult(_items.Dequeue());
else
{
- TaskCompletionSource request = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
+ TaskCompletionSource request = new TaskCompletionSource();
_outstandingRequests.Enqueue(request);
return request.Task;
}
diff --git a/AdventOfCode.Common/IntVec2.cs b/AdventOfCode.Common/IntVec2.cs
index 32fb210..225fdd4 100644
--- a/AdventOfCode.Common/IntVec2.cs
+++ b/AdventOfCode.Common/IntVec2.cs
@@ -11,7 +11,7 @@ public struct IntVec2 : IEquatable
public readonly int X;
public readonly int Y;
- public int Distance => Math.Abs(X) + Math.Abs(Y);
+ public int Manhattan => Math.Abs(X) + Math.Abs(Y);
public IntVec2(int x, int y)
{
@@ -25,7 +25,7 @@ public IntVec2(string x, string y)
Y = int.Parse(y);
}
- public int DistanceFrom(in IntVec2 p)
+ public int ManhattanDistanceFrom(in IntVec2 p)
{
return Math.Abs(X - p.X) + Math.Abs(Y - p.Y);
}