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