From ded004093cc5cc7e690ba628f33d0db565d0a872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Thu, 24 Dec 2020 09:19:14 +0100 Subject: [PATCH] day 24 --- data/day24/input | 347 +++++++++++++++++++++++++++++++++++++++++++++++ src/bin/day24.rs | 140 +++++++++++++++++++ 2 files changed, 487 insertions(+) create mode 100644 data/day24/input create mode 100644 src/bin/day24.rs diff --git a/data/day24/input b/data/day24/input new file mode 100644 index 0000000..ade59f5 --- /dev/null +++ b/data/day24/input @@ -0,0 +1,347 @@ +enwwsenweswweseseswnenewwswseswenw +nwnwneswwnenwnwnwenenwwnesenenwsenenee +eneswwenwneeswneenenw +swwswswwwswswsweeswww +swewnwneeewnewwwswwnwwswswnwww +seswnwenesenwsenenwwenwsenwswnwseswnw +nwswwenwwwswwnwnewswnwnwwwswnee +seswseswseseseseeseseseswnwsesw +swswseswseswswnweneswswseswse +wenwswwswwwswwnwsesewwenwseswwne +nenewswsenenenenenwnenesewswnenenewe +eeneneswswnenwnenenwnwnwnwnwnwswenwnesw +nwsweneeeeweenenwneeseeesenesw +nwnewsesesesesesesewsweseenwsesesese +nenwneenenwneneneswsenenenenewnenwnenewse +wswnwseseneswswswenewswneswenw +wwswsewswswwwnewnwwswswewsewwnw +nwnwnwsenenwnwnwneenwwnwnwswwnwnwenwnw +seenweeswenwwseeeeeesweesese +neswwewnewwwnewseswwwwwnwseswnew +swseseesweenwswnwswswnwsesewseswene +nwsenenenwsenenenesenewneswwnenenenesenene +ewnenwneswsenenwnwsenewsenwwnenwnesesene +sesenenwswsesesweseseswnwsesenesenewe +wwenwnewewswwswwswwsewwenww +neweeseseswswwweenwnenwweeneenew +neseneseneneneneneswnenwswnewnenenenene +wswwwnwewwwnwneswswsewewwweww +swseseswwnwswswswnwnew +eseseesewnwseseseewseneseesesenwsw +swsweswswnesenwswsesw +seeeswnenweenewseeesweeenenewsw +swnwsewesewnenwswneweneswseenwsew +wsesweswnwswswnesweswwwswswswswsww +wseenwnwswneewnwswsweenenwnwswneew +seswnwseeeseseseseseswswneswseesenwsew +nwnwnenwnwwnwsenwenwneneneswnwnwnw +swseeseswswnwswsesesenwsesenwswnwnw +nwsewnwwnwwewwneswnwenenwseneswsw +wwsewswenwwwnweenwnwnenwswswwnw +wneeneeneeeeseenesewneneeswee +wnwenwswneneenwswnenesenwnenwwneswnwse +sewsenwseswsewewswneswnwneseseswseee +wnwwwswnwnwnwwsenwneww +swswnwweseeswneswswswswswnwswswswswswne +neeneneeeneeeswenwnenenwswneneswe +wneeseeeseeseswsenwweeeeseee +nenweesenesenewwwsweswnwnwweswne +senewseswsewswneseesenwsenenwsesenwsw +ewenwnwseeeenwesenwnewswwswe +nwnwnesesewnwnwnewneenwnwnwnwnwswnwne +enwwewnwnesenenenwnwnenenweneseswwswne +nwswnenwswnwwnwseswnwnwewnwwwnenew +wweeswweneseewnewwwewwewse +swseseswswseseneseswneswseswneswseswnwsw +wnwnwnesenwwnwnwnwwsewnwswnenwwnw +sewsenwswsenewneneewnwswwnesw +wswseneeswsenwsesenwwneswnenwewsesesene +nwnwnwwnwnwnwenwsenwwnwenwnww +esenweeswseseenwe +nwnenwwnwnwneweswswwnwsweesewsew +swwswseeseseneseseeswswwswnesesenwwswsw +seseesewseseeeswnwseseenwseesesenwsese +wwnwwwswwwwwnewww +swseenewseneneeeswswnwswsenwswenwsene +swwswwseewnwnenwwnewwnenwsewwnw +nwnwenwswnwnwnenwnwwnenwsenenenwnwwsenw +nwenwwnwnwnwnenwnwneswnwnwnwseenwnwnw +seswnenenewwneeneneesesewenwenwse +nenenenewwnenesee +senwwwwenwwnwwwnesenwnwsenwnwnwnw +senwneswwewwseswwnwswesewnenwwwww +nenenenenenwneneewneeneswneswsewene +swseneswswwswswnwswnewswseseseswswswswswne +wwenwewnwwnwnwnwwwwswneswsewnww +swnwnwwswswseswsenweneseswswswwswsee +wnwswsenwwwswsweswwswswswewwww +neeeswneeeeeeeeneeneeswwenesw +newwwnewwwnwnwsewnwswsew +enwswnwnesenewwneenenwnesw +eneewwneswnwneeneeswe +seseesesesesesesesenwsesenwesewswnenew +wseswswseswnesweswswswsw +seeeeeenweeeeweseenenenewwe +nwsenewsenweswsewwnwenwwenwse +nwwnwnwwnenwwswsewsenenwnwnwewwse +eeneeweeeeeenee +seswneneewswswswswswswswswneswwwwsw +senwnewnwnwenwnwnwnwnwnwnwnwnw +wwsenwnwwenwwwneewwnwswseneswe +nenenenenenwnenenesenewneneewnwseewsw +wsenwswswnwnwnwnwnenwwnwnwwnwneeenw +neeenwsewsesweeeenweneswenenwswwe +nwwnwenwwnwnenweswwenwesenwnwwnw +seneswnwwswwswwswwwwwnewswneswe +eeneeweweeeenee +wneseseweneseeewsesenesenwwwwnwse +swwnweseswneesesenewseseeswswnwwswne +swnwsenwsewseseseswnwseneseswswswswene +swwseswswseseneseswseswseswswneneswnwsw +sesesenweswswsweswsewseseseseswsw +seswnwewwwsewnwwnenwwnwwnwnwnwnw +enweewseeseenweneseseseenweeee +wwwwwwswwwwneswswsww +sweswnwnwsewswsewnwswwwwneseneesw +nwseswnwnenwsewnwenw +nwnesenewnesweenenenwneneneneenewsene +swswnwwswswseswenwswswwswswe +nenwnenwnwnwnwwnwenenwswnesewnenwnwe +swseeseswweswswswseneswswswswswswww +neswnwnenenwnwneneneneneeswnwnenenwneesw +nenwnwesewnwsenenenwnwswwnwnwnesene +seeeseswewnwneseseenwweeeseneesw +swswswnenwswnwneswseswesewnwseswsenwswsw +senesewseseseseseseeswesenwsewsenesese +nwnwnwwnwnwnwnwsenwnewnwnwww +neswneseeseneswwwnewswwwwwwswwsww +nweesesenwesesesenweeeseseeseswse +neneeneswneswneenesenwwnwsenwneswwnene +enewewswnwnweesweswseeeeeenwe +eswseeseneeseseseseeee +sesesewsesewseesenwsesesenwswesenweswse +nwnwswnesweenwswneseeseswneewnenenenwsw +nwseswswswseeewswswwenwne +swneewswnwswswswseswwseeeswswswneswwsw +eneneeseneewneneenenesenwnewnenene +nwsweseswswswswswswswsw +nwnenwnwwwnwseneswnwenwnwswswwweswnee +nenwnwwnwwesenwseswenenwwnesewnww +sesenwseeweeenweseeeeeenwesee +eeswwesewseseeeesewnw +nwenwnwenwnwnwnwswnwwnwewnwnwswswnw +neweswnwsweneneweneeneneswnenesenwsw +seseseswswsesenesewsesese +seeeeeewesenwenenwewsenwseee +eneneweewwneeneneesene +swnwnweeswswsweesenwsewseswswnwswsewse +neneseneswneneneneswneneswneneneenenwnee +nenewnenewwneneneneneeseneneneseneswse +nwswsweeeseeewwnwswnwswnwne +newwnwsewswwwnewwwsewwwewww +wwwwwnwwwwswwenwnwnwnwwesweew +nwneneneseneeeneswswneweseeeneene +enesesenwnwseseewneswswseesweseseene +wwnwenewwwnwnwnwsenwnwwwnenwnwsw +swwwewwweww +wnewwwseeesewsenwnwnwnwswnwewwnw +eswnwnesenwnwnwseseswnwswseseewswsew +swneneseswnenwnenwenenweswneenwnenwne +wwnewnewsewsww +nwwenwnwneseseewwwnesenwswswswnenw +seenwnwswwsenwseswwsewneswseseesee +eseeseeswseeseeesenenewese +eseseseseeseeseseswesesenenwnewesw +neeswnwswsweeewnweesweswnewnwene +newwnwnwneswwwenwwwsewwwsenww +nenwswnwnwnwswnwneseewswnwnwnee +sesewswwswwsewswnwnwnew +sweswswnwnwnweswswsesw +senesenweneneswsewnenwnenenenenenwenee +enwwnwswnwneenwnwnwnwswnwnwseswnw +newswnwnwswewneneneneswwwseneneesene +seswsesesewswneseseseseewswswsenwsese +newnwnenwnenenwsenwseneneneswnwnenwnene +nwnwnenwnwnwnwnwswnwnwnwwwewnweswnw +nwnenwnwnenenwnwwsenenenwnweswnene +nwwnenwnenenesenewseneneneswnwenwnwnenw +nwnwnwnenwnwwnwsenewnenwsenwnwnwnenwnwsw +swsenwswswswswneswswswsweswswswsewswnw +wwswwswsweswnwswwnwewwsewwwew +sewwnenwnwswwwnwwewnwwnwnenwneswnw +ewneeenweneeseeeswenw +nwnwneeswneseewneneneseeeeee +wsweswewswwnewswnwwwnwnwswwesewe +enwnwnwsenwnwnenwneswnwsenenwneswnwnwnw +nenesenewnenwswnewwsesewswsenewsww +wnenenenenenenenenenenenesenwnesesewnene +wswnwwwwnwnwewnwsew +nesenwwswseenwseswnesesesenweseseseese +nwewnenenwswsenwnewnwneneesenwnwwnwnwne +nwnwnwwnwneneswenenwnwnwsenwneswneeswne +seseseseeeseswnwsenwswneseeeewsese +sewnenweswneeswenesenwenwwswwneswnw +wsesesesewsesesesesesesenwseseeeew +seseeeesesesweewewwesewwnew +nwnwswswenwnenenenwnwnenwnwweneswnenwe +neeneneenwneneneneesweswneseneneew +weewwwwwnewwwwwsewewswnw +swseseenweeeeeeee +seseseeseseseneseseeswseee +nwewnwneenenenwnwnwwswsewnwsenenwne +nenwnesenewnenenenenenenenesenenw +seeesweenwsesese +nenwnenwsesenenenenenwwnene +eseneseswnwsewesesenwseseeeeswsese +swseseesweseneswneesesesenwsee +swnenewwswwwwwnwwewnewswwsesw +eswnwsesenwsesenwenwnesesesweswwnwnenw +nesenwneseseswswseseswswseweswneswswsese +eseswsewnwnewenwseneeeseenesw +eneeeneeneweneewneneeneewsee +sewesesewseswseseseseseswnesenwneseswsw +eneesenwneeseenenwwseneeneeee +neweneswnenweeneeseeneewnesenenwe +wsesewswwwwnwenweswnwneneswnww +eswnwenwwweswwsewswswnwsenwwsww +wnewnwwsenenwnwnwnwnesenenwsesewnene +seswnwwwseneswnenewwnwesesewne +eenwesweweeneeeeweeee +neneenewswwseenenwnenenwnwnesenenenene +nwsenwnwsesenwseseseeseswseseseseseswsese +sesenwseswewswswsenweswnwswswseenesese +swsewswsenwswwnwsweenwnwseseseeswwe +seeseswswneseseswwsesenwswsesesenesese +sweneswnenwswswseswseswswseewnwnenwesw +wswseswwnewwwswswswswsewswswnwwenw +seneenweswnwswneeseseeswsesenwesesee +wwenwsewwwwwww +swseswswwseseseseeswsw +wswneneswswnwwseswwwswswewwsewesw +esesweeeesenenenwnwnew +sesesenweseseeseseseeesee +esewseseseseswsesenesewsewswsesesee +swwswwwswwnwwswwsenewneswswsenwwe +seseswsesesesesewsesenesenesesenwseswsenw +senwwwwenwseneswseneewnwnwenewww +seswsenwsweseswseseneeseeseenwseww +seseswwneneswswwwswnwneswswswsewnwswwsw +eweewneeenewwseewewseene +neeneswnenenenenenene +wnenwwwwnenwswwwswsenwwenwweww +wnenwnenenesweeneneenenenwneenwsese +neewsenenesesenweseseswsweswne +neneeneneeeeneesw +eseneswseenwswneesweseeseeesenwnwee +wwsesenwneswneseseneswnwseseneseswsene +wewsenwewwwnwwwwwwwwesene +wsewnwnwwseeswwsw +swwswwswswswwswsweswwsw +eeeseeneswnwseseneseenwesweswnwswswne +eseswwsenenesesewsesesesesese +eseeswesesesesewseenwsesewnwsesesese +newwwwwsewswnwnwneseswwnwswwwwne +nwesenwnwwswwweweewwwneswwsw +eeeeeeeeeweese +eeneewweswweeneenwseseseeswnenw +swewswwwwnwsweswswswneewseswwww +swwswwsweswwswwnesw +seeseseneesewseseswnwswsesweseneseese +swswswewneseseseseseswnwswnesesesenwse +weseeeeeeeee +swswsewseseeswsesw +seseseswnweneswsenenenwwwswswsenweeese +swnenwneswenwnwsenwenenenenenenewswnene +nenewwwwwswweswewewnwwsewnwse +senwewswswnwenwswseneeswswse +eseeeweweeeeenwsweneeeneseee +enwseeeseeneeweseeseeeeswenwe +nwnwsenwnwnwnwsenwnw +swswwswswweewwwsww +seeeeeeewsee +ewwwnwwnwwsenesewneswswswswswseew +nesenwwnwnwseswswnwneswnwnwnwnwnwwnenw +nenwsweseswseewneswwseeenwnenese +wswswswswswswswwswnese +swnenwswswnwswnesenwnwseewseneseenwnene +nwsesenesenwnwswesenwnenenesewwnwnwnw +nenwswswwewnwseswwwswneewnewese +enenenenewwneneesesenenewenenenesew +nwnwsenwsenwnenwnesenenenwwesenwwsenesww +nwsenwswswsesesenesewswsesesesesesenene +eeneweenwenwenwsesesweseeswsenw +seseseswswswswswnwwesweswneswnw +seseswsesesenwseswswsee +nwwnwnewwwwwwwewsewnwswnww +seswnewswnwseneseneswseseeswswsenesewse +sewswneswnwswswswswneweswswswswswswswsw +wenesenenenwnwnwnew +nenwnwnwnwnwwweswwenwnwnwnwswnw +seneneswneneneswnwsenwnesenw +wswswnwsweswnwsesewsenwnenewsewsene +eswnwseeseewseenwe +neenwsweswnenewsenwnwswne +wnwewnwwnwswwnwwseewsenwnesenwnw +nwneneenewsesweseneeneneewsenwnenene +sesewsesenewswseseenwseneswswsesesese +wwwsewwnwwnesenwwnwnesewwwnwnww +seseseseswnewseswnewne +neswsweneeneneeneswenwnenenewneenene +wsesesesesesesenwseeseseeseseneswwne +swwenwnwnwenwsenwwwne +swnenenenenenewnenenwneesenwswnenenenene +wswneseneswenewswswnwswneewenwweswe +nenewseenwsenesenwswwsewwnwewsewnw +wseeseeweneswsenweseneesenenwswwsw +neswswneswsewwswwsewsweeneswwnwsw +sesenwswnwseswseeswswseswneseseseswwswsw +seswneseneswwnwnwnesenwseenw +eesesewsewnwnenenenwnweseswwwnee +wneenewnenenwneneseneesenesenwwwsenese +seseseseseeweseswsesewseseesesenwe +nwenwwenwnwnwwnenwnwnwsenw +eseeeneeseneswewseseeesesenweesw +swsewswswnwsewnene +nwnenwneswnwnwnenenenwnwnenenw +eeeseeewseeeseeesee +swnenwswnwnwnenwnenwnwnwnwnwenwnwenwnesw +eeseseeswwneeeesesesesesenewsee +swnenenenesenenwnesenenwnenesenenenenewne +neewwwwewwesewwswwnwwwne +nwsewnwwswwnwwwwswneneswneswnwnwnew +wswswseeneswwwwsweswswswwnenwesw +nwswewnwsenwswnenweewnwnwenwsw +seeenwweseeeeenenweeesenw +swnwwswswswswwswswneswswneesw +sweseneneswwswswewswwwnenwseneswnese +eneenwewseeeeesenwseeeseseswsee +nwnewnwnwsenwnwwneesenwnwnenewnw +newswswwswwsewsewwnene +eneseswenewwneseneneneneswneneneswnene +nweneeseneeeesesweeneeenwewnee +seswsewnesenenwnenwswwwwnweweswnw +nwneseneswswseseseswnewneswseseseesene +eeewseswweswenwesenwsewswswnenwne +nwnwnwnwwnewnwswnwnwsenwnwnwnewenwnw +seseswswsweswwseswswsweswwsesesenwnesw +neeswnwswswswseswswwneswswswseseswswsesw +swswseeneswswswwswswswnwnwseswenwew +swswswseswsweswswewswnwseseswswswnwnee +nwwwnwnenwneneeeenwswnenw +senenwswnwneewsewswwweneeeeesesw +nwswenwsweseneesesewnwwnwseweenenese +swesenwseeneseeseswswseswseeseenwnwse +wneseweweneneswsenwnenenenenwnenwnew +swswswswswswswswnwswwwwswse +neeseseenwsweneneeesenwweewwew +swswswsweeswewnwwewsweswnenwswswnw +enwwneneswnenenwnwnenenenwwneenenenese +nwwwenwwenwwwnwnwnwnwseswnwwnww +sweswwwsweweswswweswwnwswswnenwese +neseseseseseseseseseseseswsese +nwsesenwneseseseseswseese +swneswnwwwwenwwwe +nwnwnwnwnewnwwwnwnwnenenwsenwsesenwnww +nwwswneseseswsenweswswswneswwswwswswsw +neenwsenenenenenenwswswnenenwsenenene +newnwnwnwnwwnweswwewsewenwwnwnwnwnw diff --git a/src/bin/day24.rs b/src/bin/day24.rs new file mode 100644 index 0000000..3aa38db --- /dev/null +++ b/src/bin/day24.rs @@ -0,0 +1,140 @@ +use std::collections::HashSet; + +const INPUT: &str = include_str!("../../data/day24/input"); + +#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] +enum Direction { + East, + SouthEast, + SouthWest, + West, + NorthWest, + NorthEast, +} + +impl Direction { + const ALL: [Direction; 6] = [ + Self::East, + Self::SouthEast, + Self::SouthWest, + Self::West, + Self::NorthWest, + Self::NorthEast, + ]; + + fn symbol(self) -> &'static str { + match self { + Self::East => "e", + Self::SouthEast => "se", + Self::SouthWest => "sw", + Self::West => "w", + Self::NorthWest => "nw", + Self::NorthEast => "ne", + } + } + + fn parse_list(line: &str) -> Vec { + let mut line = line.trim(); + let mut result = Vec::new(); + 'outer: while !line.is_empty() { + for &d in Self::ALL.iter() { + if let Some(rem) = line.strip_prefix(d.symbol()) { + result.push(d); + line = rem; + continue 'outer; + } + } + panic!("Invalid directions: {:?}", line); + } + result + } + + // -> (row, col) + fn as_offset(self) -> (i32, i32) { + match self { + Self::East => (0, 1), + Self::SouthEast => (1, 1), + Self::SouthWest => (1, 0), + Self::West => (0, -1), + Self::NorthWest => (-1, -1), + Self::NorthEast => (-1, 0), + } + } +} + +#[derive(Clone, Copy, PartialEq, Eq, Hash, Default, Debug)] +struct Position { + row: i32, + // the "0"-column goes from south-west to north-east through (0/0) + col: i32, +} + +impl Position { + fn adjacent(self) -> impl Iterator { + Direction::ALL.iter().map(move |&d| self + d) + } +} + +impl std::ops::Add for Position { + type Output = Position; + + fn add(self, rhs: Direction) -> Self::Output { + let (row, col) = rhs.as_offset(); + Self { + row: self.row + row, + col: self.col + col, + } + } +} + +fn daily_flip(black_tiles: HashSet) -> HashSet { + let mut new_black_tiles: HashSet = HashSet::new(); + let mut dont_flip_to_black: HashSet = HashSet::new(); + for &tile in &black_tiles { + let mut count_adj_black = 0; + for adj_tile in tile.adjacent() { + if black_tiles.contains(&adj_tile) { + count_adj_black += 1; + } else if !new_black_tiles.contains(&adj_tile) && !dont_flip_to_black.contains(&adj_tile) { + // white adjacent: maybe needs to be flipped to black + let mut white_count_adj_black = 0; + for adj_tile_2 in adj_tile.adjacent() { + if black_tiles.contains(&adj_tile_2) { + white_count_adj_black += 1; + if white_count_adj_black > 2 { break; } + } + } + if white_count_adj_black == 2 { + new_black_tiles.insert(adj_tile); + } else { + // don't check again + dont_flip_to_black.insert(adj_tile); + } + } + } + if count_adj_black == 1 || count_adj_black == 2 { + new_black_tiles.insert(tile); + } + } + new_black_tiles +} + +fn main() { + let directions = INPUT.lines().map(Direction::parse_list).collect::>(); + let flip_tiles = directions.iter().map(|tile| { + tile.iter().fold(Position::default(), |tile, &dir| tile + dir) + }).collect::>(); + let mut black_tiles = HashSet::new(); + for &tile in &flip_tiles { + if black_tiles.contains(&tile) { + black_tiles.remove(&tile); + } else { + black_tiles.insert(tile); + } + } + println!("Black tiles: {}", black_tiles.len()); + for _ in 0..100 { + black_tiles = daily_flip(black_tiles); + } + println!("Black tiles: {}", black_tiles.len()); +}