From 1f90d4292bf684c0637de8ed1744b8dc29e4f871 Mon Sep 17 00:00:00 2001 From: Chuck Ries Date: Thu, 9 Dec 2021 21:48:18 -0800 Subject: [PATCH] Day 10 and random old stuff --- AdventOfCode.2016/Day01.cs | 4 +- AdventOfCode.2016/Day22.cs | 2 +- AdventOfCode.2017/AdventOfCode.2017.csproj | 7 +- AdventOfCode.2017/Day10.cs | 73 + AdventOfCode.2017/Day11.cs | 68 + AdventOfCode.2017/Day12.cs | 78 + AdventOfCode.2017/Day13.cs | 58 + AdventOfCode.2017/Day15.cs | 16 +- AdventOfCode.2017/Day21.cs | 58 +- AdventOfCode.2017/Inputs/Day11.txt | 1 + AdventOfCode.2017/Inputs/Day12.txt | 2000 ++++++++++++++++++++ AdventOfCode.2017/Inputs/Day13.txt | 45 + AdventOfCode.2018/AdventOfCode.2018.csproj | 2 +- AdventOfCode.2018/Day22.cs | 51 +- AdventOfCode.2019/Day03.cs | 2 +- AdventOfCode.2019/Day10.cs | 2 +- AdventOfCode.2019/Day15.cs | 4 +- AdventOfCode.2020/Day12.cs | 4 +- AdventOfCode.2021/Day01.cs | 1 - AdventOfCode.2021/Day09.cs | 11 +- AdventOfCode.2021/Day10.cs | 107 ++ AdventOfCode.2021/Inputs/Day10.txt | 90 + AdventOfCode.Common/AsyncQueue.cs | 8 +- AdventOfCode.Common/IntVec2.cs | 4 +- 24 files changed, 2570 insertions(+), 126 deletions(-) create mode 100644 AdventOfCode.2017/Day11.cs create mode 100644 AdventOfCode.2017/Day12.cs create mode 100644 AdventOfCode.2017/Day13.cs create mode 100644 AdventOfCode.2017/Inputs/Day11.txt create mode 100644 AdventOfCode.2017/Inputs/Day12.txt create mode 100644 AdventOfCode.2017/Inputs/Day13.txt create mode 100644 AdventOfCode.2021/Day10.cs create mode 100644 AdventOfCode.2021/Inputs/Day10.txt 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); }