From 779ff4c3983a45f4945e70d5363dfbf3ed6ab3a7 Mon Sep 17 00:00:00 2001 From: Hubert Van De Walle Date: Sat, 19 Dec 2020 21:30:05 +0100 Subject: [PATCH] Day19 WIP --- days/src/main/kotlin/Day19.kt | 159 +++++++++ days/src/main/resources/day19.txt | 536 ++++++++++++++++++++++++++++++ 2 files changed, 695 insertions(+) create mode 100644 days/src/main/kotlin/Day19.kt create mode 100644 days/src/main/resources/day19.txt diff --git a/days/src/main/kotlin/Day19.kt b/days/src/main/kotlin/Day19.kt new file mode 100644 index 0000000..a50966b --- /dev/null +++ b/days/src/main/kotlin/Day19.kt @@ -0,0 +1,159 @@ +package be.vandewalleh.aoc.days + +import be.vandewalleh.aoc.utils.input.Day +import be.vandewalleh.aoc.utils.input.Groups +import be.vandewalleh.aoc.utils.input.Input +import be.vandewalleh.aoc.utils.input.createDay +import org.slf4j.LoggerFactory + +sealed class Rule { + data class CharRule(val value: Char) : Rule() + data class OrRule(val a: List, val b: List?) : Rule() +} + +@Day(19) +class Day19(@Groups val input: Input>>) { + private val rules = input.value[0] + private val messages = input.value[1] + + private val logger = LoggerFactory.getLogger("Day19") + + // [[a], [b]] -> [ab] + // [[a], [ab, ba]] -> [aab, aba] + // [[ab, ba], [a]] -> [aba, baa] + // [[a], [b], [c]] -> [abc] + // [[ab], [cd], [e]] -> [abcde] + // [[ab, ba], [cd, e]] -> [abcd, abe, bacd, bae] + // [[ab, ba], [cd, e], [yy, z] -> [abcdyy, abcdz, abeyy, abez, bacdyy, bacdz, baeyy, baez] + private fun combine(lists: List>) = lists.reduce { acc, list -> combine(acc, list) } + + private fun combine(a: List, b: List): MutableList { + val combinations = mutableListOf() + a.forEach { f -> + b.forEach { s -> + combinations.add(f + s) + } + } + return combinations + } + + private fun generateSolutions( + chars: MutableMap, + rules: MutableMap>>, + ): Map> { + + val solutions = mutableMapOf>() + + for ((index, char) in chars) { + solutions[index] = mutableListOf(char.toString()) + } + + fun debug() { + if(logger.isDebugEnabled){ + logger.debug("---") + logger.debug(rules.entries.joinToString("\n")) + val prettySolutions = buildString { + append("\nsolutions:") + appendLine() + solutions.entries.forEach { (k, v) -> + append(k) + append(" [") + appendLine() + v.forEach { + append("\t") + append(it) + append("\n") + } + append("]") + appendLine() + } + } + logger.debug(prettySolutions) + } + } + + debug() + + while (rules.isNotEmpty()) { + val mapIterator = rules.iterator() + while (mapIterator.hasNext()) { + val (k, values) = mapIterator.next() + + val valueIterator = values.iterator() + while (valueIterator.hasNext()) { + val value: MutableList = valueIterator.next() + + if (value.any { rules.contains(it) }) continue + + val sol = value.mapNotNull { solutions[it] } + if (sol.size != value.size) continue + + val solution = solutions.computeIfAbsent(k) { mutableListOf() } + + val combined = combine(sol) + solution.addAll(combine(sol)) + + if(logger.isDebugEnabled){ + logger.debug(":::$k") + logger.debug(":::$value") + logger.debug(":::$sol -> $combined") + } + + valueIterator.remove() + } + + if (values.isEmpty()) mapIterator.remove() + } + debug() + } + + return solutions + } + + private fun matches(input: String, solution: List) = solution.any { it == input } + + fun part1(): Int { + val parsedRules = parseRules() + + val chars = mutableMapOf() + val rules = mutableMapOf>>() + + for ((index, rule) in parsedRules) { + when (rule) { + is Rule.CharRule -> chars[index] = rule.value + is Rule.OrRule -> listOfNotNull(rule.a, rule.b) + .forEach { rules.computeIfAbsent(index) { mutableListOf() }.add(it.toMutableList()) } + } + } + + val solutions: Map> = generateSolutions(chars, rules) + val zero = solutions[0]!! + + return messages.count { matches(it, zero) } + } + + private fun parseRules(): MutableMap { + val parsedRules = mutableMapOf() + rules.forEach { + val parts = it.split(":", limit = 2) + val index = parts[0].toInt() + val rule = if ("\"" !in parts[1]) { + val p = parts[1].split('|', limit = 2).map { it.trim().split(" ").mapTo(ArrayList(2)) { it.toInt() } } + Rule.OrRule(p[0], if (p.size == 2) p[1] else null) + } else { + Rule.CharRule(parts[1].trim().replace("\"", "")[0]) + } + parsedRules[index] = rule + } + return parsedRules + } + + fun part2() { + + } +} + +fun main() = with(createDay()) { + println(part1()) + println(part2()) +} diff --git a/days/src/main/resources/day19.txt b/days/src/main/resources/day19.txt new file mode 100644 index 0000000..b73179f --- /dev/null +++ b/days/src/main/resources/day19.txt @@ -0,0 +1,536 @@ +107: 18 | 47 +116: 1 18 | 111 47 +21: 45 47 | 110 18 +20: 2 47 | 76 18 +44: 47 47 | 18 107 +2: 47 18 | 107 47 +113: 51 47 | 35 18 +80: 18 22 | 47 44 +110: 18 18 | 47 107 +1: 22 18 | 112 47 +77: 47 7 | 18 113 +16: 121 47 | 2 18 +66: 91 18 | 58 47 +86: 12 18 | 78 47 +72: 18 76 | 47 121 +46: 47 68 | 18 82 +131: 66 18 | 75 47 +108: 84 18 | 24 47 +27: 22 47 | 110 18 +53: 108 18 | 122 47 +90: 77 47 | 37 18 +6: 18 29 | 47 52 +10: 76 18 | 44 47 +43: 47 39 | 18 130 +106: 18 112 | 47 110 +89: 97 47 | 51 18 +84: 112 18 +91: 74 47 | 110 18 +114: 18 47 | 107 18 +105: 26 18 | 118 47 +18: "b" +19: 2 47 | 22 18 +15: 34 47 | 2 18 +111: 110 47 | 22 18 +94: 47 95 | 18 57 +34: 107 107 +60: 47 114 | 18 121 +62: 44 47 | 45 18 +50: 38 47 | 103 18 +61: 18 44 | 47 110 +87: 112 107 +8: 42 +31: 18 49 | 47 25 +57: 18 20 | 47 60 +103: 18 67 | 47 40 +39: 18 45 | 47 22 +128: 112 18 | 13 47 +5: 45 47 | 44 18 +13: 18 18 +3: 47 10 | 18 80 +11: 42 31 +124: 22 18 +88: 18 18 | 47 18 +54: 32 18 | 129 47 +63: 81 18 | 86 47 +49: 18 132 | 47 105 +102: 10 18 | 120 47 +93: 18 44 | 47 34 +65: 107 2 +132: 83 47 | 14 18 +125: 18 43 | 47 71 +109: 47 22 | 18 76 +117: 18 112 | 47 22 +59: 47 22 | 18 13 +75: 18 109 | 47 27 +4: 47 90 | 18 69 +48: 18 65 | 47 115 +24: 18 2 | 47 44 +42: 47 50 | 18 4 +96: 106 47 | 16 18 +101: 111 47 | 91 18 +58: 47 76 | 18 73 +79: 47 73 | 18 22 +12: 47 34 | 18 88 +25: 33 47 | 55 18 +130: 18 114 | 47 44 +83: 126 18 | 102 47 +45: 47 18 +9: 41 18 | 62 47 +78: 112 18 | 45 47 +14: 3 47 | 85 18 +97: 47 45 | 18 22 +22: 18 47 +41: 18 22 | 47 112 +112: 18 47 | 18 18 +68: 21 18 | 19 47 +121: 47 47 | 18 18 +119: 22 47 +129: 47 5 | 18 39 +30: 73 18 | 2 47 +98: 34 18 | 45 47 +40: 18 70 | 47 9 +7: 64 47 | 79 18 +115: 121 47 | 44 18 +32: 19 47 | 30 18 +73: 18 47 | 47 18 +35: 18 76 | 47 45 +95: 93 18 | 72 47 +52: 28 47 | 124 18 +126: 59 18 | 92 47 +26: 104 18 | 89 47 +81: 47 98 | 18 127 +0: 8 11 +64: 112 47 +71: 47 119 | 18 117 +74: 47 47 +82: 47 120 | 18 17 +56: 74 47 | 88 18 +123: 88 47 | 76 18 +33: 6 18 | 63 47 +104: 80 18 | 128 47 +99: 98 18 | 23 47 +38: 94 18 | 53 47 +36: 47 110 | 18 74 +37: 47 48 | 18 101 +70: 61 47 | 87 18 +55: 47 54 | 18 131 +23: 2 47 | 112 18 +122: 10 47 | 64 18 +120: 88 18 | 112 47 +28: 18 112 | 47 73 +51: 47 74 | 18 110 +17: 47 88 | 18 22 +127: 18 73 | 47 45 +69: 125 18 | 46 47 +92: 2 47 | 114 18 +29: 117 18 | 56 47 +67: 18 96 | 47 116 +85: 18 36 | 47 15 +100: 18 123 | 47 12 +47: "a" +118: 100 47 | 99 18 +76: 47 47 | 47 18 + +bbbbbbbbbaaaabbaababbabbaaabbbabbbbaaabb +babaabbaabbbbaababbaabbabaababba +baabbaaabbabbbbaaabababb +bbbbababbaabbbabbabaaaaaaabbbbbbabbabbbaabbbbbbbbbaaaaab +bbbbbabbbbbbaaabbaaaaaba +baabbabbbaabbbabbaabbabbababaaab +bbabbbbaabbabaaababbbbbbbbbabaab +aaababbaabbaaabbbbbbbabbbaaaabbaabbabbabaababbaa +aabbbabbaaaaaaabbbabbaba +baabaaaabbbababbbbaabbbb +bbbbabababbbbabbbbbbbbba +babbaababbbbababaabaababbbabbbbbaabaaabb +baabbbabaabbabbbaaaaabba +baabbabbbbaabbbabbbaaabb +aaaaabbaababaabaabbabbbbbabbabaabbaaabbb +babbaabaaabbbbbbbbbbbabbaabbaaabbaaaaabbabbaabaabaaabbbaaabaaabb +aaabaaabbaaaaabbabaaaaababbabaaababbaabaabbaaaabaaaabaaaaaaabbaaababbbbb +baaababbbaabaaaaaaaaaaaabbababaababaaaaabaaabaaa +abaaaaabbbaababababaaaba +abbaabbabaaabbabaaaaaabaababbabbbbbbabbaabaabbbb +baabbabaaaaabbabbaaaaaabaababaab +abbaabbabbaabaaaabbaaabbabbaaababaaaaaaa +abaaaaabbbbaabbabbbbbbaaaaaaababbbbbbaaa +aabbaaabaaaaaabababaabab +bbbabbaaaaabaaaaaabbbbaa +abbaaababbaaaabbaabaaabbbaaaabbbbbbbaaaaabbbbabaabaabbab +aaaaaaaaaababbabbbabbaba +abbaaaaabbbabbbaabbaaabbabbbbaabbabbabbbabaababbbbabaaba +babaaaaabaabbaaabbaabaaababababa +bababaabbaaaabbabbbabbbabaabbaaaabbaaababbbbbbaaaaababaa +aabaabbababbbabaaaaaaaabababaaaababbabaabbaaaaabbbbbbaab +baaabbbbaaabbaabaaaaabaaababbaabaaababbabaababbb +abaabbbaaabbabbabaaababbbbabbaaaabaaaabb +abbaababbaaaaabbbbaaabbb +aabbabbabbaaaaaabbbaaabb +baabbbabbabbaababbabbbbabaabbbabbbbabbbaabbabbaababbbbbaabbababbaababaab +abbaabaabaaabbbbbaaabbabababbabbbaabbabbaaabbaaababbbababbbbbaaa +aabbbaabbbbababbbabaabaa +baabbaaaabbbaababaabbabbabbbbbaabababaaabaabbbbaaababbbb +abbabababbbbbabbababbbaaaaaaabbbaabababb +baaabbabbbbaababbbaaaabb +aabaaaaaaaaaaabbbabbbabbaaabbbab +abbaabbababbbbaabaaaabbaababbabbaaabbbbabbbaaabbbbaaaabb +baaabbabbbaabaabbbabbaba +abbbbbaaabababbbbbbabbbb +aaabbabbbbaabbbabbaaabbb +babbbbaaabaaabbaabaaaaabbabbaaab +aaabbabaabbaababaabbbbbbbabaaaba +baaaaabbababbbbabbbbabbbababaaaa +abbaaaabaabbbaabbabbbbab +bbbaabbaabaaaaaaababbbbaabbaaaaabbaaabbabbabbbaa +baabbbabaabaabbaababbabbbbaaaaaaaabbbaabbbabbbaa +babaabbabbbbaabaabababbbaabaababbbbaabbb +aabbbabbbaaaaaababbaaaaaaabbaaabbabbabbaaabbaaba +aaabababababbbabbbaabaabaaababbaabbbaabbbbaaaaba +aaabaaababbaababbbbabbab +baaabbabbaabaaabaaaababbabbbabba +abbbabaaaabbbaaaabaabbabbbaabbbbaaabaabb +abbbbabbabbaababbbbbbbaabaaabbbbabaabababbbaaaabaabbaaba +baabbababbbabaaaaabbbaab +aaaabbaabbaabbbbaabbaaaabbabbabaabaaababbaabaabababbaabbbabbbaabaabbbabbbabaaabb +abaaaaabbabbaaaabbabbbaa +baaabbbbababbbaaaababbabbabbaababbabbbabbbbbaaaa +aaaababbabaaaaabbbaabaabbababbbbaabbaaabbbbaaabbbabbbaaaababbaba +abbaaabbbbbbaaabaaaaaababbbbbaaa +aaaaabbababbaabaabaaaaaababbbaabaaaabbaa +bababaabbbbbaaababbaaaaaaabbbbabaaaaabbbaabbbaaa +bbaabbaaaabaaabbaabbaaaabbabaaaabaabbbab +aabbaaabbaabaaaaaaaababbbabaabbaaaababbb +abbbaabaabbaabbbaaaababa +abbaaabbaabaaaabaababbbb +baabababbbbaaabaaabbabababbbabba +abaaabbaaaabbabaabbaaabbaaaaaaaaabbbaababaababbaaabaaaaaabbbabaa +abbbbbabaabbaaabaaaaaabb +abbaabbaabbbbaabbbaabaababbbbbaaababbbbb +aaabbababaaabbabbbaaabbb +baaababaababaabbbbbaabaa +bbbaababbbaaabbaaaaabbabbabbbbab +bbaabaaaaaababbabbaaaaab +aaabaaabbabbabbabbaaaaba +babbabababbbbabbaabbbaba +ababaabbbaabbaababbaabababbbabbbabbbbaabbababaaababbbabbbbbabbbb +abbbbabbaababbababbbbbaaabababbbaabaaababbbaaabb +babaabbbababaabaabaaabbbbaabbbaa +bbbbabbbbbababaabbbbaaabbaabababbbbbabaabaaaaaaa +aabbabaaaaabaaabaaaaabab +abababaaabbabaaabbaaabbababbbbaaaaaababbbabbbaaa +abbaaaaabbabbbbaaabaabbabbaabaababbaaabaaababaaa +aabbbabbababaabbababaabbaaabbbab +baaaaabbbbbbbbaaabbbbbabaabaababaaaabaab +abaaaaaaaaabbababbabababaabbbabbbbaabbababbbaaab +baabaaaaabbaaaabbbbabaaabbababababbbbbba +baabaaababababaaaabbabaaaabaabababaaaabb +bbaaabbaaaabaaababbbbabbaababaaa +babaabbaabbbbaabbbaaabbabbaabbbbbabbbaaa +bbaaaaaaabbaaaaaababbaaaababbbabbbbaaaabbaabababababbabbbbbbaabbaaababbbbbbbbbab +aabaababbabbaaaaabaaaaabbababbaa +aaabbaabaabaabaabbbaababaabaabaabbaabaabbaaabbaa +abaaabbabbbabbaabbbbbabbabaababbababbaaa +bbabaaaaaababababbababba +aaabbabbbabbbbbbabbaabbbbbbaababbaabaaabababbbbbabbabbaa +aabbbbabbabbabaabababbaa +aabaaabaaaabaaaabbabbbbaaaabbbbb +aaaabbabbbabbbbbbaaababaaaaabbabaaaaabab +baabbbabaaabbabbbbababba +bbbabbbaabbaabaabbabababbbbababbabaaabbababbabbbabbbaaaabbaaababbaababaa +abbaabbbbaaabbabbaaaaaaa +aabaaabaaaaaaaaaaaaaaabb +babbaaaabbabaaaaaaaaabbaabbbbaabbbabbbbbbbbaaaaa +aabbaabbbaaaaabbabbbbbba +baaaaabbaaabaaaaabaabbaa +bbaabaabbaabbbabbabbbaabbbabbbaababaabab +aaabbabababaabbabaaababaaaabbabbbbabbaabbabbbbba +bbaaabbabaaababbabaaaaaabaabbbaa +bbbbbabbabbbbbabbbbababa +abaabbbabaabbabababaabaa +babbabaaaaaababbbaaaaabbababbabbbbbbbabbbbbbabaa +aaaababbabbbbbaabbbbaaabbaaabbbbaabbbbbababbaabababbbaaa +babaaaaaabbbabbbaabaabbabaaabbbbbabababbbaabbbaabbaabbaa +ababbaabbbbbbabbbabaaabbabaabaabbababbbbabbbbaab +abaaaaaaaaaaaabaabbbbaabbababbbbbaaabbaa +bbbaabbabbbabbaaaaabbabbbaaaabbaaabaabbb +aaaaaaabaaabaaabaabbaaabbbabbbabaaaabaaababbbaaa +aabbbbababbaaababababaabaababbba +bbabbbbbbabaabbbbabbababaaaaabaabbaaabaabbbabbabababbaaa +babaabbaabbabbabbabbabaaabbabaab +bbbabbbaabbaaabbaabaaabaaababbaa +abbbabbbababababbaaabbab +abbaaaaababbababaaaaaabaaabaaabb +aaaaaabaabbaaabaaabaabbabbabbaab +aabababaaabaaababaabaabbaababaabbaabaaba +bbababaabaabababaabaaaabbaaabaab +aabbbbabbaaabababbabaabb +bbbbbbaaaabbbbabbabaaaababbbbbba +ababbbbabaabaaaaababbbbaabbaaaabbbabbaaa +abbaaabbaabbaabbaaaababbbaabaabbaabbbbbabababaaabbaaababbbabaaab +aaaaaaabbaaaaabbabaabaabbbbbbbabbbbbaaaabbbabbbb +babbabbaaaaaaaaabbbaaabb +aaabaaaaaaaaaabaabbabaaabaaababbbbbabaaaabbbaaba +aabbaaabbaabbabbbbabbaaa +aabbbaabaabbbbbaabbaaababbaabbbabbbabbbb +bbbabbbabbababababababbbabbababb +aaaaaaabaabbabaaababbbbb +bbabababbbbabbaabaaabbababbaaaaabbaaabaa +bbabbbbaaabbaabbabaabbaa +aaabbaabaabaabbaabbaababaabbbaabaabaabbababbabababaaabbbbbabaababaaaababbbbbbbbabababbba +abababaaabbaabbabbbbaaaa +abaabbbaaabbbabaabababbbabaaaaabbaaaaabaaabbabbbbaaaaaabbabbabab +baabababaabbaabbbbababba +abbaaabbabbaabaabbabbaab +baabbaababaabaababaaabab +abaabaaaaaababbabbabbaba +baaabbbbbbbbbbababaabbab +babaaabbaabaabbaabbabababababbba +aaababbaaabaabaabbbabbbababbbaabaabbbaaa +aabbaaaaababbbbaababbaaa +babaaaabbbabbbbababbbabb +bbbaabbabbbaabbabbabbbaa +babaaaaaabbaabbabbaabaabbbbbbabbbbaaabbabababaaaaaabbbbb +babbaaaabbbbababbaabbbabbaaabaabbaabbbba +bbbbbbaabaaababaababbaabababbbab +abbabbbbaabbbbaaabbbaabbbbabbabb +bbbabaaaaabbaaabbabababb +abbaabababbbbaababbabbabbabbaaaaaaaaabaaaaaabaab +aabbabaabbababaaaaabbababbaabaaabaaaaaaa +bbbbaabbbbbababaabbbabaaaabababb +baabbabbaabaaabaaabaaabababaabab +baabaaaaaabbaaabbbabababbabbbbbbbbbbaaaa +aaaaaaababaabbbabbaabbbaaaaabaababbbaaababbbaabaabbbbbbbababbababaabbaab +abbabbbbbbbbbabbababaaaa +babbbaabaabbbbabbaabbaabbbbabbaabbabbaab +ababaabbbbaabaabaaabbabbbaaaaaaa +baaaaaabaabbaaababbbbabbabaaababbbaaaaba +bbbbabbaaabbbaabbaaaabab +ababbbaaabbabbabbbbabbab +abababaaaaabbabbbbabaaba +aaaaabbabbabbbababbbabba +aabbbbbabbabababaabbaaabaaaaabbbbbbaaaab +bbbabaaabbbabbbaaaabbababbbbbaba +aaabaaababbbaababaabbbaa +aaaababbbbbbbbabaabbaabbabbbabbbbababaaabbbaabbbbabbbbab +aabaabbabaabababbabaabbaaaaaabab +abbaabababaabaaababbbbaaaabbaaba +bbabababbaabaabbababbaaa +babaaaabbaabababbbbaabbaaaabaaabbababbaaaaaabbaabbbaaaaa +bbbabbbababbbbbbbaaaabaa +bbbbabbaababbbaabbabbbbabbabaaaaaabaababababaababbaababbbbbbaaaa +baabbbbaaaabbbabababbaba +aabbbbabbbbbababbbababbbababbaaaabbbbaaa +aabbaaabbbabababbbbabbbabaabbaaababbaaababababba +baabaabbbaabaaababbbbaabbaaaaababababbbabaaabbbbbaababababaaaaaa +bababbbbaabaaaababbaaabbbabaabab +babaabbbaaaabbbaaaaabbbbabbbaaaabbabbaba +abaaaaabbbbabbaabbbbbbabaaabaabb +ababaababbaabaabababbaba +baabaaaabaabbabbbbabaaaababbaaab +aaaabbbabbbbbbabbbabbabb +bbbbbbabbabbaaaaabaaabbabaaababbaabbbaaa +bbbbbabbbbbaababbabababb +aaabbaababababaababaaabbabaaabbb +baabaabbaaaaabbabaabaaaaabaaabab +bbbbbbababbbbaababbabbabbbbaabaa +abaabbabbabaababbbbbbbbabbbbbbaaabbbaabaabbbbbbbbbbbaaab +abaabababaabbabbbbbbabbabaaabaab +bbabbbababbaabbaababbbbaabbaabbbbbaabaabbabaababbbababbbbaababaa +abbaaaaaaaaabbbaabbabaaaabbaaaaaababbabaaaaabaabaabababb +aaaaabbaaaabbbbaaaabbbbaaaababbababbbaabbaababbababaaabaaabaaabbbbaaaaab +aabaabbaaabaaabaaabababb +aaabbabbabaaaaabbbbbababaaaabaaa +baababababbbbabbabbabaaaaabaaabbaaababbb +ababbbbaabbaabbaabbbbaaa +aaaabbabbbabaaaaaabaabbb +bbbbabbaaaaaabbabbbababa +aaaaaabbbabaaababaaabbaaabaabbbabaaababbbbabaabaaababaabaaaaaaaaabbbaaaababaabaa +baabbbababbbbbaabaabaaaaaaabaabb +abbabbabbbbbabbbaaaaabbabaaabbaa +baabaaababaabaabbaabbabbaaaaaaababbabaaaaababbba +baaabbabaaaaabaaabbabbbaaababbba +aabbaaababaabaaababbaabaaababbabbabbbbabbbaaaabb +baabbaaabaabbaababbbbaba +aaaaabaabbaaabbaaabaaaabbaabbaaaaabaaabb +bbaababaabaaabbababababb +bbabbabbbbaaaaaaaaaabaabbbaaabaabbabbabbbbbbabbbabbbaaaabaababbbbabbbbabababbaab +aaabbbbabaabaaaaaaabbbab +baabbbabbbbabbaaabaaabab +bbaaabbabaabababaabbabbabbaaabaa +ababbbaaababaabbbabaaaabbababbbbbaaaaaba +baabbaaaabaababaaabababb +aababbabbbababababbbbbaabaabbaaaaaaabaaabbaaaaba +aaaaaaabbaabaaaaababababbabbaaabaaabaaba +abbaabbbaabbbabbaaabbaaa +baabbaabbbbababbbaaaaabbbbabbabb +aaaaabbababbaaaaabaaabbaabaabbbabaababaa +aabbabbbbbbbabbbbbbbbbba +abababbbaaaaaaabaabbabbaabbbbaaa +abababbbaabaaababbaababaabbabbaa +baabbaabaaaaaaaaaaabaaba +ababbbaabbbbababbbaaaaab +baaabbabaaabaaabaaaabbbbbaaaaaba +bbaaabbabbabaaaabbaaaaaaababaabbbabaaaba +abaabbbaabaaabaaaabbbbbbbaaabaabaababbba +bbbbabaabbbbbaababaaaaabaaabbabbbabababbbaabbaaa +abaabaabaaaaabaababaabbbbbaabaaaaaababbb +aabbbbbaaabbbbabaabaaababbbbbbabbbbaabbbbaabbbaa +abaabbbaabaaaaaaaaaabaaa +baabbbababbbaababbabaaba +babbbaaaaabbbababbababbabbababab +baaabbababbbabbbabbbbbba +abbaaaaaabaabaabaaabbbbaabbababbababbaaa +abbaaaabbaaabbababbaababaaaababbbabbaabb +baabaaabaaabaaabbaabababbaabaaba +ababbbbaabbaaabbbbaababaaaaabbbbabbababb +baabbabbbbabbbbabaabbababbbbababbaaaaaababababba +abaabaaaabbaaaababbaaaabababbbaaababbabaabaabababbbbbaab +abbbbbabbaaaaaabbabaaaaabaaabbbbbaabababaaababaaabbbabab +baabaaabbabbabababbaaabbbabbabbabbbbbabbbabbbaaabaaaabab +babbabaaaaaabbbbabaaaaabaabbbabbabbaaaaaaababbba +babbbabaabbbaaaababaabaa +aaabbabbbabbabaaabbbbabbabbababbabbbabba +abbaaaabaaabaaabbaabbabaaaababbabaaabbbbbababbaaabbabaab +aabbabaabaaaaabbaabbbaabbabaabab +baaaaabbbbaaaaaaabbbbbabbbbbbbbbaababbbbbbbaabaa +bbababaaabbaabaabbabababbabaabbbabbaaaaaabbbabbb +aaaabbabbbaabaabaaaaaaaaabbbbbaaaaabbbababbbaaaa +abbabbbbbbbbabababaabbab +babaabbabbbbabbabaaabbbbbbababbaaaabbbabbabaaabaabbabaab +bbababaaaabbbabbbbababbb +baabbbababbaabaabbbbababbababbbbabbbabab +baabaaaabbbbbbababbabbaa +babaaaaaaabbbaabbbbbbbaabaabaaabaaaaabbbabaaabbb +aaababbaaaaabbbbbbabbbba +aabbbaabbbabaaaaaabababaabbbabbbbbaaabaabbbaaaba +abbbabbbbabaaabbbbbbababababbbbb +abbbbaabaaaabbbaaaabbbbaaaaaabab +ababbbbaaabaaabaababaaab +aaaaaaabbbbaababbaabababaabababaabbbbabb +aabaaaabbaabaaabbaaaaaabbababbbaababaaaa +aabbabbabaaaaabbaaabbbab +bbbbbabbbbbbbbabbbabbaba +aabaababaaaabbabbbbaabbaabaaabaabbabababbbaabbbbbaaaabaa +babbabbabbbaababaabbbbbbabbaaabaabbabbbaabbbbbbb +aabbaaabaababbababaaabab +abaaabaaaababbabbbbbbbabbbaaaaaaabbabbaaaaabbbbb +babbbbbbbbaabaaabbbbbaba +aababbaaaaabababbababbbaabbbabaa +abbbbbaaabbbbaabaaaabbbbababbbabbbaabbaa +aabbabbaaabaaabaaaaabbabaabbaabbabbbbbabbaabbbba +baabbbabbabbaababbbbabbb +aaaaaaabaabaaaaabbbbbbbbaaabbabbbabaabababababbb +bbabbbabbabaaaabbaabbbabaaaabbbabaabbabbbbabbabbabbbaabbbaabaabaaababaaa +bbaabaabaabbaaaaabaabaaaaabaabbbbababbaa +bbbababbabaaaaabbbbabbab +abbbabbbaabbbaabbbbbabbababaaabbabbbbbaabbaabbbbabbababbabbbbbbb +babbabbaaababbabbbbabbbaaaabaaababbaabaaabababab +bbabaaaabbbabbbaababbabbaababbaa +abbbbabbabbaaaaaaaababaa +bbbababbabbaaabbaabbabbbbbbabbbbaaaabbaa +abbabbbbbbbaababbaabaabbbbabababbaaaaaaabbbbbababbabaabb +aaaaaababaaabbaaabaaaabb +babbababbabbbaaababbbabbbbbabaab +aaabaaabbabaabbbbababaabaabbbbbaaabababb +aabbbbbaabbbbabbbbbbababaaaaabbaabbabbabbaaabbbbbbabbabb +abbabaaababaabbaaabbaaabbaaaababbbbbbbba +bbbbbbabababababbbabbbabbaaaaabbabaaaabaabaaaababababbaa +abbaabaaaabbabbbabaababaababaabbbbbbbaba +abbabbbbbabbaababbbaabaa +abbaababbababaabbbaaabbaababbbaaabaaabaabbaaabbb +bababaabaaaababbbbaaaaaaaaaaabab +bbbbabbbbaabbabababbabbb +abbaaaabaaaaaabaabaaabaaabbbbaaabbabaaba +bababbbbaaaaaababaabbabbbbaabbab +abbaaabbababaabaabaabbab +aabaaaabaabbabbabbbababa +aaaaabbabbbbbbaaaaabbabaaaaaaaaaabbbbabbaabbabbabbabbbaaaaabaabb +bbbbbaaaabababbababbbaabbabbbbaaaabaabaabaabaaababbaabababbabbbb +abaabaabaabbbbbbaaaaabab +aabbabaaababababbbbaabbaabbbbbaabbabbaabaabaaabbbaabbbaa +abaaaaaaabbaababbbbbbabbbbaabbab +babbabaabaaabbbbabbabbaa +aabaaaabababaabaaabbaabbabbbabababbbbbbb +aabbaaaaaaabaaaaabbbbabbbaabbbababbaaababbaaababbbaabbbb +aaabbbbabbbbbbbbbbaaabab +aabbbabbbaabaabbaaaaaababbabbbbbbbbaabbb +bbbababbbababaabaabababb +aabaabaaaaaabbabbaabbaabaaababab +babbbaababaaabbaabbaaabbbbbababa +baabbaabbbaaaaaaaaaabbabbabbbaabbabaaabbbbaabbbbbbbaabaaaabaaabbabbabbaa +abbaababbabaaaaababbbaba +bbabababaaaaabaababaaaba +aaaaaababaaaaabbaabbaaabaaaaababababbaba +babbbbbbaabbaaaabbbbaabb +ababaabbbbaabbbaababbbbb +bbbabbbaaaabbaabbabbbbaa +aabababaabbaaabbabaaaaba +baabaaabaabbabbabbbbbaaa +bbbbbbbbbbbabbaabbabbbbabaabbaab +babbaabaaabaabaaabaabbbabbabbbaa +ababbbbaaaaaabbaabbaaaabbbaababaabbabbabbbbabbabaaaaababbaaabaab +aaaabbabbaaabbabababababbaababaa +aaabaaabbabbaaaaaaabaaaabbbbbbbaaaabaabababbbabbabaaaababbbbabaa +babaaaaaabbaabbbbbababaababababb +bbabbbabbbaabaaaabaaabbabbbbbbba +abaabaaaaabaabaaababaabaababbabbbbababbb +bbaabababbbaababaaabbbbaabaaaaaaabaaabbb +aabaabbaabbbbbaabaaaaaabbaabbababbaaabbaaabbabab +baabaabbaaaaaaabbaaaabab +baaabbababbabbbbaabbabab +aabbbbbbbaabbababaabababbabababbababbaaa +bbabbbbbbaabbabbabaaaaaabbbbaabb +aabbaaaaaabbaaaaaababbbb +bbbbabbababbabaaababbbbaabaaaaba +bbbbbbaaababaabaabbbbaababbbbbabbababbaa +aaaabbbaaababababbbaaabaabaaabbbbabaaaabaabbbaaa +bbabbbabbbbbbbbbababaabaabbbabaabbaababb +aababababbabaaaaababaaaa +babbaabbbaaaababbbaabaaababbabaaaabaabaaabbaabbabbabbbbbabbbbbab +aaabbabbaaaaabbaaabbbaabaaabaabb +abbbaababbbababbaabbbbbbababbbab +bbbabaabbaaaaaabbbbbbaababbaaabaabbabbbbaaaabbaa +aaabaaabababbaabababaaab +bbbbaabaaabbbaabaababbabaabaaaabaaaabbaaaabaaabb +aaaaaaaababaaaaababbbaabaaaaabbababbbbba +abbababbbbbaaaababbaaababaaabaababbabaaabbbbbabaababbabbaaabbabaabaabaab +aaabaaaabbabaaaaababaabaabbaaaaaaababbabbababaaa +baabbabbabababababbabbbbbabbabbb +abaaabbaabbbaababbbbaaabbbbbbabbaabaababbbbaaaba +ababbaabaabbabbababaaaabbaaaabbabbaabaababbbaabbbabbbbabbbbbaabb +baabbbabaabaabbaabbbbaaa +abababaaaaabaaaabbbbbabbbbaababb +ababababbaaabbabababaabbabbaabbbbaaabbababbbbbbb +abaaabbabbaabbbabbaabababbaaabbb +babbabaabaaababababbbbaabaaaaaabababbbaabaabaaba +babaaaaaababaabbabaabaabababaabbbbbbabbbaabbaababaababbaaababbbbbbbababa +baabaabbaabaaabaaabbaabbabbabbabbbaaaaaaabbbabab +bbbaabbababbaaaabbaaabbb +aabaabaabbbbaaababbabaaaababbabbbbbabbbaabaaabbbbbaaabbbaababaab +aaababbbbaababbbbabbaabbabbabaababaababb +bbababaabbbbabbaaabbabbbababababaabbaaabababaaaa +bababaababbaaabbaaaabbaa +abbbaabaaabaabbbaabbbababbbbabbaabaabaaaaabbbabaaaaaabbb +aabaabbabbabbbbbbbaaaaab +bbbabbabbbbaabbbabbbabab +bbaaabbaabaaaaaabbaaabbb +aaaaabaabbabaaaababbbabb +aaaaaaaaabbabbbbbbabbbbbaababbaa +bbbbbbabbbbbabbbabaaabab +abaabbbaabaababaaaaaaaababaaaababbbbaaaa +babbbaabbabaaabbbaabbaabbbbabaaaaaabaaaabbbbababbbaabbbbbbbbbaab +aabbbaabaaaabbbbaaababbabababaabbbbbbbbbbbbababbbbbbaaaaabaaabbbaababaaabbaaaaabbbbaabaa +aaaababbaabbabaaabbabbbaaabbaabbbbabbbbaabbabbaa +bbaabbaabbbaaaaaaabaaabb +babaabbbababaabaabaaaaaaababbabbababaabbabbbbaba +aaabbabababaaaaabbabaaaaaaaaaaabbbbbaabaaaabbbabbbbbbaab +aaaaaaaaababbaabaababbaa +bbabaaaabbaaaaaaaabbbbbbaabaaaaa +abbabaaaabababaabaabababbaaabaab +abababbbaababbabbbbbbbbbabbbbabbaababbabbbaabbabbbabbbaabababbab +babbbbaaabaabbbaaaabbaaa +bbbbbbaabbaabaaaabbaaabbbbbabbbbbbbabaab +babbaabaabbabbabbaababaa +abbaabbabaabbaaaabaaaabb +babaaaabbabbbbbbaaaabbaabbbabbababbbbaba