blob: 237432ffcb165b6eef63d7296dcd1abe4dd032b9 (
plain)
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
80
|
#!/usr/bin/env ruby
def apply_gravity(moons)
ms = moons.map { |m| [m[0], m[1]] }
(0...ms.count).to_a.combination(2).each do |a, b|
case ms[a][0] <=> ms[b][0]
when -1
ms[a][1] += 1
ms[b][1] -= 1
when 1
ms[b][1] += 1
ms[a][1] -= 1
end
end
ms
end
def update(moons)
moons.map do |moon|
[moon[0] + moon[1], moon[1]]
end
end
input = $stdin.readlines.map(&:strip)
moonsx = input.map do |line|
m = line.scan(/-?\d+/)
[m[0].to_i, 0]
end
moonsy = input.map do |line|
m = line.scan(/-?\d+/)
[m[1].to_i, 0]
end
moonsz = input.map do |line|
m = line.scan(/-?\d+/)
[m[2].to_i, 0]
end
xs = [moonsx.dup]
loop do
moonsx = apply_gravity(moonsx)
moonsx = update(moonsx)
if xs.include?(moonsx) then
break
else
xs << moonsx.dup
end
end
xintro = xs.index(moonsx)
xlen = xs.count - xintro
ys = [moonsy.dup]
loop do
moonsy = apply_gravity(moonsy)
moonsy = update(moonsy)
if ys.include?(moonsy) then
break
else
ys << moonsy.dup
end
end
yintro = ys.index(moonsy)
ylen = ys.count - yintro
zs = [moonsz.dup]
loop do
moonsz = apply_gravity(moonsz)
moonsz = update(moonsz)
if zs.include?(moonsz) then
break
else
zs << moonsz.dup
end
end
zintro = zs.index(moonsz)
zlen = zs.count - zintro
puts [xintro, yintro, zintro].max + [xlen, ylen, zlen].reduce(1, :lcm)
|