From 96b1c8a901f27b793306e6a74d395da6da44b385 Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Sat, 4 Dec 2021 00:57:22 -0800 Subject: [PATCH] Day 04: Use entire file instead of splitting input beforehand. --- input/04-example.txt | 17 ------------- input/04-order.txt | 1 - input/04.txt | 2 ++ src/01.rkt | 2 +- src/04.rkt | 57 +++++++++++++++++++------------------------- 5 files changed, 27 insertions(+), 52 deletions(-) delete mode 100644 input/04-example.txt delete mode 100644 input/04-order.txt diff --git a/input/04-example.txt b/input/04-example.txt deleted file mode 100644 index 34876a6..0000000 --- a/input/04-example.txt +++ /dev/null @@ -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 \ No newline at end of file diff --git a/input/04-order.txt b/input/04-order.txt deleted file mode 100644 index 01c03e9..0000000 --- a/input/04-order.txt +++ /dev/null @@ -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 \ No newline at end of file diff --git a/input/04.txt b/input/04.txt index 75d8dc8..1c64115 100644 --- a/input/04.txt +++ b/input/04.txt @@ -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 33 36 96 55 23 13 85 18 29 28 diff --git a/src/01.rkt b/src/01.rkt index 276c5c0..764c545 100644 --- a/src/01.rkt +++ b/src/01.rkt @@ -15,4 +15,4 @@ (define part2 (count positive? (deltas cdddr))) -(show-solution part1 part2) +(show-solution part1 part2) \ No newline at end of file diff --git a/src/04.rkt b/src/04.rkt index e0c8173..8431095 100644 --- a/src/04.rkt +++ b/src/04.rkt @@ -2,21 +2,22 @@ (require "../lib.rkt") +(define input (problem-input-grouped 4)) + (define order - (~> (problem-input 4 "-order") - first - (string-split ",") - (map string->number _))) + (string-csv (first input) string->number)) (define boards - (~> (problem-input-grouped 4) - (map string-lines _) - (map #{map string-words %} _) - (map #{map #{map string->number %} %} _))) + (for/list ([board (rest input)]) + (for/list ([row (string-lines board)]) + (for/list ([cell (string-words row)]) + (string->number cell))))) (define (winner? 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) (for/list ([row board]) @@ -27,36 +28,26 @@ (define (score board) (sum (filter number? (apply append board)))) -(define-values (winner n) +(define part1 (for/fold ([boards boards] [winner #f] [winning #f] - #:result (values winner winning)) + #:result (* (score winner) winning)) ([n order] #:break winner) (define boards* - (for/list ([board boards]) - (blot board 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))) + (map #{blot % n} boards)) + (values boards* (findf winner? boards*) n))) (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) \ No newline at end of file