diff --git a/ruby/2025/2/bin/problem b/ruby/2025/2/bin/problem new file mode 100644 index 0000000..8226f1f --- /dev/null +++ b/ruby/2025/2/bin/problem @@ -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}" diff --git a/ruby/2025/2/lib/id_range.rb b/ruby/2025/2/lib/id_range.rb new file mode 100644 index 0000000..1bc48cc --- /dev/null +++ b/ruby/2025/2/lib/id_range.rb @@ -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 diff --git a/ruby/2025/2/test/test_id_range.rb b/ruby/2025/2/test/test_id_range.rb new file mode 100644 index 0000000..e2e21a8 --- /dev/null +++ b/ruby/2025/2/test/test_id_range.rb @@ -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