Skip to content

Commit 7a12b4c

Browse files
committed
Added day 2020-24
1 parent 08478c1 commit 7a12b4c

File tree

1 file changed

+163
-0
lines changed

1 file changed

+163
-0
lines changed

2020/24-Lobby Layout.py

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
# -------------------------------- Input data ---------------------------------------- #
2+
import os, grid, graph, dot, assembly, re, itertools
3+
from collections import Counter, deque, defaultdict
4+
5+
from compass import *
6+
7+
8+
# This functions come from https://github.com/mcpower/adventofcode - Thanks!
9+
def lmap(func, *iterables):
10+
return list(map(func, *iterables))
11+
12+
13+
def ints(s: str):
14+
return lmap(int, re.findall(r"-?\d+", s)) # thanks mserrano!
15+
16+
17+
def positive_ints(s: str):
18+
return lmap(int, re.findall(r"\d+", s)) # thanks mserrano!
19+
20+
21+
def floats(s: str):
22+
return lmap(float, re.findall(r"-?\d+(?:\.\d+)?", s))
23+
24+
25+
def positive_floats(s: str):
26+
return lmap(float, re.findall(r"\d+(?:\.\d+)?", s))
27+
28+
29+
def words(s: str):
30+
return re.findall(r"[a-zA-Z]+", s)
31+
32+
33+
test_data = {}
34+
35+
test = 1
36+
test_data[test] = {
37+
"input": """sesenwnenenewseeswwswswwnenewsewsw
38+
neeenesenwnwwswnenewnwwsewnenwseswesw
39+
seswneswswsenwwnwse
40+
nwnwneseeswswnenewneswwnewseswneseene
41+
swweswneswnenwsewnwneneseenw
42+
eesenwseswswnenwswnwnwsewwnwsene
43+
sewnenenenesenwsewnenwwwse
44+
wenwwweseeeweswwwnwwe
45+
wsweesenenewnwwnwsenewsenwwsesesenwne
46+
neeswseenwwswnwswswnw
47+
nenwswwsewswnenenewsenwsenwnesesenew
48+
enewnwewneswsewnwswenweswnenwsenwsw
49+
sweneswneswneneenwnewenewwneswswnese
50+
swwesenesewenwneswnwwneseswwne
51+
enesenwswwswneneswsenwnewswseenwsese
52+
wnwnesenesenenwwnenwsewesewsesesew
53+
nenewswnwewswnenesenwnesewesw
54+
eneswnwswnwsenenwnwnwwseeswneewsenese
55+
neswnwewnwnwseenwseesewsenwsweewe
56+
wseweeenwnesenwwwswnew""",
57+
"expected": ["10", "Unknown"],
58+
}
59+
60+
test = "real"
61+
input_file = os.path.join(
62+
os.path.dirname(__file__),
63+
"Inputs",
64+
os.path.basename(__file__).replace(".py", ".txt"),
65+
)
66+
test_data[test] = {
67+
"input": open(input_file, "r+").read(),
68+
"expected": ["538", "4259"],
69+
}
70+
71+
72+
# -------------------------------- Control program execution ------------------------- #
73+
74+
case_to_test = "real"
75+
part_to_test = 2
76+
77+
# -------------------------------- Initialize some variables ------------------------- #
78+
79+
puzzle_input = test_data[case_to_test]["input"]
80+
puzzle_expected_result = test_data[case_to_test]["expected"][part_to_test - 1]
81+
puzzle_actual_result = "Unknown"
82+
83+
84+
# -------------------------------- Actual code execution ----------------------------- #
85+
west = -1
86+
east = 1
87+
northeast = 0.5 + 1j
88+
northwest = -0.5 + 1j
89+
southeast = 0.5 - 1j
90+
southwest = -0.5 - 1j
91+
92+
text_to_direction = {
93+
"e": east,
94+
"w": west,
95+
"nw": northwest,
96+
"ne": northeast,
97+
"se": southeast,
98+
"sw": southwest,
99+
}
100+
direction_to_text = {text_to_direction[x]: x for x in text_to_direction}
101+
102+
relative_directions = {
103+
"left": 1j,
104+
"right": -1j,
105+
"ahead": 1,
106+
"back": -1,
107+
}
108+
109+
110+
def neighbors(tile):
111+
return [tile + direction for direction in all_directions]
112+
113+
114+
all_directions = [northeast, northwest, west, east, southeast, southwest]
115+
116+
tiles = defaultdict(int)
117+
118+
for string in puzzle_input.split("\n"):
119+
i = 0
120+
position = 0
121+
while i < len(string):
122+
if string[i] in ("n", "s"):
123+
direction = string[i : i + 2]
124+
i += 2
125+
else:
126+
direction = string[i]
127+
i += 1
128+
position += text_to_direction[direction]
129+
130+
if position in tiles:
131+
tiles[position] = 1 - tiles[position]
132+
else:
133+
tiles[position] = 1
134+
135+
if part_to_test == 1:
136+
puzzle_actual_result = sum(tiles.values())
137+
138+
139+
else:
140+
for day in range(1, 100 + 1):
141+
all_tiles_to_check = set([x for tile in tiles for x in neighbors(tile)]).union(
142+
set(tiles.keys())
143+
)
144+
new_tiles = defaultdict(int)
145+
for tile in all_tiles_to_check:
146+
black_neighbors = sum(tiles[neighbor] for neighbor in neighbors(tile))
147+
148+
if not tiles[tile] and black_neighbors == 2:
149+
new_tiles[tile] = 1
150+
elif tiles[tile] and black_neighbors in (1, 2):
151+
new_tiles[tile] = 1
152+
153+
tiles = new_tiles.copy()
154+
puzzle_actual_result = sum(tiles.values())
155+
156+
# -------------------------------- Outputs / results --------------------------------- #
157+
158+
print("Case :", case_to_test, "- Part", part_to_test)
159+
print("Expected result : " + str(puzzle_expected_result))
160+
print("Actual result : " + str(puzzle_actual_result))
161+
# Date created: 2020-12-24 06:11:40.071704
162+
# Part 1: 2020-12-24 06:21:59
163+
# Part 2: 2020-12-24 07:07:55

0 commit comments

Comments
 (0)