Refactored Day 16 again...

This commit is contained in:
Jonathan Chan 2020-12-16 01:33:54 -08:00
parent 309e9769f4
commit c392e6420d
1 changed files with 13 additions and 15 deletions

View File

@ -23,28 +23,26 @@
(define part1 (define part1
(for*/sum ([ticket tickets] (for*/sum ([ticket tickets]
[field ticket]) [field ticket]
(if (any-valid-ranges/c field) 0 field))) #:unless (any-valid-ranges/c field))
field))
(define part2 (define part2
(let ([fields (length ticket)]) (let ([fields (length ticket)]
[valid-tickets (filter #{andmap any-valid-ranges/c %} tickets)])
(define valid-ranges-fields (define valid-ranges-fields
(for*/fold ([valid-ranges-fields (make-list fields (range fields))]) (for*/fold ([valid-ranges-fields (make-list fields '())])
([valid-ticket (filter #{andmap any-valid-ranges/c %} tickets)] ([i fields]
[i fields]
[j fields]) [j fields])
(let ([valid-range/c (list-ref valid-range/cs j)] (if (andmap #{(list-ref valid-range/cs j) (list-ref % i)} valid-tickets)
[valid-range-fields (list-ref valid-ranges-fields j)]) (list-update valid-ranges-fields j #{cons i %})
(if (valid-range/c (list-ref valid-ticket i)) valid-ranges-fields)))
valid-ranges-fields
(list-set valid-ranges-fields j (remove i valid-range-fields))))))
(define (solve valid-ranges-fields) (define (solve valid-ranges-fields)
(let ([j (index-where valid-ranges-fields (and/c list? singleton?))]) (let ([j (index-where valid-ranges-fields (and/c list? singleton?))])
(if j (if j
(let* ([i (first (list-ref valid-ranges-fields j))] (let* ([i (first (list-ref valid-ranges-fields j))])
[valid-ranges-fields (map #{if (list? %) (remove i %) %} (solve (map #{if (list? %) (remove i %) %}
valid-ranges-fields)]) (list-set valid-ranges-fields j i))))
(solve (list-set valid-ranges-fields j i)))
valid-ranges-fields))) valid-ranges-fields)))
(apply * (map #{list-ref ticket %} (apply * (map #{list-ref ticket %}
(take (solve valid-ranges-fields) 6))))) (take (solve valid-ranges-fields) 6)))))