Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Sep 20, 2025. It is now read-only.

Commit d6f5f31

Browse files
Day 18 part 2 solutions
1 parent 0cc712b commit d6f5f31

File tree

2 files changed

+141
-0
lines changed

2 files changed

+141
-0
lines changed

‎18-2.py‎

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#!/usr/bin/env python
2+
3+
import numpy
4+
from collections import deque
5+
6+
7+
class Map:
8+
def __init__(self, max_x, max_y, max_z):
9+
self.size_x = max_x + 3
10+
self.size_y = max_y + 3
11+
self.size_z = max_z + 3
12+
self.map = numpy.zeros((self.size_x, self.size_y, self.size_z), dtype=numpy.uint8)
13+
14+
def flood_fill(self):
15+
queue = deque([[0, 0, 0]])
16+
while len(queue) > 0:
17+
cell = queue.popleft()
18+
if self.map[cell[0], cell[1], cell[2]] != 0:
19+
continue
20+
21+
self.map[cell[0], cell[1], cell[2]] = 2
22+
23+
if cell[0] > 0 and self.map[cell[0] - 1, cell[1], cell[2]] == 0:
24+
queue.append([cell[0] - 1, cell[1], cell[2]])
25+
if cell[0] < self.size_x - 1 and self.map[cell[0] + 1, cell[1], cell[2]] == 0:
26+
queue.append([cell[0] + 1, cell[1], cell[2]])
27+
if cell[1] > 0 and self.map[cell[0], cell[1] - 1, cell[2]] == 0:
28+
queue.append([cell[0], cell[1] - 1, cell[2]])
29+
if cell[1] < self.size_y - 1 and self.map[cell[0], cell[1] + 1, cell[2]] == 0:
30+
queue.append([cell[0], cell[1] + 1, cell[2]])
31+
if cell[2] > 0 and self.map[cell[0], cell[1], cell[2] - 1] == 0:
32+
queue.append([cell[0], cell[1], cell[2] - 1])
33+
if cell[2] < self.size_z - 1 and self.map[cell[0], cell[1], cell[2] + 1] == 0:
34+
queue.append([cell[0], cell[1], cell[2] + 1])
35+
36+
37+
def count_exposed_faces(self):
38+
count = 0
39+
for x in range(self.size_x):
40+
for y in range(self.size_y):
41+
for z in range(self.size_z):
42+
if self.map[x, y, z] == 1:
43+
if x == 0 or self.map[x - 1, y, z] == 2:
44+
count += 1
45+
if x == self.size_x - 1 or self.map[x + 1, y, z] == 2:
46+
count += 1
47+
if y == 0 or self.map[x, y - 1, z] == 2:
48+
count += 1
49+
if y == self.size_y - 1 or self.map[x, y + 1, z] == 2:
50+
count += 1
51+
if z == 0 or self.map[x, y, z - 1] == 2:
52+
count += 1
53+
if z == self.size_z - 1 or self.map[x, y, z + 1] == 2:
54+
count += 1
55+
return count
56+
57+
58+
lines = [list(map(lambda c: int(c), line.strip().split(","))) for line in open('18.input').readlines()]
59+
60+
max_x = max([x for x, _, _ in lines])
61+
max_y = max([y for _, y, _ in lines])
62+
max_z = max([z for _, _, z in lines])
63+
64+
obj = Map(max_x, max_y, max_z)
65+
66+
for coords in lines:
67+
obj.map[coords[0], coords[1], coords[2]] = 1
68+
69+
obj.flood_fill()
70+
print(obj.count_exposed_faces())

‎18-2.rb‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
#!/usr/bin/env ruby
2+
3+
require 'numo/narray'
4+
5+
class Map
6+
def initialize(max_x, max_y, max_z)
7+
@size_x = max_x + 3
8+
@size_y = max_y + 3
9+
@size_z = max_z + 3
10+
@map = Numo::UInt8.zeros(@size_x, @size_y, @size_z)
11+
end
12+
13+
def [](x, y, z)
14+
@map[x + 1, y + 1, z + 1]
15+
end
16+
17+
def []=(x, y, z, val)
18+
@map[x + 1, y + 1, z + 1] = val
19+
end
20+
21+
def flood_fill!
22+
queue = [[0, 0, 0]]
23+
until queue.empty?
24+
cell = queue.shift
25+
next if @map[cell[0], cell[1], cell[2]] != 0
26+
27+
@map[cell[0], cell[1], cell[2]] = 2
28+
queue << [cell[0] - 1, cell[1], cell[2]] if cell[0] > 0 and @map[cell[0] - 1, cell[1], cell[2]].zero?
29+
queue << [cell[0] + 1, cell[1], cell[2]] if cell[0] < @size_x - 1 and @map[cell[0] + 1, cell[1], cell[2]].zero?
30+
queue << [cell[0], cell[1] - 1, cell[2]] if cell[1] > 0 and @map[cell[0], cell[1] - 1, cell[2]].zero?
31+
queue << [cell[0], cell[1] + 1, cell[2]] if cell[1] < @size_y - 1 and @map[cell[0], cell[1] + 1, cell[2]].zero?
32+
queue << [cell[0], cell[1], cell[2] - 1] if cell[2] > 0 and @map[cell[0], cell[1], cell[2] - 1].zero?
33+
queue << [cell[0], cell[1], cell[2] + 1] if cell[2] < @size_z - 1 and @map[cell[0], cell[1], cell[2] + 1].zero?
34+
end
35+
end
36+
37+
def count_exposed_faces
38+
count = 0
39+
(@size_x - 1).times do |x|
40+
(@size_y - 1).times do |y|
41+
(@size_z - 1).times do |z|
42+
next unless @map[x + 1, y + 1, z + 1] == 1
43+
44+
count += 1 if @map[x + 1 - 1, y + 1, z + 1] == 2
45+
count += 1 if @map[x + 1 + 1, y + 1, z + 1] == 2
46+
count += 1 if @map[x + 1, y + 1 - 1, z + 1] == 2
47+
count += 1 if @map[x + 1, y + 1 + 1, z + 1] == 2
48+
count += 1 if @map[x + 1, y + 1, z + 1 - 1] == 2
49+
count += 1 if @map[x + 1, y + 1, z + 1 + 1] == 2
50+
end
51+
end
52+
end
53+
count
54+
end
55+
end
56+
57+
input = File.read('18.input').lines.map(&:strip).map { |l| l.split(',').map(&:to_i) }
58+
59+
max_x = input.map(&:first).max
60+
max_y = input.map { |c| c[1] }.max
61+
max_z = input.map(&:last).max
62+
63+
map = Map.new(max_x, max_y, max_z)
64+
65+
input.each do |coords|
66+
map[coords[0], coords[1], coords[2]] = 1
67+
end
68+
69+
map.flood_fill!
70+
71+
print map.count_exposed_faces, "\n"

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /