Code for the Advent of Code event
aoc
advent-of-code
1#!/usr/bin/env ruby
2# frozen_string_literal: true
3
4data = ARGF.readlines.map do |line|
5 patterns, output = line.split(' | ').map(&:split)
6 { patterns: patterns.map { _1.chars.sort.join }, output: output.map { _1.chars.sort.join } }
7end
8
9UNIQUE_SEGMENTS = Set[2, 4, 3, 7]
10
11puts data.map { _1[:output] }.flatten.count { UNIQUE_SEGMENTS.include? _1.size }
12
13def solve_entry(entry)
14 patterns, output = entry[:patterns], entry[:output]
15 candidates = {}
16 candidates[1] = patterns.find { _1.size == 2 }
17 candidates[4] = patterns.find { _1.size == 4 }
18 candidates[7] = patterns.find { _1.size == 3 }
19 candidates[8] = patterns.find { _1.size == 7 }
20 fives = patterns.select { _1.size == 5 }
21 sixes = patterns.select { _1.size == 6 }
22 one = candidates[1].chars
23 candidates[3] = fives.find { |pat| pat.chars.intersection(one).size == 2 }
24 fives.delete candidates[3]
25 candidates[6] = sixes.find { |pat| pat.chars.intersection(one).size == 1 }
26 sixes.delete candidates[6]
27 six = candidates[6].chars
28 candidates[2] = fives.find { |pat| pat.chars.intersection(six).size == 4 }
29 candidates[5] = fives.find { |pat| pat.chars.intersection(six).size == 5 }
30 three = candidates[3].chars
31 candidates[0] = sixes.find { |pat| pat.chars.intersection(three).size == 4 }
32 candidates[9] = sixes.find { |pat| pat.chars.intersection(three).size == 5 }
33
34 map = candidates.to_h { [_2, _1] }
35 output.map { map[_1] }.join.to_i
36end
37
38puts data.map { solve_entry _1 }.sum