diff --git a/day_05/1.rb b/day_05/1.rb new file mode 100755 index 0000000..bde734b --- /dev/null +++ b/day_05/1.rb @@ -0,0 +1,28 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +class Main + def run + ranges = [] + ingredient_ids = Hash.new(0) + $stdin.each_line do |line| + arr = line.chomp.split("-").map(&:to_i) + if arr.size == 2 + ranges << (arr[0]..arr[1]) + elsif arr.size == 1 + ingredient_ids[arr[0]] += 1 + end + end + + @sum = 0 + ingredient_ids.each do |id, count| + if ranges.any? { |r| r.include?(id) } + @sum += count + end + end + + puts @sum + end +end + +Main.new.run diff --git a/day_05/2.rb b/day_05/2.rb new file mode 100755 index 0000000..4411f07 --- /dev/null +++ b/day_05/2.rb @@ -0,0 +1,47 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +class Main + def run + ranges = [] + $stdin.each_line do |line| + arr = line.chomp.split("-").map(&:to_i) + if arr.size == 2 + ranges << (arr[0]..arr[1]) + end + end + + # Sort ranges by starting point + # This prevents having to check all previous ranges for every new range + ranges.sort_by!(&:begin) + + valid_id_ranges = [] + ranges.each do |r| + valid_id_ranges.each do |vr| + if ( + # r starts inside vr + r.begin >= vr.begin && r.begin <= vr.end) || + # r ends inside vr + (r.end >= vr.begin && r.end <= vr.end) || + # vr starts inside r + (vr.begin >= r.begin && vr.begin <= r.end) || + # vr ends inside r + (vr.end >= r.begin && vr.end <= r.end) + # Merge ranges + r = ([r.begin, vr.begin].min..[r.end, vr.end].max) + valid_id_ranges.delete(vr) + end + end + valid_id_ranges << r + end + + @total = 0 + valid_id_ranges.each do |r| + @total += (r.end - r.begin + 1) + end + + puts @total + end +end + +Main.new.run