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}"); + } + } +}