Code for the Advent of Code event
aoc advent-of-code
at rust 38 lines 1.5 kB view raw
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