From 41e268ed27ea6aedf51e7c1f2a025617c2749bbd Mon Sep 17 00:00:00 2001 From: "Eric Vincent (arch)" Date: Sun, 19 Jul 2026 09:32:45 -0400 Subject: [PATCH 1/3] day template - will always use arena --- src/puzzles/2015/y2015d00.cppm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/puzzles/2015/y2015d00.cppm b/src/puzzles/2015/y2015d00.cppm index 2c435be..39d4890 100644 --- a/src/puzzles/2015/y2015d00.cppm +++ b/src/puzzles/2015/y2015d00.cppm @@ -16,20 +16,21 @@ using namespace aoc; export namespace y2015::d00 { - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wunused-parameter" - aoc::Value part1(Arena& arena, Str8 raw) { BASE_ASSERT(raw.len > 0); - + arena.scoped_scratch([&](Arena& arena) { + arena.alloc_array(20); + }); return Value { ValueTag::Unsigned, { .u64 = 0 } }; } aoc::Value part2(Arena& arena, Str8 raw) { BASE_ASSERT(raw.len > 0); + arena.scoped_scratch([&](Arena& arena) { + arena.alloc_array(20); + }); return Value { ValueTag::Unsigned, { .u64 = 0 } }; - } - - #pragma clang diagnostic pop + } + } \ No newline at end of file From 84b4df25a5d2634b9a4a95870f145cd3fc49c965 Mon Sep 17 00:00:00 2001 From: "Eric Vincent (arch)" Date: Sun, 19 Jul 2026 09:32:52 -0400 Subject: [PATCH 2/3] scaffold day 8 --- data/2015/day08.txt | 300 +++++++++++++++++++++++++++++++++ src/puzzles/2015/y2015d08.cppm | 36 ++++ src/puzzles/puzzles.cppm | 10 ++ 3 files changed, 346 insertions(+) create mode 100644 data/2015/day08.txt create mode 100644 src/puzzles/2015/y2015d08.cppm diff --git a/data/2015/day08.txt b/data/2015/day08.txt new file mode 100644 index 0000000..004cc4c --- /dev/null +++ b/data/2015/day08.txt @@ -0,0 +1,300 @@ +"\xa8br\x8bjr\"" +"nq" +"zjrfcpbktjmrzgsz\xcaqsc\x03n\"huqab" +"daz\\zyyxddpwk" +"draes\xa2n\\g\x27ek\"lj\"\\viqych" +"nnx\\krnrfomdnt\x2flbl\xd2xpo\"cp\"k" +"kwdaapalq" +"u\"ptk" +"ckhorczuiudfjmmcc\\u\"wozqxibsfjma" +"ydctdrxat\"pd\"lwi\"bjesevfw\xe8" +"v\"\xa8rrzep\"\"r" +"nbydghkfvmq\\\xe0\"lfsrsvlsj\"i\x61liif" +"jsas\"u" +"odipikxlo" +"\"rnubsgwltqkbsu\"pcpcs" +"eitk\\f\\mhcqqoym\\ji" +"vnedc" +"\"lhcaurdqzyjyu" +"haxzsa\"zcn\"y\"foclgtjfcnv\"m\x68krc" +"\"eoeggg\"tmiydvcay\"vfavc" +"snqvyqoncwxcvwbdktoywch" +"rnfgjsyr\xd5wacy" +"ik\"hebrpvsts" +"txw" +"\x15pxtdkogd\"urbm\"gevhh\"nxr\x3erxtk" +"cetqtcy" +"inleep\\mgl" +"uflwbxvww\x2cxzezqnaply\"yh\"qlllzk" +"eepak\"xqtedzt" +"na\x61qzfieafvyrsnwkssznohjmc" +"yceaonylz\xc1\\jrlbbkzwsidfi" +"ybqafngkcqpbp" +"\xaft" +"yidjpaobqydso" +"ju\\ldxig\\lrdrhjcmm\x77rc" +"tylacqeslnwj\x48ds\"tjxa" +"efbfm" +"\\fxkgoprgdcjgyajykg\\dtbrz" +"eujvva" +"h\x7acwfpikme\\vwthyvrqdnx\"" +"rbpbrxm\\\"\"\"voxx" +"ykiw\"tkb\\lforu\"rsf\\tf\"x\"rqti" +"e\\wh\x77aqeugiq\\ihhfqfuaij" +"g\"t\\o" +"nxzo\"hf\\xp" +"dxiaqfo\xea" +"kali\\zczhiqkqzybjj\"fgdjnik" +"zdkgrqmdv" +"bimxim\xb6lrwsaj\"ui\"a" +"\"rrznitibgx\\olpsjmjqzctxaubdifsq" +"zb\"khzixaacmhuzmlymoformipdzml" +"qfwi" +"hjwsxfpphttjy\"\"zixais\xbblgnqfto" +"puj\\qmyu\"nqgaqfthbwjokbmrpbhpi" +"cyxdpkh\\\"" +"q" +"m" +"tbxdzzllarlo" +"gbtys" +"gytilk\\vlqxvcuutjunrqc" +"uugkvcuzan\\eyhb" +"yaxr\"genlbgw\"\\uc" +"nrgecjeip\\sjdvgqaqxwsqactopu" +"pu\"r\"txpyrkfny\\zmwfneyvwmnkkdipv" +"jm\xa3bhwvq" +"qxojmnml\"w\x9airr" +"xbzsuihs\x4dcedy\xaclrhgii\\\"" +"drgjirusrekrwmvxllwdm" +"\x28hfxnfpycmpnkku\"csuf\xaarxlqyg\"x" +"\"zvz\\rmg\"\\sxxoifffyqfyn\"iq\"ps" +"\"z" +"zbwkmk\"sgzos\x93gtc\"" +"bvm\x28aa\\\\\"pywuhaniox\\z\\hbp\xd7mold" +"aszgvsyna" +"qf\"vdwuss" +"lnohni\"qwiacjsjegstlbfq\\kyjhyd" +"c\\naawulxlqplnacvytspry\xf5ytxxqq" +"razwqmsqgbaaxcd\\f" +"radggyrjrg\"zx" +"\"pu\x11t\\ajcjuieinlkvya" +"veggiskh" +"eglfhjxiet\"kouqfskwsy\"hpthsldel" +"mv\xc1b\"f\\shrssnjwcpmurepdxdlcj" +"dlayjd\"suvzotgdtc" +"\xa9pvxeopn" +"lpplsaxy\"oiwaq" +"hqwh\\lusv" +"hykykwlx\"\xa5atkgh\\d\x63dff" +"vfktanpjy\"xxetc" +"dnhwkgjnsmsswfuelvihvjl\"jtf" +"x\"dwvzra\"nbbsewftehczgbvfzd\"rau" +"csfi\"mzejnjqkqupwadrgti\"von" +"xckf\xf7xsm\\pgvlpetjndpyblais\\z" +"yecy\x6fuj\x58bwpgeuiw\"mdu" +"fgb" +"c\\lx\x3efthet\xfdelgvwvpem" +"kgyrmarvfwjinlowt" +"yzte" +"vc\"z" +"sxevqfzmmdwsuu\"" +"fxbaercmcy\xb6md" +"f" +"m\x44gqbcppho\\b" +"gtafr\x57m\x11jy\"\"erwmmpiwjkbckuw" +"ufdjt\"kssprzxqixzxmq\x58q" +"yzbyo\"lfdbyaxexyfbnyv\\\xe8xmre" +"u\x43ntr\\\\byyfjr\"iveujvnwsqbnpuvrta" +"us\xf6bai" +"c\\edh" +"tzckolphexfq\\\x23\xfbdqv\\\"m" +"yjafhbvhhj\x1b\"bplb" +"\"o" +"rubahvmp\"" +"qmkukrnrmqumh" +"wdpxyvyidhwjf\\nabbijwhr\xc5bksvy\"p" +"u\"prlpg\"" +"nsvcquyxbwilsxxemf\xd9leq" +"y\xcetxuafl" +"it" +"kwdlysf\\xjpelae" +"viwh\x58wpjjlnvryuti\x2chngrx\\nhtkui" +"vhn\x9ehre\xc3ncsqbozms\"nl" +"ytc\xa3mgeeogjcqavmmmd" +"xzlexlitseozoxtpzzutfq" +"cish\x07lmovj" +"ekbflwqzaiivdr\"pq\\azrfbntqwkn" +"uc\"xdbegmlmhksofzohavtrnxf" +"xfdnrdqdrcjzbe" +"ndg\"ckgrpisib\"rg\"p\\lmpfzlssnvk" +"witfjwpbyyzlop" +"zonlww\"emrbcsgdtrg\"rjzy\x64zqntlw" +"dvgb\"zn\\vrbzema\"ckmd" +"\\vdlmxhlvldk\"pmzazeip" +"\"\"r" +"rsntinv" +"iy" +"lr\x20efh" +"csgexlb\"zqdavlxxhtdbh\"\"\x0fkpvhiphm" +"ouwhp\"ogbft" +"cm\\ckltng\"dw\x8brf\xf0eppgckd" +"zmnlsgalhpkejsizfsbtnfliu\"nhc" +"pnrkaayqvwpdjbhcrbb\"yfeq\"aq" +"ozh\\hoxow\x2csrtr\\r\"" +"bqxabj\"u\\s" +"cpsjti\"gy" +"aa\"p\\nki\\ajijkqev" +"q\"\"lfdentjgd\\" +"bmokvpoebutfki" +"pielvcbne\xf6efvzxn" +"kx" +"zlgmqagcrbhrwtwtmmg" +"aiyhmntcqjbpv\xb5hhswxbryoedvos" +"tdpaxrb" +"fu\"\x7dttkyvhrlwko" +"oirc\\\"cqlnqffjqt\\k" +"edxlia\\tcyby" +"jpeybgwfayerfrfbvfog\"ol" +"ysr" +"bzwzilgwfugjk" +"tlcc\x75nukvwjgftetjcs\xaecwc" +"dsqssa\"vzrf\"sewbp\\ahhlmhbeihlh" +"qtgmjck\"n\"guki\"gmdivwqxismqj" +"\"f" +"wuorvlovucngbzdszqpikyk" +"dfrdsacoukmgvhbq\"\"iwto" +"\"ey\"ch\\wcgioe\\\"ouvligmsw" +"ciqlszzgs" +"\\tzyrkaoi\"sopjaq" +"lmtnv" +"ar\"fqoroigiertjjlm\"ymgi\\kkjewsxd" +"wehcimlvudpxtamdn\"rwy" +"hr\"zvrwthr\"vruzqfrldn\"b" +"sggekodkiwvym\"mhsco" +"ltlkfbrrdvk\\" +"uut\"sfjnz\"\\ef" +"hxilg\\" +"zsredsiwlzrpedibn" +"vtfi" +"\\h" +"qekfrc\xf6wduodbwrguqcng\\n" +"\"lljlfdrxftwidn\\pkv\xd9ij" +"mrvgqynpehkliuijlpp" +"gikjph" +"yoxcdrdt\"wbaurnyhoyxoihu" +"onmomwuxuammbzxe" +"rnrr\\twviz\x61gqaljr\x0dmtw" +"r\"vupaoi" +"l" +"sei" +"jwxtdtbkd\\kxd" +"\x22v\\" +"ahd" +"j\"bjqxs" +"\\i\x24gglxub\\nzsajokt" +"lviwpu\"uxdlh\\zuy\"xqy\"ytdzlx\"r" +"kptfmys" +"fwxzikfhczkjwyjszqdbkepaeellc" +"nlqpsvbrbd\\ns" +"qryuwkjiodw\"\"vaqyq\"dmyifm" +"tw\x15kdmaudjl\\zorhp\"alwh" +"aatrvczesykekkjfyb\"kb" +"usqcutbqbxxhucwxo\xc1ltb\"j\"bghjcvws" +"ilhsrnzxkz" +"bianqfdfdhvw" +"hqibqs\x7ax\"qoxqoaqtcsz" +"htxtoojbbauztwxuiq\\ngyfy\\obzc" +"rxn\\moxlj" +"mtus\x84erh\"dbe" +"asx\x50huvsitcxadt" +"\"bugggtnrc\"\"kl\"hmpu\x83hqrvhpo" +"ewisbp\"\"vuzf\\w\x5fvalszdhl" +"scusplpwxfnxu\x57\"zynpn\x99xerc\\ri" +"m\\kinmkke\x0cl" +"xhuzit\x7fd" +"kfbo\x04\x50ruqirn" +"t\"\"xpbdscmdoug" +"punvpsgnbgyxe\"sptmpz" +"bxukkazijr" +"nxyrcdaoo\"rjkk\"wntehcvcip\"vrd" +"rdpvqskmihqaw" +"p\\gwdhtqnpgthod" +"nwnuf\"\"yebycearom\"nqym\"\xd4sii\xccle" +"alda\"ptspo\"wkkv\"zoi\"hkb\"vnntyd" +"ixpgpfzbqv" +"znui\"\\fzn\x03qozabh\"rva\"pv\x67" +"e\"zswmwuk" +"hcccygwfa" +"ngmace\\rtyllolr\"\x68bw" +"\\c\"jyufbry\"ryo\"xpo\x26ecninfeckh\\s" +"hdnpngtuc\"dzbvvosn\x31fwtpzbrt" +"hesbpd\xd4" +"dsdbstuzrdfmrnyntufs\"dmv" +"d\xeeibcwhcvkt" +"fvzwrsfjdqdmy\"\"v" +"ns\"dqafz\\lkyoflnazv\"mn\x37\"o\"yj\"e" +"dypilgbwzccayxa\"bnmuernx" +"q\xa9ztqrhreb\"\"kxfeyodqb" +"iz\xa5qjxqulaawuwz\"rqmpcj\\yel" +"z\"\\pq\"\"y\x67zpjtn" +"ifxqvivp\"kiiftdoe" +"jxzebj\"\x35\"qr\"ecglcutuoyywqumcs\"kk" +"q" +"yob\x85qmpuwexptczbkrl" +"cjiavv\"uudpozvibyycnmxhxpxmpjoz" +"xro\\uiqyrcid" +"nod\\k" +"d\"neiec" +"tqyrqvwyvmz\\pzgzzcqsqsrgbqbtapoz" +"r\"xvocpeuxfxslgueb\x05kzyyie\"aoec" +"\"du\\uirlhcbgv\\cjqhfreqnvn" +"zp\x04\x15\"pbjwhrjtmiba" +"\\cv\"" +"k\"rwnb\\hiu\"rqd\"rc\\nyakrhly" +"klrmafjzandiddodgz" +"xipzhqzhvlpykzcuppx" +"zdvrvn\xd0mtfvpylbn\\\\sxcznrzugwznl" +"ody\\pvm\"kpjiudzhxazirgxzvumeat\"o" +"kllvhdp\"prjikzrrc\"adgpegc\\\"gk" +"sqtpug\xbcaauxaamw" +"wegxxrrxdvpivrqievfeokmnojsk" +"\\bo" +"gijhz" +"ylowluvabwrigssdgtxdwsiorxev\xdd" +"\"" +"ghnsrnsqtxpygikahkrl" +"\"rcfqkbjf\"sgxg\"vnd\\rotn" +"ap\"smgsuexjrbuqs\"mpbstogj\"x" +"koaunz\\sgt\"opv" +"yialiuzwix" +"yp\"ndxgwzml\"bt" +"lpcjxmggfsy\\szbxccarjkqzasqkb\xcfd\x0c" +"x" +"mgakc" +"vjieunoh\x73fjwx" +"erbvv\"qulsd" +"mimycrbfhqkarmz" +"tihfbgcszuej\"c\xfbvoqskkhbgpaddioo" +"mziavkwrmekriqghw" +"izk\\tnjd\\ed\\emokvjoc" +"c\"nhbqzndro\\g" +"usfngdo" +"aypljdftvptt" +"ym\"afvq\xbcc" +"zabi\"wjpvugwhl" +"ebvptcjqjhc\"n\"p\"dxrphegr\\" +"mzlqqxokhye\xd9\\rffhnzs" +"hnipqknwpsjakanuewe" +"rqgbfcjdrmiz\"h" +"kzzp\\z\\txmkwaouxictybwx" +"yzmspjkqrteiydswlvb" +"gjpxklgpzv\"txri\\hotpuiukzzzd" +"p\"rxergtbsxmjmkeeqwvoagnki\"" +"santipvuiq" +"\"ihjqlhtwbuy\"hdkiv\"mtiqacnf\\" +"oliaggtqyyx" +"fwwnpmbb" +"yrtdrieazfxyyneo" +"nywbv\\" +"twc\\ehfqxhgomgrgwpxyzmnkioj" +"qludrkkvljljd\\xvdeum\x4e" \ No newline at end of file diff --git a/src/puzzles/2015/y2015d08.cppm b/src/puzzles/2015/y2015d08.cppm new file mode 100644 index 0000000..6852928 --- /dev/null +++ b/src/puzzles/2015/y2015d08.cppm @@ -0,0 +1,36 @@ +module; + +#include "../../base/core_debug.h" + +export module y2015d08; + +import core_types; +import core_string; +import core_result; +import core_memory; +import aoc_value; + +using namespace base; +using namespace str; +using namespace aoc; + +export namespace y2015::d08 { + + aoc::Value part1(Arena& arena, Str8 raw) { + BASE_ASSERT(raw.len > 0); + arena.scoped_scratch([&](Arena& arena) { + arena.alloc_array(20); + }); + return Value { ValueTag::Unsigned, { .u64 = 8 } }; + } + + aoc::Value part2(Arena& arena, Str8 raw) { + BASE_ASSERT(raw.len > 0); + arena.scoped_scratch([&](Arena& arena) { + arena.alloc_array(20); + }); + + return Value { ValueTag::Unsigned, { .u64 = 8 } }; + } + +} \ No newline at end of file diff --git a/src/puzzles/puzzles.cppm b/src/puzzles/puzzles.cppm index d25d8ca..c56d67e 100644 --- a/src/puzzles/puzzles.cppm +++ b/src/puzzles/puzzles.cppm @@ -16,6 +16,7 @@ import y2015d04; import y2015d05; import y2015d06; import y2015d07; +import y2015d08; using namespace base; using namespace mem; @@ -202,6 +203,15 @@ export namespace puzzles { answers[1] = y2015::d07::part2(arena, rawR.value); } break; + + case 8: + if (spec.part == 1 || spec.part == 0) { + answers[0] = y2015::d08::part1(arena, rawR.value); + } + if (spec.part == 2 || spec.part == 0) { + answers[1] = y2015::d08::part2(arena, rawR.value); + } + break; default: console::print_err(Str8("Unknown spec or spec not yet implemented.")); From 68783b7a15d0f0cf3e492218e68f83ede2a398e6 Mon Sep 17 00:00:00 2001 From: "Eric Vincent (arch)" Date: Mon, 20 Jul 2026 10:13:11 -0400 Subject: [PATCH 3/3] day 8 --- src/puzzles/2015/y2015d08.cppm | 81 +++++++++++++++++++++++++++++----- src/puzzles/puzzles.cppm | 4 +- 2 files changed, 71 insertions(+), 14 deletions(-) diff --git a/src/puzzles/2015/y2015d08.cppm b/src/puzzles/2015/y2015d08.cppm index 6852928..1718c67 100644 --- a/src/puzzles/2015/y2015d08.cppm +++ b/src/puzzles/2015/y2015d08.cppm @@ -8,29 +8,86 @@ import core_types; import core_string; import core_result; import core_memory; +import core_console; import aoc_value; using namespace base; +using namespace console; using namespace str; using namespace aoc; export namespace y2015::d08 { - - aoc::Value part1(Arena& arena, Str8 raw) { - BASE_ASSERT(raw.len > 0); - arena.scoped_scratch([&](Arena& arena) { - arena.alloc_array(20); - }); - return Value { ValueTag::Unsigned, { .u64 = 8 } }; + + struct LineStats { + u16 code; + u16 chars; + }; + + LineStats count_chars(Str8& line) { + LineStats stats = {2, 0}; + for(u64 i = 1; i < line.len - 1;) { + // start at the second char, and loop to penultimate char, knowing + // that each line starts and ends with a double quote + if (line.str[i] == '\\') { + // we're starting an escape sequence + if (line.str[i + 1] == '\\' || line.str[i + 1] == '"') { + // we have a simple escape clause + i += 2; + stats.chars += 1; + stats.code += 2; + } else { + // we have a 3 character hex encoding + i += 4; + stats.chars += 1; + stats.code += 4; + } + } else { + // regular char + i++; + stats.chars += 1; + stats.code += 1; + } + } + return stats; } - aoc::Value part2(Arena& arena, Str8 raw) { + u16 reencoded_len(Str8 s) { + BASE_ASSERT(s.str != nullptr && s.len > 0); + u16 count = 2; + for (u64 i = 0; i < s.len; i++) { + count += s.str[i] == '"' || s.str[i] == '\\' ? 2 : 1; + } + return count; + } + + aoc::Value part1(Str8 raw) { BASE_ASSERT(raw.len > 0); - arena.scoped_scratch([&](Arena& arena) { - arena.alloc_array(20); - }); + u64 total_chars = 0; + u64 total_code = 0; + Str8 cursor = raw; + Str8 current = {}; + while (iter_next(cursor, current, '\n')) { + auto current_stats = count_chars(current); + total_chars += current_stats.chars; + total_code += current_stats.code; + } + auto ans = total_code - total_chars; + return Value { ValueTag::Unsigned, { .u64 = ans } }; + } - return Value { ValueTag::Unsigned, { .u64 = 8 } }; + aoc::Value part2(Str8 raw) { + BASE_ASSERT(raw.len > 0); + u64 total_old = 0; + u64 total_new = 0; + Str8 cursor = raw; + Str8 current = {}; + while (iter_next(cursor, current, '\n')) { + auto reencoded = reencoded_len(current); + total_old += current.len; + total_new += reencoded; + } + auto ans = total_new - total_old; + return Value { ValueTag::Unsigned, { .u64 = ans } }; } } \ No newline at end of file diff --git a/src/puzzles/puzzles.cppm b/src/puzzles/puzzles.cppm index c56d67e..cf3c3da 100644 --- a/src/puzzles/puzzles.cppm +++ b/src/puzzles/puzzles.cppm @@ -206,10 +206,10 @@ export namespace puzzles { case 8: if (spec.part == 1 || spec.part == 0) { - answers[0] = y2015::d08::part1(arena, rawR.value); + answers[0] = y2015::d08::part1(rawR.value); } if (spec.part == 2 || spec.part == 0) { - answers[1] = y2015::d08::part2(arena, rawR.value); + answers[1] = y2015::d08::part2(rawR.value); } break;