diff --git a/2020.csproj b/2020.csproj
index 0763a40..a752d49 100644
--- a/2020.csproj
+++ b/2020.csproj
@@ -74,6 +74,9 @@
PreserveNewest
+
+ PreserveNewest
+
diff --git a/24input.txt b/24input.txt
new file mode 100644
index 0000000..9090e74
--- /dev/null
+++ b/24input.txt
@@ -0,0 +1,292 @@
+nwswswnenwswsweswseswswnwswsweswsw
+swseswsenwswnenwsesesenwseseesesenwenw
+seswseswseswswseswwswneseswsese
+nwwwsewenwwwwswwwe
+seswwwseeseseseseseseswseswneneesew
+eenewewweseneneneenene
+nenenenenwnwwswseenwwneneenwneswnwnw
+swneswwswwnewwwswwswwww
+seseweewwnwwnwwsewwnwnenewnwne
+nwwewewnwnwwwwnwswnwwsenwneww
+sewnewswswwsenwsenenwneswswsesweenw
+nwwnwnenwnwwnwsewnwseewsenwsesenwnwnw
+enwnenwnwswnwnenesenwneswnenwnenwwnenese
+neneneneneswneneenwenenenenenenewnwse
+nwenwswsenwwnwwnwwnwwnwneww
+wnwnwnwnwnenenwnesenwnwnwneswnwnenwsewne
+wnwnwnwsesenwwwnenewnwnwnwnww
+wnewwwswwwwwsw
+nenwnenenewnenwnesenesenewnenenw
+eeseeseeesenwesesese
+seneseneneeeneewwswenweeneeneenene
+wswsesenwseeeeseseseseseswnewseswnwnwse
+swnenewwneneneneneneneseenenenenenee
+swenwwwwewweswswwswswwswwnww
+neswnenenenwswnwnwnwneneneneewnwneenw
+eeesewswseenweewnwweeseene
+swnwseeswneenwsesenwseeswnw
+enwwnwwwswnwnwnenenenenwnenwnesesesenw
+swwwwwwnewnewewwnewwsesw
+eneseswwneseewnwnweswswwwnenwnenwne
+sewsesesesenwnesewnweeswswswneseswwsw
+nwneswnwnenenwnenweneswnesenwswnewnw
+seneneseseseewsenenwswsewseswswsenesw
+nwneseneenesewwnesenene
+swwnwwsenwewswneewnweweswewnewse
+nenenwseneswnwnwnwsenwwnwnenwnenenenw
+neneneswneneenweesweneeeewenenw
+swswswsenewseseseewswnesewswswseseswnw
+eswwnwnwwswnwwwnwnwewwnw
+swneseswenwseswsesesenwneseseseseswsese
+nesenesenewnenenenwsenewnewsenwwnwne
+swswseswseseswswnwseswsenesweswsw
+swnwnwwswwswswswswwswsweneseswswnewne
+nenenenenenwswneneswsenwnesenenenwnenenwnee
+newnwneneeswneswnenwwsenenwneneenwnenw
+swneeesesenesesewseseeesewse
+nenwnwswseeenwseswneenewwene
+enenenenenenenwnenesw
+nwwswwwseneewwwwnwwwswnenweww
+sewseneeesenwesesesesewneswseeew
+swnwnweneswneneseswnwnenenenenenenwnese
+nwsenwneseswwewnweswneewnwnwnwenw
+wsenwwnwwnwenwwwnweswnw
+swswwewnwnenesesewsesewneesewnene
+neswnwwseswenenenwneseneeneenewsesww
+nwwwsesenesesesesesenwseneeswnwsenewse
+wnwswneswswswsweswne
+enesenweneswsewneenenenwswnewnwnwsw
+enenwnwswsenenwnwswnwwnwnwnwnwwnwwnw
+wswswswwswwsesenwnwswnewsewswswnese
+swwswneswswswneswswswsw
+swswseswsesesenwseeeswseseswnwseseswnewsw
+nwseeseseseswwesesesesesesesenesesenwe
+swnwewewwwnwnwwnwnenwwwnwsewnw
+swswswswnwswsenwswwweswwswsw
+swenwswnesenwswesweseswwnewswenwswswnw
+enewswnwwwwswswneewneewsw
+nwsewnenwnwwnwnwnwenwnwnwnwnwswsesenwnw
+wneeseseswseseesenweeseenwsenesewwne
+senenwnwnenwnwnwnewnwnwnwnwenwnwswnesw
+seseseseeseseseneseewse
+neneeeneewweeneeneesesw
+swswnwseswswwneseswswswswnwneswseswwswe
+wsenenwwwseseeseswsewneneneneseswse
+seeseeneeeswswseseenwneewneeseese
+eeseeeeswsenweweenwneeewseene
+wnenewnenenenesesenewnwnwnenenenwsenwne
+neneneeswswnenenenenwenwnenwneneneswne
+nwnwnwnwswwwnwnwwneenwwwswnwnwsenw
+eneweneeneneenesweneneneesweswnww
+neseseseseswsesesenwseseswseseseseswnew
+seseseswswseseswsewne
+swnwnewsweswswweswswswswwswswsesenwswsw
+neewnwswnwswswewswnenwseswnwswswswsesw
+esewnewwwwwswwwwwnwseewwwne
+swswswnwswesweswswsweswswswswsewswnwsw
+swneswswwnwswswswwswneswsweewswswsw
+swwwesesewwswseneseneseseseeswsesesw
+nwswnwnwnweswwnwnwenwnwnwnwe
+nwwwnenwseseswnewsenesesewneswswwwe
+nwnenenenwsenwwnenwnewseneewse
+wwnwswnewwwwnw
+swneneswnesenenenewnesenwewnewnenene
+nenwneeneneesenwnesenewsw
+neseseeewswweesesese
+seenwsesesenwseeseseseseesesese
+wwwwwswnewswswwwwnwswnewesw
+swswwswswseswsenwwwseneeneswseswnwneese
+nesenweseswesewsenwwsesesesesesee
+neswseswsenwsweseneswswswseswswswswswwwnw
+sesesewswseneswnwswswswswnwsesenwswesesw
+nwwswesenewnwswswnwswwnwenenwne
+eeeeneeweeeneneseeeenw
+seseneseswwsewnwneseeeseneseswsenesw
+nwnwneenwwnewewenwwnwnenwsesenenenw
+neneneneswnenenwneneneeneneswneswswnene
+wswseewneneseenewsesewwwswnwnwnwnwnw
+nwnwnwnwnwnenwnwswnwnenenwsenwe
+swnwnweswnwseeeeenwsesewswwnenesw
+ewswseswnwwnwwnwnwsweweeenwnenw
+wnewwnwneswsenwsewwenewnwnwwwww
+nwnenenenewnwsenwnenwnwnesewnenwnwnwnwse
+swsenewneswneneneenwnw
+sweseswneeeneesenwnwneneenwnesenww
+seswswneswswseswwseswnenwseseneswswswswse
+nenwsenenwneneewneneneneneneswswene
+wsewwwwwnewwwwwwwnw
+swswseseeswswswwswsesesesewneneseswnw
+nenweswnwnenenwnwnenwnewsewwnenenwe
+neeewnenwnwnwnwnwsenwnwnwswwnwnwnwnw
+swsenwswswneseswenewewsenwwnesewsenwne
+wswwswwweeswswwswswnwnwnwene
+nwneneneneseswnenwnesweswnenenwnenesene
+wseseswswsewseneeswneewswseseswsene
+swsenweeneswswsesesene
+weswswsenewnwwewwswswenwsewnwnesw
+neswnewsenwewnesenwsweseeseene
+seswswseseswwneswseenweswswswswswnwnw
+eseswswsweeswseswswsenwswswswswsewsenw
+enewnwswsesweneswseswseenwsewnwsee
+neseneswseweseenweeweesweeenew
+wnwenesenwswnwnewsenwnwswnwnesewnwwese
+swnwswswseeseseeneswswswswswswswswsww
+wsesewwneseswswswseswnwswseeswneswewsw
+nwnenenwnwenwswnwnenewnwnwswnwsesenwnww
+eswseseswsewseseswsesesesenese
+nwswswseeswswseswswsenweseewnwsesese
+seseeeeenewswnwwnwswsenwnenwnwnwwsesw
+neeweewnenwneenwnwsenwsenwsesesene
+nenwseeseenwenwseeswswnweeeneeswse
+swswseswswswswswenwwwswnwswneswswesww
+swswneswnwswswswswswseewswewswwnene
+nwneeneenwnewswnenwnenwswnenwnwnwenwne
+nenenenenwnenesweneseneneneswnwnenenenw
+ewseesweenweneseenwesweewwew
+eseseeseseseeweesewseesesene
+wneeneneenwweswenwwseneeenesesese
+nwnwnenesenenenwwnwwnwsenwnwnwnenenwse
+senewnwseesenwwseseswesewesesenenesw
+seneeewnwwwsewnenwewnwswswse
+neswwewwwwwwwswsweewwwww
+wwsweswwswewwsenewwswwswswswnw
+nwnwnwnwneneswnwsenwenwnwnwneenewnwnw
+senwwnwneneeswneneeeweeenenenesw
+nweneswneneswneenwnewnwnwnwnwnenenwnesenw
+sewneswnweweswnesewnwwwwnewswsww
+wneswswswwswsewswwswswswewswsw
+senwneseswseeseswneseswneswswswswswsenw
+ewwsweneenwsene
+seeneeseeenewnwewswnwswswsesenww
+wsesewwsewwswwnewswwnewwwwwnew
+wnwsewwwnwwnewsenwnwnewnwnesenwnw
+swswseseswsenewsesesesesesesesenwsenwse
+nwwwwneswwwwwseswewwwwnenew
+seewneeeeseenwsewenwsesw
+nwnenwwneneseswnwew
+neeenwenwesweeeeeeeseesw
+nwnwwswewswnwnenwnwnwnwsenene
+ewnwsesesesenwswesesesewswseesesese
+neenwwsewsenwseeeeewwswneeneswne
+swsenwseeswsewnwweneseneseeswsesesee
+swsenwnweseswseenwseswseseseenwwsesene
+eseenenenwneswnwnwneeeeneseneenew
+swnenesweeeswneswenenwswneeeeseswse
+sewsesesweeeeweeneeneseswesee
+swwwwwwewnwnwwwewwwwnw
+seswswenenwnweeneneneneswwenenenenenwne
+seseeeseswwneeesenww
+nwnwnwswneenwnenwneneswnwswnwsw
+swswswswseswneswswswswnwseswsww
+wnwwnwwsenwnwwneenwnwnwsesenwnwenww
+eseeseeesewseseswesesenwnenwesese
+swswnenwnenenwnenwenenenwenenwnwswnwnwswne
+newwsewwwnwwnewsew
+swswswseseswwseswswneswneneswnwnwswsesw
+eeeesenwswseeeeewwseeneeeee
+neswswseswneeswswneswswseswswww
+neseeesesesewnwseswsesesewseseswwnwsee
+nwnwnesenenwnwsesweswswenwnwnwewnwwse
+eswswswswswseeeswwseewsenenwwsesww
+newwnesesesweeneewwenee
+swnwswwnwswseeneeseeneswswenwswwnesw
+sesesweeseswseeseseenweseeswnesenenw
+wwwwwwseewwwwwwwwswwnesene
+swnwnwnenwesweswswsenwwneneenwnwnww
+swnwnwewenwenweenwnwswwwnwnwnwww
+wsweswswswswnwswswsweswswswswswswswne
+neneneswwnwnenwnwneswneenwsesenene
+swewswseneswnwswseswswseseenwswswsee
+enweeesweseseweeeeeenwswee
+sewseseswnenesewenwneeneneneewnewnew
+esenwswewneswneswnwnenwnwnwenwenwnw
+swneswwswwswswswwwwenwswswsweswsw
+newseswseswnwseseneeswsenwwswnw
+wwesweewswswnwwewewwwenwnesenw
+seswenwseswenwwseewnenenwnesenwsese
+wwwwnewwwswswww
+nwwnwnwswnesenenenwwenwenwwnwnwsenwwnw
+nwsewesesewswsesweseseneseneseswnese
+eseeeeenwseeseswe
+swseenwseswwneneswsweseswseswnwwnene
+eenwewesweseneweswnenwswsewenee
+wewwwwwwwwwnewsewwwwsenw
+wwwsewwwwneww
+senwneneenenwsenwnesenenenenewnewsesw
+eweeeeeeee
+nwnewneneneseneneenewseneneswsenenwnenw
+swsewswnwneeenwseweseenwwwenesww
+swswnwswneneswsesewswseswsewswnesese
+newwnwnwwwwnwswswnenwnwneenwnwswnw
+eenwsenwnewwneneenenwnenwsewwwsee
+eseesenweeseseswseenesenweeewswnwe
+nwenwenewnwwwnwswwsweswseswnwwe
+nwseneeswswseseseswswswseswseeewswnw
+seeeenweeweeeeesweeenee
+eneweswnesenenewnenewneswnenesesww
+nwwnewswnwwwnwe
+swswswswswseswswswswwswswnesw
+wwwsewnenwwwwnwsewnw
+neeeseseesewseseesesewsesesene
+nwnwswswneswwswseswswswsweswswseneswswsw
+sesesenewsewseseswseseseseswnesesese
+seneseswswseswseeeseenwnwseenesewnwse
+nwwnwwwwwnwwewe
+swseswwsweswswswnwswsweswswswswneswse
+swseeswswswswswswswwnwnwswwnesesenwswsw
+senwseseswsesenesenenwsesesewsesesesese
+ewswwswnwseneswseswnenwswsenwseseswswne
+sweswseswseswwwseneneenesenwseswnwsenw
+nwwweswnwswnwswswseeseswsenenwsesww
+sesewseesenwesweseeneseeneseswnewese
+esewseeeesewenwseeweenesewew
+eneseneswnesewwneenwneneswewsewnesw
+newneweeseenesweneeeseenwneeswe
+seswseseneswswswswswswsw
+wsesesesesenesesenwseesenwsesesesesese
+nenenenesenenewnenenene
+seswwnwswwsesesweswsweswenesenwene
+neswesenenesenenweeswseeenwnewnwnene
+eeeeeeeenweeneswenenwnweswsw
+seneenenesweneswneewnwswnene
+swswwswswswwswswnwwwnweenwwseswww
+swswwswneswseneswswswsenesw
+swwswswswswswsweswswswswsw
+seneseseseenwnwsweswnwseseswseswwneswswsw
+nenwnwswnenwewneswnwnewnenenesenenee
+nwseseesenwwswseeenesesesesenwnwew
+swnwswseenewswwswswswwwwwnwswwe
+nwneenesenwneewnewneseeneneesw
+neswnwwnenweswneneneneswnenwwneenwneene
+neeneneswwsenwnwneneneseenenenewsene
+swswnewseseseswswseswneswnwseeseswsese
+swnwwswseswwnwsweeswwnweenewnwsw
+nenweeeeswneweseswneswne
+weneenwnenenenenwnenwswnewneeneneenesw
+swnenwnwwwswwwnenewwnwsewnesewnw
+neswswwswswseesweneswswsewswswwswse
+nenenenwwsenwnwnenwnwnenwsenenwnwnwsenw
+nwseseswseesenwseswswsenwese
+wswneswnwneneswseseswwnwseswswnesenwsesew
+weeeewsweeeneneneswesenwswee
+senwnwwwnwsenwnwwwnwsesenesesenewsene
+wwwesewwsenwwwwswweswwswnenww
+swwneneseswswwswsewwwsw
+enenwneneeneeseneswnwneeneswnesenene
+eseesenenenewwneneseenenewnenenewnene
+wenwswewnwewnweswseeeneeneenesw
+neneneneswnenewsenwneseneenenwneswnenewne
+eneswneneeseeswenewneeeeeenwnee
+eswswsenwneseeseeeeeswnweeeewne
+nwewwwwenwwwwewnwwnwwewsw
+nwwwwnwnesenwwseenwswnwewnwswwnewnw
+seweeweeenwseeeeenwseeeene
+wswsenenewwwwwwwswwswwwneseww
+nenenenweeseneneneeeeeweewswse
+neneneneenweseeneswswnenenweeneswee
+sesweeeswenwnese
+enweseneneneneenwneenwneswneswneswnew
+senenweseneneswsesenwseswswnwwswnwsewse
+nwnwnwenwnwnwnwnwnwnwswnwnwnwsesenwnwnw
+wwwnwnwwenwnwnwnwsenwswww
+nwnwnweswnenenwnesenwwswnenenenwnesenwe
\ No newline at end of file
diff --git a/Program.cs b/Program.cs
index 5bdc916..f0d1a96 100644
--- a/Program.cs
+++ b/Program.cs
@@ -26,6 +26,7 @@
Q21.Go();
Q22.Go();
Q23.Go();
+ Q24.Go();
Util.Log($"Total time={(System.DateTime.Now - start).TotalMilliseconds}ms");
}
}
diff --git a/Q24.cs b/Q24.cs
new file mode 100644
index 0000000..2d66c1b
--- /dev/null
+++ b/Q24.cs
@@ -0,0 +1,174 @@
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+
+namespace _2020
+{
+ class Q24
+ {
+ static readonly List> list = new List>();
+ static Dictionary, int> tiles = new Dictionary, int>();
+
+ public static void Go()
+ {
+ var start = DateTime.Now;
+ MakeList();
+ Util.Log($"Q24 MakeList took {(DateTime.Now - start).TotalMilliseconds:N0}ms");
+ var p1start = DateTime.Now;
+ Part1();
+ Util.Log($"Q24 part1 took {(DateTime.Now - p1start).TotalMilliseconds:N0}ms");
+ var p2start = DateTime.Now;
+ Part2();
+ Util.Log($"Q24 part2 took {(DateTime.Now - p2start).TotalMilliseconds:N0}ms");
+
+ Util.Log($"Q24 took {(DateTime.Now - start).TotalMilliseconds:N0}ms");
+ }
+
+ static void MakeList()
+ {
+ foreach (var line in File.ReadAllLines("24input.txt"))
+ {
+ var sublist = new List();
+ for (int i = 0; i < line.Length; i++)
+ {
+ if (line[i] == 'e' || line[i] == 'w')
+ {
+ sublist.Add(line[i].ToString());
+ }
+ else
+ {
+ i++;
+ sublist.Add($"{line[i - 1]}{line[i]}");
+ }
+ }
+
+ list.Add(sublist);
+ }
+ }
+
+ static void Part1()
+ {
+ foreach (var inst in list)
+ {
+ var row = 0;
+ var col = 0;
+ foreach (var step in inst)
+ {
+ if (step.StartsWith('n'))
+ {
+ row--;
+ }
+ else if (step.StartsWith('s'))
+ {
+ row++;
+ }
+
+ if (step.EndsWith('e'))
+ {
+ col++;
+ if (step.Length == 1)
+ {
+ col++;
+ }
+ }
+ else if (step.EndsWith('w'))
+ {
+ col--;
+ if (step.Length == 1)
+ {
+ col--;
+ }
+ }
+ }
+
+ var tilePos = Tuple.Create(row, col);
+ if (!tiles.ContainsKey(tilePos))
+ {
+ tiles.Add(tilePos, 0);
+ }
+ tiles[tilePos]++;
+ }
+
+ var flipped = tiles.Values.Aggregate(0, (sum, curr) => IsFlipped(curr) ? (sum + 1) : sum);
+
+ Util.Log($"Q24Part1: flipped={flipped}");
+ }
+
+ static List> GetNeighbors(Tuple coords)
+ {
+ var result = new List>();
+ result.Add(Tuple.Create(coords.Item1 - 1, coords.Item2 - 1));
+ result.Add(Tuple.Create(coords.Item1 , coords.Item2 - 2));
+ result.Add(Tuple.Create(coords.Item1 + 1, coords.Item2 - 1));
+ result.Add(Tuple.Create(coords.Item1 - 1, coords.Item2 + 1));
+ result.Add(Tuple.Create(coords.Item1 , coords.Item2 + 2));
+ result.Add(Tuple.Create(coords.Item1 + 1, coords.Item2 + 1));
+ return result;
+ }
+
+ static bool IsFlipped(int val)
+ {
+ return (val & 1) == 1;
+ }
+
+ static int NumNeighborsFlipped(Tuple coords)
+ {
+ var result = 0;
+ foreach (var neighbor in GetNeighbors(coords))
+ {
+ if (tiles.ContainsKey(neighbor) && IsFlipped(tiles[neighbor]))
+ {
+ result++;
+ }
+ }
+ return result;
+ }
+
+ static Dictionary, int> PopulateNeighbors(Dictionary, int> inList)
+ {
+ var tempList = new Dictionary, int>(inList);
+ foreach (var pair in inList)
+ {
+ if (IsFlipped(pair.Value))
+ {
+ foreach (var neighbor in GetNeighbors(pair.Key))
+ {
+ if (!tempList.ContainsKey(neighbor))
+ {
+ tempList.Add(neighbor, 0);
+ }
+ }
+ }
+ }
+
+ return tempList;
+ }
+
+ static void Part2()
+ {
+ for (int day = 0; day < 100; day++)
+ {
+ var tileState = PopulateNeighbors(tiles);
+ foreach (var pair in tileState)
+ {
+ var numNeighborsFlipped = NumNeighborsFlipped(pair.Key);
+ var isFlipped = IsFlipped(pair.Value);
+ if (isFlipped && (numNeighborsFlipped == 0 || numNeighborsFlipped > 2))
+ {
+ tileState[pair.Key]++;
+ }
+ else if (!isFlipped && numNeighborsFlipped == 2)
+ {
+ tileState[pair.Key]++;
+ }
+ }
+
+ tiles = new Dictionary, int>(tileState);
+ }
+
+ var flipped = tiles.Values.Aggregate(0, (sum, curr) => IsFlipped(curr) ? (sum + 1) : sum);
+ Util.Log($"Q24Part2: flipped={flipped}");
+ }
+ }
+}