diff --git a/2020/ruby/day_22.rb b/2020/ruby/day_22.rb new file mode 100644 index 0000000..76c76b7 --- /dev/null +++ b/2020/ruby/day_22.rb @@ -0,0 +1,46 @@ +require "set" + +decks = ARGF.read.split("\n\n").map {|players| players.split("\n")[1..].map(&:to_i) } + +# part one + +# until decks.any?(&:empty?) +# p decks +# top_cards = decks.map(&:shift) +# fail if top_cards.tally.size == 1 + +# if top_cards.first > top_cards.last +# decks.first.concat(top_cards) +# else +# decks.last.concat(top_cards.reverse) +# end +# end + +SEEN = Set.new +def recursive_combat!(decks) + until decks.any?(&:empty?) + return 0 if SEEN.include?(decks) + SEEN << decks + + top_cards = decks.map(&:shift) + winner = if decks.zip(top_cards).all? {|d,tc| d.size >= tc } + recursive_combat!(decks.zip(top_cards).map {|d,tc| d[0,tc] }) + elsif top_cards.first > top_cards.last + 0 + else + 1 + end + + if winner == 0 + decks.first.concat(top_cards) + else + decks.last.concat(top_cards.reverse) + end + end + + decks.index {|d| !d.empty? } +end + +recursive_combat!(decks) + +p decks.flatten.reverse.map.with_index {|v,i| v * (i+1) }.sum