Day 04: Use entire file instead of splitting input beforehand.

This commit is contained in:
Jonathan Chan 2021-12-04 00:57:22 -08:00
parent f04e0cabdb
commit 96b1c8a901
5 changed files with 27 additions and 52 deletions

View File

@ -1,17 +0,0 @@
22 13 17 11 0
8 2 23 4 24
21 9 14 16 7
6 10 3 18 5
1 12 20 15 19
3 15 0 2 22
9 18 13 17 5
19 8 7 25 23
20 11 10 24 4
14 21 16 12 6
14 21 17 24 4
10 16 15 9 19
18 8 23 26 20
22 11 13 6 5
2 0 12 3 7

View File

@ -1 +0,0 @@
6,69,28,50,36,84,49,13,48,90,1,33,71,0,94,59,53,58,60,96,30,34,29,91,11,41,77,95,17,80,85,93,7,9,74,89,18,25,26,8,87,38,68,5,12,43,27,46,62,73,16,55,22,4,65,76,54,52,83,10,21,67,15,47,45,40,35,66,79,51,75,39,64,24,37,72,3,44,82,32,78,63,57,2,86,31,19,92,14,97,20,56,88,81,70,61,42,99,23,98

View File

@ -1,3 +1,5 @@
6,69,28,50,36,84,49,13,48,90,1,33,71,0,94,59,53,58,60,96,30,34,29,91,11,41,77,95,17,80,85,93,7,9,74,89,18,25,26,8,87,38,68,5,12,43,27,46,62,73,16,55,22,4,65,76,54,52,83,10,21,67,15,47,45,40,35,66,79,51,75,39,64,24,37,72,3,44,82,32,78,63,57,2,86,31,19,92,14,97,20,56,88,81,70,61,42,99,23,98
22 59 7 10 6 22 59 7 10 6
33 36 96 55 23 33 36 96 55 23
13 85 18 29 28 13 85 18 29 28

View File

@ -2,21 +2,22 @@
(require "../lib.rkt") (require "../lib.rkt")
(define input (problem-input-grouped 4))
(define order (define order
(~> (problem-input 4 "-order") (string-csv (first input) string->number))
first
(string-split ",")
(map string->number _)))
(define boards (define boards
(~> (problem-input-grouped 4) (for/list ([board (rest input)])
(map string-lines _) (for/list ([row (string-lines board)])
(map #{map string-words %} _) (for/list ([cell (string-words row)])
(map #{map #{map string->number %} %} _))) (string->number cell)))))
(define (winner? board) (define (winner? board)
(or (ormap #{andmap false? %} board) (or (ormap #{andmap false? %} board)
(ormap #{andmap (λ (row) (false? (list-ref row %))) board} (range 5)))) ;; 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)))))
(define (blot board n) (define (blot board n)
(for/list ([row board]) (for/list ([row board])
@ -27,36 +28,26 @@
(define (score board) (define (score board)
(sum (filter number? (apply append board)))) (sum (filter number? (apply append board))))
(define-values (winner n) (define part1
(for/fold ([boards boards] (for/fold ([boards boards]
[winner #f] [winner #f]
[winning #f] [winning #f]
#:result (values winner winning)) #:result (* (score winner) winning))
([n order] ([n order]
#:break winner) #:break winner)
(define boards* (define boards*
(for/list ([board boards]) (map #{blot % n} boards))
(blot board n))) (values boards* (findf winner? boards*) n)))
(define winner
(findf winner? boards*))
(values boards* winner n)))
(define-values (loser m)
(for/fold ([boards boards]
[losing #f]
#:result (values (first boards) losing))
([m order]
#:break (and (singleton? boards)
(winner? (first boards))))
(define boards*
(for/list ([board (filter ( not winner?) boards)])
(blot board m)))
(values boards* m)))
(define part1
(* n (score winner)))
(define part2 (define part2
(* m (score loser))) (for/fold ([boards boards]
[loser #f]
[losing #f]
#:result (* (score loser) losing))
([m order]
#:break (empty? boards))
(define boards*
(map #{blot % m} boards))
(values (filter ( not winner?) boards*) (first boards*) m)))
(show-solution part1 part2) (show-solution part1 part2)