diff --git a/day25/after-removing-cycles.mmd b/day25/after-removing-cycles.mmd new file mode 100644 index 0000000..e0c7bb2 --- /dev/null +++ b/day25/after-removing-cycles.mmd @@ -0,0 +1,1440 @@ +flowchart TD + cft --- cjb + lbn --- mbz + rjt --- xbp + hfk --- ppt + pfz --- qmk + dzg --- qnq + jpm --- kfq + tsf --- xbj + kmr --- vxg + jln --- kkc + fbn --- nvh + llr --- xbh + dbp --- lcj + cdl --- kmr + cbb --- pfz + tnq --- vnh + fjv --- jhr + dbm --- xqg + cbf --- pkh + gkx --- zbb + ddx --- nsm + cts --- hjj + dkh --- frc + bhk --- xsh + hnh --- rql + hsl --- xmt + fnp --- khr + fhr --- qqp + lhx --- qhj + pjs --- xnd + drf --- kjr + cfc --- vkh + stb --- tbv + hmm --- ltt + qtx --- xfh + dkv --- vqb + rjr --- vkg + mkd --- tpq + bxt --- xbp + hdd --- hvg + kkc --- qgq + bkh --- dpx + nxs --- ttc + hsk --- qtb + lkm --- ngz + jsn --- vph + flr --- qcg + tpg --- xfr + mrb --- vxh + knc --- tjj + qmk --- sdh + jxj --- vql + lqg --- qxx + nsx --- sht + gnx --- hzj + ltv --- shp + cjn --- lzk + fsh --- vcq + bkv --- pmg + cfc --- lph + pqg --- zhs + rsm --- xdc + tqh --- vvf + rrn --- zxz + bgv --- dcp + kdk --- zbb + qmt --- sqb + ktd --- tmv + gcd --- srr + fzg --- xcm + kjs --- nvq + gcg --- ggl + nbj --- rqs + qdr --- tlj + cvl --- xvt + fbg --- mfv + sht --- zzh + frz --- gmg + xkl --- zgr + dvh --- tvr + qjm --- vfl + cpp --- qmv + fdq --- thj + jks --- mxb + fxf --- tsf + dtt --- sdd + cvl --- nzt + glm --- tbl + lcc --- pks + crr --- njd + lcb --- mhl + cjx --- mcb + xlk --- xvv + rqs --- vgk + fbj --- thh + lpc --- srh + cxm --- lxp + jrx --- vfc + rbp --- smh + fxb --- mdc + bkm --- phd + qlx --- sfd + qjk --- sxk + ddc --- sgh + hjg --- kvr + bhm --- vxx + jgh --- nmj + crl --- fqh + cxm --- mpf + cpv --- zlj + tlm --- xcs + cmm --- kkf + cvc --- dxc + kgc --- vmc + rfb --- xvt + khb --- zbj + ggm --- tqx + rkb --- sjb + hbm --- lnp + cpp --- lds + bgv --- kfr + mcq --- rpm + ddx --- qgn + mbt --- npz + mvk --- sqf + bqd --- jdl + mpp --- zrb + bqb --- xth + jkn --- ptq + hlq --- mfb + hmh --- rcz + bxv --- rzm + bgz --- mrl + cjk --- ftq + kmp --- rtp + spp --- thv + jgz --- qnz + ckf --- xbp + xtn --- zzc + khb --- zjn + gkz --- mqc + qfl --- qgh + lcz --- mfn + gjs --- qvk + tpf --- xrq + hpm --- kdt + ppt --- vjg + lqf --- scn + mcq --- xxb + jlc --- kvl + lst --- tml + jkc --- ndp + mjt --- vvc + jnc --- zhb + qbb --- svr + hfk --- xxs + jvc --- klk + bdn --- fml + cpr --- qtc + dgp --- qkx + kzl --- xrc + hcb --- kfv + shr --- tnz + gsm --- zfr + dvk --- kzg + fgk --- xmh + gxp --- zqs + dvh --- kmq + hnh --- nxm + qgf --- rvn + txm --- zpc + fqh --- vxd + mnd --- nhg + crq --- pqg + rrr --- xgj + gjx --- pbg + ksx --- vxh + kfn --- sdr + cqg --- qzv + dgs --- fhs + cff --- ljk + gfg --- xdp + sxt --- vdt + mdm --- zsn + pbz --- rtp + dpj --- drf + bcr --- brd + hbl --- qfl + dhg --- hfc + cxq --- tvk + dgp --- vxl + npq --- rhs + pgc --- pnz + btb --- zvh + cdb --- lzv + hrs --- lgq + hqv --- jsg + hfp --- kdt + brz --- jck + fhs --- qtm + svr --- zcc + lcc --- pgk + bgb --- mrg + jkg --- kvk + cps --- dlk + mtx --- nxm + gfg --- kbq + kmc --- pls + qqp --- sch + kjt --- pls + ldc --- vgx + rzv --- vps + mxj --- xdq + kzg --- qjd + hhb --- qbs + fjp --- fvh + gjn --- vxx + gbr --- vnk + klz --- njh + bfq --- zzh + ccc --- jrr + fzx --- pcd + cbb --- pmb + gmj --- zpv + kjg --- qdk + jhg --- mcb + hvg --- jjh + djn --- mcn + cgm --- prf + jcz --- nmv + mjl --- vsp + grx --- rbp + dgs --- zsl + jrr --- kfh + knq --- zln + jbg --- xdp + sjv --- zsl + lph --- rgr + bhq --- zzv + bvd --- fpd + grd --- zgc + qgd --- tdg + gzs --- xbh + bcj --- mjq + fxf --- lgq + bkm --- mkc + ghv --- rrr + hfp --- vsm + lcb --- php + cdt --- mdm + hzk --- qmz + hvq --- tnz + hjv --- xlk + qlb --- xtn + snv --- vhd + cvs --- jch + dmd --- qff + fgh --- gjv + jfs --- ncm + nmg --- rck + bfn --- dcs + ppt --- pvb + krj --- tdf + xxt --- zdd + msc --- plz + ksr --- scm + fgv --- xdt + mrt --- rql + qzn --- vqv + hcn --- nlc + cmk --- vtb + csz --- dgz + jfd --- zgr + bkh --- gjn + cml --- fpn + fgv --- xht + dqg --- skh + bbm --- cbd + cqq --- ngm + knq --- ntm + hrn --- kmf + dbr --- xmc + brg --- jxs + dxs --- srk + jrk --- mpp + tlg --- zmp + fqh --- jcq + ggl --- txd + dfr --- zfm + pcp --- skz + xnh --- znj + kqx --- nhn + mhr --- vhm + dnq --- pvb + bdn --- vnj + fmm --- xng + bhq --- rmc + dkh --- ngz + clq --- trt + bsd --- lxc + bjj --- pqx + phq --- zfc + bfv --- ntn + xlz --- zlj + nbm --- zzg + tcq --- xxb + fjp --- vqv + mkc --- nrs + snv --- zdn + bjr --- bld + mkc --- xbb + cgj --- dnr + ksx --- vds + ctl --- xjz + mdc --- mng + cpr --- llc + fmg --- nvb + bpk --- hsf + dhz --- kvk + cjn --- ltt + npl --- xfj + cvs --- vqd + gfg --- gkk + fhg --- vck + lxs --- zgx + lbz --- xhk + llc --- mzn + kdz --- thj + jks --- zgh + mgj --- tvv + sxm --- tmj + ckf --- rqc + bfq --- vhn + qjf --- vxl + bdl --- spx + htk --- psp + jjz --- psp + cmq --- vvf + dlh --- ztv + khf --- pfp + dkn --- ftr + lbq --- pmk + qxr --- ssg + dbd --- xht + bnf --- sdd + brc --- lqf + ncm --- pgk + hdv --- tjn + nrn --- qtl + tpv --- xdp + kcx --- vrk + rpj --- tnq + hvx --- qcg + ktd --- vpf + psb --- qmp + pnd --- xkr + rnt --- vmp + fps --- jxz + qlc --- zcn + cnd --- tdc + dqm --- jqr + jxq --- zkg + fmn --- hcb + qsd --- zmj + slg --- zmh + rvd --- zxh + ltk --- trj + qhd --- qvk + cjb --- hlq + gbh --- lxb + mvt --- vck + dcr --- mcq + cgt --- qgx + hrs --- tfm + kgj --- xjz + cgj --- fnr + pht --- pmm + gjn --- vgr + cfq --- sxg + mbx --- sfz + hpd --- pht + dpk --- fpv + tbv --- zzv + cbv --- qmg + gzk --- tft + cdz --- mjz + hdv --- lkk + fbn --- nnv + kfg --- vsp + lck --- lpv + bzn --- tzn + ggj --- lvd + tml --- xtq + dkv --- knc + pqk --- zbj + dbv --- qxc + dnr --- srr + mvq --- zpz + htq --- nlc + gjg --- jjd + mlq --- xnj + hhf --- prf + pcp --- vdc + knb --- qtx + gxp --- hxn + djj --- xff + tvr --- vps + qgx --- zjp + lqv --- xqg + chv --- lgj + jtp --- pgc + gbm --- mtr + lth --- smh + ktd --- rgk + cxs --- dpp + lbx --- xtd + hmz --- hsf + gcg --- lst + dbr --- rrn + dkv --- qzp + cgg --- hzj + pnc --- trt + shq --- tzt + frt --- xhh + hnf --- nhj + bpl --- qct + lgg --- zsn + kcp --- knt + kpn --- tbm + lqz --- rtm + frc --- mdg + hkz --- zfr + hfm --- tqs + hbl --- zzh + jlq --- tcx + hjn --- nrt + nch --- xfh + mhs --- pgp + gjs --- vgg + lth --- psl + jml --- xfj + rll --- zxm + lsp --- rmt + fpn --- gjf + ljd --- zqn + xtm --- zrr + ckq --- ztm + bpl --- qjr + csz --- zbg + cjs --- xmt + jck --- qts + lzm --- vhn + dqt --- xff + xgj --- xps + rsm --- tdc + pbg --- sbd + cpm --- lgq + gqg --- plt + bqg --- qrg + bjv --- xsf + hch --- vfc + gxg --- rmt + bvb --- qzn + pcp --- vcx + dsh --- gdk + kjr --- mql + qlj --- vtb + lml --- nlp + ngr --- zfv + shm --- trj + sqb --- tnk + frf --- grx + mfn --- sjj + jch --- xnd + htp --- sxm + mzv --- rgk + mtl --- xmm + nsx --- ptb + ljd --- qmp + jbs --- pnv + fns --- vnh + fps --- mqq + bzq --- jrf + ttn --- vcx + chr --- ckv + lds --- rdt + qsd --- tsr + ffl --- llp + frt --- nvt + bcj --- zpm + bzc --- mhn + cbf --- csh + fhg --- jsn + gzx --- qxp + nvh --- xcb + ndj --- vsr + fbv --- lrg + jbk --- nsm + tlj --- tsv + czc --- smj + dbp --- vck + hvh --- ncn + mln --- tmv + fnp --- lxx + lhx --- ljd + clv --- nvv + dmd --- fxm + bbz --- qjf + jqr --- tgr + hvh --- zdx + dvb --- lqg + vzb --- xdh + vnz --- vzm + fbn --- qmv + lxp --- mmq + xhk --- zqg + tzt --- xgr + fpq --- jkz + zfr --- zrh + lxs --- vxg + bqs --- jrl + sjg --- vrq + kcq --- tzq + fsx --- lpv + php --- qbv + rsj --- zhs + clb --- pfz + djr --- xkr + gqr --- qpx + mdd --- tpq + lmt --- qdk + ggj --- rlg + jnt --- qsm + mjr --- xxf + fcz --- lgj + qps --- rjt + fxb --- ltn + czm --- dbs + kpg --- rtd + djn --- ftt + tts --- xnn + bkh --- kst + dkg --- vtg + dhl --- sbf + fkd --- msj + scl --- xmc + ctz --- rjj + gxc --- tqh + dcr --- gkz + cbl --- zqs + qfv --- sth + gzm --- mkh + crc --- shp + fdd --- zpc + mjs --- zpz + bbb --- kgp + fgh --- vfl + hbm --- tqq + hbn --- qxh + xxt --- zhn + ctz --- gvv + dtt --- gzx + qhg --- slk + cfq --- vpd + lgg --- lzk + hhf --- zfm + gsm --- psl + bmd --- sxg + thh --- thk + hzj --- mrl + trs --- vtx + lhp --- tvq + fzz --- glq + brs --- dmv + lpf --- vlz + ddt --- fzg + hrs --- qbn + fbj --- qkl + jrk --- xsp + cbl --- vmj + ghm --- zvv + htm --- ptb + dbv --- trj + fjm --- hvj + gqz --- xxt + lzv --- rpd + gnb --- rtc + dgm --- lcm + mck --- pks + hqq --- qrp + tbh --- thk + pdc --- zgq + kfg --- tdg + kqx --- qnf + jbg --- xzp + bzc --- zrr + cxr --- slk + kqm --- tjn + hqq --- kvl + glz --- lxc + cts --- tjb + jlc --- xhz + kmr --- vkn + ntd --- nxs + fft --- kxm + dxs --- pkc + lbq --- qtx + btc --- mtl + lzt --- tsn + llv --- zzg + btf --- mht + bbd --- qkg + kbt --- qdr + fbv --- gbz + vfv --- zpx + bfv --- bhv + kcp --- xps + bvz --- xvc + qgx --- xxb + btq --- svr + ffl --- vqq + cmn --- nnt + cxl --- ldc + pjq --- rpd + tkd --- vcq + gsd --- kfn + gqk --- vmc + qkg --- xkl + qpp --- zbd + phd --- qck + gbz --- pbs + hzs --- mqq + jnt --- rrp + fxh --- shr + qck --- sjb + kxc --- vrk + cpm --- xqk + pjc --- zbb + cqz --- mrg + jpm --- lzd + gjz --- nxj + mkh --- pzs + dgm --- lcz + cld --- jxz + dsh --- xth + dbs --- gtg + qnh --- zql + ctl --- fbl + kjh --- rpf + dvs --- lqr + lrk --- stb + jxs --- qmt + jbn --- kjh + gbl --- kbt + pls --- smt + bbk --- vsm + gvz --- kkj + dnq --- gqb + cqc --- ctx + ddz --- nhj + jkz --- xlk + zbg --- zmf + nsz --- rzx + kvn --- qqp + rcm --- rls + cbj --- nqr + ddc --- qlb + dmx --- tfm + cpl --- mnr + dhc --- jlk + lmp --- lqv + mjl --- tbg + ccc --- clk + fxs --- sls + mtl --- rql + qzp --- vmd + mhn --- rsj + nxm --- vcg + bfg --- dlk + dlf --- rkb + cbj --- rkc + sfz --- tcq + gjf --- mhr + dbd --- qzn + pfm --- xdh + jgz --- nmj + kfv --- xgm + mhl --- qlb + bkq --- cpq + glz --- mxd + qbn --- rxh + czj --- khl + khf --- vgr + kdz --- lxb + crk --- vgx + bbb --- khr + ksf --- nhg + kdm --- mxd + mmv --- vvc + dsp --- qvc + fns --- vfz + khz --- qbb + jfp --- rcr + tng --- vcl + gvj --- lzb + dhc --- mbz + sxk --- tqg + fns --- srh + jbk --- xzl + kcq --- klk + ghh --- qhs + bqd --- fjm + chr --- fhf + tzf --- vsp + dpk --- zxm + vlz --- zqf + hqv --- zpn + jcq --- pft + cnc --- dfg + fkt --- kgc + bfb --- ghm + btc --- jxq + hcb --- nhj + gsc --- xcm + glq --- qgm + nlc --- xjh + cqz --- fxf + bbx --- fbg + cxt --- qvc + kmf --- vzz + skg --- zhc + bbd --- mdk + qck --- tsr + bmd --- lds + hsl --- tdx + hrn --- qsd + gvj --- vgk + tqk --- zmf + hmk --- rjr + gfx --- knz + mln --- tjf + hdh --- vqb + pph --- rnt + cvs --- vdc + cfk --- ssb + hkz --- tlm + cqg --- qxx + gmh --- hjv + rzv --- vjg + mbg --- pcd + frj --- sxp + gfx --- svv + tqq --- zcq + kfq --- vvq + dvk --- snp + lqz --- stl + jdk --- qdk + nld --- vmr + rrx --- zbk + bfn --- chv + bld --- ckq + qvr --- vqq + qnz --- tmv + fjv --- gxj + fhx --- zgb + bdr --- cmm + djc --- kzc + dbl --- mjr + jml --- zzg + dvf --- kfd + rjd --- zcv + sjl --- zrv + rkc --- scm + jcq --- rvn + hpc --- qmt + dpz --- xvv + cbr --- hmk + tnk --- tsn + gzs --- zxm + qbs --- vbk + jnr --- qmz + rkp --- vtg + ksf --- xmd + czv --- hmm + bvm --- vdc + htp --- qxh + fcg --- ttn + qtc --- rzd + srl --- zrv + gqk --- vmp + frt --- rlv + jxn --- sls + cgm --- kfn + bhm --- gmh + qgf --- skj + cjk --- jjz + bgg --- tzh + hnz --- rbl + cvc --- nnt + fxg --- rcm + mzn --- ngr + qtb --- vmg + bvc --- fqz + hkm --- qts + pnh --- rtc + dfr --- tqs + bqs --- hhq + hjn --- msc + tst --- zpv + scl --- zxf + bpz --- cdl + hch --- hhq + htm --- rnz + mtx --- pnf + nmg --- tmq + hcg --- kzg + hfp --- slg + gnx --- ttq + ngj --- qts + qxr --- vxd + dfl --- snf + pfv --- zbb + nvq --- rfb + bxq --- tvd + clk --- sch + kfv --- vbt + jlx --- lsr + pfs --- slg + njd --- qbs + gqz --- vrq + dmd --- xjh + tpv --- xvv + scn --- zzc + lmc --- nvz + nvb --- qqb + lln --- vkm + jln --- xth + gcd --- jsq + pfp --- tvd + mnd --- tqk + jsb --- qpj + khf --- mkk + nvz --- tqh + cfk --- pfv + mjz --- xbj + brg --- tsf + nrs --- vzm + ntk --- tpq + jsg --- mrg + mck --- zhs + flr --- txl + cxs --- vcl + fsv --- mnd + bsx --- lzv + nxz --- phs + dqt --- pnv + sbk --- tpf + nxh --- rlb + lhv --- lzx + cpl --- dtd + bpk --- jcz + gcs --- thv + ksr --- zgb + clv --- xbd + jlk --- trj + cpv --- ljk + clk --- kxr + hqv --- qrg + gsm --- qhs + lxx --- qpx + sbz --- zdd + pbs --- xnl + khl --- ndj + hvj --- vfv + xhz --- zpv + bbm --- jsb + lqf --- nms + hbg --- pgp + pnc --- qkm + lqz --- lrf + lhp --- qml + nrt --- tqx + pdh --- tkd + nch --- smt + dgg --- qkl + lxp --- mbk + fjp --- xsb + dxl --- rfh + dcj --- pnd + dhc --- jxc + bkv --- fbl + mpt --- tfx + hpm --- rxh + hrg --- kvn + mkd --- zhz + pjt --- tzf + ngm --- pdh + hfc --- pmg + dbx --- pjj + bzn --- qjd + dtz --- lbx + qmg --- srx + bkg --- phb + hxn --- phd + sfd --- zcs + vnj --- vxg + mhb --- rzm + djr --- fhr + dpp --- pht + cqc --- gzk + hkn --- kxl + gqr --- nlp + ckv --- nxh + bcp --- gsn + mgd --- mqc + lzt --- xnq + scl --- shs + rtm --- smj + fxs --- mjs + ljz --- lmp + hkz --- kqd + jcm --- qks + bhb --- rnt + hbn --- mmq + kvv --- rrx + bhm --- sqf + kjp --- tts + vpr --- zqn + rck --- sxp + gxz --- kmc + dvb --- phq + gqg --- zdn + jbb --- jjh + bfn --- ltn + qmr --- xzr + bpl --- hmh + gbm --- rkc + tqs --- zrv + mjl --- xcs + nmh --- nnp + dxk --- kjt + czc --- qcz + hxj --- xsf + kbt --- knq + kxc --- ptl + jjq --- xsb + szg --- vzm + rgh --- tbh + fkc --- qxp + bcp --- nnp + ttq --- xqg + gdt --- xvc + bqf --- vgg + fqz --- nmg + xxf --- zrb + dvn --- qlx + lvj --- lzm + dgd --- fsx + mdd --- srx + klz --- qmr + bvc --- snv + brz --- kdm + dpv --- snp + ckv --- kcl + txm --- vbk + nlc --- vvf + fdj --- qqd + csm --- zqd + txc --- zln + bfn --- ptq + ldv --- pjj + fgh --- rlr + bzx --- zvc + pqk --- qhg + bbd --- cgh + nkd --- vjg + pjs --- qnq + lsn --- phs + dlk --- mxj + rts --- srx + djc --- lhv + kmq --- xzl + hdh --- vmj + hmm --- mkv + dmv --- flr + mtv --- zhc + nsx --- qfm + jxd --- vdr + ctx --- xhh + fft --- hjx + krj --- xzl + cxp --- zfv + kzc --- nvx + kmf --- tqg + dlh --- kvt + bfb --- lmg + hdr --- sbf + bgg --- sxt + pjg --- tfx + jxn --- nhn + bsc --- npq + ftt --- qfm + jlx --- mbz + jhf --- qjr + mzq --- rlr + cns --- rzx + jjv --- qgm + lzx --- zfc + hkn --- pqk + rkk --- xfr + vdm --- xpv + fdd --- lvd + dkh --- hnc + sdh --- svf + lhm --- pzc + jdk --- lpv + bkg --- cpl + gcd --- zvl + pjg --- xtm + kvt --- vnh + vqd --- vtx + qsr --- vfk + nbj --- zvl + ksf --- rvd + chm --- pjr + dgs --- vpg + djq --- xnh + cjn --- tmj + lzb --- qkx + lbh --- vbt + dxc --- ndj + pvd --- xsp + pqx --- tvm + bbx --- lmg + hhb --- qfp + klz --- tvv + hkd --- mjq + ljz --- lnp + bgz --- vfk + qnq --- rth + mvn --- xpv + dlf --- qdm + ncn --- ttq + bxj --- tbh + kfb --- rjd + jrl --- rnr + gxj --- nnh + hdr --- qjk + fzl --- llv + lxc --- rhs + mdl --- zcs + gxg --- jsq + nrl --- shq + dkl --- jxj + kpn --- lzb + dmr --- xzl + kgp --- sjj + cvc --- zgh + prl --- zkv + lgf --- pfm + ckq --- llp + pdv --- rjd + qtl --- qvc + hbm --- tst + brs --- jnr + mcb --- sbz + kkq --- rll + lqr --- zgc + gzx --- tls + nrl --- xbp + ddt --- jbd + gfx --- mvn + jjh --- pmb + gzx --- lrg + fsv --- lmt + gbh --- gmg + cbb --- kzl + lgj --- tdz + bkq --- vdm + ccz --- xcb + frf --- pkc + qbb --- vmr + cch --- xtd + bqf --- dbd + nxj --- txl + rxv --- tbv + gtt --- xhk + bvg --- dpv + qct --- xnn + cnd --- tng + ctr --- jxj + fqg --- jrt + knt --- mcs + jcm --- lqj + mln --- zpx + qmd --- zgh + gjk --- rgk + gch --- rvd + cbl --- rsm + gjg --- jqj + gnn --- zrb + pvd --- rxz + fkt --- vgt + gjh --- spp + rmc --- txz + fcn --- jhs + sls --- txc + nqr --- tzh + hfm --- ntn + bcp --- mgx + ffp --- kjs + bhp --- nnh + hlk --- vpl + ffp --- skj + bhv --- htk + bxq --- hjx + fml --- tmq + dcp --- ngp + dbx --- rcm + nmv --- zpz + btf --- fnk + bgb --- ckj + kht --- mdc + mcn --- mht + stl --- xcm + fft --- jhf + dkl --- kjq + bcr --- hkd + prl --- tzq + bjj --- pkd + gnb --- nvv + jmj --- xfr + jjq --- ssn + bvg --- ldq + gtt --- ncc + qlh --- zqg + gxj --- lfq + gbm --- vcx + kps --- npl + jkg --- qqh + dfl --- vkh + gsz --- mqq + qtt --- vrn + kjf --- qfv + shm --- zmp + jdl --- nzt + pmb --- vkg + jbp --- lzd + bvz --- sgk + mlq --- xbd + zfx --- zzv + lqj --- mkh + bqm --- sjl + dfn --- kps + jnc --- svs + hfj --- jjq + gkz --- lrj + mnr --- rpf + ntd --- xmd + dpk --- gqg + lkm --- zqf + ccz --- nld + bzq --- hjq + ggt --- mkd + gnn --- klr + qdr --- skm + vpl --- vql + rqp --- txl + lgf --- lrf + qkm --- snf + dcj --- zqd + srr --- zcn + jfp --- tnq + dlp --- qpp + dvf --- svf + srh --- tjx + dmv --- zhz + kbs --- nzj + gcn --- jrk + kfh --- ztm + bvd --- ldq + kbp --- lgt + jmz --- zxz + cch --- tdx + cxt --- qqb + cmq --- vzv + dxk --- skh + hkm --- mjt + rlv --- xsh + lcm --- mcs + fzx --- kjs + kfk --- xmt + fpn --- ltv + mmv --- tpf + cts --- mzq + rkp --- zjp + dqs --- qhj + ntk --- scn + jsn --- nqn + hfc --- mkk + chr --- vzz + cmk --- hjq + gjv --- nbm + gnn --- kfn + hxv --- pfs + fzl --- zhn + jkc --- klr + tvq --- zgc + dtm --- xkk + hnf --- hvq + bsx --- vdm + chr --- dfg + fgk --- kfq + hvk --- mdk + gqz --- lvn + bbm --- zgx + xff --- zcq + csz --- qtt + fdx --- skh + bsx --- vlj + kfr --- vdr + gjz --- mph + hvx --- rfl + mtv --- rkk + fkc --- zfg + glm --- nsz + gjx --- pcd + dhz --- nvt + kkq --- qml + hlc --- psb + bfg --- qkg + cxc --- hjg + jfd --- zql + jbb --- svs + dtd --- xnj + tjb --- zmf + hxv --- mtn + kht --- mvt + ckj --- dnh + ngr --- pjc + bnt --- mkb + spx --- tcq + cxq --- czc + mkv --- xsf + ljx --- rpj + kzc --- zxz + kzv --- sth + csm --- rlg + lhm --- tlg + fvh --- nmh + gbl --- pbq + hzr --- mhb + fzz --- kzv + dpv --- kbp + crq --- qpg + hkn --- htc + sjl --- tpd + dfn --- nqn + vtx --- ztv + jrf --- znj + nvt --- ppk + pzs --- qlh + mtv --- zxf + cff --- rsj + cdt --- gvz + kdp --- lvn + gkx --- rts + gdk --- mcs + sdv --- vtb + jtp --- nxz + kvv --- qtt + dmr --- kmp + hsx --- mxj + mck --- tmp + dxl --- pjt + njp --- tvq + bhp --- pbq + cld --- khb + fpn --- zsl + gvv --- shr + hcn --- jfs + lqq --- qsm + ngp --- rrp + nxz --- zbk + ksr --- qff + rzd --- vrv + cns --- mpt + mqc --- ngz + fkt --- pnh + cqq --- mbg + lrk --- xxt + gtt --- xpz + lqj --- zkg + nnl --- qlm + vkq --- zdx + dtz --- msj + pdc --- rkp + mvq --- zgh + bbz --- brq + vdm --- vhm + bzz --- kxr + ldv --- stt + qqh --- sbf + jvr --- xmm + bqb --- mbx + pcv --- rtd + fbj --- vtk + cxm --- dtt + gdt --- jhs + dfl --- kbn + bzq --- nzj + dzg --- vxf + gtg --- vrq + kpg --- tdf + kvf --- rdt + rgr --- tvk + krq --- kzq + ftr --- pcv + bxv --- xhx + dgx --- rbl + brd --- clb + dkg --- jlk + gch --- qnk + gmg --- lgg + qpj --- tvm + kjf --- sjb + lsr --- ptl + bzx --- ngj + lsp --- ssg + gcg --- xng + qmm --- sth + kzl --- tft + trn --- ttn + bbz --- jxd + qkl --- vhd + hpc --- vxm + fkd --- rxz + ctl --- dgx + rnr --- vmg + qvr --- xzr + fzx --- vsr + jbn --- xsf + jvr --- ksx + hrn --- xrj + cpp --- qkm + htm --- kms + mtl --- tsq + ftt --- nnl + jtp --- xhx + jrt --- rxv + kvr --- lmc + chm --- vmc + jkb --- jnr + fjk --- hbm + bgx --- ksm + jks --- rtz + hsk --- htc + bhk --- vxf + bdr --- nld + ksx --- mgx + jlq --- rmc + ldm --- zxz + gdt --- sdv + kff --- sjg + kzq --- zln + lzt --- tqx + bcj --- kbq + jvc --- zlk + fdj --- lbh + nmd --- qgn + qrf --- qzv + njp --- ppt + btf --- cgh + nxs --- tgr + fpd --- szg + qcg --- qqd + rpm --- tpg + knb --- nrn + ggm --- hhs + hgx --- mdm + cgj --- pmk + lbz --- rgb + hhb --- jhh + qrc --- zpn + lgx --- zvh + qnh --- txd + bjr --- npz + cft --- jkf + vkh --- vkm + cpl --- qpp + bgx --- mbk + qsr --- qzv + pkh --- qbb + csh --- jhh + bbx --- vgr + jjz --- jrx + lvd --- xkk + hlk --- zbj + cdh --- cgt + pfs --- rhs + frj --- qhj + shh --- xrj + jbp --- lgt + kdk --- vnk + jqj --- nrs + jml --- lkk + dxs --- hzr + skh --- tzf + mrt --- nvz + kvn --- mpf + dqf --- vkn + fps --- pht + cxl --- fcz + fxg --- hjq + kjg --- vvc + kqd --- mkb + kxm --- spp + mfb --- xpz + cxp --- sht + fkt --- kjp + blt --- zcn + hsx --- sgk + lln --- sgh + qxr --- zcv + grd --- lqq + qgq --- sjv + tfx --- zlk + dvn --- zcc + ljx --- vrk + qps --- xrj + czm --- mhs + mrt --- scq + fzg --- mql + ghh --- kbs + kff --- tnm + ghh --- tff + dlj --- skz + mlt --- tjj + btb --- bxt diff --git a/day25/example-after-removing.mmd b/day25/example-after-removing.mmd index 73dd8da..6f750c7 100644 --- a/day25/example-after-removing.mmd +++ b/day25/example-after-removing.mmd @@ -1,15 +1,15 @@ -flowchart LR - bvb --- cmg - hfx --- ntq - frs --- lsr +flowchart TD + cmg --- qnr + cmg --- lhk jqt --- nvd - lhk --- lsr - bvb --- ntq bvb --- rhn - bvb --- xhk - frs --- rsh - pzl --- rsh - jqt --- ntq - lhk --- nvd + lsr --- pzl + lhk --- lsr + lsr --- rsh + hfx --- ntq qnr --- rzs - cmg --- rzs + bvb --- hfx + lhk --- nvd + frs --- qnr + jqt --- ntq + rhn --- xhk diff --git a/day25/example-before-removing.mmd b/day25/example-before-removing.mmd index 113231f..ab7ceca 100644 --- a/day25/example-before-removing.mmd +++ b/day25/example-before-removing.mmd @@ -1,34 +1,34 @@ flowchart TD + ntq --- xhk + bvb --- hfx lsr --- pzl - nvd --- qnr - lhk --- lsr nvd --- pzl - rhn --- xhk - jqt --- rhn - cmg --- lhk + pzl --- rsh + frs --- lhk bvb --- cmg jqt --- xhk - frs --- lsr - lsr --- rsh - hfx --- pzl - hfx --- xhk - frs --- lhk - pzl --- rsh - jqt --- ntq - hfx --- ntq - lhk --- nvd - lsr --- rzs - bvb --- xhk - frs --- rsh - qnr --- rzs bvb --- rhn - bvb --- hfx + jqt --- rhn + hfx --- xhk + frs --- lsr + lhk --- lsr jqt --- nvd cmg --- rzs - cmg --- nvd - bvb --- ntq - ntq --- xhk - frs --- qnr - rsh --- rzs - hfx --- rhn + hfx --- pzl + bvb --- xhk + rhn --- xhk + frs --- rsh cmg --- qnr + nvd --- qnr + qnr --- rzs + bvb --- ntq + frs --- qnr + cmg --- nvd + hfx --- rhn + jqt --- ntq + hfx --- ntq + lsr --- rsh + cmg --- lhk + rsh --- rzs + lhk --- nvd + lsr --- rzs diff --git a/day25/graph.go b/day25/graph.go index 4f912be..6ce0e0d 100644 --- a/day25/graph.go +++ b/day25/graph.go @@ -68,8 +68,9 @@ func (g *Graph) readGraphLine(l string) { return } +// NOTE this is so sad. nodeA.Neighbors.Remove(nodeB.Name) hangs for a reason i don't understand func (g *Graph) RemoveEdge(a, b string) { - log.Printf("entering remove edge for %s and %s", a, b) + // log.Printf("entering remove edge for %s and %s", a, b) nodeA, existsA := g.Nodes[a] // log.Println("got first node", nodeA, existsA) nodeB, existsB := g.Nodes[b] @@ -79,52 +80,52 @@ func (g *Graph) RemoveEdge(a, b string) { } // log.Println("before removals") - newANeighbors := mapset.NewSet[string]() - for oldNeighbor := range nodeA.Neighbors.Iter() { - if oldNeighbor != nodeB.Name { - newANeighbors.Add(oldNeighbor) - } - } - log.Println("before remove first", nodeA) - nodeA.Neighbors = newANeighbors - // nodeA.Neighbors.Remove(nodeB.Name) - log.Println("removed first", nodeA) + // log.Println("before remove first", nodeA) + // nodeA.Neighbors = newANeighbors + nodeA.Neighbors = nodeA.Neighbors.Difference(mapset.NewSet[string](nodeB.Name)) + // nodeA.Neighbors.Remove(nodeB.Name) + // log.Println("removed first", nodeA) - newBNeighbors := mapset.NewSet[string]() - for oldNeighbor := range nodeB.Neighbors.Iter() { - if oldNeighbor != nodeA.Name { - newBNeighbors.Add(oldNeighbor) - } - } - log.Println("before remove second", nodeB) - nodeB.Neighbors = newBNeighbors + // log.Println("before remove second", nodeB) + // nodeB.Neighbors = newBNeighbors + nodeB.Neighbors = nodeB.Neighbors.Difference(mapset.NewSet[string](nodeA.Name)) // nodeB.Neighbors.Remove(nodeA.Name) - log.Println("removed second", nodeB) + // log.Println("removed second", nodeB) +} + +func (g *Graph) AddEdge(a, b string) { + nodeA, existsA := g.Nodes[a] + nodeB, existsB := g.Nodes[b] + if !existsA || !existsB { + panic("requesting not found node") + } + nodeA.Neighbors.Add(nodeB.Name) + nodeB.Neighbors.Add(nodeA.Name) } func (g *Graph) findCycle() (from, to string, exists bool) { - log.Printf(">>>> starting new find cycle") + // log.Printf(">>>> starting new find cycle") var firstNode *Node for _, n := range g.Nodes { firstNode = n break } - log.Printf("initial search from %s and neighbors %+v", firstNode.Name, firstNode.Neighbors) + // log.Printf("initial search from %s and neighbors %+v", firstNode.Name, firstNode.Neighbors) for neighborName := range firstNode.Neighbors.Iter() { initialVisited := mapset.NewSet[string](firstNode.Name) - log.Printf("initial dfs from %s to %s with initial visited %+v", firstNode.Name, neighborName, initialVisited) + // log.Printf("initial dfs from %s to %s with initial visited %+v", firstNode.Name, neighborName, initialVisited) from, to, exists = g.dfcCycle(firstNode.Name, neighborName, initialVisited) if exists { break } } - log.Printf("<<<< cycle %t, from %s to %s", exists, from, to) + // log.Printf("<<<< cycle %t, from %s to %s", exists, from, to) return } func (g *Graph) dfcCycle(fromName, atName string, visited mapset.Set[string]) (cycleFrom, cycleTo string, cycleExists bool) { - log.Printf("> step from %+v to %+v. visited : %+v", fromName, atName, visited) + // log.Printf("> step from %+v to %+v. visited : %+v", fromName, atName, visited) if visited.Cardinality() == len(g.Nodes) { log.Println("exit by visited all") return @@ -215,6 +216,9 @@ func (g *Graph)SaveAsMermaid(filename string) { type Edge struct { smaller, bigger string } +func (e Edge)String() string { + return fmt.Sprintf("%s/%s", e.smaller, e.bigger) +} func CreateEdge(a, b string) Edge { var smaller, bigger string @@ -235,7 +239,7 @@ func (g *Graph) RemoveAllCycles() (removedEdges mapset.Set[Edge]) { for hasCycle { from, to, hasCycle = g.findCycle() if hasCycle { - log.Printf("\n!!!! found cycle %s to %s\n", from, to) + // log.Printf("\n!!!! found cycle %s to %s\n", from, to) edgeToRemove := CreateEdge(from, to) removedEdges.Add(edgeToRemove) g.RemoveEdge(from, to) @@ -243,3 +247,55 @@ func (g *Graph) RemoveAllCycles() (removedEdges mapset.Set[Edge]) { } return } + +func (g *Graph) TryToSplit() (componentSizeMult int) { + // first remove all cycles + removedEdges := g.RemoveAllCycles() + g.SaveAsMermaid("after-removing-cycles.mmd") + // log.Printf("all removed edges %+v, two of them are necessary to split initial graph into 2 ", removedEdges) + + triedEdges := mapset.NewSet[Edge]() + + for _, node := range g.Nodes { + for neighborName := range node.Neighbors.Iter() { + edge := CreateEdge(neighborName, node.Name) + if triedEdges.Contains(edge) { + continue + } + triedEdges.Add(edge) + // first remove the edge + g.RemoveEdge(edge.bigger, edge.smaller) + + // then ask for components of the nodes of removed edge + compA := g.ComponentFrom(edge.bigger) + compB := g.ComponentFrom(edge.smaller) + + // iterate over the initially removed edges. only two of them should be 'connecting' + // i.e were necessary to remove + necessaryEdgesCount := 0 + for initiallyRemovedEdge := range removedEdges.Iter() { + endA, endB := initiallyRemovedEdge.bigger, initiallyRemovedEdge.smaller + isNonNecessary := (compA.Contains(endA) && compA.Contains(endB)) || (compB.Contains(endA) && compB.Contains(endB)) + if !isNonNecessary { + // log.Printf("with edge %+v test removed, the %+v also seems necessary", edge, initiallyRemovedEdge) + necessaryEdgesCount += 1 + } + } + // log.Printf("with edge %+v test removed neessary count is %d", edge, necessaryEdgesCount) + + // if we found 2 necessary, then our currently tried edge is the third necesary to remove + // and out two components are the searched + if necessaryEdgesCount == 2 { + return compA.Cardinality() * compB.Cardinality() + } + + // in the end add edge back if not fitting + g.AddEdge(edge.bigger, edge.smaller) + } + } + + // now huh. if we didn't find `necessaryEdgesCount == 2` + // that means 0, 1 or 3 + + return +} diff --git a/day25/graph_test.go b/day25/graph_test.go index 1fa035c..3a91175 100644 --- a/day25/graph_test.go +++ b/day25/graph_test.go @@ -2,6 +2,8 @@ package day25 import ( "testing" + + mapset "github.com/deckarep/golang-set/v2" ) func TestReadFileExample(t *testing.T) { @@ -54,7 +56,41 @@ func TestRemoveAllCycles(t *testing.T) { g.SaveAsMermaid("example-before-removing.mmd") t.Logf("initial graph is %+v", g) edges := g.RemoveAllCycles() + expectedNecessary := mapset.NewSet[Edge]( + CreateEdge("hfx", "pzl"), + CreateEdge("bvb", "cmg"), + CreateEdge("nvd", "jqt"), + ) + + intersection := expectedNecessary.Intersect(edges) + t.Logf("i expect that exactly two will be in intersection %+v", intersection) + if intersection.Cardinality() != 2 { + panic("huh?") + // ok, this is not what i expected. + // this is unstable. but i could run it several times? and hopefully luck out? + } + t.Logf("removed edges %+v", edges) t.Logf("after removal graph is %+v", g) g.SaveAsMermaid("example-after-removing.mmd") } + +func TestSplittingExample(t *testing.T) { + filename := "example" + g := ReadGraphFile(filename) + result := g.TryToSplit() + t.Logf("hopefully same as example answer: %d", result) +} + +func TestSplittingInput(t *testing.T) { + // kind of brute force + result := 0 + filename := "input" + + for result == 0 { + g := ReadGraphFile(filename) + result = g.TryToSplit() + t.Logf("hopefully as answer: %d", result) + } + +} diff --git a/day25/notes.org b/day25/notes.org index 42b236e..735af66 100644 --- a/day25/notes.org +++ b/day25/notes.org @@ -456,3 +456,25 @@ PASS ok sunshine.industries/aoc2023/day25 0.003s #+end_src +** kind of bruteforce + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 518391 + graph_test.go:93: hopefully as answer: 0 + graph_test.go:93: hopefully as answer: 518391 + graph_test.go:93: hopefully as answer: 0