diff --git a/2020-python/inputs/day_24 b/2020-python/inputs/day_24 new file mode 100644 index 0000000..f462ece --- /dev/null +++ b/2020-python/inputs/day_24 @@ -0,0 +1,406 @@ +neneeenenesweneswneesewenenwneew +eswswenweeseneseswwsenewsenw +seeweswwneswnwwwenwwwwwnenwwsesw +swsweseseseswswsenwswseswswsese +eseseseswsenweseseneseswnwneeewww +sweeeeeenweseenesweee +nwnwsewenwwnwnwsenwwnwseswnwnw +swswswwwswweswswswswswenenesesewwwe +swnwenenesenwsewswswseeeswnwwnewwsese +senwweewnwweswnenwwsw +ewneswswsweenwwnwsenwswnewsenwnwsw +nenenwwneenwnwnwwnesewsenenwnwnenwnw +nwnwwsenwwnwnwnwnwwnwnwewwnw +wnwnwnwnwseswwnwnwesewsenwnwnwnwnenew +seswewwneweswnwnwswwsw +neswesenenenewwswnenwnenenenwnenenenese +nwwswsenwnenwnesenwnwsenwnwnwwnwsenenwse +senwswwswwnweswswneswswwswnweswseswew +neeeeswnweswseeeeeneeeeenwwnene +nwnewnwnwnwswnewwsewnwwseenenwnww +eeseeeeeswneenwewee +neseseseeenwwseseeseneswnenwsewswse +wswswnwnwwswswneswwweeswswswwww +swnwnwneswswseswseswswswswswnwseswsesenesw +swneesenwnwnwwnwnwnenwnwnwnwnewnwsese +wswswswewnewnewsenewnwswseswswwse +swenwnwnwnenwnenwnwswnenenwswwnenwsenw +ewnenwnwweenwneesewnwwwwnwswse +eeewnweneneeesweesweeeneeee +nenwnwnwnwswwnwsewnwswswenwweswenw +senenenenenenwneneewnenenene +neneeneswnesewneneneeneneeenenenwe +nwswenwseswnwswenwnwnewnwneww +wnewwwweswwsww +seseswsewesesenesesewseewseseenenwe +neneseswnesenewwenenwneneneneneenew +swswswswwsweswseswsewwneswswswswneswswsw +sesenesesesenwsesesesenwsewnw +nenenenenenewnwswnwnenwsenesenwneswwne +swwnewweewwwwnwswnewwweswew +swnwwswesenewwwswwswwweseswswnesw +weeseseseneseseewwseseseseseseesese +nwenenenwwnenenenenwneneneseswnenwenesw +nwsewswswwswsweswnwwwnwswswsew +nwewnwwwewnwwnwnwwnwswwnwwsewnw +eesesesesesesewseseewneseesesesesenw +nwwenwweswnwswenwnw +sewseswswneneswnwenwneeswwnwwesenw +eseswwnwnwwenewneswnwsweenwseswne +wsewwswnwnwewnewswwwwswseswnew +eswnenwnwnenwswnenwnwnwnenwnwnwnenwsewne +neneewswnenenenenene +nwseeseseesesesesesesese +eenweneeeswswseeseeneesese +sewneeneneswseeewnwswsenewswenwwenw +nwwwweswnenwsenwwswnwwnwwwnwwnew +nwewwneswnwwwnwswswsesweswswwseww +neseswseweseeswsenwsesesesesw +nwswswseswswseeswswseswnewneseswswwsw +eweseeswseeeeseneenwenweeee +nesewwwwneeseweswwseneeseseswseswsw +nwswnwnewnewneeenwneeswwnwse +swwnwsesewneneeneenwseswseswnww +nwnwnwnwsenwnwnwnwnwnwnwnw +wwnewnwsesewwwwwwnwseewsenenew +swswswswenwswseswsweeswnwswswswswswswswnw +nwnwseeswnwnwswnenwwnwnewnwnwwnwnw +wnenenesesenwnwwnwsenenesewnewnenee +senwswnwnwwenenwnenwnenesewswenewnene +neseseeseneswswswswswwwswswnwswwsenesw +neswwsesenwnwnwneswseseseseswnesenwsese +eeweesenesweenweeneenwneeswse +wwnewswsenwnwsesenwswseneeswswseswnese +wnwsewnwnwnenwnwnwnwwnwnwwww +wwswswewwwwwwswwwwnewnwnenw +eeneseswswnewneneneenenenenenenenew +wswwnwswwswneneneswnwnwnwswseneneswsenene +nwswswewswsewswsewswsenweswswneswnwsw +wwwwesewnwnewwwnewwwwsese +nwnesenwnwnwnwswswnwwswwnwnwwwwneeenw +swseseswenwswswnwswwnenesenesesesesesese +nesewswswswsewswswnwswwswwswsw +wnwwwnwnwnwnwsewsenwsewwwwwww +wwwwwwwwswwswwwewwnw +swseseseseeswsesesenwseseswseswwsenwse +sweeeseeswnwenwneeenwneswenwneee +nwswseswswswswwsweswnesesweswswswseswse +nwnwenwnwnwnwnwswnwwnwnwwnenw +wseewnwnwnwenewnenenesenewnenwnenwne +nwsweswswswswswswswswsw +swswwswwswswswswnenewenwewweswnw +nwseeswnwnwseseseswneseswseseseenewsw +wseswseseesenweeeseeeewnwenene +newnenenwswnwnenenwneneseneneneenenesenw +wnwnwswseenwnwnwnwenwwwnwnenwnwswne +esesesesewneseswswsewswseswswneswsesesw +wsewwwnewswwnenenwnwwnwwnwnwwwsew +wsenwenwnwnwewwsesenwwwwnwnwnwnew +nwnwnenesenenenwnenewnenenwneneswswnene +eseneneewneneneeneeneneee +nenenenwnwseswswnwwnwnwwesenwsenewswne +neenwnwnenenwnwnwwnwnenwnwnwwnwswsenw +swwwswwswswwnwwwnenwseswswwseswsenw +nwsewneswnwesweeswnwwwnweswnwne +neswsewswseswseswswswneswseswneseseswsww +wsewwwnwnenwnwewwseenwwwwswnw +neseseswseswwswswswnenwsesewswswswswsw +swwsweswneseswswwswswswswweswwsw +nenwneneswneeneenene +eneweneseneeneeswswswenenesenenew +swseeseswswesenwsesenwswnwnwseeesenwswsw +nenenwnenwwwnenenweneneneseneswnenenene +neneenenwswswseswwwnweswnenesesewnewse +neneseneneseneenenenewswneeenenewnene +swsweesenesenenenwnwnwswsweneseenww +swnewwnwsewseswewsewsesenwneewnww +enenewnenenenwnenenenw +seseesesewwseseseseseswswseesesenese +eeenwneeeewneneeeeewswneneee +eswnwenweesenwseeswsweenwsenwnwesw +eesweeeneneeneeeeewnweeewe +seswswseseswswswsene +newswnewswwwneswwwse +neeswnenwewnwnesewsweneeswnwenesww +eswwwwwwswnesewwwnewwnwwww +ewsesenwseswsesenwsesesewesenwsenenese +nenwnewswneneneneeeneneseneneneenee +wwseseeeenwnwweseneewnweeeewsw +nwneswnwnwnwwwnwseenwnwnwenenwnw +swswswswswneswenwwweswswsw +swenwwwnwnewswnenwneswnwesweswwe +neswseenwseseeenwsesesew +seseeesesenwnwseeseseseswnesese +sweeeseseenwseeweesee +swneswsweswnewwswseswswsw +nwwwewsewwwwwwwwewswswnewsw +nenenewneswsenenenenesenenenenenenenwneenw +sewwwnesewswwnwwwwswewswwswew +swswseswnwnwswswswswswswnwseswenwseswswsw +nwnwnwnwnwnwnwnwnenwnwsenw +nenwwewnwwsewnewwnwsewwwewseswe +seseseswweewnwneneseseseesewsesesw +swswesenewswswswwewswsesweswsw +seseneneswwsewneeenwenenwseenwsee +nenwenwwneewnwneswnwnenwseswnwenwnwnw +sweswswswseswswswseseswseswwnesesesenw +nweeesweeeeneseeseeenwenwwe +sweewneneeeseeewswneeenwneenene +swsewseseenwsenesewseseseswswseswnese +wwwswseseswwnwwnwnenenwwswnwsenesene +seswswswseeseswseseseswnwsenwseswswsesene +nenwesenwswneneseeewsesesweeseeswse +nwseswswnwseeswnwswsenwnwnenwnenwnwnenwnw +neswnenwweesenwneswwneneswnwenenesw +nwneswnesesenwswenwsesewewsweewsw +neseeenenenewnenenweswew +eenweesweewneneseneeswee +weesenwsweenenenwswenenwneswenee +nwswswsweseswwsweswswswswnwswswswswsw +esweweseeeeseneeenweeeeee +swneswswswwswnenwewswenwswswwnew +eesweswnwseeeeeeeeneseeenwsee +senwwswnwnwnwnwnwnenwnwnwnwnwwnenenwnese +swwseeswswnwnenesewnenwsenweeeene +enenwnesenenenenwnenewneneneewswswwne +nwwneseseeseeseeseseeseseeseswnwsese +sewwswsewnwwswnwnwnewenweneswesw +eneeneeneeneewneeeeeeenwsesw +wwenwwnesenwnwnwwww +nwneneswnesenenenenwnwnenenenwnene +sweneseseswewnwswwneneneneseneesenwnw +nwewenwnwwwnwnenwsesenwnenesenwnwwwnw +nwenwnwswsenwnwnwnenwnwnwnwnwwesenenw +swswwnewweweswswnwswsenesewwwnww +nenewneswnenenweenenenwswsenene +swswswwswswswswswswswswswne +eeswswenwswneenwenweseenwnweeese +swnwnwnwwwsewnwnenwwwnww +wswwwenenwwwweswseswnwswweswsw +enewneneweseeswswenewnenwwnesene +swsenesweswswswswwswswswseseseswwsw +nwwseswnwsenwsenenwwnwnwneewwwwww +wwsesesenwnwnenesenwenenwswneneenesw +seseneweseeswseseneeseseesenwesese +nwnwwswwwweenwwnwwswsewwneww +eneneneeneswnenweneswenewneeseenenew +eseewneesenewesenwsewewwwsee +nwnwnwenenenwenwnwnwsenwnwnwswnewnenwne +neseeeesewneseseweeseseswseseesese +newwnwswwewneswseewsesweswneswwse +seseseseseeseenwseeenwsesesesese +eseswnesewseswswswsenwwswseswneswsee +eeseseseneeeeeseeeseeew +nwesweeneenwnwseneeeneeeneneneswse +swswswswseseswnwneswswseswsewse +senwnweswwnwwnwweseenwswsenwnwwse +wneneneenenesenewnwswswenwnene +eswseswneseseneseseeeeeewsenenwnew +sewseeeeenwseese +sesenwnwseseseswseseswswswseesenesesesenwse +nwwneewseswneeeneneneseenenwewneese +wwwswwnewwneswwwwwsewwwsw +seswwwwneswneswwneswswswswswseww +eewneenwsweseseweeeeneneneneesw +swswsewswswwswswnewwswsww +nwnwwswnenwwnwnenwswnwnwwsenwseeswwnw +swswsenwnewseeswseseneneswsewnwsesesenwsw +senwnwnwnwswneswnwenwnwwnesweswswnwnenw +neenenewswnwswnwsewwewswsenwnwwsw +senwnewnewnwwnwwnwseseswwnw +seeseseeneswneeswnenwwswswwswnwswwe +seswenweeneeneneneeneneneee +nwwnwwenwwwwwwwnw +swswswswwswwswwswsenenwsewnewneswswne +newswnwnwswnwenwwnenwnwnwwwwsewnwnw +eneewenweeeweeseenwseneeeswse +seseseswenwseseweseseenwnee +wnwwnenwswnwnwweeeswsw +senesesenwswseseseenwseswseswswseswsesw +seseseseseseseseseseseseenwsese +seenwnwnwswsewweeweseeneesewswene +wwwseswsesenwnwnenenwse +nwwewnwnwwneswnwwnwnwnwwnwewswne +neewneneseneneswnene +wswwswnwwwswwwewswswsww +wswwneswwswnwwnwnewseswsewswenwsw +ewnwwwwswwnwesweswswwsw +wswnwnwwnenwnewwsesewwseenewswenew +wswwnenwwswnenenwnenenenenweswseseswe +nesesenwswsweeswewwswneeneeeee +nwswwwnewwwwwwneewnwsewsewsew +nwwweswwswwwnwneswnwswenwnwneew +nwnwswnwswenenenwnwwnwnenwnenenweew +neswnwneseeneneenewswwnwnweseneene +nwswswwwwseeswnwswwsweswwnwseswww +neneseneswsesewenwseswneneswnenwwenew +neneneeneneneseneeneseneww +sweenenwenweeenesweeeenwesee +seseseseseseneesesesesesesesew +senesweewneeswenwseswseseeeesee +nesesenwwswnwnwwnewsenenwswnwnenwsee +neseewnwenenwwnewnenwnwsenwnwswswnwnw +eswnenenwswnewsweseswseewsesenwsee +enweeswenwewsweeeneenweeseesee +senwswswwswwswswwswswswswseswswswneswne +sweswwnwewseneeeenenewenweee +newnenwnwswwseseseesenwsese +enweeswseenwneeenenesweeneswenewsw +nwnwnwnwnwswenwnwnwnwnwnweswnwnwnwnwnw +nenenenweneswnesenwneswneneneneeneese +seseeenwswnweeeewswseeeswwnwsenw +esenwsewseseesewneseeseseseeeenese +seewnwsesesenwesesesesewneeeseee +eneseneewneneseweeneneeeneeee +nwwnwenwswsenwnwnwnwnwwnwswwnwnwnwnew +wnewwwwwwnwwwswnwww +wnwenwsenwswnwnwnwwnenwnwnw +eeneneswnwwneneswnwneeeneneneneewne +wsewnwwwwewwwwwwwsenwwnwwe +wwwseeseswsewsewewneswnwsewnenenw +seseneswsewneswswseswseswswswseneswsesesw +nwnwnwsenenweeneneeneswswneswneseeesw +eswseswwnwswseswswswswneenwswseswsese +eenewseneeeseneneeswwneeeenenee +nweeeeseeeseeseeswenwnenweswee +swswwneneneswenenwsenenenenenwnenwnwe +nwenwnwnwseswnwnwnwnwnwnwsenwnwnwnwnwnwnw +eswnwnweswsweseseswwswswnwseneswnenwswe +wnesewneswwneswwwwnwwwwsese +nwnenwnenenenenenenwneswnenwnenw +neswenenwswneneswnwee +wwnwwwwewwnwswnesewww +esenwnwswenenwnewswneswwenwswwnwswnww +swswwswnenwwswswnwseswswswwswswewsesw +nenwsenewnwswswneeswnwnenwnwnweenwnwne +neswwnwwwnwwwnenenwnwswwnwsenwnww +neneeneswenenenenenenee +swseweseneeeswwnenwswnwnwe +eewswweneweeneneeenenenenenenene +nwnwneneneneseneseswnenwnenwnwnenwnenene +enwnwenenwswswswnwsenwswswseswseenwe +eneneneneeeswneneenenenene +enwnenwwwsenwwwswneswnwwenwewww +neneneswnenewneneneeenwnenwnesewnene +seswsenwsesesenwewseswseseseseswsesenenwse +neneenewsesewneweeewseseenwneeene +nwwswwwsesenwwwsenewwnwnew +seseenesesesesesesesewesesee +nwwnwswswswseswwswseneswswswswswswswswe +wswwnwnwnwnwnwnwwnwnenwnwenwnwenwnw +seseswseneeswneswnewwswwwnwneesenene +nenwnwnwnenwnwnwnenwsenwnwnwnw +eswwwwwsewwnewswswwwswswneswww +esenwnwnweeewswneneswnwswnwswnenwnwnene +nenweseenwneenenwseeeneseene +newnwwsenwnwenwwwnwsewswnwnwenwww +newenenenenenenwenwswswswsene +nwsweswnwwnwewewwwenwwwwwnwwnw +sewnwsewwnwsenenwwww +swswnenwnwnewneswnewnweswsweswenwsenwse +wsweseeswnwseenewseneenee +eeeeeseeswnweeeenwseseewsese +sesesesenewsesesewesesesenwseseseene +sesewswseswsewseseseswweseeseseenese +esenwswwseseseseesesesenweseseseswe +nwnenenwnenwnwnenenesw +nwnenweneenwnenwnwnwswnenwneneswnenwnw +sewswswswswswnwswneeseswswswsw +swwswswswwwwneswneswwswswswnweswsw +neseswswesesewswwswswseswswnwseswnenese +nwswnwneewneweeseeseewewneneew +swseenenwwsenwnwnewneenwwewnwswe +swsweseswswswwwwswswswnewswsw +swnwwneneswswnwewwnwsenwenwnenwee +ewswseseneesewseneswsenwswseseswsese +eneeneeseswenwsewneeweenwnwese +swnwswswseswswswseseeswnwswswsweswnwsww +wwnwnwswnwsewwnwwnwwnwwnwsenwnee +eeseeeswneseneseeweneweseee +senesenwsesenwwsesesesesesesesesesesese +nwnewesewneswneeeeneeneeswnesenene +wesenwseswsweweenwnenwwnesese +nenwnwneeswneneeneneneswneneswneneenwnee +nwnwwsenwwnwnwwnwsenwnwenwnwnwwnwne +nwnwsenwnwsenwnwnwnenwnwwnesenwnwenwne +sewswweneesenenwneseswseswnweeeene +nwswnwnwnwnwwsenwnwwnwnwenwnwesenwnw +wwwwwwnenwwwwnesewwwse +swnenenenenenenwneneswnwneesenwnenewne +neneneswneneeneneneene +wswneseswswnewwnewswwwwwwwswsww +neeneseewnenwnwneseewneenenwwnenesww +enwseswseesesewnesweeeeneswsesenese +nwnwswnenenenwnwnwnenene +wswswswneswneswwswswsweseswswseswseswsw +sewseseesesweseneseseseseseswnwwsw +swseswswwnesenewnwwnweenweswwsenw +seseseswswseseseeseesesesesenwnwsesese +nenewnenwneswnwnese +seseneswseswswseseswswseswnwwswse +nwneeeeseseneseseeseeeeeeeeww +nwnwneenwswswnenwnenwnenwwneneenenwnwnw +nwnwenwnwnwsenwnwenwnwwnwnwnwswnwnwnw +wwnwwenesesewwwnewsesewnewwwe +wnwnwwwewnwseswwwwwnewnwswnwe +nwwwwswnesewwsewsenewnwnwsewnwnww +nweeeenwseeeseee +eneenewnwenewnwsesenewewswenenese +eswwsweswseswnwsenewnenwswseswwww +neswnesenenenwnenwenenwnwneneswneswnwne +enwseswnwnweesewnwseeseseeseseseseesw +wenwwwswnewswsesewwnwwnwnenewnw +nwwseseswswewwswwsewneswnenwnwesww +swnwnwnwswenenwnwnwnwsewenenenwnenesw +weneswwswswnwsweeesenenwsenwwwsw +eeseesenesesewnweseeenesweeeeew +eseweseseseesenwwsesenese +eneneneneneneneneeenenenenenwsw +esenwnweswenenwnwswnwwnewneenewnww +eeneneneeeeswneneenwsew +seweeseesenewswsenwewwneeeeee +newnwnwenwwnenesenewsenewswnweese +neswwwswswswneww +seswseswseneswseswswnewneswswswswsenenw +eneeneeeenwswneneeswnweenwseneswnene +neswseeswseseswswsewsese +wnewwswwneswswwenewswswwwswwnene +newswseswnwnwnwnenwnwnwnwnwnesenwne +neewswseswswnwswswseneswswswswswseswsesw +nwwneenwwwwsenwwseswenwnwswwnenw +wwwenwwnwnwwnwnwnwe +esesewsesesesesesenwsenwesenwswswswee +nwsesesenweseswseseseseswsesewseseenwse +newnwnwnenwswswwwnwwwnwwnwwnenwsw +swsewsenwseseseswwseseneesweswswsese +neeenweseeeeneswneeeeweee +nwenwnwnwnenwwnwnenenwnw +wwsewwenewwwwwwwsewwwnww +neneenesweneeneenwnenwneneseseeee +eswseneseseseeeeeeeseenwsewsese +nenenwswneeswnesenenewwnenenenwenwsese +nwwwwwewwswwswwnewwwwseeww +swswswswswswswseseswneeswswseneswwswwsww +nwneneswneeswenwseenweeneneewwwnee +swswswswneswwneseswwseswswswsw +swswseswneswwwswswwswsw +nwenweseesweeeeneeseeswseeesw +swswswsweswswnewwswwwswswwwnwswse +sewneseseswsesesesesewseseswnwseneswse +enenweeswsweswenwnwe +nenenwnwnenwnenwwnwswnwnenwsenenwne +neswseneswswnwwweneswnwseswswneewnese +nenweswsweeneeneswnweeneswneswee +wsenwseseseseeseseseseseseeseneswnese +swnenwwnwnwenwnwswnwnesenesesewnwnenenw +sweneeenenwenenenweeenenwsweeeswe +sewewnesesewnenwsesesesweseswswsesesw +neswswnenwneseseneneneneneneneswnenwnene +newnewweewwwnwseswwseswwewswww +senwseseseswswnesenweseswsewswsesesewsw +senenenenenenwnwnwsewnwnwenwnwnwwnene +nwnwenenwnwwneneswneneneneenwnwnwnese +seseseseseseswwneswseswesewswseswnwse +nenwnwnenwenenweswneneswweenwneneswnwnw +swnwseswewnewnesesesesesesesee +seswnenwwwewseneswswsenweneswnenenwe diff --git a/2020-python/solutions/day_24.py b/2020-python/solutions/day_24.py new file mode 100644 index 0000000..ec724ea --- /dev/null +++ b/2020-python/solutions/day_24.py @@ -0,0 +1,131 @@ +"""AOC 2020 Day 24""" + +import pathlib +import time +import re +import operator +import itertools + +TEST_INPUT = """sesenwnenenewseeswwswswwnenewsewsw +neeenesenwnwwswnenewnwwsewnenwseswesw +seswneswswsenwwnwse +nwnwneseeswswnenewneswwnewseswneseene +swweswneswnenwsewnwneneseenw +eesenwseswswnenwswnwnwsewwnwsene +sewnenenenesenwsewnenwwwse +wenwwweseeeweswwwnwwe +wsweesenenewnwwnwsenewsenwwsesesenwne +neeswseenwwswnwswswnw +nenwswwsewswnenenewsenwsenwnesesenew +enewnwewneswsewnwswenweswnenwsenwsw +sweneswneswneneenwnewenewwneswswnese +swwesenesewenwneswnwwneseswwne +enesenwswwswneneswsenwnewswseenwsese +wnwnesenesenenwwnenwsewesewsesesew +nenewswnwewswnenesenwnesewesw +eneswnwswnwsenenwnwnwwseeswneewsenese +neswnwewnwnwseenwseesewsenwsweewe +wseweeenwnesenwwwswnew""" + +STEPMAP = { + 'e': (1, 0), + 'se': (1, 1), + 'sw': (0, 1), + 'w': (-1, 0), + 'nw': (-1, -1), + 'ne': (0, -1) +} + +def read_input(input_path: str) -> str: + """take input file path and return a str with the file's content""" + with open(input_path, 'r') as input_file: + input_data = input_file.read().strip() + return input_data + +def extract(input_data: str) -> set: + """take input data and return the appropriate data structure""" + rexp_steps = re.compile(r'e|se|sw|w|nw|ne') + tiles_steps = [rexp_steps.findall(line) for line in input_data.split('\n')] + + black_tiles = set() + + for steps in tiles_steps: + dst_tile = find_dst_tile(steps) + if dst_tile in black_tiles: + black_tiles.remove(dst_tile) + else: + black_tiles.add(dst_tile) + + return black_tiles + +def find_dst_tile(steps: list) -> tuple: + """calculate the destination tile based on the steps""" + x_dst, y_dst = 0, 0 + for step in steps: + d_x, d_y = STEPMAP[step] + x_dst += d_x + y_dst += d_y + + return x_dst, y_dst + +def count_black_neighbors(tiles: set, x_tile: int, y_tile: int) -> int: + """return the number of black adjacent tile of a given one""" + return sum((x_tile+d_x, y_tile+d_y) in tiles for d_x, d_y in STEPMAP.values()) + +def calculate_floor_bounds(tiles: set) -> tuple: + """return the floor boundaries""" + min_x = min(map(operator.itemgetter(0), tiles)) - 1 + min_y = min(map(operator.itemgetter(1), tiles)) - 1 + max_x = max(map(operator.itemgetter(0), tiles)) + 2 + max_y = max(map(operator.itemgetter(1), tiles)) + 2 + + return range(min_x, max_x), range(min_y, max_y) + +def flip_tiles(tiles: set) -> set: + """calculate the new daily floor""" + new_floor = set() + + for tile in itertools.product(*calculate_floor_bounds(tiles)): + black_neighbors = count_black_neighbors(tiles, *tile) + + if tile in tiles and not (black_neighbors == 0 or black_neighbors > 2): + new_floor.add(tile) + elif tile not in tiles and black_neighbors == 2: + new_floor.add(tile) + + return new_floor + +def part1(entries: set) -> int: + """part1 solver""" + return len(entries) + +def part2(entries: list) -> int: + """part2 solver""" + for _ in range(100): + entries = flip_tiles(entries) + + return len(entries) + +def test_input_day_24(): + """pytest testing function""" + entries = extract(TEST_INPUT) + assert part1(entries) == 10 + assert part2(entries) == 2208 + +def test_bench_day_24(benchmark): + """pytest-benchmark function""" + benchmark(main) + +def main(): + """main function""" + input_path = str(pathlib.Path(__file__).resolve().parent.parent) + "/inputs/" + str(pathlib.Path(__file__).stem) + start_time = time.time() + input_data = read_input(input_path) + entries = extract(input_data) + print("Part 1: %s" % part1(entries)) + print("Part 2: %s" % part2(entries)) + end_time = time.time() + print("Execution time: %f" % (end_time-start_time)) + +if __name__ == "__main__": + main() diff --git a/README.md b/README.md index b105196..469d50d 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,4 @@ | [Day 21](https://adventofcode.com/2020/day/21) | [2.177ms](./2020-python/solutions/day_21.py) | [1.578ms](./2020-python/solutions/day_21.py) | | [Day 22](https://adventofcode.com/2020/day/22) | [1.516s](./2020-python/solutions/day_22.py) | [1.353s](./2020-python/solutions/day_22.py) | | [Day 23](https://adventofcode.com/2020/day/23) | [14.754s](./2020-python/solutions/day_23.py) | [3.572s](./2020-python/solutions/day_23.py) | +| [Day 24](https://adventofcode.com/2020/day/24) | [1.097s](./2020-python/solutions/day_24.py) | [457.262ms](./2020-python/solutions/day_24.py) |