-
Notifications
You must be signed in to change notification settings - Fork 0
/
day14.rb
executable file
·79 lines (71 loc) · 1.63 KB
/
day14.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/env ruby
def calc_load(grid)
grid.transpose.map { |r| [false] + r + [false] }.map { |c|
c.reverse.each_with_index.select { |p, _| p == true }.map { |_, i| i }.sum
}.sum
end
grid = File.readlines("./input14.txt").map(&:chomp).map { |line|
line.chars.map { |c|
case c
when "O"
true
when "#"
false
when "."
nil
end
}
}
calc_load grid
def tilt(grid, direction)
grid = case direction
when :north
grid.transpose.map { |r| [false] + r + [false] }
when :west
grid.map { |r|
[false] + r + [false]
}
when :south
grid.reverse.transpose.map { |r| [false] + r + [false] }
when :east
grid.map { |r|
[false] + r.reverse + [false]
}
end
grid = grid.map { |col|
squares = col.each_with_index.select { |p, _| p == false }.map { |_, i| i }
squares.each_cons(2).map { |a, b| (a + 1..b - 1) }.map { |r|
v = col[r]
count = v.count { |p| p == true }
Array.new(count, true) + Array.new(v.count - count, nil) + [false]
}.flatten[..-2]
}
case direction
when :north
grid.transpose
when :west
grid
when :south
grid.transpose.reverse
when :east
grid.map(&:reverse)
end
end
def cycle(grid)
[:north, :west, :south, :east].inject(grid) { |g, d|
tilt(g, d)
}
end
p calc_load tilt grid, :north
weights = []
grid2 = grid.dup
loop do
grid2 = cycle grid2
weights << weight = calc_load(grid2)
idx = weights[..-2].rindex(weight)
length = weights.count - 1
next unless idx && weights[idx..-2] == weights[2 * idx - length...idx]
length -= idx
p weights[(idx + (1_000_000_000 + ~idx) % length)]
break
end