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