Solution for Day 19

This commit is contained in:
Patrick Michl 2020-12-19 20:18:23 +01:00
parent 0351f2e4eb
commit 209cceef1e
3 changed files with 614 additions and 0 deletions

38
day_19/first.rb Normal file
View File

@ -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

530
day_19/input Normal file
View File

@ -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

46
day_19/second.rb Normal file
View File

@ -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