Skip to content

Commit 1b74944

Browse files
committed
bug somewhere
1 parent 7201698 commit 1b74944

File tree

6 files changed

+118
-9
lines changed

6 files changed

+118
-9
lines changed

.run/Python tests in part1.py.run.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
<option name="INTERPRETER_OPTIONS" value=""/>
66
<option name="PARENT_ENVS" value="true"/>
77
<option name="SDK_HOME" value=""/>
8-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/day17"/>
8+
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/day18"/>
99
<option name="IS_MODULE_SDK" value="true"/>
1010
<option name="ADD_CONTENT_ROOTS" value="true"/>
1111
<option name="ADD_SOURCE_ROOTS" value="true"/>
1212
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py"/>
1313
<option name="_new_additionalArguments" value="&quot;-s&quot;"/>
14-
<option name="_new_target" value="&quot;$PROJECT_DIR$/day17/part1.py&quot;"/>
14+
<option name="_new_target" value="&quot;$PROJECT_DIR$/day18/part1.py&quot;"/>
1515
<option name="_new_targetType" value="&quot;PATH&quot;"/>
1616
<method v="2"/>
1717
</configuration>

.run/Python tests in part2.py.run.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
<option name="INTERPRETER_OPTIONS" value=""/>
55
<option name="PARENT_ENVS" value="true"/>
66
<option name="SDK_HOME" value="D:\DEV\Python\Projects\aoc2022\.venv\Scripts\python.exe"/>
7-
<option name="SDK_NAME" value="Python 3.10 (aoc2022)"/>
8-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/day17"/>
7+
<option name="SDK_NAME" value="Python 3.9 (aoc2022)"/>
8+
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/day18"/>
99
<option name="IS_MODULE_SDK" value="false"/>
1010
<option name="ADD_CONTENT_ROOTS" value="true"/>
1111
<option name="ADD_SOURCE_ROOTS" value="true"/>
1212
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py"/>
1313
<option name="_new_additionalArguments" value="&quot;-s&quot;"/>
14-
<option name="_new_target" value="&quot;$PROJECT_DIR$/day17/part2.py&quot;"/>
14+
<option name="_new_target" value="&quot;$PROJECT_DIR$/day18/part2.py&quot;"/>
1515
<option name="_new_targetType" value="&quot;PATH&quot;"/>
1616
<method v="2"/>
1717
</configuration>

.run/part1.run.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
<env name="PYTHONUNBUFFERED" value="1"/>
88
</envs>
99
<option name="SDK_HOME" value=""/>
10-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/day17"/>
10+
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/day18"/>
1111
<option name="IS_MODULE_SDK" value="true"/>
1212
<option name="ADD_CONTENT_ROOTS" value="true"/>
1313
<option name="ADD_SOURCE_ROOTS" value="true"/>
1414
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py"/>
15-
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/day17/part1.py"/>
15+
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/day18/part1.py"/>
1616
<option name="PARAMETERS" value="input.txt"/>
1717
<option name="SHOW_COMMAND_LINE" value="false"/>
1818
<option name="EMULATE_TERMINAL" value="false"/>

.run/part2.run.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@
77
<env name="PYTHONUNBUFFERED" value="1"/>
88
</envs>
99
<option name="SDK_HOME" value=""/>
10-
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/day17"/>
10+
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/day18"/>
1111
<option name="IS_MODULE_SDK" value="true"/>
1212
<option name="ADD_CONTENT_ROOTS" value="true"/>
1313
<option name="ADD_SOURCE_ROOTS" value="true"/>
1414
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py"/>
15-
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/day17/part2.py"/>
15+
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/day18/part2.py"/>
1616
<option name="PARAMETERS" value="input.txt"/>
1717
<option name="SHOW_COMMAND_LINE" value="false"/>
1818
<option name="EMULATE_TERMINAL" value="false"/>

day18/__init__.py

Whitespace-only changes.

day18/part1.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import argparse
2+
import os.path
3+
from collections import deque
4+
5+
import pytest
6+
7+
from support import timing
8+
9+
INPUT_TXT = os.path.join(os.path.dirname(__file__), 'input.txt')
10+
11+
# NOTE: paste test text here
12+
INPUT_S_1 = '''\
13+
1,1,1
14+
2,1,1
15+
'''
16+
EXPECTED_1 = 10
17+
INPUT_S_2 = '''\
18+
2,2,2
19+
1,2,2
20+
3,2,2
21+
2,1,2
22+
2,3,2
23+
2,2,1
24+
2,2,3
25+
2,2,4
26+
2,2,6
27+
1,2,5
28+
3,2,5
29+
2,1,5
30+
2,3,5
31+
'''
32+
EXPECTED_2 = 64
33+
34+
35+
def compute(s: str) -> int:
36+
cubes = set(
37+
tuple(map(int, line.split(',')))
38+
for line in s.splitlines()
39+
)
40+
41+
# consider the envelope around the cubes to be one larger
42+
min_max = lambda x: (min(x) - 1, max(x) + 1)
43+
# (min_x, max_x), (min_y, max_y), (min_z, max_z)
44+
bounds = tuple(map(min_max, zip(*cubes)))
45+
46+
start = tuple(coord[0] for coord in bounds)
47+
total_sides = 0
48+
49+
# BFS
50+
seen = set()
51+
queue = deque((start,))
52+
while queue:
53+
# Pop the first current from the queue
54+
current = queue.popleft()
55+
# Mark the current as seen
56+
seen.add(current)
57+
# Get all the neighbors of the current
58+
x, y, z = current
59+
candidates = (
60+
(x + 1, y, z),
61+
(x - 1, y, z),
62+
(x, y + 1, z),
63+
(x, y - 1, z),
64+
(x, y, z + 1),
65+
(x, y, z - 1),
66+
)
67+
for candidate in candidates:
68+
if candidate in seen:
69+
continue
70+
if candidate in cubes:
71+
total_sides += 1
72+
continue
73+
if not all(
74+
bound[0] <= coord <= bound[1]
75+
for coord, bound in zip(candidate, bounds)
76+
):
77+
continue
78+
79+
queue.append(candidate)
80+
81+
return total_sides
82+
83+
84+
# @pytest.mark.solved
85+
@pytest.mark.parametrize(
86+
('input_s', 'expected'),
87+
(
88+
(INPUT_S_1, EXPECTED_1),
89+
(INPUT_S_2, EXPECTED_2),
90+
),
91+
)
92+
def test(input_s: str, expected: int) -> None:
93+
print() # newline in test output, helps readability
94+
assert compute(input_s) == expected
95+
96+
97+
def main() -> int:
98+
parser = argparse.ArgumentParser()
99+
parser.add_argument('data_file', nargs='?', default=INPUT_TXT)
100+
args = parser.parse_args()
101+
102+
with open(args.data_file) as f, timing():
103+
print(compute(f.read()))
104+
105+
return 0
106+
107+
108+
if __name__ == '__main__':
109+
raise SystemExit(main())

0 commit comments

Comments
 (0)