Skip to content

Commit 1d7f88e

Browse files
committed
solve: year 2024 day 8 in ruby
1 parent 432cf42 commit 1d7f88e

File tree

4 files changed

+154
-0
lines changed

4 files changed

+154
-0
lines changed

2024/day8/input.txt

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
..............U.............c.....3...............
2+
.....p.........F..................................
3+
.....m..7....................4x............3......
4+
..e.............F..........c...YH..3..............
5+
.......e...................................c..E..8
6+
................a...U................8............
7+
..............................4.F...8....x........
8+
............7.....4............Hc..E.......x......
9+
........p..............................E..........
10+
.............U.e....................x....t........
11+
.7..........................Z.H....g..............
12+
.........7..m.....S.........................E.....
13+
...F.....p...........6...SY.......................
14+
.................6..k...................g.........
15+
..........m......a........................g.......
16+
.......M.......................................g..
17+
..............a............Y....C........H........
18+
....u.......6........a.........C.GY...............
19+
.....M..................S......................2..
20+
..........M........S.....................2........
21+
........M.......................5.........z..f....
22+
.....................................Z........t.2.
23+
..........6.......................................
24+
......................................G...........
25+
.........................A.........G9....Z........
26+
........................C.........................
27+
.....k......................G......z..t...........
28+
.......k......................zs....f........5...9
29+
................h........................9....2...
30+
.............h.....0...........f.....K..ZX........
31+
..................................f...............
32+
.......1....................9.........Xz..........
33+
...............1......B.s......X..................
34+
............h...............B.....................
35+
..T.........k..................b..................
36+
...............u..................................
37+
.........u.............h..................0.......
38+
..............y...................................
39+
...............................t....X......5......
40+
.................A............................5...
41+
................u..................s..............
42+
.T..........b....y................................
43+
............y............................K........
44+
..1...............................s....B..........
45+
..............Ay.............B...P................
46+
..........T.......................K...........0...
47+
.............T..................P.........K.......
48+
......A....P......................................
49+
....b.........1...................................
50+
.........b................................P.......

2024/day8/part1.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
def print_city_map(city_map, antinodes)
2+
antinodes.each do |x, y|
3+
city_map[x][y] = '#' if city_map[x][y] == '.'
4+
end
5+
puts city_map.map(&:join).join("\n")
6+
end
7+
8+
def inside?(point, city_map)
9+
x, y = point
10+
height = city_map.length
11+
width = city_map[0].length
12+
x.between?(0, height - 1) && y.between?(0, width - 1)
13+
end
14+
15+
def count_antenna(city_map)
16+
city_map.each_with_index.with_object(Hash.new { |h, k| h[k] = [] }) do |(line, i), rs|
17+
line.each_with_index do |cell, j|
18+
rs[cell] << [i, j] unless cell == '.'
19+
end
20+
end
21+
end
22+
23+
def solution(input)
24+
city_map = input.split("\n").map(&:chars)
25+
antennas = count_antenna(city_map)
26+
antinodes = Set.new
27+
28+
antennas.each_value do |positions|
29+
positions.combination(2).each do |p1, p2|
30+
dx, dy = p1[0] - p2[0], p1[1] - p2[1]
31+
32+
p1_side = [p1[0] + dx, p1[1] + dy]
33+
p2_side = [p2[0] - dx, p2[1] - dy]
34+
35+
antinodes.add(p1_side) if inside?(p1_side, city_map)
36+
antinodes.add(p2_side) if inside?(p2_side, city_map)
37+
end
38+
end
39+
40+
print_city_map(city_map, antinodes)
41+
antinodes.size
42+
end

2024/day8/part2.rb

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
def print_city_map(city_map, antinodes)
2+
antinodes.each do |x, y|
3+
city_map[x][y] = '#' if city_map[x][y] == '.'
4+
end
5+
puts city_map.map(&:join).join("\n")
6+
end
7+
8+
def inside?(point, city_map)
9+
x, y = point
10+
height = city_map.length
11+
width = city_map[0].length
12+
x.between?(0, height - 1) && y.between?(0, width - 1)
13+
end
14+
15+
def count_antenna(city_map)
16+
counter = Hash.new { |h, k| h[k] = [] }
17+
antenna = Set.new
18+
19+
city_map.each_with_index do |line, i|
20+
line.each_with_index do |cell, j|
21+
next if cell == '.'
22+
antenna.add([i, j])
23+
counter[cell] << [i, j]
24+
end
25+
end
26+
27+
[counter, antenna]
28+
end
29+
30+
def solution(input)
31+
city_map = input.split("\n").map(&:chars)
32+
counter, antinodes = count_antenna(city_map)
33+
34+
counter.each_value do |positions|
35+
positions.combination(2).each do |p1, p2|
36+
dx, dy = p1[0] - p2[0], p1[1] - p2[1]
37+
38+
[[p1, [dx, dy]], [p2, [-dx, -dy]]].each do |start, delta|
39+
current = [start[0] + delta[0], start[1] + delta[1]]
40+
while inside?(current, city_map)
41+
antinodes.add(current)
42+
current = [current[0] + delta[0], current[1] + delta[1]]
43+
end
44+
end
45+
end
46+
end
47+
48+
print_city_map(city_map, antinodes)
49+
antinodes.size
50+
end

2024/day8/sample.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
............
2+
........0...
3+
.....0......
4+
.......0....
5+
....0.......
6+
......A.....
7+
............
8+
............
9+
........A...
10+
.........A..
11+
............
12+
............

0 commit comments

Comments
 (0)