[2021][ruby][11.x]
change zlznqxlxsvtvuysyvyoltrvlsouwnxry
commit d1923e1b782869c76f94ce4f8e00332bfa2d0a84
author Alpha Chen <alpha@kejadlen.dev>
date
parent tnrtkmos
diff --git a/2021/ruby/day_11.rb b/2021/ruby/day_11.rb
new file mode 100644
index 0000000..236c789
--- /dev/null
+++ b/2021/ruby/day_11.rb
@@ -0,0 +1,35 @@
+input = ARGF.read.split("\n").map { _1.chars.map(&:to_i) }
+ys = (0...input.size)
+xs = (0...input.fetch(0).size)
+coords = ys.flat_map {|y| xs.map {|x| [y,x] }}
+octopuses = coords.to_h {|y,x| [[y,x], input.fetch(y).fetch(x)] }
+
+deltas = (-1..1).flat_map {|dy| (-1..1).map {|dx| [dy, dx] }}.reject { _1 == [0, 0] }
+neighbors = ->(y, x) {
+  deltas
+    .map {|dy,dx| [y+dy, x+dx] }
+    .select {|y,x| ys.cover?(y) && xs.cover?(x) }
+}
+
+# flashes = 0
+# 100.times do
+(1..).each do |i|
+  octopuses.transform_values! { _1 + 1 }
+  loop do
+    flashing = octopuses.select { _2 == 10 }
+    break if flashing.empty?
+    flashing.each do |(y,x),_|
+      octopuses[[y,x]] += 1
+      neighbors.(y,x)
+        .select {|y,x| octopuses.fetch([y,x]) < 10 }
+        .each do |y,x|
+          octopuses[[y,x]] += 1
+        end
+    end
+  end
+  puts i or exit if octopuses.values.all? { _1 > 9 }
+  # flashes += octopuses.count { _2 > 9 }
+  octopuses.transform_values! { _1 > 10 ? 0 : _1 }
+end
+
+# p flashes