Advent of Code 2020: Day 9 (Ruby solution)

Today's puzzles are about debugging a stream of some fake protocol.

The first task is to find the first value that violates protocol rules. It means finding the first number in the list (after the preamble) which is not the sum of two of the 25 numbers before it.

Having this value found, you have to find a contiguous set of at least two numbers in the stream which sum to this value.

Here is my Ruby code:

def find_invalid_number numbers, preamble
  numbers.drop(preamble).each_with_index do |number, index|
    valid = numbers[index...index + preamble].combination(2).any? do |combination|
      combination.sum == number
    end
    return number unless valid
  end
end

def find_contiguous_range_of_sum numbers, value
  numbers.each_with_index do |number, index|
    sum = number
    i = 0
    while sum < value
      sum += numbers[index + (i += 1)]
    end
    return numbers[index...index + i] if sum == value
  end
end

file = File.read('inputs/day9.txt')
numbers = file.lines.map(&:to_i)
puts "First task answer: #{invalid_value = find_invalid_number(numbers, 25)}"
range = find_contiguous_range_of_sum(numbers, invalid_value)
puts "Second task answer: #{range.first + range.last}"