[2017][ruby][6.x] refactor
change kuuwpmwszkrpknwznoqnwxkuptqnxvsx
commit ef14f4b696e82bd691c9f0be2da8fb93b339315d
author Alpha Chen <alpha.chen@gmail.com>
date
parent kqtxwqzo
diff --git a/2017/ruby/day_06.rb b/2017/ruby/day_06.rb
index 4f54a2f..a08b1ad 100644
--- a/2017/ruby/day_06.rb
+++ b/2017/ruby/day_06.rb
@@ -1,27 +1,36 @@
-banks = ARGF.read.strip.split("\t").map(&:to_i)
+require "set"
 
-history = { banks => true}
-count = 0
-seen = false
-loop do
-  v, i = banks.map.with_index {|v,i| [v,i] }.max_by(&:first)
-  banks[i] = 0
-  i += 1
-  while v > 0
-    banks[i % banks.size] += 1
-    v -= 1
-    i += 1
+class Day6
+  def initialize(banks)
+    @banks = banks
   end
-  count += 1
-  if history.has_key?(banks)
-    if seen
-      puts count
-      exit
-    else
-      history.clear
-      seen = true
-      count = 0
+
+  def each
+    return enum_for(__method__) unless block_given?
+
+    loop do
+      yield @banks.dup
+
+      value, i = @banks.map.with_index.max_by(&:first)
+      @banks[i] = 0
+      value.times do |offset|
+        @banks[(i+offset+1) % @banks.size] += 1
+      end
     end
   end
-  history[banks] = true
 end
+
+banks = ARGF.read.strip.split("\t").map(&:to_i)
+day6 = Day6.new(banks).each.lazy
+seen = Set.new
+needle, i = day6.with_index.find {|config,_|
+  if seen.include?(config)
+    true
+  else
+    seen << config
+    false
+  end
+}
+
+p i
+p day6.with_index.drop(1).find {|config,_| config == needle }.last