Day 04: Use entire file instead of splitting input beforehand.
This commit is contained in:
parent
0e35c659db
commit
f7e98e5d1f
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
||||||
|
|
|
@ -15,4 +15,4 @@
|
||||||
(define part2
|
(define part2
|
||||||
(count positive? (deltas cdddr)))
|
(count positive? (deltas cdddr)))
|
||||||
|
|
||||||
(show-solution part1 part2)
|
(show-solution part1 part2)
|
57
src/04.rkt
57
src/04.rkt
|
@ -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)
|
Loading…
Reference in New Issue