diff --git a/aoc/str.h b/aoc/str.h index 3ac5d2b..a217ae2 100644 --- a/aoc/str.h +++ b/aoc/str.h @@ -41,6 +41,7 @@ void str_print(str s); #ifdef STR_IMPLEMENTATION #include +#include str make_str(uint8_t *data, size_t len) { return (str) { .data = data, .len = len }; @@ -108,25 +109,14 @@ bool str_starts_with(str s, str prefix) { if (prefix.len > s.len) { return false; } - for (size_t index = 0; index < prefix.len; ++index) { - if (s.data[index] != prefix.data[index]) { - return false; - } - } - return true; + return memcmp(s.data, prefix.data, prefix.len) == 0; } bool str_ends_with(str s, str suffix) { if (suffix.len > s.len) { return false; } - size_t offset = s.len - suffix.len; - for (size_t index = 0; index < suffix.len; ++index) { - if (s.data[offset + index] != suffix.data[index]) { - return false; - } - } - return true; + return memcmp(s.data + s.len - suffix.len, suffix.data, suffix.len) == 0; } bool str_empty(str s) { diff --git a/day-19/input.txt b/day-19/input.txt new file mode 100644 index 0000000..d5ed485 --- /dev/null +++ b/day-19/input.txt @@ -0,0 +1,402 @@ +rbrr, gbgrgrg, rgurwgb, grb, ggg, grbugw, brwggrw, rbbrub, grguuu, uuub, uw, urug, bru, wwrrb, rbwbb, urw, uwuw, ubg, uugug, wbub, guubr, rru, gwb, wggrg, gubbwww, wrr, wbw, grug, brrr, rgw, urg, gugg, rugwuwb, rwu, rgu, bbu, ubb, gr, wwwggw, ub, uggrb, bbwrru, wuwrww, gbrbwru, uubu, bub, uguub, b, uwgu, brggrr, rruuggrr, buuu, brbgw, wbugb, rbwru, wrgu, bbg, uwbg, ruwg, bgugub, urwrrb, bggugw, bg, rgrrb, guwwu, gbbr, rwb, urrgu, brw, gbrwg, gbgwwrb, grgb, ggug, ugw, wbwwbug, wrbru, uwww, wwuw, wubg, burubw, gwr, wwubu, ubggrr, uru, www, wwr, uwbw, ww, rbbrwbr, rrwgru, gwuwgug, wubwww, gwbbwwb, bwu, ubr, rrguwr, bu, g, wrwbr, ggwb, wbr, uubwbrrg, gubrurwu, ugbg, wrurwbwr, buu, wuwbgrbw, ruw, wwgrw, bbbr, wbg, grrrrbu, wguuggwb, wrrwr, rbrru, bur, wurgwbgw, wgr, burggw, grugug, uugbrg, bgurgrr, urbw, gurur, wggb, rrub, uwgwg, grrug, uuu, gurg, ugugg, rurb, bbb, rrggwwb, brwbb, rrbub, ugb, wwbgg, gbguw, wgwgbb, wgw, brrw, ugbwrg, wgub, uub, bwgrugwb, guwgg, gurw, rrruwr, wgg, bgw, wrub, bubrw, uwrbb, uubugbwg, bwr, ugg, gwrbg, gbg, rbuwr, gububbu, bbw, wggw, rwrww, bbggbr, urgburg, rwbgr, rgr, wbugu, uug, uwg, ubgruurb, r, uu, rrw, uuwgu, gbu, urb, ugwg, bgrgrrg, rub, wubgwbg, brgubr, uuuburb, rbrwgr, wgwur, wbu, buurrgw, uwu, wbgb, rgru, wgggg, gubbr, uubwwg, uurbbggg, bgrwg, wggburr, ubwrg, wu, urbu, wbwrur, urgu, bggub, gbuwbb, uruu, gwwggwu, wugubrbr, bgrb, rgrbrb, guw, brr, rbguu, bgb, rug, gbur, gbb, rbrwbbb, ruuw, wrug, bbrwbgu, wwuwwbr, bgugur, rgg, brbw, wru, burrg, gu, ggwuww, wuw, uurg, wuwwbrwr, bbgbr, wb, ug, rrru, gwbg, ubwrug, rgur, rwg, ggrr, rgbub, uwubub, rwugg, wgbw, wburr, rgbu, ugr, ggwwb, gg, bbrbwgrw, gwu, brgwrwb, bguw, bbwwurr, ruu, ggbbu, ggr, bgwbgr, gru, gguuw, rbg, urbb, grw, wrwubbg, wbuu, ubwuw, gug, rbbr, wwb, buw, gw, buuw, wurgbuu, u, uuw, rwbw, wbbguw, bww, urguuwr, buwb, rugguggb, wwub, wrgubb, wrbr, gubbrw, guugr, ubbu, rwwbrb, bw, uwur, uugugw, bb, grr, wwuu, grrggg, rur, burugrr, ggb, rr, grg, brgw, wbwgu, uruwb, wuu, bwwgwrb, urgg, rrwuru, wurbur, uwb, bwrb, wur, ruwbwug, gb, bbr, uuwguu, ggwgwggw, bgurbb, wrw, rrbu, ubu, wbrgr, ruug, rbrg, rbr, bubwb, wbwgbwb, urugww, wrgbw, wgb, grub, gwrbuu, rbb, rrb, wbb, gguw, ggurrwg, bgwg, uuurw, wrwuww, brg, gbuub, uuur, rwrwu, wgu, rrrw, rbw, bwrbr, gwrgwu, ubbruu, rurrbrg, wwbwb, ubrg, wbbb, brb, rgwgr, gwg, brrgb, rwub, guwburb, buwgbru, ugbug, bwb, wgbwuu, wrbg, rrwugb, guuub, burw, brgwbwb, ubrub, ggbb, wggww, buwwwwuw, gur, ugu, guu, gwrbbrug, wbggu, gbgbuu, gbr, ggub, bbwg, ugwuur, grgr, ubguu, urgw, ru, bgg, wwu, buggg, gbuu, uuwu, rrww, ugrw, urr, rbu, bbugb, rgb, uwrbbu, wrwguu, rw, wwwu, gbbbuguw, wbrwwg, gbbrwrwr, wugw, rrbb, wurg, wgbubg, wug, wwwwg, br, rwbg, ur, rrrggg, gbw, ggu, bwrwb, rrr, rguuww, wuwbgww, bug, wgwru, wgbggw, uww, bwg, ggw, ubw, rrg, wg, uur, uwr, wrb, bwurbg, ugur, rb, gww, ubuu, burr, ggwg, rwr, gwuww, bgbwu, gub, bgu, wwgr, wwgb, bbrug + +wwugguwgrwwbrwubrwrwburubgrwubbbrugbggwrbwrwwrgggg +brwwgggrrubuwubbgbgruwgwguguwgwwugrgbwbgrbbwwuwwruug +gruurgurbugwgwbwuwubrggrgbgguurgrugbuubwgwrguwggwburrrgu +ugbrrgrwgbuggrrwuwwwbwugwwgbbrbuugbwbwbrrggwgruurrguuguw +grgggbwuuggwbbugrburbbbbbbbgwubbruuggubbgrggurg +wrggrurwbubuwwbrbrrurgrrrbuggwgbbgbbwgbwbbrgugruug +ugrrrrwggbbuuubrbggrgurggruurgrburbrgubrwrwgbwwwuugbwwuw +ggwrrwwrbbrrbwrgrwuurrbbwubgugruurbrggrrbr +rrurruguurburuwubwugurrrwgwgubbbwuurbggrwruuwg +gwbgrrggwbgbwrgwurbubgrwubwrgbugurbrbbrbrb +rwburrrbrwggbgwbruuwrwrrurwwuwwbugguwwrurwbwrrbu +uwruuuuwrwrwrrgurrubuwgwgrwbwuubgrwrbugubbbbuwbr +rwwggwwurwwrrrbwrwwwugbrggruwgruggwbwwgguuuuwurbrgbu +rwgbgwbgburuwubrbgrwrwubrrbrgubbwrgwbrbrugbbubbwurgu +ugbbbubgbbuwbwrwgbgbggurbggrwbgubbwuwbbrwgrubbg +wwbwbrggbrburubwgrwgbgrgwuruwrwwrgubwgurrbwrrwurwuurgggwgg +wuwgbwrbbgguwgwurgwbrgbwguwrbwuugubuubuuwgbwrr +ruuwuugwuuggbbwbuurguuwwgbwbgbgwbwwgwwuugugbbwwwruwuubrrgw +wwbgrburbbwurgruwugbrgggrgwwggbbgwgurbbgubugbgwubwg +wrggbbruuwrrbgrbwbuuubrruwgrwrrrgrwgwbbw +rgbugwrgwwurbgwubwruwwbrwggbwruubwbbrrwubrgwurrrrugbgg +buurwgrwgwbbugwgbuwbwurbwbggrugbbbwwbwrbwgrwurwubrgbrbbgu +rwwururugbgubrwubrrggbwwbgbrgrrbbuurbugwbgwuurgbuubrgu +bwgwruwwrbwgrgggrgwbruguwrubbrrgugbrbruwbug +bwwrurburbbwbuubrrwwuwubwrburrwuggrbbuwwggb +gbwuuuruuwguuwwbuwguuuuwgwuuugubbggrbuuuwb +uuwrwrwwbrubgbrrwbrbuuuwrrggbrrgwuugbuurrbbu +wubggwugrugbubgrbwwgbburbuuuwwbbwuuguggruugbuwwwbwrwbww +gggwbuwrugwruurgubrugrrrubbwwguwurbwbrgbwgwwgug +wrgguwwbbgbggubbuugbgrrbrurwuguwguuggwbwwrggww +ubrruwrbuuggwuuwbrwgbguurbwbbgrrwurbbbgrwbubgwubgbrwgbbrb +ugrgrwbrgwgwrrwbrwwugrruwrgrgwrurbbgurrbwwrruruwbbbrbrugu +wbrgrubuugggruwwrwbuwgwgurugurbbgwwuggbwgrugwubr +uugwugbububwrrgwwrrguruwwgwgbgugwgbrrwgrubbrwrrrbgwr +rgwuugbwbwurggurrbrbuwggwwbbgwrbbrugwbggwggwuurg +wgrrrurwgrgbwuwrggrbbgwgurugruwwugbuuruurub +buwgubbgbwwgbwwrrggwwrrbwgwwgrugbbguwwwwgbwuwuuuururgur +rburrbgwwwwgrrurbruwwbwbbwrwgubguwbbubwbgguruggruuugubbwu +grbgurbbgguubrrwbrwwgrwrwwubbubbbugwwgurwgwgrbwww +wrgbggrgrwggwuuwbrgwurgurrbwbbwrbgwuurwgrgw +gbwwubwgrwuguwggbgrgrwwgugbuuwbuuwruwwgbbb +ugrwwrrgwrguwgbbrbguugbbgbgbbbggbrubbbbrbguwwgu +guggrgugguuubwwgruwwuggbugwbwwwururgbwwwrggrgbugubgubg +rrgwrbggggbgwgggubrugrrbgrwwwuggbwwrgurwwuubgwrww +bgbuuwgwgrgwwggrggrbwurguuururwrbbwuuwbwgugbbgwr +bgbbrbgbrugrggrbwgurbgwwbbrurguwrbrwwwwwbbggrwbgrwwwbw +ruwbbgburgrbrbwrrbwwwuwggguruubbbrugbgbbrurbugrubgwgur +ubrgguggrwgrbrgrrbwrrrgrgbrruwgwrurugbgubb +wuggrwwgrgwwwbgwwuubrggwuuwbubgbrgbuwurubbwbuwwbw +grwbwruuggubgurrbrrwguggbwrubwwuuubbbgggwururw +guurbugubbwbgrruggubbgrurgggwugugrrubgbruububgubgubu +uubwwbgrurgrrurwbgwgwurguuuwguuwbwbuurbrgrgbuubgwbwbbgbbw +wrggguwwwwrgbbgrwrbwbgbbuguurrgbbubwbbwrbgwuwwruubrwrrgbgu +wgwugwwrrurbgwwrgbggbgbwgbbgrgrbuwgwrwrrurw +bbbwbbgwgurrgbuugwbbrubrgrrggurwgguwruwruggrwwrgrrgbugrub +bbwbrbrwrwbgurgrrwrrwbbrwrwgruugwbwrwurbwbwug +wwgwrrrgbbgguwguuggwbrruubgwrwuuuwrgbrburbu +urgwwgwbwbgrguwguubggwuwrbuugggbwuburubbuburrgbuwb +wrgbbwuruubwuuguubwuguwwgbuurgrgwguwbrbwwrgrggugbbbb +uuuubuuguubugbruwwwbrbrbgrrwwurwrruwwbuuwwrbbgrurbubbubrb +bgwurgbwrbwurgwbgwburgubuuubbbwbwwwuuwrgwugg +wrggwubugrugugubbguwgwbrwruurrggwuwwrbbgbbbrgbb +wruwwgbbrrgwrgrggbrugrwwwbrbwubuggugwbwuggbrwgburbwbbwubbg +ugwuuugbwwwrurrgubbbwguurbwgwbrgrwbwugugubbug +wrgrubuuwrgrbwbuuubgrbubbrbgrurbuuwggbgrwwgwwbwr +uururwwbrgwwrwggwbwrrrrgbbbuugbguwuwwggrgug +ugrwbwwrgbrbwwuuwuuurbgruwgrugbrrrbguuwubbub +wwwbrruggbuwwgbubwggrrgugruuurrurrwgwrguwwwrrgubugww +wrgrrgbrbggbwbubrwbrwrwbbgbwuwgbbwggwrrubgurbugguwuwuw +grrwbggrwbuugrggwubrbguuwrurbuuwbggbgugburbrrbuwwrrggggwwu +uubrruwgwuwbggbbuurwubwgburbuuwugbwuwurrwbrbgrbbr +rubuubuwuuburbbbwgbrrguwgrbbrwwgbugrubbruwgrgbgrbw +rwwwbwwguwrurbubwrurrbuurbwrubuwruggbguubgwrbugguuubrgrg +buwuwruubbrrrwbbuwbbugrwbguuwrubwrbwwrrgugwuur +wrrbuwuwwgwrgwgrruwrwbbwbwwruuwwuugbgrggubbbwwgb +guwbwrwuruwrgwuguguwbuwurruwbuggwuwrwwubugb +bgbuwwgrrwwuwrbgrgbwbrggubwwbggwwbbwwurgbuubrrwwrburwgrbb +wwwgbrbwrwrurrgrbgwbbgrbuwwbbugwwwuwwrurbu +wrgbrurguwgrruuggrrugurwuurrubuuguwgugurwgbrruburuu +wuwurubwugubrbrbwgrwbuugwbbbrwggrbwwguwwrbrbr +wrgwrggbwbwbwubrbgruurbbgggububbbgbburgurrgruwb +bggwbbrwbgugbgrwwgbbrruuguuuruuuwgrrrrgwbr +wrgwwrgrgbwugbgwgbgbbgrgbuwwwwuwwbubbbwg +gggbrrgwbwbuwbrbbbrbbwuubrrwuuggurwggwrwbwbu +rbugwwuwrbwbguwbgbgrwbwbbggwruwbuwrwwubrgbbrwurwwwb +bwwwbuggbuurbbuwrwwrbgubwbuurbrbubwgwgugrwuwgburwbbwwbrg +wrggrgwgbgrwubgbwgrugwbuggggurrrwbrgwwwgwwggwgu +ggburrrgubrrgwgwgbrwugwgwgrwbbbuguwbgbrwbuuurwrbr +urrgbwwuubwwubuurrbwwgubuuggrguwwwgbwwuguwgbugb +buugbwgwrurbbugbrugggwrbrwwruurgurwrburgrguur +bwugruuggubrbuuwurbbwbbruggrwwbrruugrwrguw +wrgwubgubbuwubwruuruuuwwrurrbgrrbruuurgrbrwugbbuggww +ugubburbrggubgrwgwguburwwburbubbrubrwrbuwb +wrgguwubbrrwbrwuwwbrwruubwgwwwrwwgbrrwguubbwwwugugwr +wgwuwwgrwrubrgwrgubrggggwuwrgrwwbwwbggrgbuwu +grwbwgubgwrggwrbgrwbuugrgrburbuubbgrwwwbwgb +bwwwbbrbwwurruuwwggrwbggrgguwrubbwbgbbgugubwbbuug +bbggwubbgwwrbburwwwgwrbwrbgrbubbwrrrgbgbruu +wrgwurrubgguggwgrrbugbbwbrbuurgbbrwrwrwgugwubbbubu +wrggggwrbbrugbrubguwuggubwggugrbuurwubgbuwubwgwgugugwubwbrwu +bwwugbwbgrrbgrrbbrbgggbwwwwggbbrbwwbbbuwgguugubrububgwwu +ugurgbgruurwbwgrruuwwbgbrrbbbggggurruruwrubbbuu +uwrugrrgrwbrgubrwwuwwgwgrbbgrbgbrwwuwubuwr +ggbgwbrwuwgruwrwgrrrrwugwgbrbbuwuwwbuubwgw +wrrrgguurbgubbgbguwruugwrbrgwbgwrrbbuwugbbrwgrbbugrgbbgwuu +urguruuggubbwurrubuurgbgbrbgugwwrrggwwwugugg +gugbggubuwubrgubwuwrwbgbrgbguggwrbrrgwguugu +buwurubbbwurgrubgwgggrruwrrbbrbugggggwbwwgwwb +wrwbbuburwrrwwururbrwgbbrbgwbbrrrbubbgrgbuggwrw +ugubruguuwrgwububrbgrbwgbwburwgurwbuwwubuwu +gwrgugrbgbubbwubgbrwbuwggugwurrburgwrwrugubwggwuu +rgbrgrbggwbwuubburrurggwggguurwuwwwrwuwurbrggrgbuwrgbgwbgb +wrggrwwbrrurbbuuwburubgruurbrgwrwgrrgrbguguuubwug +rguwwuuwgwwubwbggbugwgrrwgbrgbgurbwgrgugurrgguggrrbuuu +ruwubrwugurgrbruruggwbugbgrurwuuwbwrwugwgrr +wrgbrrbgubgbgwrbwgwubuggurguburgwrruruur +uburbrrbgbrrruwruwgwrrgrgurgrruugrruwuuugbuwburwubbrbbgw +wrbwuggbuuwwwuuwbwuuwgwbuubuwgrggrrbgbuwgubrruuggrrruuuwub +rwwgbrrurubuwrgwgrbgbrrbbbwbbbwrugwbubugwuwgwugwwurwgrbr +wrrgwrggrbuuruggggwrguwbwgrubgwbguuggbgrwrgubrurwuggrwgwrb +wwrggguurbuwbwurwwbbwwbrggwggbrbbrgugurbrbwwwrbrrggbbb +ubbrrbbwwrugugwrggwuwwuruwuwbwguwgggwwbwrbgbwuugruw +rggbrwgbbgwrwwrrbgwbuwwbrbrbururwgbugwwbrguuruwrbbbbwrwgu +rguwbuwgwrrbgwbwwwuwrrbrwwwburrbbwbruwggugubbu +rgwbgwwbugbgwruugwwrugwrrbuwgrbbwbuwubguubwbugugrwu +ubwwgrurugbrbrgwrbgrbwruwrbwwbugrwgwrwubrgbwwrurb +rurugbugrwuwbgrbwgbbrguwgbgugwgurbbrbuuurbwuuwwgbgg +rruubwwwuwrrwgwugwrbgwbuugbrbwugrwwuwurguw +wrgwwrgugrbrruurwuwgbwguwurrubwbbwurwwrgruwbgbwwrwu +bgruuwgwrgwugrrguwugwbrbgbbbgguurwrbubgwrr +gwrgrwurbruwgburrruuggbuwbgbwggwgurubwgurrbwuwb +bwbugugubgubrwubrbgruwrubbrurggbgrrgubrrbuurwrrubbwurbbb +bggwwgrbburbbubbuuburuguwubrubgbrubrrrgwwbgrrggrgggwrrgrg +rrrgbgwbgrwuwgubbwbwgubbrgwwbwburbwguuruwwwrbrb +wrgwbbugggruwgbwrggbbburbrgbwuuwurbugggbuggrwrbw +wgurbubuuwrwubrrgrrbrbwrwurwbrbgrggguggwubgrgbr +rubgwgbwbrubrbbrwwbbrrugrbbrrwuugggggwrwugbbbrb +wrwwubrbguubrggurwrburgggruwubggwgwbrgrggrggwuubwggubgggww +wrgwbgbrgugggburuguuwgrrrbrgrwbgubruwrwugbggubuwbbbbwwwbw +wrgrwggbwwrgbwubrubbwbbuuggrbbugrrrbguwbrub +grbrwgbugbgwgwbwubbuurgrgbbggwgbgbwwwrurguuubgbrwugb +urwbbbuggwugrgggurbuwgrrwwbuubwubugbgburgwgbubwuurwuwbuw +wwgubbuwubrgrgwguwbgrurbgwwuwbgwwgbuuuwwwwggwgrrwwwwrbrbuw +wurwrbgrubrrbguwwwgrggwwgrgbbbbuburgruwugwrbr +gbwgbrbrrrggrurrbrrwwrrbwwgubgwwuruwurgrrbbrwb +gubuwgggwgwwwwuwgggwgwwugrwbggbbwbwrrwugrwuurggwbgbgrwruug +uwrugrgbburwwbugrbwwwbbgurruwbburgrwwwgrwrwrggg +brbgrggwububuugrwgubwubbbwwgggrgurrwwggbburgbuugw +ggwwbgugwwggrrububbgrrrrwwbwwuuurbuuubbgwbwu +bgruubgwurbuwrrggugwwbwrbwbgwrwugugbrwwwbburugbbguur +bbbrggbgrrbrubugbrguwrrrruwbuwbgugwubgrugrwruugwgbuw +wuurgrrwurwggwwguguwwurwwugguuguubbuuruwubg +bbuuwrbwwwgggrgrrrrbgwwbwurrurubgubwburgbggrwrubgwbrw +rwuwwbrguggwuwrruwurubguubgwburrwgugrwubwwbwgwwbbbrgrbb +gguuggrrggbwbubgrbrrwbbubuwbrwrwgbuggbbbuuuuuwrgrrgw +bubbrwwgbwrwwggubgwwwubgbrwubuuruuwuwgwwgruggbw +wubburwgbbgruuubwggwurwrubwuwbrgbuuwbbguwwgrwbugbwrrgubrg +rbwrruguuuwwbrwwwbwrwrbubwuggwurrbugwubuggrbubwrubwbwu +uggubuwbuurrbgrugwwubwubrrburubbbgbugubrwwbuwrbu +ubbgbbgrbuguwwbgrwwwgwubuguubruugbguuuwbrrg +rugbbrguuruuruwgbuwrwbbubgrrbrwwbwugrwugbwuuwbwwbbwuwrg +gbubbuubburgrbbrgubggrbbwwuwwbbrurguubgwubbubbbuu +uggwrwuubrrwrrwurbrwrguurrugwwgruwrgwrrrbbuubgrruruwr +wrgrwburgbugwgruburwguurbgggbgubrurwurguwwurwwrbrubbwbwr +bbrubwwbubwuwgwgbrbwuurwrrbgguwbwbgbwuwurbbwbrgrrgwbbgw +bwurwgwgguubrgwbguugrubbrgwrugubbgwwubruguwbrbwb +wrgrwggurrrgwwggbgwrgrrubuubwbwrrrwggbbgbgrbwgwbgb +wubrrwbbugrrrrbbgrbwuwwggggrrbbbwurrbuurwbuwrwgrbggu +gwgurwruwwbbgbrurrrbrurrrgrrggbgubwbggugrwrrbuw +wrgwwwurubgbrgwbuguubwuwurbuurwrruuggrwrrburuuur +gubwbwuggbbguwwbgbgrgggbwggbrrrrwubwrrrruuwbgrrwguww +wrgguwubgwwwrwwbrbgrruwbrurrrugwrrbbrgbgbw +guwwwgrrurrwuwbwrgububgwurrbrrbgbrrwguwrrggguuugbrbbwrgw +rwwbggrrugburbbrbguwbgwwrubwrrwwbbgurruurbggruubrgggg +uwbgbugwrguuwurgrrgrbrwwubrrbuuwggwwwurgurgwrgrwbr +wwgrggwgwbgrugwrggbbruurbgbbwrgruuwbbrurwb +urbwbgwbbugbuwwrgwwwwgbbwbruwbwgwwrrrrbubrbbgurbgwuru +wgrgrrwububgruwubgwuuwbubbgurruruwrubgrgwg +wbbbgbbbguuuubruurugwbruwbbrbwubrgrburrrrwrrb +wrggrugrubgrwrwgugugrrgguuwrubwwugrrbuwbw +uwbbggrrburubbgwwrwgggwgwggwgbuwbwgburbgrrwr +wubbgrggwrrbrbrgwrbubbruugbrwbbbugbrgguubgrgwggu +ruuuuurgrrrrrugbbrgburubbwuugwwgbgubgubwubguuururgrwb +bwgrugbbwbbrrwuuuruwubgwuwbrwurrrbwgurwbur +ubgwubrburgrgrwwrrurrgguwbbwbrbwbuuuuwwwugbrwgrwguubwbrrrg +wbrbwruwbbubbgbbgurbuurbwrggbwbgrugugwwgwwwbrburbgbbwr +ubgbbbbgwrwgrgrguubrrgugbgugubrwbruguwbwrugwuburwwbb +ubrwbuubwuubrrbbrurgbwubuwwbrbrruwwrgrguwrrbwgrugwbubw +gwwruuuwurbwrwrubrwwrrbwrrggrburbgwgruwubrrwgubbbuw +rwggugubbwgwrwbwrwrwrgwgugugguruwgwbbrwbwrggwurb +ugubuwurgrrgugbugrrwrguwwrrurubrbrbrurbrbbwbbuuwugrg +uuurwubugubbggwwwurbwgrgruubrwbwgguwrwwrbubbgrgrbbgubb +wggruwbwbrwgrwrwbrbuwbrbbwrwwrbubwggrbuwuggbbrgwrgbggwwb +wrgbgrbrgwbggbgbrwgrbbwgrgbgrubbwgbrwrwwgbbbwurgwbgwbwbrug +urgwwbwbbrwugruuruuubgbwubgwbuwbbggwrbrggwurgrrrgbububwg +wguubbbbgwuuuwrrguurgugrrubrguurwggburbgrwbgwuu +uurrbwuwwuwugbgrbgwbggwbwgwbwugbbwgurubwgrrbb +wrwrbuggbbrrwrgugrububuwggbwrbrrbbruuuggwb +wgwwurrwuuuubuuggrgwwuurrugruwbuwgwrrrwrwbwrubugrwwuwurbgw +wrgruubububrbwggggbbrrgrbuuuuwrgwggruwurgggwgwggwuwwwgrwgb +ruuggwgbrwwbubuggwwugrrubuwurbgrugrwgwubgbggrbbgbwgrurwggg +bggbrgwrwruuuuuwbbrgbrgwubbubugbguugggwwrrugrbu +wuuwguubwwguubbwggwwwurbgbugbwwwugwwguuugrwgrwrbwbrbubbgbg +ggrgwbwrubrwugwrgbrwurwggrguurgurwrwrrgubbbwrwg +wrgguwwrbubgrurgwbbuwguwuwgwbwugruruwwuuuwrbrubwrgr +bgwrrbwugrbuggrwbuwrrbrrggggruuugbrrguwubur +wrgwbgwruwggbwuubrugbgrrwubrgbburwwrbrwrwwrbguwgur +buwbrgrbubgubgugwrrbwbgguuwbbwuubrgrrwwgubbbgwgggugbru +gurbrrwbbwgubrrwbwuubbuuruubbruwrwwwrrbrwrwwbrbrubb +wrgbbwbrrwwrrwggbbwrrurgurbgwgguggubwbbbruurwrwuggg +wrggrugrrwwbgwwwwbugbbbbrwwgggrgggwbuguurgu +wwugrwwbbggrgwurgrrbbuwgwgurrrbgruwrwugwrr +bwrwubrgugguububbuggubbgggugrwuburuwrwrrrgbrwbrgr +grgggugwbuburgbggguubwbrrgrguuwwbrgggwwwrgbgugw +ubgbbugugbrugrwuguugwbggugbbwrgrbuurwbgrbrbgubbgwuwuwgbgw +gurbubbwgwuwwgwbrbuwugguggbgrwgggrwuwwbgbgwbg +rbuuugbburuuubgrubrbbrwgggwbbuugrugrrbbwggwr +wrgrwrwbwggwrwuguwrurbugwbruwbggbggrrwurruwuuruwru +uwguwwgbgggrubggwugwbwrbrbbwbgguuwrbgggwugrbwuwrwwgrur +rgrwrgwuwbbbrgwrrwuubgrgbwwrrgburbgbbubbgubwrburbbwuuur +wgruurgwubgubgbwbwbgggurbgbrggrbbgwgrrwggrwwgg +wgwbwuwwwgwrbubwbuuuwwuuuuubuwbuurrgbgbubbbuuguburwbgru +wrgbuurwbwbwguwrrugbrrwuuububbrgwbgugubbwgugrwgwwggwuwgrgrr +guggbbgugbwgurrwbuwruggbbubbwguuuruuwwggwrbbgruburgrrbug +wrgwuggurgbwgrgrggwwwgbbrwwgguwgguggbbgbbugwbrruwubrrrbrwuu +bwgbuubgrwbugwbrwuugurwgbrggbgrwrggwbrgguwbr +rbwwgrbgwwuwbrwgurbguwwgwrgwburwbbbwgrrgubugwurrggrwuww +ggrwruugwguuwrbgbrgbrggrwugwggbrgwgurbwgbbrbgwubuggbbrgugw +uuwwrwrrurgbrwrgbbuguruwwuwrwrugwrgrrbburgu +grbbgurubwbwbgrwwgruurwbbuubrwwrrbwubwuwbbbrwu +brrwwbbuwbwrbbgrbgbbuwwbbwrwwgubuwruwbgbwrwwwggug +wrwbgbgggruurugwbrwwgbuguuwguurbgrgrguuwwwrgu +wbwgbubrgbuwwwwbwbuuggugggggrwbwrwgrgguwrggrbwrgrburwbubb +ubgwwrbbwbuwrguwrrwrrwggruwbgbrwuwbubububuggbggbrwbu +urrbwuwwwrugbugwwgwbbubgrgbburuuwgbgguguugb +uwbugbgubgrwgbruubbrrbrwgwuubuwbwbbuwrgbwugbr +wrgwrrrbugbgwuwbwrubwgbbbuguwrrgrrwgbbgurwwbrbbggggrrbrruwu +rwrrwbwwggubbguuubrwrurgrbwurguuuruuwgubwgbwbrbbgbgb +grrbrgwrwbwbbgguwgguugrwurrbwwgwgbuubgrbuwbbbgbbbuw +rgwubwwubrrgbrwwubuguugwbbwuwgbgubgruuruubgurrgwguuggwrw +ruwuwuwbuwrgggwgrruguwwbrbuwwgugbuuwruwbwrbgwubwu +ubgrgrguguwwbwrwwbgwurwurrrbggrrggubgrrbuuggbgg +wrggwgrbugwwgruwwubrubgrgggwgubbbwwwwrwurubrwrggrwwbrgwgw +gwbggrggwbgwgbrwwuuuwbbwrwgbguwruguuugwrbgrbbrrwrurrggbb +brrbuwguwgrbbburrubrbwburbrwbgwbbwgrrgwugrg +wgruguruwwgbrurbugrrrwrgwbrwuuruurrwrrgwuuwgwg +buuwrbwbubggrwugwwbuwgubbbrbbgbubrrwrbbwwrrrrrwgugurrrbbb +rbrrburuubrwurwgguggggubgbbruwwggburwwbwrb +ubgruruwbrgbrbugrbburuwugrurugrwbwwguwuuwuwgubgbrgwrbbggbg +gguuuwwrgggwgurrrubggubruubbugbbuuwgrruuwguguu +uwbwggbrbrrbuggbwwwubwwuuggwrwwrurrwbgbwuwgw +rwwwbuurburrrwubguwgrguguubrbgwbggbwurgwug +gbgugwbuuwuwguwugwruwwbwurguubuurbbgggbgggrrwgwbgu +gbrrbwwbuugurwbgrrwwwwgruurgbbgwwwgrguuuwgbgbgwwrbgwr +gbwubwugbgwwugwgguruwubwggwuruwrbbwwbggggrgurwg +wrgwbggbrgbuwrgrggwrwbbwwuwruuwuwrgrwwuwg +wbrwgrgbrrrwuuuuuugwwrwbrbwbuubgggrrrbwuwruggwbwwubwbrgbwb +uurbbgrrwrbwubwwwgbrrrrugbrbrbgbubrgrwbruuwggbbwbrg +wrgbrrugrwrugbbrbwgrwbubruuguggwuwugrgbruurbbuubwbwur +ggrwgwgwugbggwrbwbrwwrrrbgwrbwuwgwbuuurbwwuwbgubuurwb +wrgrrbuwgurbgubwwwwguuwggwbrbwbwwwwuuwggb +bbrurwwuwbgggrbgwrbrbgwurrrbbggrguwuwgggbbuuwggruwwgbw +ugggggbwgrwubrrwurwgrwwurwrrgbrurbuguwbgwwrrbgwwwwrgwrrw +rurbgbbwgrrgwuuwugwgbubwrwruugubgruwbwwrrg +wrgrrwggbwruuugrwurbuwwgrgururgugwuwubbgbbgrwururwrgr +wgrrbwrwrrbgwgwwrwubgrrurbgrwruguurrruwbwbrwugwr +gbrwwbbbuwbwwuwubwggwrrbubuwrrwbrrrbuwbbbbugwbgu +gurwruwurbgrurgbuwwgrrrwrbrrgwrbggwwrwruggurg +bgururwbrguubbwbwbubbbrrbrbwrbgrubgwbruwbbwwruurruurrgurru +bgugrwbbbgrbwuwrbubwbwubggwrwrwgrrbrubggwgwruwwuwwgrbwwb +rbguwuwrrbwbbgrrururugbwwruwwrrwbugwguggubruuuuburrguugbu +gurbggwbggwwurggbrgbgugrbgubrgrwrrgwguubwrurrrgrbwwbugwrw +wrgbuwbugrgwrugguggbrrrgurruuuwgbguwgburb +gurburbuuubuwrbwrubwuugwgwbuurrbwuurbrruuburwggw +wgguwuuwguubuwrbwwwbbguwuugwrbubwugugrwwgwwwwggurwrbru +wggbwgwwrggruuwbrubrrgbggrgwrwrgubbwuugwwuwrggrg +bbwbgggubbwwuwrbggwbrgguugbuuwubguuwwrgbwuruwgruwr +wuububrwurrgwubbgrbrrgubbbubgwbrbwrwrbwurwgg +bgbbrbwwgubwbwbgggrwbrgbbuurgwbrrwgwgruwwrguuggubrbrurwr +rbuuwrwbuubwrwrgrggurgwrurrgubbuwuugwbgwrrw +wrggbwurgrrubgbgwrrgbruuuuwrruruubbbgrgubbggrwbbuugg +buggwggrgbwbgwwbguwuwrbgwrbbwwrguwwuwggurbwgurbggubrrwgg +guuggrbbuwbrwgrurrwwwuugwbwugbuwrbgrwguuwbgubgrbbg +uuwwwbgugguuwuggrburwwubgurwwbuugrrwgugwuu +buurwugwrrrgggubgwwwggwwgwugurbgrgwwuuubwuggurwrrbggbguwgr +uuwwbgggubuubgurgwurbwguwrrwgwugubruuugwuguuuwwwgwgb +rwbgrbwrwugbbwgwrwrgubbbbwwrrguwwubbugrbbwgbg +ugrurggwgbgwgwrruugrwugwrgggbuurwbbubuugrbgbru +uuugugurgbwwwwrbrgbrbggrbrurrgbbbrubburbbbbrrrbbbgww +brbburruuwuwwbgwugrrrrggbwgrbrgwugrwbwggrr +rbbbgburbwbwgbubbrugbgwgugwgrbubggwgwwuwbuurbuurgwrugrrg +wuuuubrgwrwwwwugugrgwbrubbbbbgwbbgbubrrbbwgwwrgg +ubrwubuurrrwugruubggwuwbbbuuwgbuubwrrrwbrwwwwbubwgwbrwwu +brrurgrwwrruwrrubbwuwguuuggurbwgruuurbggggguwurrg +uuggbrwgbugguwbgrrwgwwuuwuururwwbgbgrbgbuu +grbbbrrgwrurugbwugbwgrgbgbgubugbrurruubgrugguubrwwugwuu +ruwbwbugbbbgggbrugrgbbwbbgrguwrwuurrrbugbugbwwgbbugb +ruwwrrwugwwbubggrubwbbgwrbgwggbwgguuubgbgubg +uuwwugrbbwbbbbwwwwgrbbggurubwrrbbuuubrrggbgb +wrgrgwuruwwugubrbrruggwrbbgrrubbggrbrwbruwubgbbrrwwgrgbgubgg +urwuuwgugwwubuwrgwbwbgbbrwrwrrrrrbuburwbrurwuuruuugbrbb +ggrurrwubwuwbugguuruuwggwwrgrgwwbbrwubgrbggbbur +rwuggbgubrwuuwrwrbbbgbrgwwuwrbbuwrubguuugbbgwww +wbrwgbrubgrrwbrwrwrwwrgrrbbrwggwbrguwwbrbbwggubbrruuwgrb +bruwgrwrrgwrbugruuubwbruuurgbwgguwwruuurwbgr +wubrurubrubrrwbuurgrgubgwbgrrurugguggbrguurbugr +gbrggggugguugrrrwrgrrurggwwrgubuubwurugrbbrrrgg +gwrbugwubbuuwrggubrrubbgggggbgbggwrbrgrwgwruwbwggubug +gwrrgubggrurrgbbugruwgbwbrrbwuwuwbggwgrrrwgrggubbgurbg +wrggwgwgwuwbrwwbwwgrurubugubgrgubuubbgwgbggwwwg +wwrwbbrwwrwubwwwgbwrgguwuwrguwwggurgwgbburuuwwgwrggg +wwrbwwbbgbgbuwbwuggrbrggurbugbrwuwugrrurwbruw +wrbgrrggbwwgwwwgbwgbbrurwugwgugurguwbrgubr +gwrbgbgugubgbgrugbrbgrgguwggwgubugwurwbwrgwbrugwwwb +wbgugubwwwrurggwuwuwrrwwrwgbbbuwbbbrgrrgwurw +uuuguubwbbwwgbbwwggguubgububgrguguubwwuugwwrwbr +rwbgrwwgwrrruwugruuubbwrbrgubgrgwgbbbwwgburbubgrg +wgbuugbgwbgwuwwgbwgwwguwrbuwurbuwrbwwrbbrwrrrubwrgbbug +ubuwggbwubbgrwbbbwwrrbuwwuwwwwbbubbwrwbubwgrr +uurwrurwrbbbgwrbggbwwruguwbwgwururgugrugruggggbgwwrrurggg +wrggurbbwgrurggubgbggbrbgbgrwbgwrwbububgrwrwgrwwubuububu +wrbwrgggggbuwubugurguuuugbwuwuuruburgwrwuwr +bggbgwgrrrbwbwurgwwrggbwrwgbwuwwugwbwgbrrrbgrwwgwrwgbr +ubuguruwbrrrgbwwgrgggrruwgggrgrbgrgwubggbrbuubw +grurrbguuubuggbbguurbwwbrrurguwurubrbgwggrguwbrrgburruugb +wrgbgrugrwwgwbgubbwbbrwubruggruuguuwubwgwurubggrbgwurrrrr +wrgrwuguggwwurbwubgwrbrugbruruwuurgurbbgrgr +wbbrguggbrbgwgwrugbuwrgbrgbuurrggggbrwgwwwuubbub +grrgwbwwbruugggburwbwgrbrggwgwwwwuwwbrwrbwr +guuwuuuwrgwwgbruugwwwrwuggrrgwbwwruuuuubububrwrbgurbw +rrwrrurggwurggguurrrrurwugwwrruwrruubwrbbguubww +grrwgrrrwbubggrrwbbgggbgwbbwubrbwwugugggwbg +wrgrrggwurbwbrguwrurwbwrbrbrggggrguwbwgwgwrbggbgrbgrb +bwrbwbwurbrugggwbgbrguwrugugrruubrggbwuurrubub +wbgwwubuurwwubbwwgurgugbbbgrgwuwbbwrbgwbwguugurubr +bbbbruwuwgwbuuugrrbgugrwgrrwwggugrggugbbgrrbw +wrggrwwubwruwbugubgurrwrbrrwbgrgbgrruguuubgbbwuwbub +wgurrgubgrgbgggurgubbugbbbruruggrbggrgrwwrw +rurbwwuuugurguwgwguwurrruubuguwwrbbburrbrwwugrruuw +wwubwbggrurbwubbrwbuuruwbgugbwgwgrugubbwbub +ruwbrbuguwuuuwwbrbwguuwgrwuruugbrgbbwugubrrrgrgb +rwrbrwrbwuwbuubrugwrubwbuuwbubrwbrgurgwgbgrurwrruuwu +rugwbruruguuuwgrbwruggggwbgruwrwuggubgruurbubwug +wgruguuruwbrrbwubuwgbrwugrgubgrwgggbwwuggbwbb +gubuwrgurwrbrbrugrruuwgbbwubwwbgbgguwuuwwgrbrwuwr +grrrgwguwrgbrbbwbbrwbgugwbrgggggbbrrurbbgbggwbuugwugb +gbrbggrbgrrbbggggubbbwuugubgggbgbrurburugwwwurwwuuw +wrgguubrrwbrrugwuuruurwbuuwgwbuugubgbrbbrrbgrbgwrrrwrgguww +uwwburbrrururbrwgrwrgrbuwubgugwwwgwgwrrurggu +rgubgrwgruwwwgrrruwrububgrrwuubbwrguuwwrrubururguwgbrg +gguwbrrrrgwbbgrrbubugrgwwbbgwrgrguwuwwrwbwwgubbgubbuwuwgw +rwgrwrbuwbwrrwrrbrrbbbuubgrgbrgugbuuuwbuuw +rgguwggrbrurwrrgbruwbguwwwrubwurbrbrwwbwwggrrrwbwg +rwruubwuwguwrurrubwuubbburwubbwwguguurggbbwuwb +wgwubbbrrbgbwrgubrgguurrrbuurwubbbguubguuuurguwwr +grwwbgggrbbrbwgrwbuuuruwwgbbuguurgburbrgugurwb +rgugwuuubgubwwwwbbuurwwwburrrgurbwbgbuwwruuugu +gurrwwgrgwrbrbbgurbwrrbubrbuwbuurrrguugggrrbwugbb +wgwburbwwbubrgurgbbugwrbbrwggwgbwbrbgwburbbugbrrbggbwwwwg +uwubgbbubwrbbbubgbbgwbuguububruubbbwuwrububbg +ubgbbuwgwrbrggrbrwrgubbubrbbuurrgwbrggbuuwwwrgwubwrbbwb +wgrbrwwwgrbgruwbbwgbggwuugggwggbrwrwbburgubgburrwrrwrwbw +wrgrbgrbugubrwwwwuubbrbrbrwgwuwbbrgwrbwwrbwbrrubbrr +wrgbburuubwbrrggwurbwwbrwuwwugrwrbwwbwgrwwwrbrurubrgrbw +rwwbwgwbgggwuuwwbrwgwgrubwwwrrbgruubwrgguwrwr +rurbrwwruuuuugwgbbwgwrgrbbwbrwwruuuwwgrbgwbbbuurururwww +uwguwbuggubwuubururgbgurrbbugbwuwrgwwrbwwuuwruwuubgb +rwubrrrubgwubbgbubrrrrwbbbgbgrbbbuuwrwuggwgugr +buwrgbggrburwwrrwrrgbrwbwurwgwubgwbwgrrgwbwrrbrbrgrbgububb +wuuurwgbuwwwwuwbbugbrwurrgguwbbbbuuggwbrrwbgrbrgwrgrubug +bbuwbrubrwbgurwbwbguugwwgwrwbgbwruurwuwbuuruuggr +rbbrwwbbwuuwwuuurburrrgwgrwbbrrbuggwrwrgruugbu +gbrgubuurgbgguwwwwubbgrbwrrurburugbwgbubbwruuuuruuwbbgwguw +wurwggrggwwrwugbwgrwuuwrugbuuggbgrwrgwggrgugrgrwrrwbb +rgwrwuwuwrgubuwbgurwrgurwuuuwgwwrgwgrgruwuwwggwurwrbbuw +wrwwrgwbwgbugggrguuurwwuwrbrwrrruwwbrrrgrruubg +wbwrrruuurgrrrwrbuwbggbguwugrbwbggbuburgruwgbbruubrwbrgrur +uuubuguurruuwwurbuwbgwrrrbrbwrwbuwubugrrruwuggrrwb +rrbggbubgrruubbgubuwubbgwuubgbrruwuugggbrbuubgugg +buwugbwbbrugbwbgwurguwbwwbbgbbbuguwgrwburrgggbgbguruww +wrgbgwurgrbrggrburguuubugbwgugrwbwwwwbbuubw +gwruuubuubbbwurbgurrrbwwbburguugbwbrrgbubrwwrrwwgbbgbu +wgubuugggrugrwrrggugguwgbwwwruuuwwurwbwgwbbwgr +buwwwgrruuuwrwgggbbggbguuwwugwwguuuuuruubrruubbuwubggbgwrg +gwrgbgubrwuruwuruguubbuwrbggwwrguugrrgwwbbwgwrbbwbgguuw +wrgrbwuburwgwggggrrbrgrbbguuwuwbgrbwbubbbbb +wuuurbguuwrurgggrwbgwrbgggrgrggrwuwguwrrugugrugwbuwbrug +ugbubbugwbwgugbwuurwbuugbgwbgwgbrurgruuruubgugbwugwubu +rgguwubwruubugbrrguruugrrwbrgggurrgbugwbrggu +ggwrgrrrrwrggbbwwuwgbrrrugrrubwwwrgrruugurwgrbgwbg +gugwrgwbugugrruubbbgugrwuurbruubwrrbbuuubbb +gbuuggruguburwbrrbrggrguwguubugbwggbgwuwrwgrgub +urbwrguguuwrugrbwgrrgbwrwrwwuuwgbgwbururggwurgrw +wuwurrubrwubugbgwgwwuguugbgbuwrwbuwrgbggrurgruwuwuuu +grrugwbrrbbwbrgguuwbubbgrugrwbwrurwggbwwwr +rwbggurbrwubrbgwuwruwbrgwwgrubuuuurbbggbwrrrwur +wwbugrgrgruwrgbugrwrgwgrbruuuuubbubrwbwrgrb +wbbbrgwwrrrwwbrrwwwuwugwbrwgrbwuwuggbuwruuugubgbg +wrgbuggbbrbrubgubbbuwrubbuwwgbggbbwgrwrruwgguwguwruubw +guggwbwbgrrubbrwrrwgugguuuwrgbwgbbguwbbubw diff --git a/day-19/main.c b/day-19/main.c new file mode 100644 index 0000000..cadcd7d --- /dev/null +++ b/day-19/main.c @@ -0,0 +1,138 @@ +#include "aoc.h" + +typedef struct CacheEntry { + struct CacheEntry *next; + u64 hash; + str design; + i64 count; +} CacheEntry; + +#define CACHE_SIZE (1 << 16) +_Static_assert((CACHE_SIZE & (CACHE_SIZE - 1)) == 0, "Cache size must be a power of two"); + +typedef struct { + Arena *arena; + CacheEntry *entries[CACHE_SIZE]; +} Cache; + +static void +cache_init(Cache *cache, Arena *arena) { + cache->arena = arena; +} + +static u64 +hash_str(str s) { + // fnv-1a hash + u64 hash = 14695981039346656037ULL; + for (i32 i = 0; i < s.len; i++) { + hash ^= s.data[i]; + hash *= 1099511628211ULL; + } + return hash; +} + +static f32 +cache_get_load_factor(Cache *cache) { + i32 count = 0; + for (i32 i = 0; i < CACHE_SIZE; i++) { + count += (cache->entries[i] != NULL); + } + return (f32) count / CACHE_SIZE; +} + +static CacheEntry * +cache_get(Cache *cache, str design) { + u64 hash = hash_str(design); + u64 index = hash & (CACHE_SIZE - 1); + for (CacheEntry *e = cache->entries[index]; e; e = e->next) { + if (e->hash == hash && str_eq(e->design, design)) { + return e; + } + } + return NULL; +} + +static void +cache_put(Cache *cache, str design, i64 count) { + u64 hash = hash_str(design); + u64 index = hash & (CACHE_SIZE - 1); + for (CacheEntry *e = cache->entries[index]; e; e = e->next) { + if (e->hash == hash && str_eq(e->design, design)) { + e->count = count; + } + } + CacheEntry *entry = ARENA_ALLOC(cache->arena, CacheEntry); + entry->hash = hash; + entry->design = design; + entry->count = count; + entry->next = cache->entries[index]; + cache->entries[index] = entry; +} + +static i64 cache_hit_count = 0; +static i64 cache_miss_count = 0; + +static i64 +count_realizations(Cache *cache, str design, str *patterns, i32 len) { + if (design.len == 0) { + return 1; + } + else { + CacheEntry *entry; + i64 total = 0; + if ((entry = cache_get(cache, design))) { + cache_hit_count++; + total = entry->count; + } + else { + cache_miss_count++; + for (i32 i = 0; i < len; i++) { + if (str_starts_with(design, patterns[i])) { + str remainder = str_sub(design, patterns[i].len, design.len); + total += count_realizations(cache, remainder, patterns, len); + } + } + cache_put(cache, design, total); + } + return total; + } +} + +int main(int argc, char **argv) { + Arena *arena = make_arena(Megabytes(2)); + Tokens lines = read_lines(arena, argv[1]); + + str avail_line = lines.tokens[0]; + DYNAMIC_ARRAY(str) patterns = {0}; + str pattern = {0}; + while ((pattern = str_next_token(&avail_line, STR(","))).len > 0) { + *push(&patterns, arena) = str_trim(pattern); + } + + Tokens desired = { + .tokens = lines.tokens + 2, + .len = lines.len - 2, + }; + + Cache *cache = ARENA_ALLOC(arena, Cache); + cache_init(cache, arena); + + i64 part_1 = 0; + i64 part_2 = 0; + for (i32 i = 0; i < desired.len; i++) { + str towel = str_trim(desired.tokens[i]); + i64 count = count_realizations(cache, towel, patterns.data, patterns.len); + part_1 += (i64) (count > 0); + part_2 += count; + /* printf(STR_FMT " -> %s (%ld)\n", STR_ARG(towel), (count > 0) ? "possible" : "impossible", count); */ + } + printf("%ld\n", part_1); + printf("%ld\n", part_2); + + if (false) { + printf("Hit count: %ld\n", cache_hit_count); + printf("Miss count: %ld\n", cache_miss_count); + printf("Hit Rate: %.2f%%\n", (f64) cache_hit_count / (cache_hit_count + cache_miss_count) * 100); + printf("Load factor: %.2f%%\n", cache_get_load_factor(cache) * 100); + } +} diff --git a/day-19/test.txt b/day-19/test.txt new file mode 100644 index 0000000..29648be --- /dev/null +++ b/day-19/test.txt @@ -0,0 +1,10 @@ +r, wr, b, g, bwu, rb, gb, br + +brwrr +bggr +gbbr +rrbgbr +ubwu +bwurrg +brgr +bbrgwb