Code for the Advent of Code event
aoc
advent-of-code
1#!/usr/bin/env ruby
2# frozen_string_literal: true
3
4EARLIEST = ARGF.readline.to_i
5SCHEDULE = ARGF.readline.split(?,).map(&:to_i)
6IDS = SCHEDULE.reject(&:zero?)
7
8def solve(id)
9 current = 0
10 current += id while current < EARLIEST
11 current
12end
13
14puts IDS.map { [_1, solve(_1)] }.min_by { _2 }.then { _1 * (_2 - EARLIEST) }
15
16OFFSETS = SCHEDULE.map.with_index { [_1.to_i, _2] }.reject { _1[0].zero? }.to_h
17
18def solve2
19 current = 0
20
21 loop do
22 valid = OFFSETS.select { |id, offset| (current + offset) % id == 0 }
23 return current if valid.size == OFFSETS.size
24 current += valid.map(&:first).reduce(:lcm) || 1
25 end
26end
27
28puts solve2
29
30# VERIFY solve2:
31# require_relative '../utils'
32# p Utils.crt(OFFSETS.keys, OFFSETS.map { -_2 % _1 })