From b37750d5ae55291750280096d5692b2af820b126 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Tue, 19 Dec 2023 15:53:05 -0500 Subject: [PATCH] Day 19 --- input/day19.txt | 780 ++++++++++++++++++++++++++++++++++++++++++++++++ src/day19.rs | 443 +++++++++++++++++++++++++++ src/main.rs | 3 +- 3 files changed, 1225 insertions(+), 1 deletion(-) create mode 100644 input/day19.txt create mode 100644 src/day19.rs diff --git a/input/day19.txt b/input/day19.txt new file mode 100644 index 0000000..a379504 --- /dev/null +++ b/input/day19.txt @@ -0,0 +1,780 @@ +ztj{s<2703:A,m<1025:vk,ztl} +nqt{a>3513:R,s>2424:R,m>929:R,A} +mr{s>2281:R,A} +gf{x>2746:R,a<3379:jcl,R} +gkv{x>2579:qlx,s>322:rxv,R} +gdl{x<2917:A,s>82:A,s<54:R,R} +hzc{m<1277:R,m>1355:A,x>953:A,R} +xs{x>2337:ft,m>1444:A,R} +hs{m<235:A,a<2424:A,x<3026:pvh,hqk} +cls{a<1361:zch,s<3630:tnh,a<2359:px,spb} +gq{m<1157:A,R} +hc{m<2726:A,s>1302:A,R} +lt{x>3157:A,a<3669:R,R} +sf{x<3199:R,s>2680:jrl,x>3718:jh,R} +hr{m>1737:A,A} +bgg{x<171:A,x<283:R,R} +pgb{m<1624:ksc,x>2675:bzc,bzn} +zm{m<2599:sjc,m>3497:A,m<2946:A,A} +gbb{x>860:bxv,a<2306:br,msc} +gsl{x>53:A,A} +zs{x<1669:kp,x<2690:ns,s>2951:cls,tvv} +qhq{x<1264:A,m<1728:A,R} +gg{s<239:A,s>340:R,x>3642:A,R} +ktx{m>2620:R,m>2073:R,a<3539:R,R} +xg{x<3497:fp,sgc} +pms{m<3366:R,x>3570:A,R} +gsb{x>2077:A,A} +xf{s>3779:A,R} +tfs{s>3844:rb,s<3703:scg,bk} +bgb{a>2837:R,a>2812:A,A} +nvk{s<2358:mr,x>2818:nqt,x<2757:lf,R} +fg{a>1961:A,x<68:R,R} +cfz{x>1567:A,m>951:A,a<2959:R,A} +ljt{m>950:A,m<557:R,m<745:A,R} +zcq{m>1403:th,fd} +tbv{a>1532:R,R} +dq{m>960:R,csz} +tvv{a<2619:zh,m>1623:kb,vh} +dzz{s>3136:R,s<2702:A,a>2889:R,R} +lg{a<66:A,s>784:A,s>263:A,A} +zfk{s<463:R,x>3180:A,R} +bdh{s>356:A,s>193:A,m>482:R,R} +tc{m>3454:R,x>3211:A,A} +tz{x>3191:R,a<1319:R,R} +cpn{m<2478:A,a<2228:A,a>3262:A,A} +qmt{x<2144:R,flt} +nsp{m<379:R,R} +sxt{s<1011:A,a>1135:A,rl} +bjg{m>973:lz,x>243:hh,a>1789:xl,xmg} +cj{x>2137:nst,m<3002:A,s>3193:jc,pfr} +lmc{a>2967:A,A} +tv{m>1493:A,m<769:A,R} +khc{m>2346:mbr,s>596:kvr,a<274:fzh,tb} +zbk{s>1140:qrt,x>1818:pv,a>540:gt,gxc} +kk{s>3728:R,s>3683:R,m<562:A,A} +jv{m<848:zpq,a>1225:fsv,ztj} +shb{a<242:A,m>2625:R,R} +fhg{m>1372:R,A} +dg{x>1246:qd,s<3289:lbf,a<1032:zzp,ks} +cfq{s>2689:A,s>2613:R,A} +gl{m>2798:cqm,s>3029:cnl,m>2233:A,qc} +tkv{m<1884:A,A} +fdm{m<1549:tgt,x<2498:kdf,s>528:jz,lt} +vx{x<2948:xc,mgp} +bs{m<687:A,R} +kp{x>609:dkr,tqc} +xpj{x<934:A,a>1772:A,A} +rhd{x>956:A,a<2471:A,a<3414:A,A} +srg{m>1381:A,s<264:A,A} +szv{s>453:mff,nzj} +ldl{a>3906:A,A} +rxv{m<1632:R,m>1700:R,R} +ch{s<3588:A,a<639:A,R} +sc{s>2789:A,a<1419:R,R} +gk{m>415:R,x>508:A,a<3053:R,R} +rs{s<1893:R,m>2997:R,x<2049:R,R} +ncn{s<722:R,m>3562:A,s>773:jm,vr} +kz{x>3160:A,A} +xxt{s>1035:R,a<942:R,R} +pfr{m<3520:A,A} +nh{a<638:mv,s>865:vm,nrf} +sg{s>3051:vps,m>2918:A,zhs} +xnj{x>3494:A,m>584:A,a<1897:A,R} +jg{s<2380:R,a<2211:A,A} +cqm{s<3107:R,a>3295:R,m>3224:R,A} +hgv{m<203:A,s>107:R,A} +vqt{x<2609:xkn,bnt} +ft{s>3154:A,m>1087:R,A} +qv{a>621:A,a>259:xp,m<2439:fbv,kpq} +lzv{x<2186:gpt,lsb} +lx{x>3655:A,s>2359:A,s>2271:R,R} +xfj{s<407:sxx,R} +tnh{x<3164:vx,js} +mbr{s<671:A,R} +tbn{m<2151:A,x<3001:R,R} +zhp{m<3768:fgp,x>3307:rv,kj} +qd{s<3201:A,s>3491:hgt,x>1468:A,R} +qdk{s<1950:R,R} +vn{s>2814:A,m>386:A,A} +lv{x>3090:A,s>2406:znh,R} +km{m>2029:A,m>1871:A,s<2456:A,R} +ppc{m>2718:R,x<2889:A,x>3361:A,R} +bk{a<3189:A,m>846:R,R} +ht{s>2582:jts,x<3333:hx,rgx} +bb{x<3122:A,x>3258:R,m>3625:A,A} +fd{m>650:R,x<450:A,a<2254:gb,gk} +dcf{s>1084:tzp,gbb} +pm{x>3659:A,m<3539:R,A} +hj{a>3260:hrn,A} +ds{m>767:A,m>718:A,R} +ccv{a<2781:R,a<2905:hd,s<1781:A,qdk} +vh{s<2473:lpg,m>643:cmn,s>2647:vkk,ht} +zld{x<3737:A,xst} +djf{x<748:R,R} +jfx{m>1768:gz,m>802:jfs,m<437:cl,snl} +vft{x<2121:dn,m<2486:kf,x<2180:qmt,vsj} +bc{m<369:hs,a<2050:dfd,m>584:mx,vqt} +dn{a<799:vbr,m<1868:A,s<1387:skb,rs} +kxl{a<1795:A,s>3664:A,s<3514:R,R} +bh{x>3971:A,R} +pv{x>1877:R,s<517:R,m>2313:R,A} +vzj{s<1879:cth,vc} +fc{a<2156:ths,zbc} +cs{a>2745:A,x>2067:A,s>2357:R,A} +nsj{a>2800:A,m<2010:R,R} +lsb{a>2810:R,x>2463:A,m>2877:R,bz} +nl{x<2336:A,x>2529:A,A} +pk{m<2800:A,s>3027:R,x<487:A,A} +bzn{m<1838:R,A} +qrt{s>1765:R,s>1529:A,s>1302:zdc,kzp} +srn{m<3131:zbr,a>3269:phc,x<2610:R,xd} +lz{m<1282:pzk,s>1085:gld,A} +spb{x<3144:krj,sx} +mqz{m>467:sm,m<282:R,s<969:hhs,jfp} +mff{s<632:A,x>625:R,dzt} +hgt{m<2577:A,s<3667:A,s>3805:R,R} +xpv{a<3077:R,R} +rf{m>3497:gv,a>334:vhk,A} +rsc{s>1811:A,jk} +vkl{a>1095:A,a<912:R,R} +mpn{a>3161:pdk,x>3461:zld,ff} +pzk{s>1180:R,m>1114:R,x>299:A,R} +vf{x<492:R,s<3334:R,R} +kjv{m<719:bc,vhc} +ks{m>2088:kxl,a>1906:ll,gq} +vm{m>1632:vb,qcr} +ph{a<2292:qzf,A} +xn{x<2461:qln,R} +px{a<1762:xg,x>3186:jfx,fc} +fzz{x<3174:mq,a>1103:nn,m<533:bgn,mdq} +xl{x>116:lmr,m<712:nvq,a>2807:jmf,R} +br{s>958:xxt,x<537:bnn,a<1228:R,ssr} +mcl{x>3441:R,s<2530:R,R} +gn{a<3598:R,a>3777:A,x>861:A,R} +scg{a>3029:A,s>3661:A,R} +kr{m<471:R,hz} +xfc{s>3354:R,R} +th{a>1860:vf,a>789:pk,mt} +nm{s<2242:A,x>3062:kz,R} +xp{m<2732:R,a<441:R,A} +fzh{a>101:A,x>3191:R,A} +bn{x<3725:R,a>499:R,R} +kmh{s>1727:A,a>1678:A,a<1550:A,A} +dj{m<2927:R,m>3578:A,x>1056:R,A} +jz{x>3123:A,a>3678:A,x>2902:R,R} +qq{m<3557:A,m>3852:A,a<1950:R,A} +nrv{m>1238:qcd,mqz} +pmd{x>3502:R,gdl} +ll{s>3570:A,s<3419:R,x>946:A,R} +td{x<1875:A,a>1161:A,A} +jt{m>1937:A,s<430:tkv,R} +pp{s<1233:mzr,m>2932:vsl,ccv} +ssr{s<903:R,R} +qcd{m>1677:R,R} +sv{x<3042:fv,s<3775:tc,m<3706:ct,dm} +qsg{x>3287:vvt,dbq} +cdt{x<3342:kx,a>1677:btj,nth} +jrl{m>1242:A,m>940:R,m<793:R,R} +dzt{s<732:A,A} +dk{m>1342:rmq,hdt} +rn{x<3645:A,R} +fx{s>1211:jpn,s>785:nrv,m<1357:pd,dcg} +nvh{a<2086:kmh,x<2940:A,m<2730:R,pms} +cb{x<581:sd,psf} +mq{m>678:A,x>2970:qf,a<881:A,ck} +qfn{s>298:A,R} +rss{s>1618:rsl,frj} +sp{x<3759:R,a>512:A,m>3807:R,R} +dns{m>270:A,x<2335:R,s>3567:R,R} +dsr{x<2503:R,m>969:A,x>3358:R,A} +jfs{s>3760:R,R} +zpq{x<2139:td,s>2466:nl,A} +vk{s<2893:A,a<803:A,s>2986:R,A} +rbn{a>3902:zp,m>472:A,R} +tvn{m<2544:R,A} +lqf{a<3601:rnx,a<3691:A,fz} +ls{m<1384:A,R} +rnk{a>3786:R,m<2367:A,zl} +pdk{x>3398:R,s>2636:tnq,a>3510:xt,km} +gm{x>1475:sg,zdv} +ps{s>2886:A,A} +ndh{a<979:fkj,a>1636:A,s>2743:tz,nf} +zhs{s>2501:R,a<3309:A,s>2306:A,R} +zht{a>1418:A,A} +fn{x>3198:A,a>3957:R,m>3278:A,A} +xc{m>1714:xfc,a>2574:cmr,A} +gld{m<1414:R,x<381:A,m<1444:A,R} +pz{m>3006:R,A} +fkp{a>3424:R,m<3526:A,A} +fqc{a<2473:tv,m>2350:cj,a<2565:xs,vv} +bnt{s>1011:R,x>3453:A,R} +xzq{a<3766:lqf,a<3888:kgd,s<1399:zmt,lp} +clh{a<1003:A,s>3818:A,ntv} +rq{s>2799:R,m<1088:A,A} +jfp{s<1113:A,R} +hh{x<466:A,R} +md{s>1194:R,R} +hm{a>1759:gsb,R} +vb{s>1454:A,s<1082:kxs,a>1134:A,hc} +rsl{a<3803:gh,st} +tjb{x>2545:A,x>1949:A,R} +zsp{s<3356:R,A} +bg{x>1362:A,R} +lbf{m>1460:A,mnr} +bt{s<856:R,s>1189:ppc,x>2845:R,R} +ct{a<1119:A,x>3291:A,m<3487:A,A} +drn{s>2455:R,x>3658:A,x>3401:R,A} +xst{m>2109:R,a>2952:A,a<2839:R,R} +pr{a>3195:xxm,R} +rnx{s<926:A,a>3544:R,A} +ngl{a<2849:kzb,x>1007:R,vq} +fhq{m<1694:R,m>3210:A,a>1513:A,A} +ttd{x>952:R,m>216:R,m>132:R,A} +tg{a>447:R,m<3009:R,s<3685:R,A} +cgl{x>2271:A,s>3239:R,s<2541:cs,A} +jh{a>3871:R,s<2611:A,R} +vlx{m>2576:A,a<3152:R,m>1231:A,R} +fh{s>1137:R,s<937:R,djf} +xz{x<2419:sl,x<3456:rt,m>3040:fs,crn} +pj{a<887:sq,s<3315:A,R} +kjt{m<990:hqc,nkr} +tb{m>1009:A,A} +ppm{a<1310:R,a<1850:R,a<2261:R,R} +jm{x<1054:R,a<579:R,A} +fsf{x<3020:R,R} +xxm{a<3299:R,R} +pvh{s>929:A,R} +bfx{a<3017:A,a>3351:gn,grz} +fp{x<2966:tbv,x<3308:R,R} +krr{x<677:tvn,A} +vdz{m<3388:R,x<844:A,R} +hzf{s>385:R,s<196:A,A} +jjf{x>3217:A,m<616:qfn,dr} +nq{x>2432:lg,m<1705:A,R} +cmn{a<3539:rtg,a>3754:sf,dv} +sq{a>365:R,m>2615:A,s>3324:A,A} +xqf{x<554:A,m>1924:A,x>1244:A,R} +gxc{a<350:A,s>506:fhg,vl} +qx{a<3727:A,R} +nzq{m<1027:R,s>1843:R,A} +rv{a<3212:R,x>3734:R,m>3888:tq,tn} +lrn{m>1353:kq,s<3039:jv,gx} +nf{m>2662:A,x<3529:A,m>2179:A,R} +zlz{a<750:mc,clh} +kf{a>756:A,R} +gj{m<1030:A,a>1937:R,R} +gb{s<3174:A,s<3470:A,A} +tnq{x>3001:A,R} +zqv{m>691:A,R} +kj{x<2954:psp,x>3147:mg,a>3127:mjb,A} +tgn{a>1711:lkc,s>541:qt,R} +npt{x<772:R,x>900:R,s<1084:R,A} +cx{x>3400:lxp,lbv} +vvt{s>278:R,A} +vqq{x<3192:R,A} +tq{s>2456:R,s<2301:R,x>3451:A,A} +xxx{m<2342:R,A} +dkr{a<2409:dg,m<1437:lvf,x>1274:gm,qdc} +fs{s>1657:pbv,m<3482:A,m>3677:R,R} +tpg{m<1159:A,x>3135:R,gmf} +qln{a<2906:A,a>2928:R,a<2918:R,A} +lvf{x<1270:bfx,x<1455:bzz,qk} +xlq{m<334:A,s>1515:A,A} +sx{m<1833:tfs,hf} +gpt{a>2836:zxd,a>2730:R,A} +krn{x>1155:ckd,s<1260:A,m>2770:A,zht} +sk{m>348:R,x>1377:A,m>153:A,R} +rl{a<984:R,R} +ntd{a<819:dns,qnm} +grz{x>890:A,a<3172:A,A} +kt{x>967:A,R} +qs{m<1546:A,R} +js{x>3672:qmv,a>2929:hdn,hcs} +bzz{m<647:sk,bg} +vv{s>2934:sj,R} +lbp{s>2775:R,R} +zxd{x>1854:A,R} +crn{s>1724:R,rn} +jc{x>1851:R,s<3672:A,m<3477:A,R} +xxh{m>1324:qqn,qm} +pn{s<976:A,m<2297:R,A} +fv{s>3818:A,s<3658:R,s<3743:R,A} +ck{x>2824:R,m<316:R,A} +vdp{x<3490:A,A} +xq{m>184:A,x>3334:A,A} +fz{m>3339:R,m>2690:R,x>2493:R,R} +jf{m<1773:R,x>659:R,A} +xd{a<3143:A,R} +svq{a<3528:A,R} +cl{x>3473:A,R} +qf{x>3076:A,R} +ktb{m<3197:A,s<704:R,s>1154:A,A} +gbj{m<158:R,m<302:R,m>336:R,R} +ff{s<2459:lmc,s>2743:R,nsj} +rcn{s>3821:R,x>2847:A,a<2261:R,A} +xkn{x>2134:R,x>1785:A,A} +pf{a>3576:A,s>3815:A,s>3737:R,R} +ntv{s<3659:R,A} +psf{m>575:R,a<2611:A,m>319:R,R} +fqz{a>3321:bx,vdp} +tzp{x<554:ph,a>2615:lm,krn} +pht{s>625:fh,x>606:ffn,sxb} +zz{m<1836:ql,s>1299:hp,m<3200:shb,A} +snl{s>3863:R,a<2001:xnj,kk} +qdc{a<3128:ngl,a>3442:rnk,x<874:zm,gl} +rsz{m>1017:R,x<2038:A,m<443:R,dzz} +frj{m>1063:md,a>3826:rbn,s>1317:lb,zkk} +bbt{a>3364:A,a<3152:R,R} +lpg{x>3231:fqz,x<2909:nvk,s<2283:nm,lv} +sd{s<1984:R,a>1624:A,m<729:A,A} +spq{x<3000:A,s>148:A,R} +fsv{s<2728:gj,m<1078:fpf,s>2917:R,R} +rmq{s<3098:A,x<182:fg,cpn} +msc{x>326:A,xxx} +drg{a>1618:hzf,s>486:zjl,a>619:hzc,A} +hx{x>3100:R,m<249:hnq,R} +ksc{a>3214:A,x>2913:R,R} +kxs{x<3497:R,s>949:A,A} +xv{s>311:A,R} +kd{x<3492:A,ppm} +st{s<1839:R,m>810:R,pgj} +ntb{m>3358:spq,m>2731:zhg,s<116:R,A} +lqz{a>3814:A,A} +fb{x>2177:tg,bjd} +dcg{a<3359:pgb,rch} +khp{a<2918:A,x>3796:R,m>378:R,A} +hhs{x<3165:A,R} +bnn{a<1158:R,x<228:A,A} +nx{m>469:R,x>3876:R,x<3760:A,A} +vl{m>1539:A,a>468:A,s>326:R,A} +qmv{s<3328:R,A} +rt{m<2818:fbx,R} +hcs{x<3425:zsp,mk} +mn{m<2363:A,R} +sm{m<839:A,x>2835:A,s>1035:A,A} +zn{x<2270:R,a>798:R,s>3678:R,A} +qqn{m>1794:jt,a<3748:fdm,gkv} +hdn{s>3198:A,s>3046:R,ngq} +mg{x>3205:R,s<2688:R,A} +sgc{x<3807:fhq,x<3919:A,bh} +qhl{m>2988:A,x>3259:drn,xpv} +zbr{x<2841:R,m>2724:R,R} +rjb{x>2706:R,R} +qp{m>1140:drg,tgn} +kkk{s>1408:vzj,m<1501:dnp,s<833:dmc,dcf} +cmr{a>3290:R,m>1084:R,m>506:R,A} +lbv{m<3300:R,a<923:A,s<2435:bb,qq} +mjb{m<3900:R,a>3686:A,R} +clg{s>1434:nvh,m>3229:rsh,bt} +hrn{a>3478:R,a>3380:R,m>1194:R,A} +zhd{s>1275:R,m>3076:R,m<2721:A,R} +hnq{x>2834:A,R} +tbt{x>3131:A,m<3435:R,A} +phc{a>3375:A,a<3306:R,A} +vq{x<800:R,s>2917:R,x<922:R,R} +kq{s<3392:sc,a>1260:hm,m>2319:fb,htk} +fbx{a>3317:A,m<2345:A,R} +cm{m<2219:R,m>2264:R,R} +csz{s>3528:R,A} +nst{x>2459:A,A} +lf{a<3121:R,x<2716:R,m<818:R,A} +xsp{x<2980:R,a>2817:A,A} +qm{x<2949:kr,x<3428:jjf,s<456:jtt,jqn} +qt{s<744:A,x<1059:R,s>816:R,A} +zc{x>3545:qx,a>3625:vn,A} +cxk{a>1449:ntt,s>1617:xbr,s>1504:R,xqf} +cg{x>2245:zx,x<1956:zbk,vft} +zkk{m<649:A,a>3680:R,R} +bx{a<3661:A,x<3529:A,a>3778:R,R} +mv{s>1300:rsc,khc} +qjt{x<3376:A,R} +mgp{x>3029:zq,A} +fpf{a>1769:R,x>2049:A,s<2923:A,R} +lhc{s>1662:A,m>1543:A,a<3599:tl,vfn} +mzr{a<2819:R,R} +psp{s<2611:A,a>3354:A,a>3056:A,A} +vc{m<1333:cb,mp} +bzc{m<1850:R,m<1953:A,R} +kb{m<2614:mpn,m>3380:zhp,gqd} +dv{a<3677:cfq,x<3383:R,s<2710:R,rq} +xh{s<2524:A,R} +vr{s>754:A,x<643:A,A} +sj{s<3498:R,s<3711:R,m<1518:A,R} +bq{a<1413:R,m>3189:A,a<1750:R,R} +bgn{m<197:A,m<353:gbq,xh} +jl{x>2858:R,m<476:R,R} +vbr{x<2055:R,m>2096:A,R} +ngq{a>3426:R,s<3009:A,a<3210:A,R} +krj{x>2852:pjd,gf} +dp{m>1430:A,A} +xkm{m<1913:kjv,vz} +vg{x>224:R,a>1513:A,m<323:A,R} +jmf{s<1182:A,a>3547:A,A} +vqr{a>3441:ljt,A} +ckd{m>3131:R,a<1567:R,m>2271:R,A} +bp{s>3270:A,s>3133:R,R} +pc{x>3663:A,m<491:R,A} +mx{m>663:bs,m<622:tjb,gkn} +qhh{x<1947:A,m>3589:A,R} +ths{a>2010:dp,R} +znh{m>662:A,x>2990:R,R} +fph{a>2941:R,s<1649:R,R} +nkr{x<1012:npt,m>1326:A,s>1224:R,R} +zbc{x>2881:R,x>2784:rcn,x>2722:xf,rjb} +hp{s>1600:R,s>1465:R,a>263:R,R} +kdf{s>420:R,m>1639:R,x>2176:A,R} +hkl{s<3823:bn,m>3668:sp,s>3936:A,A} +lp{m>3026:tbt,s>1876:R,bj} +zmt{a>3930:fn,a<3915:bcz,ktb} +jqn{a<3862:pc,m<761:R,a<3938:ldl,A} +hms{x>3072:A,s<1921:R,A} +sn{s>774:A,s>753:R,x>547:A,A} +kx{m>1998:tbn,A} +mqc{m<2308:A,m>3052:A,m>2635:R,A} +qdj{a>2946:zgm,a<2669:fqc,m>2271:lzv,ndr} +xt{a>3826:A,x<3063:A,A} +kvr{m>1390:R,x>3294:A,R} +hz{x>2278:A,x<1949:A,A} +fkj{x<3168:A,s<2741:R,R} +tn{m<3831:R,s>2560:R,A} +zjl{s>694:R,R} +ndr{a<2827:cgl,x<2240:rsz,xn} +btj{m<1813:qs,m<2042:jg,cm} +bjd{x<1891:A,s>3600:A,A} +gjg{m>2075:rjd,a<3588:fx,s<809:xxh,rss} +zch{s<3538:hl,m<2003:zlz,dz} +nrf{s>428:vkl,s>146:qsg,a>957:pmd,dxn} +vhc{s>1085:tpg,jxf} +lb{m<643:xlq,a>3717:svn,m>911:dsr,ds} +zdc{x>1803:R,A} +bzj{s>3689:A,m<2560:R,R} +flt{s>1360:A,x>2163:A,A} +qg{s>1039:A,A} +dm{m<3816:A,s<3853:R,A} +xmg{m>752:A,x>137:jzj,gsl} +bcz{a<3903:R,R} +lkc{a>3188:A,m<900:A,m>1018:A,R} +jxf{s<527:srg,A} +gx{m>486:dq,ntd} +bd{s>2400:A,x>3671:A,s>2281:R,A} +qc{s<2673:R,A} +lm{a<3182:dj,a>3635:lqz,a>3407:R,R} +qnm{m<247:R,a>1687:R,m>389:A,A} +zq{s>3263:R,s>3111:R,R} +mk{s>3246:A,m>2016:R,s<3088:A,R} +rql{a<3077:xsp,s>2761:jl,s>2722:R,A} +vj{s<2785:ndh,kd} +in{s>2178:zs,skv} +xrc{s>712:sn,A} +jp{a<2589:R,A} +pgj{a>3929:R,x>2479:A,A} +jts{x>3530:R,A} +gv{s>3739:A,R} +mnr{s>2737:R,A} +tgt{m>1439:R,s>292:R,A} +xvs{a<2848:A,A} +vps{a>3227:A,x<1588:R,A} +jzj{m<672:A,s<1122:R,R} +zzp{x<901:ch,R} +sl{s>1542:A,s>1296:R,x>1931:A,zxz} +rjd{a>3500:xzq,s<1086:qj,xz} +kgd{s>1426:A,a>3812:A,R} +dmc{m<2947:szv,kqx} +hbk{m<3419:A,R} +htk{a<729:R,a>1042:A,a>861:R,zn} +zp{s<1255:A,A} +qlx{m>1631:R,x>3329:R,R} +skv{x<1606:kkk,a<1440:ggv,a<3018:xkm,gjg} +zl{m>3149:A,a>3596:A,R} +sjc{m>2149:A,A} +ggv{x>2600:nh,cg} +pd{a<3356:pr,x<2700:xfj,a<3465:zbd,xv} +vhk{a<614:A,a>735:A,m>3340:A,R} +bz{x<2317:R,s<3304:A,A} +zbd{m>889:zfk,bdh} +vsj{a<598:zhd,R} +qzf{a>1455:R,x>340:A,s<1196:R,R} +dz{m<3157:qv,x>3473:hkl,a>877:sv,rf} +rtg{a>2957:R,A} +qk{a>3252:svq,s>3213:R,m>548:cfz,R} +zx{a>871:sxt,a>314:mn,a>186:zz,nq} +kcd{x<2880:R,s>94:R,R} +hqc{m<796:R,m>890:rhd,a<2192:A,xvs} +ffn{m>350:jp,a<2088:ttd,a>2817:R,R} +sz{m<1599:R,x>2121:ktx,m<3075:bbt,qhh} +jtt{a<3836:zqv,m<876:gg,A} +lmr{a<2718:A,a<3149:R,R} +zdv{s>3010:R,lr} +jcl{m<1659:A,R} +mdq{a<479:R,A} +dnp{m<537:pht,s<885:qp,x<582:bjg,kjt} +lxp{m>2932:A,lx} +kqx{s<513:hbk,a<1592:ncn,a>3119:xrc,kt} +cnl{x<1035:R,m<2338:A,R} +mp{m<2347:xpj,a>2221:vdz,bq} +rgx{s<2542:R,R} +rb{s<3903:A,A} +jk{m>2376:R,x>3391:R,m<1198:R,R} +zgm{s>3092:bzj,sz} +gt{a>1014:R,m<2365:ls,R} +jpn{s>1819:hj,a>3326:vqr,ljm} +nzj{s>254:R,m>2156:R,x<991:jf,qhq} +gh{m>856:A,nsp} +kpq{a<110:A,x>3312:R,x<3090:R,R} +hl{x<3177:pj,bp} +gs{a<180:R,s>3703:R,R} +gz{m>3188:R,R} +lft{s>2829:ps,gbj} +kzb{m>2754:A,a<2674:A,A} +vz{a>2453:pp,clg} +tqc{x<360:dk,zcq} +bxv{a<2317:A,m<2884:pn,fkp} +ztl{a<590:R,x<2295:R,x>2529:R,R} +vkk{a>3382:zc,x>3140:xrl,m<384:lft,rql} +fbv{s<3805:R,s>3881:R,a>172:R,R} +gbq{m>279:A,x<3717:R,x<3898:A,R} +svn{s<1485:R,A} +skb{s>589:R,s>295:R,x>2063:A,A} +mc{a>272:A,x>3488:gs,s>3786:A,fsf} +pbv{x<3811:R,a>3290:A,m<3444:R,A} +gkn{s<1377:A,A} +nth{a<1084:bd,A} +vsl{a<2799:A,a<2901:bgb,fph} +lr{x<1407:A,s>2654:R,s<2373:A,R} +dbq{m<1824:R,s>291:R,A} +hdt{s>3011:R,s>2681:A,bgg} +nvq{m>597:R,x>47:R,A} +qj{s>674:pz,s>313:srn,ntb} +fgp{a>3257:R,mcl} +pjd{s<3848:vlx,A} +gmf{s<1729:A,A} +kzp{x>1746:A,x>1670:A,m>2460:A,A} +tl{m<888:A,m<1289:A,R} +zh{m<1334:fzz,s>2674:vj,m<2347:cdt,cx} +ql{s<1432:A,a>258:R,A} +rch{s<485:R,vqq} +hf{a<3208:R,pf} +bj{x<2870:R,m<2489:A,R} +zhg{x>3190:A,s>144:R,m<2941:A,R} +rsh{x<3060:R,a<1833:pm,R} +ntt{a>1930:R,a<1611:A,A} +hd{s>1811:A,R} +dfd{x<2726:A,qg} +gqd{a>3471:qjt,qhl} +xrl{x>3598:khp,m>284:lbp,m<100:R,xq} +zxz{m<2818:A,R} +vfn{s>1502:R,x>955:R,s>1440:A,R} +dr{s<370:A,x>3070:R,R} +cth{a<2210:cxk,a>3174:lhc,krr} +xbr{m<1775:R,m>3200:A,A} +nn{m>718:R,x>3641:nx,A} +dxn{s<55:hr,x>3309:A,a<824:kcd,mqc} +mt{a<423:R,a>555:R,R} +hqk{a>2663:A,s<888:R,a<2564:R,A} +ns{a<2307:lrn,qdj} +sxb{s>318:vg,hgv} +ljm{s<1457:A,m>763:A,s>1648:R,A} +qcr{s<1460:R,m<548:hms,a>1054:A,nzq} +sxx{a>3455:A,R} + +{x=378,m=450,a=211,s=36} +{x=220,m=1090,a=338,s=879} +{x=117,m=124,a=2136,s=128} +{x=1392,m=1408,a=126,s=16} +{x=2038,m=278,a=901,s=1801} +{x=323,m=1703,a=964,s=571} +{x=265,m=358,a=456,s=34} +{x=1513,m=144,a=525,s=1341} +{x=355,m=2036,a=814,s=1179} +{x=937,m=701,a=2026,s=1349} +{x=1292,m=766,a=2805,s=16} +{x=319,m=26,a=83,s=1193} +{x=600,m=5,a=242,s=76} +{x=117,m=1415,a=1636,s=1057} +{x=87,m=1530,a=1686,s=386} +{x=36,m=957,a=1712,s=300} +{x=2570,m=49,a=661,s=442} +{x=643,m=698,a=1593,s=854} +{x=1450,m=1410,a=289,s=1342} +{x=1690,m=376,a=584,s=3715} +{x=1942,m=570,a=1726,s=1192} +{x=420,m=475,a=1410,s=863} +{x=550,m=662,a=2140,s=105} +{x=241,m=2370,a=756,s=26} +{x=705,m=425,a=1000,s=160} +{x=1763,m=914,a=197,s=555} +{x=2267,m=323,a=70,s=147} +{x=497,m=392,a=1959,s=360} +{x=428,m=1375,a=415,s=236} +{x=1800,m=96,a=403,s=1227} +{x=216,m=381,a=1217,s=1031} +{x=3129,m=304,a=811,s=1753} +{x=555,m=59,a=3254,s=2896} +{x=397,m=1518,a=740,s=496} +{x=905,m=217,a=1234,s=2319} +{x=283,m=2490,a=309,s=1156} +{x=1777,m=624,a=96,s=2053} +{x=1031,m=481,a=1014,s=198} +{x=155,m=205,a=2460,s=832} +{x=123,m=25,a=3962,s=3662} +{x=3242,m=396,a=519,s=150} +{x=2632,m=1307,a=3594,s=1714} +{x=147,m=285,a=1020,s=40} +{x=1498,m=1133,a=241,s=1263} +{x=1977,m=323,a=1594,s=241} +{x=807,m=1042,a=702,s=295} +{x=70,m=455,a=1328,s=108} +{x=2392,m=27,a=158,s=44} +{x=528,m=671,a=2003,s=935} +{x=1539,m=2002,a=168,s=479} +{x=2121,m=195,a=901,s=1116} +{x=251,m=51,a=380,s=745} +{x=793,m=1959,a=598,s=605} +{x=137,m=261,a=714,s=1548} +{x=2783,m=486,a=2065,s=914} +{x=574,m=387,a=250,s=28} +{x=3,m=829,a=1862,s=2} +{x=846,m=2476,a=841,s=1810} +{x=1020,m=114,a=463,s=323} +{x=4,m=970,a=192,s=142} +{x=942,m=2297,a=125,s=1638} +{x=1664,m=2275,a=2086,s=290} +{x=682,m=93,a=143,s=2033} +{x=1613,m=356,a=463,s=632} +{x=633,m=268,a=150,s=798} +{x=1743,m=1455,a=56,s=487} +{x=2774,m=103,a=739,s=77} +{x=1760,m=2631,a=81,s=138} +{x=461,m=1688,a=1543,s=1712} +{x=1182,m=14,a=566,s=3270} +{x=680,m=467,a=1920,s=297} +{x=1281,m=2355,a=704,s=1340} +{x=142,m=65,a=589,s=20} +{x=1412,m=559,a=677,s=2106} +{x=905,m=2761,a=1526,s=648} +{x=399,m=667,a=1901,s=27} +{x=2241,m=3411,a=1786,s=321} +{x=1395,m=1278,a=508,s=1112} +{x=363,m=35,a=218,s=1280} +{x=829,m=115,a=304,s=192} +{x=1397,m=599,a=861,s=838} +{x=824,m=2140,a=88,s=1736} +{x=661,m=276,a=502,s=731} +{x=585,m=14,a=705,s=473} +{x=747,m=95,a=829,s=805} +{x=2006,m=323,a=982,s=168} +{x=795,m=193,a=473,s=1531} +{x=687,m=428,a=972,s=1154} +{x=254,m=426,a=281,s=552} +{x=171,m=369,a=382,s=1369} +{x=964,m=10,a=322,s=2007} +{x=1960,m=183,a=2153,s=1967} +{x=2315,m=170,a=41,s=727} +{x=189,m=901,a=307,s=3026} +{x=757,m=1235,a=1316,s=335} +{x=836,m=3023,a=453,s=2355} +{x=2187,m=2140,a=683,s=2560} +{x=1772,m=468,a=1812,s=1329} +{x=783,m=601,a=1339,s=3291} +{x=570,m=172,a=1794,s=120} +{x=1207,m=1572,a=700,s=758} +{x=1961,m=3652,a=702,s=153} +{x=1094,m=435,a=19,s=938} +{x=3328,m=166,a=247,s=216} +{x=1500,m=2012,a=1561,s=59} +{x=12,m=2269,a=8,s=796} +{x=193,m=1137,a=328,s=13} +{x=120,m=1179,a=59,s=1829} +{x=499,m=650,a=1049,s=1803} +{x=2761,m=1431,a=389,s=1322} +{x=456,m=2766,a=2165,s=348} +{x=2387,m=12,a=2140,s=556} +{x=387,m=7,a=1514,s=1137} +{x=1111,m=608,a=581,s=965} +{x=1055,m=181,a=754,s=67} +{x=74,m=2582,a=66,s=546} +{x=5,m=956,a=1013,s=657} +{x=262,m=189,a=2496,s=233} +{x=518,m=2821,a=851,s=825} +{x=351,m=1981,a=221,s=34} +{x=995,m=165,a=36,s=2286} +{x=1636,m=335,a=936,s=447} +{x=763,m=692,a=1527,s=210} +{x=301,m=559,a=1815,s=2640} +{x=959,m=2852,a=232,s=53} +{x=136,m=153,a=206,s=11} +{x=1533,m=42,a=2014,s=136} +{x=341,m=378,a=37,s=577} +{x=220,m=1451,a=185,s=421} +{x=1086,m=3265,a=1184,s=2960} +{x=143,m=2701,a=602,s=173} +{x=628,m=1016,a=1642,s=223} +{x=597,m=641,a=1331,s=651} +{x=809,m=1843,a=1111,s=2189} +{x=1385,m=1352,a=238,s=1969} +{x=515,m=1374,a=125,s=913} +{x=798,m=2743,a=1798,s=1045} +{x=2999,m=1787,a=1168,s=188} +{x=57,m=77,a=2652,s=56} +{x=1231,m=304,a=1288,s=523} +{x=1031,m=381,a=558,s=267} +{x=721,m=883,a=2995,s=22} +{x=304,m=846,a=1525,s=30} +{x=446,m=2969,a=412,s=674} +{x=187,m=418,a=1187,s=571} +{x=810,m=515,a=819,s=1393} +{x=740,m=3392,a=1128,s=1114} +{x=137,m=631,a=1208,s=1707} +{x=653,m=2468,a=952,s=811} +{x=33,m=70,a=518,s=464} +{x=3318,m=2,a=3661,s=64} +{x=50,m=548,a=1657,s=704} +{x=2272,m=2684,a=1597,s=2220} +{x=185,m=339,a=460,s=517} +{x=8,m=1651,a=1810,s=354} +{x=548,m=833,a=1703,s=759} +{x=551,m=358,a=390,s=468} +{x=202,m=2260,a=597,s=632} +{x=453,m=1811,a=754,s=2449} +{x=353,m=101,a=1835,s=72} +{x=1451,m=453,a=162,s=13} +{x=125,m=2120,a=627,s=981} +{x=5,m=283,a=1755,s=194} +{x=973,m=835,a=62,s=1184} +{x=346,m=1348,a=442,s=210} +{x=4,m=1242,a=136,s=196} +{x=2388,m=1336,a=1991,s=2873} +{x=561,m=2335,a=1059,s=627} +{x=838,m=3226,a=159,s=1053} +{x=2578,m=49,a=1920,s=2432} +{x=710,m=342,a=182,s=534} +{x=1997,m=1509,a=946,s=1849} +{x=810,m=249,a=495,s=257} +{x=363,m=274,a=2742,s=25} +{x=506,m=565,a=2584,s=731} +{x=508,m=2073,a=21,s=1826} +{x=1413,m=780,a=779,s=378} +{x=1097,m=47,a=98,s=402} +{x=536,m=2,a=2710,s=1499} +{x=548,m=2845,a=2095,s=555} +{x=2963,m=2206,a=1920,s=875} +{x=1783,m=367,a=1245,s=594} +{x=409,m=18,a=408,s=119} +{x=1554,m=3613,a=3002,s=87} +{x=232,m=197,a=63,s=1372} +{x=412,m=1355,a=1673,s=1667} +{x=261,m=142,a=123,s=1187} +{x=1396,m=779,a=287,s=60} +{x=28,m=1350,a=585,s=861} +{x=1123,m=329,a=1166,s=62} +{x=2292,m=73,a=123,s=596} +{x=2400,m=1430,a=390,s=1313} +{x=638,m=2856,a=44,s=488} +{x=294,m=1534,a=1075,s=1914} +{x=1233,m=71,a=253,s=3058} +{x=1536,m=805,a=158,s=738} +{x=2903,m=119,a=2344,s=2387} +{x=142,m=1768,a=940,s=881} +{x=301,m=2748,a=739,s=766} +{x=127,m=18,a=141,s=1398} diff --git a/src/day19.rs b/src/day19.rs new file mode 100644 index 0000000..7b2df58 --- /dev/null +++ b/src/day19.rs @@ -0,0 +1,443 @@ +use std::{ + collections::{HashMap, VecDeque}, + ops::Range, +}; + +use itertools::Itertools; +use regex::Regex; + +pub fn run() { + let input = include_str!("../input/day19.txt"); + // let input = r#" + // px{a<2006:qkq,m>2090:A,rfg} + // pv{a>1716:R,A} + // lnx{m>1548:A,A} + // rfg{s<537:gd,x>2440:R,A} + // qs{s>3448:A,lnx} + // qkq{x<1416:A,crn} + // crn{x>2662:A,R} + // in{s<1351:px,qqz} + // qqz{s>2770:qs,m<1801:hdj,R} + // gd{a>3333:R,R} + // hdj{m>838:A,pv} + + // {x=787,m=2655,a=1222,s=2876} + // {x=1679,m=44,a=2067,s=496} + // {x=2036,m=264,a=79,s=2244} + // {x=2461,m=1339,a=466,s=291} + // {x=2127,m=1623,a=2188,s=1013} + // "#; + + // let input = r#" + // in{a>2000:A,R} + + // {x=0,m=0,a=0,s=0} + // "#; + + let (workflows, parts) = parse(input); + + let accepted_sum: usize = parts + .iter() + .filter(|p| run_part(&workflows, p) == WorkflowResult::Accept) + .map(|p| p.sum() as usize) + .sum(); + dbg!(accepted_sum); + + dbg!(run_ranges(&workflows, PartRange::full())); +} + +fn parse(s: &str) -> (HashMap<&str, Workflow<'_>>, Vec) { + let (workflows, parts) = s.trim().split_once("\n\n").unwrap(); + let mut workflows_map = HashMap::new(); + for l in workflows.lines() { + let l = l.trim(); + let brace = l.find("{").unwrap(); + let name = l.get(..brace).unwrap(); + let workflow = l.get((brace + 1)..(l.len() - 1)).unwrap().into(); + workflows_map.insert(name, workflow); + } + ( + workflows_map, + parts.lines().map(|l| l.trim().into()).collect(), + ) +} + +fn run_part<'a>(workflows: &'a HashMap<&'a str, Workflow<'a>>, part: &Part) -> WorkflowResult<'a> { + let mut cur = "in"; + loop { + let workflow = &workflows[cur]; + let result = workflow.run(part); + match result { + WorkflowResult::Workflow(s) => cur = s, + _ => return result, + } + } +} + +fn run_ranges<'a>(workflows: &'a HashMap<&'a str, Workflow<'a>>, range: PartRange) -> usize { + let mut ranges_to_process = VecDeque::from([(range, "in")]); + let mut accepted = vec![]; + while let Some((r, id)) = ranges_to_process.pop_front() { + let results = workflows[id].partition_range(r); + for (range, result) in results { + match result { + WorkflowResult::Accept => accepted.push(range), + WorkflowResult::Reject => (), + WorkflowResult::Workflow(id) => ranges_to_process.push_back((range, id)), + } + } + } + accepted.into_iter().map(|r| r.product()).sum() +} + +#[derive(Debug, Clone)] +struct Workflow<'a> { + rules: Vec>, + otherwise: WorkflowResult<'a>, +} + +impl<'a> From<&'a str> for Workflow<'a> { + fn from(value: &'a str) -> Self { + let mut rules = vec![]; + let mut otherwise = None; + let mut parts = value.split(",").peekable(); + while let Some(s) = parts.next() { + if parts.peek().is_none() { + otherwise = Some(WorkflowResult::from(s)); + } else { + rules.push(Rule::from(s)); + } + } + Self { + rules, + otherwise: otherwise.unwrap(), + } + } +} + +#[derive(Debug, Clone)] +struct Rule<'a> { + prop: Prop, + op: Op, + rhs: u32, + result: WorkflowResult<'a>, +} + +impl<'a> From<&'a str> for Rule<'a> { + fn from(value: &'a str) -> Self { + let re = Regex::new("^([xmas])([<>])(\\d+):(\\w+)$").unwrap(); + let captures = re.captures(value).unwrap(); + Self { + prop: captures.get(1).unwrap().as_str().into(), + op: captures.get(2).unwrap().as_str().into(), + rhs: captures.get(3).unwrap().as_str().parse().unwrap(), + result: captures.get(4).unwrap().as_str().into(), + } + } +} + +#[derive(Debug, Clone, Copy)] +enum Prop { + X, + M, + A, + S, +} + +impl From<&str> for Prop { + fn from(value: &str) -> Self { + match value { + "x" => Self::X, + "m" => Self::M, + "a" => Self::A, + "s" => Self::S, + _ => panic!("invalid prop {}", value), + } + } +} + +#[derive(Debug, Clone, Copy)] +enum Op { + LessThan, + GreaterThan, +} + +impl From<&str> for Op { + fn from(value: &str) -> Self { + match value { + "<" => Op::LessThan, + ">" => Op::GreaterThan, + _ => panic!("invalid op {}", value), + } + } +} + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +enum WorkflowResult<'a> { + Accept, + Reject, + Workflow(&'a str), +} + +impl<'a> From<&'a str> for WorkflowResult<'a> { + fn from(value: &'a str) -> Self { + match value { + "A" => Self::Accept, + "R" => Self::Reject, + _ => Self::Workflow(value), + } + } +} + +#[derive(Debug, Clone, Copy, Default)] +struct Part { + x: u32, + m: u32, + a: u32, + s: u32, +} + +impl From<&str> for Part { + fn from(value: &str) -> Self { + let values = value + .strip_prefix("{") + .unwrap() + .strip_suffix("}") + .unwrap() + .split(","); + let mut part: Part = Default::default(); + for s in values { + let field = match s.get(0..1) { + Some("x") => &mut part.x, + Some("m") => &mut part.m, + Some("a") => &mut part.a, + Some("s") => &mut part.s, + s => panic!("invalid field {:?}", s), + }; + *field = s.get(2..).unwrap().parse().unwrap(); + } + part + } +} + +impl Part { + fn sum(&self) -> u32 { + self.x + self.m + self.a + self.s + } + + fn get(&self, prop: Prop) -> u32 { + match prop { + Prop::X => self.x, + Prop::M => self.m, + Prop::A => self.a, + Prop::S => self.s, + } + } +} + +impl<'a> Rule<'a> { + fn test(&self, part: &Part) -> bool { + let lhs = part.get(self.prop); + match self.op { + Op::LessThan => lhs < self.rhs, + Op::GreaterThan => lhs > self.rhs, + } + } +} + +impl<'a> Workflow<'a> { + fn run(&self, part: &Part) -> WorkflowResult<'_> { + for rule in self.rules.iter() { + if rule.test(part) { + return rule.result; + } + } + self.otherwise + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +struct PartRange { + x: Range, + m: Range, + a: Range, + s: Range, +} + +impl PartRange { + fn full() -> Self { + Self { + x: 1..4001, + m: 1..4001, + a: 1..4001, + s: 1..4001, + } + } + + fn prop(&self, prop: Prop) -> &Range { + match prop { + Prop::X => &self.x, + Prop::M => &self.m, + Prop::A => &self.a, + Prop::S => &self.s, + } + } + + fn with(&self, prop: Prop, range: Range) -> Self { + let mut copy = self.clone(); + match prop { + Prop::X => copy.x = range, + Prop::M => copy.m = range, + Prop::A => copy.a = range, + Prop::S => copy.s = range, + } + copy + } + + fn product(&self) -> usize { + self.x.len() * self.m.len() * self.a.len() * self.s.len() + } +} + +impl<'a> Rule<'a> { + fn partition_range(&self, range: PartRange) -> Partition { + let prop_range = range.prop(self.prop); + match self.op { + Op::LessThan => { + if self.rhs > prop_range.end { + Partition::matched(range) + } else if self.rhs < prop_range.start { + Partition::failed(range) + } else { + let matched = range.with(self.prop, prop_range.start..self.rhs); + let failed = range.with(self.prop, self.rhs..prop_range.end); + Partition::both(matched, failed) + } + } + Op::GreaterThan => { + if self.rhs < prop_range.start { + Partition::matched(range) + } else if self.rhs > prop_range.end { + Partition::failed(range) + } else { + let matched = range.with(self.prop, (self.rhs + 1)..prop_range.end); + let failed = range.with(self.prop, prop_range.start..(self.rhs + 1)); + Partition::both(matched, failed) + } + } + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +struct Partition { + matched: Option, + failed: Option, +} + +impl Partition { + fn both(matched: PartRange, failed: PartRange) -> Self { + Self { + matched: Some(matched), + failed: Some(failed), + } + } + + fn matched(matched: PartRange) -> Self { + Self { + matched: Some(matched), + failed: None, + } + } + + fn failed(failed: PartRange) -> Self { + Self { + matched: None, + failed: Some(failed), + } + } +} + +impl<'a> Workflow<'a> { + fn partition_range(&self, range: PartRange) -> Vec<(PartRange, WorkflowResult)> { + let mut results = vec![]; + let mut cur = Some(range); + for rule in self.rules.iter() { + let partitioned = rule.partition_range(cur.unwrap()); + if let Some(matched) = partitioned.matched { + results.push((matched, rule.result)); + } + if let Some(failed) = partitioned.failed { + cur = Some(failed); + } else { + cur = None; + break; + } + } + if let Some(r) = cur { + results.push((r, self.otherwise)); + } + results + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_rule_partition() { + let rule = Rule { + prop: Prop::X, + op: Op::LessThan, + rhs: 2000, + result: WorkflowResult::Accept, + }; + let range = PartRange::full(); + assert_eq!( + rule.partition_range(range.clone()), + Partition::both( + range.with(Prop::X, 1..2000), + range.with(Prop::X, 2000..4001) + ) + ); + } + + #[test] + fn test_workflow_partition() { + let workflow: Workflow = "a<2006:qkq,m>2090:A,rfg".into(); + let results = workflow.partition_range(PartRange::full()); + assert_eq!( + results, + vec![ + ( + PartRange { + x: 1..4001, + m: 1..4001, + a: 1..2006, + s: 1..4001, + }, + WorkflowResult::Workflow("qkq") + ), + ( + PartRange { + x: 1..4001, + m: 2090..4001, + a: 2006..4001, + s: 1..4001, + }, + WorkflowResult::Accept + ), + ( + PartRange { + x: 1..4001, + m: 1..2090, + a: 2006..4001, + s: 1..4001, + }, + WorkflowResult::Workflow("rfg") + ) + ] + ); + } +} diff --git a/src/main.rs b/src/main.rs index 1c6533c..7d7a681 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,7 +19,8 @@ mod day15; mod day16; mod day17; mod day18; +mod day19; fn main() { - day18::run(); + day19::run(); }