2021/src/04.rkt

49 lines
1.3 KiB
Racket
Raw Normal View History

2021-12-04 06:14:02 +00:00
#lang curly-fn racket
(require "../lib.rkt")
(define input (problem-input-grouped 4))
2021-12-04 06:14:02 +00:00
(define order
(string-csv (first input) string->number))
2021-12-04 06:14:02 +00:00
(define boards
(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)
;; 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))))
(define-values (part1 part2)
2021-12-04 06:14:02 +00:00
(for/fold ([boards boards]
[winner #f]
[winning #f]
[loser #f]
2021-12-04 06:14:02 +00:00
[losing #f]
#:result (values (* (score winner) winning)
(* (score loser) losing)))
2021-12-04 06:14:02 +00:00
([m order]
#:break (empty? boards))
2021-12-04 06:14:02 +00:00
(define boards*
(map #{blot % m} boards))
(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
(show-solution part1 part2)