2021-12-04 06:14:02 +00:00
|
|
|
#lang curly-fn racket
|
|
|
|
|
|
|
|
(require "../lib.rkt")
|
|
|
|
|
2021-12-04 08:57:22 +00:00
|
|
|
(define input (problem-input-grouped 4))
|
|
|
|
|
2021-12-04 06:14:02 +00:00
|
|
|
(define order
|
2021-12-04 08:57:22 +00:00
|
|
|
(string-csv (first input) string->number))
|
2021-12-04 06:14:02 +00:00
|
|
|
|
|
|
|
(define boards
|
2021-12-04 08:57:22 +00:00
|
|
|
(for/list ([board (rest input)])
|
|
|
|
(for/list ([row (string-lines board)])
|
|
|
|
(for/list ([cell (string-words row)])
|
|
|
|
(string->number cell)))))
|
2021-12-04 06:14:02 +00:00
|
|
|
|
|
|
|
(define (winner? board)
|
|
|
|
(or (ormap #{andmap false? %} board)
|
2021-12-04 08:57:22 +00:00
|
|
|
;; IMO this is the more aesthetic but less efficient version
|
|
|
|
#;(ormap #{andmap false? %} (transpose board))
|
|
|
|
(ormap #{not (ormap (∂r list-ref %) board)} (range (length board)))))
|
2021-12-04 06:14:02 +00:00
|
|
|
|
|
|
|
(define (blot board n)
|
|
|
|
(for/list ([row board])
|
|
|
|
(for/list ([m row])
|
|
|
|
(if (equal? n m)
|
|
|
|
#f m))))
|
|
|
|
|
|
|
|
(define (score board)
|
|
|
|
(sum (filter number? (apply append board))))
|
|
|
|
|
2021-12-05 18:04:08 +00:00
|
|
|
(define-values (part1 part2)
|
2021-12-04 06:14:02 +00:00
|
|
|
(for/fold ([boards boards]
|
|
|
|
[winner #f]
|
|
|
|
[winning #f]
|
2021-12-04 08:57:22 +00:00
|
|
|
[loser #f]
|
2021-12-04 06:14:02 +00:00
|
|
|
[losing #f]
|
2021-12-05 18:04:08 +00:00
|
|
|
#:result (values (* (score winner) winning)
|
|
|
|
(* (score loser) losing)))
|
2021-12-04 06:14:02 +00:00
|
|
|
([m order]
|
2021-12-04 08:57:22 +00:00
|
|
|
#:break (empty? boards))
|
2021-12-04 06:14:02 +00:00
|
|
|
(define boards*
|
2021-12-04 08:57:22 +00:00
|
|
|
(map #{blot % m} boards))
|
2021-12-05 18:04:08 +00:00
|
|
|
(define-values (winners losers)
|
|
|
|
(partition winner? boards*))
|
|
|
|
(values losers
|
|
|
|
(or winner (first* winners)) (if winner winning m)
|
|
|
|
(first* winners) m)))
|
2021-12-04 06:14:02 +00:00
|
|
|
|
2021-12-04 08:57:22 +00:00
|
|
|
(show-solution part1 part2)
|