From 9ef7abed947f5839bce7c0dcdd041522dde23fc8 Mon Sep 17 00:00:00 2001 From: Andre Henriques Date: Thu, 11 Dec 2025 23:41:44 +0000 Subject: [PATCH] Day 11 --- Cargo.toml | 4 + src/day11/act.txt | 604 ++++++++++++++++++++++++++++++++++++++++++++ src/day11/main.rs | 125 +++++++++ src/day11/test.txt | 10 + src/day11/test2.txt | 13 + 5 files changed, 756 insertions(+) create mode 100644 src/day11/act.txt create mode 100644 src/day11/main.rs create mode 100644 src/day11/test.txt create mode 100644 src/day11/test2.txt diff --git a/Cargo.toml b/Cargo.toml index 8bc870b..2ecdeb4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -43,6 +43,10 @@ path = "src/day9/main.rs" name = "day10" path = "src/day10/main.rs" +[[bin]] +name = "day11" +path = "src/day11/main.rs" + [dependencies] anyhow = "1.0.100" diff --git a/src/day11/act.txt b/src/day11/act.txt new file mode 100644 index 0000000..86d5580 --- /dev/null +++ b/src/day11/act.txt @@ -0,0 +1,604 @@ +zmg: vew ynx rdv kzq +fho: drg +qtg: bcp kzq +nbp: fkn +oaa: ulw zyf +fyy: dwh vjr cdg miw +rwj: kkt hdz irr ovu +qoy: rao eev wzh wkc +jzz: glp pwf fwp +aqu: swy txo nqu mla +yws: zxh fft +rdd: zbw cqw +hoo: bfn amg vyd dod ovp kii +bnz: vdk +shw: gzx +iep: zbw +mxl: udq owi yhh rrk +izl: tfr +oku: pvp +omu: pvq tsj hfl +xwc: bdu tuz tkz +tjf: rek vil +uak: bko +idt: yrr +que: yyb aqu cfl +tmg: eev +ybn: hfe qou xrk +dgj: jbz you fhk hoo +hfl: fmn gzw sug +mix: gzx +cwn: fhk you jbz +rek: dfy ued zya nnk +sug: utp btl lzb hor ndl uuw kyi zqd jdq cfs nvd acs pyx pbm eqc ome +lan: kkt ovu irr +miy: uub gyg yol tua +dev: out +ykn: fea rlv how ksp +yom: fhk +tcl: fnb +nnk: hdz kkt +wau: rtw vuk aoe +amz: nxs vku +nqy: fdp wyk +bdj: hit ytb tcl +bgd: uru mhm +zdl: fps pmc maa frp +wrv: sug cjl gzw fmn +feh: irc ojk +efc: out +zst: rta knd +nqi: gyt pwv +snz: out +fea: wqv hse rqw +tqh: fea +hho: isx whl yiz +tkz: zkq +omh: uuu +dxu: dwh vjr sfc cdg miw +wzh: zbx tjd +iyj: bgw mug +naw: hhm pkw hwn +qdf: tjr +vku: kez abg qmx +udf: ulz +mhj: tmg ffw qoy flj nyf ybn que fxt rua rys vyu cri aoh nuf fik jsk wmy epz +uuy: sug +roi: out +abz: isx yiz +cvr: isx yiz whl +xrw: fwp pwf fnk glp +rta: yug thh +lyu: efc yxj iof hgu kpd +qwv: fkn gzx lzk +aum: yrx ubo +uuu: fmn gzw cjl sug +hjd: hbs +epr: maa frp pmc srx fps +sav: dst +rng: qou xrk +jue: rdd cze +wzl: out +nwn: gyt cwn +flj: aqu yyb +cdj: kxf daa +zln: nxs owg vku +pmu: kwh pql +tqw: lzk jhf gzx fkn +txo: nfb eez prz wkl +bko: gzx fkn jhf lzk +cym: plo +ovp: plo imv ums sjv +sjv: vre qtg +uzz: irr +nxs: kez aum qmx +hwe: cqb abv +lak: weu rtq +gvt: iyd +bcm: frp fps +pli: mug pfl pxs +gxw: jyz +nrb: sem pmu kcm teh +ffw: cfl +teh: pql vnb kwh +zdh: pvn +ome: byz lql +jnl: mdt ajt yzg nvq lfk aco yws kpp wff vxd nrb evs tjx cdj zdl kml ipx kkf vaw xjv +yxj: out +lof: sug gzw +hwn: you hoo +eva: jiq dny jky yom +rgs: qke abv cqb +fxt: tlz qtc +fft: mbr uuu +xjw: rtq +fnp: fnb ctz jnl wpq zvu +dcw: out +rms: pym lyu +nwy: wxb bko qkz shw gvo +wpq: aco nrb zdl epr mdt +lpf: jho +tzo: wkm yns ndo +kii: yag gel +oty: dmu +cjl: vkl ndl eqc hor pbm hki nvd lzb btl utp jdq zqd qlt +kdw: evf dxu +inn: jnl zvu wpq ctz +idv: yol uub gyg +epz: yyb +ovu: zst kdw czw xrw alk hkm kha sor gct ytl wvx ixw edo qmw vvm qdf jzz eat +gel: bdu +oic: rms +arh: cvo wkq toa vdh +bgw: yoo +grv: wkm +duj: emk +tog: sem kcm teh +srx: omu otm qpk +pdv: rek asl vil +cvj: pdi +utp: pdv ugr jho +ufz: sug fmn gzw +vvm: eem +imv: ses zmg vre +uzk: oty nlq +pwv: jbz +xhr: jti ufz uls +xwa: cxv xjw qbx lak +kbb: jnl zvu fnb +chx: jhf +nxn: fxt wmy que jsk rng oxu flj tmg ybn +kkt: alk hkm bfb zst kdw xrw czw tnr ixw edo vvm qmw jzz eat qdf kha sor gct lsg ytl +vqb: fmn gzw +ytb: zvu fnb +pmm: hhm +evs: fho vyk +far: iep kir axy cze +hkt: zev uga +fwp: cdu pdk szr oaa +lfk: vyk dqg +hkv: shw wxb gvo +rgv: ctz fnb jnl zvu wpq +plo: vre ses zmg +qmw: tjr hmb +ari: kxu +xrk: bdj gfq +jyz: rwj ryf +jho: asl rek +irm: you hoo +hit: jnl ctz fnb +yug: xfk trd ffe +edo: tjr hmb ibe +qiu: fdp wyk +glp: szr pdk cdu +ohw: ary +ytl: evf +aaf: tcl rgv +eqc: zkb mxl zke +aco: frp srx pmc +eem: ari jvj +wkc: ubu zbx +jdq: byz tue +udq: ovu irr ybz kkt hdz +vyd: hlf sur rpe ntd +kez: yrx szz ubo +gvn: wpq jnl fnb ctz +wvx: fyy dxu +cvo: out +nev: uls tqy ufz jti +ipx: sem +gqb: izl +vfz: wkm yns ndo +sor: buf +lsg: knd +uuw: mxl zkb +ufu: bqi ssr yag +qmj: pwv +ruw: vuk fnp aoe +zya: ybz irr +tuz: bnz oai +rdv: sjc bew +tyc: znl +dfy: irr ovu kkt +wkm: irm dgj yqu +kyi: jho pdv tjf +pyx: zke +rrk: ovu irr hdz +mhm: cxv xjw qbx +ynx: vdf arh +zxh: uuu +zot: uuy kvl +pkw: jbz hoo +dqg: bww vqb kvl +axb: vyi +ajt: dzl haw nii hkt +wyk: pvn fnu myf +geg: out +ntd: uzk ggo +bgt: zdh +xfk: zih +qoq: xiw woi dcw geg smh +yzg: pmu teh sem +rqe: jti ufz tqy +ybz: czw xrw bfb hkm lsg kha gct edo qdf jzz eat qmw +zkq: vkn vdk ufm +vyu: ruw boq wau +cdg: uak +rlv: oic hse +ugr: rek +myf: fhk you hoo +bso: jcg mvt aji yny +ozr: kkt hdz irr ovu +uub: zvu jnl fnb ctz +czw: fwp +pmc: omu qpk usl +prz: kbb urb +vaw: zxh fft zrw +cph: out +inh: ble +dmu: woi dcw +emk: nqs dac +rao: zbx +ipm: pdk +kcm: kwh +wxb: gzx +jbq: hvb rys rua fxt nyf ybn yrj tmg ffw qoy flj epz jsk nuf vyu cri +ary: oty nlq iyd +ypy: vis jsp qmj nqi nwn +isx: deb naw pmm +wmy: hfe +shb: hhm hwn xik +znl: qit zpr ryf +cze: sby +xiw: out +dny: hoo +kxu: fkn jhf +cre: auy +wzq: gzx lzk +pym: iof hgu efc yxj +wby: jcg +aik: ojk gvn irc +wra: vyi jcg aji +xuq: hoo +ffe: wzq +qmx: dwf +ana: ulz cut +qbx: weu rtq +qlt: rez sbk cre hjd +bew: wkq cvo roi vdh toa +vdh: out +xbo: xln +szz: usg qtz +toa: out +jbz: cxl vyd cym elv ufu sfh +zkb: lan udq +kxf: nev rqe +cxl: imv ums +ral: lak +jsp: cwn +cwr: jhf +pfl: yoo yrg +xln: out +jky: jbz hoo fhk you +sur: jem gvt +rxy: out +jcg: nbp chx tsb mix +btl: pny jue +bqi: tuz +rys: rao eev wzh zkn wkc +pny: cze iep axy rdd +tue: gxw cxu +zke: lan owi +cqw: kkt ovu +vmw: lyu +gab: cut emk +smh: out +kvl: sug fmn gzw +vjv: zpr ryf rwj qit +uru: cxv xjw +ksp: hse wqv +sfc: eky uak nwy hkv +hhm: hoo fhk jbz +fdp: pvn hfc myf +gvc: jbz +asl: dfy zya +fnk: oaa +mfs: yat +vuk: ctz fnb zvu wpq jnl +maa: oku omu +cza: yny +nvd: far pny +qkz: jhf gzx +sbk: hbs hut +rpe: jem ggo +elv: gel xwc bqi yag +qlg: bgw +tnr: hmb +yrg: you fhk hoo +mbi: lzk fkn +pdf: ksp fea how rlv lvc +frp: qpk +owg: aum kez +utj: sug gzw +bfb: ipm glp pwf fwp +byz: gxw cxu +buf: jvj hrd yrr ari +hrk: kpd efc yxj +trd: qwv wzq +hor: hsv far pny jue +tgh: wzq zih +szr: zyf +zev: sav vkg uhr +irr: wvx gct kha lsg vvm jzz eat ixw edo xrw kdw czw tnr zst hkm +fps: oku +yrx: xbo usg qyt qtz +vnb: utj vqm +zyf: fkn jhf lzk +lzk: udf duj tzo haa pfh uwc +axy: cqw zbw +sfh: hlf rpe sur +oai: ufm +ojk: zvu wpq ctz fnb +vxd: dqg zot +mvm: fmn +yiz: fdk +fdk: pkw hwn xik +tsb: fkn gzx +nuf: wau boq +gyg: wpq zvu jnl +jvz: wyk zdh +boq: aoe fnp vuk rtw +ckx: out +ffm: cjw pdi +jti: fmn cjl +eaq: lzk +hhy: ovu ybz hdz +urb: fnb ctz +yrj: ruw wau +lql: trg tyc +you: qsz bqf tqh zln kii bgd pth +lca: ypy tfr rwd +ble: bgt nqy +sby: ybz hdz kkt ovu +war: tqy +nii: aub zev hmp +fnb: zdl nvq tjx tog ljh vaw ipx +vkn: snz rxy cph +iof: out +cfl: swy nqu mla +cqb: nqy qiu +swy: nfb lhi eez prz wkl +jiq: you hoo jbz +lni: wkq cvo toa roi vdh +uhr: dst rjv +nfb: inn kbb urb +afj: xjw cxv jrw qbx lak +usl: pvq +pxn: zvu ctz +dod: rpe ntd ohw +gzw: lzb lpf utp jum vkl uuw ndl hki qlt kyi cfs jdq pbm eqc acs nvd pyx +hki: tue byz +tua: ctz wpq zvu +hmp: ocz +tve: kud yug +qpk: tsj pvp pvq +iyd: prb dmu +jrw: rtq kwa +ndl: jho tjf +hdz: vvm hkm alk tnr sor zst +evf: cdg miw +nbl: ozr +ibe: wby bso axb wra +coy: nwn nqi qmj vis +kha: eem idt +irc: fnb ctz jnl wpq zvu +cfs: zke zkb mxl +kzq: arh vdf +gct: rta +mbr: gzw fmn sug +cdu: zyf tqw +vkg: mvm +nqu: wkl prz eez lhi +pql: utj lof bhd +pvq: fmn gzw sug cjl +zpr: kkt ybz irr +qsz: ums sjv +dwh: eky nwy ozt hkv +cjw: out +fjn: pym hrk +zih: fkn gzx jhf +eez: inn +ulz: nqs eva dac +ufm: ckx snz cph +whl: fdk naw deb shb +hsv: iep axy kir cze +qyt: dzo +rtq: gbo ffm cvj +cyf: yat +ssr: tkz +yol: wpq +yny: tsb mix +ubu: idv miy +cxv: kwa rtq weu +hmb: cza wby +brs: out +deb: pkw +bhd: gzw fmn cjl +ewj: vku +abg: ubo szz dwf yrx +prb: xiw geg +jvj: eaq dlc +qit: ybz hdz ovu irr +vkl: tal tue +tjd: miy +eev: tjd ubu zbx +usg: wzl dzo xln +miw: hkv uak nwy +ulw: lzk jhf +yag: bdu tkz tuz +weu: gbo mkb ffm +hkm: knd +mdt: zrw fft omh +aji: chx tsb mix mbi +trg: vjv nbl +eky: gvo +ubo: qyt +abv: bgt qiu +pwf: cdu pdk szr oaa +jem: iyd nlq +csr: yol uub gyg +yyb: nqu txo +zrw: wrv mbr +qou: gfq aaf bdj +kpp: daa +sem: vnb kwh +hvb: qou +uwc: ulz +mkb: pdi dev +amg: afj xwa uru ral mhm +pth: afj xwa mhm +how: wqv rqw +dwf: qtz usg qyt +jum: zkb zke +woi: out +yat: tfr coy ypy +pvn: jbz hoo +alk: tve knd rta +sjc: wkq roi toa +ryf: kkt ovu +vjr: nwy uak ozt hkv +abw: gyh cri vyu rng jsk fik nuf wmy ybn nyf tmg yrj ffw flj qoy oxu rys hvb que rua fxt +ums: zmg ses +fhk: amg cxl ewj amz pdf cym tqh sfh zln ykn +gbo: icr +tfr: jsp +fmn: pyx acs nvd ome eqc cfs jdq zqd kyi qlt hki ndl hor utp jum lpf btl lzb +gfq: hit pxn tcl +ndo: yqu irm +hgu: out +yhh: ybz hdz ovu irr +otm: pvp hfl +qla: isx yiz +dzo: out +wqv: vmw fjn rms +bww: gzw sug cjl +qtz: xln wzl +tjr: bso wra axb cza +hbs: uzz +yrr: cwr +gyt: you hoo +wff: daa +bfn: ohw sur rpe +yoo: fhk hoo jbz +ixw: fnk +dzl: zev hmp +tqy: fmn +zkn: tjd zbx +cri: aik feh qtc +daa: xhr +lvc: hse rqw +cxu: znl vjv +vqm: fmn sug +nqs: jiq jky +rjv: sug cjl fmn gzw +kir: sby zbw +kml: dqg +qke: qiu jvz nqy +svr: nxn mhj ybx abw jbq +pbm: rez sbk +haw: uga aub hmp zev +drg: gzw +eat: evf +kpd: out +pdg: ovu kkt hdz ybz +hlf: uzk ggo ary +tjx: teh kcm sem +ses: rdv kzq vew ynx bcp +oxu: boq ruw +zbw: irr +ozt: bko qkz wxb +vre: rdv ynx bcp +aub: vkg uhr +tmp: xhr war rqe +pdi: out +hse: fjn +gyh: qtc feh +nlq: dmu qoq +zvu: tjx cdj zdl kml ipx kkf vaw bcm epr ljh ajt nvq lfk aco yws kpp wff vxd nrb evs +rez: hbs auy hut +hfc: hoo fhk jbz +nyf: wzh rao +tal: trg +uga: vkg ocz +dac: jiq jky gvc dny +ued: ovu +thh: ffe tgh xfk +icr: out +rua: hfe xrk +bdu: oai bnz +kkf: hkt haw nyp dzl +rwd: vis nqi nwn +aoe: zvu jnl ctz +kwh: bhd lof vqm utj +dlc: fkn gzx jhf +vyk: kvl vqb bww +vyi: chx +hfe: gfq +xik: hoo fhk you jbz +tsj: cjl sug +vdk: ckx brs cph +dst: sug cjl fmn gzw +vil: dfy ued +ljh: tmp +ggo: oty nlq +aoh: boq ruw +hrd: dlc +yqu: jbz fhk you hoo +vdf: vdh wkq cvo +nvq: haw hkt dzl +gvo: lzk +mug: xuq +ctz: yws kpp yzg mdt lfk nrb wff vxd zdl kml cdj ljh tog ipx bcm +rtw: fnb ctz wpq +uls: gzw fmn sug +vew: sjc +knd: thh kud +pdk: tqw ulw +owi: hdz ybz +qtc: gvn ojk +fkn: hho udf vfz cyf wiy uwc inh iyj qlg grv mfs pfh qla abz pli cvr +pvp: sug +lhi: urb +nyp: uga aub +mvt: mix mbi tsb +ybx: nyf aoh flj yrj rys rng epz rua wmy +auy: pdg hhy +vis: gyt cwn +mla: nfb wkl prz lhi +hut: uzz pdg +jsk: wkc wzh eev rao +fik: cfl +bqf: fea rlv how ksp lvc +acs: tjf ugr jho +tlz: ojk +fnu: hoo +cut: dac +lzb: cre +wiy: pxs mug +pxs: yoo +jhf: haa uwc iyj wiy duj cyf udf gqb cvr ana pli tzo abz qla hwe qlg gab grv +zqd: sbk +ocz: dst +kud: trd ffe +yns: yqu dgj +gzx: vfz rgs gab gqb qlg udf inh ana iyj duj wiy +pfh: lca yat +xjv: kxf +haa: yiz +kwa: gbo ffm mkb cvj zcl +zbx: csr idv +bcp: bew lni vdf +rqw: vmw fjn rms +zcl: dev pdi cjw +wkl: kbb +wkq: out diff --git a/src/day11/main.rs b/src/day11/main.rs new file mode 100644 index 0000000..2231927 --- /dev/null +++ b/src/day11/main.rs @@ -0,0 +1,125 @@ +use anyhow::Result; +use std::{ + collections::{HashMap, HashSet}, + fs, +}; + +fn sol1() -> Result<()> { + let text = fs::read_to_string("src/day11/act.txt")?; + + let graph = text + .split("\n") + .filter(|a| a.len() > 0) + .fold(HashMap::new(), |mut g, m| { + let mut split = m.split(":"); + let node = split.next().unwrap(); + let outs = split + .next() + .unwrap() + .trim() + .split(" ") + .fold(HashSet::new(), |mut s, a| { + s.insert(a); + s + }); + g.insert(node, outs); + g + }); + + fn count_paths(t: &str, visited: &HashSet<&str>, g: &HashMap<&str, HashSet<&str>>) -> usize { + let mut visited = visited.clone(); + visited.insert(t); + let mut sum = 0; + for i in g.get(t).unwrap() { + if visited.contains(i) { + continue; + } + if *i == "out" { + sum += 1; + continue; + } + sum += count_paths(i, &visited, g); + } + return sum; + } + + println!("sol1: {}", count_paths("you", &HashSet::new(), &graph)); + + Ok(()) +} + +fn sol2() -> Result<()> { + let text = fs::read_to_string("src/day11/act.txt")?; + + let graph = text + .split("\n") + .filter(|a| a.len() > 0) + .fold(HashMap::new(), |mut g, m| { + let mut split = m.split(":"); + let node = split.next().unwrap(); + let outs = split + .next() + .unwrap() + .trim() + .split(" ") + .fold(HashSet::new(), |mut s, a| { + s.insert(a); + s + }); + g.insert(node, outs); + g + }); + + let mut node_hit: HashMap<&str, usize> = HashMap::new(); + let mut node_hit1: HashMap<&str, usize> = HashMap::new(); + let mut node_hit2: HashMap<&str, usize> = HashMap::new(); + + fn count_paths<'a, 'b>( + t: &'a str, + end: &'a str, + visited: &HashSet<&str>, + g: &'a HashMap<&'a str, HashSet<&'a str>>, + hit: &'b mut HashMap<&'a str, usize>, + ) -> usize { + let mut visited = visited.clone(); + visited.insert(t); + let mut sum = 0; + if let Some(n) = g.get(t) { + for i in n { + if visited.contains(i) { + continue; + } + if *i == end { + sum += 1; + continue; + } + if let Some(c) = hit.get(i) { + sum += c; + } else { + sum += count_paths(i, end, &visited, g, hit); + } + } + } + hit.insert(t, sum); + return sum; + } + + // after some testing there is not path from out -> dac or out -> fft or out -> src + // our fft -> dac + // so the result is just svr -> fft * fft -> dac * dac -> out + + println!( + "sol2: {}", + count_paths("svr", "fft", &HashSet::new(), &graph, &mut node_hit) + * count_paths("fft", "dac", &HashSet::new(), &graph, &mut node_hit1) + * count_paths("dac", "out", &HashSet::new(), &graph, &mut node_hit2) + ); + + Ok(()) +} + +fn main() -> Result<()> { + sol1()?; + sol2()?; + Ok(()) +} diff --git a/src/day11/test.txt b/src/day11/test.txt new file mode 100644 index 0000000..01e5b43 --- /dev/null +++ b/src/day11/test.txt @@ -0,0 +1,10 @@ +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 diff --git a/src/day11/test2.txt b/src/day11/test2.txt new file mode 100644 index 0000000..d787665 --- /dev/null +++ b/src/day11/test2.txt @@ -0,0 +1,13 @@ +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: out