From 7fa8c31b11564ce77fcc3a292e5cb0291208bebc Mon Sep 17 00:00:00 2001 From: Patrick Michl Date: Tue, 22 Dec 2020 15:34:34 +0100 Subject: [PATCH] Solution for Day 22 --- day_22/first.rb | 15 ++++++++++++++ day_22/input | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ day_22/second.rb | 29 ++++++++++++++++++++++++++ day_22/test | 13 ++++++++++++ 4 files changed, 110 insertions(+) create mode 100644 day_22/first.rb create mode 100644 day_22/input create mode 100644 day_22/second.rb create mode 100644 day_22/test diff --git a/day_22/first.rb b/day_22/first.rb new file mode 100644 index 0000000..cd830b6 --- /dev/null +++ b/day_22/first.rb @@ -0,0 +1,15 @@ +input = File.read('./input').split("\n\n").map { |l| l.split("\n") } + +$p1 = input[0].drop(1).map(&:to_i) +$p2 = input[1].drop(1).map(&:to_i) + +until $p1.empty? || $p2.empty? + p1 = $p1.shift + p2 = $p2.shift + + p1 > p2 ? $p1.push(p1, p2) : $p2.push(p2, p1) +end + +$winner = $p1.empty? ? $p2 : $p1 + +puts (1..$winner.size).reverse_each.zip($winner).map { |l, r| l * r }.sum diff --git a/day_22/input b/day_22/input new file mode 100644 index 0000000..47ddfee --- /dev/null +++ b/day_22/input @@ -0,0 +1,53 @@ +Player 1: +28 +13 +25 +16 +38 +3 +14 +6 +29 +2 +47 +20 +35 +43 +30 +39 +21 +42 +50 +48 +23 +11 +34 +24 +41 + +Player 2: +27 +37 +9 +10 +17 +31 +19 +33 +40 +12 +32 +1 +18 +36 +49 +46 +26 +4 +45 +8 +15 +5 +44 +22 +7 diff --git a/day_22/second.rb b/day_22/second.rb new file mode 100644 index 0000000..3ae2bcb --- /dev/null +++ b/day_22/second.rb @@ -0,0 +1,29 @@ +input = File.read('./input').split("\n\n").map { |l| l.split("\n") } + +p1 = input[0].drop(1).map(&:to_i) +p2 = input[1].drop(1).map(&:to_i) + +def play_game(deck1, deck2) + history = {} + + until deck1.empty? || deck2.empty? + return true if history[deck1] && history[deck2] + + history[deck1] = true + history[deck2] = true + p1 = deck1.shift + p2 = deck2.shift + + round_winner = if p1 <= deck1.size && p2 <= deck2.size + play_game(deck1[0, p1], deck2[0, p2]) + else + p1 > p2 + end + round_winner ? deck1.push(p1, p2) : deck2.push(p2, p1) + end + winner = deck1.empty? ? deck2 : deck1 + deck1.size > deck2.size +end + +winner = play_game(p1, p2) ? p1 : p2 +puts (1..winner.size).reverse_each.zip(winner).map { |l, r| l * r }.sum diff --git a/day_22/test b/day_22/test new file mode 100644 index 0000000..dfaf6f7 --- /dev/null +++ b/day_22/test @@ -0,0 +1,13 @@ +Player1: +9 +2 +6 +3 +1 + +Player2: +5 +8 +4 +7 +10