From 84a0c421b2ad8ba02138c84abee52317f43a6cb5 Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Thu, 11 Dec 2025 09:08:28 +0100 Subject: [PATCH] day11 --- day11.py | 84 ++++++ inputs/input11 | 609 +++++++++++++++++++++++++++++++++++++++++++ inputs/input11_test | 10 + inputs/input11_test2 | 13 + 4 files changed, 716 insertions(+) create mode 100644 day11.py create mode 100644 inputs/input11 create mode 100644 inputs/input11_test create mode 100644 inputs/input11_test2 diff --git a/day11.py b/day11.py new file mode 100644 index 0000000..3a42e5e --- /dev/null +++ b/day11.py @@ -0,0 +1,84 @@ +from collections import deque + +from tools.aoc import AOCDay +from typing import Any + +class Device: + def __init__(self, name: str): + self.name: str = name + self.outputs: list[Device] = [] + self.inputs: list[Device] = [] + + +class Day(AOCDay): + inputs = [ + [ + (5, "input11_test"), + (634, "input11"), + ], + [ + (2, "input11_test2"), + (377452269415704, "input11"), + ] + ] + + def parse_input(self) -> dict[str, Device]: + devices = {x.split(":")[0]: Device(x.split(":")[0]) for x in self.getInput()} + devices["you"] = Device("you") + devices["out"] = Device("out") + for line in self.getInput(): + device, outputs = line.split(": ") + for output in outputs.split(): + devices[device].outputs.append(devices[output]) + devices[output].inputs.append(devices[device]) + + return devices + + def get_paths(self, start: str, target: str, devices: dict[str, Device]) -> int: + if start == target: + return 1 + + if target not in self.DP: + self.DP[target] = {} + + if start in self.DP[target]: + return self.DP[target][start] + + self.DP[target][start] = sum(self.get_paths(x.name, target, devices) for x in devices[start].outputs) + return self.DP[target][start] + + def fill_cache(self, start: str, target: str, devices: dict[str, Device]) -> None: + devices = self.parse_input() + self.seen_reset() + + Q = deque([devices[target]]) + while Q: + device = Q.popleft() + if self.seen(device.name): + continue + + self.get_paths(device.name, target, devices) + + for source in device.inputs: + Q.append(source) + + def part1(self) -> Any: + return self.get_paths("you", "out", self.parse_input()) + + def part2(self) -> Any: + devices = self.parse_input() + self.fill_cache("svr", "out", devices) + if self.DP["out"]["fft"] < self.DP["out"]["dac"]: + self.fill_cache("dac", "fft", devices) + self.fill_cache("svr", "dac", devices) + return self.DP["dac"]["svr"] * self.DP["fft"]["dac"] * self.DP["out"]["fft"] + else: + self.fill_cache("fft", "dac", devices) + self.fill_cache("svr", "fft", devices) + return self.DP["fft"]["svr"] * self.DP["dac"]["fft"] * self.DP["out"]["dac"] + + + +if __name__ == '__main__': + day = Day(2025, 11) + day.run(verbose=True) diff --git a/inputs/input11 b/inputs/input11 new file mode 100644 index 0000000..257c7fc --- /dev/null +++ b/inputs/input11 @@ -0,0 +1,609 @@ +iak: edr ehw kqn vjh +awq: sfz nys cio jzi gtt +nes: sqf ist mux +jik: out +kie: pzi +myb: cjq +wvy: pmr kqw aao hja +laa: kpq xgo sks +yyj: lpz rpn apc +cee: vjh kqn ehw edr +guq: vjh kqn vht ehw +lmu: zyi pzi +ypf: heb cyx +odx: daf cwj +ywl: xct cix jyw +bpw: tql jvl cix jyw +jvl: krb ftw sov nqy eve yja bsr qek ydb ixx dme ftr +pjr: pyn +lsp: bwn lpe rnt yau +llq: myn xmh +jtg: jgi zrc aju +mxo: wyy +kyu: dsa wbq gds gpv +ahk: rjq las +pxm: dac +unz: odx ypb +lgx: tva +tos: erv jhw vnt +aow: ukf xmh +thm: vyn acx +nas: cyx heb tdx +sow: ehw edr vht +idj: out +ftt: jeo uiq +foe: nbx eth +fzg: bpo +mpk: you ire sdo +wck: vjh vht +jev: rpn apc +yon: pzi zyi +zcg: sks xgo kpq +vhv: hxp bwn +fwm: nga +uil: hna qql ayn +laj: jdr dmd +xwl: zah tow +tks: apc lpz rpn +hpf: lvf ahk rct bln +lpz: vsg xkv qkf qzj syb rgz jbm eew qio fer gkw rlr bok axj ihb +ukf: jqj ruq arm +nog: ctx kzx +arm: lpz apc +jqq: nky awq lzg +zbb: shl +xfw: unm lvf rct +mgp: fuq inv +xlv: vno +llu: jev mea xjb hwz +hna: uvw +fja: kzx qak ctx +mux: zcg +add: nve ias zyx +kcf: she mpk wdc +zim: wtt vhv lsp +geo: cio gtt jzi sfz nys +khq: sow nwe twj +xgd: tfz eua bhd +yja: dzg bhl kqc +bok: lun egu hpx +xgo: jvl +dqc: bjb uby zjh +szj: ire sdo qdo +cgr: jqm nga dxx +fel: fda zca pwa tfc +ikv: ffz mhl xpw +ewe: keb vkx hds +dty: yyn +rpx: rxy pyn idj +gbl: uby zjh +pzb: pjv zkg nfn laj +txi: muy pzi +jeb: agi vno emh arf +hds: llq aow bjg +pwa: zri yyj beh +ylr: tql jvl xct cix jyw +jbm: fls +gds: ire +izo: ywl +nbx: uaz fds njj +gqh: yyn xxc +tfc: beh wpr yyj zri +yil: xgd nmj xfg +xse: fzg rmc sah +tbc: zah tow +tdx: edr ehw vht vjh +dac: dsa gpv gds +vkx: llq aow +arf: xkb +njj: ypf +tql: ikv nvd sov ftr ssj ydb qfp qek bsr +jmo: rxy idj +ywn: raf zxb rrq mdy +lvf: bik las +nfn: nen dmd +zuv: wdd luw zhk +cxx: agi arf +akw: moa fpi +wjc: tkh xwo +bjg: myn sgb lpw ukf xmh +fft: dqc gbl +yfs: dxx +oix: blo ojp qhy +mqv: gak +rtn: jvl xct jyw +erv: out +yea: ayn hna qql +raf: dqi +kbm: wfg jmw nrn tos +sah: yon ltb occ bpo +lty: wtt +nzl: rxy pyn +jdc: jwr haz +bws: lvl chi +swx: dry ege +wjh: zcg laa mvt +wcq: bci +wcg: out +tmy: ynx ayr +wtb: zyx ias wrv +zpt: dry vjc +zyx: out +zhk: muy +haz: qdo you ire sdo +lfb: znb vod +hwz: lpz +wpr: apc lpz +llv: wtb uuw vdk +pcn: cjq wcg +cmw: fel rds jfu +dmd: nzl pjr rpx jmo lvu +rmc: ltb yon +bwn: pzi zyi +fzi: bpw wza +vnt: out +maz: sgb ukf xmh +kab: uwp +vyn: emo fzi vqz kuj +zjh: ehw edr kqn +wzi: dre gak +ary: out +ffl: she mpk +ire: kta yfs imk lju hid zbb wrm wmp wif nog wee jnd mcq lau dmg fja fml fwm +zyz: cjc +sks: jvl xct tql jyw +sfz: jjp fzj yhn +svr: jwx zwz ytb mrd +dmg: qak yzh kzx +mih: vbm bic brf +dry: wdb agd +wrm: aza +jin: unm bln rct +uaz: ypf nas +jwg: she mpk wdc +vbm: crg pcn ccl +ist: zcg +ymm: smd pim +hpe: xct jvl tql cix +wpc: fnx ayr +viw: yku +zrh: nwe twj +dxx: pjv zkg +ftr: zya kqc ahi +yac: wyy xwo tkh +qni: wjc kww mxo yac +xpd: pjc kie wmz +wfw: zyx ias nve +mfh: tks wpb +xgu: nbx eth +ude: out +ijh: rpn lpz apc +xgz: nmj xfg +dsa: you ire sdo +ias: out +gak: yft daf qus cwj xxv +goz: you sdo +tjw: fel rds +apc: sou aji axj uvd qpi fer eew syb rgz nke jbm vjm vsg +yxl: ege vjc dry +qzj: uil yea kex +pyd: mdy zxb rrq +xpw: wgr +wdc: you ire +bod: raf rrq +qex: zyi +fds: nas +tva: apc +deo: tyh mfl +you: wmp cgr wrm mgp zbb kta imk yfs hid fja fml lau +gpr: tos wfg nrn +daf: lgx iga pnz +mea: apc rpn +iui: lnp nwe +niy: zdn jtg jpa ryo +cnd: rqr kyu hnt +fer: jqq +gtt: fzj +keb: llq maz aow +gjz: oku wfg nrn +ywh: hds keb vkx +qnl: rbd rtn glp hpe +wmz: zyi +fjz: yyb ryo jpa jtg +bci: ary dyg +wfg: erv vnt jhw +art: moa +ykd: art akw +nld: ojp kxv blo +tfz: dqc qeo +fzj: jyw xct tql +ucr: wfg jmw +jdr: pjr nzl lvu rpx jmo +tow: lpz +wan: rpy brf bic obm +nnc: fnx +rix: llv zgm yyn +nve: out +xex: jyw xct jvl +bjb: edr ehw vjh +tne: hxn dnp xwl +qdo: fja fml fwm lau dmg wee jnd mcq wif cgr nog wrm mgp zbb kta yfs hid lju +zya: hcj +wee: pzb jqm +sqf: laa mvt zcg +hxn: ijh jic +qio: kex +dem: kww xkg wjc yac +znb: gpt fek iak +imk: wcd aza +rbd: tql jyw +ics: rmc sah lgp +xal: jwg tfb ffl +fnx: kit egq +bhl: zpy +zkg: jdr nen dmd +hah: qeo gbl +fmu: ris nbx eth +sou: jqq ijf tvi +yft: lgx ctu iga +ywr: bpo +alu: jwr haz uju +cix: ftr ssj dme qek bsr ixx wmk qfp eve yja ftw nvd sov nqy ikv krb +hxq: hpf +dme: kji fsf hxq +axj: uil +ryo: omz zrc jgi +foy: rqr kyu +luw: pzi zyi +apl: jfu +tgs: luw wdd zhk lmu +uuw: nve +rhs: hpf jin xfw +moa: yam zvc +sys: wfg oku +kzx: dhp +twj: vjh kqn ehw edr +fqu: kqn edr +agd: ehw vjh +gmv: zuv +lju: yzh +aja: kqw hja aao +ajb: rmc lgp ywr fzg +pub: lvd dry +fda: wpr +lpe: zyi +uvw: jyw cix jvl tql +kji: hpf jin xfw +fml: ctx +zca: beh zri yyj +fji: cpq +thz: pmr aao hja kqw +dcp: nij deo srh ltq +til: ijh jic zah +jqj: apc +lav: fel +vod: wck +gpv: qdo +fuq: mih wzj vwx +hnt: dsa wbq +khg: geo nky rsb +nmj: bhd tfz +ccl: wcg +srh: pjc tyh kie wmz +inh: kxv ojp qhy +fpi: bci zvc yam +zyi: yil wcx bno inh duj cxx lfb foe xlv fmu xgz nmb oix mnc ogc tom xgm nld xgu +occ: zyi +wzj: obm +tkh: cib ame cee guq +aza: yda gqh +jeo: qnl frt +kuj: ylr +nys: fzj jjp +nky: nys cio jzi +iki: mea xjb hwz +yzh: dhp +vfw: qub zuv +zoa: lce +eqb: ege +jic: rpn +iga: tva zod +bdo: mdy raf zxb +xjb: apc +brf: ccl crg +wbq: ire sdo you +lau: dll xvb ykd +dhp: gjz kbm +nwe: vht edr kqn +acx: emo yku fzi kuj vqz +cio: jjp fzj yhn +rnt: muy zyi pzi +pmr: ajb xse +rhh: lpz rpn +ypb: qus +vsg: nes afr dvw ivd +xzg: vjh +nen: lvu jmo rpx +zgm: wfw uuw wtb +hid: fuq inv +wif: inv xgg +ivd: sqf wjh ist +ahi: xal zpy fua +cwf: egq +qcc: tdx +wyw: vdk +gnk: jeo uiq fji +ixx: cnd pxm foy +rpn: vjm qzj vsg xkv qkf qio eew jbm rgz nke syb rlr qpi bok hte eip gkw fer sou ihb aji axj uvd +seg: iki oko +qfp: xry pxm cnd +kpq: jyw cix xct tql +vjm: dds nes +kqw: ics ajb xse +aju: fcc tks wpb +ish: llv xxc +qeo: bjb +wyy: buw cib ame +bhq: pmr +zrc: tks fcc wpb +eew: dds dvw +jxp: pim smd +xry: hnt kyu rqr +qak: wok jen +jle: wcq +rlr: ijf +lgp: bpo occ ltb yon +psw: chi lce +sbj: out +vdk: wrv ias +vqz: bpw +bic: ccl crg +pzi: dem fmu xlv xgz foe lfb jeb cxx duj bno wcx inh yil xgm xgu nld tom qni ogc oix nmb +ehw: ewv cge wzi rqa ywh bqq seg lav zyz ugk qpo tjw yve +agi: zrh +avb: haz +xgm: eth ris +hry: qcc ypf +jwx: hln bod wpc aja pyd wvy bhq ywn tmy zim vnj tch +wdb: kqn vht +jpa: aju zrc omz jgi +qfh: lvl lce +ltb: muy +jwr: qdo ire you +mfl: muy zyi pzi +wmp: ykd dll +yau: zyi muy +rct: bik +bno: xgd +hxp: muy pzi +duj: emh arf agi +ugk: zdn ryo jpa +oko: hwz jev +dbb: llu +wmk: rhs hxq uqj kji +syb: egu lun thm +dzg: xal +kww: xwo wyy +ufx: jyw +unm: bik svm rjq +ayn: ufx +inj: hgk txi +eve: mhl +zod: lpz rpn apc +uwp: egq +nlm: uiq +yda: wyw +ojp: zpt pub swx yxl eqb +mrd: xmu zim vnj tch nnc vfw hln hta +zxb: dqi rul +mdy: qex +vht: zyz ugk unz dbb lav seg bqq rqa wzi cge ewv mqv yzr niy fjz yve tne ewe apl tjw +qpo: hxn +bqq: xwl tbc hxn til +pyn: out +xfg: tfz fft hah eua +yve: keb vkx +usf: vhv +wgr: ire sdo you qdo +cwj: pnz +zah: apc +mcq: wcd aza +vnj: tgs +rds: pwa fda zca tfc +oku: vnt sbj +glp: xct +bpo: muy zyi pzi +cjc: xxv daf +pjv: jdr dmd +blo: swx yxl +lyo: out +ydb: xpw ffz mhl +rqa: oko +wtt: lpe rnt hxp +rsb: nys sfz +kqn: lav bqq mqv niy yzr fjz cmw ewe +bhd: gbl +svm: you ire qdo +skn: muy +rad: vhv +vjh: fjz cge apl ewe tne cmw ugk zyz +qkf: tvi ijf jqq khg +edr: ywh wtp jkp mqv cmw ewe yve +gkw: nes dvw ivd +she: sdo qdo +lpw: arm ruq ars +inv: mih +ruq: lpz rpn +vno: xkb khq iui +cyx: vht edr kqn +zvc: ary lyo pld ude dyg +heb: vjh edr ehw vht +nrn: vnt jhw sbj +las: sdo ire qdo +jfu: tfc +uvd: yea uil +tfb: wdc +nga: nfn +rpy: myb +emh: iui +qek: zoa qfh bws +vwx: bic vbm rpy brf +fua: jwg +cib: kqn edr ehw +obm: pcn ccl myb +qtd: vht ehw edr vjh +qus: lgx iga +rul: muy +rqr: wbq +qub: zhk lmu luw +vsy: wck gpt fqu iak +sdo: lju hid imk yfs mgp zbb wrm wif wmp nog cgr mcq jnd lau dmg fja fml +hpx: viw +ijf: geo awq nky +wcd: gqh rix ish dty +wpb: apc lpz +ftw: dzg ahi kqc bhl zya +nqy: zoa psw +wtp: iki +cge: dre ypb +kta: ykd xvb +ltq: kie pjc mfl wmz +rxy: out +wrv: out +lvu: rxy idj +nje: jeo +rrq: qex dqi rul +nke: ftt nje +dds: mux azd +egq: hgk +nzf: emo vqz kuj fzi +rjq: qdo +nmb: kww yac +ris: uaz hry fds njj +egu: viw nzf vyn +gpt: ehw kqn +pld: out +lce: jdc avb +lvl: jdc avb alu +jzi: yhn fzj jjp +ynx: egq inj +omz: fcc +mnc: vsy vod +nvd: dzg bhl zya kqc +hja: ics ajb +cpq: glp rtn +fsf: jin +cjq: out +frt: hpe glp rbd +dyg: out +sgb: jqj ruq +dvw: wjh mux azd sqf +ayr: inj kit egq +hln: pim dcp +bln: bik +hgk: zyi +xkv: nes dvw ivd +vjc: agd xzg +wza: tql xct jvl cix jyw +jjp: tql jvl xct cix +dnp: zah ijh jic +myn: jqj arm +lun: nzf vyn acx +azd: laa mvt +zwz: xmu bod gmv nnc aja pyd wpc lty usf hta zim rad ymm tmy ywn vfw kab vnj bdo bhq wvy +ssj: qfh psw +uby: edr ehw vht vjh +tom: vod znb vsy +xmu: vhv wtt +jmw: vnt +zdn: mfh omz zrc aju +crg: cjq jik wcg +buw: vjh ehw edr +xvb: art akw skq +eth: hry njj +qpi: egu lun +xmh: arm ruq ars jqj +uiq: izo cpq +jkp: vkx keb +fek: vht edr vjh kqn +pim: xpd +kex: ayn hna +jgi: wpb tks +jqm: nfn laj pjv +tyh: zyi +tch: fnx ayr cwf +rgz: fls gnk nlm ftt +chi: jdc +zpy: jwg kcf +fcc: rpn lpz +uju: sdo qdo +ame: vht +kit: skn txi +kqc: hcj fua xal zpy +wok: ucr gpr +pra: guq cee buw cib +jyw: ikv wmk nqy sov nvd +yam: lyo +ogc: xfg nmj xgd +gga: cix tql xct +fls: fji +dre: daf +xkb: lnp sow +aji: hpx thm +beh: apc +dqi: muy pzi zyi +xct: qek ydb ixx qfp wmk yja ftr ftw dme ikv +qhy: yxl zpt pub +xxc: uuw +skq: wcq moa +afr: mux sqf +ctu: zod rhh +qql: ufx xex gga +kxv: pub swx +emo: ylr wza bpw +smd: ltq xpd deo nij srh +pjc: muy zyi +shl: gqh rix yda dty +wcx: nmj xgd +xgg: wzj wan vwx mih +ege: qtd +lzg: gtt +krb: psw +mvt: kpq +jhw: out +uqj: jin +bik: you +jnd: nga jqm +xkg: wyy pra +aao: ics xse +pnz: rhh zod +lvd: wdb +ihb: kex +yhn: jvl tql jyw +sov: cnd pxm foy xry +ffz: wgr goz +muy: xgu nld xgm qni tom mnc oix nmb xgz xlv lfb duj cxx jeb bno wcx yil +jen: gpr ucr kbm sys +ewv: til tbc +ctx: wok dhp +bsr: kji hxq rhs +zri: apc lpz +hte: hpx lun egu thm +yyb: mfh aju +ytb: wpc nnc pyd bod xmu usf thz lty vnj kab tmy ywn rad ymm jxp bdo +nij: wmz mfl kie pjc tyh +ars: rpn +xxv: ctu iga +yyn: add uuw vdk wfw +yku: bpw +hta: dcp +dll: skq jle +mhl: szj +yzr: hds +hcj: kcf ffl tfb +eip: ijf jqq +wdd: pzi zyi +tvi: geo awq lzg nky +eua: qeo dqc +lnp: kqn +xwo: buw diff --git a/inputs/input11_test b/inputs/input11_test new file mode 100644 index 0000000..8dc75a3 --- /dev/null +++ b/inputs/input11_test @@ -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 \ No newline at end of file diff --git a/inputs/input11_test2 b/inputs/input11_test2 new file mode 100644 index 0000000..2bd407b --- /dev/null +++ b/inputs/input11_test2 @@ -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 \ No newline at end of file