From 97334d34eb0bc6e9e39582bb5311e70f5c6af1a7 Mon Sep 17 00:00:00 2001 From: Hubert Van De Walle Date: Sat, 4 Dec 2021 12:05:03 +0100 Subject: [PATCH] Day04 2021 --- 2021/src/main/kotlin/Day04.kt | 52 +++ 2021/src/main/resources/day04.txt | 601 ++++++++++++++++++++++++++++++ 2021/src/test/kotlin/Day04Test.kt | 31 ++ 3 files changed, 684 insertions(+) create mode 100644 2021/src/main/kotlin/Day04.kt create mode 100644 2021/src/main/resources/day04.txt create mode 100644 2021/src/test/kotlin/Day04Test.kt diff --git a/2021/src/main/kotlin/Day04.kt b/2021/src/main/kotlin/Day04.kt new file mode 100644 index 0000000..80b247f --- /dev/null +++ b/2021/src/main/kotlin/Day04.kt @@ -0,0 +1,52 @@ +package be.vandewalleh.aoc.days + +import be.vandewalleh.aoc.utils.BaseDay +import be.vandewalleh.aoc.utils.input.Day + +@Day +class Day04 : BaseDay() { + private val parts by lazy { input.text.split("\n\n") } + private val numbers by lazy { parts[0].split(',').map { it.toInt() } } + private val boards by lazy { + parts.drop(1) + .map { it.lines().map { it.trim().split("\\s+".toRegex()).map { it.toInt() } } } + } + + override fun part1() = boards + .map { playBoard(it, numbers) } + .minByOrNull { it.first }!! + .second + + override fun part2() = boards + .map { playBoard(it, numbers) } + .maxByOrNull { it.first }!! + .second + + private fun playBoard(board: List>, numbers: List): Pair { + for (round in numbers.indices) { + val usedNumbers = numbers.take(round) + var winning = false + for (line in board) { + if (usedNumbers.containsAll(line)) { + winning = true + break + } + } + if (!winning) { + for (i in board[0].indices) { + val column = board.map { it[i] } + if (usedNumbers.containsAll(column)) { + winning = true + break + } + } + } + if (winning) { + val unmarkedNumbers = board.flatten().toMutableSet().also { it.removeAll(usedNumbers) } + return round to unmarkedNumbers.sum() * usedNumbers.last() + } + } + error("No wins") + } + +} diff --git a/2021/src/main/resources/day04.txt b/2021/src/main/resources/day04.txt new file mode 100644 index 0000000..d1fa73d --- /dev/null +++ b/2021/src/main/resources/day04.txt @@ -0,0 +1,601 @@ +50,68,2,1,69,32,87,10,31,21,78,23,62,98,16,99,65,35,27,96,66,26,74,72,45,52,81,60,38,57,54,19,18,77,71,29,51,41,22,6,58,5,42,92,85,64,94,12,83,11,17,14,37,36,59,33,0,93,34,70,97,7,76,20,3,88,43,47,8,79,80,63,9,25,56,75,15,4,82,67,39,30,89,86,46,90,48,73,91,55,95,28,49,61,44,84,40,53,13,24 + +38 80 23 60 82 +25 35 28 47 39 +40 0 30 48 76 +32 41 49 69 4 +13 42 89 20 12 + +76 89 13 5 98 +87 48 2 59 20 +37 88 41 24 57 +16 85 31 73 95 +70 11 93 30 27 + +81 55 41 85 33 +67 97 71 90 52 +19 3 79 66 14 +49 96 94 26 25 +60 46 51 82 9 + +33 60 26 83 21 +91 7 39 19 41 +88 9 82 69 29 +93 79 12 34 11 +43 65 64 54 20 + +55 75 71 30 14 +42 67 3 73 13 +78 72 51 96 99 +95 10 84 0 31 +91 47 66 33 34 + +11 72 55 52 79 +94 34 53 61 40 + 8 31 49 68 71 +37 45 15 78 57 +21 88 65 24 56 + +65 59 4 41 69 +44 61 23 46 42 +10 68 37 54 25 +82 2 13 71 93 +87 90 89 57 74 + +75 70 40 68 30 + 5 28 58 52 19 +80 96 53 43 63 +33 60 66 64 56 +88 74 9 8 36 + +58 38 46 42 89 +98 85 17 51 2 +28 92 22 64 53 +27 97 43 10 54 +75 56 71 67 79 + +75 86 11 4 39 +14 80 41 26 2 +97 18 96 5 28 +44 68 54 88 35 +57 98 74 21 19 + +45 16 4 23 63 +44 37 99 21 85 + 2 82 58 10 84 + 0 47 53 33 20 +93 19 39 72 8 + + 5 25 24 32 44 +59 37 95 88 89 +68 69 8 96 99 +16 0 7 92 94 +65 15 55 66 31 + +65 14 92 66 69 +43 45 30 8 26 +87 47 18 82 76 +33 80 67 35 22 +38 62 84 96 52 + +39 45 15 57 53 +35 47 70 4 0 +50 17 65 78 3 + 2 7 28 36 42 +99 48 27 83 72 + +52 47 81 44 92 +35 86 36 71 29 +57 15 1 95 7 +68 77 6 3 31 +20 13 58 89 93 + + 2 56 27 4 64 +69 91 88 58 15 +10 92 61 63 6 +84 93 79 25 90 +16 31 55 46 53 + +23 42 93 12 30 +47 99 38 0 14 + 6 90 72 70 21 +62 61 96 87 22 + 5 55 51 28 17 + +42 12 58 95 92 +67 89 88 87 47 +32 72 11 83 97 +55 16 66 57 29 +54 64 96 2 36 + +72 47 69 68 12 +23 4 37 79 13 +52 5 59 58 70 +44 3 21 93 76 +97 0 35 9 71 + +87 49 55 18 94 +68 32 99 50 37 +15 3 80 90 42 +83 12 41 21 58 +91 89 74 45 51 + + 5 60 13 46 47 +18 54 33 26 0 +28 43 83 31 20 +12 75 34 36 4 +76 2 80 70 79 + +16 66 25 97 20 +52 23 80 74 90 +31 81 95 28 36 +99 8 50 57 98 +11 0 30 35 39 + +12 33 36 90 30 +59 66 77 25 46 +88 24 4 41 50 +18 52 37 75 43 +68 49 56 84 87 + +27 80 51 25 93 + 4 41 61 30 67 +68 47 15 20 50 +78 66 97 54 84 +35 1 23 89 14 + +82 51 38 80 75 +35 79 43 54 3 +73 13 23 25 59 +27 64 47 62 66 +83 0 7 4 20 + +67 2 72 23 81 +46 1 26 85 25 +31 65 52 16 14 +15 4 91 59 19 +83 60 10 89 90 + +62 63 13 96 6 +24 91 27 29 81 +38 47 50 26 36 +79 73 22 45 58 +15 54 76 46 70 + +42 69 91 34 9 +96 28 61 41 56 +15 5 59 47 50 +79 27 4 0 21 +51 44 26 95 32 + + 9 38 6 58 99 +89 69 96 33 73 +26 20 32 12 27 +67 29 79 81 59 +66 45 24 36 68 + +99 52 1 66 64 +15 76 36 75 83 +48 7 95 71 6 +31 28 65 14 69 +10 38 46 74 96 + +15 12 59 98 54 +18 75 48 65 96 +57 38 2 86 5 + 0 87 93 23 94 +50 29 13 91 14 + +55 83 80 45 52 +44 31 64 25 71 +15 85 50 91 54 + 9 29 78 74 23 +73 82 75 58 98 + +63 56 29 80 25 +53 52 91 18 24 +73 83 7 11 87 +79 47 41 59 78 +13 51 9 21 20 + +28 35 98 80 63 +30 60 34 99 32 +11 61 15 73 24 +55 74 42 38 26 +22 17 43 75 71 + +97 53 65 75 51 +96 74 81 69 71 +76 5 49 60 41 +86 64 90 92 30 + 6 95 85 93 40 + +65 90 20 4 82 +41 17 48 27 77 +84 60 94 15 10 +55 64 49 35 16 +36 8 23 58 59 + +74 19 70 35 82 +77 21 84 50 25 +18 61 12 28 54 + 0 3 72 85 87 +78 4 57 38 16 + + 1 63 0 38 23 +31 76 73 22 35 + 8 72 44 25 45 +70 33 29 37 21 +49 50 85 57 61 + +37 50 51 12 93 +83 80 87 6 88 + 4 95 62 20 41 +78 56 76 49 11 +72 7 52 14 28 + +72 34 61 19 68 + 2 67 88 7 55 + 8 11 20 85 47 +42 54 46 48 64 +38 84 3 76 13 + +32 34 55 90 64 +16 1 94 48 91 +96 45 27 58 63 +98 20 43 73 10 +87 52 49 8 24 + + 6 9 31 37 29 +45 55 12 23 67 +86 0 81 49 1 +18 25 7 15 50 +32 34 90 99 69 + +38 73 44 17 52 + 7 81 85 62 98 +68 66 86 21 76 +24 94 50 46 67 +36 54 55 96 8 + +90 39 51 5 99 +33 20 14 1 81 +94 74 38 95 35 +37 96 62 57 84 +65 11 55 46 69 + +26 29 75 3 55 +33 83 68 94 47 +37 41 85 50 57 +76 39 5 81 20 +18 24 92 71 87 + +89 92 39 70 59 +40 35 23 62 47 + 7 16 22 34 71 +15 97 86 91 3 +54 26 56 44 29 + +93 91 66 8 78 +60 48 51 6 57 +69 35 87 65 73 +53 32 94 49 89 +88 34 23 84 59 + +41 57 7 37 0 +79 2 86 82 9 +25 69 14 78 33 + 4 28 85 8 61 +97 72 88 1 54 + +24 84 65 28 60 +99 86 53 93 22 +17 67 10 29 54 +27 0 96 20 36 +25 3 62 89 33 + +10 28 78 82 96 +21 11 51 27 97 +41 63 72 58 89 + 7 0 76 67 19 +52 38 87 18 13 + +73 35 49 44 79 +76 47 94 53 82 +11 61 88 86 83 +81 60 33 99 72 +84 26 40 8 54 + +31 50 40 9 80 + 6 59 51 55 12 + 2 34 93 38 13 +11 82 21 20 72 +89 83 60 53 79 + +42 54 52 13 85 +99 76 87 44 26 +36 50 0 59 82 +10 73 29 72 27 +79 31 64 51 91 + +68 49 65 94 3 +46 2 6 78 93 +63 31 53 27 60 +21 67 99 22 95 +24 9 18 76 33 + +31 95 91 18 37 +83 2 78 75 8 +77 33 9 12 22 +24 50 80 93 39 +21 47 35 70 94 + + 2 44 55 60 89 +45 18 46 72 11 +47 83 56 52 65 + 4 19 21 14 34 +25 80 16 48 36 + +53 92 71 14 95 +98 51 54 15 82 +48 87 99 46 83 +42 86 11 43 18 +72 28 37 93 78 + +84 79 30 28 98 +33 80 65 82 25 +35 29 46 13 60 +90 69 52 78 64 +55 94 0 48 56 + +42 71 26 93 82 +47 36 31 89 69 +65 5 41 1 32 +74 17 64 11 68 +23 54 61 99 37 + +97 4 22 2 38 + 8 17 79 99 20 +44 80 28 57 32 +18 86 94 77 70 +11 93 75 49 3 + +80 48 85 89 23 +30 50 94 46 18 +59 9 81 42 8 +40 15 90 26 31 + 0 51 39 36 65 + +93 63 15 87 25 +90 44 65 23 66 +22 27 20 17 45 +42 62 14 0 57 +46 4 10 35 96 + +44 43 60 80 86 +48 45 78 40 19 +54 98 32 17 69 +25 11 14 34 63 +26 20 59 0 74 + + 0 59 87 45 30 +33 36 1 38 43 +67 37 74 2 70 +85 22 44 56 23 +68 24 75 92 10 + +90 83 87 85 67 +95 24 94 6 40 +77 15 52 68 66 +22 20 38 29 79 + 3 10 62 13 16 + + 9 49 87 13 18 +85 39 77 82 86 +96 44 12 72 78 +59 81 21 94 88 +17 93 23 56 45 + +57 53 80 98 22 +23 45 5 26 77 + 6 28 4 25 83 +59 55 58 75 92 +72 36 99 82 97 + +74 33 53 49 86 + 9 50 66 7 78 +29 36 71 26 87 +54 82 84 47 46 +39 30 56 22 27 + + 6 49 84 14 43 +41 44 29 18 79 +93 56 77 64 26 +15 13 96 9 80 +50 54 75 99 24 + +58 49 91 69 63 +16 55 19 18 84 +13 79 42 56 0 +36 27 60 74 53 +66 61 62 54 15 + +85 22 43 79 90 +77 21 75 66 15 +25 68 69 35 78 +88 3 18 50 7 + 8 27 52 76 72 + +12 56 0 45 33 +13 81 25 24 41 +80 65 9 32 95 +18 44 36 68 99 +78 29 17 38 43 + +57 41 77 5 10 +98 30 70 23 46 + 9 19 11 34 74 +43 33 32 95 14 +65 8 68 50 88 + +49 93 95 1 55 +57 92 58 0 90 +69 15 23 62 56 +54 37 6 96 11 +26 80 70 79 88 + +46 76 82 77 19 + 4 50 83 88 69 +67 44 59 25 21 +40 12 90 33 24 +63 78 9 71 86 + +74 82 88 25 15 +61 83 7 6 98 +41 9 84 13 72 +78 26 8 60 20 + 4 58 29 93 11 + +46 60 44 55 63 +91 19 58 56 85 + 2 32 67 26 41 +43 61 25 73 21 +86 14 71 9 6 + +38 72 58 17 77 +25 79 78 5 67 +81 70 50 85 73 + 7 69 14 80 6 +93 51 60 42 29 + +82 28 99 66 27 +35 97 91 90 80 +87 7 55 78 17 +83 36 98 37 72 +58 43 51 49 56 + +93 72 61 19 74 +81 44 27 25 12 +96 10 26 69 99 +94 23 63 52 8 +71 95 17 54 70 + +28 21 33 5 26 +45 86 63 92 69 +77 43 99 20 56 +89 40 36 30 53 +41 32 94 17 58 + +83 63 92 93 51 +11 86 67 3 61 +81 50 16 90 89 + 0 75 31 22 77 +82 74 37 57 39 + +49 87 33 0 13 +54 38 71 85 32 +79 84 89 4 61 +34 14 69 47 3 +35 12 59 1 55 + +95 37 72 73 85 + 0 69 50 75 55 +51 24 90 71 78 +66 86 23 40 6 +34 27 43 14 65 + +46 11 41 86 21 +31 82 38 23 53 +66 52 39 6 1 +16 95 36 0 69 +28 54 91 99 60 + +32 80 4 3 97 +26 63 89 52 22 +25 91 43 96 68 +71 42 78 34 56 + 0 82 5 69 19 + +69 60 58 19 1 +91 59 54 52 11 +43 46 27 2 7 +89 57 42 88 31 +93 94 37 96 29 + +72 8 29 64 75 +16 45 0 39 46 +77 6 88 40 27 +92 78 21 63 51 +24 12 90 94 47 + + 5 41 63 42 73 +37 80 91 18 50 + 3 24 53 17 49 + 6 86 30 46 69 +16 97 75 88 93 + +97 60 66 77 74 + 1 72 41 69 94 +30 8 98 33 43 +99 63 95 91 11 +56 65 70 12 0 + +47 39 37 79 48 +60 31 19 10 53 +14 36 25 38 2 +76 89 32 1 20 +65 72 91 71 66 + +87 72 13 30 75 +50 80 97 17 63 +99 9 53 69 86 +20 57 92 66 21 +31 42 4 98 0 + +38 89 15 91 95 +94 20 13 64 25 +37 9 98 10 44 +28 97 5 78 32 +99 41 82 22 87 + +97 16 42 87 15 +19 70 82 66 30 +79 5 67 75 91 +27 26 56 63 17 +51 99 13 59 35 + +85 33 3 34 5 +72 74 88 81 10 + 4 64 61 59 8 +78 42 90 27 80 +14 12 52 76 1 + +67 92 61 33 60 +82 91 85 76 56 +39 37 6 65 63 +32 51 45 14 98 +73 17 8 46 70 + +97 75 33 9 23 +85 27 15 3 26 + 4 34 36 10 77 +68 82 37 32 86 +58 88 95 87 99 + +70 19 67 42 31 +81 6 10 95 18 +85 50 90 25 56 +16 94 7 78 24 +59 88 93 77 4 + +92 25 16 75 67 +97 71 53 32 90 + 6 70 69 55 40 +77 20 72 84 73 +34 35 38 98 76 + +24 96 27 39 3 +54 26 12 65 60 +67 62 43 98 14 +15 95 2 82 33 +64 17 86 0 63 diff --git a/2021/src/test/kotlin/Day04Test.kt b/2021/src/test/kotlin/Day04Test.kt new file mode 100644 index 0000000..83468ea --- /dev/null +++ b/2021/src/test/kotlin/Day04Test.kt @@ -0,0 +1,31 @@ +package be.vandewalleh.aoc.days + +class Day04Test : BaseDayTest(4) { + override val example = """ + 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 + """.trimIndent() + + override val part1Example = 4512 + override val part2Example = 1924 + + override val part1Answer = 87456 + override val part2Answer = 15561 +}