From 7f398eed00939dbb98b185c9637d3072284762eb Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Mon, 25 Dec 2023 17:05:00 +0100 Subject: [PATCH] 2023 - Day 25 --- 2023/Cargo.toml | 1 + 2023/input/25/input | 1211 +++++++++++++++++++++++++++++++++++++++++ 2023/input/25/test-1 | 13 + 2023/src/bin/day25.rs | 172 ++++++ 4 files changed, 1397 insertions(+) create mode 100644 2023/input/25/input create mode 100644 2023/input/25/test-1 create mode 100644 2023/src/bin/day25.rs diff --git a/2023/Cargo.toml b/2023/Cargo.toml index 44571fc..b6df103 100644 --- a/2023/Cargo.toml +++ b/2023/Cargo.toml @@ -9,6 +9,7 @@ edition = "2021" anyhow = "1.0.75" lazy_static = "1.4.0" nalgebra = "0.32.3" +petgraph = "0.6.4" regex = "1.10.2" [features] diff --git a/2023/input/25/input b/2023/input/25/input new file mode 100644 index 0000000..a29926f --- /dev/null +++ b/2023/input/25/input @@ -0,0 +1,1211 @@ +zsx: lrs +nvs: vjp +rqb: gzc dzr +xct: vrl +kgf: vkl lcv +ksn: vsq vkk +vgz: spx rsd rtm ljj +mzp: jmf cfn zpf +lfd: lll nps bvl tgc +pts: sgk kgd +zcp: fqp +zjc: kjf szz qkn pnn lnk +rsb: trt rkd rcz lzj +cpn: rdx dmt +shs: qxs rdn pnm bcf +vkx: lhr lvg xvg gxx +xpn: bvb hxx jxp bdg +jms: jzp ztv rhh qjc +jlf: jcq gzv +xbx: bng +rvv: hsm mhp hgr jvm vkz jvr jbh +clm: ltz +kfx: nmm kvq cbl mhn +zhn: tdl bxr khs ggp rkv +lcd: tld zkd +zxl: tkp fgx bvl qlt +knm: tlj +kdd: lhz pkq +jlj: zqz hsm tmr +fnn: gzk mjf brr +mpc: bbk xcr sdj sxg tdd +rpd: vhj ssx rhd zlx +jvd: skg fns vph +sdt: kvq +pns: ltx xsm +tbq: hnh pmc nxb qfj mts +nvz: tjj ltx +jqm: gvj vjj jvk rvf ckj +lcz: zlx qdl +cqd: hzr kgk mmc +jvm: cml mqd sqm +jfp: glz +rqj: bxj fgn rxh +gcb: ght zzg +hfx: jld bnr +cct: chv dml +mkv: dkd +gxx: vcf +fmj: hrh tjj +kfb: ccx zjs +gsp: qrn tqb pzs nzp +bdk: xcr +zkm: xbg pmk dgd nvb vhs +kkq: nxf srs sql zsx +jff: skf +xvb: cdr cfn +xqm: bkg qbr hnb +jbh: clm +tkh: fqn qrv bxj +snx: lbj nnl vht +gvj: tmc bjl jlj +ttj: rmk nhp btf rcr +mcr: jnb rkv jgp qct +cng: stf ctr kmv +mhn: lll +krk: ggx kvz tzh zdq +rnh: mrq kct vqt lqd +mzz: kxr sxp vzx tpb +mqm: znm msl krz mxv +gbk: tlz xqt xcx +dph: xkc fmv +vkv: hsb lbh +rcm: knj mjn +hlh: jpf sqg qbr +zch: ktt pfb cpx +sxg: tlq +qqg: rsd vgd cbl qxv fjh +mtq: hfx vzr pdp +dlx: hvh sbj vmm xnc +pvl: psg hbt +fkx: xzj +gtz: ldv xmt +lpm: nqg plg cxg hdt rsk +dbn: lhg zhc ssx +spj: zgz bgg qdf fng +glz: cmm dml zjd +ssl: jxc +ltn: nfr lcz tzf +tbv: zjf pmg dxk gzx tzb +lrr: hdh stn qcj rcm vdc +mhs: qgf stj +kfp: bjp hzt gqj +sfm: xbg hcv kkc +bbq: mcx tkp nzz +vmm: jpm +mlt: skn jkz tqr qkm +kbm: prf fqp vcm +lms: hbh tjl +xvs: zqk +lvc: sdg +nrf: ddk ksn sgk +kcj: xdp nzv pvd ctb +glf: knp kbk xlv +rzv: cfg +pgt: knj hrh +hkr: sfj ppr tpg +pjg: rrb dgk qqq qkm +bxq: mcc pjx gxc msl +zmk: dzr nlm dtl nkb xpm +jlc: bbn lnk gff fks jbn +blf: rsq kfp hbd crd +mqb: mtt stt bjl bzh +tkk: ksc bzm +hxd: gfb tvt dkj pxl +lkl: bgk kbs qmm +zds: jkt cbs drf nkz +xkk: tfj njf +hxv: lhb vsp nzf qmv +qcb: dkq +xkr: mvq fxb hzr ncx +ngd: bbk zdc +nfb: npl jsh tjb gss hgr bcq +qtn: vzc sql gxs crg +mqr: nzp hfs qmm tkh tgh +xvr: jjn tzf pvj zdr fbh +bqj: ddn hxx qsg qdl +nzp: stb jbp +qjc: jfj rhg +sft: xkz njs +hrq: jbf svr lsj qdb +tcf: rkd tfq lcj +khs: vst +pvd: gms +bbn: lfv fsq zvv sft +dls: sdc bjn djf zbf +dcc: qlf gms +xvg: pxq +jbb: pjd +jbn: khd kht fkx +kgd: tkp gnt +kzx: rzf mkv bdr zlv +xgz: dgd ncx +jmh: cqv nzv lmh bdk +kqd: nnm brs +czr: tdv pjd lhr +gms: zzg +fnb: zff ffv mvg cmh hmg +fsz: mxq gzx nfr sjx +drt: hgq vgj tfp rhp +zvb: zjs +gff: dgk svr +csv: qbr +hhx: str +hlt: khd zpr fbq lsj mpd +xkg: xgz zrp smd +vdd: cpx +zjx: brr btm ggp hvg +jkx: tcf mps mvs kvs +hsg: rcb fgx njd sqb +rql: vlk qrv hzs lvh gss +frj: jff vdc +bmq: mrv vjm xtj +vpg: qgf vxt cml xhp +vrx: nbb btm +rth: jxc vlz grr mzt jhd +zbf: rkd xjs kgl tdz +fls: rvf nnl pvv csc +xtn: fgv nst rkv lgf dmt +xkc: zhc mkh +mkn: fmq pjx vpg xkk +lvg: vhs xvg qgk tdh +xjt: ddn bcd cgk hfh +hnh: jsk tht fcd +fdq: rfc djz +qvh: hsb lzd ltb +kvs: njs jpm djr tll +pfm: njf kcx lms smd +cqg: tlj qhh +bfq: cxf hcd lqx jlb lrr zkt +cfg: qrn hvs +pnm: ssx sxp zgh +sbj: qjv dxd fnm +nxf: zmf kbq hcd lfx +qjr: vld xkz nmx +lrn: hbd +tft: fkq +ncp: ntf dqt rpl zgz vqb +nkp: plg cql ddz +xlp: cpt rkd +qcg: ttk mmh stf crj xvh +bnr: zdc +tht: rdp xzq +rdn: gsv kzb xtm jrv pjt rct +mvt: sdt jsk +bfn: fkq fhl kgk +pjt: ccn xzb +qcr: dpc tzb +vtr: hzt xsj ttx nbd xvr +bjp: vrv +sfj: qhh +rrb: kdp hbr +ctp: tlz rxt xdp ltn +kqg: ndr zbf bkg bkt lqm +tnn: vzx +hxn: xvz +tgb: htd qqj +ddp: mxv bss vgh dkd vmm +kcn: fkp fdq qqj lbj knm pkf +zjq: vdg gql dsc +lkf: kxn nvs mqm bfg +lzz: xlv tgm stf tnn +lgk: dkq hdb +tdl: mdg xbp dtm qsb +srs: jpl nvz +ptc: xsj +jls: xcr stv sxc vqn +jdf: bbz jxn srf +lng: hhx lpn tvt vfh +bdc: dpc cpn kzf shr +ldc: fmv msn dxv +thv: mql mlg htj +zrp: vsp +qtg: tpb +kkh: jpl ffk gbk jdj +hbn: ffg nkd hhx +qqq: vdd kqb +qhh: msg +dhj: gqr gqk fqd +djh: bvp xjn hns rsk +fbb: tcl vht +kvl: cgx znm dxd +tcl: mcc +dms: kgd hhh brr fqj +rvl: jrv +kbk: vlz jbz +kfq: njf tvv plc +jqr: gqk ntc dsc bkg +qfv: vxl vdz rsf +gtk: rsq jff blh mcb +ggp: xzn +pbk: rkx gzj vld hcv gnm +xcq: htq php xpr fxj +qcf: qjc cvx ptc +gqx: nkd rbt mcx hzt +sdj: cdr dkj +zkh: xmt qrs dxv xmh +tlz: nlj +xzn: cbl +xfj: vrk xct jlb xdr +qzz: nxl +bkl: kht nzp qjv lbj +nqg: hfh mxl vgv +qmm: ckn jfp gnm zrp +bfg: plc cmh fxx +bzt: ldv xkc mjm +ksp: clf jdf gkr zgv jgq +vgh: qzz nvs gqk lqm +xsp: qvz +qdm: tjb xsh +brm: sdt zjs rdb +nrj: gql +qxs: vrl gcb +nvb: cpx +bkq: vlf rmx zjh kdd gqm +grs: kbs +krn: nnm kkc fgp +tbx: xtg +qct: qjx +htj: jpf dzr dsx +pmb: jcb +pvj: ffg +xmh: xqt hhh +bzh: bxj dqg +pdr: skn dlr +djk: fgn mth vjp +fsh: rkd bkt nnp scz +kqp: vrx dft xbx bpt +gqm: hlh sqg csv +bmp: mxg fbb kxq vnq +zvf: xkm kht rhb qvr htd bfn jqg +rkh: xkc vqn +rvf: sfj +tsx: pzs pvl jzf kqd tcp +spm: pzm sft +fgs: kqm rdf gvm +mnq: qcf dms mtf bhh +xjj: fms ztv cbb zfr bdk fxv +qql: gtz tfz lkb mxk rpq xbx rhh +qjj: gvx qnz dph +ggg: rrk bkp xmt pmb +vlf: cpd khg xlp +mvn: dlt mjj +gmb: bvl thz tht +zjd: zvv +ppc: gmb rrk kmv fcd +vhx: njf gbn qrv +kxc: sff +bqc: lms vht pcc mvq +bzn: zcp +zll: bxj kxn xrm +mbp: qqs ssl vrv lgz +mpf: fjb rhd rdn pls +cbq: cnj xvs +jgp: pgt +msk: bpf rdx pdp qsb +prl: rkh mbl sld +bzk: stj fnh +jqg: nlg gql djj +jld: ddk ttk zdc +xdr: ctr +kgl: vkz +xsh: npm +kld: bht cpx ntc khb +trt: sgv +qjd: jgp rcb +kvf: bvp ffg +rnt: zrx mcd pgk +lmv: rsh kbs dsx +sbk: kmv ddk pfj +dss: zgz trt mps sds +bdm: hbh hvz ckn rxp +tbf: mxk lgz gnt xqb +mqd: tlj pgk bnx +nhf: mxq xbl kfb dfk bkh +hqt: qxd jxp ngd shr qrs +jnq: khn kvq bvb gzv +bct: vjn lmb bnx lsc +dsj: vkk hrh fjs +pfx: dkd bnx dth +ljj: ksp nzn ssl +ztr: cnr +qvz: fnr +hll: qzz xgb jbb mkv glp xnc hbr +tqr: psv tft ndr xhp +vpb: trs rdf bmr vml +vjj: rvk +grz: rdb sdt nst +rdb: tgc +rld: llv hzs fkp +kmr: ltc vhj hhh +xgh: vfh lvc vrr pkh +dgr: mnk tcp +rqz: msx rxh jvd ztd +fct: mlk vrr xff +qgj: jds xzb +btf: sff +lsm: npm qsc jxs nng +zkl: gbh pmb cfv +dsr: kdp crs xzn jsf djj +khj: rlk sqb tgc fvv sbc +ghz: zlx jcb tmz +ftv: bvb sxc rcm khs +sgv: mnk zcp +tmc: fmd qnr +sxc: xsj +nkk: fth ztr fnh kmd xtc +rfg: kgk jzf fbq clm +tdd: tld gbl jml +jkz: zjd cct +xfp: clf nvn hhq +fqn: rvj zjd +khg: tbx pxq +fhl: npm cpq qbr xlg +fvv: bcv jff bql lcd +psb: kxn pgc fgp vpk dzp +fnx: bgk tjb xnc rsz +lpk: kvl qtt hpp mvs +tkp: dpb lrn xbb +ccn: fms str +ltb: qsb dsj fmv +vqg: vcm pgl lhr +zdr: rdx gbl rdf +phg: jcq jgm kbk +nzn: hzx hhh jfj +cfr: mml gzk qhz tfd +mlb: zhj pxq +zqf: kdm fxx vbp +vxl: bxz dtg njd +kzf: mpz +fbq: qmv lfv +sld: cvp zgv dtm +grj: ntf jfp kbv msx +gbn: vkl tlj smx +vlk: zms fqd hlh zrx +cbs: tdh mcd vcx +kmn: sbc +dxd: lrp +rsc: gkr zmh bsl kmr glv rdp str +tmr: xsd chv bqf +gxs: mbc fjf glf +mfg: djf vqg ntf +fjb: hdt vkm +rrr: hsb htq +lsp: jqg gxx fmd krz +vdz: bjx vzr dlt knp +sgk: rct pbc +xdp: qjj nnc hgq mxk +nkh: fms +prj: vst zfc nmj +dqj: znn hlh fqd zkp rhs kbm +khb: rhb fng +vmr: rvf hcv bnq djx +cpv: qfj +xms: khg +ntb: xlp pbl +rsf: jbz mjn lcz +pdp: gvx jcb +cvp: plr +bcv: jfj +zrx: nnm qfj rzf +xbg: nxl +djx: njs lcv nzf +rcz: mhs sqv vbg kdm hzr fhl +tml: jgq nzv tzb fgs mjj hrh +rpq: xjn nlj tps +pcc: tbx lcv +nrq: clx bnf chd prj xfr +ntf: vcm qpb plk +kxr: rng nps +smd: grs tll +crg: tzh bqj zkt +dgd: rvk +rlk: dmj sbc ztv +smh: hnb +hdk: qcr nzn xld mbc +mjf: qcb dpb +nbc: kzn dhf sms rzf +zhb: gzc qqh vhx lcj +khd: zrx rqb pgc ppr +mms: jgm ggz +csc: bxj lfh mpd +fkd: hgn sfb rkx xsh smx +jbp: qxj kqb +hkq: hdh pjt gcb +xvp: sdg pgt +qvr: xkk pcc kxq +xcc: ntb xjl stt vdg +krt: xjf zqz zkp tdh +bcx: xkc ggz +ffv: ltz +hcd: xkc +bcq: qhh +qqs: mjn +znk: bjl lhr +msn: dph +mlm: bqb gqk +kqs: dpb tnn +xrx: nps fcd +vgx: hzr lrp sfj +jcb: bvl +pph: xcp prj ffg mbt +sfb: bnx kkc jqg +gjr: mjj kvq +nzd: xdx kmn xqc chd skf +hzx: cnl krf +fgx: dkp zvb +xdj: kfb rbt tjj +lqd: pzs vcf +qgf: kqd zkj +drf: brj +bbz: fjf +kqj: kqb clz fsk bgg +dvj: vml jdf ffk mvt +vst: qjx +nrv: bxr vrv jzz sqb +hvn: lrx hgr vxt vcm +lcx: cnr pgl kvs krn +hrf: rgq qvh vsk kzb +pkt: phd xct vgb xbx +dnz: jgm btm rdf flh +vxs: jbh jfb kxn hmg +zgc: nhp vzr bmr cvp msn xfj hxn njd +lkb: vrv +zkp: grs +mzj: krf zgh mzt clx pts +nlt: cxv jxn mcx +lsc: pmk crc +brl: fvp qvz kzn stb knm kkc +qlt: qlf +jkk: zjx sdg jrv php +jqk: vsq lrs rng gxt +tdz: vhs xpm +fkp: zrp psv hvs +gkr: tmz xvh fmv +xtf: pkq lfv fkq +ddf: qcb zfl qnn +tnh: lmb qqq znn ncx +gqj: mml sbc +bvb: jxn +nkd: dkj pvj +tld: knj bdd +bkt: qrn tcp +vqt: spm tgb +tbc: vlz zvb vck qcg +dsx: lsb bnx +gss: bnq +fks: fqd hbh mhp +xzg: jxp xmh qqs +rct: jpl +xlv: gbl +cfv: qlf +qvm: mlm bkg pkn +xtc: cqb +bjx: vgv +lgb: jlj fsh clm fnm +pcl: skg vfb qnr +rcc: lvq mnk qdb bqb +sfd: rtk mxl bhh xzb +gcd: qsg qtg pfj +bgg: vkz qrv +xmj: lgr rcm scg cnn +tqb: njf +fqv: lrp skn zvv +hfh: cbl nlj +jxh: nvb +sdc: plk tjl +lql: dbn xfp jmf vtr nmm rhg +fxb: rxz zqf zpr +bdx: lqm ppr tjl qnr glp +vqn: qlt +nzt: kbq jds qsg jxp krf +xkz: fnh tjl +lhg: qct grq +nhq: mcb xqc tmz xvb +bbk: rfl ldv +bjq: lzj pxt qqp hkr tfq +rzj: cfg kqb vcf bgk +xfr: pmd vrv qcb jlf +rsl: lmg rdp qlf pjf +rfl: cql jxc dkq jgm +jzt: hnh mvb lmg sdx nzv +zkd: qjc zfr +bdg: rbt lmg +zmh: dbh zlx xvh +nmx: nvs dth gds pkq +xsm: vhj nnf xzq +nnl: qfj +rpl: lnk tcl +tlq: xvb ccn +tbj: qss fmj bbz nkh +nsd: lpn hhh +znq: zgv hrf pjf vzz +nrl: xsp zfd pkr +mbl: ttk +qjv: jgk +qjs: pbl +trs: gnh jff lss +msx: qvz znl +zfl: jcq +dcd: crj hxn zlf qnn cgk pmd +snz: xtr ltx vrr bdd +mbt: frj bbz +xpf: rjr +bsk: zjl lsm dhj psg czx +lzj: skn pcc sth +npl: npm znk +njb: tcl xbg kqb tkk +mxt: vxl sxc nst jgd gbh +vhs: xtg nlg +kgk: qxj spm +sdg: rvl +rfc: lms tmc +ghx: bzn hvs +lhz: cnj +pmc: ggz pgt lmg +qjz: dml cml +jzf: rzv lmb +nfr: nbb dfk +xff: mtn khn +rsh: fgn +zlf: qct plr pkt +mnx: lvq clm +kbv: tll cpt sdc +kcx: rrb jxs bqb +pkq: hbt nvb +cbb: qcf xpf cxg +mth: xzj +xtm: dlt ggz +srg: hzt gbh mpz plg +ggx: zgv dlt grz rkp gbk clf bnr +lgf: cpb pqc nmj hhh +mbf: tzs hbl mzj hbd +rdq: vph dsx kxn +jmn: htd qvm pxt qdm +xqb: gjr vrx cnl +mqh: znl rnt hgr ntb tmc vlf +rrx: fct xvk ngd zfc spk +rhh: xdr +rcr: bmq xvz +zqz: rvj +zvl: lnh spx +qkf: smh fhl stt tjb knm +fnm: sqg scz +xcx: lll ddn +ght: grr qnz +dtt: tzf bcb rdx ztv +scg: gbh plg +rfh: hns pbc fjs nvv +ttx: kgd mzt lvc +zzg: rhd +fmb: ghb dft +tgh: bqf pvv +ktj: lrn cfn bkp cxv ctr +zjs: mpz +bbg: rvl fbh dxv +dkd: jkz bht +bjn: qqp zxs mlb +pfb: fsk +xbf: cmm nzf pgh prf hvs +xjp: vlz mcb gbl vrv +ltx: bng +czg: jgm cxv rhg +qpb: djx crs +tfx: zhc +vvd: srx brm +rhp: bng nxb bxz +rhb: fkx hbr +qcj: str +xcd: ztz qkm xsh +fxx: pfb jfb qjs xpm +qrq: xdj nbd mbl mtn +jkr: mmh zsq qcf +stb: fnm mhp +jsh: dqg fgn vkl +tfd: nps qdl bdg bcx jlb ptc +mhj: tjj +vtv: mmh qrs lxb vdc +dxk: lkb +tvv: bzh +vcx: jpm fkq +vsv: fgp stj +dmt: pfj vsq +ltc: ddz bxz cqv +jqq: pxv zpf gbq bgs +gfb: rhg +xvv: dtg +zmf: nsd rhp sjx +qss: bhl +bhz: sxp xvk qqs jfj qtg +tpz: mrx mth +bmd: qlf cng ngn tdd +pkh: rjl vgj +ftn: jqk hfx hzx +fjh: mjn mlk brm +chn: jvd dsr qqh mlm +trb: sbk jhd lnh kqs clx rsf +vzr: tfz xtj +zjf: lkb nnc nqg +rsk: rbt +pls: mvm rrr cnl xdr +vqb: rxb stj dpv mqm +dsg: bqf cpx +qqv: nnf dkq knp bzt +cnn: stf njd qcj +prr: vrr rsq xff +lcv: bht +lfr: jfp xlg khb jbf gnm +xzq: vkk +pmm: bqf tdv +xzj: mps +rcb: kzb +drs: bnf rbt srf tlz +chd: rrk kxc +spx: grq vsq +lbj: jfb rqj mvg +gqp: vsp fqp tvv nrj +vzk: zkj jxh qqp vjj +rrz: hdb zzg hsb rhh +pcz: jzz bhl cpb rjs +pdt: cpv vfb gqt ksq +rsz: xkg brs kdd +kbq: zfr +bkg: znl +cfs: lrp vld njf pgh +jmq: tgb kgf rld zfd bzm +sth: rvk pvv fmd lsb +mtf: jmr sph lrs qcj +mzl: bcf ght bnr rhd fmj +crj: zfl +gvb: pjx nmp xcz ptj +gxg: lsr frf vgh cfg +kxb: bjx scg phg ddk +bql: pjf pxl cvx nsd +scv: tvx mml rtk htq +mld: rzj gql sdc +tdv: drn +dpv: tql sds +thz: lgz vgj +fcz: mvg pkr tgj cmh +stm: zpr xtf nkz +pxz: gxc rpl +tdh: pxq +dqt: skg rkd +xhp: fsk +rmk: sjx bbq jpp tfx jkr +pbm: cvx vbl bcd dsj knj +hxb: rsk fck zsj xxb zhf +gsq: zvl knp srg ncq kxc +lzt: tfj skg lsb pkf +xbp: jds tfz rbz +mxk: dbh vgd +jpj: hlb +ctb: nkh gfb vzx nqb +knp: xcr sff +rqs: dbh clf lss nbb +bft: dtg fmv lxb hhx sjx cqm xzg +dbh: tld +rjr: vgb +ctq: dtl +xpm: xtg +lss: pts kzf +mzt: dcc +pgc: gds glz +cmh: brs +qsg: rbt rsd +ngn: ftp +trm: mtq hdt qtg nlt mzp +dtg: srf +xqc: mcb xbp +nlg: jfb +jmf: nvz ccx +qqk: mmc sxs tmr msg +nlb: zrl vmm trt pmm +pkf: gds bzk +bdb: plc cqg kqx +pzc: bqf bdr kcx tql +czx: vsp mpd dgr nng kdp +bkh: llq lvc +nhc: cdp bzm +rkq: nvv cgn htq mtn +tvt: qjd bgs +qmv: znn prf +tpg: tzj tql cpt +hbl: vst vkv xsj trz +crd: mvn nmj vjm +bzv: kqb rgd sgc fng +hgn: brj xcz vcm +vfb: lrp +mbh: bht tll hpc rsh +sdx: vzx gbq plr +gsv: tfx jpp rrr +nlv: tdv zgz dgk +qkn: fgp +hfs: nng rkd +stv: rbt dmj pmb +tks: szz hnb jbf qjs +hxl: ksc hzr qjz vtl +bmr: pxl dmj jld +gxt: zvb vlz kfb +srx: dtm +glv: msn ftp nhp +mvs: xnc xkz mgk +qtt: qmv mps nmp vdg +xvh: lpn +lrh: vjz xvp bmb +jml: jpp jnb hvx +ctc: rtk xvv tzs +hzs: bcq +gzc: dgk xtg +drd: scz vcf vcx msg +ftp: zjs nqb +ksq: brj sfm kgf +dth: cct +zps: qqs gcd tht qnz fgv sdv fjb +vdc: pqc bjp +lrx: nrj rsh zjq +phd: hvx mtn +ccp: hvg xvz xvb jgd jbz +vnp: mqb gqr tkk rmx +bng: mvm +rhs: rzv tfj vbp +jzp: qlf kvf ngn +mdg: bcd vzr nqg +pmd: ksn nqb +qxj: fsk +kdp: kht +dfk: cjg xcr +fxv: rvl qxv bkp +xqj: kqm fxj xtr jpj +gzx: pjt +pfj: nvv +lnk: ltz +fdp: bjp nbn kmn +jmr: lxs nzz xct +jzz: kzb +khn: rdb +zmr: kqx +vzz: xpf rjl hfh +tgj: bxj lvq cpx +nxb: bcx srx +lcj: pgh ndr ppr +zjh: cpv fnm jbp vdd +nbd: hcd lgz +ldz: jgk pmm +nnf: jgq vrv +lmb: glz pnh sms plc +xtj: tjj jnb +bsj: ztr qdm xqm bzn +gzj: rhs nxl djj +nhp: fbh +jds: kvz +rmd: jvr xjs zmr xms +pnn: nnp nqf cct xlg +jjn: rjl qlf +nnc: bcf kqm +bls: jdj bvp kqs jcq +scj: jds qsb zkd mvt +ncd: gdh cqv vxc rdn gzx sqb fck +flr: zfc cgk lrh lnh +mhp: tcl +cnj: psv +lvr: ppr fnr +skf: kmn xvv +qqh: xlp xbl +hdh: nlj bpf fjs +kct: lsc ntc gjh +lll: nps nvv +zjl: qjv znl qjs +crs: vjj +fng: hzl +pxl: xzq dkj +smx: dpv +mcd: mcc fbb rfc nzr qfj +hmg: nxs +hxx: mjm xvv +szz: bjl +cls: xpm mnx rvj cpq ktt brj chv +mvq: gxx mxv hnb +pkn: tbx zqz mql sfj +cgx: hvz pgk dxd +zgh: vlz kqh +bmb: bkh dpb cgn +tpl: thv tft snx njf cnj dhf +cpd: pvl tqg qqj qdf +ffk: czg +rkp: kzf nxb bhl pkh +sdv: dpc kvq +gjv: jmq pfx msg nzm +xgb: qjz nnp pdr +vgb: mmh +cfn: rhg tfp +lnh: mhj +bxr: qlt dkp +vjm: khn +gqr: jpm zkj +sxs: kqx zkp +xbb: mkh dxk +nvn: gzk vkk +gln: xjj bcv vqn nrf +bpf: mvm +nkz: pnh crc pxz +vzf: lgr lbn vml pmg +rtk: zkd pvj rdp +frf: tqb fsq zjd dsg sfm +fck: mxl xmt +phx: qjd gdh sgj krf hns sdj zgv +rkx: fdk dsg +vnq: znk djk ztr +sph: pns gjr nkp +pxt: fnr +nct: jbf chv tft hbr +pjx: zkj +gqt: clm +lzd: blh vml kqh +nps: rvl +qbf: rjr ggp tfz bxz +xjn: cjg +djr: rsh +vjd: jzf djk zmr cqd +bcb: ssx nst fbh +cpt: djj qhh +ckn: qkn +vjz: ghz zfr jsk +hvh: bqf tzj +pxv: xvk jbz prr mms tmz +nmj: ssl +nkb: plc svr +zdq: ldv lgf fnn +dzp: mpd qrv nzf +jfd: rqs xvv nbb jgf +mzv: fgp znk jkt +nmm: njd +tqg: znm xsp nmp +ttn: tfp trz bxr +rrk: vml +gbq: hhq +tzh: hlb lqx +pzm: sms bzn +cpq: zmr nxs +rxt: jgp xsm jjn +zlv: hpp kxq bsj +jrz: xms sgv zll jvm +pkr: crs +qnz: mvm +ztv: qss +nqf: jxs +mts: kqh +jgd: tpb hdb +mcx: rhd +jkt: xvs smx tvv +cxg: jpj gqj +hsz: kvq mrv mbt blh +glp: dqg qkm +qrs: qss +llv: jbb fvp rxb +cnr: jpf djj xvs +lxb: kxr rdb +vbl: fjs tfp gvx +mrq: crc qxj vht +kzz: vdc jnb fmb hdk +php: rdb gvx +bfh: pfb zmr tmc stj +rfz: gqt +nbn: cdr xqt +bsl: mdx nhp fjf +ngr: hgq ddz lrn fmb bdk +sgl: cnt nnp fjr sqv hfs +nqn: nrl stm ptj nlg fls +rjs: lgz +clz: sqg mnk csv +vrk: lbn kkh vxl +djc: phd qcr cpj vgd npt +fdk: fjr cpt jsf +sgj: zsx djc +tzj: qfj +xvd: vrv qgj hkq rkh sfd +pzs: txk +dkp: qjx nvv +jgk: djf +jkj: nkh rbz sbk tzf qxd +hjt: vvd sql qfv hbd +djf: nnm +mrx: lfh tgb drn +jxn: dft +skx: lll bhl tgm mrv jnb tfx +vmb: bxr vml cqv bls +brr: vgj +jzr: vmm vsv lcv +rxz: fnm +cqb: xzj bjl +ccd: nqf pzs zhj hbh +frh: kmd plk +brk: rkq scg kvq frj +sqv: rzj fkq +pqg: hzl vdd ctq +nrp: ghx dtl ttm grs +vgv: jrv +kcg: bdb tcp njs jvr +qnn: kxc cnl +kmd: xtc +trz: qcf +mdd: jff zhc hvx ncq +fqj: gfb zlx ctr +fmq: sth mnx jpm +rxb: pvv dgd ffv +kqx: lhb +vjs: nvn vrr lrr vgj +ztz: bnq dlr kmd +ghb: nbn xvk fgs +nvj: vkl zjh fsq xlg +bhh: qtg +vjp: tll +nzr: pzm csv +gzv: fbh pvd +hch: kzn vjn xsp nzm +jlb: tgm +ncq: zsx nps +lbh: vhj mjm mhn +lhb: bjl +cqm: tgm nbb fms lgk +hdt: mmh +rbz: vgj mjm +nxs: gql +gbp: jpf dgr lqd rzj +lsj: hvh cct +nbh: xvp vvd zfr hgq xpr bhh +qkm: vpk +pcq: pmb lhg gdh +nvm: gss hzl jzr vph lrx +npt: kgd qdl trz +kqh: rhd +rxp: jbb lms zkj +vxc: crj zzg ztv +hdm: vgv sdv lhg srf zkl +rxh: dqg smh +kcs: mjn mlk grq +bxb: xzn bzt ffk mts +ppl: lhz zpr mqm ksc +zms: fvp kzn znl +xjs: hbr rvj +bpt: vkk kqm +mpd: htd +bss: pgk bgk vph +cxf: xqt rtk xrx +tzs: mhj qjx +xll: ctb zkt zsj phg +qjx: ccx +btm: kbq +zff: nrj cfg +cnt: nnl hbh cqb +zxs: brs kmd +fns: jsf fqn pkr +zfc: khs +bkp: rjs tjj +dsc: mth ncx +mlp: fxx kgl chv cmh +ttm: vcf dzr +vbd: fqv xcd dgk lkl +ckv: mmh sff gnt +txk: fnr cmm +cdp: sbj svr nqf +rdx: kvz +gnt: kqm +hqg: vqt drv njf sds +flg: ltx lxs gnh +vkm: qlt sxg tzb +lqx: mbl +mlg: qzz +kdm: cct tql bzk bdr +gbl: lxs +gvm: jxc zsq vlz +flh: dcc btf jcb zdc +tlm: gff xbg jvd frh +xjf: mgk vbp tfj +gtt: lcd hvx thz xtm +ksc: rzf +bnf: hzx rbt +stn: blh sxg hvx +dhf: mlb jgk +xcp: ptc tlq rsq +mbc: gzk jzz +lsr: fqp znm sgv +mmc: prf kgl rfz +dlr: drf +vfh: plr vrl cnl zsq +jvk: pmk ldz +vxt: vpk ckn +jpl: bdk +tvx: rct bbg lrn +vxr: lvr npl szz xpm +tps: ckv vzc xpf +bdp: cbq gjh bqb bcq +qrt: rfz nqf gql cbq +kjf: txk tcl gjh tqb +qdf: ndr +hns: lqx +rng: kmv hlb ctb +zsj: xmt +nlh: nmm sxp vzc +fxj: kcs mjf +pgl: mxv tgh qqp jsf +rdr: lbj tvv fsk ldz +pbc: xcx clx +fgv: rjl pqc +nmp: tql +qrp: pmd lrs pts lbn +jhd: hdb +kxq: hzl cpx gqt +kmv: jsk xpr +kbs: mps +gvt: pqg sxs klj dqt +xdx: jlb vhj +xkm: dlr djr cqg +stt: sfj +xld: ngn +cdr: ddn +vjn: qqj mzv qnr +lgr: qxv mjj lgk +vkz: glz +zsc: zlx nlh mhj tht +spk: sgj mms vjm +vbg: fjr djr hbh +lvs: ctc xcp rkp dpb +xvz: rjl lrs +mjx: dmj srs cgn grr +ddz: bvp +cjg: pfj qlf +rvm: nkb vbp nhc dgr +qvs: ccp kqh rcr mxq +sqz: xvg cml +xtr: pgt vkv +bcf: mhn xkc +kxn: rvk +zhj: scz jbf +ptj: rvj nkz +sqm: msl zvv +psg: cpt +llq: srx vgb rjl +ntc: pbl +ztd: pxz jvr tdz +pjd: hsm vfb lhz +cpj: zkl glf +lxs: cpb +mtt: zcp lbj bnx +hpc: kfq xrm zvv +shr: nzz jpl +lbn: dxv +rjz: mpz hdh stf hbn +gnh: fjs dxk +nlm: vgx fjr txk +rtx: hmg lfv mgk mlb +cml: gds bqf +ctr: tpb +lfx: qgj rrr xdx +tjc: qpb tmc lvr nlv +jmp: skg plk sqm mkv +sbc: zfl +qhz: zvl nzz nxb +tfq: nzr drf +rsq: gms hhq +rjl: mrv +rlt: vkx bdb fhl bzm jsf cfs +sgc: lhb vld kbs +mfq: kcs cpj bdd rcb gtz qgt zlx +klj: rxz tpz bkt +cmg: fnn ddf rrk qxs +ddc: hlh ltz mhp qxc crc +xjl: ncx djj tlj +nzm: txk tzj zjd +zfd: dth rfz +fsq: smh sqz +hjd: dtm rjr rkv pcz +dqv: frf nqf zkj mhs zch +gvx: vrr +zpf: mxq ttk hlb +rmx: sqz mrx qjr +djz: mql cgx xhp +bnq: fmd vpk +xcz: kqb gqr +zmp: cgn cvp pcq bcv jlf +hvz: lmv tmc +lqm: hbt +lfh: qkn rzv +fsn: jgq qcr xzg bcv +hpp: mvg hsm +rtm: zsq jpj cpb +cgk: bjx mbl +tdk: vxt djx fdq +scz: vsv +sql: zkt xld xpr +qgt: glf nkh flg +mdx: xrx xld xlv fjf xjn +bdr: lvq krz +xbl: rjr qtg vkv +knc: kvf xcp jpp prl +sxv: hzs zff nhc ctq +lvh: ptj nrp czr +cvx: jpp +xrm: rfz kgk +qxv: rjs +drv: qdf psg +vck: ztv pvd bhl +mvb: mlk rsq tnn +nqb: fcd +lmh: mxl dft cfv jhd +rvj: fkx zqk +gxc: mps zqk +pqc: xmt +vdg: gqk +vzc: cfv cxv +ttl: dqg psv nxl mfg xms +vrl: hbd +mxg: drf sfm mld +qgk: hbt nxs brj +ndz: pxt pnh nng zxs +ldp: mml lpn grr vtv ccx +gjh: znn +qxd: mvn qbt ftn fdp +vcf: qrn +drn: zqk +jgf: cpn qjx sbc +rgd: xtc cpv kbv +gbh: mkh +bgs: gcb gzk gdh gbq +cql: plr mrv +chv: fkq +tgc: srf +qxx: ztr pdr jxh zjh +fqp: zkj +qkr: brs cmm rxz qgf +qsc: jxs drn jbh +dfs: hxv vxt cmh tpz +fvc: rhb ghx vdd gnm +kpc: mlb jvk msl jxh +pmg: lmg btf +mgf: mrx drn tdk tkh +bhl: kvz +qxc: mql vbp dgr hmg +ktt: pkq cqb +jfx: dml nnp nvm drv +qbt: rsd dpc vjz zsj +pgk: mcc +xxb: jzp jlb mkh +qdb: rdq mgk rsh +ckj: sds pmk mxv +fth: pcl rxb ttm +rgq: pns hhq bnf bdd xbb +jvf: ctq xzj mlg lfr +vtl: fkx xgz fnh qjs +pnh: rvj +xsd: frh hcv hbh vjp +fvp: lsb +zhf: hxn nps mts +psd: dqj rsh rmd krz +vsk: pjf vgd ttn +jdj: mtn bpf +hvg: bpt ldc dfk +bcd: nps +grq: xzb +drb: dtl rqb mlg ffv +zrl: sms pgh tqg sxs pbl diff --git a/2023/input/25/test-1 b/2023/input/25/test-1 new file mode 100644 index 0000000..bbfda0b --- /dev/null +++ b/2023/input/25/test-1 @@ -0,0 +1,13 @@ +jqt: rhn xhk nvd +rsh: frs pzl lsr +xhk: hfx +cmg: qnr nvd lhk bvb +rhn: xhk bvb hfx +bvb: xhk hfx +pzl: lsr hfx nvd +qnr: nvd +ntq: jqt hfx bvb xhk +nvd: lhk +lsr: lhk +rzs: qnr cmg lsr rsh +frs: qnr lhk lsr diff --git a/2023/src/bin/day25.rs b/2023/src/bin/day25.rs new file mode 100644 index 0000000..e302d07 --- /dev/null +++ b/2023/src/bin/day25.rs @@ -0,0 +1,172 @@ +#![feature(test)] +#![feature(iter_map_windows)] +use std::collections::{HashMap, HashSet, VecDeque}; + +use anyhow::Result; +use aoc::Solver; +use petgraph::{ + algo::{condensation, has_path_connecting}, + graphmap::{GraphMap, UnGraphMap}, + visit::IntoNodeReferences, + Undirected, +}; + +// -- Runners -- +fn main() -> Result<()> { + Day::solve() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_test1() -> Result<()> { + Day::test(Day::part1, "test-1", 54) + } + + #[test] + fn part1_solution() -> Result<()> { + Day::test(Day::part1, "input", 552695) + } + + // Benchmarks + extern crate test; + #[bench] + #[ignore] + fn part1_bench(b: &mut test::Bencher) { + Day::benchmark(Day::part1, b) + } + #[bench] + #[ignore] + fn part2_bench(b: &mut test::Bencher) { + Day::benchmark(Day::part2, b) + } +} + +// Totally copied this from: https://github.com/Zemogus/AOC-2023/blob/328dc6618f3a360c3d3851ad1b10513a6c133336/src/day25.rs +// For some reason the graph library has no dijkstra that returns the actual path +fn find_shortest_path<'a>( + graph: &GraphMap<&'a str, (), Undirected>, + start: &'a str, + end: &'a str, +) -> Option> { + let mut queue = VecDeque::new(); + let mut visited = HashSet::new(); + let mut parents = HashMap::new(); + + queue.push_back(start); + while let Some(node) = queue.pop_front() { + // Already visited this node + if !visited.insert(node) { + continue; + } + + // Reached the destination + if node == end { + break; + } + + for neighbour in graph.neighbors(node) { + if !visited.contains(neighbour) { + parents.insert(neighbour, node); + queue.push_back(neighbour); + } + } + } + + let mut path = Vec::new(); + let mut node = end; + while node != start { + path.push(node); + if let Some(parent) = parents.get(&node) { + node = parent; + } else { + return None; + } + } + + path.push(start); + + Some(path) +} + +// -- Solution -- +pub struct Day; +impl aoc::Solver for Day { + type Output1 = usize; + type Output2 = usize; + + fn day() -> u8 { + 25 + } + + fn part1(input: &str) -> Self::Output1 { + // Create a list of all edges + let edges: Vec<_> = input + .lines() + .flat_map(|line| { + let (a, rest) = line.split_once(": ").unwrap(); + rest.split(' ').map(|b| (a, b)).collect::>() + }) + .collect(); + + // Create a graph from all the edges + let graph = UnGraphMap::<_, ()>::from_edges(edges); + + // Take a node as the starting point + let start = graph.nodes().next().unwrap(); + // Loop over all other nodes + for end in graph.nodes() { + // Make a copy of the graph so we can modify it and undo changes later + let mut graph = graph.clone(); + if start == end { + continue; + } + + // If the two nodes are on the same side there should be more then three paths + // connecting the nodes together + // At least I think??? + // This solution worked, so ¯\_(ツ)_/¯ + for _ in 0..3 { + // Find the current shortest path + let path = find_shortest_path(&graph, start, end).unwrap(); + + // Remove the path + for slice in path.windows(2) { + match slice { + [a, b] => graph.remove_edge(a, b), + _ => unreachable!( + "There should be three paths connecting all the nodes together" + ), + }; + } + } + + // If there is no path connecting the two nodes we have removed the three edges + // connecting the two halves + if !has_path_connecting(&graph, start, end, None) { + // Condense the graph, creates a new graph where each node contains all nodes that + // where connected in the input node + let condensed = condensation(graph.into_graph::(), false); + + // The should give us two nodes each containing all the nodes in their respective + // half if we split the graph + if condensed.node_count() != 2 { + continue; + } + + // Multiply the size of each of the halves together giving the final solution + return condensed + .node_references() + .fold(1, |acc, (_, nodes)| acc * nodes.len()); + } + } + + unreachable!("No solution found"); + } + + fn part2(_input: &str) -> Self::Output2 { + 0 + } +}