From 37b740f07a5545292a81887d6450f113c4219ecc Mon Sep 17 00:00:00 2001 From: ktkk Date: Thu, 11 Dec 2025 12:15:11 +0000 Subject: [PATCH 1/4] Finish day11, part 1 --- src/days/day11.zig | 76 ++++- src/days/input/day11.txt | 609 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 683 insertions(+), 2 deletions(-) create mode 100755 src/days/input/day11.txt diff --git a/src/days/day11.zig b/src/days/day11.zig index d16d9d5..cfbf883 100644 --- a/src/days/day11.zig +++ b/src/days/day11.zig @@ -1,7 +1,79 @@ const std = @import("std"); -pub const title = "Day 11"; +pub const title = "Day 11: Reactor"; -pub fn run(_: std.mem.Allocator) !void { +pub fn run(allocator: std.mem.Allocator) !void { + const input = @embedFile("./input/day11.txt"); + //const input = + // \\aaa: you hhh + // \\you: bbb ccc + // \\bbb: ddd eee + // \\ccc: ddd eee fff + // \\ddd: ggg + // \\eee: out + // \\fff: out + // \\ggg: out + // \\hhh: ccc fff iii + // \\iii: out + // ; + + var lines = std.mem.tokenizeScalar(u8, input, '\n'); + + var devices: std.StringHashMap([][]const u8) = .init(allocator); + defer { + var outputs_iter = devices.valueIterator(); + while (outputs_iter.next()) |value| { + allocator.free(value.*); + } + devices.deinit(); + } + + while (lines.next()) |line| { + const device = line[0..3]; + std.debug.print("device = {s}\n", .{device}); + + var outputs: std.ArrayList([]const u8) = .empty; + defer outputs.deinit(allocator); + + var outputs_iter = std.mem.tokenizeScalar(u8, line[5..], ' '); + while (outputs_iter.next()) |output| { + try outputs.append(allocator, output); + } + + const outputs_slice = try outputs.toOwnedSlice(allocator); + errdefer allocator.free(outputs_slice); + + try devices.put(device, outputs_slice); + } + + var paths_to_out: usize = 0; + visitOutputs("you", devices, &paths_to_out); + + var buffer: [8]u8 = undefined; + var stdout_writer = std.fs.File.stdout().writer(&buffer); + const stdout = &stdout_writer.interface; + + try stdout.print("{d}\n", .{paths_to_out}); + + try stdout.flush(); +} + +fn visitOutputs( + start: []const u8, + devices: std.StringHashMap([][]const u8), + paths_to_out: *usize, +) void { + const device = devices.get(start); + if (device) |outputs| { + for (outputs) |output| { + if (std.mem.eql(u8, output, "out")) { + paths_to_out.* += 1; + } else { + visitOutputs(output, devices, paths_to_out); + } + } + } else { + std.debug.print("device {s} not found\n", .{start}); + } } diff --git a/src/days/input/day11.txt b/src/days/input/day11.txt new file mode 100755 index 0000000..1c6713e --- /dev/null +++ b/src/days/input/day11.txt @@ -0,0 +1,609 @@ +smx: otc +mmh: gvp +gbo: hyf alz +laa: vky qjq +vrn: tbs tsr jix +xyl: xel eur wdj +sxm: out +wsd: kua hpv jep +qsj: ulu xel eur wdj +xwa: mtd xxf hnw +kai: ehr kaj +uuj: you +owb: ixr bps pim eez ejn syt qrx hxw vsy ghl gfu cgh mpk kfj +vky: owb wlw qic +ysd: mkp jbf btz xgg gbk tvg iju amm dws ykz azc blh xld rpr uek rcl zzy jhu +rbc: ski xyl sdx wpw +zmc: pal lwb rns hex +cuu: vyo +bqf: kmy exx ish +jbv: ysa +aog: ayv kwq +fcq: qic xss owb +hyg: out +xoz: llx kra cqn bzn swe tdo vnz zos duw +gnq: eya +qmk: fcq lyd +ggp: brz eya +oit: yyy quh brz +hjl: dtj lnc jps fyr +sqg: xbz upq +nil: diq +xqa: jei ipw tkt +ond: fft jko dqj pxe +and: ahn izm esa +cqf: xss +rqa: ryb rwu ono fyb +jps: byj fmv shn +ccg: ond afk tbu +dta: ctq jbw whr smq +ztx: hlm ctr vgo maf fkj +sdx: xel eur +xwb: dds +clh: ktb +rtn: quh eya +dac: nxc vug eou +nvh: kmf yga wtv +xgw: kep unr lju mtm +mdx: qmk fwk fbd +tbu: fft dqj pxe +vil: lyz aek +ona: zjk ovx dmv laa +bld: zbs +rms: vjs znm +oku: brz yyy +bzn: dmc fwa ykh vrn axj +uzl: ayv fuz qhs kwq +bhz: ggv +kfj: xqa ucr akl +koi: szi +mvo: dqp kjr rbc +rof: vgo hlm +ixt: jws nxc vug +ycf: out +dmc: tsr +nam: mvo +rkj: quh yyy eya brz +qxk: uty +lwb: phc esx +fqf: isr dax +eou: lqz ysd +lbb: out +hyf: fgh wem yen taw +dfv: nzl +pnh: lai +jon: eya +guf: shn +lmw: hlu mhq +jff: ngn gye +xxj: guf dtj lnc +fbd: fcq lyd +idw: cmg phc +zbs: hjl +lqz: blh ttg ykz jhu zzy uek rcl bld xgg gbk mkp amm iju tvg +shn: goi +hdc: wap pvr +odf: yey ggp jtc +rkk: zyi ubs +fyr: fmv vtv +pxe: ztx mmi +ntf: dds cst aff +lyz: gwp +pyt: zpv ias oiz +cqx: rod jnp +dtj: shn vtv +gfu: kai ctq +ycw: ryl ixt uut dac +yvb: jbv rms fez +lvx: tvz vyo +pvr: yat +oiz: zjk ovx dmv +biy: tdg +xbz: cqf +obk: jje +jcc: ssq daa +elu: ihl kep lju unr +jgf: qfx bhz +wbp: xxj cap hjl +nne: out +llx: axj ykh +kso: kuk ams +eod: nzl aap +ryl: nxc +epd: eou jws ats nxc vug +wqg: uzn yyf +qhh: lqz +fhu: hex idw pal +ipt: ema +vpo: cap xxj +thl: azd otc +ttg: vpo +uty: owb qic +brz: mdl eiw gam aog nam wqg jcc kgs nac bsk zpk kul snr uzl +faw: out +lzw: wlw xss owb qic +wap: iel yat qhh paa +ffr: vnn fiv +nug: sqg eyp sws eai dsh icy zrp mas dmf ccg hoq qze qde cqt zvl jrq gep +ygk: jon oit +eya: ppx nac mdl dej +lnc: byj fmv shn +nhq: kjv +biq: lav xhe vcg +hfn: pvr ydj +leg: oii zad jje +fft: rof taz +maf: qic +aap: rkj hrs svl +axv: esa +zou: ulu eur xel +jtc: yyy +pxc: gvr dyo omt +byj: nqz goi faw +ykh: jix tbs tsr +fai: cst nug aff +oty: nhq +cek: vvv ubs zyi +ufu: zen +xtk: kpg tap qzv +kil: dds aff +ojk: lqz +aly: qak lqz +xxf: aff cst dds +yua: oit ktb rwv +vlf: ujz +lbw: zyi uuj +zpk: nhp urn ctg +kuk: you ysd qak +tmy: esa +sqi: quh lvi +jrq: obk leg +yat: lqz +atl: zpv ias oiz ona obm +xhe: asz jbv +gdx: oii jje +ssq: fqf tap kpg qzv +quh: snr kul zpk bsk nac ufu yor dej ppx aog nam wqg eiw mdl +bvn: luk +zny: jon ktb rwv +jzw: aap plm +jqp: dac +mpk: euv llh +fpr: gwp zmc ulq fhu +ahn: qtl rtn +zyi: lqz ysd +ypn: mtd xxf +fgh: rkk +vgo: xss owb wlw +axj: jix tsr +kgv: kpg +gfa: ona obm zpv ias +eur: eij vil oxs xip hsd hdc gbo laz rnq lnj nuk xck twd jqp ycw btu abg koi cey hfn +bsk: oqd hmt kew +wrx: tas +jix: aff nug cst dds qvv +blc: yan +rwv: yyy quh eya brz +exx: blc dks +ujz: mwp +yyf: xya xmb fee +icq: mtm +hxw: viq eod +xii: fyb +lyb: drx mlf pkl +puw: ona ias +ilj: qfx xph +wlw: gfu ghl vlf cgh mpk yfx pbj qrx hxw jsq eez syt dta ejn bps hnj pim +icy: xbz +wdr: gbm kil +svl: lvi +dax: wdj eur +fwa: jix tsr +fyb: you ysd qak +whr: ehr kaj ogx nvh +agb: mag yan +duw: luk yzp nil +plg: yen taw fks wem fgh +zrp: pyt puw qyk gfa atl +phc: you qak lqz +aff: qze hoq qde mdx zvl jrq sqg dsh eai zrp icy mas dmf +ulu: lnj xck twd jqp btu ycw abg koi gqf hfn eij vil oxs xip nhi hsd hdc kku laz rnq +ezt: nug cst qvv dds +ccu: yyy brz eya +nuk: zpf +ubs: ysd +qyk: ona oiz +kua: wlw xss qic +ssa: kua +uds: ier vnn fiv +cbw: gvr +pln: wdj ulu +zos: htz ilj +viq: aap nzl +azd: jff +esa: rtn oku +rzd: eya brz +syt: euv cbo +drx: tdg +qjq: xss owb +jru: aat eoy dqu +vms: bzf gkm ffr uds +zen: vms zuv vci +qfx: wdr +amm: wbp vpo evr jmb zbs +hnj: sxp viq jzw +vtv: goi +kep: xnp yoh evy +evr: cap +gvp: yyy brz lvi eya +kxs: rod jru uvb +daa: jlo +fks: lbw cek +omt: dds +gtx: out +jws: lqz qak +eoy: out +qvv: fes dmf icy zrp eai dsh iyb sqg eyp sws gep jrq mdx zvl qfd qde qze hoq ccg +smq: kaj +kmy: agb +qde: atl +fez: znm mvj vjs +cey: wrx ryw lbx +ema: brz eya lvi quh yyy +zfg: cst nug aff qvv +pim: yip pxl ujz +zge: lzw +ykz: yrg bss smx +yyy: snr zpk uzl ufu bsk dej yte kgs gam eiw wqg +yor: kew +cmg: lqz qak ysd +xya: zou pln uaz +zpv: laa +yen: cek rkk fce iwk +boc: eay hlu +ygu: xya ofj +xnp: oic zfg eft xwb +nlb: izm +fmv: nqz +mag: aem wtx qrc pyc ipu +tdo: jgf +znm: sxm lbb +mtm: xnp +khk: ipt qvi +vyo: eur wdj +kye: out +uvb: dqu aat yvz +xck: lyz fpr aek arq +acb: wtv gts +gep: qxk upq +ihl: xnp yoh +eyp: qyk +lai: qsj +ipu: out +isr: ulu +qrc: out +jhu: bqf +eij: uut dac ryl epd +tvg: yrg thl mvu bss +pbj: ucr +cst: ccg sws hoq qze dsh qde cqt +yzp: xwa diq cft ypn +uut: eou ats +fee: zou +dqj: mmi taz rof ztx +rnq: arq aek +yfk: yvb zzh +lvi: jcc dej mdl gam aog nam zpk kul uzl ufu bsk nac +tap: sxw +jsq: dfv sxp viq jzw +tdg: aff nug cst dds +cgh: tmy oze nlb and +qzv: dax +jtn: xhe +kjr: ski wpw sdx xyl +ski: wdj xel +oqd: zuv +ppx: zen hmt kew +vcg: jbv +jbw: nvh +ctg: dqp +dcv: owb wlw qic +kzs: rxd lai cuu lvx +dws: bss yrg thl mvu +ara: dds qvv cst nug aff +ctr: owb wlw +ctq: ehr kaj acb +zpf: fgh fks +pyc: out +ras: gvr omt +iby: xxb rqa vlx +gam: mah ygu uzn +ulq: idw lwb pal +gkm: ier +cqn: pdv elu +tvz: ulu +obm: laa +btu: alz +wtx: out +xel: oty oxs vil eij hsd nhi hdc gbo kku lnj ycw btu jqp xck gqf hfn cey koi abg +uxa: lwb hex rns +yga: gnq +ppv: lav xhe vcg +upq: hzh cqf lzw uty +mvu: otc exw +yrg: otc azd +kul: qsu xtk ssq daa kgv +pif: mbd bzn mzo xhj wee jdf +xhy: wus khk mwp +ehr: wtv gts yga +fes: zge +rwu: you qak ysd lqz +hnw: cst +goi: out +hsd: alz zpf amk +hzh: wlw xss qic +lbs: vlx rqa +dds: mdx zvl qde qfd qze jrq zrp icy iyb dsh eyp sqg fes dmf mas +tsh: hpv kua +svr: xoz lak pif ryf dyv +gua: hlu +jei: jtc ggp +wpw: xel eur wdj ulu +jbf: biq jtn hut ppv yfk +hoq: qmk fwk cxr fbd +blh: evr vpo zbs jmb +mas: gdx +afk: jko pxe +zzy: lmw boc +vsy: tmy oze axv and +htz: xph qfx bhz +yte: mah ygu uzn rcr +zuv: bzf gkm ffr uds +yvz: out +ejn: dok llh euv +jlo: dax isr +qvi: gvp ema rzd +mdl: mah +wdj: hfn gqf cey koi jqp twd lnj rnq gbo kku hdc hsd oty vil eij abg ycw btu xck nuk nhi oxs +ias: dmv zjk ovx +laz: nhq +ish: blc +pkl: ezt ara +xhj: elu +tlp: ais +mux: zrm uvb +vci: bzf gkm uds +nie: wtx aem qrc +ike: wdj xel ulu +abg: pvr wap +ono: lqz +yip: khk +oze: ahn izm +lak: bvn mbd llx xhj lyb pxo +dmf: obk leg +wus: ipt qvi +oic: nug cst qvv dds +rpr: ifc fjg mfu +vvv: qak +qtl: lvi brz quh yyy +rqt: pdv icq +yoh: eft ntf oic +aby: nug dds +yfx: axv tmy +xmb: uaz pln +hrs: brz quh yyy +eez: llh cbo +lyd: qic owb xss wlw +dyo: dds qvv aff cst nug +evy: xwb eft ntf +plv: esz ktb jon +luk: xwa ypn +nqz: out +ier: wdj eur ulu +yey: quh eya lvi brz +otc: svv tlp jff +qze: leg gdx obk +aek: gwp ulq +mah: xmb fee xya +pxl: khk xux wus +wem: iwk cek lbw rkk +nhi: uut ryl epd +cui: out +qak: ykz xmj jbf rpr xgg blh +qwm: eya lvi brz quh +dsh: zge qxk upq xbz +hmt: zuv +bss: azd otc +rxd: vyo qsj +eay: uhs mux kxs +vnn: ulu wdj eur xel +iju: ckk lmw gua +fiv: wdj eur xel ulu +izm: rtn oku +xld: fjg mfu ifc +xph: ggv nqb +ija: rxd cuu +tsr: nug cst aff dds qvv +uaz: ulu wdj eur +ats: lqz you qak ysd +cft: xxf aby +taw: iwk cek lbw rkk +rns: ojk phc +qic: vlf eez cgh yfx dta syt bps hnj jsq +gqf: zpf amk plg hyf +ryb: qak +tbs: nug aff qvv dds +gbk: yfk +eiw: mvo ctg urn abp +kpg: sxw isr +pal: phc ojk esx +ais: nne hyg kye ycf +fjg: kmy +uzn: fee xmb +hpv: owb xss wlw qic +hlu: mux cqx +azc: ckk lmw boc +dqp: xyl ike +aat: out +fuz: srk pnh ija +ypw: jgf +pdv: kep +dmv: qjq vky +fya: llv iby lbs +plm: rkj +xux: ipt qvi mmh +gye: kye gme +zzh: fez asz rms +snr: ayv fuz qhs +ydj: qhh akg paa +rcr: ofj fee xmb xya +kaj: wtv kmf yga +lju: yoh evy +ebo: sqi jtc yey +vlx: rwu ryb ono +tas: xxb xii +wee: pdv xgw +fkj: owb wlw +xro: ilj htz jgf +hum: lqz ysd +kku: bsy aek lyz +euv: clh plv yua ygk +akl: ebo jei tkt odf +lnj: fya lbx +lbx: iby lbs +mhq: cqx uhs +hut: vcg zzh +szi: mnj ams +ysa: sxm rni lbb +vug: you +llh: ygk yua zny plv clh +nzl: hrs +uek: mvu +mmi: maf vgo hlm +eft: dds cst +dok: zny yua clh plv +kmf: npf lef nsp +mnj: you qak ysd lqz +paa: qak you +ghl: xhy +ggv: kil gbm fai lvh +jje: ssa +jko: mmi +srk: rxd +yan: ipu +nxc: lqz you qak +gts: qwm npf lef gnq +qrx: kai smq whr +ovx: oiw +unr: evy xnp +kew: vms vci +sxp: aap +oii: tsh wsd +cbo: ygk clh +xip: wrx lbx +sws: ond tbu +abp: rbc +tkt: ccu ggp +diq: xxf mtd hnw +gvr: nug cst +ipw: jtc ccu +arq: uxa gwp ulq +iwk: vvv uuj aly zyi +mfu: exx kmy +dks: nie mag +twd: fpr lyz arq bsy +fwk: lyd +jnp: eoy aat +nsp: brz eya yyy +xss: vsy bps ixr hxw syt pbj kfj gfu +nac: kgv xtk qsu +oiw: qic xss owb wlw +svv: ais gye +mtd: cst dds qvv +ixr: and nlb axv +jdf: pxc cbw +dyv: dea wnr xro ypw xlu +qfd: afk ond +wtv: qwm nsp +xxb: rwu ryb fyb ono +wnr: xgw elu +uhs: uvb zrm jnp rod jru +asz: mvj vjs +eai: gfa puw +ofj: uaz +vnz: pkl +kgs: mvo urn abp ctg +fce: ubs uuj vvv +pxo: vrn fwa dmc ykh +cxr: lyd fcq dcv +xgg: ifc +mzo: biy pkl mlf +gwp: pal idw rns hex +you: dws amm iju tvg bld xgg jbf btz mkp jhu uek blh xld ykz ttg azc +jep: wlw xss +nqb: lvh +zrm: yvz eoy aat cui +zmm: odf ipw jei +kjv: qak ysd +akg: you ysd lqz +lvh: qvv dds aff cst +ogx: gts yga +urn: kjr rbc +bsy: uxa fhu zmc gwp ulq +lav: asz fez +exw: svv +esz: lvi +sxw: eur xel +ams: lqz +qsu: fqf kpg tap +bps: akl zmm xqa +ayv: srk pnh ija kzs +gme: out +oxs: szi nhq kso +hex: esx hum ojk cmg phc +xlu: luk +aem: out +mlf: ara +kwq: srk pnh kzs +jmb: xxj cap +dqu: out +iel: ysd +ucr: ipw +cqt: fbd qmk fwk +nhp: dqp kjr +ifc: ish +llv: rqa xii xxb +dea: luk yzp nil +ngn: nne gme ycf hyg +ryf: xlu rqt swe bvn lyb duw cqn bzn jdf wnr wee ypw pxo vnz xhj zos +lef: brz quh +mbd: pxc +cap: dtj guf +rcl: wbp evr vpo jmb +zvl: fbd cxr fwk +btz: lmw gua +ktb: brz yyy +taz: ctr hlm vgo fkj +mkp: jtn hut yfk ppv +iyb: afk tbu +gbm: nug dds +swe: ras +ckk: hlu eay +rni: out +bzf: fiv +qhs: ija +rod: yvz +amk: yen taw +vjs: rni sxm +hlm: owb xss +zjk: oiw +mvj: gtx rni +ryw: iby llv +npf: quh brz lvi +zad: ssa tsh +esx: lqz ysd +mwp: mmh +alz: wem yen +kra: luk nil +xmj: smx +dej: kew From f85eda4e870dba5bd8fe6b5b1f2ff05c9167856d Mon Sep 17 00:00:00 2001 From: ktkk Date: Thu, 11 Dec 2025 15:48:33 +0000 Subject: [PATCH 2/4] WIP: implement part 2 --- src/days/day11.zig | 39 +++++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/days/day11.zig b/src/days/day11.zig index cfbf883..2525215 100644 --- a/src/days/day11.zig +++ b/src/days/day11.zig @@ -5,16 +5,19 @@ pub const title = "Day 11: Reactor"; pub fn run(allocator: std.mem.Allocator) !void { const input = @embedFile("./input/day11.txt"); //const input = - // \\aaa: you hhh - // \\you: bbb ccc - // \\bbb: ddd eee - // \\ccc: ddd eee fff - // \\ddd: ggg - // \\eee: out - // \\fff: out + // \\svr: aaa bbb + // \\aaa: fft + // \\fft: ccc + // \\bbb: tty + // \\tty: ccc + // \\ccc: ddd eee + // \\ddd: hub + // \\hub: fff + // \\eee: dac + // \\dac: fff + // \\fff: ggg hhh // \\ggg: out - // \\hhh: ccc fff iii - // \\iii: out + // \\hhh: out // ; var lines = std.mem.tokenizeScalar(u8, input, '\n'); @@ -47,7 +50,7 @@ pub fn run(allocator: std.mem.Allocator) !void { } var paths_to_out: usize = 0; - visitOutputs("you", devices, &paths_to_out); + visitOutputs("svr", devices, &paths_to_out, false, false); var buffer: [8]u8 = undefined; var stdout_writer = std.fs.File.stdout().writer(&buffer); @@ -62,14 +65,26 @@ fn visitOutputs( start: []const u8, devices: std.StringHashMap([][]const u8), paths_to_out: *usize, + visited_fft: bool, + visited_dac: bool, ) void { const device = devices.get(start); if (device) |outputs| { for (outputs) |output| { if (std.mem.eql(u8, output, "out")) { - paths_to_out.* += 1; + std.debug.print("found out! (fft = {any}, dac = {any})\n", .{visited_fft, visited_dac}); + if (visited_fft and visited_dac) { + std.debug.print("visited fft and dac\n", .{}); + paths_to_out.* += 1; + } + } else if (std.mem.eql(u8, output, "fft")) { + std.debug.print("found fft!\n", .{}); + visitOutputs(output, devices, paths_to_out, true, visited_dac); + } else if (std.mem.eql(u8, output, "dac")) { + std.debug.print("found dac!\n", .{}); + visitOutputs(output, devices, paths_to_out, visited_fft, true); } else { - visitOutputs(output, devices, paths_to_out); + visitOutputs(output, devices, paths_to_out, visited_fft, visited_dac); } } } else { From 76b70d3c6b3251b5a6352c7242a955818bf152fe Mon Sep 17 00:00:00 2001 From: ktkk Date: Thu, 11 Dec 2025 16:30:51 +0000 Subject: [PATCH 3/4] WIP: implement part 2 --- src/days/day11.zig | 49 +++++++++++++++++++++++++++++----------------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/src/days/day11.zig b/src/days/day11.zig index 2525215..b8084d4 100644 --- a/src/days/day11.zig +++ b/src/days/day11.zig @@ -5,6 +5,18 @@ pub const title = "Day 11: Reactor"; pub fn run(allocator: std.mem.Allocator) !void { const input = @embedFile("./input/day11.txt"); //const input = + // \\aaa: you hhh + // \\you: bbb ccc + // \\bbb: ddd eee + // \\ccc: ddd eee fff + // \\ddd: ggg + // \\eee: out + // \\fff: out + // \\ggg: out + // \\hhh: ccc fff iii + // \\iii: out + // ; + //const input = // \\svr: aaa bbb // \\aaa: fft // \\fft: ccc @@ -49,8 +61,11 @@ pub fn run(allocator: std.mem.Allocator) !void { try devices.put(device, outputs_slice); } + var cache: std.StringHashMap(usize) = .init(allocator); + defer cache.deinit(); + var paths_to_out: usize = 0; - visitOutputs("svr", devices, &paths_to_out, false, false); + try visitOutputs("svr", "fft", devices, &cache, &paths_to_out); var buffer: [8]u8 = undefined; var stdout_writer = std.fs.File.stdout().writer(&buffer); @@ -63,30 +78,28 @@ pub fn run(allocator: std.mem.Allocator) !void { fn visitOutputs( start: []const u8, + end: []const u8, devices: std.StringHashMap([][]const u8), - paths_to_out: *usize, - visited_fft: bool, - visited_dac: bool, -) void { + cache: *std.StringHashMap(usize), + paths_to_end: *usize, +) !void { + if (cache.get(start)) |result| { + paths_to_end.* += result; + return; + } + + var paths: usize = 0; const device = devices.get(start); if (device) |outputs| { for (outputs) |output| { - if (std.mem.eql(u8, output, "out")) { - std.debug.print("found out! (fft = {any}, dac = {any})\n", .{visited_fft, visited_dac}); - if (visited_fft and visited_dac) { - std.debug.print("visited fft and dac\n", .{}); - paths_to_out.* += 1; - } - } else if (std.mem.eql(u8, output, "fft")) { - std.debug.print("found fft!\n", .{}); - visitOutputs(output, devices, paths_to_out, true, visited_dac); - } else if (std.mem.eql(u8, output, "dac")) { - std.debug.print("found dac!\n", .{}); - visitOutputs(output, devices, paths_to_out, visited_fft, true); + if (std.mem.eql(u8, output, end)) { + paths += 1; } else { - visitOutputs(output, devices, paths_to_out, visited_fft, visited_dac); + try visitOutputs(output, end, devices, cache, &paths); } } + try cache.put(start, paths); + paths_to_end.* += paths; } else { std.debug.print("device {s} not found\n", .{start}); } From 524b451399f6cd8bcf77db8034b70982c6d77108 Mon Sep 17 00:00:00 2001 From: ktkk Date: Thu, 11 Dec 2025 18:40:52 +0000 Subject: [PATCH 4/4] Finish day11, part 2 --- src/days/day11.zig | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/src/days/day11.zig b/src/days/day11.zig index b8084d4..5e7686a 100644 --- a/src/days/day11.zig +++ b/src/days/day11.zig @@ -63,15 +63,29 @@ pub fn run(allocator: std.mem.Allocator) !void { var cache: std.StringHashMap(usize) = .init(allocator); defer cache.deinit(); + try cache.ensureTotalCapacity(devices.count()); - var paths_to_out: usize = 0; - try visitOutputs("svr", "fft", devices, &cache, &paths_to_out); + const dac_to_fft = try visitOutputs("dac", "fft", devices, &cache); + const svr_to_fft = try visitOutputs("svr", "fft", devices, &cache); + cache.clearRetainingCapacity(); + + const to_fft = if (dac_to_fft == 0) svr_to_fft else dac_to_fft; + + const dac_start = if (dac_to_fft == 0) "fft" else "svr"; + const end_start = if (dac_to_fft == 0) "dac" else "fft"; + + const to_dac = try visitOutputs(dac_start, "dac", devices, &cache); + cache.clearRetainingCapacity(); + + const to_end = try visitOutputs(end_start, "out", devices, &cache); + + const result = to_fft * to_dac * to_end; var buffer: [8]u8 = undefined; var stdout_writer = std.fs.File.stdout().writer(&buffer); const stdout = &stdout_writer.interface; - try stdout.print("{d}\n", .{paths_to_out}); + try stdout.print("{d}\n", .{result}); try stdout.flush(); } @@ -81,11 +95,9 @@ fn visitOutputs( end: []const u8, devices: std.StringHashMap([][]const u8), cache: *std.StringHashMap(usize), - paths_to_end: *usize, -) !void { +) !usize { if (cache.get(start)) |result| { - paths_to_end.* += result; - return; + return result; } var paths: usize = 0; @@ -95,13 +107,14 @@ fn visitOutputs( if (std.mem.eql(u8, output, end)) { paths += 1; } else { - try visitOutputs(output, end, devices, cache, &paths); + paths += try visitOutputs(output, end, devices, cache); } } try cache.put(start, paths); - paths_to_end.* += paths; + return paths; } else { std.debug.print("device {s} not found\n", .{start}); + return 0; } }