From 00bcb17d763a067497203f35bcf49b6e140a0380 Mon Sep 17 00:00:00 2001 From: Acvaxoort Date: Wed, 27 Dec 2023 18:02:21 +0100 Subject: [PATCH] day25 --- day25/Cargo.lock | 75 +++ day25/Cargo.toml | 9 + day25/input.txt | 1262 +++++++++++++++++++++++++++++++++++++++++++++ day25/src/main.rs | 151 ++++++ 4 files changed, 1497 insertions(+) create mode 100644 day25/Cargo.lock create mode 100644 day25/Cargo.toml create mode 100644 day25/input.txt create mode 100644 day25/src/main.rs diff --git a/day25/Cargo.lock b/day25/Cargo.lock new file mode 100644 index 0000000..8b298f5 --- /dev/null +++ b/day25/Cargo.lock @@ -0,0 +1,75 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "day25" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "getrandom" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" diff --git a/day25/Cargo.toml b/day25/Cargo.toml new file mode 100644 index 0000000..755d522 --- /dev/null +++ b/day25/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "day25" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +rand = "0.8.5" diff --git a/day25/input.txt b/day25/input.txt new file mode 100644 index 0000000..4b678e2 --- /dev/null +++ b/day25/input.txt @@ -0,0 +1,1262 @@ +pcf: vqq glr rpx qcm +qkb: ccc lxr ppx +vnm: frl +scx: czr +zqg: lbj xkk +qvs: zgv vfq pqp qbl rpt zcq +sxm: rgj +vrd: hbb trd fgh +dbh: crj hjx bkj +psx: sxc +dsx: bjf zrx pld +dqn: kxm +lst: fzr +mzv: gcq bkh mqg +lzm: fdl jpf qxt +xfs: zdh thc rxd cjm +lqk: zth +mbn: skp pxv zgv bpn +kzg: mgc vnc zdt +rdl: pql ptt jfm hsp zvl hhx +nbj: tqk qhx +rzr: cfk pdh +bdm: ppx jcr tgp mhl +glr: bzl snq drq prc +qds: glk jvn ntx +kqq: ftz blr hlr kvd +fsd: hbs +czr: rms +sgv: kzb tvs qxx +mdz: rtk txr cqr +nvc: vsr kzb +bkp: msz vpn fzr +fbq: txq sbn +xgq: dng xlh cqb +qsq: vvr vqz xpv nlm +dhk: bqm fvg cjm +khs: dqq tfb +blm: lqb rcq dmr knp +vfb: tjm ltb lcd vss xvg +psn: hrb hzt dhk hdg +dtl: jgv +tgf: rnk +jlj: rhq vmq scj fsp klg +nbt: khg dvg plf +cng: gsf +mrr: bht +pbf: pxl zbf +zpm: tfc jrm jfl crs hsp +sfh: pmh jfl nhf vct +fdl: jtj +qtl: kvn glk cjv lrd +pmv: mpj mmp +qfv: nph klg kxm cmj vxd pqx +mjn: jfk pql +prc: nzf rjt +qnc: kbt nth +cml: gzg lpz pxs tvd lvf +nxl: mgg tnt msz +rqp: bkj nbg +cfb: slr bmv mnf tgp bfm +sff: flz nlq jtc rkz +jzk: txm +tnt: szr ljs +jhm: sms gll +tjm: vvz qsf +psh: qsf +ftf: rkn rcz ddg hbx +jfl: rll +pxp: dtc nqq cqb sjd bdg +hfm: xzs krk jpj hbs fvg +fvk: gnv bjh +rxt: dlr sbg +qhk: dqp tzz smc rxh +tbf: tdl +vms: sgl +mps: fth kqs pnr fbq +srg: ndj gdq +vzk: ggd dms vdh zdt +dkj: drk zmv kkb sjs +hzg: drn cmp gxf mkr +pqm: gmf krk vvc ldb +dpb: sdj bgh plm +pnq: fxt mxg +mlc: brv hld mzz +cxx: vrx zcx xxv +crj: lxr vgl +stj: tsm xxv jpj ccl +zcl: fvz ntx +dpd: brv sms frx +snm: lnn bqx nqm kdr +vdx: fbm cqr fpg pdh +qjv: vhd vms +xhm: lhz kkv lcq +zgk: fkc vmb vjj vtg jqs +ftr: crq ntc bsr +rst: cxm +xxm: mld +qxj: nhf dns +lhr: znp +tfx: lgs skp fdl dsb +mzr: qps +kjt: kzb xbb +tzs: cfk sdg +xqr: lbl pdv +bjf: vsz lft +xnh: tfv lnz +tqk: kzn +tht: dld kqh cng rlc +tsd: kng ndm +thn: gkg +xth: bns zgv fth bfg kzc +fjx: kxm +smx: tjq pmv nbj hdj +zdt: xtp zkp hpf +zcm: njk vtl fvk +jbj: nrg bng jqs vgl +czm: fdr zbf dkt +rfk: rbm grf zqb +pxn: cjv jfl +zxp: dvt qvk cfv pst +lrc: dpp jcr ldh bth +djx: hpg dlm +gvv: rlc ppn gjp mdv +ddb: xgx rft +qrx: ckt bdg mmh +jxk: psh dbp cbn dvz +bxk: mrq jzk cpv pqh +vvc: nqm ngd gzm +drd: tzj jgc nzf rxx +cdn: jhh pxl xdc lgk +zjz: ldr cfb bfm +kkb: qnn dmp +ctv: tfb gbh +cvd: rhq rcn hcx +gxb: dfn vzc +jtv: jjz bqm +dfb: fqz zmr pnr nlq +ptr: dfv lqm +dvg: clp +qgz: qzq tlk jzt kqg +qct: lbv gxh vdh +hpg: hck +dlr: jvj +jgv: mmh +mmp: hck +krk: lqb +ksr: ggd fzr dsm +ncb: rxt kqs hhx mnp +zcx: knr mkm +zfr: gxb dsm xqg +hpr: txx gpg +bzf: dvm +qjp: qsh +qgh: sjd cpv chv pxl +vnk: pxl sqs glp +gkr: vtg bnj bng tdf +sxq: ltl ksb plm +lcl: njk zjl tsm +vkq: xzj dvm +brz: drl str +nlk: jnc +zpj: rjz psh zvt +vct: frl pql +tfp: zsm rsl jtc smt +drx: xzk dzt +hrb: kzs clp +vbs: pbf zzh qlp +hqc: crc pcb kml +qld: hqf cxm rlc vkd +zjb: mft mnc xpv kjc +plv: zfr fqq fgq xkh +brr: fbb mdz dpd hrb +qzq: rhd zgn +zgb: fft ksj jcn +qgr: cmj bsr trc +kdr: qns fsj rpx frx +nqk: mtv zpj pbg nvh xvv +kzz: blv gzm +pld: pqx rcn +pvm: qnd +sfq: gkt +nqb: mkm kzs +dpl: qxf jvn fbq qxj +lrn: jcr +gkg: nsz +gkz: rlf cbh vcr lzm +ktf: hbz ncs qnd knm dmm +lhl: mgc qnx +xjk: mqg hlh +fzv: dbk tdf +gxh: dns +kfh: dsb +xqg: flz +ztz: jfv thn +kpv: hgx tqt vhq pxx nmz +bbt: lgs jhh +xnj: dlr mbz +nzl: ggb lsx +zqz: psx +dlb: brz rgm +jjf: bzf qfh cdf xbt +pzr: nqq cqd sfk +nzf: mdv +kmn: fvk lbm +pnb: jcn +lkh: qkl gjp fkc txr +fft: bmt +tpn: vmk mjn qtv +hbb: chn +tbx: ckf rfq szr vmz +fqv: mbg ncs vjj cxm +dgb: qxj trf gxt nlm ntx +gmf: hkd rlc +hzh: scj bxz mrv xgf +zmm: rcl +hpt: ltt lft sjg qpl +czv: vms lqm zlb +fsk: nvc ztm rqp drl +rqq: fxc nxk vbs +ggb: fsq kcv +kjb: pkd +dfn: qnx gqf +htg: dzv sxx krm +ptt: zpp +sns: rmd vgf qbq +fcj: cxq +tkb: ldh pgx ccl +fml: rcz znp cqs +flg: pst glb nfs tvs jhm vck +jgk: bmt vdv mvr qxx dcv +bqv: chz gfh znd +zzh: ljs qsf +chp: jvj +hhg: cnh +dgl: rdc gzm xjh lrn +czf: dvz ntx +ncr: bbx +vhk: pvm mkm khg +pls: mcd knm +bmv: sbz gjp ncr +cxp: kzs lrn rdx pjg vgl fkl jpr ltx +scm: zbf vvr +rtz: jrr gdv +ndn: tgh +ccc: jtr +rmq: ldb dlb htj +dbp: qxt kxh +dmk: bbx hmj +fhq: hbx jvj mfh vnv +shg: btd +pdl: gzm +vfg: bbt +jjm: kxh xbl +znq: vcn cvc lgn +bcm: jsz rdg rlx +bdf: tqg xmc +vqz: chp vfq +jdl: rll xzz bkh kdl +ljf: kpd pfk scx kdk cxd +zqs: shg hxt vsc ctp +fks: svd vgn mrq +xgx: vvz +xxv: lzx +lbj: zbf +znd: tfv +npm: nxz qxx dxb +jqp: czv ngd pgx txv +cgf: frn rtz qgh rfk +rhq: jcr cdc +fhx: zpp tbx dbc +nnb: ldr +rpv: gxd dtd ctg sfh +fth: jzt rkn +qzx: pmv mtj pgl jzk +xhk: qtt qml vnm fqq dlm +hkx: jgl xqg nzn fpf +xbh: jcr brv zcm dvg +zpf: vzv mdn ksr fcj dlm +nxp: bhs zlj +ksb: fnx qnd +zhz: hxt rjz txq msz +gkx: pbp xtp lfx ptt +lgp: vfg mqg qnx ctn +hjh: sjs flz +hjx: pvm +glm: xgf pch gll pvx +lpz: gxf ptt kfz +fdr: qlp jtj llk ptv qff +tqp: jkt sfs +btx: cqp bpf kpv zkd +zrh: jsv nzf qvk jjz fpg +hms: xxm +vzg: cdc jnj +qkp: plf pbd cmr mhc +vtc: gkt zjl +psv: tdd fqq +kvn: jkm pgv +nbc: tfv rdk +cqd: dpb btc +jgl: rzb +lll: rcl +skf: xgf zpq +mcd: tqg lkm +kqh: bjh xbt hbz +ldn: zmm tsd ksj +jqq: xrv +qfh: qkb txv +mpt: fft hgq jjf ltl +cqk: nbj lgk chz rkz rtb +htj: jqs kzb +jlx: tgf ddb +prq: knm dzv rdc jsv +sgh: njr dzv cxx khs +plb: zjm jsl vfg zqg +rnj: hrj dng +dzb: zlb xqp qvk +txf: pgl +sxt: mdv qvk vbc +jqm: jcr lbl qjv +qcq: rst cdf msm vhd hzt +dnr: sgl qgr rdp snl grb pbd +hmx: bpv bjh mhc vtl +xdk: qnn mgg glk fjc mft +ldh: txr +chl: hhj pnb pzr bpx +ckf: qff kfh +cvk: cfk pjg fzf mfg +zln: zzh xxm +ggx: pbd rqp +vsr: bqx bhs +rjz: nrs cxz +zkd: grf gfc +bbx: qbc +rkp: vct +vtg: qsh +gzb: dct rmk xmp znq hkl +lzx: pdh +jzt: qds lnz +mcp: ckf xlc lrd hbc jkt +brl: qbc cfk +xmp: czk zvg +ddg: lhr +sbz: gpm +djv: tzx xbb kns fsp +qhb: xnx kxh vsc hxz +qff: cqs kmj qml +hck: zvg +kqd: bhs +lmv: zfm mlk zrg +dng: zgn +xdj: pvm csq jcn +xmm: qml vpn bkp gqk dns +ggg: cxq +mdr: qlp tcp +hkl: lhr ccv +mhf: vtg qvx dbk vsz bng +gpg: xrv jfq +mfl: psd mgg vvr gfx +csj: nqf svb jtr +hlh: txq +bjd: mtv fdr nmg xlx +fpk: pmh thn tnt +dqf: ltl cbg mfg chs +fzf: sjg czr +bmt: krm +brv: bbf +fsp: jvb svb +mfd: ltl pqx +fvz: dtd +chn: rzt +bqk: hxz lcd jrm brh +xkh: lql pxn mlk +ltx: qkl blv +mxc: ddg cjh ggd +hxm: mpt tcm rxh fmn +nbx: zsh jxf nxr rsd +dll: xzs qdm cpq vbc +rtb: qzq tqt bdg +trd: zsm +sfl: szh gdq +rjp: tcp svd +npk: bzh btc kjt hhj +jrg: ltt skf hbq nbt +txd: zfm rll rzt ccb +sqb: str +mbz: gxd +brk: qdr sck dqq +ptl: fzr +pdq: ljs zrg clk +bpf: sfs +xss: tch smk fjh pnj +gfl: fsn zcq jzr hxt +bqn: xbz jrr hbn hxz +fxd: rsq +tln: rjt vxd tkg qkx +pml: hrt dbk rmt vmb +rqv: zgb rxh +bht: xnj +jfk: brh +zcf: chn xkk flz +jsl: dcq msz gxh +vsh: mbg dqn ntc hzm lft +sms: bbx xbt +tpb: rgl rzm vcr sct +zqj: blv zlj vmq +lch: jnj mcd kzz +ctm: ggg fgk sns +sps: pdl mbg +zcj: qpv +lkm: vkf +mvr: dfv vsr zrb +thq: btk gbb fks bns +hrt: fcs fck zgf +pvr: rdk tpn qmk xlx +xxq: hld mpb +qmk: mpj +fdh: qlb pns vmq +xlc: gfc qpv qps +qmz: kkc ptx cdp vgh +jvn: nkr +vdv: thc fbm +jfj: vvz txq xnj czf +ztc: vxd kqd zrx rpn +sxx: ndm +hsc: ggb rzt hkl hgd +nmg: jqq rjp +jhh: zvt +gqk: rqq znp xrv +rdc: zmm +mxg: nqm +fxt: krm htj dgr +xvg: fgk fgn jzr hms +pxd: pzv xnh hbb +gbh: fsj +pns: nrg +qvd: rms tvs ksh rsm +xrk: pgl rkp clk tjm zsm +fnj: nkr lpr qxs jgl +rnk: qps +kqg: ptb +fpd: gvt rst nlk mnf gzp +tdf: vzg fsd +flx: rgm +jvr: mcl mbz +rgn: rzm cdp zzh sfx +dcj: zpq +mcl: glk bcx +qtf: rcl snh +grb: nff +bjh: fdq +dld: cfb pvt ptc +chz: thx jqq +djt: rzb svd lgk hrj bbt mdb +tzj: ldr nlk +hqx: jvb +qtd: pns pvx zks qjb +plk: pls txv pgb zlq +dcq: hvb xqv +mst: dcq cgq mnp hlh +fss: dvm +lts: smt ppl nnl lhl +fvc: nhf nnl ctm clk kmj pxd +dcv: bsr vjj jcr +jbb: rjz rnk njb +rnf: qml +blk: tbf sbn sqf kfh nzg rnj +pzv: kqg fnn +vlc: flx ltx qvk hmv +xqp: xmc +jhg: zps drq nxz +lkc: dvm zxh dqf thc +khg: gpm bzl +xpv: gls +nhh: lck +mbc: pld rpx tkt bxp gvv +bff: gvv xjm nqf btc +rnb: qft vlf cdc bzf +bpv: bdv mdx +kbt: mdn +tcm: snl +tfv: sjd +btc: ngf +ntm: dcj mfg +jdv: fsq xxm rdg pxn +fkt: cbn grh +zsh: sdj brx +fjc: nzl +shj: kzn gfh qnn +jtc: jfv +nsh: pzr nhh kpd xqp cvd +xvf: txm gxt +bxz: brx snm +pcb: qxt tdd +xjh: bqx +rdt: kcv frn zmv +dtq: qfb pkl chs nmf +nqf: zbk sfq +dkt: cjv qmk +nqq: hbs prc +rsd: klg kxm dmk +llk: lvp tbf tqp +rpx: svb +pxs: qxs vhp mrc lxg +hgn: xmc lzx rms +pst: vkf lqm +bxp: dxb +lss: tkb lqg dhg zpv +glb: vrx scc +chv: zsm +vcl: dtl jgv dmg nnz fdg +kfm: mjp vlg +fhn: hxs rdb ckb jqz +lsx: zcl +msm: bdv tch +qfs: fgn tbf gdv +hdg: mkj vkq pnb dld +fvd: xhp chz tvd htd +bcp: psh fcj brh +qvx: qpl zpq nxr +gsr: hgn gzp qvk lkl tlt +mxz: fmn mql vsb krt +rcz: vrg dcq +kdl: rfq tvd lgt +zrj: gdt kfz xcp mhx jfk +nms: lnv gkr jvb hbq +gns: snl vvc gzp mjp brx +zks: qkl +gmt: gqf +dhg: dpr +xvm: zzc +jlq: jrm +vjs: tpr cxn rdx lmh qdr bkj vhd rmq +gbb: tmm dbc +rxx: tlj gbh +kjp: zjl dpd brl +jgc: tzx pgx pdc +nxk: vzc xkk vmz +ktb: xbb ndj xvq dbz pzn +ctn: sxc jrm +lvv: rcl +qbl: grh zsm +cbh: gqz gsc +pvt: xnb bzh +cfv: rsq +qfg: xlf hbn nsz fbz +mlp: ggh xxq zbc dvt +qgg: btd rtr mtv +btd: gxd +dxs: lzx ftz njk mnf +lqg: ztm jxf +qtv: vcr +hvn: lsx jkm vvr nzd +xzs: mzz fxd plm +zzc: kqg fxl +tlk: jdq rhd jhv pbp +hld: ppx +gcf: pvx +szr: rdg mft +pdc: dsx krk snq qqf +rzm: mnc +mnp: jfv xqv +tdd: vvz +tpr: hld czv vzq +kml: nzd rhd +skn: xvf tqp sss +tlv: nxq +cvg: ksq zls lfx rft +lxh: ntv mkr jhv hgd +jxr: svd czk nzn mlk htd +pxx: cfm szt jhh +njj: dcj kqh vzq +hlr: pqx +jrm: fdb +sct: clk zmv pqp +cnd: xlx tgh +rsl: fsn +fpf: zkp +sbq: hmj hhz grd rgm +vgs: fsj zxh rpn kfm +qns: mpb +cmj: jnc +nbh: fsq +kzc: gxh lfc tfc +rsm: kcx jtv +ccv: dbc +bhq: fbz pmv szt +shz: kkc zqs svn btd +zpk: rft vfq tgf +jpf: ptv +tpt: lnv cfb nxp krm +dfh: dpd trg vrx xjr +jbm: xtf cdf zrx xsv +vxj: htc bzx qsh +nvk: tgf hbx dks shg gcq +rjq: rhc jqm cnq +bgh: pvx str +ght: lcd gqg tqk rcc +hhx: txf +psg: gkx cqs flz +hbc: jtc qnc +nvx: svt rtk qnr nqb +qbv: zps pgb +xms: cbn zpj +kdj: rtb qbq tlv +vsd: mfd pvt dhg +xcf: drq +qqb: pqm thc jtr crq +cxn: jjd svb fcm +lql: svn pbf mft mdr +zlx: pld cng dbh tsc scc +jck: mmh +sdg: xmr ppx +cqp: rnf nnl cbn +gtz: mxg ccl xpk qdh zcx +zpp: sjd +dfz: fxn cgq tdl mdn hfp +hzm: ltl +zrs: pgb +xrm: mql dzt hbq +hbx: tqp +kxq: rmd rmk rgl +tqg: hbz +vjj: bqm +lcd: dmn +hvl: gxl zrg xpv gfx spt +vrh: qtf zks zsd vkn +rbv: kzb gsf +zbk: rdc +ldb: fkc +vqq: gnv zmm lkm +mkj: sjg +dbz: gtf pnq +jsp: sxg hzm zkt bpx jpj +snq: rms cxm +ndc: vmk znd zln rdk +xkq: jkt vsc fdb +tph: psg ddg czm lgn +sxh: bzx pcf +rmt: mql qtf ldb cqd +qrk: bth hmv csq bxp rqp +nph: nld +pnn: znr zvt lxh tlk zmv +gpt: lgs znp hlh mrq +xqz: nqt clp tcm +gfh: sxp jfq +xpf: ctg kfh fvz dkd +vzt: tcm hbq lck tzz +mrq: xqv +cxd: cmj xxq xxv +dvt: ctv +mrv: htc lcl sps sck krt +crs: dfl mlf xgx +xbl: frh fgq rft +xzk: rbv qcp +dbk: gpm cbg +kfl: zlj gnv +ngk: sck sqb scx zcx +xvq: qkx drq lqm +nlf: jnj +fgn: xnx +ktr: qnc hjh fxl +xmh: zcx ptr fjx mtl +rkk: crj lft fjx hgq zqj +pzn: zpq sfl bzh mjs +hxs: frn +vvl: hxt hms hxs mnc +mlf: frh +qcm: kpp dqn +bkh: qmf +thx: mfh gsc +zvm: xhk kmj zqb +clc: njj tgd mdv dcj +xmg: csj xrq xcg bnb +tvq: cgq cfm +rln: ggh ksh hjx brk plf lrn +tkg: kpp zks +vqh: xjh nqb qbv vlg +bdg: fnn +mdb: jqq pql vnk +cdp: rcb gfx +xgh: sbd jfq +bpj: plf kxm rhc sms +kls: jlx sqf fxc zln +clk: chv +nmz: dvz pgv +jpr: nbt +mpf: nth ccv htl scm +pct: qjp fjh rqv vrh bzf xdv +rfq: cmp +kns: nqm +pgx: tgp grb +gzp: qjp +nxq: vcn +gzh: tzg tlv +hbd: csq zpt sxg bgh +fds: xrb zjb vcn gqz +fbm: ppn fxd +zpc: zkt zbc ncs kmn +jxq: dlb rjq ccc jtr +jjd: nff tsc qkz sfk +str: sjg +zlb: mql hqf jpj +gbm: hhs vpn gzg ddb psv xvm zcj +vmk: ndn jcp jlg bns +hgx: qtv fgq zqz cfm +dmg: vhp jtj +lrd: svn nbj +bng: qsh +kcx: lll ndm +hsp: mmh +xcp: hcs bhq qhx +dkq: fzv cnq npm fjh knp +nmt: kdc qcm +dlg: qds fqz gvn vld +mnc: vnm +rvt: jcn trc jsv bdf +xcq: dks rsl kzn gvn +zmx: lst ckf czf +hfq: zmx qfs mgc sqs +gcc: tqk lks rkp +nnp: drl pvm +mbg: drl +cqb: pnr +rpr: rhc hgn fck zrs +ppl: njb bht tvq +pnp: tsc rxd zgb szh +bfg: sjs +ntc: tzx dxb +xpk: ccc gcf rtk +rgl: sxp hjh frh sss mnp +tdl: jck +vkt: fxm hjx vdv hlr pls qcp +tkh: kjb nqt tsc rvx +hrl: rtr sfx vpq tdd jvn +nmf: ztm ndj +zxh: pdh xcg +zjm: cpv cxz +dmm: rtk +mrk: xdj pdh bdf sdg +rdb: zcj kxg +smk: hqx mpb +zbc: gjp nlf +plf: dxb +gll: mpb xcg +dmd: ckf vnv gcd nkr +nxr: mxg rvx +tch: frx +fbb: fsp qcz sbz tsm hmj +ztm: cdf vbc drx +bpn: rcb rdb ckf +dpp: qcz trc vtc +gdt: qml ggb +vmb: xjh dzt lvv lqg bbf +nsb: svt zxh ngf +jfm: ptm nrm rmk +jdm: lhr bpg mbh chn mtv +gcd: bqr lgz +jhv: drn tqt +srd: kqg rzm fxc +trc: txr str +sgr: khs scc dkq kng +gqg: hrj djr dks +slr: qjb sgv tkg +ddv: smc ntm cpq xqz +bmx: lck gcf qpl +zrg: rnk +rdm: bfg fnn ctk vfq +hzt: qcz vkn +lfc: grx +nfs: jpr vmb +fjh: ntm +zpr: hrn cnq mlc rhq +hrn: pkl vgl +msj: qdr nsb qnr hxc jxf njz +dmr: pkl kzb +njr: dfv pnq +bjk: lvv dbz hrt rjt +qqm: vkf ggh glb nff +nzg: vpq zls +gxf: cgq +bpx: jcs bbx +dtm: fds htd flz xbz +mld: fsq +pbd: jjz +ptm: vrg sbn jdq kjc +jqz: dkt sdf bcm sfx jvr +fbz: ssl xlh +vkb: vpn hkl qtt vpq +khb: mrr vcn tdj gxb +drn: bns +jjv: jtc ptb gxt shj +qxs: rcb +qvl: txf ckt nkr htl vqz +pcp: rgj lgt frn jbr +jcp: hpm fxn nlq +trf: vpt +dms: kfz fdb +jzb: pgv cnh +pgb: scx qxx +rdx: bmt dgr +xsv: xqr srg pct +pbh: vdx scj sfk rdc +dct: kns pmh jck +klf: gfx +glp: dsg qxj xcq +nld: rxd +shc: qmk +zpq: tqg +qhm: smc xqp cxd rsq sfq +ctk: rzb cqs jfv +lhz: lmv ptv +dcs: gzh qgg gpg fpf lxg bkh +ptv: ptb +gzg: mdr +sbg: ccv jgv +tvd: dvz +qdh: thc chs +fgb: dmk rvr qfh tzs +vrx: ptc +fxn: ptl fxl +ksj: pdv gtf +lcq: jgv sxm zgv +njz: mhl gcf jtv +crc: nbh mqg +nff: tzx +kxg: ndq dkj llk +hbn: qgh nhf +gxt: mdn +qbb: fqz zcj fvz dmn +bsp: lzm rnf cfm +pkd: hhj xzj bjh +qmb: kdl shc cvv fgn +kmq: nmt hft bqm qcz +xkf: nxq fjc qpm ckt +zcq: jlq mcl +hzj: zjm qpc crc nzl +lnv: vkn +kpd: htj xnb +zcz: fsd bqm nbg tln +lmh: pkl +ntv: kjc hbx jgl +szt: kcv bcx znd rdg +zrt: tsd hlr nlk nnp nph +cnq: tkt +bgm: kpp mdv fsp +bfm: rms +mhc: bzx +zxg: qpm xvm zvg nlm +bpg: xgh mdr +cqr: jsv bqm +hfp: jfq sxm +gfc: sxp +vss: mld tlv nzd mlf nlm fml +lzv: xlh vct ltb +kch: fxn rjz dkd lvp pxv +cmr: jnj dqp hcx srg +ktc: ths rsq kjb zpt +hhk: dbp dsg tzg njb +trg: vbc jtr xzj +hcs: zth cnd +nnz: hck dmp bpf djx +scc: lck +lvc: zzc blk psv mhx +xbz: qtv lzv +bqq: tqg qkz kdc +ngd: hqx +grd: fkc vhk hgq +jcs: zrs qft vxj +sbd: hpg +qjb: crq kfl +szh: hkd +frn: zkd hsp dbc +gvn: zzh sxp +mjs: fdq lnv +xxz: cgq mgg jpg shc rfq +mkm: ggx +jqr: sjm fsn hms zqz vrg +jpg: mlf +ksq: ktr ssl blk lpm gls +xrb: nzl tcp mzr +xtp: mrc hhk +qft: xjm frx +cfk: dzt bbf +lbn: vkb gbb +htq: ggg bpg kzg nzg +vhq: sxc +bsz: rcn pdl glm grd +qjq: kxq nvk tmm jfj +ftd: kkv gcd mdr mjz +rbg: pql hvb zkp jgl +phj: fxd gmf qdh ldn +rjh: fft sxt kdr nbg +drk: cnh +xhp: bsp qct zhj +xlf: lhz nmg +dbf: gpm vtc nzf hqf +snh: drl cjm fxm xmc +lsp: qnn +ppn: zlj xcf +xcd: dmn xbc vhq sqs czm +lbm: gkt pkl +qbt: sbd jtj vzc +cst: hxs fgh jxr lbn +llz: lbj psd zfm xqg fbq +nvh: dns tfv txx +zjn: rdx ldh bkj qkz nvc +pnj: nlf vdv lch +zvq: rgm msm tlj sps +pfk: tcm rsm pls +fnv: fxl xlx tfv +qdb: rnb vbx flx qjv +nln: jvr dng txb ksv +vvh: vzg hzm zrx ptr +rmd: lvf chv jvn +pbg: dfn gfc gdv +vbb: vlf ptc qnr bmg fpg +hbs: gsf lxr qjp +tsm: qbc +txb: jbb dtl hhg qbq +mvd: rqv mjp vvh bqx +xzz: zkp trd +jxb: pns ksq hhj jqm sck snl +tlj: nlf zpv +mhm: vfg tzg qpc gxd +xbr: txx mrq tqp ksq +zpt: fbm pjg mkj nmt fsd +ksz: nbh jvj drk vrd +zhj: mdn mjn pnr +hjp: bhs dqn rxh qbv drx +qdm: kqq nhh vzt +ssk: xzz xms lvf lsz +fxc: cnh +cpq: mjs kcx +lgz: gcq pbp +xkk: mmh +kdc: zbk lll +dkg: dtc xvv +fqz: srd lgz grx jjm +rjt: vkf +mtj: mmp pmh btd +xmr: qqf bxp czr +lvf: fxn +rzt: vzc +tfc: qhx lqk +hpm: lgk rtb vvr +zmv: rkz +gdl: jrr gcq gcc +bmg: nqm rbv +klg: dmm +shs: chs xjr qsd rsm +jsz: ckf czk tqt htl +jvd: qsf zhz +vll: rjp gvn jfq cjv +vhp: gkg dks +znr: ptl mzv mbz +tdj: lhr fcj xvm xqv +bzh: ksb +fbg: dmr ccc +qfb: gnv zbc xqr +xbb: kzs +ckn: ggg mcl sjs qbt gdl +sck: hjx +tsc: sfq +qpc: lvp +lfd: sgb xnx xms jpg bcp +lgt: bbt vbs txf +mrc: sxm lsp +dsg: nxl jlg mlk fsn +dkd: lsx ptb +qpl: fck +jrr: dsb +pzt: lbm tkt jjd qbc +bnj: hbz bng +sxg: sqb sfq +fpg: lxr +tzz: qkl qdr +xrq: scc kdk mhl fvg +bth: fdq dpr +fsn: trf kkc +fxx: xpv lxg smt +mkr: lqk tnt +rpt: kxh gqf kbt +mpj: lbj +qtt: zth mdr +zvz: bff dqq cnq csq +qkx: pnb hgn fcm +htd: zgn +ldf: lll bpv bsr knr vlf +pzg: kkb ggb rnf +vld: psx frl +nzn: tdd thx +fhm: kns xxq fsj txv +pxg: svt vms dmm lmh +qlb: pch zsh fkl qnd +nlm: nzd +hgq: hbs +nbg: bzx +sjm: dkg nvk xnx +fcm: knr htc hqf +qlz: kmn nqt zlb sgl +nrm: jlq ptx fkt +hdj: mft xlh rsl +vzv: gqz mnc zhz pzg +vlg: zpq jqs +vfq: jdq +vkd: krt qkb hbs bpv +jzr: qpc dvz +vgn: txm jlx hvb mcl +zqb: cpv ptx tzg +sgb: qbl txf ndn +qfj: rst qsh bfm fss nfs +lzp: rtr gdt fgh vhs +mjz: lfx htl fpf +klq: tbf fqq ndn xgq +nzb: ndq hhx gcc svd zpj +xzj: tfb +pch: nxz qvx fzf +xdv: kjp rnb qxx +zlq: nrg zbk nnb +rvr: sxx hss ccl +cpk: dkg djx fxx +cmp: skn nth +bmn: hkd tvs xcf pdl +gzm: cdc +qbq: jsl +mdg: zvt rdk mbh +psd: drn +hhh: vnk jjm fhx ptv xcp jzb dtm ztz tgh +gxl: sqf kzn +pbc: fgk qsf sjs vvz +fdx: jcs dpr xcf +dzl: nbc dfb dtd ljs xrb +cxq: glk brh +lft: mbg +bnn: rdt vld qzx jqq +dfl: hsp frl +nxz: czr +ggd: jfq fgq +krt: zbc +scj: rgm lnn +knm: pdv +ksv: vnv xvf tvq +vhs: bns fxl sbd +fvg: dzv +cjm: khg ctv +gdd: sfs txm jnv +gff: xgx lst hhg xlx hfp +gvt: vsd hcx zgx +xdc: cnd tcp ccv +lgs: zgn gkg +snn: lhl qxs mfh nbc +ckb: mzr pdq mpj +zmr: fkt xrv mrr +hhj: ngd +hxz: tfv +mmr: mtj pzv tgh vrg +qpm: rhd hbc vqm gvk +ckt: njb dfl +mhx: gvk mld ctg fzr +hjm: fbg ndm mfd jsv +sdf: gxf lsp tfv +rkn: jzk zcl brh +lbl: pkl +lhv: qbc fjx jcr vkf +tsp: xlf vhq spt pdq nbh +zls: jfv +qvv: qbv bdv plm mfg +zpv: csq qxx +qsd: nph hld bdf +fgt: xzk qpl xzj zgx +qxf: zvm fpk fdl +jtj: nsz +kpj: ncr njk cfk +smp: bfg scm dms ctk gxl sbg +fdg: kmj xbz rzb +tmb: kzz nld ksj zjl +pks: fzv sxq ngf dpp +lgn: shc kkc +vpt: txm rtr +dqp: lck bzx +qbh: lfc gzh pcb +kjr: bpf chp jlg xnh +xbc: hdj vcr xdc +kng: brz tfb +pbp: qhx +xjm: str +ckp: pdv bqq cng xrm +sgl: nnb +vql: jvd psx xcq qnx +fnn: kbt +cvc: bcx xvv ctn rjp zpk +mbh: skp dlr +ccb: pzv dsb shg +vgf: gsc ddb zkp hpm ptl +jpp: rcz lnz chp +hgd: czf zzc rkp +lks: grx dtl xnj +klv: vnv kdj qrx nxq flz +gkv: htc kqd xgf +jnv: xkq bht mgc +kcv: vqm +txs: vvr rnj pxv jvd +hkd: gkt +btk: vct zqz spt +rvn: xhm kvn tcp rll +qcp: fkl +qnx: nsz +vck: ndj nnb nzf knr +dtc: zfm drk vpt +bnb: sfq bxz gvv +rsp: nhh htg lmh kpj fdh jnc lqb +sfx: gdd ktr +ctp: zqz pgl sbn +cvv: vnm gsc znp +mjp: vlf +jrp: jgv grh qps tfc +tvs: kpp +fcs: dzb kfl gtf xtf +gqz: mqg +zgv: lsp jpf +ktm: sbz mkj dpb mnf xjm +lkl: vzg sxh vhk +lbv: bcx tdl skp +zrb: dpr jhm +jxf: gtf +blv: dgr +hcx: kzz +zsd: bdv dbh fss +hmv: xbt gpm +cxz: jhh +dfv: cfk xxv +gdq: nxp ptc +vtd: kfz zcf kbt +dmp: gmt +flp: hvb kml thn +dqq: vkq fnx dqn +ltt: mcd dgr +bpd: dfl hpr ggb xnh +rcc: jpp sfs lxg xkh +hpf: mpj jrr gcd mgc hbb +fnx: kpp +rlf: pbf zzc zls +tlt: qxx qkz tzs +sqs: xjk +vmf: rnk frh rtr +pxv: jlg +znp: vqm +crh: bpg rxt nrs smt +xch: qjb qqf prc +mtl: bnj rcq xch +kcz: sxx jnc brl kns +kvd: qqf vxd rzr +xjr: kjt +ths: dvg hrn hmj +rfh: fdx nqt qnr fbg +tmm: vqm jfk sxc pgl +knp: rgm gpm +txx: lst +pqh: gzg xbl sqf +vzc: lfx +kkv: jtc plb +gpf: sxg sfq rcn +ftz: bzl jtr +kdk: bqm njr +hrj: jdq +ngf: bjf +rmk: fnn zcf +tdc: qzx czk grh hqc lcq lbn mxc +vbx: jhg zrs vsz ggh +gvk: glk sss lqk rgj tlv +vmz: gdv dmn xkk +cjv: ctg vtd vld zqb +zps: sgv rcq +zdh: kjt kdk lvv +rlx: lfc nbj rzm +bqr: gqf qxj jlq grf +qcs: zqg btk grf mmp +tgd: lqm gsf kjb +hss: rzr gtf mdz +qlp: zvg +zgf: zrb sfk sfl dvm bgm +bsr: kng sdj +hmj: qns +dsm: cxz gcq +rcr: ldn xjr zkt skf +ldr: fmn lkm mdx +tkt: nph +vsb: mnf ftr dhc ggx +dzs: bbf jjz nmf bjf +mzz: nqm nnp +dtd: jck gls +mdx: hqx rqp +ssl: sjd lfc nmz +lgb: pcf vtc mhc hld +fxm: nld fck xxv +qkt: xmp smt ndn hrj +ltb: vpt klf +rdp: tzj sxh ncs dbz +xgf: knr +rdk: nlq +vzp: fnx gpf nbg jpr +pqp: zkp mzr +xzf: hpr lsz rtz cpk kjc nnl psd rdg +brx: pjg +kqs: qgh trd +xnb: jcn qcp +skp: dms +nrs: trf xvv +smc: jsv +rvx: plm vhd gnv +djr: msz dms qxt +rbm: lhz grx chp +lsz: dmp ltc +cjh: hpg bqv rdg +qmf: zgn pnr lvp +xgj: zjz nlf szh hfm hkd +cbg: fkl kqh +xtf: krm ncr +jkt: jfv +mhl: qvx bmg vkn +rll: fdb +qpv: kbt xkk +tjq: nlm vgh dmg +ndq: pgv +hxc: clp tzx jvb +hhs: ztz klq jpf +dhc: lqb kqd crq +jbr: ksz qmf mtj +zgx: rxx jjz sqb +vzq: rhc sdj +svb: gzm +fgk: gcd lnz +stq: flp cqb fnv hhg +vdh: xjk rcb klf +vnc: rgj vsc gmt +ckh: nth nsz jxk sss jzb +vtl: kfm vms nrg +dxp: mdg xgh mfh spt +pjc: vmf gkx hcs xjk +lpm: dlm ptx mrr jpg +vgh: cbh jfv ndq +hhz: btc vlf xzj lbl +svt: mpb +mmh: gls +jkm: vpq nbh +dvj: fjc svn qbh jlx +rpn: jsv rcq grb +ltc: mdg zpp gxh +hrq: flx xcg zkt ldn +qqf: clp bzl +rxd: fdq +fgh: sjd rkz zth +tgp: kqd +vmq: gbh vsz dvt lnv +pmc: cfv gkv chs fmn +hft: dhg zcx dvt +ksh: bqm smk vqh bmx +blr: scc cfv qdr +rcq: tch +lnn: qns fss +zvl: xmp dbp hfp +lpr: dms gmt klf diff --git a/day25/src/main.rs b/day25/src/main.rs new file mode 100644 index 0000000..2afc174 --- /dev/null +++ b/day25/src/main.rs @@ -0,0 +1,151 @@ +use std::cell::RefCell; +use std::collections::{BTreeSet, HashMap}; +use std::fs::read_to_string; +use std::mem; +use std::time::Instant; + +// Returns the weight of minimum cut +// and a vector containing node indices of one of the resulting graphs after the cut +fn stoer_wagner_cut(graph: &Vec>) -> (u16, Vec) { + if graph.len() < 2 { + return (0, vec![]); + } + // the original graph with added edge weight values + let mut modified_graph: Vec> = graph.iter() + .map(|neighbours| neighbours.iter() + .map(|&elem| (elem, 1u16)) + .collect::>() + ).collect::>(); + // The node indices that haven't been removed through merging yet + let mut remaining_nodes: Vec = (0..modified_graph.len() as u16).collect(); + // Min cut weight so far and node that was cut off during it + let mut best_cut_weight: u16 = u16::MAX; + let mut best_cut_node: u16 = 0; + // priority queue for finding the most tightly connected node, the highest value is next + // the keys are graph_size * weight + index, so there's no collision for the same weights + // a fibonacci heap could be better but not strictly needed and I'd rather minimize imports + let graph_size = modified_graph.len() as u32; + let mut search_candidates_queue: BTreeSet = BTreeSet::new(); + // keeping track of priority queue indices so it can be removed and re added + let mut search_candidates_keys: Vec = vec![u32::MAX; remaining_nodes.len()]; + // keeping track of what nodes were merged with what + let mut merge_tree: Vec> = vec![vec![]; modified_graph.len()]; + while remaining_nodes.len() > 1 { + // the nodes that are cut second to last and last, weight of their cut + let mut s = remaining_nodes[0]; + let mut t = s; + let mut cut_of_the_phase = 0; + // min cut phase - preparing the queue + for &idx in &remaining_nodes[1..remaining_nodes.len()] { + let weight = match modified_graph[remaining_nodes[0] as usize].iter().find( + |&(edge_to, _)| *edge_to == idx) { + None => 0, + Some(&(_, edge_weight)) => edge_weight + }; + let key = graph_size * weight as u32 + idx as u32; + search_candidates_keys[idx as usize] = key; + search_candidates_queue.insert(key); + } + // min cut phase + while !search_candidates_queue.is_empty() { + let max_key = search_candidates_queue.pop_last().unwrap(); + let idx = (max_key % graph_size) as u16; + let max_weight = (max_key / graph_size) as u16; + search_candidates_keys[idx as usize] = u32::MAX; + s = t; + t = idx; + cut_of_the_phase = max_weight; + for &(that_idx, that_weight) in modified_graph[idx as usize].iter() { + let mut new_key = search_candidates_keys[that_idx as usize]; + if new_key != u32::MAX { + search_candidates_queue.remove(&new_key); + new_key += graph_size * that_weight as u32; + search_candidates_queue.insert(new_key); + search_candidates_keys[that_idx as usize] = new_key; + } + } + } + // store information that t was merged into s + merge_tree[s as usize].push(t); + // remove the last node + let mut t_node = vec![]; + mem::swap(&mut t_node, &mut modified_graph[t as usize]); + remaining_nodes.retain(|&idx| idx != t); + // merge s and t into s, update other nodes connecting to s or t + for &(edge_to, edge_weight) in t_node.iter() { + if edge_to == s { + modified_graph[edge_to as usize].retain(|(to, _)| *to != t); + continue; + } + match modified_graph[s as usize].iter().position(|&(edge_to2, _)| edge_to2 == edge_to) { + None => { + modified_graph[s as usize].push((edge_to, edge_weight)); + modified_graph[edge_to as usize].iter_mut().find(|(to, _)| *to == t).unwrap().0 = s; + } + Some(pos) => { + modified_graph[s as usize][pos].1 += edge_weight; + modified_graph[edge_to as usize].retain(|(to, _)| *to != t); + modified_graph[edge_to as usize].iter_mut().find(|(to, _)| *to == s).unwrap().1 += edge_weight; + } + } + } + // if this cut was the best so far, remember it + if cut_of_the_phase < best_cut_weight { + best_cut_weight = cut_of_the_phase; + best_cut_node = t; + } + } + // gather all nodes that were merged into the best cut node and return them + fn add_branch(merge_tree: &Vec>, result_nodes: &mut Vec, idx: u16) { + result_nodes.push(idx); + for &v in &merge_tree[idx as usize] { + add_branch(merge_tree, result_nodes, v); + } + } + let mut result_nodes = vec![]; + add_branch(&merge_tree, &mut result_nodes, best_cut_node); + (best_cut_weight, result_nodes) +} + +// returns a graph in form of edge list for each node and a map of node names to indices +fn parse_graph(input_str: &str) -> (Vec>, HashMap) { + let mut node_index: HashMap = HashMap::new(); + let graph: RefCell>> = RefCell::new(vec![]); + let mut get_node_index = |name: &str| -> u16 { + match node_index.entry(name.parse().unwrap()) { + std::collections::hash_map::Entry::Occupied(occupied_entry) => { + return *occupied_entry.get(); + } + std::collections::hash_map::Entry::Vacant(vacant_entry) => { + let new_index = graph.borrow().len() as u16; + graph.borrow_mut().push(vec![]); + vacant_entry.insert(new_index); + return new_index; + } + } + }; + for line in input_str.lines() { + let mut iter = line.split([' ', ':']).filter(|&s| !s.is_empty()); + let first = get_node_index(iter.next().unwrap()); + for other_name in iter { + let other = get_node_index(other_name); + graph.borrow_mut()[first as usize].push(other); + graph.borrow_mut()[other as usize].push(first); + } + } + (graph.into_inner(), node_index) +} + +fn main() { + let time_start = Instant::now(); + let input_str = read_to_string("input.txt").unwrap(); + let time_start_no_io = Instant::now(); + let (graph, _node_mapping) = parse_graph(&input_str); + let (_cut_weight, cut_nodes) = stoer_wagner_cut(&graph); + let multiplied_split = cut_nodes.len() * (graph.len() - cut_nodes.len()); + let elapsed = time_start.elapsed().as_micros(); + let elapsed_no_io = time_start_no_io.elapsed().as_micros(); + println!("Time: {}us", elapsed); + println!("Time without file i/o: {}us", elapsed_no_io); + println!("Cut into {}, {}, multiplied: {}", cut_nodes.len(), graph.len() - cut_nodes.len(), multiplied_split); +}