2025 day 2
This commit is contained in:
parent
a102279609
commit
313f8f7542
7
ruby/2025/2/bin/problem
Normal file
7
ruby/2025/2/bin/problem
Normal 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}"
|
||||
41
ruby/2025/2/lib/id_range.rb
Normal file
41
ruby/2025/2/lib/id_range.rb
Normal 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
|
||||
29
ruby/2025/2/test/test_id_range.rb
Normal file
29
ruby/2025/2/test/test_id_range.rb
Normal 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
|
||||
Loading…
Reference in New Issue
Block a user