[2023][ruby][15.2]
change xoyxluoyptqwttmxlpkkmoksklvmvkzu
commit 2b55c1e8437f57a2e8d0532607bf0008e21c4023
author Alpha Chen <alpha@kejadlen.dev>
date
parent kktmxntt
diff --git a/2023/ruby/day_15.rb b/2023/ruby/day_15.rb
index 24bc487..01c73d4 100644
--- a/2023/ruby/day_15.rb
+++ b/2023/ruby/day_15.rb
@@ -1,12 +1,30 @@
-input = ARGF.read.strip.split(?,).map(&:chars)
+input = ARGF.read
+
+def hash(label)
+  label.chars.inject(0) {|n,c|
+    (n + c.ord) * 17 % 256
+  }
+end
 
 # part one
-p input.sum {|str|
-  current = 0
-  str.each do |c|
-    current += c.ord
-    current *= 17
-    current %= 256
+p input.split(?,).sum { hash(_1) }
+
+# part two
+boxes = Hash.new {|h,k| h[k] = {} }
+input.scan(/(\w+)([-=])(\d+)?/).each do |label, op, focal_length|
+  box = boxes[hash(label)]
+  case op
+  when ?-
+    box.delete(label)
+  when ?=
+    box[label] = focal_length.to_i
+  else
+    fail
   end
-  current
-}
+end
+
+p boxes.flat_map {|box_i, box|
+  box.map.with_index {|(label, focal_length), lens_i|
+    [1 + box_i, 1 + lens_i, focal_length].inject(:*)
+  }
+}.sum