day4: [python] complete
authorPat Thoyts <pat.thoyts@gmail.com>
Mon, 4 Dec 2023 18:41:52 +0000 (18:41 +0000)
committerPat Thoyts <pat.thoyts@gmail.com>
Mon, 4 Dec 2023 18:41:52 +0000 (18:41 +0000)
day4/data/input [new file with mode: 0644]
day4/data/test_input [new file with mode: 0644]
day4/puzzle.py [new file with mode: 0644]
day4/run.py [new file with mode: 0644]
day4/test_puzzle.py [new file with mode: 0644]

diff --git a/day4/data/input b/day4/data/input
new file mode 100644 (file)
index 0000000..7a8f270
--- /dev/null
@@ -0,0 +1,219 @@
+Card   1: 99 71 95 70 36 79 78 84 31 10 |  5 45 54 83  3 38 89 35 80 49 76 15 63 20 21 94 65 55 44  4 75 56 85 92 90
+Card   2: 73 44 51 27 89  2 81 32 42 93 | 93 81 29 48 51  1 36 92 23 80 44 85 73 13 89 33 96  2 12 32 50 77 27 42 61
+Card   3: 15 80 72 53 26 29 57 81 95 21 | 81 27 26 50 80 74 96 95 65 25 12 44  8 56 99 72 29 23 14 15 47 53 73 21 57
+Card   4: 61 39 42 50 51 19 83  8  6 59 | 39 51 50 34  4  6 96 25 79 19  8 29 61 42 37 38 90 83 15 59 10 71  7 94 48
+Card   5: 83 63 23 45 72 51 70  4 28 47 | 31 73 38 63 83 23 59 86 47 40 28 33 69 85 34 45 50 72 51 70  9 79 82  4 37
+Card   6:  7 85 75 80 88 92 63 22 72 42 | 63 40 54 22 92 29 75 89 72 85 33 88 18 30  7 42 99  1 12 41 94 76 35 80 14
+Card   7: 64 72 66  7 15 80 99 12 49 29 |  4 42 85 99 74 66 40 44 80 48 71 72 73 35 86 43  7 49  5 15 78 26 64 29 12
+Card   8: 46 39 26 90 37 74 56 19 68 38 | 45 83 90 39 93 56 22 27 69 46 30  4 81 65 37  9  6 26 77 24 92 73 88 19 42
+Card   9: 92 80 16 53 68 79 52 67 46 99 | 99 94 52 90  5 41 46 79 12 73 35 20 77 16 80 60 65 92 43 82 23 67 68  7 53
+Card  10: 73 68 54 50  3 41 26 69 86 20 | 41 93 36 94 72 50  3 17 91 66 73 67  7 35 48 42 54 52 20 74  2 11 86 75 68
+Card  11: 13  7  2 74 99 21 19 57 98 53 | 70 36 10 69 53 57 80 48 19 45 83  7 98 54 13 21 31 99 74  3 44 23  2 85 29
+Card  12: 71 12 22 93  7 74 25 82 36 58 | 68 97 52  1 96 54  9 13 77  4 44 56 47 65 38 58 98 11 89 85 25 70 26 35 45
+Card  13: 32 35 30 83 70 11 81 84 41 85 |  1 30 52 84 32 41 85 83 98 97 58 91 57 21  6 23 28 93 96 35 81 33 46 11 70
+Card  14:  1 89 42  5 51  2 41 46 10 48 | 91 80  3 47  5 48 92 33 36 60 40 55  7 90 93 66 68 38 64 72  4 73 97 42 83
+Card  15: 30  2 70 48 46 52 33 94 22 35 | 20 22 23 16 46 30 51 60  4 41 48 52 35 13 72 37 40 42 17 70 85 94  2 26 33
+Card  16: 27  7 54 33 62 42 86 29 60 31 | 95 19 61 52 25 76  3 22 62 60 90 32 88 70 87 14 71 73 77 16 85 82 89 74 27
+Card  17: 44 66 75 77 53 63 41 20 39 43 | 97 90 25 20 27 52 74 58 67 73 84 40 69 55 29 32 35 51 86 15 56 43 13 48  1
+Card  18: 65 55 81 16 17 66  9 50 79 24 | 81 94 88 92 76 64 74 98 17 41 46 49 99 96  5 65 66 78 97 16 93 69 79 84  9
+Card  19: 34 48 51  4 33 64 10 76 96 83 | 90 21 32 61 85 45 91 58 67 86 93 41 54 15 94 39  3 70 97 99 31 75 40 19 43
+Card  20: 94 45 12 48 65 29 63 74 18 51 | 53 38 79 57 80 45  2 18 47 77 16 71 95 76 91  1 29 23 33 88 74 39 44 42 68
+Card  21: 20  8 57 48 95 92 69 16 27 79 | 33  2 89 48 51 28 84 64 54  9 59 80 87 34 17 24 45 71 29 20 66 94 96  4 21
+Card  22: 46 90 22 95 52 73  6 98 94 80 | 38 89 23 13 21 85 81 17 26 48 67 93  2  9 62 18 97  7 76 33 40 57 37 61 92
+Card  23: 37 83 50 69 31 59 98 48 12 82 |  6 81 53 87 67 39 41 29 51 47 70 38 73 72  8 23 25 63 37 98 30 14 45 54 77
+Card  24: 17 46 21 79 87 32 78 70 19 69 |  1 55  6 47 50 37 94 74 99 42 40 70 52 68 64 88 10 22 66  4  3 81 24 38 84
+Card  25: 28 35 32 81 51 46 58  4 74 88 | 21 54 22  6 92 95  3 37  5 47 17 76 33 34 13 16 79 75 50 23 40 41 20 78 29
+Card  26: 51 44 56 78 57 88 18 36 68 39 | 31 27 87 40 13 29 22 38 43 37 69 32 75 91 26 82 64 20 55 15 88 19 79  8 16
+Card  27: 16 76 77 44 37 98 85 54 25 27 | 92 54 68 77 10  8 25  5 73 36 20 44 96 91 16 85 76 60 27 29  2 31 71 37 98
+Card  28: 90 78 37 68 12 32 99 86 35 36 | 60 77  9 12 91 20 58 42 85 94 17 63  4 73 30 82 90 53 37 26 31 51 84  1 18
+Card  29:  1 54 43  4 42 71 80 19 46 98 | 23 31 29 94  4  9 64 27 60 54 98 52 45 68 19 42  1 91 67 88 17 80 43 46 71
+Card  30:  6 36 13 39 31 88 27  2 59 51 | 64 32 66 59  2 25 36 22 46  6 31 37 85 13 78 45 51 24 27 21 88 28 92 39  5
+Card  31: 92 62 69 20 34 89 49 27 29 17 | 56 21  2 29 39 17 48  9 92 44 42 20 57 68  7 84 86 47 26 98 49 96 74 13 32
+Card  32: 21 24 37 65 36 69 29 47 63 61 | 17  4 71 34 28 75 77 60 95  6 43 89  1 42 41 53 54 13 64 52 84 92 32  3 18
+Card  33: 91 64 15 16 54  2 85 82 24 27 | 82 20 67 16 85 24 68 43 27  2 91 31 40 18 15 99 87 19  8 94 84 49 64 34 54
+Card  34: 76 99 93 72 60 21 67 20 82 65 | 72 76 98 20 53 60 37 64 99 14 29  2 84 92 94 67 82 75 21 93 26 80 65 41 51
+Card  35: 60 74 84 32 64 25 34 87 31 42 | 29 86 45 69 37 71 32 80 25 64 42 13 31 24 55 58 73 87 20  8 60 74 67 34 84
+Card  36: 84 26 18 77 72 22 32 17 67 45 | 14 28 84 33 25 77 32 86 55 70 17 23 41 69 53 26 95  1 98 47 73 72 12 76 18
+Card  37: 57 75 65 98 48 37 46 38  2 94 | 18 79 37 10  3  2 62 95 20 94 26 44 38 71 65 51 84 74 98 29 15 64 75 57 59
+Card  38:  3 93 29 48 20 74 42 75 23 30 | 17 23 46 95 29 91  3  4 63 30 57 48 81 97 47 74 37 75  8 93 43 64 20 68 42
+Card  39: 13 20 83 35 91 51 74  7  8 39 | 67 35 27 36 20 54 64 91 74 60 93 32 83 47 39 42  8 48 76 10 90 62  7  3 13
+Card  40: 54 72 41 61 65 77  3 75 91 80 | 21 45 58 54 62 84 13 71 12 61 75 92 41 43 57 80 59 76 47 40 42 10 23 36 56
+Card  41: 23 67 15 48  7  8 35 68 21 64 | 46 55 59  5 65 96 73 52 39 78  7 35 21 92 41 64 95 23 48 31 50 69 10 99 30
+Card  42:  5 39 68 26 63 40 14 48 65 23 |  6 22 48 63 93 65 37 68 27 99  3 15 11 33 97 46 26 59 34 53 70 76 72 62 23
+Card  43: 29 55 31 81 65 53 70 57 77  6 | 20  4 12 54 37 21 73 71  1 14  8  3 43 97 61 99 27  9 98 18 64 96 24 13 89
+Card  44: 83 55 94 72 40 35 41 58  7 45 | 10 18 75 45 93 27 42 87  1 59 54 50 28  3 40 84 85 73 74 49 17 48  6 88 64
+Card  45: 13 53 30 61 77 90 98 55 58 41 | 39 37 61 18 96 59 51 12 60 17 63 36 33  2 98 19 90 88 79 16 72 56 11 76 89
+Card  46: 86 58 95 57 88 43 87 60 51 89 | 55 87 34 78 37 73 24 71  4 19  1 13 82 91 21 46 68 67 36 22 41 26 64 80 23
+Card  47: 88 71 37 47  5 76 78 95 79 28 | 12 29 10 20 65  6 56 63 97 38 94 96  3  7 51 39 70 86 46 68 17 58 64 89 24
+Card  48: 82 77 16 24 42  3  8 68 64 48 | 50 99 88 22 89 78 85 53 19 66 60 64 31 52 75 69 27  4 47 32 41 55 21 96 80
+Card  49: 20 55 73  3 41 87 35 97 29 60 | 94 63 56 46 85 25 96 83 89 45 18  8 74 81 27 51 95 44 34 99 22 77 38 69  5
+Card  50: 42 84 27 79 14 59 91 94 87 30 | 46 90 99 45 79 68 13 41 39 84 76 87 26 33 91 37 59 42 14 65 32 30 27 94  9
+Card  51: 52  1 20  6 70 54 66 29 88 31 | 87  1 81 76 52 11 88 31 91 72 70 42  2 86 66  6 27 78 54 47 29 46 99 20 69
+Card  52: 67 73 66  1 54 15 33 50 30 27 | 77 30 27 94  1 60 54 91  5 33 58 67 84  7 78 24 50 15 73 75 71 93 66  2 42
+Card  53: 77 72 59 45 61 35 63 56 23 96 | 35 99  8 77 46 72 97 12 28 10 87 30 43 59 56 96  1 63 31 23 70 32 61 45 62
+Card  54: 99 90 44 72 42 78 94 37 33 22 | 99 69 42  9 44 84 81 94 14  5 13 95 34 26 22 33 66 55 90 78 10 98 63 72 37
+Card  55: 35 21 13  8 85 29 20 25 27 64 | 11 30 69 50 36 43 22 85 82  9  8 25 32 20 13  7 49 61 57 93 29 35 27 64 21
+Card  56: 57 36 51 13 35  9 16  1 63 95 | 35 21 36 65 85 13 18  1  9 29 63 70 51 16 69 43 86 57 53 52 66 84 41 23 95
+Card  57: 19 85 67  8 54 56 11 40 97 39 | 81 54 29 36 57 13 80 31 40 27 97 47 33 78  1 86 63 76  6 22 96 62 98 95 71
+Card  58: 35 62 19 46 95 73 99 63 44 78 | 87 95 77 73 72 18 60 69 78 54 38 39 43  8 48 88 41 71 61 36 89 83 99 52 62
+Card  59: 97 20 41 25 22 26 93 33 85 63 | 26 51 80 42 66 63 10 24 81 22  5 31 30 58 27 19 46 16 33 61 54 50 85 39 25
+Card  60: 65 50 27 43 20 75 45 25  5 56 | 45  9 91 55 98 62 43 74 75 20 27 42 52 22 29 93 56 65 50  8 14  3 36 25  5
+Card  61: 52 66 67 33 27 93  7 96 77 73 | 53 27 69 66 52 47 62 18 92  6 85 33 94 75 19 67 91 73  7 50 93 77 81 96 65
+Card  62: 47 12 70 85 81 23 83 42 39 25 | 88 39 12 40 38  5 21 41 80 81 49 62 46 94 14 82 51 19 47 93 23 74 48 42 34
+Card  63: 85 53 50 20 89 13 84 40 26 88 | 67 23 49 44  4 31 91 94 81 92 52 97 53 24 40 26 87  3 15 89 30 20 46 57 28
+Card  64: 68 21 67 80 58 11 20 98 94 64 |  4 76 27 75 23 94 93 37 17 66 12 10  9  2 33 52 41 81 15 18 99 60  5 42 59
+Card  65: 85 11 79 22 95 13 64 46 52 66 | 48 65 55 63 85 35 26 39 19 37  8 53 30 98 95 22 69 47 54 66 99 79 25 46 91
+Card  66: 70 50 51 60 92 24 95 43 61 96 | 51 48 24 52 33 46 28 79 61 81 70 84 30 92 23 96 11 95 34 10 53 26 75 86 64
+Card  67: 24 49 73 72 51 35 27 57 16 55 | 35 49 95 25 74 89 11 51 78  6 28 60 86 13 14 23 15 48 37 52 16 61 20  5 45
+Card  68: 16 54 52 48  1 70 86 50 15  9 | 59 85 50  1  8 29 37 67 70 72  2 47 30 48 15 62 27 75 88 84 55 66 51 73 80
+Card  69:  4 34 79 38  5 94 96 89 33 92 | 77 45 98 86 88 68 22 21 76 35 69 84 58 46 95 38 73 87  9 94 15 85 61 29 11
+Card  70: 96 19 50 33 80 84 75 25 93 74 |  3 81 39 52 32 54  4 47  8 12 77  6 24 78 57 71 99 98 17 60 86 87 14  2 95
+Card  71: 44 13 33 51 90 18 41  3 38 46 | 84 99 74 81 60 89 92 93 20 57 91 97 38 85 33 44 32 16 78 47 31 26 65 36 10
+Card  72: 40  1 12 22 50 38 43 21 27  7 | 47 99 24 73 62 57 38 67 13 33 10 68 12 82 89 61 88 51 15 54 28 92 77 65 76
+Card  73: 46 13  4 77 88 43 27 20 16 23 | 59 45 96 62 50 56 93 75 43 97 14 99 52  9 25 91 92 34  1 81 49 84 33 35 38
+Card  74: 62  3 52  1 69 72 73 79 64 28 | 99 94 23 59 58 65 90 76 96 95  9 93 50 56 38 61 80 84 31 46 41 82 54 85 43
+Card  75: 99 21 75 69 43 59 61 93 22 76 | 39 66 34 76 74 49 96 68 99 84 59 21 61 87 69 73 43 22 18 93 88 83 75 13 58
+Card  76: 97 60 56  9 71 42 82 51 68 29 | 33 71 56 66 74 73  9 77 21 57 47 61 92 68 60 17 32 22 29 82 55  1 37 65 95
+Card  77: 74 99 79 82 22 62 81 23 20 48 | 97 58 75 28 48  5 83 99 15 23 62 26 81 74 82 29 43 70 96 73 22 25 79 20 11
+Card  78: 87 27 89 26 18 44  5 29 80 71 | 97 88 48 23 36 26 61 74 94 72 79 95 78 96  7 30 28 57 91 86 47 65  3 34 31
+Card  79: 73 14 36  3 13 30 56 71 80 26 | 42 89 57 98 34 26 31 94 73 71  3 35 36 13 24 68 14  2 85 43 91 30 79 56 80
+Card  80: 31 66 25 43 22 28 34 93 84 71 | 88 11 33 17 27 22 12 18 92 49 82 26  3 20 24 31 93 46 67 89 85 76 98 60 81
+Card  81: 19 53 29 87 83 73  3 23 77 46 |  1 64 17 84 60 61 36 42 80 18 39 14 81 88 11 56 73 93 44 24 51 28 32 16 35
+Card  82: 88 56 52 30 81 58 16 29 33  7 | 68 52 46 19 88 29 50 64 16 48 56 59 81  7 74 30 15 94 42 32 65  4 14 33 58
+Card  83: 35 68 10 89 13 54 73 99 57 37 |  5 43 98 72 18 97 37 96 44 45 49 46 74 91 57 89 34 80 84 39 21 90 54 50  2
+Card  84: 55 20 37 59 73  3 54 27  9 46 | 38 31 12 48 43 95 65  8 24 68 85 92 83 96 57 30 40 89 44 84 94 93 87  6 26
+Card  85: 24 89 68 66 53 13 32 21 35 37 | 63 21  9 13 65 32 68  3 24 35 80 18  8 66 40  1 95 37 89 71 41 60 91 79 67
+Card  86: 14 26 59 87 89  2 43  6 58 82 | 50 82 26 32 66 98 13 77 81 59 52 24 58  6 89 95  8 47  3 83 87 73 43  2 14
+Card  87: 28 64 26 16 98 50  9 90 22 14 | 22 90 80  9 69 42 78 16 14  3 85 89  2 88 59 53 28 65 38 98 97 54 92 51 40
+Card  88: 74 15 77 76 57 41 89 48 69 99 | 54 15  9 38 22 21 65 59 79 25 57 75 70 85 93 81 41 29 92 77 46 72 31 90 86
+Card  89: 16 13 22 17 65 72 12 33 96  6 |  2 25 67  5  1 98  9 50 56 11 92 99 66  7 89 70 49 77 59 87 60 76 96 85 37
+Card  90: 60 26  2 36 25 79  6 57 68 94 | 68 39  3 22  1 59 87 20 93 21 80 36 83 10 44 50 28 26 41 25 34 90  6 15 64
+Card  91: 59 70 54 71 61 73 87 34 33 76 | 24 48 27 47 35 96 56 69 73 59 54 76 98 68 71 61 17 41 46 31 14 19 45 75 78
+Card  92: 17  7  4 96 81 55 64 13 73 95 |  3 13 95 40 29 94 58 73 17 67 77  2 42 83 59 11 49 78 47 60 98 64 26 10  5
+Card  93: 41 96  8 12 10 94 68 64 37 77 | 45 88 24 74 19 56 34 70 69 10 41 26  6  1 66 80  5 90 73 28 48 75 67 22 87
+Card  94: 12 61 83 85 74 14 89 95 93 25 |  6 44 62 84 17 94 23 72 16 39 30 76 83 87  8 98  1 21 78 63 13  3 57 35 52
+Card  95: 60 26 74 15  7 51 57 68 33 39 | 91 60  6 30 96 74  8 37 84 73 23 58 65 32 77 34 25 24 47 61 62  2 87 56 35
+Card  96: 81 41 18 12 34 82  7  4 89 24 | 94 39 83 57 60 69 98 29 52 76 74 63 13 11 50 92 30 68 22 44 77 99 38 72 67
+Card  97: 82 81 60 11 91 48 77 38 49 17 | 21 90 36 14 57 61 72 68 75 80  5 29 19 86 37 47 45 53 32 54 10 35 52  9 31
+Card  98: 21 57 80 13 20 11 72 76 85 93 | 52  7 72 71 92 85  2 96 39 62 84 45 30 17 95 57 34 11 28 46 21 99 29 80 77
+Card  99:  7 37 26 23 99 74 38 40 90  2 | 14 68 33 40 21 29  7 39 28 38 37 80 26  5 75 91 88 44 93 74  2 23 34 99 90
+Card 100: 49  2 30  5 88 53 18 28 13  9 | 52 24 11 61 96 94 13 55 53 44  5 72 41 66 77 56 36 90 38 20 45 21 54 42 39
+Card 101:  8 67 46 27 64 65 58 41 99 45 | 41 35 81 34 93 51 39 88 98  9 45 67 84 26 44 91 22 46  7 20  8 36 27 61 83
+Card 102: 67  4 42 94 16 69 27  2 65 35 |  5 94 58 16 61 86 47 74 76 88 35 91 37  8 79 64 17 33  7 97 22 55 38 98 14
+Card 103: 35 71 33 16 10 14 87 45 55 73 | 73 38 33 16 88 44 35 22 14 61 64 45  8 75 53 62 71 55 85 87 10  4 28 79 23
+Card 104: 45 59 22 17 46 25 23 56 94 16 | 14 94 45 17 98 35 22 46 48 16 56 25 24 93 74 31 12 59 42 95 87 76 32 23 81
+Card 105: 57 42 86  2 12 19 66 31 38 92 | 86 71 92  3 70 15 35 43 19 57 38 53 73 66 16 42 31 37 60 75  2 18 34 21 12
+Card 106: 84 99 11 56 54 46 36 75 80  1 | 53 51 81 70  2 73 46 62 79 80 34 91 96 99 90 55 56 50 26  7 86 74  3 43 68
+Card 107: 65 18 86 33 42 59  2 96 64 14 | 73 56 18 59 53 88 11 86 70 82 94 79 64 14  5 33 42 36 96 65 51  2 47 25 72
+Card 108: 52 28 55 29 74 89 91 36 18 82 | 66 91 18 90 52 45  2 28 47 19 32 29 89  6 79 25 55 82 36  3 51 13 75 43 44
+Card 109: 10 49 37 32 38 53 20  2 67 93 | 80 76 31 58  3 11  7 20 77 49 17 52 78 37 70 97  6 46 18 85 19 91 35  8 43
+Card 110: 28 57 67 95 96 72 97 21 38 46 | 94 70 27  1 32 57 72 95 61 75 22 12 52 30 83 10 33 78 24 28 66 93 16 23 79
+Card 111: 77 49 11 27 44 82 51 79 58 39 | 42 90 56 71 25 94 27 23 92 96 43 24 80 29 63  8 11 58 30 64  1 84 91 44  9
+Card 112: 71 77 10 64 69 31  2 59 57  7 |  4 66 20 30 89 99  1 86 21 61 41 93  6 15 40 18 92 73 25 56 48 46 44 84 94
+Card 113: 98 30 10 20 88 51 15  5 23 40 | 89 11 27 53 57 99 93 77 54  2 88 17 72 42 49 90 19 39 86 92 76 55 87 25  1
+Card 114: 80 29 60 53 19 36 12 31 22  6 | 37 32 50 44 73 78 41 13 46 98 38 93 86 83 23 20 82 48 70 33  5 71 66 97 65
+Card 115: 14 78 64 49 38 22 26 46 67 99 | 95 66 32 39  7 15 20 94 17 65 33 21 99 85 74 76 27 82 43 19 49 35 47 88 97
+Card 116: 99 88 19 41 44 31 20 65  4 15 | 26 80 72 18 91 50  9 40 30 44 71 24 92 57 66 36 22 20 85 58 52 48 37 15  2
+Card 117: 55 12  5 54 83 91 51 43 48 62 | 73 45 87 78 72 23 40  1  2 49 71 79 36  8 18 21 86 97 89 27 60 31 28 41  6
+Card 118: 68 94 29 44 59 32 63 42 12 15 | 20 46 76 75 98 14 62  7 28  4 99 65  6 26 95 89 60 83 19 78 96 37 59 91 53
+Card 119: 64 23 62 48 84 46 82 10 53 79 | 60 20 58 33 38 97 12 85 74 36 24 99  9 81 56 15 71 69  1 19 95 68  7 26 54
+Card 120: 74 59 32 56 49 20 95 21 35  4 | 49 42 13 44 69 33 14 99 66 19 27  9 89 60 65 90 74 41 82 58 92 17 16  1  6
+Card 121: 87 83  4 51 17 12 71 73  9 31 | 83  1 17 94  4 56 23 10 31 12 14 39 26 61 70 87  9 71 51 67 73 38 90 78 59
+Card 122: 90 20 15 22 54 89  8 33 81 36 | 46 60  4 92 35  1 28 61 43 10  8 36 50 34 72 65 63 82 49 15 54 44 45 13 58
+Card 123: 82 21 25 95 41 64 62 31 63 27 |  5 34 25 36 83  1 53  2 19 65 24 70 63 60 41 31 92 11 52 43 96 64 42  4 38
+Card 124: 68 54 67 15 80 34 26 93 10  3 | 35 66 68 54 10 31 40 93  4 90 67  2 57 34 39 80 26 72 41 81 46 15 16  3 87
+Card 125: 35 61  2 95 30 55  8 13 80 78 | 82 14 58 66 65  1 90 76 44 80 10 84 96 72 88 56 27  9  3 22 16 95 86 83 93
+Card 126: 59  2 72 67 52 17 93 57 43 83 |  2 97 23 93 56 45 57 72 52 67 59 77 43 84 95 90 68 99 81  5 17  1 15 47 22
+Card 127: 46  3 47 78 98 52 62 73 70 88 | 82 16 66 93 38 62 70 81  2 60 35 34 52 84 32 79 50  4 61  1 42 25 54 24 97
+Card 128: 17  9 68 52 36 54 16 98 39 61 | 33 42 59  6 57 73 76 48 15 86 36 61 99 47 68  3 62 41 26 39 96 22  7 54 85
+Card 129:  8 24 69 14 54 11 49 72 38 94 | 61 44 67 37 18 70 64 19 29 89 34 97 75 33 74 10 12 28 98 92 99 73 43 41 51
+Card 130: 59 60 29 90 27 53 18 83 70 57 | 97 34  8  1 45 89 85 24 19 61 68 62 95 91 52 82 35 40 58  2 23 77 55 48 93
+Card 131: 90 50 34 81 52 37  9 86  3 47 | 39 33 97 10 72 46  5 96 77 86 16 19 11 64 94 75  9 45 58  6 35 15 14 32 28
+Card 132: 35 54 62 69 75 30 40 74 43 44 | 11 32 66 99 64 16 34 13 62 79 41 17 46 43 82 72 14 52 92 48 30 98 88 37 27
+Card 133: 21  7 47 91 75 86 73 19 49 54 | 88 62 45 70 89 57 99 41  4  9 27 15 77 83 67 28 10 69 52 68 66 34 30 38 74
+Card 134: 84 31  7 87  6 38 46 27 26 66 | 65 17 47 71 16 33 15 49 20 43  2 51 92  9 21 63  1 91 54 94 18 98 23 48 97
+Card 135: 91 63 53 17  6 66 71 29 47 96 | 67 69 77 83 31 79 92 93 20 87 45 10 22 30  5 75 56 24  3 44 82 27  8 19 61
+Card 136:  7 57 22 98  3 36 93 13 27 80 |  7 96 55 93 59 31 89 58 52 57 37 29 54 17 62 46 25 14 92  6 27 50 39 76 26
+Card 137: 82 50 55 30 12 78 69 85 29 79 | 55 97  1 42 41 28 25 29 30 17 84 69 52 78 79 46 82 72 86 40  2 50 12 85 70
+Card 138: 67 17 38 39 16 69 18 45 82 20 | 68 24 28  6 18 69 77 38 16 10 73 26 85 82 53  3 30 17 39 45 42 20 84 36  2
+Card 139: 46 90  6 73  4 83 69 47 59 89 | 69 61 89  8 53 86 54 79 59 46 25  2 45 90 84  5 30 28  6 52  4 47 73 12 83
+Card 140: 55 29 59 71 40 95 56 50 64 98 | 74 49 63 20 22 66 35 11 29 51 56 50 98 64 55 95 59 83 40 90 47 71 32 41 57
+Card 141: 52 25 71 49 39 63 84 86 43  1 | 34 27 39 53 17 75  6 99 84 38 82 91 25 96 37 29 54 59  7 56 36 89 41 24 11
+Card 142: 80 38 65 46  8 52  7 97 21 81 | 77 26 81 50  3 79 65 40 75  8 43 36 10 39 52  7 94 85 46 20 91 19 69 38 80
+Card 143: 47 76  1 79 38 15 74 96 44 51 | 86 66 83 60 21 70 48 13 16 56 35 45 47 25 84 24 85 99  1 96 51 23 10 20 53
+Card 144: 82 10 89 17 13 95 90 26 39 80 | 70 25 24 12  7 93 43 55 27 66 42 62  5 79 86 95 75 53  3 50 60  8 65 29 18
+Card 145: 68 19 72 53 15 46 87 23 93 29 | 28 18 60 74 10 26  6 69 86 90 21 76 27 58 25 42 80 98 57 84 13  4 61 45 55
+Card 146: 88 19 68 96 93 54 17 75 47 29 | 66 72 47 93 64 12 54 10 55  3 62 45 24 26 69 53 71 30 78 92 86 34 85 70 99
+Card 147: 92 95 68 70 56 79 52 86 94 74 | 65 45 30 43 60 76  3  4 84 57 15 38 11 58 17 27 69 98 31 49 91 85 68  7  2
+Card 148: 87 75 20 44 51 59 69 29 98 84 | 66 92 60 74 80 21 96 25 73 90 89 38 11 94 79 93 61 40 82 72 34 50 78  1 39
+Card 149: 79 17 94 63 29  9 36 85 32 90 |  5 27 92 10 87 75 95 57 78  8 61 40 56 64 67 26 60 31  3 42 74  6 84 50 45
+Card 150: 36 35 60 78 34 94 89 38 51  2 | 59 71 24 46 27 53 62  5 65 50 33  4 93 97 58 76 72 14  1 63 96 74 29 87 98
+Card 151: 76 78 48 25 89 81 24 54 62 46 | 65 24 25 31 89 46 42 80 76 59 54 47 81 43 48 78 92 35 99 29 62 15  2 95 51
+Card 152: 80 40 54 29 18 38 28  6 71 88 | 10 77 76 45 42 37 72 56 24 79  4 84 74 65 12 89  5 57 44 33 19 61  9 16 21
+Card 153: 27 98 50 68 10 81  9  1 56 65 |  6 21  2 39 76  1 71  7 81 50 98 93 48 66 85  9 11 65 43 68 56 12 25 55 27
+Card 154: 85 73 71 36 74 53  4 16 21 77 | 71 83 77 44 81 50  4 38 78 73 27 15 86 74 85 36 33 75 52 16 59 76 19 21 53
+Card 155: 51  2 84 71 11 20 34 62 96 30 | 19 72 62  2  1 77 27  6 30 84 55 11 75 23 63 28 20  7 51 36 96 34 91 71 95
+Card 156: 82 17 14  3 10 47 94 46  8 81 | 13 63 17 54 81 14  3 79 47 99 11  7 46 32 58  8 74 65 10 68 48 15 82 94 84
+Card 157: 60 29 13 49 55 19 68 63 83 54 | 84 56 83 14 33 54 38 63 29 74 19 11 51 49 32 53 55 80 12 68 79 13 69 30 60
+Card 158: 13  2 78 61 55 16 10 68 49 15 | 14 33 49 80 15 13 68 91 60 69 61 99  8 10 12 82 94 55 87 77 37 32  4 16 85
+Card 159: 46  7 54 82  9 98 38 88 71  6 | 97 30 87 73 32 79 52 65 51 44 94  1 91 89 20 50 96 69 34 27 80  5  2 18 56
+Card 160: 69 30 71 29 27 83 51 16 75 54 | 15 73  3 58 52 83 71 19 57 46 91 74  8 89 27 69 40 56 44 31 24 35 21 82  2
+Card 161: 44 88 72 86 20 49 18 43  5 70 | 20 25 30 59 85 78 90 70 96 24 74 34 49 53 46 28 86 80 44 72  5 37 13 55 36
+Card 162: 52 23 46 90 73 70 31  5 89  1 | 90 54 69 47 92 33 70 62 51 75 46 97 81  5 52 58  7 64 87 18 73 23 68 36 89
+Card 163: 71 64 75  3 49 55 62 16 11 76 | 96 67 29 92 82 35 70 28 20 39 43  5 59  7 91 90 62 26 33  1 52 15  2 46 80
+Card 164: 94 25 75 78 71  5 26 10 93 35 |  2 81 24 30 82 85 50 58 78 23 79 22 67 34 40 62 42 10 38 25 31 61 19 36 41
+Card 165:  2  4 95 36 78 70 49  6 61 14 | 38 28 87 33 24  4 30 92 70 83 93 79  2 19 21 36 45 42 49 54 14 57 53 50 88
+Card 166: 63 77 19 36 40 67 65 60 38 57 | 55 11 67 24 46 36 52 48 33 79 37 19 87 94 49 26 51  3 62 75  6 47 60 13 77
+Card 167: 17 31 42 76 78 98 51  4 24 47 | 20 34 21  2 73 37 95 44 81 74 46 69 33 63 35 87 91 22 54 80 58 53 75 71 72
+Card 168: 35 29  4 38  2 84 11 51 82 95 | 54 91 22 49 47  5 99  3 92 76 97 81 67 80 17 98 19 31 41 12 61 78 23 26 39
+Card 169: 31  9 40 97 67  8 95 55 98 39 | 54 87 51  9 43 65 61 29 89 92 90 97 10 45 78 27 71 38 75 96 60 57 16  3 30
+Card 170: 57 13 36 35 34  9 47 43 69 77 | 13 26 25 48 39 56 53 12 22  1 23 46 54 30  4 81 97 73 17 88  2 91 14 92 79
+Card 171: 94 31  8 53 93 92 99 86 38 50 | 61 73 14 87 40 48 26 58 65 17 41 23 63 78 34 62 36 66 79 96 28 57  1 11 45
+Card 172: 65 32 15 44 58 62 89 47 39 72 | 75 77 12  6 74 84 39 94 48 49 61 83  5 78 79 19 41 91 95 27  8 34  3 32 88
+Card 173: 41 62 58 74 21 43 95 76 86 61 | 31 81 17 36 43 76 55  9 41  4 29 11  3 62 35 97 46 95 58 61 50 18 74 86 21
+Card 174: 51 98 49 10 63 17 29 89 77 90 | 34 42 85 63  2 59 38 49 17 81  9 90 72 30 77 68 89 15 10 51 29 25 98 52 88
+Card 175: 86 66 20 51 68 18  9 54 87 40 | 93 64 62  4 65 44 51 20 86 54 10 40 25  9 76 72 55 24 29 18 66 80 33 68 87
+Card 176: 78 29 90 46 47 31 83 26 51 25 | 95 31 19 29 33 59 84 46 61 25 34 44 83 89 26 56 98 54 53 85 51 78 90 64 47
+Card 177: 95 56 62 13 87 93  1 60 98 80 | 67 24 57 95 60  7 13 56 87 98 62 33 93 15 45  1 47 92 35 80 55 36 46 73 18
+Card 178: 21 99  2 36 57 68 73 34 32 31 | 68 73 15 31 32 72 81 60 99  2 71 58 55 20 21 67  8 51 78 57 42  9 95 34 49
+Card 179: 91 34 61 60 97 12 99 44 25 67 | 17 43 67 82 44  7 26 98 61 51 95 23 84 56 34 97 25 12 46 50 91 80 75 60 99
+Card 180: 47 36 46 99 85 40 64 84 42 54 | 15 40 90 70 49 21 32 72 43 14 46 95 92 80 76 38 75 82 44 84 47 93  6 54 16
+Card 181: 63 50 87 79 76 74 26 17 38 77 | 68  8 46 62 52 26 11 56 17 41  3 54 94 50  1 77 21 74  6 79 97 40 15 29 63
+Card 182:  7 64  1 63  8 62 78 56 48 55 | 44 21 66 78 38 37 63 31 55 64 70 67  1  7  8 48 49 61 11 65 75 95 17 56 20
+Card 183: 70 14 76 55 85 32 58 43 30 47 | 23 26 13 58 78 44 32 73 30 96 14 93 40 70 85 55 76 42  7 43 59 71 48 47 39
+Card 184: 79  3 56 71 90 21 72 97 33 94 | 27 21 13 49  8 67 64 70 56 45 86 52 46 58  1 15 22 71 80 57 44 83 60 20 87
+Card 185: 49 76 37  2 56 67 47 52 53 32 | 82 44 46 78 70 16 62 59 73 85 65 58 24 63 83 29 30 50 60 31 18 80  9 94 10
+Card 186: 52 33 62 15  9 54 96 65 17 34 | 78 84 59 33 62 10 15 34 74 53 56 46 55 85  9 61 17 52 96 39 65 41 36 22 12
+Card 187: 91 42 64 39 98  6 69 78 81 73 |  2 90 91 41 73 95 28 25 10 20 77 64 81 66 97 74 82 99 57 96 65 93 40 67 76
+Card 188: 86 40  7  4 58 43 17 42  3 41 | 51 20 19 46 77 25 48 87 72 75 33  1 11 95 59 12 24 37 93 73 30 92 69 35 84
+Card 189: 55 88 58 95 53 98 61 14 99 32 | 88 92 59 43 10 48 24 34  2 13 96 39 52 89 82 57 98 55 58  8 56 14 16 21 32
+Card 190: 98 92 36 82 35 16 30 87 97 34 | 39  4 34 29 92 48 73 88 15 89 32 80 36 19 98 63 82 16  2 11 49 21 44 18 79
+Card 191: 70 77 87 90 57 25 40 15  1 21 | 78 88 39 51 86 87  3 52  7 19 74 80 71 91 70 75 23 65 45 49 15 18  4 54 55
+Card 192: 56 92 22 12 49 58 65 75  4 13 | 19 13 96 83 26 11 48 90 31 20  8 97 73 32 43 10 74  9 92 89 29 72 77  6 56
+Card 193: 96 71 66 59 31 65 18 64 98  2 | 60  9 28 45 41 90 85 22 89 18 88 65 74  4 99 33 70 25 53 47 35 16 38 24 98
+Card 194: 95 79  4 68 41 28 66 57 48 63 | 34 23 36  1 25 35 78  8 81 61 26 99 67 37 30 39 10 13 27 74 85 92 20 65 32
+Card 195: 41 83 10 73 51 22 94 89 69 24 | 87 61 32 58 35 33 30 66 59 60  5 45 28 72 37 90 12 46 19 25 17 16 31 57 47
+Card 196: 47 13  6 72 90 41 21 91 26 89 | 19 46 23 31  2 95 82 49 42 62  8 98 55 45 48 24 70 59 18 71 88 81 35 32 43
+Card 197: 28 94 70 24 89 47 20 97 73 16 | 73 66 16 28 61 41 47 76  5 96 70 17 72 89 91 77 32 19 94 42 97 88 24 80 20
+Card 198: 38 14 72 57 28 61 58 83 95 34 | 28 16 61 82 68 54 38 69  6 58 57 63 18 83 67 95 27 39 76 74 13 14 91 72 34
+Card 199:  9 98 46 14 29 54 74 88 47 56 | 93 23 78 26 19 20 99 38 39  7 13 50 90 22 66 89 87 73 29 24 53  8 40 14 63
+Card 200: 46 67 91  4 68 40 17 28  5 79 | 21 68 28 79 17 98 59 93  5 67 27 84 43 46 91 86 80 45 42  4 40 52 35 89 19
+Card 201: 76 11 20 45 41 85 27 90 86 60 | 86 41 21 11 17 96 40 62 59 64 36 90 35 49 85 93 60 43  8 12 97 76 45 44 20
+Card 202: 91 18 87 23 12  5 15  7 93 75 | 22 56 30 62 19 53  8 59 32 55 60 76 96 95 50 66 26 40 29 72 35 27 61 58 33
+Card 203: 34 37 15 89  9 24 72 93 76  1 | 21 43 19 56 91 30 83 62 60 28 23 42 90 97 78 94 32 10 25 84 58 63 27 54 38
+Card 204: 27 15 36 61 35 83 86  1 20 58 | 35 20 32 87 27 75 40 86 15 58 48 45 61 83 66 24 18 36  5 78  1 77 64 52  7
+Card 205: 28 98 47 86 52 91 34 41 79 85 | 60 41 74 79 25 29 20  8 86 99 19 13 89 39 80 34 69 85 36  4 98 49 91 64 33
+Card 206: 97 10 61 28 81 83 12 87 33 91 | 10 22 55 32 63 68 40  5 11 86 43  2 90 66 37 99 12 19 81 17 13 94 88 27 95
+Card 207: 74 80 72  2 26 12 90 68 21 17 | 72 65 36 35 82 96 73 58 69 77  8 47  5 17 26 90 80  9 78 39 16 67 79 61 74
+Card 208: 57 81 71 67 87 80 40 39 95 98 | 91 92 16 67 90 78 84 77 24 80  7 83 30 45 42 37  3  4 21 79 68 58 52 71 27
+Card 209: 89 62 13 17 84 26 78 81 79  8 | 49 77 71 68  8 97  1 47 22 74 96 62 26  6 27 19 18 32 46 13 79 93 52 17 90
+Card 210: 74 87 27 78 36 54 70 31 41 97 | 83 33 11 41 72 97 23 68 17 70 54 12 27  4 80 78 51 15 35 87 62 89 74 95 52
+Card 211: 94  7 17 66 47 13  9 89  5 28 | 74 89 79  8 66 52 59 94 11 69 20 71 35 96 90  7  2 21 26 91 27 46 93 51 28
+Card 212: 55 41 84 46 83  4 87 24 75 56 | 29  6 93 32 51  7 71 20 88  3 37 72 62 40 66 38 90 85  9 74 10 31 78 27 44
+Card 213: 86 21 88  6 39  9 47  1 38 34 | 76 88 46 84 27 73 15  6 86 79  7 95 51  5 92 93  9 28 58 98 42 74 38 61 37
+Card 214: 34 62 79 39 97  8 78 81 86 18 | 20  7  3 32 28 76 25 40 80 66 77 62 27 13 95 15 14 48 64 60 54 31 74 97 58
+Card 215: 69 15 78 85 50 51 57 71 74 58 | 63 79  4 13 94 97 17 10 25 38 87 33 27 86 75 76 99 23 36 35 47 64 41 46 84
+Card 216:  2 39 13 72 47 45 38 37  3 89 | 67 12 37 18 69  8 60 80 55  6 17 96  7 74 10 23 50 72 15 92 95 41 21 32 35
+Card 217: 39 78 45  4 20 96 26 87 55  1 |  7 91 37 48 83 59 53 27 16 78 49 90 61 81 92 15 17 46 62 73 42  8  9 50 82
+Card 218: 32  2 98 53 69 96 76 79  7 50 |  9 49 16 21 70  6 44 34 47 41 93 58 95 81 66 65  4 62 57 30 90 53 10 89 25
+Card 219: 74 23 73 99 60 87 45 75 70 85 | 32 64 31 27 67 46 29 92 34 76 37 40 35 95 50 86 30 63 42 69 68 83 61 55 62
diff --git a/day4/data/test_input b/day4/data/test_input
new file mode 100644 (file)
index 0000000..9bdb874
--- /dev/null
@@ -0,0 +1,6 @@
+Card 1: 41 48 83 86 17 | 83 86  6 31 17  9 48 53
+Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19
+Card 3:  1 21 53 59 44 | 69 82 63 72 16 21 14  1
+Card 4: 41 92 73 84 69 | 59 84 76 51 58  5 54 83
+Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36
+Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11
diff --git a/day4/puzzle.py b/day4/puzzle.py
new file mode 100644 (file)
index 0000000..a27b9fc
--- /dev/null
@@ -0,0 +1,70 @@
+from typing import List\r
+from dataclasses import dataclass\r
+\r
+\r
+@dataclass\r
+class Card:\r
+    id: int\r
+    winning: List[int]\r
+    numbers: List[int]\r
+\r
+    def __str__(self):\r
+        return f"Card(id='{self.id}')"\r
+\r
+    @property\r
+    def points(self) -> int:\r
+        points = 0\r
+        for num in self.numbers:\r
+            if num in self.winning:\r
+                if points == 0:\r
+                    points = 1\r
+                else:\r
+                    points *= 2\r
+        return points\r
+\r
+    @property\r
+    def matches(self) -> int:\r
+        return [x for x in self.numbers if x in self.winning]\r
+\r
+    @staticmethod\r
+    def fromstr(line: str) -> 'Card':\r
+        name, rest = line.split(":", maxsplit=1)\r
+        try:\r
+            id = int(name.split(" ", maxsplit=1)[1])\r
+            wins, nums = rest.split("|")\r
+            wins = [x for x in wins.strip().split(' ') if x]\r
+            nums = [x for x in nums.strip().split(' ') if x]\r
+            winning = [int(val) for val in wins]\r
+            numbers = [int(val) for val in nums if val]\r
+            return Card(id, winning, numbers)\r
+        except ValueError:\r
+            print(f"Input: '{line}' '{name}'")\r
+            raise\r
+\r
+\r
+class Puzzle:\r
+    def __init__(self, cards: List[Card]):\r
+        self.cards: List[Card] = cards\r
+        self.count: List[int] = [1] * len(self.cards)\r
+\r
+    @staticmethod\r
+    def fromstream(stream) -> 'Puzzle':\r
+        cards = [Card.fromstr(line) for line in stream if line.strip()]\r
+        return Puzzle(cards)\r
+\r
+    def get_winnings(self, card: Card) -> List[Card]:\r
+        """Get the additional cards based on the current card matches."""\r
+        result = []\r
+        count = len(card.matches)\r
+        if count:\r
+            for index in range(card.id, card.id + count):\r
+                result.append(self.cards[index])\r
+        return result\r
+\r
+    def process(self):\r
+        for card in self.cards:\r
+            current_count = self.count[card.id - 1]\r
+            for win in self.get_winnings(card):\r
+                self.count[win.id - 1] += current_count\r
+            # print(f"{card.id}: {self.count}")\r
+        return sum(self.count)\r
diff --git a/day4/run.py b/day4/run.py
new file mode 100644 (file)
index 0000000..c93f25b
--- /dev/null
@@ -0,0 +1,23 @@
+#!/bin/env python3\r
+\r
+import sys\r
+import argparse\r
+from puzzle import Puzzle\r
+\r
+\r
+def main(args=None):\r
+    parser = argparse.ArgumentParser(description="AoC 2023 day 4")\r
+    parser.add_argument('filename', type=str, help="input path")\r
+    parser.add_argument('-d', '--debug', action='store_true')\r
+    options = parser.parse_args(args)\r
+\r
+    with open(options.filename, 'r') as input:\r
+        puzzle = Puzzle.fromstream(input)\r
+        points = [card.points for card in puzzle.cards]\r
+        print(f"part 1: {sum(points)}")\r
+        print(f"part 2: {puzzle.process()}")\r
+    return 0\r
+\r
+\r
+if __name__ == '__main__':\r
+    sys.exit(main(sys.argv[1:]))\r
diff --git a/day4/test_puzzle.py b/day4/test_puzzle.py
new file mode 100644 (file)
index 0000000..f6df789
--- /dev/null
@@ -0,0 +1,45 @@
+import unittest
+from puzzle import Puzzle
+
+
+class TestPuzzlePart1(unittest.TestCase):
+    def test_game_parse(self):
+        with open('data/test_input') as input:
+            puzzle = Puzzle.fromstream(input)
+            card = puzzle.cards[0]
+            self.assertEqual(card.id, 1)
+            self.assertSequenceEqual(
+                [41, 48, 83, 86, 17], card.winning)
+            self.assertSequenceEqual(
+                [83, 86, 6, 31, 17, 9, 48, 53], card.numbers)
+
+    def test_game_1_points(self):
+        with open('data/test_input') as input:
+            puzzle = Puzzle.fromstream(input)
+            card = puzzle.cards[0]
+            self.assertEqual(8, card.points)
+
+    def test_game_1_sequence(self):
+        with open('data/test_input') as input:
+            puzzle = Puzzle.fromstream(input)
+            points = [card.points for card in puzzle.cards]
+            self.assertSequenceEqual([8, 2, 2, 1, 0, 0], points)
+            self.assertEqual(13, sum(points))
+
+
+class TestPuzzlePart2(unittest.TestCase):
+    def test_puzzle_get_winnings(self):
+        with open('data/test_input') as input:
+            puzzle = Puzzle.fromstream(input)
+            self.assertSequenceEqual(
+                [2, 3, 4, 5],
+                [c.id for c in puzzle.get_winnings(puzzle.cards[0])])
+
+    def test_process(self):
+        with open('data/test_input') as input:
+            puzzle = Puzzle.fromstream(input)
+            self.assertEqual(30, puzzle.process())
+
+
+if __name__ == '__main__':
+    unittest.main()