summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--input/day_19.txt721
-rw-r--r--src/day_19.rs230
-rw-r--r--src/lib.rs1
3 files changed, 952 insertions, 0 deletions
diff --git a/input/day_19.txt b/input/day_19.txt
new file mode 100644
index 0000000..bbc5349
--- /dev/null
+++ b/input/day_19.txt
@@ -0,0 +1,721 @@
+jz{m<1130:R,m>1525:A,R}
+cb{m<1514:R,s<791:A,a>1449:R,xmm}
+cn{x<3563:R,R}
+qb{m>1908:A,a>1204:xmt,x>1001:A,zgl}
+dr{m<3408:A,a>1459:A,x>1500:R,R}
+nfv{a<1625:bbz,A}
+zzt{s>3266:R,s<2765:A,R}
+tk{m<852:gkx,s<2289:fh,A}
+qc{a<1680:R,R}
+klm{x<1453:R,m<2557:A,vms}
+zc{x>2239:sqj,a<2898:cch,s>3063:xjt,sdq}
+pdn{s>626:A,m>982:A,R}
+ld{s>1514:qj,a>1307:lff,jjf}
+rtt{x>377:R,m<2066:R,R}
+njn{a<3023:R,R}
+bvp{x<299:A,R}
+nlt{m>1065:bcz,m>537:kz,fdd}
+mvx{m>3404:R,R}
+hgv{x<842:jh,A}
+slt{s>1572:A,s<1560:R,s<1564:A,A}
+sc{s<212:klm,m<2020:dm,dj}
+pk{a<3727:A,m>3094:A,s<2200:A,A}
+tm{s>2860:R,A}
+vgc{a>1682:R,s<1630:A,s>1790:R,A}
+bcz{s>1401:R,R}
+zzn{a>3467:tmz,x<1855:tdx,a>3236:mrd,R}
+rqm{a>1802:tph,s<670:smf,a<1663:qr,bjc}
+kk{s>3184:A,a<495:R,a<979:sm,A}
+cf{s<694:A,a<3346:R,a<3626:A,R}
+kbj{a<155:A,a>217:A,A}
+pgs{x>1777:dn,a<1485:zj,nlt}
+pxq{s<2821:R,R}
+kb{a>279:fz,s<1340:kbj,A}
+cj{s>1424:A,x<693:R,R}
+tzk{s>1982:kq,a>707:R,m>3530:rnc,R}
+hhs{m<823:A,m<978:A,a>784:A,R}
+bv{m<3670:A,a>3167:R,A}
+mzr{s<2651:A,m<1076:qc,x<1913:trj,cl}
+blk{m<959:sv,ngc}
+mld{x>3498:nqk,a<2675:R,x<3382:R,R}
+jvz{s<1770:hh,A}
+vrt{s>1447:cs,tv}
+jll{a>1102:nlq,s<564:xd,blk}
+ds{s>65:A,R}
+hm{m>2870:vrt,x<755:fm,m<2639:dvh,kzz}
+nng{m>1973:vhf,m>1754:zrg,s<1918:bkj,R}
+gs{a<1718:R,a<1813:A,A}
+gsg{x>2639:zv,x<1180:pn,a>791:dp,kl}
+tv{a>434:R,s>589:A,R}
+dxk{m<1392:A,m<1780:A,m<2119:R,A}
+pcj{s<1860:rvd,m<2944:svg,ngz}
+tr{s<683:A,R}
+sk{a<623:kpv,m<1467:chs,s<1758:cmf,gxk}
+hcn{x>1636:A,x>1527:pfp,fr}
+ftz{a>1173:R,a<1144:R,A}
+ngv{a>3210:A,R}
+vm{m>3344:A,A}
+dz{m>549:R,gp}
+lc{a>3424:R,s<1558:R,A}
+kd{m>524:hhs,jfk}
+fks{s>906:R,m>843:R,A}
+zjm{a>2413:R,a>2248:A,R}
+mrd{x<2013:R,m>355:R,A}
+pfc{m<2998:tn,R}
+dkg{a<3538:A,m<1446:R,s<2234:R,R}
+jf{s>951:A,R}
+bjc{x<857:svs,a>1755:kgb,A}
+ngj{a<3667:A,A}
+gj{s<1385:jll,zmn}
+rm{s<1141:qv,x<2075:bn,s<1260:A,rb}
+xmt{a<1244:A,R}
+xpt{m<2473:A,R}
+tqj{x<2728:gcb,s<441:A,m<2048:R,A}
+sj{x<1411:A,a<3207:R,x<1662:R,A}
+dh{m>1119:rsb,a<584:xcd,kd}
+blr{m>3666:hgm,s>1537:dfn,a>1715:sg,dxr}
+xph{x<748:hzc,A}
+kfn{x<2302:A,m>3341:A,xcp}
+lv{m<2571:A,m>2747:R,a<3098:A,A}
+cfc{x>2067:R,s<2880:A,R}
+xp{s<652:A,a>217:R,R}
+xq{s<2798:gnf,zdt}
+tfm{m<3364:R,s<1765:R,s<3249:dfv,dr}
+kmg{a<3601:R,s>3637:mk,A}
+xbv{s<2834:A,A}
+mp{x>1438:R,x>1353:A,x<1305:pjf,R}
+xlg{m>1027:A,m>475:A,x>1246:A,R}
+bpf{x>2416:mz,s<3723:qrr,R}
+tq{s>2726:A,a>494:R,R}
+gdf{s<2713:vn,x>3160:xm,a<2767:hnk,sdc}
+rc{x<218:vx,m>1912:ffl,njg}
+lvj{s<1150:A,s>1917:R,A}
+jlj{a>2261:R,x<605:A,m>2526:R,A}
+jfq{s>633:vbz,m>895:zl,ph}
+vn{x>2769:A,m<3178:qt,s<2309:A,A}
+dj{s>322:sj,m>3050:A,lv}
+lb{x>1987:xfl,s>3653:R,drz}
+hh{s<1698:R,x>2742:A,a>2883:A,A}
+pmq{x>1219:A,m>2080:A,s>3483:R,R}
+rjz{m<788:A,A}
+gqs{m>3788:A,a>1764:A,R}
+pfb{x<458:R,a<1580:A,R}
+rvl{m<1166:R,R}
+hks{s>3425:njn,A}
+fct{m<2058:pd,a<3495:sjz,m>2897:qh,jq}
+gp{a<2496:R,A}
+zz{s<2447:A,s<2577:A,s>2657:R,A}
+fnk{a>441:R,A}
+bhc{x<898:A,A}
+hf{s>3088:A,gkn}
+gcb{s<619:R,s<813:R,s>941:R,A}
+xh{m>2149:A,s<2018:A,m>1968:A,R}
+xhx{a<3192:A,A}
+pfp{m>1444:R,x<1596:A,A}
+zdt{s<3552:A,a>3231:R,A}
+ngc{x>2725:A,m<1805:A,m>2093:jf,nct}
+smt{m<1117:R,m<1265:A,R}
+qs{s<2886:xhq,a<1477:gt,lvl}
+mh{s<2826:A,s<2902:R,R}
+qr{m>1044:pfb,s>977:A,tbg}
+rxs{s>3190:R,tj}
+rdz{a>1461:cfz,m<1889:A,R}
+pzl{a>2401:A,s>3119:A,R}
+qml{s>1042:R,s<413:A,A}
+cv{a>2676:fjd,m<1617:ch,x<1572:qcq,tr}
+bn{m<3192:A,m>3633:A,m<3455:R,R}
+cch{m<1030:dz,x>1961:tm,m>1755:zzt,gzx}
+nx{a>3225:qm,x>3187:mld,x>2919:kss,drs}
+fpr{x>1048:R,s<381:A,R}
+nrd{x<1510:svv,m>2288:mbf,x<2627:zc,qrx}
+mfv{s>3590:R,m>810:frv,nqt}
+tj{a<2983:A,R}
+trj{x>1857:A,A}
+djc{m>1579:A,a<1132:R,R}
+nct{m>1952:R,s>966:R,s<750:A,R}
+rr{s<2718:A,R}
+gk{a<3634:A,s<2660:R,a>3808:A,R}
+zpc{s>949:R,R}
+sdc{m<2929:vvj,x<2422:bz,s>2977:mvx,mh}
+lm{a<728:A,s>2103:hzl,x<1415:A,R}
+cl{x>1961:R,s>3394:R,R}
+rz{s>430:R,s<350:A,x>2387:R,R}
+fb{x<513:jb,vh}
+lz{m>1159:A,R}
+cbq{s<3772:mf,m>2520:R,cml}
+zf{s<2783:cdc,s>3290:gv,cvc}
+bs{x>1813:hs,qx}
+nkf{x<1020:A,A}
+nj{s<1723:A,A}
+sqj{x<2403:rxs,kbv}
+lr{x<892:R,x>979:R,A}
+fh{a<1260:R,a>1658:R,m>1716:A,A}
+ql{x>822:A,a<2607:R,a>2718:R,R}
+vj{s>2255:zg,a>235:A,x>1528:mzv,R}
+rvd{x<2434:mgm,A}
+zv{a>1266:qbq,vz}
+gkx{a<659:R,R}
+kv{a>526:A,vb}
+mnx{m<2985:R,s<3292:A,m<3437:R,R}
+btx{x>1493:A,a>518:A,A}
+pc{s>1804:mmd,A}
+kz{x>1636:tp,s<2458:ldm,sb}
+njg{s>1545:xc,x>420:R,a>1188:ljj,bvp}
+tmz{a<3696:R,s>2857:A,x<1819:R,A}
+nrs{x>1257:hqz,vkh}
+tkk{m<1432:A,a<1514:R,R}
+dfv{x<1452:R,m>3408:R,s<2343:A,A}
+fpd{x<663:A,A}
+qj{x>703:R,fnq}
+pbp{a<2964:slg,a>3564:cmx,x<3424:xq,ngv}
+vb{m<3608:A,A}
+kq{m<3582:R,A}
+rcf{a<1241:hb,gs}
+gnp{a>3435:vp,a<3116:xrr,s<3647:tzz,cbq}
+hzk{a>1167:ndj,frj}
+gnf{s>2325:R,m>1553:A,x<3097:R,R}
+zx{x<1638:R,a<2394:A,x>2870:R,A}
+vv{s>1853:A,A}
+scl{x<1836:R,m>1491:R,s>510:A,A}
+qrx{m>897:pbp,m>509:sp,nx}
+kgb{s<908:A,A}
+vtq{s<1508:scl,m>894:kbk,A}
+zrg{m>1886:A,s<2418:R,R}
+pp{s<3534:R,R}
+gd{a>3604:A,R}
+cvc{m>806:cn,m<509:A,A}
+zgq{a<134:kxr,m>3404:vj,qpp}
+gq{m>1542:fpr,s<417:R,a<1224:R,vxm}
+kvn{s>1252:R,a<1415:R,x<3671:R,R}
+kl{x>2054:pcj,a<374:zgq,m<3243:tx,jx}
+vhf{x>1552:R,x<1458:A,a>1362:R,A}
+ln{a>1366:R,a<1333:A,A}
+kxr{m>3326:A,a<53:rl,s<2161:A,ckt}
+xjt{x<1861:md,x<2089:lb,x<2145:dvx,xr}
+tf{a<3198:R,x<3136:R,m>3856:A,A}
+tp{a>1646:A,m>827:R,R}
+mgm{s<954:A,a<372:R,A}
+fqx{x<2429:R,nv}
+dm{s>306:xhx,m<1121:A,a<3274:A,A}
+zg{s<2954:R,a>262:A,R}
+km{s<631:A,s>814:A,m<3329:A,A}
+znt{m<2868:R,a>565:cpz,a>495:A,xmr}
+clp{m>661:R,m<227:A,x<634:R,A}
+lf{x<913:nt,s>469:cv,sc}
+dfn{a<1749:R,s>2899:R,a<1881:A,A}
+nn{a<830:A,s>2704:R,R}
+fs{s<3259:A,m<1958:jz,m>3070:bv,R}
+ckt{x>1743:R,R}
+xht{s<3170:A,x>591:R,A}
+jt{m<1776:R,s<366:R,A}
+jjf{s<992:A,x>579:A,m<3254:tbc,A}
+cpb{a>1546:A,s>729:A,R}
+dvh{x>1002:xpt,m>2476:R,bpm}
+mmd{a>3211:A,s<1880:A,a<2704:R,R}
+cmk{a<1735:ssl,s<2868:xh,xph}
+rd{s<940:R,m<2640:R,m<3224:R,A}
+lbh{x<653:hc,vs}
+xc{m<1631:A,m>1750:A,x>428:A,R}
+sm{x>3170:R,a>693:R,s>2638:A,A}
+gxk{m<1835:nn,vc}
+qmb{a<2460:R,m>1070:A,A}
+chs{x<223:rkn,m<928:fcn,m<1228:vr,A}
+mk{a<3805:A,a>3930:A,m>2933:A,A}
+zj{a<1302:hcn,a>1409:qzq,m<1496:jrv,nng}
+bkt{x<1853:R,R}
+scc{x>2294:R,R}
+cmf{m>1803:R,m<1580:R,m>1692:R,sr}
+hts{a>1429:R,R}
+lvl{s<3554:R,m>2002:A,a<1508:A,A}
+txs{a>913:A,s>1636:tdd,A}
+nb{m<827:R,a<1466:A,A}
+xvr{a>2259:A,x<1201:A,x<1411:R,A}
+msx{s<2668:R,m>3888:R,A}
+xcd{m>437:A,hk}
+fhm{m>1527:fp,pzm}
+pxl{x<624:A,a<2360:xt,x<1210:ql,A}
+nqk{s<3179:R,a<2566:R,A}
+tn{a>1612:A,m<2773:A,s<2628:A,R}
+fd{x<2253:tl,a<3344:hl,x<3302:R,A}
+npb{x>1358:pgs,a>1533:mdp,a>1277:lbh,mrb}
+xmr{a<436:R,a<461:R,a<475:A,R}
+ngh{s<3462:A,s<3710:R,x<871:R,R}
+kpv{a<370:A,a<502:hdx,m>1085:R,qqv}
+mdp{s<1379:rqm,m<1176:snr,m>1856:cmk,fb}
+bpm{s>2451:A,x<911:A,a<321:A,R}
+hk{a<232:A,R}
+sp{s>2768:hks,a<3323:zz,dhx}
+fgg{a<3832:A,a>3936:R,R}
+xrr{x<1099:bgd,m>2402:A,dxk}
+vmz{s<379:fll,m>2659:km,a>2184:pdn,mt}
+xxf{s<1512:btx,R}
+xf{s>1643:A,s<668:R,m<396:A,R}
+vp{x>1154:A,m>2384:pp,x>975:A,A}
+qsf{a>3217:A,s<2804:A,R}
+nrv{m>1060:mj,hgv}
+mct{m>1227:A,A}
+zzj{s<1511:A,a>2404:A,R}
+snr{a>1680:vmf,nfv}
+sq{m<2910:A,x<3333:A,R}
+gt{s>3266:R,a>1453:A,A}
+sv{a<728:R,R}
+ccq{s<2309:A,cvx}
+gr{m<712:A,A}
+vk{s<318:A,m>1499:R,A}
+ll{s>2321:A,R}
+sql{s>368:A,s>220:R,A}
+vkh{x>497:pln,sk}
+slf{m>2641:R,s>154:rvl,m>1743:A,ds}
+hc{x>334:drj,cqt}
+csd{s<1936:rdr,nrd}
+sb{m<808:R,a>1725:R,x>1493:A,A}
+qx{x>1731:A,R}
+tbg{a<1602:R,A}
+ldm{m>870:R,m<674:R,m<749:A,R}
+cm{a<3648:R,a>3781:R,R}
+xmm{s<1180:R,a<1269:R,x>1873:A,R}
+fjd{x<1497:cf,m<1719:R,qqg}
+mzv{s>766:R,R}
+cdc{a<769:A,a<1371:dx,s<2044:vgc,A}
+td{s>169:A,x>3311:R,s<159:A,A}
+tx{m<2676:xxf,x<1648:znt,m>2969:bs,nk}
+fz{a<533:A,x>185:R,R}
+zl{a>3283:bd,A}
+cs{x>846:R,A}
+dx{s>1904:A,a<977:A,s<1698:R,R}
+zmm{s>2201:vll,A}
+rt{a>2680:R,m>3090:A,A}
+pv{m>3089:R,x>2756:tjc,A}
+fdd{x<1586:mhn,s<1529:mbk,rqn}
+drz{m<933:A,R}
+ptc{m>1663:A,x>2416:A,A}
+hqz{x<1692:gdz,s>2642:dh,zt}
+zt{a>701:txs,vtq}
+qt{m<2751:R,R}
+hb{s>2490:R,a>1045:A,a<910:R,A}
+pjf{a<146:A,a<256:R,a>335:R,R}
+sg{x<2038:A,x<2343:A,xnl}
+drs{s<2892:hr,s>3296:A,m<171:R,grl}
+tdd{m<1564:R,s<2112:R,A}
+pq{m>3202:kb,bq}
+md{a<3610:bp,a<3784:lq,a>3863:R,lz}
+gdz{a<391:mp,lm}
+gkn{x>971:R,s<2386:R,A}
+svs{m>1020:A,R}
+jmx{a<2547:A,a>2739:A,R}
+nk{m>2801:A,a>569:bkt,R}
+cmx{a<3723:A,a<3867:A,x<3269:A,kvz}
+glr{s>1592:hhc,s<1383:nkr,a>2851:nbc,fhm}
+ch{x>1440:kjt,a<2305:xlg,x>1201:R,qmb}
+ml{a>135:A,s<2160:A,m>3684:A,A}
+qzq{a>1448:A,hts}
+svv{a<2918:pt,x<863:rh,s>3293:gnp,fct}
+fll{m<1378:A,s<245:A,R}
+cr{a<3596:A,A}
+bz{m>3568:R,x<2088:R,R}
+hv{x<811:R,A}
+drj{m<1041:xf,x<504:R,s>2235:xht,zpc}
+rlh{m<3343:kmg,a>3537:bpf,m>3604:zh,dg}
+kbk{m<1804:A,R}
+kx{s<973:A,s>1717:A,s>1281:R,A}
+qq{s<2698:R,s>3280:R,a<1743:A,R}
+xcp{s>2127:A,R}
+kss{m<204:A,x<3028:pxq,A}
+hr{s<2329:A,R}
+zgl{m<1608:R,a<1146:R,a>1182:A,A}
+qqv{a<555:A,A}
+hd{m<3050:ccq,m<3233:rcf,x<1827:tfm,kfn}
+vs{a<1409:khx,m<1355:fl,s>2101:qs,rdz}
+ljj{x>303:A,m>1612:R,A}
+db{x<1033:A,x>1091:R,R}
+in{a>1968:csd,hsh}
+ss{s<3370:R,a<3205:R,A}
+vbz{m>1302:cr,s<849:A,fks}
+nbc{s<1493:fqx,s<1540:fd,m>2158:ndh,dhk}
+fnq{a>1204:R,m>3329:A,A}
+rst{x>3196:crr,R}
+fm{a>445:A,x<587:R,m>2640:A,R}
+lq{s<3441:A,x>1645:A,x>1566:A,R}
+pln{m>1004:ll,zmm}
+ljx{x>927:ht,x<650:hz,rxp}
+khx{s<2513:R,A}
+np{a>3491:R,x>2187:A,R}
+kch{m<2868:A,R}
+fdj{x<905:R,x>1172:R,s>311:A,R}
+nqt{x<2546:R,x>2904:A,A}
+dhx{x<3174:gr,cm}
+jh{m>437:A,R}
+fl{a>1489:A,x<1038:lr,R}
+hgm{s<1614:mkk,s>3134:gqs,x>1932:R,A}
+pd{x<1168:db,m<1270:R,m<1731:A,gk}
+qpp{s<1857:xp,R}
+fp{m>2729:zzj,A}
+vr{s>2507:R,a>806:R,a>703:R,A}
+slg{m>1452:A,x<3519:kbf,s>3018:smt,zjm}
+qm{x>3085:A,m<258:bnz,A}
+xt{x<996:R,x<1334:A,A}
+gv{x>3745:A,A}
+gf{a<2893:xhf,m<2135:jfq,fdx}
+pb{x<1181:R,m>645:R,R}
+pj{s<2532:A,R}
+rfz{s<3830:R,x>2928:A,A}
+xm{s<2904:qsf,A}
+rl{a>31:A,s<1819:A,A}
+qqg{a<3386:A,a>3729:A,A}
+xnl{m<3538:R,a>1834:R,R}
+lsr{x<2294:R,A}
+mg{m<603:A,s>387:R,A}
+kvz{x>3584:R,s<2679:A,m>1759:A,R}
+bnz{x<2830:A,R}
+qkm{s<3253:R,s<3426:A,m<1092:R,R}
+mrb{s>2443:nrv,m<1235:pdp,x>566:chv,rc}
+mb{x<3099:fgg,R}
+mz{x>3338:R,s<3733:R,A}
+mbf{s<3205:gdf,a<3065:fvr,rlh}
+vxm{s>652:R,x<1053:R,R}
+nkr{m<1579:rx,rm}
+rb{m<2452:R,R}
+pzm{s>1479:jmx,x>2270:A,pb}
+cg{x>1929:dkg,cz}
+ngz{m>3625:scc,m<3246:xl,hzr}
+rh{a<3397:fs,x<361:vsk,ngj}
+tl{m>1877:A,R}
+bgl{a>3615:R,pgh}
+rnc{a<650:A,R}
+pt{m<2458:hf,pxl}
+cml{a>3274:A,A}
+lg{a<1305:R,s<577:sql,A}
+gnx{x<2526:A,x>2614:A,a<221:R,R}
+pdp{m<768:hv,a>1195:jg,bng}
+hhc{x<1965:pc,m<2232:jvz,cc}
+kvg{m<1512:R,a>2150:A,a<2051:R,R}
+xhf{a<2418:vmz,a<2622:bxt,tqj}
+bxt{x>3111:A,A}
+tb{s>3069:mfv,tk}
+khm{m<2716:A,m<2852:R,R}
+zmn{x<3246:tb,zf}
+nt{s<362:slf,rv}
+jx{a<608:kv,tzk}
+kjt{m>792:R,x<1666:R,R}
+bq{x<243:A,lt}
+cqt{x>154:vv,s>1726:pj,A}
+mkk{x<1861:A,x<2359:A,A}
+bkj{x<1588:A,s>1151:A,R}
+vsk{x>183:R,m<2303:R,s<2705:pk,mnx}
+hz{s<1723:A,m<3761:R,a>375:msx,R}
+dp{m<3442:hd,a>1506:blr,hzk}
+vz{s>1634:kk,sq}
+mhn{x<1475:A,a>1746:R,R}
+pn{a>712:ld,x<469:pq,m>3443:ljx,hm}
+dxr{x>1995:lsr,a>1602:A,m<3575:R,R}
+sdq{s<2453:cg,m>1050:bgl,m<538:zzn,mjt}
+cc{a>3295:nj,x>2897:rt,A}
+mt{x>3318:A,s>631:A,A}
+ph{m>353:mg,R}
+tph{x>847:R,s>873:R,R}
+dhk{x<2418:gd,s<1574:lc,R}
+dg{m>3485:A,bj}
+thx{s<875:R,x<782:R,R}
+jb{m<1559:R,qq}
+mjt{a>3626:rr,R}
+vll{x<911:A,a>479:A,s>3290:A,A}
+xhm{m>575:A,x<203:A,A}
+tjc{s>3470:R,x>3330:R,A}
+chv{s>858:qb,m>1819:bhc,a<1190:cfb,gq}
+dn{s<1737:cb,mzr}
+hzc{x>440:R,R}
+ht{a>377:nkf,A}
+rx{a<2921:zx,R}
+crr{m>2975:A,m<2744:A,a<1683:R,R}
+rsb{a<592:A,R}
+hs{m<3096:A,A}
+mj{m>1844:ftz,m<1359:mct,m<1587:A,ngh}
+ndh{a<3604:slt,kch}
+rqn{m>216:A,s>3141:A,R}
+kbf{s<3018:R,m<1258:R,R}
+bd{m<1474:A,a>3714:A,A}
+ffl{s>1281:R,rtt}
+gzx{a<2355:kvg,R}
+jg{m>1048:fpd,s<1154:rdt,A}
+nv{s<1428:A,m<2015:R,A}
+rkn{a>920:A,A}
+bbz{m>402:A,A}
+ssl{a<1655:A,m>2085:R,R}
+frj{s<2075:A,R}
+dqb{s<151:A,s<203:td,xn}
+kzz{x<1033:A,fnk}
+cfb{a<1148:djc,s>504:qzl,a>1162:fdj,R}
+sjz{x<1092:flc,a>3151:A,vm}
+hdx{x<297:R,x<409:R,R}
+xhq{m<2010:A,s<2583:A,x<1028:A,A}
+hzl{a>952:R,a>826:A,A}
+lff{x>538:thx,x<217:cpb,A}
+rdt{x>874:A,s<505:A,A}
+rcq{x>2767:A,m<1262:rz,s<354:ptc,gnx}
+hjg{x>2774:R,A}
+msl{s<2766:A,x>1387:A,m<3157:R,R}
+vms{a>2956:R,m>3255:R,A}
+bgd{s>3713:A,a<2996:R,a>3064:A,A}
+frv{x<2766:R,a<1277:R,A}
+jq{s<2826:A,a<3715:A,m<2354:A,R}
+rxp{a<273:ml,x<755:R,s<1934:A,tq}
+xn{x<3075:R,a<276:R,m>1182:R,R}
+mbk{m>274:R,x>1672:R,R}
+qcq{s<807:xvr,rd}
+flc{x>974:R,s>2432:R,R}
+dvx{m<1246:rjz,m<1618:A,A}
+xl{s>2586:A,a<327:R,x>2276:R,R}
+gmn{a<1848:R,a>1896:A,x<1154:A,A}
+qh{m>3621:A,x>1266:msl,A}
+fcn{m>449:A,a<811:R,R}
+pgh{s>2815:R,A}
+cvx{m>2737:A,s<3404:A,a>1405:R,R}
+xs{m<3821:R,s<3670:R,s>3817:A,A}
+vx{a>1211:kx,lvj}
+tdx{m>323:A,s>2691:A,A}
+rdr{s>1007:glr,x<2010:lf,gf}
+fr{m>950:R,s>1932:R,x<1468:A,A}
+qrr{s<3379:R,R}
+kbv{m<1080:A,s<2990:A,s>3453:A,R}
+hzr{a>482:A,x<2422:A,A}
+cfz{s>701:R,m>1918:A,x>1053:R,A}
+zh{a<3366:tf,x<2572:A,xs}
+bkg{x<3019:A,s>1100:kvn,x<3457:tkk,nb}
+vh{m>1610:R,m<1448:R,x<842:xbv,stp}
+cpz{x>1347:A,a>662:R,A}
+sr{m>1651:A,R}
+tbc{x<323:R,x>451:A,s>1194:A,R}
+hl{m<2414:A,m<3435:A,a>3162:A,A}
+vvj{s<2946:A,A}
+nlq{s>915:bkg,a<1629:lg,dhs}
+fvr{s>3725:ffg,pv}
+fbz{x<2717:vk,x<3476:R,R}
+mf{s>3701:A,R}
+grl{x>2749:R,R}
+ndj{a<1301:A,s>2086:A,R}
+cz{a<3296:A,s>2156:R,R}
+lt{x<364:A,a<350:R,s>1979:R,R}
+ffg{m>3208:R,rfz}
+bj{a<3365:A,R}
+vc{x>324:A,x<187:A,x>276:A,R}
+qzl{a<1163:A,m>1434:A,x>903:R,R}
+vmf{x>760:gmn,x<457:xhm,A}
+rv{a<2720:jlj,R}
+jfk{m<283:R,R}
+hnk{s<3018:cfc,m>3049:pzl,m<2645:R,A}
+dhs{a<1766:A,m>1060:R,a<1896:A,A}
+jrv{m>576:ln,m>225:R,A}
+hsh{m>2359:gsg,x>2051:gj,a>1115:npb,nrs}
+tzz{a>3313:pmq,s>3494:A,ss}
+svg{x>2403:khm,A}
+xd{a>443:fbz,s>238:rcq,dqb}
+qbq{s>1390:pfc,rst}
+xfl{m>1202:R,A}
+stp{x>1136:R,a>1680:R,R}
+bng{a<1166:cj,a>1181:qml,s<1111:R,A}
+smf{m<1106:clp,jt}
+qv{s<1053:R,R}
+fdx{a>3550:mb,hjg}
+xr{s>3541:np,a>3529:R,a<3235:R,qkm}
+bp{a>3158:R,s<3564:R,m<1367:R,R}
+
+{x=136,m=12,a=1743,s=3439}
+{x=486,m=909,a=591,s=576}
+{x=1475,m=1173,a=358,s=353}
+{x=790,m=465,a=12,s=84}
+{x=2300,m=2673,a=762,s=1829}
+{x=469,m=34,a=118,s=683}
+{x=794,m=106,a=2553,s=679}
+{x=571,m=385,a=312,s=201}
+{x=1905,m=116,a=53,s=25}
+{x=629,m=191,a=67,s=918}
+{x=247,m=238,a=1053,s=493}
+{x=306,m=1804,a=582,s=229}
+{x=1353,m=272,a=23,s=188}
+{x=540,m=629,a=58,s=303}
+{x=622,m=181,a=150,s=2014}
+{x=283,m=2647,a=1900,s=1582}
+{x=520,m=146,a=2444,s=858}
+{x=645,m=406,a=24,s=4}
+{x=826,m=1598,a=766,s=605}
+{x=339,m=3439,a=253,s=1454}
+{x=101,m=397,a=106,s=1189}
+{x=646,m=1005,a=2266,s=1288}
+{x=465,m=1093,a=21,s=24}
+{x=3222,m=2706,a=2295,s=4}
+{x=257,m=2843,a=78,s=450}
+{x=54,m=2422,a=1447,s=2626}
+{x=608,m=1141,a=1,s=212}
+{x=48,m=862,a=3,s=421}
+{x=246,m=1065,a=2259,s=56}
+{x=55,m=1706,a=715,s=196}
+{x=694,m=938,a=2669,s=43}
+{x=84,m=1692,a=2816,s=110}
+{x=1636,m=1140,a=1963,s=1801}
+{x=380,m=2452,a=2373,s=758}
+{x=1153,m=175,a=403,s=1087}
+{x=80,m=137,a=2735,s=128}
+{x=1720,m=1894,a=1103,s=150}
+{x=605,m=2624,a=850,s=3381}
+{x=786,m=543,a=1437,s=296}
+{x=2811,m=184,a=1944,s=3256}
+{x=1378,m=3598,a=2841,s=388}
+{x=864,m=129,a=2249,s=1544}
+{x=683,m=1157,a=73,s=2060}
+{x=2365,m=899,a=2083,s=1778}
+{x=1256,m=44,a=204,s=846}
+{x=197,m=762,a=1004,s=201}
+{x=377,m=1039,a=1875,s=354}
+{x=47,m=1276,a=1290,s=1325}
+{x=496,m=11,a=991,s=776}
+{x=191,m=1525,a=2141,s=155}
+{x=2164,m=320,a=11,s=1256}
+{x=1816,m=100,a=1033,s=1568}
+{x=683,m=228,a=127,s=2152}
+{x=2299,m=853,a=1551,s=110}
+{x=93,m=597,a=940,s=2034}
+{x=324,m=12,a=557,s=802}
+{x=91,m=900,a=38,s=601}
+{x=1971,m=1553,a=59,s=119}
+{x=44,m=1669,a=5,s=179}
+{x=2879,m=575,a=1959,s=1014}
+{x=29,m=32,a=1699,s=161}
+{x=2861,m=2776,a=2525,s=104}
+{x=2463,m=3062,a=27,s=82}
+{x=2267,m=1574,a=646,s=398}
+{x=452,m=837,a=730,s=2998}
+{x=3549,m=126,a=2428,s=953}
+{x=47,m=1816,a=372,s=679}
+{x=5,m=576,a=309,s=2453}
+{x=708,m=1758,a=470,s=2915}
+{x=471,m=15,a=17,s=1302}
+{x=1454,m=453,a=246,s=839}
+{x=1419,m=2618,a=1414,s=17}
+{x=247,m=506,a=13,s=1531}
+{x=90,m=597,a=52,s=293}
+{x=56,m=1704,a=1099,s=35}
+{x=150,m=567,a=11,s=2840}
+{x=251,m=1036,a=273,s=1832}
+{x=1084,m=2319,a=67,s=3403}
+{x=2718,m=1315,a=1882,s=563}
+{x=354,m=307,a=1513,s=1350}
+{x=1091,m=1441,a=860,s=1687}
+{x=1667,m=572,a=651,s=377}
+{x=259,m=2680,a=197,s=2609}
+{x=1149,m=2014,a=916,s=1560}
+{x=1789,m=2826,a=3588,s=995}
+{x=1067,m=143,a=634,s=360}
+{x=1631,m=30,a=727,s=930}
+{x=576,m=2741,a=689,s=2065}
+{x=595,m=56,a=1330,s=547}
+{x=3399,m=673,a=6,s=796}
+{x=999,m=1225,a=442,s=170}
+{x=2226,m=73,a=2319,s=114}
+{x=11,m=2439,a=25,s=468}
+{x=795,m=1216,a=1778,s=543}
+{x=190,m=41,a=1122,s=302}
+{x=348,m=3051,a=2817,s=1098}
+{x=668,m=2073,a=1477,s=93}
+{x=764,m=72,a=76,s=1241}
+{x=490,m=125,a=1816,s=1495}
+{x=542,m=1451,a=1058,s=1201}
+{x=583,m=92,a=2232,s=2122}
+{x=513,m=2250,a=328,s=72}
+{x=1507,m=181,a=2049,s=595}
+{x=3163,m=2065,a=1061,s=15}
+{x=474,m=44,a=906,s=1042}
+{x=1771,m=22,a=1351,s=937}
+{x=1531,m=9,a=196,s=673}
+{x=935,m=1222,a=492,s=75}
+{x=48,m=1196,a=2508,s=687}
+{x=900,m=1795,a=249,s=518}
+{x=1915,m=2848,a=334,s=1253}
+{x=357,m=1425,a=2655,s=2906}
+{x=459,m=2087,a=2398,s=170}
+{x=3296,m=2524,a=925,s=2248}
+{x=1628,m=1067,a=914,s=1968}
+{x=808,m=194,a=856,s=194}
+{x=164,m=1043,a=1152,s=2619}
+{x=317,m=1428,a=482,s=1802}
+{x=2146,m=49,a=2448,s=220}
+{x=800,m=795,a=261,s=37}
+{x=1418,m=1594,a=1084,s=860}
+{x=739,m=167,a=778,s=772}
+{x=1849,m=801,a=3420,s=968}
+{x=38,m=1697,a=2372,s=601}
+{x=2802,m=562,a=1807,s=2478}
+{x=1679,m=585,a=273,s=1445}
+{x=2088,m=2890,a=1742,s=580}
+{x=680,m=41,a=443,s=139}
+{x=482,m=3382,a=1255,s=1045}
+{x=1391,m=594,a=1804,s=727}
+{x=1943,m=10,a=1521,s=1627}
+{x=700,m=277,a=589,s=645}
+{x=336,m=831,a=1916,s=1159}
+{x=1880,m=507,a=939,s=97}
+{x=229,m=1219,a=381,s=2488}
+{x=309,m=406,a=232,s=336}
+{x=287,m=1067,a=208,s=1814}
+{x=49,m=188,a=60,s=410}
+{x=532,m=5,a=1026,s=351}
+{x=1305,m=998,a=1425,s=2385}
+{x=58,m=661,a=201,s=1160}
+{x=2082,m=101,a=338,s=7}
+{x=2116,m=935,a=1350,s=510}
+{x=635,m=630,a=1972,s=580}
+{x=2127,m=2729,a=793,s=314}
+{x=179,m=595,a=1410,s=1556}
+{x=185,m=67,a=385,s=516}
+{x=397,m=682,a=165,s=325}
+{x=698,m=164,a=1978,s=1274}
+{x=634,m=1303,a=193,s=263}
+{x=1370,m=1521,a=507,s=309}
+{x=548,m=722,a=862,s=1297}
+{x=231,m=1729,a=83,s=949}
+{x=493,m=795,a=1180,s=4}
+{x=1514,m=2217,a=1100,s=2084}
+{x=1540,m=996,a=1310,s=102}
+{x=1050,m=270,a=3141,s=319}
+{x=1235,m=192,a=215,s=543}
+{x=30,m=939,a=562,s=3}
+{x=3082,m=1567,a=1772,s=3}
+{x=219,m=818,a=1128,s=1021}
+{x=268,m=727,a=721,s=2141}
+{x=246,m=82,a=49,s=2060}
+{x=592,m=1388,a=881,s=743}
+{x=1633,m=539,a=200,s=1369}
+{x=157,m=269,a=2536,s=286}
+{x=263,m=202,a=1486,s=2792}
+{x=785,m=857,a=1712,s=1807}
+{x=2015,m=847,a=58,s=470}
+{x=877,m=967,a=175,s=193}
+{x=1347,m=855,a=2663,s=160}
+{x=300,m=1676,a=631,s=787}
+{x=92,m=2002,a=1668,s=789}
+{x=63,m=2179,a=993,s=1453}
+{x=50,m=589,a=161,s=75}
+{x=1990,m=1552,a=370,s=1648}
+{x=939,m=1061,a=173,s=29}
+{x=1129,m=1580,a=531,s=615}
+{x=1243,m=635,a=699,s=1815}
+{x=1657,m=25,a=1837,s=1161}
+{x=2082,m=176,a=2611,s=2753}
+{x=715,m=1680,a=1041,s=804}
+{x=268,m=66,a=594,s=147}
+{x=932,m=233,a=251,s=75}
+{x=237,m=10,a=851,s=483}
+{x=329,m=1860,a=149,s=2325}
+{x=1349,m=378,a=1359,s=2744}
+{x=38,m=1517,a=18,s=2744}
+{x=1494,m=451,a=339,s=285}
+{x=824,m=319,a=127,s=475}
+{x=669,m=2,a=251,s=91}
+{x=755,m=2149,a=670,s=2561}
+{x=711,m=1768,a=2343,s=457}
+{x=900,m=1017,a=2680,s=86}
+{x=679,m=1775,a=17,s=1078}
+{x=250,m=1054,a=2618,s=364}
+{x=2164,m=3,a=689,s=1102}
+{x=310,m=1841,a=803,s=1122}
+{x=1975,m=121,a=546,s=1702}
+{x=612,m=1946,a=2077,s=279}
diff --git a/src/day_19.rs b/src/day_19.rs
new file mode 100644
index 0000000..db42655
--- /dev/null
+++ b/src/day_19.rs
@@ -0,0 +1,230 @@
+use std::{cmp::Ordering, collections::HashMap, ops::ControlFlow, str::FromStr};
+
+use crate::{Problem, Solution};
+
+pub struct Day19;
+
+impl Problem for Day19 {
+ const DAY: u8 = 19;
+
+ const INPUT: &'static str = include_str!("../input/day_19.txt");
+}
+
+impl Solution for Day19 {
+ type Answer1 = usize;
+
+ type Answer2 = usize;
+
+ fn part_1(input: &str) -> anyhow::Result<Self::Answer1> {
+ let (workflows, parts) = input.split_once("\n\n").unwrap();
+ let workflows = workflows
+ .lines()
+ .map(parse_workflow)
+ .try_collect::<HashMap<[char; 3], Workflow>>()
+ .unwrap();
+
+ let parts = parts
+ .lines()
+ .map(parse_part)
+ .try_collect::<Vec<[usize; 4]>>()?;
+
+ let mut next = ['i', 'n', ' '];
+ let mut sum = 0;
+
+ for part in parts {
+ while let Some(workflow) = workflows.get(&next) {
+ if let ControlFlow::Continue(n) = workflow.process_part(&part) {
+ next = n
+ } else {
+ sum += part.iter().sum::<usize>()
+ }
+ }
+ }
+
+ Ok(sum)
+ }
+
+ fn part_2(input: &str) -> anyhow::Result<Self::Answer2> {
+ todo!()
+ }
+}
+
+fn parse_workflow(s: &str) -> anyhow::Result<([char; 3], Workflow)> {
+ let (name, rules) = s
+ .split_once('{')
+ .ok_or_else(|| anyhow::format_err!("Failed to parse workflow: {s}"))?;
+
+ let mut iter = name.chars();
+
+ let name = [
+ iter.next().unwrap(),
+ iter.next().unwrap_or(' '),
+ iter.next().unwrap_or(' '),
+ ];
+
+ Ok((name, rules.trim_end_matches('}').parse()?))
+}
+
+fn parse_part(s: &str) -> anyhow::Result<[usize; 4]> {
+ s.strip_prefix('{')
+ .and_then(|s| s.strip_suffix('}'))
+ .ok_or(anyhow::format_err!("Invalid part format: {s}"))?
+ .split(',')
+ .map(|s| s.trim_start_matches(['x', 'm', 'a', 's', '=']).parse())
+ .try_collect::<Vec<usize>>()?
+ .try_into()
+ .map_err(|_| anyhow::format_err!("Failed to parse part: {s}"))
+}
+
+fn parse_output(s: &str) -> anyhow::Result<Output> {
+ Ok(match s {
+ "A" => ControlFlow::Break(true),
+ "R" => ControlFlow::Break(false),
+ w if (2..=3).contains(&w.len()) => {
+ let mut iter = w.chars();
+
+ ControlFlow::Continue([
+ iter.next().unwrap(),
+ iter.next().unwrap_or(' '),
+ iter.next().unwrap_or(' '),
+ ])
+ }
+ e => Err(anyhow::format_err!("Invalid output value: {e}"))?,
+ })
+}
+
+type Part = [usize; 4];
+type Label = [char; 3];
+type Output = ControlFlow<bool, Label>;
+
+struct Workflow {
+ rules: Vec<Rule>,
+ last: ControlFlow<bool, Label>,
+}
+
+impl Workflow {
+ fn process_part(&self, part: &Part) -> ControlFlow<bool, Label> {
+ self.rules
+ .iter()
+ .find_map(|r| r.process_part(part))
+ .unwrap_or(self.last)
+ }
+}
+
+impl FromStr for Workflow {
+ type Err = anyhow::Error;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let mut iter = s.split(',');
+
+ let last = iter
+ .next_back()
+ .ok_or_else(|| anyhow::format_err!("Workflow contains no rules: {s}"))
+ .and_then(parse_output)?;
+
+ let rules = iter.map(|s| s.parse()).try_collect::<Vec<Rule>>()?;
+
+ Ok(Self { rules, last })
+ }
+}
+
+struct Rule {
+ field: u8,
+ cmp: Ordering,
+ value: usize,
+ output: ControlFlow<bool, Label>,
+}
+
+impl Rule {
+ fn process_part(&self, part: &[usize; 4]) -> Option<ControlFlow<bool, Label>> {
+ (self.value.cmp(&part[self.field as usize]) == self.cmp).then_some(self.output)
+ }
+}
+
+impl FromStr for Rule {
+ type Err = anyhow::Error;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ let (cond, output) = s
+ .split_once(':')
+ .ok_or_else(|| anyhow::format_err!("Failed to parse rule: {s}"))?;
+
+ let mut iter = cond.chars();
+
+ let field = match iter.next() {
+ Some('x') => 0,
+ Some('m') => 1,
+ Some('a') => 2,
+ Some('s') => 3,
+ f => anyhow::bail!("Failed to parse rule field: {f:?}"),
+ };
+
+ let cmp = match iter.next() {
+ Some('<') => Ordering::Less,
+ Some('=') => Ordering::Equal,
+ Some('>') => Ordering::Greater,
+ c => Err(anyhow::format_err!("Failed to parse comparison: {c:?}"))?,
+ };
+
+ let value = iter.collect::<String>().parse()?;
+
+ Ok(Self {
+ field,
+ cmp,
+ value,
+ output: parse_output(output)?,
+ })
+ }
+}
+
+#[repr(u8)]
+enum Catagory {
+ X,
+ M,
+ A,
+ S,
+}
+
+impl FromStr for Catagory {
+ type Err = anyhow::Error;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ Ok(match s {
+ "x" => Self::X,
+ "m" => Self::M,
+ "a" => Self::A,
+ "s" => Self::S,
+ s => anyhow::bail!("Failed to parse field: {s}"),
+ })
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ const INPUT: &str = indoc::indoc! {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}
+ "#};
+
+ #[test]
+ fn test_part_1() -> anyhow::Result<()> {
+ Ok(assert_eq!(19114, Day19::part_1(INPUT)?))
+ }
+}
diff --git a/src/lib.rs b/src/lib.rs
index ce7331a..d1a4aec 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -26,6 +26,7 @@ pub mod day_15;
pub mod day_16;
pub mod day_17;
pub mod day_18;
+pub mod day_19;
pub mod printer;
pub use printer::Printer;