[2020][ruby][14.x]
change rzlozoopsmluslprorpotxynwqrtntot
commit 6d15041cd88ece866823af216beae2dbcd274973
author Alpha Chen <alpha@kejadlen.dev>
date
parent xpoqstty
diff --git a/2020/ruby/day_14.rb b/2020/ruby/day_14.rb
new file mode 100644
index 0000000..28b13e7
--- /dev/null
+++ b/2020/ruby/day_14.rb
@@ -0,0 +1,35 @@
+require "strscan"
+
+mem = Hash.new(0)
+mask = nil
+
+ss = StringScanner.new(ARGF.read)
+until ss.eos?
+  case
+  when ss.scan(/mask = ([10X]+)\n/)
+    mask = ss.captures.fetch(0)
+  when ss.scan(/mem\[(\d+)\] = (\d+)\n/)
+    addr, value = ss.captures.map(&:to_i)
+
+    # part 1
+    # value &= mask.gsub(?X, ?1).to_i(2)
+    # value |= mask.gsub(?X, ?0).to_i(2)
+    # mem[addr] = value
+
+    addr |= mask.gsub(?X, ?0).to_i(2)
+    floating = mask.reverse.chars.filter_map.with_index {|x,i|
+      x == ?X ? i : nil
+    }
+    (0...2**floating.size).each do |i|
+      floated = addr.to_s(2).rjust(36, ?0).reverse
+      floating.each.with_index do |j,k|
+        floated[j] = i[k].to_s
+      end
+      mem[floated.reverse.to_i(2)] = value
+    end
+  else
+    fail
+  end
+end
+
+p mem.values.sum