diff --git a/README.md b/README.md index f5bc72a..0a2a538 100644 --- a/README.md +++ b/README.md @@ -24,5 +24,6 @@ https://adventofcode.com/2020/ |16 | | `**` | | |17 | | | | |18 | | `**` | | +|19 | | `**` | | `test.sh` can be used to run all solutions and automatically compares them to (my) puzzle inputs and the expected outputs. diff --git a/data/day19.expected b/data/day19.expected new file mode 100644 index 0000000..96bf241 --- /dev/null +++ b/data/day19.expected @@ -0,0 +1,2 @@ +147 +263 diff --git a/data/day19.input b/data/day19.input new file mode 100644 index 0000000..c41dfe2 --- /dev/null +++ b/data/day19.input @@ -0,0 +1,465 @@ +90: 86 86 +122: 86 1 | 99 20 +116: 86 58 | 99 75 +20: 86 123 +62: 99 95 | 86 113 +81: 76 99 | 90 86 +106: 120 86 | 93 99 +73: 99 72 | 86 45 +117: 131 99 | 72 86 +92: 86 96 | 99 98 +13: 3 99 | 118 86 +56: 90 86 | 58 99 +85: 72 99 | 51 86 +51: 99 99 | 86 86 +59: 99 25 | 86 62 +65: 99 15 | 86 97 +112: 86 13 | 99 38 +46: 33 86 | 2 99 +10: 67 86 | 68 99 +33: 120 99 | 76 86 +38: 35 86 | 125 99 +26: 86 10 | 99 55 +1: 33 99 | 60 86 +8: 42 +16: 51 86 | 93 99 +107: 40 99 | 2 86 +40: 17 120 +34: 86 82 | 99 127 +88: 93 17 +2: 99 51 | 86 120 +32: 100 99 | 7 86 +113: 86 127 | 99 82 +14: 73 86 | 44 99 +25: 86 101 | 99 56 +130: 110 86 | 109 99 +19: 86 4 | 99 49 +30: 86 92 | 99 70 +27: 17 86 | 86 99 +94: 47 86 | 53 99 +115: 86 107 | 99 84 +15: 76 99 | 58 86 +58: 86 99 +105: 130 86 | 32 99 +71: 120 99 | 131 86 +12: 99 131 | 86 82 +60: 72 86 | 93 99 +84: 86 102 | 99 80 +44: 99 76 | 86 72 +125: 76 99 | 131 86 +18: 99 71 | 86 52 +129: 37 86 | 111 99 +102: 99 131 | 86 76 +66: 86 105 | 99 41 +99: "a" +9: 99 18 | 86 65 +131: 17 99 | 99 86 +39: 76 99 | 93 86 +64: 115 99 | 114 86 +57: 86 48 | 99 94 +35: 72 86 | 51 99 +0: 8 11 +77: 86 83 | 99 106 +118: 72 86 | 75 99 +47: 99 103 | 86 85 +23: 99 27 | 86 76 +48: 119 99 | 78 86 +49: 86 51 | 99 45 +67: 86 120 +61: 86 72 | 99 127 +108: 72 99 | 72 86 +95: 86 58 | 99 90 +83: 86 27 | 99 131 +75: 86 99 | 99 99 +101: 51 99 | 27 86 +103: 90 99 | 90 86 +128: 86 69 | 99 33 +70: 99 14 | 86 19 +52: 127 86 | 90 99 +21: 86 24 | 99 59 +22: 86 63 | 99 12 +42: 79 86 | 66 99 +97: 51 17 +104: 86 33 | 99 28 +100: 99 16 | 86 39 +72: 99 86 +78: 86 43 | 99 50 +55: 86 6 | 99 34 +45: 99 99 +5: 86 46 | 99 77 +93: 99 99 | 99 86 +6: 131 99 | 51 86 +110: 71 86 | 28 99 +68: 90 86 | 27 99 +29: 87 86 | 122 99 +80: 86 93 | 99 131 +54: 120 86 | 75 99 +43: 93 86 +98: 99 103 | 86 117 +7: 101 86 | 88 99 +127: 17 86 | 99 99 +96: 86 12 | 99 61 +41: 99 5 | 86 112 +79: 86 57 | 99 21 +11: 42 31 +86: "b" +111: 45 99 | 72 86 +63: 76 99 | 127 86 +124: 86 81 | 99 116 +28: 86 75 | 99 58 +82: 99 86 | 86 99 +121: 64 86 | 74 99 +87: 86 124 | 99 104 +74: 99 26 | 86 9 +31: 126 99 | 121 86 +50: 99 72 +119: 34 86 | 36 99 +36: 86 82 | 99 75 +91: 86 131 +3: 58 99 | 27 86 +114: 99 129 | 86 22 +24: 86 89 | 99 128 +53: 91 99 | 95 86 +126: 29 86 | 30 99 +109: 99 108 | 86 23 +17: 86 | 99 +76: 86 86 | 99 86 +120: 17 17 +89: 54 86 | 37 99 +4: 99 131 | 86 58 +69: 27 17 +37: 99 58 +123: 86 76 | 99 82 + +bbababbaabbaaabaaaabbabbbbbababbbababaaaabbaabaaaaaabaaaabbaabba +aaabbbabbabbbbbbaabbabababaaaaabaaabaaaaabaaaabbbbabbabb +babaabaabbabaaaaabbababb +babbabbaababbaaaababbaabbbbbaabaabbbababaabbbabbbabababaabbabbabaabbbaababbbbbbb +bababbbabaaabbaabbababab +aaaaabaaaabbaabaaaaabbaa +aabbbaaaaababbaaabaabbbbabbbaaaaabbaaaab +baaaabaaaabbababbaaabbab +ababababaaaaabaaaaabbaaa +baabaababaaabbaabbbababb +abbbabbbbbabaaabaabbabbb +aaababbbabababbbaabbaaaabababbaa +babbaaabbaaaabaababbbabb +bbbabbbabbabaaaabaabaaab +bbbbaaabaaaabbbaabbbbabb +aaaaaaaaaaaaabaabaaaabbb +babaabbababbabaababbaaba +bbabaaaabaaabbaaaabbbbbbbabbabbbbaaaabab +babaabbbbbbbbbaabbaaabaa +baabbbabababbababaabbbaa +baaaabaaaabaaaaaaaaaaaab +aaabbbbbbbabbbabbbbbabbb +bbabaaabaaababaabbbbbbba +baaabaaabbabbaaaaaaababb +abbabaabbaaaaaaaaabaabba +aaaabababbbbbbaabababbab +bbbbbbabababbaabaabbbabaaaabbabbaabbabbbbaababbbabaabbbbabbabaabababaabaaaaaabab +bbbabbaaaababbabaabaabbbabbbabab +bbbabbbababbbbaabbbbbbab +baabaaaaabaabbbbaaabaaaabbbbbbab +bbbbaaaaaabaaaaaabbbabaababbaabb +bbbbbabaabaaaaababbaaabbbaababbbbbaaabaa +aaabaabaaaabaaaaababbaaaaaababbbaaababab +bbaaaababbbaaabbabbabbabbabbbbabbababaabbbabbabbabaaabbabaaaabba +aababbbaaaabbbaabbbbababbabbaaaa +abbbaabbabaaaaababaaaaaa +babbabbabbaabababbabaaaaaabbbabbbabaabbbbabbbaabbaaaaaba +aabbbaabaaabbabbbbaabaaabbbabbababbaababababbbba +baabbabbbaabbbbbbbaaaaaababababaaabbbbabaabaabbaaaaabbab +bbabaaabbbbbaaaababbabbb +baabaabaaababbbabaaababa +aaaabbbbabbbaabbababaaaa +babbababaaaababababaabab +bbbaabbbabbbabaabbbabbbaaabbaabbabbbbbbbaaaabaaabaaabbaabbbbabbb +aabbaabbabbabbbabaaaabba +abaabbaaaaabbabbaaabbbabbabbaaaa +bababaabbaaabaaababbababbbbbbabbbaaabaab +aaababbbaabbaabbbbaaabbaaababaaabaabbbaa +abbaaababbaaababbaaaabba +bbaababaaabbabaaababbaabbaabbbbaaabbaabbabaaabbabbabbbbbabbbaaabbbababbb +bbaaabbbbbaaabbabaaaabba +abbbabaabbaabaaaaaabbaaa +bbbabaabbbbbbbaababbbbaaabbbabba +abbabbaaaaaabbbbbbabaaabbaaaaaab +bbaababaaaababaabaabbababbbbbaab +aabbababaaabbbaaaaabbabbaabbbbbbbabbbabb +aaabbbaaaababbabbababbbb +aababbababaaabaabababbbb +bbabbbabbbabbbabababbbba +aaabaaaaabbbbbbbbaaaaaab +babaabbbaaabbbabbaaaaaab +bbaabbbaaabbababbbaaabaa +aabbbaaaaaaaaaaaaaaaabaaaabbbbbabbabaaaaabbbbbab +abaaaaabaabbbaaaabbbaaab +abaabbabbabbbbbabbababaa +baaabbaaaabbbabbaaaabaaa +abbbbbaabbaaababbbbabaab +aababbaaaabbbbbabaababaabababaabbabbbaba +abaabaaabbabababababababbaabaaabbbaabaabaabbbababbbabbbabbabbbbbabababaabbabbaba +aaaaaabaaaaabababbbabbabbbaabbabaababbbb +babaaaababaaababaabbabba +ababbaaaabaaabbbbababaaa +baababbbabbbbaaabaababbbabbbbaababaaabaaaabbaabababababaaaaababa +bbaabbababbabaabbbabbabb +bbabbbbaababbaabbbbabbbbbabbabaaaaabbbababbbbaabaaaaaabbbababbbbbabbbabb +baaaaaaababaaaabbbbbaaaaabaabbbbbaababbb +aabbabaaabbbbbaabbbaabab +ababbabbbbaabaaabababaabaaaabbab +aaabbabaaaaabbbbabbbbaaa +bbaaaaabbaaaabaaabbbaaaa +abbbaaaaabbbabbbabbabaaa +bbaaaabbaaaababababaababaaaabbbaaabaabaaaababbabbbaaaabaabaaabbaababbbaaabaabbaababbbaabaabaabbb +bbaabbaaaababbababbaaabbbabbbababbbbbbaabbaabababbababaababbaababbbaaabbaabbbbab +aababbabaaabaaaabbaabbaa +babaaabbaaabaababbabbbbabbbaabaabbaabbbababbabaabababaabbbababbabbbbaababbaabaaa +baabbabbbbaabbbaaabbaaab +abaaaaabbbaababaabbaabab +aaabbbbbaaababaaabababaabbaababb +bbaaababbaabbbbababbbbbabbaabbabbbbbaaabbbabbabb +bbabbbbaabbbbbbbbaaaabba +aababbabaaabaababaabbabbabaaaabaaabbbabaaabbbabbbabaaaaa +babbbbbbaabbbaabbabbbabb +baabbbbaababbaabaaabbabb +aaabaabaabbbaabababbbbaaaaaabaabbabaabbbabaaabbbaaaabababaababbbababbabaaaaaabab +aabbabaabaaaaaaababbababaabaabba +ababbababbaabbbaabaabaababbaabbbaaaabbaa +aabbababaabbbbbbbaababaababbabba +baabbabbbaaaaaaaaaaabaaa +baabbbabaaabbabbbbbbbabb +babaabaaaabaaaaabbbaaaab +baaaaaaababbbbbaabbbbbab +bbabbbabababbaabbaaababa +bbbbabababaaaaababbabbbababbabaaabbaabababbababaaaaabbab +aabbbbbababbabaaabababaaaaabaababbbabbab +babbbbaabaabbbbabbbbbabb +aaabbbabbabaabbbabaaababbaaabaab +abbaaabbbbaaabbbbabbbbbbbbbbabaa +bbabbabaaaabbabbbbbababababbaaabbabaaaaababaaaba +bbaabaaaaabaaababaababbb +baabbaaaaaababbababbaabaabababbbabaaabbbbbbaaabbbbababaababaabbbbbabaaababbaaaabbbaaaaaa +aaabaaabbbbbaaaabbbbabba +abbbaabbbabbbaaaaabaabab +aaabbbaabbaabbabbaabbbbbbbabbaaaaaaabbbaaaaaabab +aaaaaaaaaabbaabaaabbbbaabbaaaaabaaabbaababbbbbab +bbbbababbabababbbbababba +abaaaabaabbbbaaaabbbbbbbbaababbabbbbaabbaabbbbbabaaabbbaaaaaabab +bbbbbbaabaabaaaaaaaaabbaaaaaaababbabbabaabbabbab +abbbbbbbbaaaabaaaababbabbbbbaabb +bababaabaababbbaabbaabab +abaaaabaabaabbabaaabbbbbbbaaaaaa +aaaaaabaababababbbaabbbabbaaaaba +abaabaabbbababbababbaabb +baaabbaabbbaabbbbabbabbb +baababaabaaabaaaabbabbbabababbaabbbbbbba +bbbaabbabbbabaabbaaabbaaaabababaaabbbbaaababbaab +abaabbbbabbabbbbaaaaabab +bbbabaababaabbbbbbbaaaab +abbaaabaaaaaaabaabaaaabaabbaaabbabbabbbbaabaabab +aabaaaaababbbaaaaaaababb +aaabbbaaabaabbbabbbbabaa +aaaaabaababaabbabaaaabaaabbaaaaa +aaaabaabababbbbbaaaaaaaaaabbbbbbbbbbbbababbbbabbbaaabaab +bbabbbabbaabbbbaaaabaabaabaaabbbaaaaaaababbbaaab +aabaaabaaabbababbabababa +babbbaaaaabbbaabbbabbababbbbbbbaabbababa +abbaabaabaabbaaaabaaaaaaababbaab +abaaaababbaabababaabbbababbabaabaaababbbbbbbabba +bbaaaabababbabababbabaabbbaaabbbbbbabbaa +aabbaabbaaabbbaabaaaaaab +bbaabbabaaaabbbabbabbabb +abbaaabbabbbaaaabbbbbaaabbabbabababbbbbbabaabbbbbabbaaaaabaababb +ababbaabbabbbbbbbbabaaaabbbbababbaaabbbabaabaabb +aaabbabaaabbbabaaaaabaabaaababbaabbbabbababbbbabaabbabbb +abbabbaaabababababbbabaaaaaabaabbabaabab +babaabaaababbaaaaabbaaab +aaaaaababababaababbaaaab +ababbabaaababbaaabbbaababaaaaabb +bbaaabbabaaaabaabbabaaaaaaaababbbbbabaaa +bababbbabbaabbabbbbbabba +bbaaabbaaabbbbaabababaabbabbaaaa +aaaabaabaaaaabbaababbaabababbaaa +ababbabaabbabbbbbbaababb +aabbbbbbbaaabbbababababa +bababbbaabbabbaabaaaabab +bbaaabbbaabbbbbaaabaabba +aabbbbaaababbbabbbaabbbb +baaaabaaabaaabbbababbbabaabbbabbaabbbaabbbbbbbabaaaabbaababbaabaaababbbb +babbbbabbbbababbabaaabba +babbbbaaababbbbbbabbbaaabaabbaab +bbbbbbaaaabbbabbaaabaaaabbbabaaaaabaabab +babbbbbabbabaaaaaaaaabbb +ababbbabbabaabbaaaabbabbaaaabbaa +bbbabbbabababbbabbaaabbbbbbbaaba +abbabbaaabaaababbaaaaabb +bbababbabababaaaaababbbbbabbbaabababbaabaabbbaababbaaaba +babbababaabbbaaaabbaaaab +abbaaabbbaaaaaaabbababab +bbbabbbabbabbabababbbbab +babbbaaabababaabaababbbababbbbbaabbbbaba +bbbababaabaabaabababbbbbabaaaababbabbbabbbaaabaababbaaaaabaaaabbaaaabbab +babababbabbabbbaaaaabbab +baabbabbabaabbaaababbbbb +aabbabaaaaaaabbaabbabbbaababbaabababbbbbbabbbababbbaaaba +aababababbbabbbaabbaaaaa +aabababaaabaaabaaabbaababbbabbaabbaaababbbbbbbababababbaabbbbbab +abbbaabbbbabbbbaabbabbab +aaaabbbbaabbaabbbabaaaaa +aababbababaabbbaaabaabba +baaaaabaaaaaabbababaabbbabaaaabbabaabbbaabaaabbaabaababaaaabbaaa +ababbaaabaababaabbbbbababaaabbbb +babbabababbbaaaabbbaabaa +baabbabbbaabbabaaabbbbaabbbaabbaabbabaababaaabaabbaababbbaaaabbb +abaabbbbaaaabaabbbbbbbba +baabbabaaaababaaabbaabbbbbbbbbbb +abbaaaabababbbbabababaabbbaaabbaababaabbbaaaaaaaaabaaaab +bbbabbabaaaabbababbaabababaaaabaaabbaaaabbbababa +bbbababababbbbbbababbbba +bbbbbbaaaaabbbaabaababab +aaaabbbaabbaaababaaababa +bbaaabbabbabaabaaaabaaaaabaaabbabaaababb +ababbabaabaabbaababaaaaa +bbbaabbaaaababbaabbbbabaaabaaaab +abbbabbbbbbabbaaabbaabbbababbbbaaabababb +bbbbbaaabaaabaabaabbaaab +bbaabbababaaababaaabbbabaaaababaabbaaababaabaaab +abbbabbbaabbbbbabbababbb +bbbaabbabbabbbabbaaaabba +bbabaabaababbbaababababaaabaabababaaaaaabaaababb +babaabaaaaaaabaaaabaabba +babbbbbaaabbbaaaaabbababbaababba +aababbaaababbbbbbabbabba +bbabbbabaabbaabbbbbbabaa +ababbababbbababaababbbaa +aaabbbaabbabaabaababbbba +bbaabbabbbabbaaabaabbbababaaabaabbbbbabbbbaaabaaababaaba +baababaabbaaabbabaaababb +abbaabbbababababaaababbbbaabaabb +baabbbbbaaabaababaababba +babaabaababaabbbbaabaabaaaababaababbabba +bbaaaaabaababbaaaabbaabaaabbabbbbababbaa +abbaaabbaaabbbbaaabbbbaaabbaaaabaabbaaabbaababbbabbabbabaaaababb +aaabbaabababaaaabaabaaab +bbaabbaabbbabaaabbabbbbbbbbabaabbabaaabababbbbabbaabbabbbbbabbaa +bbbabbbbbbabbbaabaababab +bbabbbbabbaabbbababbabba +aaabbbaabaabaababaabbabababbaaaabbbbbbba +babbaabababbabababbbbbbaababaabbbaabbbbababaaaabbbaaaaababbabaaabbbbaaaaabaaababbbbaabba +babbbabbbaaaaaaabbaabbbbabbbbabbaaabababaabbbbab +bbaaaaababaaabbaabbbaaaaaababbabbbaabaabaaabaaabbabaabab +baabbbbbabbaaababbbbaaabbbbbbaabbbbbbaabbaaaaababbaaaaaaaabbabba +bbabbbaaabaaabbbabbbabaaaababbaaaabbbaabababbbbabbababaaaaaababb +baaabaaaaabbababbbabbbbaabaabbbaaabbbaabbaaabbabbaaabaab +aaaaaabaaaaabbbabbbaabaa +bbaaabbbbabaaaabbabaaaabaabaaaaababaababaaaabaaaaababbbb +babbaaababbbaabaabbbbaab +aaabbaababbbbbabaaabbaaaaabbbbbaabaabaababababababbabbbb +babababbbaabaaaabaaabbbb +babbabaaaaabbbabbbbbbbaabbbaaaaa +aabbabaabaaabbbaaaaaabab +bbbabbaaabbbbabbbababbabaaabababaababaab +bbabaaaabaabbabbbbbabaabaaababbb +baababbbbaaaabbabbaabbbbbbbbbaaabbbbaaba +aabbaababaaaabaabaabbaba +bbbabbaababaabaaabbbaaaaabaaaabaaabaaababababaaabbababbbbbbbabba +bbabaabaabaaabaabbabbaab +aabaaaaaaaababbbaaababbbbbbaabab +baaaabaaabbbabbbabaaababbaabbaaa +baabbbbabababbbaaababbbabbabbbbabbaabbbaabbabababaaabababaabaabbbabbabba +baabaabaabababaabaaaabbb +abbaabbbbabaabaaababbababaabbabbbabbbbabbbbbaabababbaabb +abbbabbbbbbababaabbbabbabbbbbaab +abaaabbbbbbaabbbaabbaaab +ababbbabbbabbbaaabaaabaababababa +bbbbbbaaabbbaaaaaaabbabaabbbbaabbbbaaaab +bababbbbbabbbbbbbaabbbbbbbababbbbabbabbbabbbbaabbaaaabba +baaabbaaaaaaaababaaabbbaabaabaaabaabababaaabbaaaabbaabaa +aabbaabbbbbabaababaabaaaababbaaabbabbababbbbaabb +abbbbbaabbbabbbbbbbbaaba +aaabbabbbbbabbbababaaabb +abaabaaaaabbaaaababbbaab +aaaabaabbbbbaabababaaaaaaaaaaabb +bbbababaabbbabaabaababba +abbbaabbabaaababbbbbbabb +babbabbbaaaaabbbaababbabbaabbbbbbaaabbaaaabbbbbaabaababbbbaaaaba +aaaaaababbbababababaabab +bbaabaabbbaaaabbabbababaaaaaababaabaaabb +aabbabaababaaaababbbabab +ababbbababaabbbbbaaaabbbbbbbbaababbbbaaabbabbbaaabbbabbbbaaaabbbaaaaaaaaababaaab +bbbabaabaaaaabbaaaabaabb +babbaaabbaabaababbbbaaba +bbabaabababbbbbaabaabaaabbaaabbabbbabaaa +abbabaabbaaaabaabbbaaaba +aabbabaabaaabbbaaaabbbabbabababbbbbaabbb +aabbbbbbabababababbbbbab +abbabbbabbabaababaaabbbb +baaabbaaababbaaabaabaabb +bbbabbbaaaabaaaaabaaababaaaabbbbaabbaaaaabbbabab +aabbbabaaaababaabaaaaaba +abbbabbbababbabbbbaabbaa +abbbbbabaabababbbabababa +bbaabaabaababbaabababaaa +bbabaaabaababbbaaababbbaaaababba +abbaabaababbababaaaabbbaabbabaababbbaabaaaabaaabaabbbbab +babbbaaabbabbbaababbbbaaaabaababaaaabaaa +babababbabaaaabaaabbbabaaabbbabababaaaabbbabbaab +aabbbaababbaaabaababbaababaaabbbaaaaaabaababbaaaaabaaabbbbababaa +abbbabbbaaabbbbaaabaabab +abaabbaaaabbaabbbbbaaaaa +bbabaaabaaaabbbbaabbbaaaaabbbbbbabbbbbbabbbabaaa +bbbabbaababbbbbabbaaaaabbabaabaaababaababaaaaabb +abbbabbbababbaaabbabaaaaabbabbbabbabaabbbaaaaabbabbabaaabbbbbbbb +bababbbaaaabaabaabbababb +abbbbbbbabababaaabbaababbabaaababbaaaaaa +abbaabbbabaaaaabaaaaabbaabaaaaabababbbababbbabab +abbabbbbbbabaaaabbbabbbabbbbaaba +abbaabbbbaabaababaababba +bbabaaababaabbbaaaaaabbb +baabbabaaaaabbabaabbbbabbabbabbabbaaaaaa +babbbbbbababbababbabbbabaabbaaab +aaabaaabbbbabbbbaabbabbbbaaaaaabaabbbaabbaababaa +baabbbbbaaabaababababbab +babbaaabaaaabaababbabbaaaabaabaa +abaabbbbbbabaaaaaabaabab +aaaaabbaabababaabbbbbababbbababbbbaababb +abababababaabaaabbaaababbabbabbb +abaaaaabbbbbbabaaaaabbaa +aaaabbbbbbbbababbbabaabb +bbabbabaabaaabaaaaababab +aaabbbbbabbabbbbbabaababbbaabaababbababb +bbabaabaabbabbaaaabaabba +abbabaaababbaabaaaaabbbabbaaaaabbbaabbabbababaaabaabbaabbbbaaabaaaabbbaabbbbabba +ababbbabaaabbabbaaabbabaaabaabba +bbbabbbbbabbbbbbabaaabaaaaababbbbababaaa +babbabaaabbaaabbabbabaaa +babbbbaaabbbbbaaabaaabaabbbbababbaaababb +abbabbbbabababbbbbabbaaabaaababb +babbababbbaababaabbabbab +bbaaababbbbbaaababbbbabb +baaaabaababaabbbabaabbbaaabbbaabaaaabbab +abbaabbbbbaaaaabbbaabbabbaabbaab +aaaaaababbaababaaabaaabababbbabb +baaabbaabbbababaaababbbaaaaaabba +bbbbabaaaaabaaaaaaababbaaaababbbbbaabaaaaabaaaabaaaabbaabbbbbbbb +abaaabbbbaaabaaababbabba +aaaaabaaaaabbbaabbabaaaaabababaaabbbbbaabbaaaaba +ababbabababbbaaaaaaaabbb +aaababaaabaabbaababbabbb +ababababaabbbabbbaaabaab +baabbbabbaaabaaabaaabbbabbabbabb +bbbabbaabbabbababaabbbbaabaabbabaabaaabbbaaabbbb +aaabbbabaaabbbbbabbabbbbbbbaaaaa +aaabbababbaaababaaaabbaa +bbbabbaaababbbabaaabaabb +baababbabbbabaaababaaababababbaaaababaabbbbaaaabbabaaababbbabaababbabbbbbaaabbab +bbbabbaababaabbabbbbbaaa +abababaabaaaabaaabababbbbaababbbbbabbaaaaaabbaabbbbabababbabaabb +babbbababaaabbbabaababbbaaabababaaaababbbabbaabbabaabbba +bbbabbaabaabbbbaaaaaabaabaaabbab +bbbabbbbaabbaabaaaaabbbbbaabbabbabbaabaababbaabbaaabbaaa +aaababbbbaaaabaaabbabbbbabbbbaba +aaaaabbababaabbabaaaaaaaaaaaaababbbbbbaaababbaaaaabaabab +babbababbaaabbabbabbaaaabbaabaabbaaabbab diff --git a/day19/day19.hs b/day19/day19.hs new file mode 100644 index 0000000..0413122 --- /dev/null +++ b/day19/day19.hs @@ -0,0 +1,45 @@ +module Day19 where + +import AoC + +import Control.Applicative +import Data.Char +import Data.Foldable +import Data.Map (Map, (!)) +import qualified Data.Map as M +import Data.Maybe +import Data.Tuple +import Text.ParserCombinators.ReadP +import Text.Read.Lex + +data RuleElement = Literal String | Reference Int + +parseElement :: ReadP RuleElement +parseElement = parseRef <|> parseLit + where parseRef = Reference <$> readDecP + parseLit = Literal <$> between (char '"') (char '"') (many1 $ satisfy isAlphaNum) + +parseRule :: ReadP (Int, [[RuleElement]]) +parseRule = do ruleNum <- readDecP + string ": " + alternatives <- parseAlternatives + return (ruleNum, alternatives) + where parseAlternatives = parseSequence `sepBy` string " | " + parseSequence = parseElement `sepBy` char ' ' + +buildParser :: Map Int [[RuleElement]] -> Int -> ReadP String +buildParser m i = buildAlternatives $ m ! i + where buildAlternatives = asum . map buildSequence + buildSequence = foldl1 (liftA2 (++)) . map buildElement + buildElement (Literal s) = string s + buildElement (Reference j) = buildParser m j + +countRootMatches :: [String] -> Map Int [[RuleElement]] -> Int +countRootMatches input rules = length . filter (isJust . oneCompleteResult rootParser) $ input + where rootParser = buildParser rules 0 + +main = runAoC splitInput run (run . withExtraRules) + where splitInput = swap . fmap tail . break (=="") . lines + withExtraRules = fmap (++ ["8: 42 | 42 8", "11: 42 31 | 42 11 31"]) + run = uncurry countRootMatches . fmap parseRules + parseRules = M.fromList . map (fromJust . oneCompleteResult parseRule)