From 7b0996cd957c67ec671dbc6f06a17249374c5af0 Mon Sep 17 00:00:00 2001 From: dobiadi Date: Fri, 20 Dec 2024 18:27:31 +0100 Subject: [PATCH] Day19 --- day19/c/day19 | Bin 0 -> 16384 bytes day19/c/day19.c | 262 ++++++++++++++++++++++++++++++ day19/input.txt | 402 +++++++++++++++++++++++++++++++++++++++++++++++ day19/sample.txt | 10 ++ 4 files changed, 674 insertions(+) create mode 100755 day19/c/day19 create mode 100644 day19/c/day19.c create mode 100644 day19/input.txt create mode 100644 day19/sample.txt diff --git a/day19/c/day19 b/day19/c/day19 new file mode 100755 index 0000000000000000000000000000000000000000..fb8c68b9c6bc2edb57c08ba06eb5b3818afe2ebb GIT binary patch literal 16384 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 L$CNyQJe2)6LE%sU literal 0 HcmV?d00001 diff --git a/day19/c/day19.c b/day19/c/day19.c new file mode 100644 index 0000000..aa30a90 --- /dev/null +++ b/day19/c/day19.c @@ -0,0 +1,262 @@ +#include +#include +#include +#include +#include + +#define CHARS_MAX 4*1024 +#define MAX_PATTERNS 1024 +#define MAX_PATTERN_ELEMENTS 1024 +#define MAX_DESIGNS 1024 +#define MAX_DESIGN_ELEMENTS 1024 +#define COLOR_COUNT 5 + +#define cti(a) ((a) == 'w' ? 0 : (((a) == 'u' ? 1 : ((a) == 'b' ? 2 : ((a) == 'r' ? 3 : 4))))) + +typedef struct sequence { + char *colors; + int count; +} sequence_t; + +typedef struct node { + struct node *children[COLOR_COUNT]; + uint64_t variants; + char key; + uint8_t is_leaf; +} node_t; + +node_t* create_node() { + node_t *node = calloc(1, sizeof(node[0])); + return node; +} + +node_t* search(node_t* root, char* word, int len) { + node_t* node = root; + for (int i = 0; i < len; i++) { + if (node->children[cti(word[i])] == NULL) { + return NULL; + } + node = node->children[cti(word[i])]; + } + return node; +} + +void insert(node_t* root, char* word, int len, uint64_t variants) { + node_t* node = root; + for (int i = 0; i < len; i++) { + if (node->children[cti(word[i])] == NULL) { + node->children[cti(word[i])] = create_node(); + } + node = node->children[cti(word[i])]; + } + node->variants = variants; + node->is_leaf = 1; +} + +void free_node(node_t* node) { + for (int i = 0; i < COLOR_COUNT; i++) { + if (node->children[i] != NULL) { + free_node(node->children[i]); + } + } + + free(node); +} + +int possible(sequence_t design, node_t *pattern_trie); +uint64_t possible_variants(sequence_t design, node_t* pattern_trie, node_t* variant_trie); + +int main() { + char *p, *buf, c; + + buf = calloc(CHARS_MAX, sizeof(char)); + p = buf; + + sequence_t *designs = calloc(MAX_DESIGNS, sizeof(designs[0])); + for (int i = 0; i < MAX_DESIGNS; i++) { + designs[i].colors = calloc(MAX_DESIGN_ELEMENTS, sizeof(designs[0].colors[0])); + } + int design_count = 0; + + sequence_t *patterns = calloc(MAX_PATTERNS, sizeof(patterns[0])); + for (int i = 0; i < MAX_PATTERNS; i++) { + patterns[i].colors = calloc(MAX_PATTERN_ELEMENTS, sizeof(patterns[0].colors[0])); + } + int pattern_count = 0; + + int reading_available_patterns = 1; + + while ((c = getchar()) != EOF) { + if (reading_available_patterns) { + *p++ = c; + if (c != '\n') { + continue; + } + if (buf[0] == '\n') { + reading_available_patterns = 0; + continue; + } + + char *q = p; + p = buf; + + do { + while (*p != '\n' && *p != ',') { + patterns[pattern_count].colors[patterns[pattern_count].count++] = *p; + p++; + } + pattern_count++; + p += 2; + } while (p < q); + + memset(buf, 0, CHARS_MAX); + p = buf; + } else { + if (c == '\n') { + design_count++; + continue; + } + designs[design_count].colors[designs[design_count].count++] = c; + } + } + + uint32_t shortest_pattern = UINT32_MAX, longest_pattern = 0; + for (int i = 0; i < pattern_count; i++) { + if (patterns[i].count < shortest_pattern) { + shortest_pattern = patterns[i].count; + } + if (patterns[i].count > longest_pattern) { + longest_pattern = patterns[i].count; + } + } + + node_t *pattern_trie = calloc(1, sizeof(pattern_trie[0])); + + for (int i = 0; i < pattern_count; i++) { + sequence_t current_sequence = { 0 }; + current_sequence.colors = calloc(MAX_DESIGN_ELEMENTS, sizeof(current_sequence.colors[0])); + insert(pattern_trie, patterns[i].colors, patterns[i].count, 0); + free(current_sequence.colors); + } + + int part1 = 0; + uint64_t part2 = 0; + // Try to build each design out of the available patterns +#pragma omp parallel for + for (int i = 0; i < design_count; i++) { + sequence_t current_sequence = { 0 }; + current_sequence.colors = calloc(MAX_DESIGN_ELEMENTS, sizeof(current_sequence.colors[0])); + + if (possible(designs[i], pattern_trie)) +#pragma omp critical + { + part1++; + } + + free(current_sequence.colors); + } + + node_t *variant_trie = calloc(1, sizeof(variant_trie[0])); + + for (int i = 0; i < design_count; i++) { + sequence_t current_sequence = { 0 }; + current_sequence.colors = calloc(MAX_DESIGN_ELEMENTS, sizeof(current_sequence.colors[0])); + + part2 += possible_variants(designs[i], pattern_trie, variant_trie); + + free(current_sequence.colors); + } + + free(buf); + for (int i = 0; i < MAX_DESIGNS; i++) { + free(designs[i].colors); + } + free(designs); + for (int i = 0; i < MAX_PATTERNS; i++) { + free(patterns[i].colors); + } + free(patterns); + free_node(pattern_trie); + free_node(variant_trie); + + printf("%i\n", part1); + printf("%lu\n", part2); +} + +int possible(sequence_t design, node_t *pattern_trie) { + node_t *node = search(pattern_trie, design.colors, design.count); + + if (node != NULL) { + return 1; + } + + for (int i = 1; i <= design.count; i++) { + char *pattern = calloc(i, sizeof(pattern[0])); + memcpy(pattern, design.colors, i*sizeof(pattern[0])); + node_t *node = search(pattern_trie, pattern, i); + + free(pattern); + + if (node == NULL || node->is_leaf == 0) { + continue; + } + + sequence_t subdesign = { 0 }; + subdesign.count = design.count - i; + subdesign.colors = calloc(subdesign.count, sizeof(subdesign.colors[0])); + memcpy(subdesign.colors, design.colors + i, subdesign.count*sizeof(subdesign.colors[0])); + + int good = possible(subdesign, pattern_trie); + free(subdesign.colors); + if (good) { + return 1; + } + } + + return 0; +} + +uint64_t possible_variants(sequence_t design, node_t* pattern_trie, node_t* variant_trie) { + if (design.count == 0) { + return 1; + } + char *pattern = calloc(design.count+1, sizeof(pattern[0])); + memcpy(pattern, design.colors, (design.count+1)*sizeof(pattern[0])); + pattern[design.count] = '\0'; + + node_t *node = search(variant_trie, design.colors, design.count); + + // We already know the answer + if (node != NULL && node->is_leaf) { + char *pattern = calloc(design.count+1, sizeof(pattern[0])); + memcpy(pattern, design.colors, (design.count+1)*sizeof(pattern[0])); + pattern[design.count] = '\0'; + return node->variants; + } + + uint64_t count = 0; + // Try all possible patterns + for (int i = 1; i <= design.count; i++) { + char *pattern = calloc(i+1, sizeof(pattern[0])); + memcpy(pattern, design.colors, (i+1)*sizeof(pattern[0])); + node_t *node = search(pattern_trie, pattern, i); + pattern[i] = '\0'; + + if (node == NULL || node->is_leaf == 0) { + continue; + } + free(pattern); + + sequence_t subdesign = { 0 }; + subdesign.count = design.count - i; + subdesign.colors = calloc(subdesign.count, sizeof(subdesign.colors[0])); + memcpy(subdesign.colors, design.colors + i, subdesign.count*sizeof(subdesign.colors[0])); + + count += possible_variants(subdesign, pattern_trie, variant_trie); + free(subdesign.colors); + } + + insert(variant_trie, design.colors, design.count, count); + + return count; +} diff --git a/day19/input.txt b/day19/input.txt new file mode 100644 index 0000000..2f358fb --- /dev/null +++ b/day19/input.txt @@ -0,0 +1,402 @@ +uurgw, burbgur, rwgbrg, ubburu, rgr, wug, bbwrg, gbbr, ugwuu, ugu, wwrgwwub, rwurr, uggg, rwb, bwwub, gbb, rbwuw, u, guwrr, wbgw, gbrwbwb, gbrgwu, ubrrwuru, wrwur, rru, uuwgbbug, bwu, bwgggrgb, brbgg, bbgr, wrugg, gbwb, rwuw, wuwb, gwb, rgwr, bwrug, wrrb, ubru, wgr, wuuwgb, wgbbrb, uubgr, rrw, bggwuu, wrgb, urr, urbg, rwggbg, wrw, ruwub, uub, rgwgrgb, bubwr, wrg, rrwrrrbw, gu, rgb, bbr, bgb, burrrbr, rbu, gbbg, rwrwuw, wwgw, ruuu, wru, rur, rrwg, ggrb, ggb, bbw, wgub, ww, uugw, ggbbrwr, ubbgwg, uwwubr, bgurbb, buwgbw, uw, bubr, wgubwr, guw, rr, ubr, uww, uwr, ru, bub, uggbubw, bb, rguwu, grbgw, wrgr, gbwwrb, gugg, rrggbrub, uuu, bwb, brb, wrrwr, brww, ruw, rgu, wbguwgu, gbrguww, gbg, buw, uwgr, bwru, bwg, wwwb, grgg, ubg, ugr, gg, rurrb, w, uugg, rbw, gurbbw, rugrrg, gbug, wwu, gwwgr, wrr, wgwrbr, guruw, urwgr, ugruw, rg, gwuw, ugrwubrb, bgwrw, rbur, wgw, brbrub, gwgwgu, rrurbwu, bgr, ugbwwuub, rgrrubuw, bwr, wrru, wrub, gwbu, wbbwgbr, uu, wbubb, bwurwbr, wb, uguwu, bbgb, wruu, ur, ggwb, uug, rwwuw, wuuubwr, ggu, gwwg, gw, rgrg, bggu, rbg, wbu, uwu, ggbbgg, rwgrr, urrw, ruu, bgg, gbrug, brwr, bg, gwwr, brgbw, uwg, wbrub, gbw, ggw, rwguw, gbbguwwg, bgrubu, gug, gb, gwu, bbuu, wbbr, wgg, ggggg, gbru, ugggrw, ggwu, rrr, wbgrg, ruugwb, wu, ruru, uwwgg, brbru, uwbbguw, ubuu, ubwbrg, uwwub, ugbubb, bgggw, rubwrrg, br, ub, ggr, wgwgr, ggbr, bru, gwg, gruw, rb, bgug, buugg, grgwgbg, bgu, wuur, gbuubg, rruwg, urbb, brw, wbgbbbg, rwu, wwr, gwr, wur, ubuw, gbgwbu, wg, wrb, rug, rbwwwgw, bbww, wwbbr, ugrb, bgub, brwgr, wgrbwrbb, gbrw, uubw, rguug, uubu, urw, rbbw, gur, wgb, rrbgr, ubruwu, rggr, rugbgu, urg, rwbww, ububwr, urggb, ruubu, rbgr, wgrrwbb, rbrb, uwwrur, ruwbgwb, wuwgr, gww, wuu, gwgwgr, bgwb, ggubgu, wuwwwub, ugb, uuwbrgr, bggbbwu, wwbwgruu, wbgubb, uuwgb, rbwg, rw, uwuugrr, wguwgb, wgu, wrgg, bwwr, brrwg, gurgu, ruwgu, wbb, gwgrrwrr, bwubbg, ugrguru, grr, bbg, ug, ubwruwu, brgbwrgu, ggbuwru, wuugwu, urwg, bubrwb, gbub, wgbw, ubrubbw, ruwwu, rbrgb, wbbrgg, ubugw, gurb, gub, wwrggrwr, wubgur, gwbww, wwwrwgr, wuw, ubbwwur, grw, wbr, wwg, buwgw, ugbug, brg, brubwbw, buubggg, ubu, urgbw, rwbubw, grg, bubu, gbugw, ubwbubb, uuguw, wrugr, uggb, wugu, rbrrg, bbb, rgw, urwwrb, gurggub, uwbb, uwgg, rbrgu, gbr, ruwur, wwrgu, wub, bgw, ubwb, rwg, urguw, brr, rwr, bwgrwbrb, wbwrbbrg, wwug, buur, wuwwr, rbb, gwug, grwrgub, uwrrbr, gwrw, ubw, ruuub, bgrrrwwu, rub, rgbr, ugw, rbrggr, ubb, gggr, brggrb, bbbw, gugguwb, rbwub, gr, rww, wbgb, uru, ggg, wbg, rgug, ugruugw, bww, urru, bubb, bwrg, guu, rrgrrg, gubrgg, rggwwrgb, bwgrbr, bbgbgg, wwrgw, uur, bgruwu, ruwbrrb, rrww, bbrwgb, brrw, www, rbr, grb, uwb, gru, wubgb, bgwug, uwgwg, ubgruw, g, rwuugr, brrb, uugggb, grrb, urb, uuw, urwgg, gwbr, gbu, ggrwgu, bwbbwgb, wbw, bgwbgb, r, buu, brrg, ggubg, grrgbur, bgbwbg, wgbb, bwburb, guuggu, rggrwrw, wrwrbwwg, wwrw, uugbr, wr, rrb, rwrww, urug, ggrgg, uurrr, bur, ugg, ruwbwg + +ggbgrrgrbwrbuwwgwgbwbbuwrubugurwbbwubbuwgrgurwwgrggbg +grbwbugrurrrwrwurguuubbubgwuugrwurwrbbbgrgu +bugwbgrrrburbwwgwbugguuggbwgrrwgbrbgbuwrgguwubwwbwwrrwrrgrur +ruubrbrbguwgguwurrubwbrwuwbrubwguggbgbrbwurrugrr +uubwbbugurbrrgwuwwguruurbwwrgurrubwwuugbuuuu +bugrbbrrugwrbwgwrbugwruugrwuwwrggrwrwugwguurgwrwgw +bugrrrgggugwwugwrbrurggbwwwbgruwrbubrubbwwbwwwubru +rgurbgwruwbugbgwbrbguwggbggbggwurgguwrgrgubwgwu +grwwubgwgubwrubwgrrbwwugrbbgbgbwurgwgrbbwrgburur +gurbrggubwrwwuurbwrbgrurgwwgubwwubwbbuuwbgbrgurbbbrug +gbuuruuuwbwwwwbrurugbbbwuurrurggwwbwgwbuwgbwruwbgu +ggwugbggwrwwrggrwrgwrwwruurbgbgwuuuurwgbbuwrwgbrug +bugbbwubrugbbrgbwrguurrbbgbuubwwbubuubwrww +ggubuuwuubbwgrwururwbgwrbbgwwgwrbbgwgrurwbgbrwbb +rwgurbbbgrrbwwuwrrbwbgbburuwuuurrrbguwrrrrwbbgggbb +ubgbugugwguwrbbuwgrrgbbrrbwuwrggggwuurwwwgurgbru +wuwugrgbgwgugrrwwurbuguuwggwuwbwwbgwbgrrbuwbr +wrrrwbwruggrwgubrbgubgguurwubuuwwgrwrrurbruuurrww +bugrbuwwggrrbuurrwbrggwrbrbbuwugbbrgurrgggwggurw +uwbbuwuwrwrbwwggbwbrubrwbbgggrrgbrgbwgrwwwubuguuubwuru +ugburwurugburuuwgugrbrbbbwuugwwrbuwgwugguugruugrgbgrguubwb +brggbuugwubggwbubbuurwrrggggrbbrgggrurwggwb +gggwuwrugrguugwgrguwgwwgguugbrurrwrbwuuwwr +bwrgrwrbguwgwbggwuwubgburgurgbgrbgrgwubbwgbruub +bugwgrrwrrrbguwgrwwrgurbruugguwwgbwgwrwrubwb +wrrubuurgrwrrgrubbgwgugbbbbgguggrwrbguwbgrguwrububwg +ururbwuuuguugubgwgurwwwbbguuubwbwbwwugrwbub +bugrbrugrgbwwgwwgwuubggugwuwbbwrwugurbubruwgbbggwur +ugbuwwbwuwbwbuuwgrbbrbuuuwwwuruggwgwgrwgbrug +ruurrgwbgwrwwurggurbgbuugwwubuwwwugbrurwgub +uggubbbwuruwbuuggbbggurbubbbburruruwuugrwuwbgrugggu +buggwbwgurbrbguwbuwgwgrbwuwruwwuwbwwubuugbuwb +gwugrgrwgwwrrrgrwrwrburwuwbbwbrgwbgwbrgguurbbru +ububwbuggrrgbwgbbrubrguuwgguurrugugbbuuubrbrbwbwbbbrgwb +wwwrwbgrwrwwrbugbburrgbuwuwrgrwubguugbwugwggrubwuggu +rgbrbuwuruuuwwugbggrrwgwbugbgwwwrgrgugwbugbrwwwbrrrgggwrrg +bugggwubbbbbgwugbrguuugbbgwuurgwgwbwbbuuu +bugwgwbbbubrrurrrugbrbugugrwrbgurwuwurgwuubuwbuuuru +ubwrguruwrrgbbuugruwgruwbrguurwgrurbuwuwrrrurwrwrgrbwbbu +gguwrbrrwwwggurwwubbgbwbwuggwubggrugbgubuwubrrugb +brrruwuuuruubgururwbrbwuwrgwrbuwurgruurwuubggww +rwuwruwurbgrrgubgruguwrwwwbugbbuuurruguuggu +rugrruggrwrbuubuuwbrbwrrggguugruwrbggbwbbuugbwuugugrbwwrb +bugwgrwrggbgwwruwwwwbrrbrurbruwuuwrubuwurbgrwgwugwguburwurb +bugbbbubrwburubugrggrrwgubuuubuuuuguwggbugguugbrbgurgwuu +rurwbgubgbwgrbwurrbburrurbrrbwgugwuuwuwrubu +rrrwbrwrruruurgwrggbuuubrbruubugbbwuubbgrggruw +bugwuuruuwbwbrwrgwurgwbgubuguwgbwrbwrubuwgwrwb +ubrrruurgwruwgwrbwggrurgbrbuuwrguurbrrbwwbbrbruwrgggbr +bugugwggwbrwbbrgugbwugwwgrgubwuwwrrwbrub +rwubgrgrbrggwugbbrbgbwwgrbwbwuwrgrgwwugrgwg +bwubugrubwugrbwwrwgbggwwgubwrwbrgrbggubuw +ruggwurbgubbbrugwrwubwrbwrrurbguwwgbgwwgwubbwur +urubwuwrguguwwrgwgurgwggbbbruwgbggububbrwbrgb +uwuwgbgbuwubbruwrgburugbrgbugrwurwgwrrrggbrubgguwrugrrgwww +wrbubbwgbgbrwbwbwbgwgrgurggwuwguubwbbwggwgwgwugrrwgwg +ugrbruubrgbgrwgugbgwbugugbrbubrwwuruuwguwrguguwguuwrg +bbguwgwwgubwbwrrwrbrubggruguwwbbrgrgggwgwrrugggwwguwurbugr +gurrggrbruwburruwrbbbbbggrrbwrurbbgbuwgrbbr +ubgrrbubruwbgrgrwwrggwbgrguwwbgburbuugbruurwbu +brgbwuuggbbwbwbwrrwburggbbgwwrwwwguubwwurwgrwuwggwgwrgbr +wgwuggrwwurrbrgwugrbrubrbgurrbbbwgugbwuugugw +bugbwrgbbwbgbuuurbbwrrrwbggrguggbgugurwrggwggrwwggbbrwgrb +brrbrbwbgrbwgggurbuwwgurbrbgwrwguwruwruwgbwwwrrwbugr +rbrrrruwbubgbwwbwgruurgggbbubbwgrgruburbwuwru +uwrrbgwugbggwrburrrbgbururuguwwwwgrrugurwgbbugubbb +rgwrbbbwbwuwbwrrwbbuubububrwbgwbrubgbbwubrgrbuwwbbwgur +uwguggwrggggggrburwwgurgwwgwrgggrurbwrurrr +wgggrwwgbubrurrbbgwrurbbgrwgwrbguuuwugwubruuwurbrggwg +buubugrrrgwbwgubrggrgbbrgwwrugwugugubwggwwgurgubbgu +grbbururwbwwburrwgrwbrgbrbrrruwrrwgbwbrugrbgwrwugggbru +uruubgrrwrwrrurbugwbuwwwwruuwuurbrwbbuwggrbrurwgb +wgbgwrwuwburgurrwuuwguwgurbbrwgruggggurgurguwbbuubug +wgwwbgwgbrwruburugburuwrbbrbuwwguwbbubruuuurgb +wbuugggrgruuguwbbrwrurgwrgbuwgggbbgrruwubbrbww +rwrgrbuwrwgwgwwrwwwbrbwrrruggwguwwgggbuurgrrwwrb +grugurwbwgbgrgbgguruubgbrugbbrbgbrggwgrbrbrru +gugrgwwgruwgugubwwggwwgwrugwurgbwurrbgbbbggw +buggwguwurbgwbbrrgggubbwwrrgrgbrrwwrggbgrbwruuw +gbubrwburbbwuwrbbbwbubwuwwburbgrgrgburrwrwgrwgwgbwbgwug +bugggbwbbuwbugrwgubrggwwwuwrrubwurbrbbgwurwwbbuuubruuuuguruu +brwugugwuggurbrugurgwwwbugbwbgruwgbruburrggww +gwuruururbuubwbrbrubwrbwuwbwgubgbwrggwgguwrbbbwgrbu +bugbbbruuwbrwbgbgrwruuuurgwrwuwwuruubbbrggrgbbguwwggbwwwu +rgugwrbuwbwrubbrwugbwwbbwgbrwwgubggggbrbugrrwbww +rbgbbwbuwbbruubwrgrwuuugbwrubwugwgbbrguwrbwgrbbugubg +bgwuggbrggbbbbrwrgrwuuuwbgbwbrwwwwbwrwrrgbwwgrbugwwub +brbuwwwgwgggrrburwwgbbgwwrwrgguubwwwbugguwrwbwwuguuurg +gggbwrwgbrbrwbrwgrbrbbbugrgbgbrbbwuwurbrburbw +rbbrrugwwwwgrgwbrgrrguwbubwubwururbwbuwgrwggurugrruwbug +grrubrgwuwugrbuwbgwuwrgwuwwwgrburrbuurwgggubguggbwrbrru +bugguguurgwrgggbuugurgugrrbgggbwwbwgwruggwubwgruggb +wwwbgrggbwggrubbwrububwrrurubrgbbbwrurgwguggw +bugruwwrrruggggugwbwwwburwrgwgggrrrgguuuuuwrubwbbuu +grbgguuwruwwbgwrwwbrubrbuuggugbuwuuwbwwubgrrrwbbbwb +bugurbbbwgruugburgggbgwugwgwuwrbbbrgrbgggwb +rbbbguuubrubgruubwgrwuuuwwbwrrugwburugbuwgubwg +bbuwgbugrrrguwgrugguwwbbwruuburwgbwwrbwbwburgrwggbrgrrw +wbwruruwgrubwrgwwgurbuwrbruwgrubgggrwguurwrbbwu +brwwrrbguwrbwwrgbuwbuwuubgbggurguwuguwbgguwrwwgubrrbgrrbw +bugbbrwbbgrgguuwbgrbgwwrubgwbbwrrwggurgbubbuwbwgwugg +wrbuuububbbrwwwwbgrgwuwugwbruugbggbbwgrgurwgruwwruwwgr +bgggrwrbwgubgurbrrwrrguugwwgwbuubwwrrgggbrwrbgbubgrwuru +buugrggbrbwgbggbbbgrrwwugburbbgbrrbrbuuwbuwwbwgrrwrubuwwgw +wurbuurwwbrbwburugggbwwugrrurrwrrwgrbruwrgruuw +guubuwwbbbuwrugbwwuubrbrgwgruwguggbrurrurrrwurr +gwubrgrbgbrwbgwuwwruugrbbbwurwuwwrbwrrwbruuwbr +urrugrrggurwgbgrbgruwrwwuruwwuubrwuurgubwugg +uwrwwbuuubrgugwbwuwgbggrurubbrrgwubrwbbrbrb +bugggbruwwgurrrgwwbrrgbrrbuwbugrbbugbwgrruwubuwwwbwrbrrbgbgg +bugbgrbguurugwwbruugbggbbwuwbrruuwbrrgwggwurwgur +ugwruwbwbwwgbrwbuubrrwgrruuguuwgbrburbwuubrbbwbuwr +uwuguugwbguwbwwugbrbwrrgbuwggrbwurgrwwbrbr +bugrubrugbgwwrrbrubrurgrgwurbruwrggbrwuwwurwrwuguu +urrugwbrwurburgwubuwwuwbbbguwgubrbugrruuwwruugbbwrb +bwuurbwuuubwubrwbugrwgruubwggubrrbwgwubrrrgbburrrwg +wwwrrgugburubbuwrbggwrwrrrrurwgwbuubrbrguuurrwurrwggrwrb +wgrrrbuuwrwwuwbguurburgbbgbruwbuuubwwbbrbgubbbwbubruuguw +gwwgbgwrrrgrrrwuwuuwubuwurrruuwwuwuwgrgrgwbuwgubgbgubuu +uuurrgurrwrrwrrwrgwgrbgugugbbwuwubbrwrubrgbwbgbuuwubbrwwb +bugwwgrbuwgbwbrubuuwuwrgrwgrwruggwwurwbwrw +rrgwubrrwbbgrbbubbbggbgbwuguwurgwwrguwuwburww +buwgbwbbwwggbrgbgguwwurrbwwwwgbburubwguwwrr +ubbubwgugbuugrugwrwuurgubrbrgbrwgrwwgrbwbwbbwurgubbbbbrgw +ubbgguwbgrurrrgbwrbwuguwgbbuuuwurrgubwgwuggu +gwgwggwrwbwggggggurrubwggggwwbwuugbggbwrrwug +rgwurbbbwuguugubruuuggrgwwuugrubruruwbgwgrbbw +rbwgwrgruruugbrrbbrbuwuugrwuguwrwuuugububwg +gwbuububugrguwbwgubwbubbrrrurwwurugwgbgurwrbguuwggrrrubbgb +rubrgurrbbbwgwbwrubbgbbuwrwruugrwbbgrrgwwwgwruur +grgrgbggwruubuguwuugugubgwgbwrbguggbwrrwrgbrubwwurgugb +rburbrbwbgrurrggrwggruuwgwbggbwwbgrbuubbgububgrwgrugwru +ubrrrwrggrugwgubrwgwggurwrbgrrwugrggrgrwwugubgruwubgr +bugwgubgurbgbgwrbubrgbguwgugwburbrurgwrrbwubwgbwrww +bugwugwbwuwwwurbwuurugwubwurgbbgggrgurbbwgrwwwwr +wguwrbwbuwubgugwuuwrwubgruugugbgbugbbwbrbuwbrgwr +uwrugubwbwwbwrburwrurugurbwwbrugwbgbugubgbrguwwrrruubub +urrbrwwwwwuubrggwbbbbuuwgwguugbwrrgbgwugbwgubr +wruguwuggrguwbgbgwbwgugrggbwgbbbuurrwwbuugwgbbguurubruu +rrwwwuugwubruwbwbrubguuwruugwuguubwbwurrrugruuugruw +wubugurwrgrurwgbbgbburgwbggurwguubbrbugurugrguuggg +bugrggurburggrwrbuubbubbgrwwgwgguwrubuugbrurrwbw +gggurugggggbuwgwguwgwgrwgbwbgurbwwrbugbwwuw +wrwurwubwgrgbgugrbwwburwguubbbgwburruggbwgwbwgrur +bgurgugrrwugggubwgwwwwggwrrbwbggrwurgubrrruwwbwbgugrubugu +wbuwwrwbgbgwrwbbbgrgwugrgguuurwgrbrrbbbwrrwrrugggbruwwb +urrwwuruwurgwugbuggrwbwugwbbbruwrgugrwwbrrbrrwwgrwwr +wbwwwrwuurrgrrgrguuubwwgugggguwbgbrrbgbbrwrbwuwruwggubrwr +buwrrwrrwrubwrwwgwrrugbbugbubbbuwrrbrgbubggrwgwgwruwbub +rgruwbrwbugrrbgrruugwrwbwwgguubrrrwrururwurrurwwbbburuwu +grburuubguwbuwbbgrwgrwrrubwuuuuwwrggrwwgwbbbwgrbwbg +rugrgguubgbwugwwburrubrwrwgbrgwrgbgrrgrwwwuwgrbg +bugwwwrwwwgwuwbgggbrbgurgurwwgwbbgbgwwguwubwubbbguu +bwubugwbrgbuuwwuwrbbbwuwguwrggrguururbrgubwrrb +gwuurbbgrguwwbwgbwgburwwurbbgrrbbguwrwbubrrwuru +ugruguubruugbggbrwuguruuguwwrurggrgubugrwwgbbbugwrbu +bugubburwbuuwwbubbrwgbwrrbgggbrubbbguwwruwu +ugurwgbuggbugruwbggrrrwrrrbwbrbubbbbuwruwrbwwrrrbwbg +wrgubrbwwgbubuwuurggrbruwrrwrgggwuubbuuruurbbbwugub +ubrurbwrwrrgrrrrwgrrbbuurbbguuwrwururrgwbg +gugbwwuwuuwurubbwuguuuwubgbgwrgrbbguurwruwbrwugwgugwrrruw +rrubbrwwrwggwwrwwwbbbgurruwggwuurggwgbrrguwwwbrrrwrggwwwu +bugrwrgbbwurubugbuubruuugrwubrbubgugrurw +urguwrrbgbbwbwwgrwuwbbuwwubrrrgrwrwbrrrruurrgrrruwuugu +rwugrgbbggururrbbuuubrrgrgggrwuwbrgrwggwgwbuwrurwbug +bugrgbwbgrruurrwgwgbwgwwuuwgrbwbbbuubgrwuwgrgwrgur +wuuwwwrgubbburrrrugrwugubwburwrugbuwuwugbgwggggwbrugbuwwg +rguuurwbgbrubbbuwwbrbbggbburubururbbwwbbruurrgwbrwgwggb +brggrwubuwubrwbgrguwrubburwwgbgbbrwugruubbugwgb +bwrrrguwbbgbwgugbwgggrgbrbuwuguuwrwrwrbwbrbwb +rwbrgwguurguuubrbbgbgubuwuwwbgrggbbwbbwguu +wgrbbruguggrubbwwwurrrwburwrwuwubbwubruwbrgwwubwubwugr +bugrrwurrurwurrbbgrwwrgwwubuwurrbuwwgbwuwubrwbbubbgu +wbbwwgburuwbwgbwwrugwgwwwrrbrrggwrbbugwgub +wrbgbgrugrurwrwubbgrbgurgrbgrgggubuubwwwwgbbwu +wwrruwgubggbwuggbwrugggrbwwuwwrbururbuubbbuuubbr +bbrbbuubgbrbbgrburrwwggrrrurbuwggruugwrrugguruwurbbr +rrbrbwuwbbuwbuubwubbuuugubrubbruurbrggggwugrbbgurbgw +rbrugrbrbwwrbrgwubgbbrwubgwbbbbrgggwugwugwbb +bugwwburwurbugwguwrrrgbbgrrgbgrgurwwurgwwuwggrbrw +buwwwggbugrgugbggbuwbwwurrbwwbbuwuggggbbguug +rrrwbgrbuwuruwbuwbgrwbrbbuuwwruurwggbrgbwwggwgrwrrbgrwgr +rrrugrwuwwrbwgwwrwrubbbwuugbguguwggbrbrwbr +bugugubbggurwwgrrwbuwrggwbgwurbbwrgugubgbugrwrgwgruwugggbrb +buguuwwubbugbwbugggrwbgruuubrrgbuwbwuwrgbwbbwguburwrg +bugwgbgguwugubbrgrwrgruwuwwrrbbggrwwbggwrggb +bugburrrrrubgrgguwwuwrrwbgbwwbbbwubgbbrrru +wgwugrubrggubwwwruubrgbwwggrwubbguwguurrurggr +rruwuwggbbrbwuwwgurrurrwrrbwruguuwbrbrgrrbguwubuwbg +gwbgwgwbrwguwwwwwbubbbwbbbrwubwgggrgugururgrwbbrwbuguubu +bugggubbwggrburwrrggbrubwuubruburbrrggrbgubbrw +rrwubwrgrwgwrbrgbububwbwrrrbwgbruwuuugrgubgwrb +bugbwwuubwwbwwubrbbbrgrrrwubgruwgbgrwgbbbrwbgb +ubbuggrgwrwrggwbbwrrwbrggurgbbbuwbbgurubbwuwruwg +gbwgbgbgwrwbwrbgwuwbbggbrbwgrwrwwurgwguggwuuwubu +bgugbguggrbrwbwggwbbggbrbbrbgbbbugwgwwbgwwwruuuubww +bggrugbrbgggwgwwrwrubwbwuruuggbuuguubggubgwrgbwuubrbrg +bugugggrwrguwrguwggrggbbbwuruuwrbwbuugwgw +gwbugbgwbwwugwruurwgruwwrbbuggwwbugwrugubwgurbugb +urrbgwgubrburgrugurugubuggwuwwbrwwguuuwwruurbbw +buggbrwbwrwwbwgruuuuwrwbwrbgwgwbrwgugggw +wrrwbbgbgrwggbuggrbwwubrwrbuwuuruubbwbrguu +rbwgbrurwuwguubruwubruwwrwguwuwwurggguwburbgu +rggwwwrubrbbrgrurbuggbgwwbrwwwgbwwbgbuugwurbbbrr +urugrrbgwgbrgbrgbgbuwwgrbubrugwbrggggrgrrbguwbuwwruuw +wgugrbwwwurbgwuwubrgrrwbuwrguwwrbgbubrbgwrbwbgwwwu +wbbbuuwwburbgbwwggbbgbrurgbwrwuwuwgrgurgbbubggwbrrggwbbb +wbbwuburwgurgurruwbbrgbrwubuuwrwbbbbwgwggubuwuwubb +gbgbgwrururuggruuuuuurbwbgrwwurggbgggwwurbwuruw +wbrgubgwrruwwgbwrwuwubggugruwurwwbbrggrrgrrwurbwwgwguww +wgwruugrbuguggrubuuurgwrgguuwbbgwrrrbwbgwrrgbrrguurguur +grrwgrwrwgbbrbugbwrbbwburbuurbugwuwbrwbwgrwbwwbggrgwww +wwruwgwuwrwgburbrbuwwggbubbggbugbgbwgururwurrgwbwrbrbbwbrg +bugwwwwwbwgrbwrbbwggbrwgbwubuwwwwwgruurgbgwb +ggwwugruugggbgbwbgbbugwuubwuwwuggugbuuubgbgu +buuuwgbrrwurugwwuuwbgwbuwbbbrwgwgbugbrubbuwwguww +wubwurbwbrrrbubggwrwggwuwubbgbwbrbgbugguguwgggwugugr +bbubrgrwbgwwwwbguruwwwwwgbbruggrbgrrgugrurrggbgrwguuwubwb +ubbwbrubwrbrwurbgrwbgwrrgwrbwwbbgwbgbbruwrwgurubrwbrgbru +wgubbgbgbrbrrgguuubbbwbwgguruwwgrgrgwwurggbgwwruggwrguwwbw +rburwwubguubrgrrrrgrbggruubrrbuggwwrurrbgrguuuwgrrgw +rbruugrrgrggwgwrrrrbubrrrwrbruuwwwguugwubguuruurgrg +bugrbugbrwbugrbbruburugrbugurbubbrwbrruurgurrwgggrrugruwrrrw +rrrrguubrgubbruuubbrwbguwgubwbwwbbbwgrwbrbbwbuwurwguugwwu +buguggrwgwwgrguwgwurbwwwrgwbggwwruuwrbgb +bugubbrrwrurguuuurwgwwrggbbgrrugbrurrgbuugwwwuwbubr +rwbrbuurbgwbbbuurbrbbrbubrbrwrbrbbburbrwuuurgw +uwgwruggrubgwbrwrwgurwuwrwrgwuguubbruwwugbbbg +rwwrgrbgbwwwurbwruuuugbrbggugugrwubrbwugwubwu +bugbbububbuubugwbuuwwurrwbwgrwrrrgggruwuugwuwururugugbbwbggw +gwgbrugggwgruuwgwwggrwwbbwuwrgguwrrbrbubbbubw +bugwwrgwrrbwgbrubbruwgrubbrwwugrwbwrbbrgbgbbbrgbwwwuwwrrgrb +rwbwgwbwuugbbwwrrrrwwbbwrrrrwugwbugugugrgwwwrbbgu +brubuggwuggrbwruubwgrrwgbuurururgugrwurgwbbwbugbgg +wwuuubwurruuwrwwbubgwgurrubwubwbwgrbruguggwgbwwubrwubuwguw +bgwugguubrgurgubgubbwrururuwbwruwwrbbwwgrwgggbrb +rggurbrbrburguwrwwrrwugwgburrrgwbbubwrggwwwuwrgb +buguwgrgrggwgbuugwurgbugwwbbrbgubwwubgwbgwguggwgu +wbuwgubwbbuuuburgurguurggruuwwrbbbwuubgwrwugwwbrwbg +bgbgwwbgrbbwbrwuuuurbuubgruwgwbrwwubwurbuugurrwwuwub +ruwgwwbwrbbrguguwuguuwbguwrggbugbgrgbuggugg +urubrrubgwgbgwgburbbbgbwrbubuuugwwrwuguwrugwwbbr +rwwwggwuwguururrurrggwgbbrwwbwwrwbbrbwrwgw +ugwgbgwrbbggrgggbbgwbbwruguwgurggwbwwrgwrubbwugggwgww +gwwburgwwrwbruurbugwrgwgbbgbgbuguugrgubbugwguwrrrb +rggbwbubwuubugbuubgwurwwgugubwbbgbggrgwbrgbr +bugwuwwgwgurgwwrrrbwuruuggggubgbrrguruwggw +urwrwuugbgrgubrrgubbuwurwbwrbwrwrugrbrrgrburwurgrr +brgrwbubwgrururrrwwbrgubuuuwubwwgwbbugwruwwurrrw +gwbwwurbbgwugwuubggwuuuwggrbrggwgrwurubrggggrwwurggugggbu +bugbwgggwbwuugggbwgrwbrbbbubwwbrgggggbgrurr +bugugrrgugwrbbbggbrwubwwggubbuwurwururgwwrwuwwrgbgbgbug +rrrubrwrwugrugggurbwbbrwwugwruuuuwgrgwurwuwrrrwu +wggrrurgbbwbruurwrggrubrburgrgguwuwuuwbwruwwrugwbbggrggub +buwbrrgwugugburgrruwbgrgrruburbbuubrruwuwuuubwwg +wwwrruurgrgurugurrggggruguuwuurgwrgrbwrrwwgww +bugwwbbrubggwrbrubwbgubrbwuwwbugugbrbgrrrwwug +wbgrwgurrrrwbbuubwgwruuugbugwgbgrrugrrburur +rgbggrugurrwugwrggwwrgbrgwwrwgwugbruurwrbuwgrrgggrgb +wwwwgguwrbrbbgggrggrbrgwgbubwwrrurgubggbrgggb +gbbuwggugwrrbbwbwbrrgguugurrwwuwbbguuwwbrrwbgr +bbuwrububbwwwwgggrrgwwbugwgguuguggwuuwwbwrbbbgwgw +bugrrgbwggrwrubrruwggrwgbbgurwgubgrbwruuggbbbbw +rbbbgubbgggrbbwgbruubrugbgrurrgbrguwgrwugbuuuuuuugbbwrubrb +ugrbrggbwurgbwgbwwbwgwbugwrrwwbrrrwrurugrwurrwgrwgbrwbrb +bwwbugrrbruuwrwrwrbbrbugbbubrurbwwrwrbwwguurbrwurr +wrugbrbggburwuwbrwwubugrgguwrubugwbwrggrwuwrgrgrwuggbgbwr +wburrgbrbbwrbrwuwwuwbrbgbgwgububurrgbuwruguuguwggurbbbr +ubwggwgrwgbbrwuggbgwwbrgrrubuwggwbwrguruwrrgwbbu +bugrbrguuggurugrgbrrurgbgugrbuguuuruwwwr +urrbrwgrgbgwbgggrbwuwggrrrruugbrugbuwwrwguurggbbbg +uwuwuubrurrbrgurgrurbgguuuwgurruuuwrruurbwubww +bugwrwrwubggrwggrubrbgbrurguuugbwubuurwwggbwruggrwggr +ruwgrruwrrwwwgbrubwrbggrburugwbgbrwguwbwwwugrwurwurubg +rrbrgbubrrrwwggwwbbwbgurbgrrrwwuwwurbwwrwugwbrrubru +wbuwgrurbgbururbrwggbgguwwubguurbuubbrbrbug +buuggwgrugrbugwguuurwruuurgrwggrugrrgbwugrrrg +bugbgguurgbwrurrbwgbwgguwwwwrrbrgwrrgubbbugurr +wugrrgrubruubrggugrgrgwbwrrbrrrwbbbwruuurgururrgr +wbgwbguwruwrwwrwbrbuwrgbuurbwuubbrwbwwurbruuurrgwwr +buguwrubuwgwbruburrugruwuburgrrubuwbwrwur +wbwuwwgururwbrurwuurgwbbuwrrrrbbgbgbugrrgwgwwgww +rrguuubburuugugbbwwuwwuwrwrggburrwugrgwrgggrugg +grgwurguugbruubwwbubrrwuruwbuubwbruubbururg +rrgruwbwbwrwgrrrugbwbugrwrguwbgbubwwbrbrrubguurbu +urgurbruggbwrwwgrgrggrrrwruwrurrwrgubbrwbwwrgrwgrwru +rbugrrguwrbrwubgruuwbwgrbwrbbrggggbwgrgwbrrgrwwwbb +rwbugbgugrgwggurguuwrwbwuggwugwguguwruwuggbbwu +bwgbbrbbbbuubrgrbgbwbubwbwgbgbuuuwwuwuwbgwgwbrbgrurwrwbgg +bgrbbwuuwbrrggbwuwwrbggbwwgggugbwggburwrubw +rrrbgrgburwurwgggwwggbbgbgwgugwguuuwuubgwrruw +bugrrbbwgggubwbrwrggubwurbwruwgwuwrbbubrw +ubwrwgwbrgguburwgbguurgwwrrrbggbubbggbrggwbwwwggbgrrbw +uuggbgbgbuubwrbrwwrrwuwbbrugwbbrwwbrbrbuwgruwrr +rwbwbwgrubwurgbrgwgbuburbbugguwrrrrurbbubwgr +rwgubbbugrrbburbbuwgwguguwbgwggbwbuubbuwuwrubuw +gbrbuugbgwbgbbubgbuggwbbrrbgggguuugwbrwuruurrgbwwrbubguw +rrrugbbuurwggbwgrgrugrbgrgbbrubuwbrgwrwgwgwbwgrugbwrb +rgwrwrurgugbbrbubgbuwwwugwrurgwggwbgguruwuurrbuburgrbww +ugbgggubgrrwubugbuwbbgwrrguuuwgubwggrrrgrgg +wbwwggrggwwgwuuwubgwgwuuuuuuwrbrgubrbugbuwrwgrbguburb +bugbwwruurrwrbguwwwbrggrguggwbgrggbbwwuwurwuwrgwuwuubuwuw +buggbggrbggrbbrgwrubbbwgbrgwrwbwrbgwwugburgwuubggr +bgugbrbbgruuguuuwrgggrwuwgurbguubgbgrbbggwgbrwbbrrguuwgrgg +uwwbbuubrrggguwbuuwrurggburburruwggrrrgurgbbu +wwbrurrgbwgbubwbgwbgbgbbwbbbugbwgubwggbwwbbgbgrrrbwww +wbgwuurbggwurbrggwrgwwbbbrwbbrruggbwuwbbbgbwubuwbguwwgg +rrrgwrbguurwrrgrwwubwwrbuwggbgrbwugugwbrgbbbbwrubbburg +brbrrwurugururggbwrwurbwwurubrwrgwbbrubwuu +gbuggbubgwurgrrgrbggbuwwgwurbubrwgruuurrrubb +buguugrwwugbuwgubuugwuubbugrggbguurrrwgwwuru +rgwgbggwuruwurububrbbrbbrwrwgrbwrbuurgwugururbuwu +buggbwgggrgbbwuggbggbubggwgbwuwwgbrwbruubbgwrgurww +ggurwggrburgbrugggrggggbbbbwwbubwbgwgbwgwur +bugwuuuuugrgguwwrbbrgurbuggbbbwwwuurgrug +bugrgbgurbwwrrbgugbbbbburgbrrbugugwgwgbrrgbwrbwwgbbgwgbgwgrg +bugwrrgrbwuggubrrruwggrrbrgggbrggrurrgurgrwburwgu +bugugrwubgbgrrguwwugwbbbrugrwguuwbrrggwwrgbw +bugwuwgrrbgurwbbuwgugguwugbbrrubuwrrguwurrrbwbuwbwbuwb +ubrggwubrgbrrrwguuwbrwruwbguburgurrbbuwwrg +ugwuubbbgbwubbbrugbwrubwgwuurrgburgrrbbugurbwu +wugwrgbbrubggbwruguuwgwuugbgwurubbbbggrgrruggbbgwburg +bgrurbbwgrgwurruwggwbgrgurguwuuguwubugwuuwwuwuuggubbg +wubgruuwburuugrggbrrrwwwuwrgrgrggrrrguwbwrwwwgwwbguguwu +gggururbuwwrgrrrgurgwuggwrwggwuguubwbubugbruuww +rrrggbwbrbwbrggruurbburbbgwguugbwrgububurrggbgruuwgbr +uurbugwwgbrrwwgrgbrrbwwrwwrbbbggrrggggrruwgwururrgwbrgwg +gbrgurggrgwbruwwrwuruwbrbbgwbggwwrbrurrbrrbrgrurbbuuurwwrr +uuwbgugrugrrgwbwwgwwrrguuuwrrggwurbgbugbbguwwgugrw +wrbuwrbrwbugwbrgbubgrwgrugbgrwbwwbwggruugugrbbggwgrwrubrg +urubbgrguggwbwgbuurwurgwgwbggbguggbrrrbbbwu +uugwgrbbuggrwuwwrbbwbuwwgruubuuwguwugrgrwurwrbw +grgrbugwubwgwgrgrgrggggbwururwwuurrubbruwubwguuuguugurwwug +bugwguwrrugrrbbrubrrbwwrubrrwurugwgubgru +bburbwbgbwurwuwuurubwwguwbuuwrrggubbrrgugr +urgwwwurrrbwgugbwgwuwwrwugubwbuubgrruwguugugbuurubwg +uwggugwwgbburgwgbbgwwuuruuubggbugugurgubuuu +guwrgwrbrbwgwbbwwrwubwbrurbuuruguwwuugubbggrwwbbuuugg +buuugugugwbwgrbgwwubbubrbrwrrrgwwgwwgurgrrurguuuwrrgbugw +ubugbrgbbgbguugbbuwugguuuuwwbbwgruuuwbrurwbbbbuuuugrwr +rurrruwugwbgbwgbwuburrurugruuugbwbgbrbwugguwuuwwruwwbw +urrbwuwrwrwbwwwwrwrggbrubrbbwgbrrrbgrgrwbrbgb +bwbbbwrrwgbggwwgrurrrruwrgbbwgrrwbugrbbwrbbrgrbbbgu +uugwuwbwgrugrgwuwgurwbrrrbuwburwwwrgwgggwbugwwurbggbubbgu +urgubuwbwwwgugururwrurrggugugbbwbbubbrubbwwbgguur +bgwbgugugburuwrwwwbgrguurrrguuwubbburrwrugrrrgrguwwwgrr +gggrwrruwbrbgwwurbggwgrwgwgguruwwrgrbrwgrbrwrubbuwwwgbu +rrgrbrguwbwubugrbbguggurwgrwgwbgruuugrbggbuuwuuurwuwgrwwrb +rgrgbbbgbrrwbbruguwgubbgrbrubuwgbrwwuuwbrbbguurgg +wgurbwuubrgurbrbgwgrrububuggubuwrugbuugwbrrgbrwrugbruwwbww +wuwgwuwuruurugbuwrbbubggbgubwggbwbrugrggbrwrgr +rrguggwwgwrurrwuubruwwgbbwrwbwwruurgwbugubbuwbwwruruguwub +rugubbuggurrggrgbwbbuuguwbgggwuwgrgwwbuububuuugrurrwgr +rgwgrrwrrwbrggbgbggrgguggubgrrgruwrrbwguwwbuggrubbgbwurbgw +grbwurbgurrbuwwwrgbugurrrrubwuwgrwgurgubwubgrrbu +gurbgrbwbgurwwgrwgrggugrbgbgwggrwggbbbruurwb +bugrwbbgggugwrrbbuuwrbgrwwbbbwuubwwwrrrb +wgwbwuguwwrwgrwgrwbuwbbuwgwruubbbbrgbbrgbwrguwbwgbu +rrgwrbbuurbrrggrgurrbwubugubuurgbgbgrurrbbwbubguuu +ugrgrgubwbbwwugubgrurwwwbwrwubbwguwgguuwgwbugrwrw +wwbwwrrrbbugbrbwwbwruuuugrggggwbrwbgurwbgbbrbgwguub +wbgwgwgwwrrwbubrgbwrbwrrgggrwwuuuwgurwbwburrubwrurrbruwug +bugugwgurgrbuwgbuururwrrruggrbwwrubburwwbuwrg +bugbuburbgwwurrwgrwbrbuurggruuwuuugbuwwbgwurrubrrbbubuwbgrbr +ubwwwuwrgrwwrgrwrrwbwbrbrubuwguwgbbgbruubbrugw +grgrwurgbbwgubbbgrubrurrbbuguuuuuwgbbbgrrwbuwub +wgwgguuggrrrrwbbgubgurbgurbbrgwgrbuwuguwrbwbrubg +wbwwwbgggwrwgrrwgwububgbrgwrwrrbbbbwuuurbwggguruwugbr +wwurwubrbuubbgwgwurrbbgrguwgbbbgwgwrrbugbrurubwruug +bugbguugugbrggububrrbbrbgbwgbbrrggrruguwb +bugwbuwwwrrwwgwurburrruggbbwugrgwbbugrrbbwrgwuurbrbwg +burbugrrwrugubrurwubgwbwwbbrwurwwgwgwgwwrw +ugrbwguuruggbgwgrbgwwggwgrwrgrgwbwrgwburubgwwr +bugrwwubrgrurugbbwwrggubwgwrbbbgugbrrwrrrbwguwwbbgbbwgur +bwrbugggrwwrruggbggwwbguugwguuuwgbbugbbrbrbrrgugwb +rrwrwgbuwwbruggbwrwwburbuguwuuwwrbrrwbbguwbguwrgwb +gwbgruwrgwrguuugbgrwuwrbubwrwuugubbugugurgbrur +uuurwbuubbruurubugrbbbuurrbuwwbuurrbuggggwwwuguugrgbgr +bggguubrbuguubbrbuwrgurbwrwbbbwwuubgbwrrwbubgbgbuugwrgrw +ggurrgrwruwurggwggbwwuggwuubrbwgwgrwuuuwbwgwggruuwrb +grbubrurwggurruubbrbbguurgrgwbugwuwbgrwgwbwrbbwggwubwbwbb +wbbrbwwugwgwgwgrbrwurwwburbggggrrruububrbbwggwbuu +ubgbggbuubuguwwgbbbgbuwuwwuugggbgrwrwrruwbrgg +bugggwuwrugrbugbrubgwuwwubrrgwgwgbugbwwruggrrggbuggbgubrbb +uwwwwubbuwwubrwrrubbbwbwbrubwwrbwwuurrgguuubr +grgwwwwwuuubwuuwgbbugwbwurbgburrgurbbbgrbwggrburugwrwgrg +brurgugggrguggwrwgrrgubuwwguuwbbrbbwwwburb +buubwrrrgrbrggbuwrubbbgwgubrbwguuwuwwrurrbwwuwr +brgwbrwurwgwwbwwuguwbrwwgggwgggrwbruguwrgubrguuuwgurrwb +bugwwuurbuwbbugrwwbwrubgbgwuguuuubwuwwurbgurr +bwbbrbgurbbruggrbubbrbburbbugbbrrwbwbwbrbgbbgbwrrgru +ubwgwrwgbbgbbrggbrugrubwrgrwgrbbuwbbbguwruwggrg +rrgbrrugwurggggwwwrwbwrgruugrwgrbwguwrgggbwwrgwwubgu +gubwruuuugbwguruwwgbbrwuurwrgrwgubbruurggwggbuuuwbbg +gwgrgbgurruugruurrrbugruugbgbuurbrrrgwurwgbwb +wbbrbwguuwbwgbubrbwggrbbbrgbrubwwwbrrbrwugbubgwrgu +bbwwgbbggbbgugggbrwbugwbbugbburgubgrbggbrbwwugr +rgruuuuwgwbgwuuggbgurrwbgrbwuwuwbwwugbbrrrbgrgbbwurugwuw +ubwwgrrwbbuuugrgbuuuruggbbugbrbbgrwuuuguwurggwgr +buggbwrbbgwwwbubwubwbugbuwububgrubbrwgwgguburwbg diff --git a/day19/sample.txt b/day19/sample.txt new file mode 100644 index 0000000..29648be --- /dev/null +++ b/day19/sample.txt @@ -0,0 +1,10 @@ +r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb