53 lines
1.6 KiB
Racket
53 lines
1.6 KiB
Racket
#lang curly-fn racket
|
|
|
|
(require racket/set
|
|
"../lib.rkt")
|
|
|
|
(define input
|
|
(for/list ([entry (problem-input 8)])
|
|
(match-let ([(list patterns outputs) (string-split entry " | ")])
|
|
(list (map string->list (string-words patterns))
|
|
(map string->list (string-words outputs))))))
|
|
|
|
(define part1
|
|
(~>> input
|
|
(map second)
|
|
(map #{count #{(or/c 2 3 4 7) (length %)} %})
|
|
sum))
|
|
|
|
(define ((config patterns) segs)
|
|
(define (digit segments)
|
|
(findf #{= (length %) segments} patterns))
|
|
(define (digits segments)
|
|
(filter #{= (length %) segments} patterns))
|
|
(define-values (one four seven eight)
|
|
(values (digit 2) (digit 4) (digit 3) (digit 7)))
|
|
(define fives (apply set-intersect (digits 5)))
|
|
(define sixes (apply set-intersect (digits 6)))
|
|
(define three (set-union one fives))
|
|
(define nine (set-union four sixes))
|
|
(define five (set-union (set-subtract four one) sixes))
|
|
(define six (set-union (set-subtract eight one) sixes))
|
|
(define zero (set-union (set-subtract eight three) (set-subtract eight four) one))
|
|
(define two (set-union (set-subtract zero sixes) fives))
|
|
(cond
|
|
[(set=? zero segs) #\0]
|
|
[(set=? one segs) #\1]
|
|
[(set=? two segs) #\2]
|
|
[(set=? three segs) #\3]
|
|
[(set=? four segs) #\4]
|
|
[(set=? five segs) #\5]
|
|
[(set=? six segs) #\6]
|
|
[(set=? seven segs) #\7]
|
|
[(set=? eight segs) #\8]
|
|
[(set=? nine segs) #\9]))
|
|
|
|
(define part2
|
|
(for/sum ([entry input])
|
|
(let ([mapping (config (first entry))])
|
|
(~>> (second entry)
|
|
(map mapping)
|
|
list->string
|
|
string->number))))
|
|
|
|
(show-solution part1 part2) |