Code for the Advent of Code event
aoc
advent-of-code
1#!/usr/bin/env ruby
2# frozen_string_literal: true
3
4pairs = ARGF.read.split("\n\n").map { |b| b.lines.map { |l| eval l } }
5
6def check(a, b)
7 return a <=> b if a.is_a?(Numeric) && b.is_a?(Numeric)
8
9 a.each_with_index do |av, i|
10 bv = b[i]
11 return 1 if bv.nil?
12
13 if av.is_a?(Enumerable) && !bv.is_a?(Enumerable)
14 bv = [bv]
15 elsif !av.is_a?(Enumerable) && bv.is_a?(Enumerable)
16 av = [av]
17 end
18
19 if av.is_a?(Enumerable) && bv.is_a?(Enumerable)
20 nested = check(av, bv)
21 return nested if nested == -1 || nested == 1
22 elsif av < bv
23 return -1
24 elsif av > bv
25 return 1
26 end
27 end
28
29 a.size <=> b.size
30end
31
32puts pairs.map.with_index.select { |p, _i| check(p[0], p[1]) == -1 }.map { _2 + 1 }.sum
33
34packets = (pairs.flatten(1) + [[[2]], [[6]]]).sort { check _1, _2 }
35
36puts (packets.find_index([[2]]) + 1) * (packets.find_index([[6]]) + 1)