2025 day 2

This commit is contained in:
Bill Rossi 2025-12-02 06:48:52 -05:00
parent a102279609
commit 313f8f7542
3 changed files with 77 additions and 0 deletions

7
ruby/2025/2/bin/problem Normal file
View File

@ -0,0 +1,7 @@
#!/usr/bin/env ruby
require "id_range"
id_ranges = STDIN.read.chomp.split(",").map{ |chunk| IdRange.for chunk }
puts "Part 1: #{id_ranges.map(&:invalid_ids).flatten.sum}"
puts "Part 2: #{id_ranges.map(&:silly_invalid_ids).flatten.sum}"

View File

@ -0,0 +1,41 @@
class Integer
def invalid_id?
string = to_s
return false if string.length.odd?
string[..((string.length / 2) - 1)] == string[(string.length / 2)..]
end
def silly_invalid_id?
string = to_s
for pattern_length in 1.upto(string.length - 1)
next if string.length % pattern_length != 0
pattern = string[0..(pattern_length - 1)]
rest = string[pattern_length..]
return true if rest.gsub(pattern, "").empty?
end
false
end
end
class IdRange
attr_reader :range
def initialize(range)
@range = range
end
def self.for(chunk)
low, high = chunk.split("-").map(&:to_i)
new low..high
end
def invalid_ids
range.select(&:invalid_id?)
end
def silly_invalid_ids
range.select(&:silly_invalid_id?)
end
end

View File

@ -0,0 +1,29 @@
require "minitest/autorun"
require "id_range"
class TestIdRange < Minitest::Test
def test_invalid_ids
assert_equal([11, 22], IdRange.for("11-22").invalid_ids)
assert_equal([99], IdRange.for("95-115").invalid_ids)
assert_equal([1188511885], IdRange.for("1188511880-1188511890").invalid_ids)
assert_equal([222222], IdRange.for("222220-222224").invalid_ids)
assert_equal([], IdRange.for("1698522-1698528").invalid_ids)
assert_equal([446446], IdRange.for("446443-446449").invalid_ids)
assert_equal([38593859], IdRange.for("38593856-38593862").invalid_ids)
end
def test_silly_invalid_ids
assert_equal([11, 22], IdRange.for("11-22").silly_invalid_ids)
assert_equal([99, 111], IdRange.for("95-115").silly_invalid_ids)
assert_equal([999, 1010], IdRange.for("998-1012").silly_invalid_ids)
assert_equal([1188511885], IdRange.for("1188511880-1188511890").silly_invalid_ids)
assert_equal([222222], IdRange.for("222220-222224").silly_invalid_ids)
assert_equal([], IdRange.for("1698522-1698528").silly_invalid_ids)
assert_equal([446446], IdRange.for("446443-446449").silly_invalid_ids)
assert_equal([38593859], IdRange.for("38593856-38593862").silly_invalid_ids)
assert_equal([565656], IdRange.for("565653-565659").silly_invalid_ids)
assert_equal([824824824], IdRange.for("824824821-824824827").silly_invalid_ids)
assert_equal([2121212121], IdRange.for("2121212118-2121212124").silly_invalid_ids)
end
end