From 209cceef1e1c4d98f4e3ac88b73348c3d48be0a3 Mon Sep 17 00:00:00 2001 From: Patrick Michl Date: Sat, 19 Dec 2020 20:18:23 +0100 Subject: [PATCH] Solution for Day 19 --- day_19/first.rb | 38 ++++ day_19/input | 530 +++++++++++++++++++++++++++++++++++++++++++++++ day_19/second.rb | 46 ++++ 3 files changed, 614 insertions(+) create mode 100644 day_19/first.rb create mode 100644 day_19/input create mode 100644 day_19/second.rb diff --git a/day_19/first.rb b/day_19/first.rb new file mode 100644 index 0000000..206c0fd --- /dev/null +++ b/day_19/first.rb @@ -0,0 +1,38 @@ +# frozen_string_literal: true + +input = File.read('./input').split("\n\n").map { |r| r.split("\n") } + +$mem = {} +$lines = input[1] + +$rules = input.first.map do |i| + k, v = i.match(/(\d+): (.*)/).captures + [k, v.split('|').map do |x| + x.split(' ').reject(&:empty?).compact.map do |y| + y.gsub('"', '') + end + end] +end.sort_by(&:first).to_h + +def rules(key) + $mem[key] ||= begin + either_or = $rules[key] + + return key unless either_or + + pair = either_or.map do |group| + group.map do |sub_rule| + rules(sub_rule) + end.join('') + end.join('|') + if pair.include?('|') + '(' + pair + ')' + else + pair + end + end +end + +re = Regexp.new('^' + rules('0') + '$') + +puts $lines.select { |line| re.match(line) }.size diff --git a/day_19/input b/day_19/input new file mode 100644 index 0000000..f206eb8 --- /dev/null +++ b/day_19/input @@ -0,0 +1,530 @@ +70: 90 92 | 53 50 +99: 90 102 | 53 22 +24: 130 90 +125: 85 53 | 100 90 +61: 53 58 | 90 26 +88: 33 53 | 46 90 +32: 65 90 | 90 53 +48: 46 53 +116: 53 50 | 90 18 +40: 53 83 | 90 81 +54: 46 53 | 5 90 +36: 50 90 | 130 53 +58: 92 90 | 130 53 +2: 19 53 | 75 90 +95: 53 46 | 90 19 +124: 46 53 | 33 90 +79: 91 53 | 7 90 +46: 90 90 | 53 90 +87: 9 90 | 84 53 +122: 90 46 | 53 33 +15: 89 90 | 79 53 +41: 90 4 | 53 119 +7: 53 128 | 90 128 +93: 53 120 | 90 37 +121: 15 53 | 103 90 +91: 90 33 | 53 110 +5: 53 90 | 65 53 +26: 53 19 | 90 107 +44: 53 75 | 90 32 +23: 107 53 | 50 90 +33: 90 53 | 90 90 +75: 53 53 | 90 90 +18: 65 65 +59: 53 107 | 90 32 +104: 90 33 | 53 46 +20: 121 90 | 123 53 +100: 90 75 | 53 46 +131: 18 90 | 46 53 +9: 90 67 | 53 105 +37: 53 75 | 90 128 +3: 53 29 | 90 22 +120: 53 92 | 90 33 +35: 55 53 | 30 90 +115: 65 107 +106: 90 46 | 53 19 +89: 90 59 | 53 68 +83: 90 46 | 53 130 +25: 90 87 | 53 41 +11: 42 31 +84: 53 117 | 90 34 +8: 42 +53: "a" +86: 53 6 | 90 12 +76: 53 78 | 90 97 +52: 126 90 | 115 53 +31: 53 35 | 90 20 +112: 110 90 | 32 53 +82: 101 90 | 127 53 +119: 53 27 | 90 93 +117: 90 81 | 53 23 +57: 82 53 | 43 90 +105: 90 126 | 53 21 +111: 53 32 | 90 110 +68: 53 18 | 90 46 +73: 71 90 | 24 53 +49: 77 90 | 48 53 +81: 90 50 | 53 75 +102: 32 53 | 128 90 +12: 92 53 | 19 90 +60: 62 90 | 108 53 +101: 53 104 | 90 62 +65: 53 | 90 +50: 53 90 +97: 53 56 | 90 64 +63: 99 90 | 39 53 +43: 90 125 | 53 60 +66: 130 90 | 33 53 +27: 53 2 | 90 14 +4: 3 90 | 74 53 +118: 53 76 | 90 57 +113: 86 53 | 13 90 +56: 90 28 | 53 54 +38: 36 90 | 69 53 +39: 10 53 | 23 90 +14: 90 50 | 53 18 +45: 53 72 | 90 40 +21: 130 90 | 107 53 +30: 90 113 | 53 1 +19: 53 53 | 90 53 +130: 53 53 +110: 53 65 | 90 90 +0: 8 11 +77: 53 110 | 90 92 +62: 53 33 | 90 19 +126: 50 90 +29: 75 53 | 5 90 +129: 98 53 | 47 90 +47: 53 94 | 90 95 +71: 107 53 +92: 53 53 | 90 65 +127: 22 53 | 109 90 +6: 92 53 | 32 90 +51: 26 90 | 66 53 +107: 90 53 | 53 90 +72: 90 124 | 53 104 +1: 53 96 | 90 52 +103: 53 73 | 90 61 +74: 2 90 | 131 53 +64: 90 7 | 53 122 +67: 53 70 | 90 104 +42: 53 25 | 90 118 +123: 63 90 | 80 53 +17: 46 53 | 130 90 +10: 19 90 | 33 53 +13: 53 112 | 90 17 +28: 90 128 | 53 110 +114: 53 5 | 90 50 +78: 49 90 | 51 53 +16: 111 53 | 14 90 +90: "b" +85: 130 90 | 50 53 +80: 38 53 | 16 90 +69: 110 53 | 107 90 +98: 53 44 | 90 88 +94: 5 53 | 46 90 +108: 18 53 | 75 90 +55: 90 129 | 53 45 +128: 90 90 +34: 106 90 | 114 53 +109: 90 110 | 53 50 +96: 36 90 | 116 53 +22: 75 53 | 18 90 + +aaaaaaaabbbbaabaabbbaaba +aaaaaaaaabbaaabbbaabaaaaabbaaabaaabbbbbb +babaabaaabaaabbbaaaabbba +baaaabbbabbabbbbabaababa +aaaaabaabbbabbbabaaabababaabaabbbaaaabba +babababbbaababbabaaaaaab +bbabbbabbabaaabaaaaaaaba +bbaabbaaaababbabbbabbbbb +babbbbbbbbbababaaaabbbab +abbbbbbaaaabbaaaaabbaaababbbbbababbaaaab +aabbaabaaabaabaababbbaaa +baaabaabaaabaabbbbaaaaba +aabababbaabaaaabbaaaabaaabbbbbaa +bbbbbababbaabaaabaababbababbaabababbababbaabbabaaaabbbba +bbbaabbbaababbaaaaaaaabb +aaababbbbbaaababababaabb +bbabaabbababbbaabbababaa +baaabababbbbbaaababbabab +aaaababaaabbaababbaaaabb +ababbabaaabaaaabbbbaaaba +bbaaababbbbababbabbaabba +babbbbbbbbbababababbaaab +babaabbbbababaababbaabaabbabaabb +baaaaabaaaaaabaabbaaabaa +aabbabaaabaaabababbbbaab +bababaabaabbaabbababaaab +babaababbbbbbabababbbaaa +babaaabbaababaaaaaaabbbb +bbbbbabbbbaabaaabbaabbaabaabbaabaababbaa +bbababaaaaaaaababbbaabbabbbaabbabbabbaabaaaaaaaaabbbabbbbaabbaababaaaaabaabbaaaa +abaaabababaaabaabbbaaaaa +baabbbbbabbbabbbbbaababbaababaaabbbbaaaa +abbbabbbabbbaabbbaaaabab +babbabbbabbbbabbaaabbaaabbababbabbbbbbaababaabbb +babaabaaabbaabaaaaabbbbbabaabaaaabbbbaaaaaaababbabbaabbbaaabaaaababaaaba +aabbababbaaaaaaabbbbababbaabbbbaaababbbbaaaabbabbabbbbaaaabbababbbbbabba +bbaaabbaabaabaaabbaaaabb +bbaabaaaabbabbababbbbbabbaaaaaababbaabbb +baaababaabbbabaabbaaaaabaaababab +abababbabbaabaabbaaabbaa +bbbbabbaababaaaabbbbaaaababbabbbabbbbbabbbaaabbabbbbbbbabbbaabababaabbbb +bbabaaaaaaababbababbabaaaaaaabaabbbbbaaabababbaaaaaaaabbbbabaabaaaaaabbbbababaabaabbaababbaaabab +babaaaabbaaabababbaaabbbbaaaaaaa +babbbabbbaabbababbbaaabb +abbbabaaabbabbbbbbabababaaaaabba +baaaaaaaaababaaaabbbbbaabbaaaaba +bbbabbbababbaababaabbabaaabbbabbabaaaababbbaaaab +bbbaabaaabbaaaaabbabaaaa +abababbabaababbaaabaabaaaaababbbbaaabbaabbbababbababaaba +bbbaabbbbbbbbbaababbaabababbaabaabbbbaba +babbaaaaaabaaabaabaabaabbbaaaababaaaaabaabbbaaaabbbabaabbabbbaabbbabaaab +bbabbbbaababaabbababbbbaaaaabaabbaababbbabaabaaaaababaaabbabbbba +abbabaaaaabbbbbabbaaabbb +aababaaaaaaabaaabbababbb +babbbbbbbbbababaaaabaaab +bbbabaabababaaaabaaaabba +aaababbbbabbaabbbabbbabbbbababaa +abbbbaaaabaaaabaabaaaaba +bbabaabbbaabbabbaaaababbbbbaabbaabaaaaaabbabbbbaababaaba +abaaababaaaaaaabbbabbbbaabbababbbbbaababbbbbabbaabbbbbababbabbbb +bababaababbaaaaaaabbabab +baaabbaabbaabaaababbababbbabbbabbbbbbaab +baaaaababaababbaaaababab +abbaabaabbbabbaaaaabaaab +abbbabbaabbaaaaabbbbaaaabaababbabaabbbaa +bbaabbbbbaabbaaaabaabaaaababbaaa +aaabaaaaabbabbabaaababaa +aabaabbaaabbbbbaabbbbbbaabaabbba +aababbaababbbabbabbbabab +bbabbaaaaabbbbbaaabababa +aaabbbbbabbbbbaababaabba +aaaaaaaabbabaaabbbabbbaa +bbbabaaaaaabaaaaaaababaa +aabbbabbbabbabababbbabbbbbbbabba +baababbababbaabaabbbbaba +abbbaabbbabbbabbabbabbaa +aabbaabbabbbbbbabaabbabbabbbbbbbaaabbbbbaaaabbba +bababaabaabaaabaaaabbbaa +bbbabaabbaaababababbbbba +abbbaabbbbbaaaabbabbbbabababbabb +baabaaaabbababbbabbaabbabaaaabab +babaabbabbaabbbabbaabbababbbbabb +aaaaabbbaaabbbbbabbabbbbbbbabaabbbabbbababaaaaaa +babaaaabbababbaaababaababaaaabba +bababaabbbbabababbabaaba +aaabbbbbaabababbababbabb +bbbaabbbbabbbbbbaabaabab +baababbabbbbbabaabaabbbb +abbbabaabbbbaabaababbbaa +aababaaaaabaaabaaaaaaaba +abbbbaaaababaaabbaaaaaaababbaaaababbbaabbaabbbbbaabbababbaaabbbb +bbbbbbaabbbababaabaaaababbbbbaabaabbaaaabbbbaaababababaa +bbbaabbaaaabaaababbabbaaaabbabbabaabbbaaaabaaaaa +bbbabbbabbbbbaababaaabbbaaababbaabaabaaa +abbbabbaabbaaaaaaabababa +baabaabbabaaabbabbbaaabb +aaabaabaabaaabaaababbbaa +babbaabaabaaaabbabbbbaba +bbbbaabbbaabbaabbbabbbbaabaaababaaaaabab +baabaabbaaaaabaaaabbabaabbbbbabaaababbabbbbbababbabaabbbbbabaaba +abaaabbaaabaabbaaaaabbba +ababaaaabbaaaaaaabbbaabbabbbbabb +babaabbababbbabbabaabaabbbbbaabbbabaaabbaaabbbba +baabbbbbbbbabbbbbababbab +ababbababaaaaabbbbbabbbbabaaaabbaaaaabaaabaababb +aaabaabababaabababbababb +aaabbbbaaaaabbbbbbabbabbbabaabaabbaaaaaabaaaaabbbbbabbbabaaaaabaababaaba +bbaabbaaaaaababbbaababaa +aaaaabbbbbaaaaabbaababaa +aaabbbbbabbbbbababbbaabbaaabbabbabaaabbb +baaaaabbbbbbbbbabbbbbabbbaabbbababbbbbaa +abbabababbbbabbabbaabbaabaaaabaabbbbbaaabbbbbbaaabbabbbabbbaaabbbbaaabab +bbabbbabbbbabaaaabbabbabbaaabbab +aabbaaabaabbbabbbbbaaaba +ababbabaabbbaabbaaaaabbbaabaabbbbbbbbbbbbaaabbbbbaabaaabbaaaabba +bbabbbababababaabbaaabbb +babbabbbbbbabbbabbabaabbabbaaabbababbababbabbbbbabababaa +bbaaaaabaabaabaabbbabbbbaabbbbbbaaaaaaba +aaaaababbaaaaababaaabaaaaaaaaaabababbabbabbaaaaa +abaaabbbaaabaabaaabaaaabaaabbbaa +baaaaababbabbbbaaaaaaaaabbbbabba +bbaabbaabbbbbabaaabbbbbabaaabaaaaaabbaba +bbaaabbabaaaaabbaabbaababaaaabaaababbbab +aabbaaababbbbbbbaabbabba +abbabbabbbaaabbababaaaaa +abbaabaabbbbbbbbbbbabbbbbabaabaa +aabbabaaababbabaabbbaaaa +bbabaababbabbaaaaaabbbbbabbaabaabaaabbbbbabbaabbbaaaaababbaababbbbababab +bbabbaabbbabbbbabaaabbaa +aaaabbababbaaabbabbbabaabbbaaababababbab +aaaababbaaabaabbbaabaaab +aabbaabbaaabaaaabbaabbab +babababbaabbbbabbbabbaabbaaaaababaabbabbabbabbbaabababaabbabbbaa +baabbaabbababbbbabaaaaba +aabaaabbababbbaaabbbabaabaaaabbbabaabbaaabbbaabaaaabaaaaabaaabbabbbabbbb +aabbbbbbaabaaabaaabbbbabaaabaabaababbaababbaabab +bbbabbbaaaaabaabbbbbbaaaaabbbbbabbabaaabbbbaabba +aabbbaaaabaaaabbbbbabbab +bbaaaaaaabbbbbbbababbbaa +baaaabbbabbbbbbbbbaababa +abbabaaaaabbbbbaaabbaaaa +bbbbbbbbaabaabbbbaaaabba +aabaaaaaaabbbaababbaabbbbababbabababaaab +aaaabbabaabbabaaaaabbbab +baaabbbbbbbabaabbbaabaabaaaaababbaabbbbababbbbababbbbababbbbbbab +baabbbbbbababbbbabaaaaaa +bbbbbbbbbaaaaababbabbbbbbbbaaabb +abbaaabbaaaabbabbaabbabbbbaababbbbbbbabb +abbabababbaabaaaabbbaaba +abbabaaaaabbbbbbaaaabbbb +bbaabaababababbabbabaaaa +ababbbbbbabbabbababbaababbbabbabbbabbabaaaaaababaaaabaabbbaababa +bbabbabbabbababaaaababaa +baabbaaabaabaaaaabaaaaab +bbbabbaabbaaababbaaaaaab +bbbbaabaababbabababbaaaa +babbbabbabbabbabbbaaabbaaabbaabababbbabb +aaaababbbaaaaababbbbbbaaabaababb +bbbbaaaabbbbaaaaaabaaababbaabaababababaa +baabbbabaaababababbbabab +aaaaaaabbbbbbabaababbabb +aaaaaababbbaaaaabababbab +baaabbbbaaaabababababbba +ababbbabaaaabbabaaaaabababaabbba +abbabbbbbabbaabaabaababb +baaaaababbbaabababbaabab +babbaaaaaabbbbaabbabbbabbbbbbababaabbabbababaaba +bbbbbaaaaabababbaabaabbaabbbaabbabaabbba +bbbbaabaaaabbbbbbabbaaab +baaababaaababbaaaabbbbbbabaaaaaa +aaabbaaaababaabbabbbbabbbbaaaaaaaaabbaaabaabbaabbbbabbabbabbaaabaaabaabb +aabaabbabbbabbbaabaaaaab +abaabaaaaabaabaaabaabbba +aabbbbabaaababbbababbbaa +bbabaaababbabbabaabbaabbbbbbabba +aabbbaaaaabbbbbbbababaaabaabbbaa +abbbbabbaabbabaabaababaaabbabaaabaabaabbaaaaabaabbaaabbabbaaaaab +bbbabaaabbaabbbbaaaaaaba +baaaaabbaaaaabaabbababbb +bbbabbbbbabbbbbbbbbbabab +abbbabaabbaaababbbbbabaa +aaaaabaaaaababbbabaaaabbabaaaaba +abbababbbbbaaabbaaaabbbabaaabbbaaaaabbaababaaaababaaaabb +abaabbbbbbbabaabababbabbbbabaaabbabababbaaabbaabbaababab +baabbababbbabbaaaaaaaaba +aabbbabbaaaabaaaababaaab +abbabaaaaabbbbabbabbbbaaabbbbbabbbaaaabbbbaababb +abbbbbbaaaabaababbaabbaa +bbbbaabaabaaababaaabbabbaabbbabbbbababbbaabbabbabaabaaba +abbbabaaaababaaaababaaab +bbabaaababbaabbababbabaabaababaa +aaaabbbaaaaabbbbabbbbbbabbbabaabbbabbbaabbaabababababaaabbbaabbabbabaaaabbbbbbbbabaaabba +abbaabaabbbabbbbabaaaaab +abbaaaaababbbbbbbabbabbaabbababbaaaaaabbabbaaaabaabbbaba +aababaaaaabaaabbbaabaaab +bbbabababbbabbbbabbabaaababaaaaa +abbbbaaababbaaabbaaaabbabaabaaab +abaabaabbbbabaabaabababa +aaaaaaaaabaaababbbabbabbaaaaaaabaaaabbababababaa +abababbbabababbaaabbabbbbbaabbbbbbaaababbbabbbbaabbabbaa +bbbbbabaaabbbbabaaabbabbabababbaaaaabbbb +aabbbbaaaaababbbaabbabba +baaaaababaaaaababbabbbbaaaaaabaaababbaaabaaaaaaa +abaaaabbabbaaababbabbbbb +bbaabaaabaaaaabbbabbaabaaaabaabbaaaaabba +abbbbbbbbabbbbaabbabaaaaabbabbbabaaabaaa +bbbaabaaabaaaababbbbbabbbbbbbabbbbaaaaba +abbaaabbbaabaabbbbbbaaab +aaabbaaabbabbaabbababbaa +abbbabbbabababbababaaaaa +bbabbbbabaaaaababbaababbbbbaabaabbabbaaaaaaaabbbaaabbaab +abaaababbbaabaaababbabaa +bbaabaabbaaabbbbbaaaaabbaabbbbbbabbabaaabbaabababababbbabaaaabab +abbaaaaaaabbabaababbbbba +bbbababababaaabbabaaaaaa +babbbabbbbbabaabababbabb +abbaaaaaabbabaaabbbbaabbbabababa +abbabbbbbbabaabbbabbabba +baabaaaaaaaabaabbbbababaaaabbaaabbbaaabbbabbbaba +baaabaababbaaabbabbbbabb +abaabaabbbbbaabbababbbaa +bbbbaabaabbababbbbababaabaaabbabbbbbabbabbbabbab +bbabaaababbabaaaaaabaabbaabaaabaaabbaababbaaabbbbbbbabba +bbbabaaaabbabbabbbbabbab +bababaaababbbbbbbaabbbaa +abbbbbbbbbabbaaabbababbb +aabbaaabaabbbaaabbbaaaba +aabbabbbbabaabababbabbaa +abbbabaababaaabbabaabaaaaabbbbababaaabaababbaaaa +aaaaabaabaaababaabaaaaab +bbbaabbbbbaabbaababaabbb +abaaaabbabbabbbbbbbbaaab +aabababbbaaabababbabbabbaaaaabab +bbabbaaaaaaaaaabbaaababb +baaaaabaaaabaaaabbbabbbbaabbbbaaabaabbabbabbbbbababaaaaa +aaababbaaababaaaaaabaababbbabaaa +babbaabbbaaabaababaabbba +abbbabaaabbababaaababbbb +abbbaabbbabbababaabbaaabbabbaaaa +bbbaabababbaaabaaaababab +aaaaaaaaabbabbabababaabbbbaaaabbbbababbaaaabbaaaabababaabaabababbbbaaabaaaabaabb +bbbbbaaabababbabaabbbbaabaaaaabbabbbabbabaabbbbaaabaababbbaabbba +aaabbabbaabbaaabbbaaabbaaabbbbbabaaaaabaaababaaabaabaaab +bbaababbaabbbbbbaabbbaaaabaabbab +bbbbababababaaaaabbbaabbaaababbbababbabaaabbbaaa +bababaaaaabaaabbbbabbababbbbbaaa +babababbaaaaaaababaababb +bbaaaaaaaabababbabbaabab +abbaaaaabbbbbbaaaababaab +babaababaababbaabbbabbbbbabbabbb +aabbbbbbaababaaaababaabb +aaaababbabababbabbabbabbbbaaababbabbbaab +bbabbaaaaabaaababaabbaabaaaaabab +aaaaaaaabbbbbaaaabbaabab +abaaaabbbabbbabbabaabaabbbaaaaabbbbaabbb +babaaabbabababbabbaaaaba +baaababaabbabaabbaababbb +aababaaaabaaabbaabaababa +bbbabaabbabbbabbbbaaabbb +abaaabbabbaabbaabaaabbaa +bbbababbbbbbbaaabababbbaabbbaabbbaabaaabbabbabbabbaabaaaababbbbbbbbbbababbbabbaa +bbbbaaaaaabbbabbabbaabaababbababaabbabaaaaababbbbaababaa +bababbbbbaabbaababababbbabbbaaab +bbaababbabbbaabbbababbab +baabaabbaabbaabbbaaaabab +aaaaabbbbababaabaabaaaaa +bbbabaababbabaaabbbbabab +bbbabaabaaaaaaaabaabbbababbaaabaaaabbabbaaaaabbbabbaaabb +aabbabaabbbbaabaaababaaaabbbabbbbbbaaaaababbbbab +aaaaaaabbabaaabbababaabb +abaaabaabbabbaaabbbbbaab +aabaabbaabbabaaabbabbabbabbbbbbbaaaabbbb +baabaaaabbbabaabaabbaabbaababbaaaabbaaaaaababaab +baabbaaaaabbbbbbabbabbba +aabbbbbbbbaababbaaabaabaabbbabaababbbabaabbababb +bbabaabbbabbaababbababba +bbbbaabbbbaabbaaabbbbaba +aaababbabaabbabbabaaaaab +aaabaabaaaaaabaaabababab +ababbabaabbbbbabbabbaababababbba +abbaaabbbbbabaabaabbbbbababaababaabaabaabbaabbbaabbbbaaa +baabbaabbbaaabbaabaaaabbbbbbbbaaabaaababababbbba +aaaababaaaaabbabaabbaaaababaabaabaabababababbbbaaabbaaaa +aaabaabbbbbaabaaababaaba +bababaabaabbbabbaaaabbababbabbaa +baabaaaaaabbaababaaababb +baaaabaaaaaaaaaabbabbbaa +babbaabbabaaabaaabbaabaabababbbabaababababaaaaaaabaaaaabaaabbbba +abbaaaaabaabbbbbabaaaaaabbbbbbba +aaabbaaaabaaaabbbaababab +baaabbbbaabbbabbaabbbaab +babbaabbbabbabaaababbbababaababbbabbbbbbbbaabaaaabaaabbbbaabbbbbbaaabbbb +bbabbabaaaaaaaabaaaaaabb +ababbbbbababbabaaabbaababababbbbabbbbaaaaaaaaaaaabbbbbbabbbaabba +aaababbaaabababbababaaba +aaaaababbababbabbaaabbbbbbaaaabaaaabbabb +baabbbbbabbbabbbaaabaaab +babaaababaababbbababbbbabbababababbbbaab +abaabaabbabababbbaababbbbabbbbab +baababbababaaaaaaababaababbaabaaaabaaabaabbbbbbabbbbabaabbbababbaaaabbbabaaaaababbbababaabaaabab +bbbbbbaaabbababaabbbbaab +abbaaaaabbabbabaababbaaa +baaabbbbaabaabbbbbbabbbbbaaaabab +bbbbbbaaaabaabaabaaabbaa +aabaabbabbbabbbaabaaabbb +bbaababbaabbbbabbbababbb +bababaaabbabbbabaaaaabbbaaabbaab +babbabbbbbabaabbbbabbbbaaabbbaaabaabbbbaaabbaaaabbbbabbb +babbababbbabbabaabbbbaab +aaaabbabbbabbbbabbbbaabaabbabababaaabaabbbbbbbbabaaaabba +bbbbaaabaaabaaaaabbaabababaaabbbabbabbbb +bbbabababbbbbbaaabbbbbaa +baababbabaabbabbaabaabbbaabbbbbabbabbbaa +bbaabbbbbbabbababaaabbaa +aaaaaababaabbbbbbaabbabbbababaaaaababababaaabbabaaaabbbbaaaabbabbabbbaab +babbbabbbaaabbbbbbaaaaaaaaabaabbbaabbaaaaababaabababaaba +abababbbaaaababbbbaaabaa +ababbabaaaaababbabaaaaaa +bababaaaabbaaabbbababbab +bbaabbbaabbabbbbaabababa +baabbbbbabbabbabbbbbaaab +abbaaaaaaaaabaaabaaaabba +aabbaabbbbbabbaababbababaaabaabb +bbaababbbbbabbbaaaababbabbaababbabababbabbababaabbaaabaaabaabbaa +abbbbbabaaabbabbababbaab +aaaaabaaaabaaaababbbbaaa +aabaaabbbabbabbbabababaa +aabbbabbaaaaabbbaababaab +abababbbbbaabbaaabbbaabbaaaaabaabaaaabaabbbaaababbaababaabaababaababbbbb +babbaabaabababbbaaabbaab +abbbaabbabbbbbbbbaaababababbbaabbababbab +aaaababbabbaaaaabaabaabbbbabbbaaaaaaabba +bababbbbbbbbaabbaaaabbba +bbaabbbaaaaaabbbbabbbbaa +aabbaabaabbbabaabababbbbbbbbabab +babababbabbbabaabbbabaaaabababaa +babaaababbaaaabbbaabbbba +ababaaaaabbbbbbbbaabbabbbabbaabbaaaabababaababaa +bbaaaaabbaaaabbbbabbaabaababaababaabbaabababbbbaabbabbaa +baabbabbaaabaabbbbbbaabaaaaabaabaabaabab +aaababbbbbaababbabbabbaa +aabbaaabaabbaaabbaababab +abbabaaaaababaaaaaaaaaaabaaabaaabbbbabaa +aaabaabaabbbabaabaabbabbaababaaaabaababa +abbabbabbababbbbbaaaaaab +aabaaabbbbbaaaabbbabababbaaaabbbaaabbbab +bababbaaababbabababbabaabababaababbabaaaaaabaaaabbaaaaaabaabaaab +aababaaabaaaaabbabababaa +aabbabaabbabbaaabbbaaaba +aabbabbbabbabaababbaaaaaaabbbabbaaabbaabaaaabbbbaaaabbba +abababbabbbbaaaababbbbab +aaaabbbbbbbbaabbbaababbaaabbbbbaaababbabbbbaaaaaababaabbababbbaabaababba +abaaabbababababbbabababa +abaaabbaabababbbbaaaaaaabbbbabbb +aabababbbbbabaaababbabbbababaabb +abababbaabbbaabbaabbbbbabbbbbbbb +aabaabbbbbaabbbabaaabbbbbbaaaaaabbbbbbbabababbaabaaaabaa +babaaaabaaababbaaabababa +bbaabbbaababbababbbaaaab +bbbaaaababbbbbaabbbbbababbababbaabbaabababbabbbababbbbababbbabaaaabbabaaabaaaababbbbbaaaabaaabbb +baabaabbbaabbabaaababbba +bbbaabbbbbababbbbbbbaababbaabbaabbbbbaababbaabbabbbbaaabaabaabbabaabbbaa +bbbbbbbababbbbbbaabaababaaaaabbbbbbabbbb +aababbaabbbbaabbbbbaabbbaabaabaaaaaaabbbbabababa +abbbabaaabaaabbabbaaaaba +aaaaabbbaabbbbbbaaababbbbabaabbaababaabbbabaaaaabbaaabbb +babbabbbbbabaaabaaaabbaa +bbbbaabbaaaaabaabbabbaaabbabaaaa +aaababbbaabaaabbbbbaabba +aabbaabbababaaaaabbababbbababbaaabbbbaabbbbaaabbbaaabaab +bbabbabaabbabaabababaaab +bbaaababbbbbaabababbbbaa +aaaababaabbaaabbabbbbbaa +bbaabbbaabaabaabbbaaaaababbabaabbbabbabaaabbabbabbbbabaa +babbababaabaaabababbababbbaaababbbabbbbbbabababa +aababbaaaaabaabbbbaaabaaabbbbabb +bbbaaabbabaabbbbaabbabbbbabbaabbbabaababbbbaaaaaaababaabaaaaaaabbababaaa +abbaaabbbbabbaaaabaabbba +aaaaabaaaaaabbabbbaabaaaabaaaaaa +aaabbbbbbaabaabbabbbaaab +abaabaabbabaabbabbababbb +aabbbaaaabababbababbbabbbabbabababbbbaabbaaaaaaa +baababaababbabbbbbbabbbbababbabaabaaaaba +bbaabbaabbaaaaaaaaabbaba +aaaaabbbbaabbababababbbbbaababbaaaabbaab +abbaabbabaaabbbaaaaaaabbaababbbaaabbbbbbabaaaaabbaabaaaabaaaaaababaabaababbbbbbbbaabbabb +baababbabbabbabaabbabaaababbbaaa +baabbaabaababbabbbbbabbb +aabbaaababbbabbbbaabbaabababbbbb +aabbbabbaaabaabaabbbaaab +abbbbbbbbabababbbbaaaaabaabaabbbbababbaa +bbbbbaaabbabaaabaababbababbababababaabbbbabaaaaa +abbabbabaabbbbbbaabbbbbbbabbabbbabbaaaaaabbbaabababbaaaa +aaaababbaababbabaaaaabaaabbbbbbbbbbbbaba +bbbbabbaabaaabbabbaaabbaaababbaabbabbabaababaababbaaabaa +aaabbbbbbaabaabbbbaababa +baabaaaaaaabbabbbabbbabbbabbaaabbaaaabab diff --git a/day_19/second.rb b/day_19/second.rb new file mode 100644 index 0000000..8096bbf --- /dev/null +++ b/day_19/second.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +input = File.read('./input').split("\n\n").map { |r| r.split("\n") } + +# Replacements for Part 2 +input[0].delete('8: 42') +input[0].push('8: 42 | 42 8') +input[0].delete('11: 42 31') +input[0].push('11: 42 31 | 42 11 31') + +$mem = {} +$lines = input[1] + +$rules = input[0].map do |i| + k, v = i.match(/(\d+): (.*)/).captures + [k, v.split('|').map do |x| + x.split(' ').reject(&:empty?).compact.map do |y| + y.gsub('"', '') + end + end] +end.sort_by(&:first).to_h + +def rules(key, d = 0) + $mem[key] ||= begin + either_or = $rules[key] + + d += 1 + return '' if d == 96 + return key unless either_or + + pair = either_or.map do |group| + group.map do |sub_rule| + rules(sub_rule, d) + end.join('') + end.join('|') + if pair.include?('|') + '(?:' + pair + ')' + else + pair + end + end +end + +re = Regexp.new('^' + rules('0') + '$') + +puts $lines.select { |line| re.match(line) }.size