[2020][ruby][14.x] refactor
change sznylmmpqttppkvzmtqztksqxqwqumvm
commit 9f63c6143573b9b1ce1187fb507852ac3f6cf6ff
author Alpha Chen <alpha@kejadlen.dev>
date
parent rzlozoop
diff --git a/2020/ruby/day_14.rb b/2020/ruby/day_14.rb
index 28b13e7..aa3b0dd 100644
--- a/2020/ruby/day_14.rb
+++ b/2020/ruby/day_14.rb
@@ -16,16 +16,18 @@ until ss.eos?
     # 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
+    masked = ("%036b" % addr).chars.zip(mask.chars).map {|a,m|
+      case m
+      when ?X then ?X
+      when ?1 then ?1
+      when ?0 then a
+      else fail
       end
-      mem[floated.reverse.to_i(2)] = value
+    }.join
+    floating = masked.count(?X)
+    (0...2**floating).map {|i| i.to_s(2).chars }.each do |i|
+      floated = masked.gsub(?X) { i.pop || "0" }.to_i(2)
+      mem[floated] = value
     end
   else
     fail