aboutsummaryrefslogtreecommitdiff
path: root/day17/part2.rb
diff options
context:
space:
mode:
Diffstat (limited to 'day17/part2.rb')
-rw-r--r--day17/part2.rb59
1 files changed, 59 insertions, 0 deletions
diff --git a/day17/part2.rb b/day17/part2.rb
new file mode 100644
index 0000000..da6280b
--- /dev/null
+++ b/day17/part2.rb
@@ -0,0 +1,59 @@
+jets = $stdin.read.strip.chars
+jetp = 0
+njets = jets.count
+
+rocks = [
+ [ 1|2|4|8 ],
+ [ 2, 1|2|4, 2 ],
+ [ 1|2|4, 4, 4 ],
+ [ 1, 1, 1, 1 ],
+ [ 1|2, 1|2 ]
+]
+rockp = 0
+nrocks = rocks.count
+
+def rock_blocked(atx, aty, chamber, rock)
+ return true if atx < 0 || aty < 0
+
+ return true if rock.map{|row|row << atx}.any?{|row|row > 127}
+
+ rock.each_with_index do |rxs, ry|
+ next if chamber[aty + ry].nil?
+ return true if (chamber[aty + ry] & (rxs << atx)) != 0
+ end
+
+ return false
+end
+
+chamber = []
+
+1000000000000.times do
+ atx = 2
+ aty = chamber.count + 3
+
+ rock = rocks[rockp]
+ rockp = (rockp + 1) % nrocks
+
+ loop do
+ case jets[jetp]
+ when ?<
+ atx -= 1 unless rock_blocked(atx - 1, aty, chamber, rock)
+ when ?>
+ atx += 1 unless rock_blocked(atx + 1, aty, chamber, rock)
+ end
+ jetp = (jetp + 1) % njets
+
+ if rock_blocked(atx, aty - 1, chamber, rock)
+ rock.each_with_index do |rxs, ry|
+ sy = aty + ry
+ chamber[sy] = 0 if chamber[sy].nil?
+ chamber[sy] |= (rxs << atx)
+ end
+ break
+ else
+ aty -= 1
+ end
+ end
+end
+
+puts chamber.count