This commit is contained in:
Georgios Samaras 2024-12-19 16:31:26 +01:00
parent 1cb6b9117e
commit 1458e923e6
4 changed files with 553 additions and 13 deletions

View File

@ -41,6 +41,7 @@ void str_print(str s);
#ifdef STR_IMPLEMENTATION #ifdef STR_IMPLEMENTATION
#include <stdio.h> #include <stdio.h>
#include <string.h>
str make_str(uint8_t *data, size_t len) { str make_str(uint8_t *data, size_t len) {
return (str) { .data = data, .len = len }; return (str) { .data = data, .len = len };
@ -108,25 +109,14 @@ bool str_starts_with(str s, str prefix) {
if (prefix.len > s.len) { if (prefix.len > s.len) {
return false; return false;
} }
for (size_t index = 0; index < prefix.len; ++index) { return memcmp(s.data, prefix.data, prefix.len) == 0;
if (s.data[index] != prefix.data[index]) {
return false;
}
}
return true;
} }
bool str_ends_with(str s, str suffix) { bool str_ends_with(str s, str suffix) {
if (suffix.len > s.len) { if (suffix.len > s.len) {
return false; return false;
} }
size_t offset = s.len - suffix.len; return memcmp(s.data + s.len - suffix.len, suffix.data, suffix.len) == 0;
for (size_t index = 0; index < suffix.len; ++index) {
if (s.data[offset + index] != suffix.data[index]) {
return false;
}
}
return true;
} }
bool str_empty(str s) { bool str_empty(str s) {

402
day-19/input.txt Normal file
View File

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

138
day-19/main.c Normal file
View File

@ -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);
}
}

10
day-19/test.txt Normal file
View File

@ -0,0 +1,10 @@
r, wr, b, g, bwu, rb, gb, br
brwrr
bggr
gbbr
rrbgbr
ubwu
bwurrg
brgr
bbrgwb