From 16a030373030518731e888e511285c599d457059 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89rico=20Nogueira?= Date: Sat, 4 Dec 2021 03:31:33 -0300 Subject: [PATCH] Add 2021 advent - day 4. Learn mutable pairs, for* loops. --- 2021/day4/p.rkt | 51 ++++ 2021/day4/test1.txt | 19 ++ 2021/day4/test2.txt | 601 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 671 insertions(+) create mode 100644 2021/day4/p.rkt create mode 100644 2021/day4/test1.txt create mode 100644 2021/day4/test2.txt diff --git a/2021/day4/p.rkt b/2021/day4/p.rkt new file mode 100644 index 0000000..7d37192 --- /dev/null +++ b/2021/day4/p.rkt @@ -0,0 +1,51 @@ +#lang racket + +; bingo table size +(define size 5) + +(define nlist (map (lambda(x)(string->number x)) (string-split (read-line) ","))) + +(define (make-line t) + (define l (string-split t)) + (for/vector ([v l]) + (mcons (string->number v) 0))) + +(define slist null) +(for ([t (in-lines)]) + (define entry (list->vector (map (lambda(x)(make-line x)) (for/list ([c (in-range size)]) (read-line))))) + (set! slist (append slist (list entry)))) + +(define (accessb b l c) + (vector-ref (vector-ref b l) c)) + +(define (check-board b) + (define flag #f) + (for ([v (in-range size)] #:break flag) + (define count-l (for/sum ([index (in-range size)]) (mcdr (accessb b v index)))) + (define count-c (for/sum ([index (in-range size)]) (mcdr (accessb b index v)))) + (set! flag (or (equal? count-c size) (equal? count-l size)))) + flag) + +(define (find-value b v) + (define answer null) + (for ([l (in-range size)] #:break (not (null? answer))) + (for ([c (in-range size)] #:break (not (null? answer))) + (when (equal? (mcar (accessb b l c)) v) + (set! answer (cons l c))))) + answer) + +(define (get-points b n) + (* n (for*/sum ([l (in-range size)] [c (in-range size)]) + (define v (accessb b l c)) + (if (equal? (mcdr v) 1) 0 (mcar v))))) + +; we'll pick the first and last results from this +(for ([n nlist] #:break (null? slist)) + (for ([b slist]) + (define p (find-value b n)) + (unless (null? p) + (set-mcdr! (vector-ref (vector-ref b (car p)) (cdr p)) 1)) + (when (check-board b) + (set! slist (remq b slist)) + (display "\nwon: ") + (display (get-points b n))))) diff --git a/2021/day4/test1.txt b/2021/day4/test1.txt new file mode 100644 index 0000000..669a51d --- /dev/null +++ b/2021/day4/test1.txt @@ -0,0 +1,19 @@ +7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1 + +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 diff --git a/2021/day4/test2.txt b/2021/day4/test2.txt new file mode 100644 index 0000000..ebec7e9 --- /dev/null +++ b/2021/day4/test2.txt @@ -0,0 +1,601 @@ +23,30,70,61,79,49,19,37,64,48,72,34,69,53,15,74,89,38,46,36,28,32,45,2,39,58,11,62,97,40,14,87,96,94,91,92,80,99,6,31,57,98,65,10,33,63,42,17,47,66,26,22,73,27,7,0,55,8,56,29,86,25,4,12,51,60,35,50,5,75,95,44,16,93,21,3,24,52,77,76,43,41,9,84,67,71,83,88,59,68,85,82,1,18,13,78,20,90,81,54 + +50 98 65 14 47 + 0 22 3 83 46 +87 93 81 84 58 +40 35 28 74 48 +45 99 59 37 64 + +85 66 90 32 88 +95 6 4 74 27 + 1 10 70 41 92 +54 36 42 9 39 +60 99 31 67 16 + + 4 44 66 10 58 +33 64 93 42 46 +19 63 6 83 54 +60 51 76 8 30 +71 49 73 7 55 + +17 67 52 61 98 +46 5 4 51 76 +73 59 74 8 33 +48 96 20 26 15 +55 19 86 29 43 + +20 75 12 67 41 +89 36 65 66 92 +40 19 1 0 28 +99 61 85 58 50 +44 72 57 35 86 + +69 87 27 59 33 +47 34 60 93 9 +71 84 46 24 96 +15 91 5 61 19 +57 78 55 31 8 + +19 10 1 81 96 +27 71 2 52 56 +15 22 48 82 34 +64 47 42 49 51 +26 72 61 12 57 + +71 94 40 34 26 +12 80 57 38 55 + 4 56 11 73 49 +75 60 61 9 50 +91 70 23 1 90 + +39 86 30 73 38 + 6 53 58 14 36 +85 12 75 88 5 + 0 29 41 21 15 +47 66 59 54 1 + +99 97 50 17 60 +36 13 29 80 32 +49 85 75 71 15 +10 79 41 61 66 +68 57 55 74 98 + +68 33 87 89 59 +96 35 76 78 55 + 4 63 51 10 65 +58 38 22 54 9 +66 18 37 60 6 + +43 86 50 23 77 +10 42 19 61 2 +40 29 20 84 0 +70 59 96 80 57 +76 12 39 36 6 + +73 43 92 37 99 +36 42 10 77 87 + 3 57 4 20 35 +18 7 46 91 11 +17 98 8 53 61 + +22 37 89 51 9 +71 6 72 87 32 +13 79 86 53 98 +16 2 93 48 38 +63 82 66 61 69 + +73 90 85 54 65 + 9 66 28 5 63 +91 50 70 59 80 +95 68 92 72 67 +69 88 36 43 53 + +36 81 66 78 90 + 2 25 94 82 55 +34 45 1 14 37 +13 4 70 48 75 +67 73 32 18 91 + +33 93 71 48 47 + 8 79 69 53 82 + 5 31 80 45 37 +67 77 41 56 97 +65 46 62 42 81 + +67 70 59 24 88 +84 11 29 52 78 + 4 39 12 90 2 +44 3 10 75 89 +30 93 22 14 8 + +79 60 98 99 49 +23 26 86 91 38 +77 45 95 66 75 +81 42 85 21 3 +40 37 65 20 50 + +12 54 0 86 52 +15 56 29 39 94 +66 79 14 65 26 + 3 4 59 60 40 +47 48 19 13 85 + +32 44 69 90 21 +35 8 1 59 56 +72 71 84 18 11 +96 38 23 37 79 +92 20 33 94 17 + + 1 94 42 21 82 +92 60 9 32 38 +71 3 37 77 18 +89 16 74 76 2 +83 30 28 11 70 + +94 3 1 71 87 + 6 66 19 76 28 +10 86 22 62 2 +67 0 31 46 27 + 8 33 43 92 29 + +35 90 8 30 27 +67 60 82 68 1 + 5 29 93 44 34 +56 65 48 37 51 +57 45 63 94 77 + +67 80 45 57 43 +37 81 25 84 82 +50 8 9 64 7 +29 18 52 16 14 +73 28 11 76 6 + + 5 76 67 18 16 +68 47 15 29 59 +46 32 40 9 84 +30 17 20 22 3 +35 80 38 72 88 + +35 44 14 89 72 +75 67 56 2 3 +58 41 49 12 52 +92 9 22 34 88 +65 39 93 61 47 + +38 67 33 18 60 +34 50 69 31 83 +29 30 9 12 95 +79 2 24 54 87 +46 68 48 58 42 + +61 87 46 26 34 +74 85 9 54 38 +50 29 84 40 4 +49 39 33 99 53 +77 59 0 42 35 + +86 68 23 62 5 +96 92 7 4 1 +50 70 12 83 46 +34 63 91 56 11 +76 90 71 88 95 + +19 18 13 3 62 +42 29 57 79 85 +39 64 14 28 98 +99 36 91 9 63 +69 66 2 17 31 + +51 43 49 98 94 +31 64 53 54 57 + 3 28 10 12 2 +24 99 95 35 17 +76 27 48 0 41 + +80 62 13 38 98 +32 15 16 8 96 +93 43 81 99 40 +20 57 37 24 3 +94 17 70 14 7 + +52 71 49 95 84 +76 38 45 59 89 + 1 7 27 0 98 +92 64 8 50 68 +13 91 26 51 2 + +31 45 25 1 5 +50 68 77 61 53 +74 20 99 38 63 +76 44 15 42 51 +67 87 86 12 24 + +49 0 70 82 9 + 2 24 96 74 60 +68 16 40 32 20 +48 6 98 11 65 +94 10 54 8 95 + +74 41 11 33 76 + 2 10 44 89 23 +56 45 78 60 34 +15 5 26 83 71 +20 72 85 75 54 + +15 59 93 53 8 + 4 10 84 44 36 +17 62 24 27 98 +87 54 73 13 35 + 9 48 52 33 7 + +56 80 70 74 35 +53 69 75 25 27 +47 91 85 62 32 +93 26 89 18 52 +16 73 49 55 77 + +42 40 54 67 73 +11 10 49 35 59 +12 93 37 15 69 +97 41 47 39 2 +75 99 21 29 26 + +23 75 41 10 86 +71 67 66 38 99 +91 92 63 40 28 +69 97 42 77 60 +44 53 12 84 57 + +72 51 31 90 37 +35 89 55 73 87 +46 32 45 0 58 +50 81 13 18 66 +38 4 40 62 22 + +14 48 35 76 83 +13 70 26 4 1 +30 22 91 93 29 +69 41 74 40 63 +80 65 66 72 23 + +23 65 33 56 38 +84 41 34 21 2 + 4 78 27 17 11 +22 53 52 32 80 +24 25 42 91 99 + +54 51 0 23 52 +92 69 10 46 7 +20 35 12 37 73 +19 56 26 79 32 +27 74 34 5 57 + +75 10 24 32 7 +96 54 22 78 5 +23 69 65 43 20 +29 85 44 92 71 +41 87 73 0 48 + +54 92 16 36 37 +42 59 4 9 44 +52 14 12 6 47 +57 38 70 82 0 +53 81 32 35 3 + +17 22 62 80 30 + 8 28 15 42 46 +79 64 32 29 75 + 5 0 9 90 69 +41 71 85 1 6 + +68 89 40 31 39 +32 48 64 38 28 +80 98 88 14 97 + 6 60 52 11 55 +95 34 63 81 4 + +80 33 14 83 68 +78 69 81 59 15 +72 0 74 21 75 +49 6 67 73 64 + 8 25 87 3 45 + +34 97 86 1 79 +49 12 63 10 59 +88 30 84 74 87 +67 47 26 0 57 +71 40 2 76 98 + +15 89 23 65 44 +27 87 54 38 12 +43 29 18 39 94 +48 0 7 57 61 +70 28 60 68 50 + +13 34 49 67 40 +88 74 99 20 26 +63 69 62 24 32 +35 45 96 79 1 +92 7 17 76 30 + +95 21 75 46 74 +39 7 58 23 90 +61 64 37 81 82 +92 36 54 9 53 +17 51 33 10 27 + +67 35 44 22 23 +28 96 1 56 29 + 0 12 5 50 99 +70 42 8 24 25 +39 53 51 89 85 + +50 15 94 84 27 +72 26 51 3 85 +63 45 1 64 44 +17 80 13 88 2 +12 97 91 25 18 + +59 14 9 67 63 + 6 18 26 98 50 +86 74 75 56 34 +48 7 99 20 64 + 8 53 10 15 57 + + 6 35 13 68 24 +90 19 91 71 86 +95 58 10 44 98 + 8 41 60 1 16 +29 59 43 84 48 + +48 56 8 74 4 +66 30 77 35 90 +94 0 75 49 84 + 5 39 11 54 87 +33 58 96 22 2 + + 5 38 57 63 65 +74 58 22 8 81 +45 96 78 3 11 +28 42 30 39 51 +87 33 34 75 14 + +56 34 67 70 17 + 7 80 10 31 85 +68 59 63 74 40 +13 81 99 62 6 +92 84 71 37 39 + +85 99 74 16 10 +12 21 91 2 83 + 4 94 38 51 36 +41 97 45 65 24 +50 82 92 52 35 + +28 65 6 13 23 + 7 57 86 18 67 +26 85 29 22 89 +99 62 94 31 96 +14 17 50 56 9 + +98 10 63 4 8 +46 21 58 89 3 +27 12 11 55 16 +61 38 43 33 54 +53 14 99 31 25 + +25 70 24 40 14 +75 82 58 68 41 +22 71 72 93 1 +47 97 6 81 45 +92 42 2 76 12 + +31 84 30 0 85 +55 70 72 45 57 +78 52 67 60 22 +43 32 8 44 34 +14 64 91 89 18 + +70 19 62 16 56 +84 49 41 3 20 +85 5 76 95 22 +63 55 37 31 72 +42 17 28 65 1 + +85 17 57 62 48 +34 29 69 52 28 +90 64 54 21 38 + 0 50 84 44 60 +93 80 75 89 83 + +39 84 78 12 5 +29 4 35 7 85 +73 25 58 27 45 +22 90 91 47 74 +60 96 15 24 26 + +13 30 82 31 43 +23 71 1 51 36 +40 62 25 54 86 + 8 83 2 47 34 +33 41 27 98 24 + +13 25 53 50 56 +77 4 41 19 22 +68 70 75 9 65 +30 33 60 74 80 +31 83 34 79 11 + +11 90 38 78 73 +17 16 14 37 4 +80 68 21 70 92 +47 26 81 67 25 +10 31 23 41 22 + +90 62 2 50 79 +77 51 8 11 13 +32 29 43 88 33 +39 34 89 45 23 +91 9 6 68 3 + +62 70 89 27 87 +45 65 96 80 29 + 1 54 90 68 16 +72 50 28 95 12 +21 71 81 10 60 + +33 14 60 44 78 + 6 65 87 11 8 +79 21 59 35 19 +26 69 67 42 27 +25 36 80 10 45 + +71 24 80 87 56 + 7 61 43 38 18 +52 46 41 28 48 + 0 74 20 34 63 + 3 84 42 85 9 + +36 64 41 7 49 +91 92 13 94 88 +73 98 79 0 12 +76 66 86 67 9 + 2 85 74 5 34 + + 8 81 7 56 28 +36 13 42 29 75 +12 27 85 45 9 +26 25 62 41 22 +79 11 95 0 24 + +72 76 81 67 16 +96 41 94 58 7 + 0 79 38 27 11 +61 36 56 88 39 +89 63 31 75 8 + +62 51 5 46 28 +77 97 89 86 13 +87 55 73 90 57 +84 44 40 49 34 +25 0 58 6 21 + + 7 56 15 41 94 +42 89 16 18 74 +57 79 96 35 3 +14 45 20 19 80 +87 85 28 69 17 + +27 88 54 62 65 +44 93 69 13 9 +85 63 43 11 47 +83 57 30 20 56 +71 46 49 7 77 + +45 24 75 39 69 +48 74 44 49 64 +65 25 22 46 93 +88 52 27 37 50 +19 35 47 54 67 + +44 32 71 13 57 + 7 38 26 98 65 +46 1 21 8 55 +30 62 92 27 3 +69 50 99 85 11 + +86 6 64 34 97 +47 98 7 38 9 +26 68 75 92 54 +58 42 13 78 37 +85 28 81 16 51 + +82 74 15 4 86 +55 0 70 88 24 +50 79 63 40 21 +47 39 61 49 36 +89 16 13 2 37 + +89 19 9 82 13 +84 34 58 56 10 +27 92 46 4 94 +44 24 52 86 55 +39 23 22 99 5 + +65 92 8 86 77 +98 79 72 28 78 +16 23 3 55 48 +68 95 66 30 43 +50 31 15 11 45 + +32 70 25 59 31 +47 68 77 56 23 +66 78 54 88 50 +55 60 58 89 83 +84 99 86 97 95 + +53 46 1 94 87 + 8 80 38 77 81 +17 51 47 19 69 +86 50 71 5 93 +61 66 36 58 0 + +90 58 17 29 92 +67 1 8 64 99 +63 22 57 19 68 +78 36 93 53 2 +27 48 62 39 14 + + 8 49 22 90 54 +26 4 99 27 34 +78 25 11 85 28 +31 42 36 53 15 +64 75 60 45 35 + +99 84 26 53 90 +61 51 98 39 86 +47 37 52 80 63 +67 49 35 70 11 +32 45 94 73 43 + +91 92 74 94 32 +27 56 50 33 54 +67 46 35 25 10 +93 97 30 90 4 +57 15 69 83 39 + +71 68 74 81 11 +44 98 60 17 73 +43 40 32 38 39 +61 56 97 94 70 +23 2 86 91 54 + +19 98 93 42 88 + 0 16 30 32 71 +89 86 81 76 68 +29 2 14 72 63 + 7 27 67 59 1 + +24 18 28 98 95 +10 62 80 71 36 + 3 89 20 63 46 +47 65 84 22 6 +82 19 81 38 45 + +54 85 67 34 79 +25 58 38 73 61 +72 98 4 19 40 +32 10 29 31 89 +15 33 5 7 63 + +49 48 71 81 88 +70 5 39 41 22 +19 20 7 75 23 +69 46 63 14 54 +80 45 94 6 55 + +88 62 76 78 95 +64 65 36 58 22 + 7 21 98 93 42 +79 99 9 89 10 + 6 5 33 92 72