aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNat Lasseter <user@4574.co.uk>2019-12-12 12:13:56 +0000
committerNat Lasseter <user@4574.co.uk>2019-12-12 12:13:56 +0000
commit2bb84ae6c6c71d51b445bf0b232c0eb6ca38e89b (patch)
treecf18f9c666a257d8c23699a5a152fb185aeeccd5
parent87f64bc00dbe5778bfc273754a3e561c1f25ac57 (diff)
Day 12 part 2, working, using the potentially bad assumption that the cycle contains the initial state
-rwxr-xr-xday12/part238
-rwxr-xr-xday12/part2.wo.bad.assumption80
2 files changed, 93 insertions, 25 deletions
diff --git a/day12/part2 b/day12/part2
index 237432f..f5b0f96 100755
--- a/day12/part2
+++ b/day12/part2
@@ -38,43 +38,31 @@ moonsz = input.map do |line|
[m[2].to_i, 0]
end
-xs = [moonsx.dup]
+initx = moonsx.map { |m| [m[0], m[1]] }
+xlen = 0
loop do
moonsx = apply_gravity(moonsx)
moonsx = update(moonsx)
- if xs.include?(moonsx) then
- break
- else
- xs << moonsx.dup
- end
+ xlen += 1
+ break if initx == moonsx
end
-xintro = xs.index(moonsx)
-xlen = xs.count - xintro
-ys = [moonsy.dup]
+inity = moonsy.map { |m| [m[0], m[1]] }
+ylen = 0
loop do
moonsy = apply_gravity(moonsy)
moonsy = update(moonsy)
- if ys.include?(moonsy) then
- break
- else
- ys << moonsy.dup
- end
+ ylen += 1
+ break if inity == moonsy
end
-yintro = ys.index(moonsy)
-ylen = ys.count - yintro
-zs = [moonsz.dup]
+initz = moonsz.map { |m| [m[0], m[1]] }
+zlen = 0
loop do
moonsz = apply_gravity(moonsz)
moonsz = update(moonsz)
- if zs.include?(moonsz) then
- break
- else
- zs << moonsz.dup
- end
+ zlen += 1
+ break if initz == moonsz
end
-zintro = zs.index(moonsz)
-zlen = zs.count - zintro
-puts [xintro, yintro, zintro].max + [xlen, ylen, zlen].reduce(1, :lcm)
+puts [xlen, ylen, zlen].reduce(1, :lcm)
diff --git a/day12/part2.wo.bad.assumption b/day12/part2.wo.bad.assumption
new file mode 100755
index 0000000..237432f
--- /dev/null
+++ b/day12/part2.wo.bad.assumption
@@ -0,0 +1,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)