2021/src/04.rkt

53 lines
1.4 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 part1
2021-12-04 06:14:02 +00:00
(for/fold ([boards boards]
[winner #f]
[winning #f]
#:result (* (score winner) winning))
2021-12-04 06:14:02 +00:00
([n order]
#:break winner)
(define boards*
(map #{blot % n} boards))
(values boards* (findf winner? boards*) n)))
2021-12-04 06:14:02 +00:00
(define part2
2021-12-04 06:14:02 +00:00
(for/fold ([boards boards]
[loser #f]
2021-12-04 06:14:02 +00:00
[losing #f]
#:result (* (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))
(values (filter ( not winner?) boards*) (first boards*) m)))
2021-12-04 06:14:02 +00:00
(show-solution part1 part2)