From b2f13520abd3be86cd677630d85aa37effe7fc1d Mon Sep 17 00:00:00 2001 From: Bill Rossi Date: Wed, 3 Dec 2025 05:59:18 -0500 Subject: [PATCH] 2025 ruby day 3, MAXIMUM_JOLTAGE --- ruby/2025/3/bin/problem | 7 +++++++ ruby/2025/3/lib/battery_bank.rb | 27 ++++++++++++++++++++++++++ ruby/2025/3/test/test_battery_banks.rb | 18 +++++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 ruby/2025/3/bin/problem create mode 100644 ruby/2025/3/lib/battery_bank.rb create mode 100644 ruby/2025/3/test/test_battery_banks.rb diff --git a/ruby/2025/3/bin/problem b/ruby/2025/3/bin/problem new file mode 100644 index 0000000..0364648 --- /dev/null +++ b/ruby/2025/3/bin/problem @@ -0,0 +1,7 @@ +#!/usr/bin/env ruby + +require "battery_bank" + +battery_banks = STDIN.read.chomp.split.map { |line| BatteryBank.for line } +puts "Part 1: #{battery_banks.map(&:maximum_joltage).sum}" +puts "Part 2: #{battery_banks.map(&:override_joltage).sum}" \ No newline at end of file diff --git a/ruby/2025/3/lib/battery_bank.rb b/ruby/2025/3/lib/battery_bank.rb new file mode 100644 index 0000000..624d53e --- /dev/null +++ b/ruby/2025/3/lib/battery_bank.rb @@ -0,0 +1,27 @@ +class BatteryBank + attr_reader :batteries + + def initialize(batteries) + @batteries = batteries + end + + def self.for(string) + new string.split("").map(&:to_i) + end + + def joltage_for_batteries(num_batteries) + num_batteries.downto(1).reduce([[], 0]) do |acc, enabled_battery_index| + max_digit = batteries[(acc[1])..(-enabled_battery_index)].max + max_digit_index = batteries[(acc[1])..].find_index(max_digit) + [acc[0] + [max_digit], acc[1] + max_digit_index + 1] + end[0].map(&:to_s).join("").to_i + end + + def maximum_joltage + joltage_for_batteries(2) + end + + def override_joltage + joltage_for_batteries(12) + end +end diff --git a/ruby/2025/3/test/test_battery_banks.rb b/ruby/2025/3/test/test_battery_banks.rb new file mode 100644 index 0000000..dc177f6 --- /dev/null +++ b/ruby/2025/3/test/test_battery_banks.rb @@ -0,0 +1,18 @@ +require "minitest/autorun" +require "battery_bank" + +class TestBatteryBanks < ::Minitest::Test + def test_maximum_joltage + assert_equal(98, BatteryBank.for("987654321111111").maximum_joltage) + assert_equal(89, BatteryBank.for("811111111111119").maximum_joltage) + assert_equal(78, BatteryBank.for("234234234234278").maximum_joltage) + assert_equal(92, BatteryBank.for("818181911112111").maximum_joltage) + end + + def test_override_joltage + assert_equal(987654321111, BatteryBank.for("987654321111111").override_joltage) + assert_equal(811111111119, BatteryBank.for("811111111111119").override_joltage) + assert_equal(434234234278, BatteryBank.for("234234234234278").override_joltage) + assert_equal(888911112111, BatteryBank.for("818181911112111").override_joltage) + end +end