From 215b52ff63010f92634643ce504b81857b157b2d Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Tue, 19 Dec 2023 09:52:57 +0100 Subject: [PATCH] Day 19 - unfinished, filtering needs some polishing --- day19.py | 236 ++++++++++++++ inputs/input19 | 727 ++++++++++++++++++++++++++++++++++++++++++++ inputs/input19_test | 17 ++ 3 files changed, 980 insertions(+) create mode 100644 day19.py create mode 100644 inputs/input19 create mode 100644 inputs/input19_test diff --git a/day19.py b/day19.py new file mode 100644 index 0000000..a2d250b --- /dev/null +++ b/day19.py @@ -0,0 +1,236 @@ +from __future__ import annotations +from collections import defaultdict, deque +from tools.aoc import AOCDay +from typing import Any + +from tools.math import mul + + +class Part: + def __init__(self, part_str: str): + self.attr = defaultdict(int) + + for desc in part_str[1:-1].split(","): + attr, value = desc.split("=") + self.attr[attr] = int(value) + + def get_value(self) -> int: + return sum(self.attr.values()) + + +class WorkflowItem: + def __init__(self, flow_str: str): + if ":" in flow_str: + check, self.check_target = flow_str.split(":") + self.check_attr = check[0] + self.check_comp = check[1] + self.check_value = int(check[2:]) + else: + self.check_target = flow_str + self.check_comp = None + self.check_attr = None + self.check_value = None + + def get_target(self, part: Part) -> str | None: + if self.check_attr is None: + return self.check_target + else: + match self.check_comp: + case '<': + result = part.attr[self.check_attr] < self.check_value + case '>': + result = part.attr[self.check_attr] > self.check_value + case _: + assert False, "unhandled comparator: %s" % self.check_comp + + if result: + return self.check_target + + def __str__(self): + return f"{self.check_attr} {self.check_comp} {self.check_value} ? => {self.check_target}" + + def __repr__(self): + return str(self) + + +class Workflow: + def __init__(self, workflow_str: str): + workflow_str = workflow_str[:-1] + self.name, workflow = workflow_str.split("{") + self.flow = [WorkflowItem(x) for x in workflow.split(",")] + self.source = None + + def get_target(self, part: Part) -> str: + for flow in self.flow: + target = flow.get_target(part) + if target is not None: + return target + + def has_target(self, target: str) -> bool: + return target in [x.check_target for x in self.flow] + + +def get_combinations(workflow: Workflow, target: str, attr_dict: dict[str, dict[str, int]] = None) -> int: + if workflow is None: + return 0 + + if attr_dict is None: + attr_dict = { + 'x': {'>': 0, '<': 4001}, + 'm': {'>': 0, '<': 4001}, + 'a': {'>': 0, '<': 4001}, + 's': {'>': 0, '<': 4001}, + } + + #print(f"check flow {workflow.name}") + found_target = False + for item in reversed(workflow.flow): + if item.check_target != target and not found_target: + #print(f" - ignore item {item.check_target}") + continue + if item.check_target == target and not found_target: + # handle: lkl{x>3811:A,m<1766:R,x>3645:A,R} + # handle: qfk{x<2170:A,s<3790:R,m<2700:xzk,A} + print(f" - found target {item.check_target}, {item.check_attr}, {item.check_comp}, {item.check_value}") + if item.check_attr is not None: + if item.check_comp == '>': + attr_dict[item.check_attr]['>'] = max(attr_dict[item.check_attr]['>'], item.check_value) + else: + attr_dict[item.check_attr]['<'] = min(attr_dict[item.check_attr]['<'], item.check_value) + found_target = True + else: + #print(f" - found must fail condition {item.check_target}, {item.check_attr}, {item.check_comp}, {item.check_value}") + if item.check_attr is not None and item.check_target != target: + if item.check_comp == '>': + attr_dict[item.check_attr]['<'] = min(attr_dict[item.check_attr]['<'], item.check_value + 1) + else: + attr_dict[item.check_attr]['>'] = max(attr_dict[item.check_attr]['>'], item.check_value - 1) + + if not found_target: + return 0 + + #print(f"{workflow.name}, {attr_dict=}") + if workflow.name != 'in' and workflow.source is not None: + #print(f"recurse to {workflow.source.name}") + return get_combinations(workflow.source, workflow.name, attr_dict) + + f = mul([v['<'] - v['>'] - 1 for v in attr_dict.values()]) + #print("final", workflow.name, attr_dict, "=>", f) + return f + + +def get_unfiltered_parts(filters: list[WorkflowItem]) -> int: + attr_dict = { + 'x': {'>': 0, '<': 4001}, + 'm': {'>': 0, '<': 4001}, + 'a': {'>': 0, '<': 4001}, + 's': {'>': 0, '<': 4001}, + } + for item in filters: + match item.check_comp: + case '>': + attr_dict[item.check_attr]['>'] = max(attr_dict[item.check_attr]['>'], item.check_value) + case '<': + attr_dict[item.check_attr]['<'] = min(attr_dict[item.check_attr]['<'], item.check_value) + case _: + assert False, f"unexpected check comp {item.check_comp}, {item.check_target}" + + return mul([v['<'] - v['>'] - 1 for v in attr_dict.values()]) + + +def get_foo(workflows: dict[str, Workflow]) -> int: + filters = defaultdict(list) + a_count, r_count = 0, 0 + q = deque() + q.append('in') + while q: + workflow_name = q.popleft() + print("check workflow", workflow_name) + workflow = workflows[workflow_name] + for item in workflow.flow: + print(f" - check item {item} with filters {filters[workflow_name]}") + reached_me = get_unfiltered_parts(filters[workflow_name]) + print(" - before item, got reached by ", reached_me) + if item.check_attr is None: + if item.check_target == 'A': + a_count += reached_me + elif item.check_target == 'R': + r_count += reached_me + else: + filters[item.check_target].extend(filters[workflow_name]) + q.append(item.check_target) + break + else: + filters[workflow_name].append(item) + survived_filter = get_unfiltered_parts(filters[workflow_name]) + filter_diff = reached_me - survived_filter + print(" - after item, got reached by ", filter_diff) + if item.check_target == 'A': + a_count += filter_diff + elif item.check_target == 'R': + r_count += filter_diff + else: + if item.check_comp is not None: + filters[item.check_target].append(item) + q.append(item.check_target) + + assert a_count + r_count == 4000**4, f"{a_count=} and {r_count=}" + return a_count + +# 361661634528000 +# 167409079868000 +# 256000000000000 + +class Day(AOCDay): + inputs = [ + [ + (19114, "input19_test"), + (397643, "input19"), + ], + [ + (167409079868000, "input19_test"), + (None, "input19"), + ] + ] + + def parse_input(self) -> (dict[str, Workflow], list[Part]): + workflow_list, parts = self.getMultiLineInputAsArray() + workflow_list = [Workflow(x) for x in workflow_list] + parts = [Part(x) for x in parts] + + workflows = {} + for w in workflow_list: + workflows[w.name] = w + ps = [x for x in workflow_list if x.has_target(w.name)] + if ps: + assert len(ps) == 1 + w.source = ps[0] + + return workflows, parts + + def part1(self) -> Any: + workflows, parts = self.parse_input() + ans = 0 + for part in parts: + target = workflows["in"].get_target(part) + while target not in ['A', 'R']: + target = workflows[target].get_target(part) + + if target == 'A': + ans += part.get_value() + + return ans + + def part2(self) -> Any: + workflows, _ = self.parse_input() + return get_foo(workflows) + ans = 0 + for workflow in workflows.values(): + if workflow.has_target('A'): + ans += get_combinations(workflow, 'A') + return ans + + +if __name__ == '__main__': + day = Day(2023, 19) + day.run(verbose=True) diff --git a/inputs/input19 b/inputs/input19 new file mode 100644 index 0000000..cca0c0d --- /dev/null +++ b/inputs/input19 @@ -0,0 +1,727 @@ +nsz{x>1625:R,R} +ldx{s>3581:R,s<3393:A,x<1640:A,A} +pz{x<645:A,A} +pjc{x>3650:A,m<1853:kx,cpb} +sfj{x>2325:R,m<1913:A,s<1268:R,R} +jx{m>963:hf,m<581:brr,a>990:sd,bt} +scr{m<3108:A,a<171:R,R} +xvc{m<2497:nkq,R} +tqk{a<3529:R,R} +cs{s>2943:R,s>2799:R,a>2999:A,R} +tgg{m>923:bvd,ppz} +qbp{m>3259:zk,x<776:R,A} +sbv{m<2517:xvc,a<1226:jcs,x<1907:js,pkh} +sjk{s>846:nfv,xfm} +vm{m<2459:A,x<2610:R,A} +bpt{x>1809:A,s<1043:A,m>1649:R,A} +dgd{a>3408:rcs,bdv} +xfm{s<730:R,x>184:R,A} +vbc{a>3030:fzt,fft} +lgx{s>3059:A,A} +gjf{a>1338:R,A} +rgb{s<29:A,x<849:A,A} +khc{s<458:R,x<2962:R,fdl} +sst{s>1367:nzl,x>678:nbm,a>3313:tl,hbl} +rg{s<355:R,a>3711:R,R} +nbm{s<876:hxh,m<1260:rt,kzq} +vbq{a>1476:R,a<1042:mt,x>1740:R,mq} +cc{a>1194:A,s>3579:R,A} +hj{s>1509:A,s<979:R,R} +xg{m>1602:smn,a<3522:sjz,m<1438:A,A} +xd{x<3238:A,m<1833:dck,cfh} +in{m<2319:hqn,gcx} +fmd{x<359:A,a<3041:R,R} +dhx{x<107:R,x>191:R,R} +lhl{m<837:hnp,kbf} +rcs{s>359:A,m<1653:nvh,vr} +tv{s<2555:R,A} +pbb{s>2718:dh,a<2787:hx,s>2206:ft,hgn} +jh{s<2561:gq,x>1586:bz,zbp} +vpm{m>343:R,m>142:A,x<855:A,R} +jg{a<3444:A,s<2055:R,R} +zh{x<2198:A,s>3185:A,A} +dj{x>3152:xdq,a<3437:A,s<2026:A,A} +rkg{m<1540:ncr,a<2987:nsz,R} +hx{s<2253:R,s<2549:xb,s>2630:A,tm} +zt{m<2724:sfz,a<1257:jc,m<2807:gj,nm} +msz{x<108:R,m>106:A,R} +fzt{x>2661:fd,m<910:pr,clj} +pvr{s>622:A,A} +jb{m<1468:A,vp} +mc{x<908:lv,m>2609:A,s<1191:zg,A} +mn{a<2864:A,fmd} +rmf{x>951:zx,s<1352:lxf,s<1561:hqz,pmd} +sc{a>1183:R,x>2364:R,m>884:R,A} +vnm{s>1099:R,a<3335:R,A} +vsq{s>2505:ck,lng} +rfc{s<3370:kvs,qfk} +gf{x<3502:A,x<3768:R,R} +skn{a>765:cjm,x<1158:mk,A} +jq{a<3441:R,s>1088:A,a>3715:R,A} +cfh{x<3582:R,A} +jfh{a<3373:R,a>3503:A,a<3418:A,R} +dck{a<697:A,x<3704:R,m>1602:A,A} +qm{a<2966:A,a>3156:R,m>1113:A,A} +rrz{x<2839:R,rrg} +hc{m<3403:ptl,a<1344:zkr,qt} +nzf{m<2399:A,x>2689:R,A} +fp{a<3805:R,A} +lzn{x>836:sbc,qbp} +sf{m<2848:A,A} +ngf{m<2674:qn,s<505:R,m>2863:A,R} +vvn{a>3592:R,A} +rqk{x>1812:A,s>1402:A,x<1809:A,A} +mnb{s<461:A,R} +bj{m>3160:jdl,x<3494:xpr,x>3747:A,lx} +lmz{x>875:R,a<2901:R,R} +qp{m>418:A,a<3417:glv,s<3513:A,kg} +knr{a<1878:tvd,m<2897:mf,m<3632:bpj,sl} +mqh{m<852:A,A} +hts{s>3442:R,R} +rzt{x<2971:qnk,s>1118:gf,lvg} +sqn{m<2389:R,a>833:A,s<2656:R,A} +dt{x<414:R,R} +xm{m<2040:knt,x<1954:qtx,sx} +xv{x>248:dt,m>280:dhx,msz} +bk{s<1602:R,x<2734:R,a>2930:xkr,A} +fzz{a<3356:A,A} +np{x<1911:R,a>3851:R,m>3371:R,A} +xhn{x<758:A,m<2051:A,R} +vdj{s<1196:R,x<1321:R,x>1643:R,R} +ch{a>3507:R,R} +qbz{x<722:A,R} +bl{x>2199:A,R} +nt{m>3190:qqp,m<2739:cvb,x<2565:cmt,A} +ff{s<331:A,R} +kxr{m<616:R,A} +jl{s<2470:R,A} +hqz{m>2670:R,x>547:R,R} +lh{s>3172:A,x>2127:A,m<847:R,A} +clj{m<1711:vvn,s>2667:tqk,x<2452:bpn,qrk} +sqq{m>2881:vmj,mns} +sk{m<2412:gc,m>2486:sbv,s<2720:lds,rn} +nsj{a<3342:rh,m<640:qkd,ppf} +fcm{s>2549:A,m>2349:R,x>2427:R,A} +pc{m<3086:A,A} +tdg{x>2849:dxs,ggq} +qk{s>2756:ndx,a<773:xq,vbq} +rrg{s>450:R,m>531:R,s<234:R,A} +mt{x>2069:A,A} +tx{m>2891:cmb,a<2054:A,a>3101:R,sdm} +rn{x>2287:hnb,jjk} +nvh{s<144:A,x>2909:R,a>3613:A,R} +pl{a>2552:R,R} +dkp{s<2186:A,A} +cph{m>467:A,s>728:ch,s>596:R,rq} +lkl{x>3811:A,m<1766:R,x>3645:A,R} +qrk{a>3612:R,R} +zx{x<1189:R,A} +cft{x<1736:rjv,m<515:nh,x>1804:sv,jgt} +spb{s<1106:A,A} +mq{x>621:R,s>2375:R,a>1192:R,A} +qfk{x<2170:A,s<3790:R,m<2700:xzk,A} +kzq{m<1627:vnm,x>1174:qc,fnd} +tb{a>2838:R,R} +ztb{a>878:R,a>389:A,A} +xpr{s<1623:A,m>2860:A,A} +sjz{x>1759:A,A} +br{a>2698:A,kkr} +xk{s>1574:A,a>2857:A,x<2304:zsl,A} +pmn{a<2987:A,nqd} +cpb{s<2494:R,s>3056:R,s<2772:A,A} +dbd{s>491:zr,ngx} +bxz{a>2680:qx,m<561:cvm,m<746:rk,hhj} +qx{a>2954:R,s>409:A,a<2841:ghg,st} +rl{s<2957:mrd,m<3104:rfc,mfs} +mv{m<1137:A,m>1179:R,m>1151:R,A} +tqr{x<3007:dc,qd} +ngx{s>251:gxl,a<1663:skn,s>105:vcr,ftg} +rlh{x<1346:R,s<3709:R,m>3186:A,A} +ndx{m>3460:R,ztb} +gqm{m>1694:spb,A} +tc{a<518:R,s>3724:R,R} +bhr{x>1170:R,R} +kxb{a<1543:vdj,s<1033:sj,zhz} +fm{s<2431:R,R} +gmf{m>2461:A,A} +bjm{s>2014:gx,tp} +klg{x>1693:A,x<1677:R,m<666:A,R} +bvs{m<2466:A,m>2479:R,R} +mj{s<411:dqt,x>404:khj,fs} +sg{a>3654:A,m<1608:kc,x>321:db,gbg} +qql{x<1435:sst,m>1318:qzs,lhx} +ts{m>1928:A,x<1810:R,R} +nb{x>3081:R,R} +dqt{s>183:A,a<2137:lr,x>407:nvm,A} +qh{x>1385:R,x<760:A,x<987:R,R} +sgf{s>472:bq,s>210:qh,a<937:R,R} +st{m>313:A,a<2915:A,R} +znr{m<1210:A,a>630:R,A} +rtc{a<3690:R,np} +xkr{s<1717:A,x>2917:R,R} +ptl{s>1375:A,A} +xx{a>1588:R,m<2541:R,m<2556:R,A} +qt{s>1320:R,x>1624:R,R} +ck{s<2668:R,s>2798:A,R} +lv{x>342:A,m>2531:R,s>1185:R,R} +fqh{s>2528:R,A} +qgx{x<417:rgz,x>709:jm,A} +lds{a<935:zc,a>1524:kjh,a<1285:zdg,fvn} +prs{a>1688:gxz,vhg} +rdl{m>530:R,m>318:A,a>3507:A,A} +rgz{s<798:R,x>183:A,R} +gl{m>555:A,x<3803:A,x>3911:A,R} +cf{s>869:A,x<3686:R,R} +sn{x>193:R,x>175:jp,mcx} +kx{a>3621:R,x<3580:R,a>3389:R,A} +zgg{s>844:R,x<948:A,A} +xp{x>3232:rd,x>2875:jtm,djx} +vsx{a>480:A,A} +sv{x<1825:rqk,s<1909:R,R} +hgn{a<3015:jns,m<778:A,x<3533:A,lkl} +bd{a>3007:A,R} +sbc{x<905:spj,m>2991:dch,x<929:R,zgg} +ld{m>2468:A,a<1961:A,A} +qz{a<1538:A,x<587:vhp,s<463:fnt,R} +kg{s<3708:R,x<3794:A,R} +zl{a>845:rlh,m<3174:R,tc} +mf{s<660:R,m<2546:R,m>2749:A,R} +sfs{a>3403:A,m>1875:R,s>3228:A,A} +gxl{s<365:vxk,s<418:R,A} +vt{s>1493:cg,A} +pp{a>3414:R,x<3505:R,R} +cl{a<2823:R,s>62:A,A} +xf{a>3642:xn,zh} +cvm{x>3538:xkm,x>3370:xst,gxq} +tp{m<1208:fx,x>1999:nlr,x<927:pzq,bpd} +dm{x>370:R,x>136:xz,s>180:hxs,gb} +ldk{a<3430:fzz,a>3524:A,lgx} +ktv{a>3015:A,R} +fs{a<1565:dcg,A} +cjm{s>145:R,s>52:R,a>1326:A,R} +vhg{m>3219:A,prd} +kp{a<2689:vqj,a<3052:bbk,hts} +rdz{m<3223:tz,x<224:ltg,mj} +xkm{m>294:R,A} +dxs{m<2735:R,sf} +zxr{x<2226:R,R} +rk{x<3654:pvr,a<2590:lfq,m>680:R,kxr} +hnb{m<2440:gjf,A} +xmj{a>2809:R,a<2710:R,A} +zhz{x>1335:R,A} +rm{s<2906:A,a<1097:A,A} +gs{s>618:R,a>1306:A,ffg} +pr{m>597:A,A} +cg{a<1668:A,m<2602:A,m>2753:A,R} +kjh{a<1795:tns,m<2454:R,a<1894:mmp,ld} +vmj{a>911:hc,x<1742:px,a<468:lfh,ctp} +jr{s>1089:dnn,svd} +sl{m<3860:qj,s>533:R,A} +dg{m>480:A,R} +vhp{a>1986:R,m>2260:A,x<207:A,A} +bpn{s>2180:A,R} +gp{a<3007:fm,fqh} +hsn{m>233:R,A} +cfr{a>3816:A,x<3746:R,R} +vr{s<208:R,x>3073:R,a>3675:A,A} +hjq{x<2261:zt,tdg} +xs{a<2789:A,A} +bv{x<1363:A,m<3020:R,s>2415:A,A} +js{s>3075:R,s>2295:xt,xx} +bjf{a<3063:R,x<1285:A,s<781:R,R} +dch{s<768:R,m<3474:A,a>1745:R,R} +xn{x<1811:A,a<3781:A,x>3212:R,R} +mcz{x<2047:qq,x>3098:bj,x<2483:xk,bk} +mjb{m>3716:R,a<1749:A,s>378:A,A} +bh{a>2047:rl,m>2924:hl,m>2577:hjq,sk} +cxf{s>1991:R,A} +mmx{a<700:R,s<3690:A,A} +pht{m>2343:fcm,a<1565:qzd,s<3225:sls,R} +nm{s>3143:R,tsh} +tr{m>1907:lf,m>1572:R,x>3149:R,R} +km{a<551:A,x>2529:A,R} +gb{x<91:R,x>109:A,A} +tcj{x>1369:R,x>1299:R,x<1273:A,A} +vsm{a>1248:A,A} +lrg{s>3071:cc,sc} +zsl{m<3319:A,R} +rlp{x>1447:fq,x<664:rdz,x>969:dbd,hdh} +sdm{x>400:R,s<405:R,m>2635:A,A} +glv{x<3730:A,R} +lj{s<1546:A,s>1676:A,m>3698:A,R} +mh{a<918:R,A} +rbq{s>3266:A,a<3014:A,A} +lr{s>83:A,A} +ztg{m>2791:R,R} +hdh{s<584:zq,lzn} +zq{x<782:mzs,s>227:gbm,s<118:zpm,glb} +prd{a>600:R,A} +ffc{m>2132:A,A} +nk{s>3514:A,x<3755:A,A} +gcx{s>1810:bh,s>1023:lm,rlp} +zr{a<2128:dqp,bjf} +gj{m<2772:zhm,s<2706:ztg,A} +pmd{s<1687:A,m>2527:A,a>555:A,R} +jjk{m>2443:bvs,A} +spj{m<3148:A,A} +qb{s<370:R,x>709:R,A} +dbr{x<2064:R,ckl} +gmt{x<70:R,mjb} +nnh{s<3292:A,x>3387:R,R} +td{x>3056:R,x>2710:A,R} +dz{a<3652:R,m<202:R,a<3832:R,R} +dx{x>2870:R,m<2531:A,x<2399:R,R} +tt{s>100:R,m<1645:R,A} +jz{s<214:A,s<237:A,x>1271:A,A} +cmt{s>1258:A,s>1245:R,R} +kvs{m<2760:zxr,s<3201:A,x>2030:nkz,rbq} +hkv{m<2706:jsn,x<186:R,A} +rq{a>3646:A,A} +xz{a>3868:A,m>454:R,A} +mfs{a<3298:kp,s<3437:xf,bbp} +bbp{x<1840:A,x>2935:R,sbj} +hln{m>2906:bv,s<2210:shv,s<2488:bd,A} +mrd{m>3208:vsq,m>2743:hln,gp} +tqb{a>3812:A,a<3705:A,A} +rd{s>2949:R,a<952:rj,m>1000:A,A} +sj{x<1391:A,s>531:R,m<1991:A,A} +bz{m<856:A,s>3162:R,x>1637:R,cs} +fr{m<488:dz,m>688:mqh,gl} +sfz{s<3265:bx,mmx} +sx{a>3250:lp,A} +qkd{m>502:A,m>465:A,A} +fft{m<1448:br,vnq} +lth{x>1414:R,a<200:R,x>656:A,R} +ppz{s>1019:df,a>3107:sq,x<3125:tcc,bxz} +jdl{a>3100:A,R} +nz{x<1802:cvv,x<2151:hz,lrg} +sq{s>487:cph,s<208:qqq,lqz} +rh{a>2988:A,a>2717:A,A} +qc{x>1297:A,x>1237:R,m>2052:R,R} +gq{a<3385:hj,a<3653:dg,R} +vcr{s<164:dfn,a>3066:jz,a<2547:rx,xmj} +cbz{s<2435:A,a<1101:R,R} +ckl{x<2164:R,x>2223:A,a<2867:A,R} +kc{m<1226:R,m<1417:A,s<249:A,A} +gbg{m>2033:R,a>3449:A,R} +nl{x<867:R,s<95:A,x>913:A,R} +jc{a>564:A,s<3164:lth,fk} +ghg{x>3699:R,R} +pgx{m<526:hsn,zrm} +lm{a<2173:sqq,rc} +hhj{s>555:pb,x>3691:A,m<856:mrk,pl} +gk{a<670:R,m<3301:R,R} +jgt{a>3287:R,s>1669:R,m>787:A,A} +pg{a<628:A,A} +glb{m<3381:A,R} +fk{a<278:R,m>2835:A,x<1081:A,A} +smn{a>3531:R,x>1652:R,x<1509:A,R} +mzs{m>3099:R,m>2652:qbz,a>1684:xr,qb} +zv{m<1635:R,A} +knt{s<2108:ts,m>1912:A,x<1913:R,A} +jp{s>234:A,A} +sxn{s<2354:cxf,lh} +dvt{x<3345:hmd,A} +tbn{x>2935:sdp,vbc} +fpx{s>1347:sxn,a<3190:dbr,dpr} +tns{a>1653:A,a<1584:A,A} +zkr{x>2512:R,R} +xl{x<3360:A,x<3415:R,A} +rx{a<2102:R,s>206:A,m<3036:R,R} +qtx{s>2342:qjm,m<2175:A,s<1137:A,bp} +lhx{x>1839:fpx,x>1662:cft,jh} +bx{m<2654:A,R} +fdl{m>344:R,R} +jd{s<874:A,s<1113:qm,x<379:A,R} +lfh{m>3307:lj,scr} +hf{m<1439:pz,x<450:A,R} +nlr{a>953:kmt,a<561:qv,x>2707:xd,sfj} +vd{m<3322:zl,m>3700:sz,bm} +jm{s>1234:R,a>1053:A,A} +qf{a<2912:A,m<1484:A,s>2424:A,A} +tm{x>3486:R,R} +djd{x<2571:A,m<1931:A,m>2159:A,A} +xb{x<3393:A,s>2359:A,R} +ffg{a>828:R,R} +hb{x>513:xhn,ff} +tn{s>2834:R,m>821:R,s<2377:R,R} +zdg{s<2280:A,cbz} +ggq{a<725:R,x>2465:R,hhg} +qqp{a>3755:R,A} +gn{a<769:R,x>965:R,a>861:R,R} +lng{m>3597:R,m<3461:R,a<3221:A,A} +lp{x>2196:R,s>1463:A,A} +xvl{s>1915:A,x>1611:bpt,fp} +kbf{s>3033:A,s<2370:R,m>1333:R,R} +bm{a>744:mxk,A} +hhg{x<2370:A,s>2677:A,a<1282:R,R} +ftg{m<3403:cl,a<2890:bhr,ksz} +ctp{s>1319:R,s<1191:A,gk} +hbl{s>497:jd,s>278:gfp,mn} +dcg{s>725:R,A} +px{m<3557:A,lsq} +fx{s>948:pgx,m>797:zzh,m<374:sgf,gs} +fd{x<2823:A,s>2497:R,rf} +lvg{x<3616:R,m<3033:R,s>1098:A,A} +rj{a<475:R,a<752:A,x<3524:R,R} +djl{m>2966:A,a>3785:A,x>1341:A,R} +jtm{m<1048:A,mh} +mmp{m>2470:R,A} +kmt{a>1670:A,vsm} +npf{s<3688:R,a>549:R,A} +ppf{a>3580:A,a<3436:A,A} +ndq{m<588:A,R} +gc{m>2357:zjp,a<965:stg,pht} +fq{x>2971:prs,knr} +mxk{m<3467:R,s<3498:R,A} +qzs{m>1825:xm,nqp} +bq{a>892:R,A} +qv{s<948:zv,m<1792:A,ffc} +djx{a>1069:R,s<2984:znr,zln} +cmb{a>2171:R,s>607:R,A} +qqq{s<97:R,a<3554:A,R} +cjk{x>3311:R,R} +shv{s>1975:A,A} +cr{a<3757:A,A} +db{x<467:A,a>3491:R,x>603:R,R} +nvm{m>3599:R,s<107:A,A} +lsq{x<972:A,x<1326:R,m>3708:A,R} +tk{m<1343:jqn,s<3104:tr,x<3129:tqr,cjk} +ltg{x<144:gmt,s>648:sjk,sn} +vqj{a<2347:R,A} +kkr{s<2448:R,s>2988:R,m>817:R,R} +dfn{m<3232:R,R} +nfv{m<3643:R,m>3778:A,m>3695:A,R} +xdq{m>966:R,s>2058:A,s>1829:A,A} +sbj{s>3663:A,R} +hqn{a<2457:bjm,x<2335:qql,s>1648:tbn,tgg} +pkh{m<2545:dx,vlh} +tsh{a<1720:R,R} +lqz{m<369:td,x<3015:A,a>3642:R,pp} +qd{s>3582:A,R} +bvd{s<844:dgd,zj} +vf{m>2442:A,a<429:A,a>765:A,R} +bbk{a>2913:R,x>1674:A,m<3478:A,R} +gfp{x<260:nx,xs} +jsn{s<481:R,m>2509:A,A} +hm{m<2516:nzf,nq} +qnk{x>2773:R,s<1113:R,m<3103:A,A} +zjp{m<2387:rm,m>2396:A,m>2391:R,sqn} +qjm{a>3026:A,m>2167:A,A} +gbm{m>3204:rgf,dr} +vp{m<1879:A,a>3733:R,m<2030:A,A} +zj{s>1327:cm,gqm} +zk{x<774:A,R} +lx{s<1528:A,x<3653:R,A} +zzh{m<1012:kv,mv} +gd{s<1380:R,x<283:R,a<1736:R,R} +jqn{x<3234:tqb,xl} +cvv{x<1600:R,s<2932:R,A} +hmd{x<2704:A,R} +xt{m<2557:R,A} +xzk{m>2542:R,s>3909:A,A} +mns{x>1485:hm,a<1229:rmf,s<1321:mc,vt} +th{m>791:R,x>2020:R,s>2503:R,R} +txz{a>1202:R,R} +lf{a<3790:R,s<2230:A,R} +lxf{x>401:A,m>2570:R,R} +zc{s<2223:km,s>2436:gmf,s>2294:vf,R} +bdv{s>374:R,s>225:R,a<2926:tt,A} +zhm{a<1668:R,A} +rf{x>2881:R,m>925:A,A} +md{s<2729:dj,s>3389:lq,m>1183:fbm,ldk} +xq{s>2140:A,s>1929:R,R} +bn{s>112:A,a<3510:A,R} +zrm{x>2201:A,a>1339:R,A} +tl{s>494:jb,m>825:sg,a<3751:xv,dm} +dr{m>2757:A,a>1578:A,R} +scp{m<1127:A,A} +qzd{s>2591:A,x<1477:A,m<2327:A,A} +gx{x>2633:xp,x<1288:jx,nz} +ptb{x>570:A,a<1242:A,gd} +nq{s>1502:A,a<1419:A,m>2710:A,A} +xrk{a<2748:scp,A} +fnt{x<783:R,m<2237:R,R} +pzq{m<1923:qgx,s>756:ptb,m>2173:qz,hb} +dqp{x<1260:R,s<723:tcj,a<1038:kbr,R} +bpd{m<1625:txz,kxb} +mk{m<3370:R,R} +df{m<432:dvt,nsj} +kbr{m<3355:R,A} +ft{a>3005:A,x<3436:qf,A} +sd{a<1555:tn,x>695:hr,A} +jns{x>3379:A,A} +rc{s>1303:mcz,s<1143:jcd,ksn} +vnq{a<2743:A,s<3065:djd,R} +ncr{a<2770:R,R} +nkz{x<3104:A,a<2868:A,R} +qn{s<367:A,a<2522:A,s>673:R,A} +dnn{a<3018:R,A} +nvx{x>449:R,x<431:R,A} +qq{x<814:R,a>3379:djl,s>1570:tb,R} +xr{a<3221:A,A} +tcc{a>2884:pmn,a<2707:rrz,x>2744:khc,ndq} +dc{x<2981:A,s<3555:R,A} +jcd{x<2438:jr,s>1077:rzt,m<2916:nb,ktv} +tvd{x<2294:R,m>2968:R,A} +hr{m<771:R,a>1871:A,m<852:A,R} +stg{x<1998:R,a<340:A,R} +vxk{x>1227:A,A} +xst{m>248:A,m<115:A,R} +tz{x>259:tx,x<147:ngf,a<1602:mnb,hkv} +cm{s<1516:A,rr} +fvn{a>1404:vm,s<2362:A,s<2531:jl,A} +xtk{a<3039:A,m<873:A,A} +nzl{a<3148:xrk,lhl} +bpj{m>3236:A,A} +nqd{a>3052:A,A} +mrk{m>802:A,x<3319:R,a>2546:R,R} +pt{x<1010:R,x<1152:R,s<631:A,R} +svd{m<3239:R,s>1065:A,s<1042:A,R} +gxq{m>348:A,m<160:R,R} +rjv{a>3319:R,s<1384:A,a<2865:klg,R} +ksn{a<3369:pc,s<1222:rtc,nt} +bt{x<598:vsx,s<2906:gg,a<412:A,gn} +hz{s>3183:A,a<1128:tv,th} +vlh{m<2565:R,m<2572:A,m<2575:R,A} +kv{a<881:A,s>497:A,x>1630:R,R} +gg{x<861:R,s>2562:A,a<571:A,R} +xrs{s<3597:A,a<3736:R,x>3727:R,R} +rr{x<3419:A,s<1585:A,A} +nx{m>775:R,s<374:R,x>96:R,R} +zln{a<598:A,x>2765:R,s<3396:A,R} +hxh{s>428:pt,a<3181:qnv,s>222:rg,bn} +zpm{s>56:nl,s<25:A,s>37:A,rgb} +fbm{s<3133:jfh,x<3239:sfs,x<3326:A,nnh} +gxz{s<682:A,x>3414:cf,s<811:R,R} +jcs{s<3173:R,pg} +rgf{x<892:A,a<2290:A,s<457:R,A} +hnp{m<480:A,s>2663:A,R} +brr{x<567:R,s>2706:vpm,A} +ksz{x>1173:R,R} +kb{m>971:pjc,s<3100:fr,a>3600:qvb,qp} +bp{x>1741:R,a>3291:A,m<2240:A,A} +dh{x<3568:R,R} +nqp{x>1941:bl,a<3289:rkg,a>3661:xvl,xg} +khj{x>567:A,x>479:A,a>1795:nvx,A} +rt{x>1014:jq,m>647:xtk,a>3452:cr,lmz} +sls{m<2332:A,s>2616:A,R} +dpr{a>3494:R,A} +sz{m<3872:R,x>2610:R,a>1233:ldx,npf} +lq{a>3422:A,R} +qnv{m>973:A,R} +hl{s>3243:vd,qk} +cvb{m<2489:R,R} +lfq{x>3855:R,x<3735:A,R} +qvb{m>635:cfr,a>3858:nk,xrs} +hxs{x>75:R,a<3839:R,R} +nkq{a<1204:R,R} +zg{a>1588:A,x>1263:R,m>2439:A,R} +qj{s<410:R,x>2055:A,R} +pb{a>2581:A,R} +zbp{s<3308:R,a>3214:rdl,A} +mcx{a>1546:A,x<159:R,s<342:A,R} +fnd{s>1059:A,m>1947:R,m>1824:R,R} +sdp{a<3225:pbb,x>3443:kb,a>3623:tk,md} +nh{x<1784:A,m<201:dkp,jg} + +{x=181,m=1429,a=1016,s=669} +{x=1855,m=231,a=499,s=2753} +{x=477,m=763,a=512,s=31} +{x=514,m=1858,a=446,s=4} +{x=736,m=201,a=975,s=1222} +{x=271,m=1572,a=1467,s=346} +{x=875,m=2792,a=1779,s=722} +{x=3339,m=220,a=373,s=697} +{x=86,m=1477,a=299,s=2045} +{x=627,m=907,a=339,s=1280} +{x=3329,m=950,a=1470,s=1233} +{x=1661,m=1188,a=2792,s=305} +{x=137,m=3051,a=473,s=198} +{x=1432,m=1764,a=1607,s=127} +{x=20,m=614,a=1013,s=2180} +{x=2496,m=45,a=208,s=151} +{x=236,m=513,a=653,s=62} +{x=72,m=2070,a=613,s=1477} +{x=1535,m=364,a=1222,s=2810} +{x=2961,m=490,a=1635,s=940} +{x=985,m=535,a=340,s=262} +{x=78,m=1496,a=608,s=1452} +{x=2461,m=17,a=249,s=2865} +{x=582,m=3890,a=219,s=1499} +{x=525,m=3136,a=1780,s=1024} +{x=1751,m=788,a=926,s=454} +{x=2737,m=801,a=676,s=488} +{x=179,m=558,a=1431,s=123} +{x=473,m=2517,a=1970,s=3027} +{x=246,m=1835,a=293,s=1773} +{x=2173,m=795,a=91,s=118} +{x=2612,m=2395,a=1001,s=1701} +{x=2082,m=91,a=67,s=1623} +{x=1800,m=2475,a=3243,s=1009} +{x=56,m=801,a=2915,s=571} +{x=477,m=849,a=722,s=1380} +{x=591,m=828,a=2279,s=2583} +{x=1972,m=488,a=711,s=387} +{x=721,m=3128,a=729,s=60} +{x=1650,m=1889,a=409,s=569} +{x=530,m=1951,a=1022,s=977} +{x=1192,m=778,a=621,s=3} +{x=2661,m=222,a=1369,s=2346} +{x=334,m=194,a=772,s=284} +{x=777,m=246,a=298,s=1799} +{x=25,m=1937,a=2264,s=918} +{x=3300,m=297,a=746,s=756} +{x=989,m=2908,a=106,s=2005} +{x=722,m=3150,a=272,s=639} +{x=662,m=543,a=433,s=568} +{x=379,m=601,a=199,s=200} +{x=3886,m=235,a=286,s=753} +{x=456,m=2145,a=91,s=768} +{x=419,m=247,a=228,s=1429} +{x=1407,m=1738,a=677,s=61} +{x=178,m=1966,a=1212,s=386} +{x=530,m=170,a=426,s=47} +{x=1012,m=269,a=1708,s=211} +{x=2735,m=956,a=298,s=19} +{x=244,m=2114,a=2724,s=239} +{x=1791,m=534,a=2048,s=997} +{x=702,m=1660,a=761,s=1659} +{x=1400,m=684,a=568,s=67} +{x=1163,m=835,a=493,s=2985} +{x=1021,m=961,a=45,s=732} +{x=2330,m=1928,a=990,s=103} +{x=618,m=436,a=2045,s=875} +{x=787,m=47,a=1459,s=1812} +{x=826,m=901,a=29,s=1946} +{x=1275,m=2751,a=1304,s=1955} +{x=318,m=107,a=1661,s=2740} +{x=1608,m=781,a=864,s=30} +{x=1130,m=1123,a=1147,s=115} +{x=3323,m=811,a=408,s=140} +{x=3533,m=362,a=28,s=2026} +{x=245,m=572,a=274,s=2189} +{x=558,m=998,a=3107,s=2802} +{x=729,m=217,a=1508,s=61} +{x=929,m=1891,a=168,s=1442} +{x=843,m=582,a=570,s=148} +{x=1307,m=268,a=890,s=343} +{x=2166,m=148,a=34,s=129} +{x=352,m=920,a=2517,s=1377} +{x=451,m=1749,a=2402,s=311} +{x=1450,m=1265,a=2377,s=176} +{x=229,m=111,a=877,s=277} +{x=599,m=325,a=863,s=1187} +{x=1156,m=202,a=1211,s=1742} +{x=323,m=225,a=1806,s=984} +{x=3,m=550,a=1462,s=1357} +{x=1104,m=2525,a=1349,s=832} +{x=1120,m=344,a=1722,s=42} +{x=1311,m=498,a=2180,s=1383} +{x=495,m=196,a=295,s=1533} +{x=124,m=706,a=20,s=1779} +{x=2008,m=988,a=1400,s=229} +{x=1076,m=30,a=118,s=219} +{x=32,m=36,a=684,s=365} +{x=2761,m=1579,a=1095,s=2} +{x=376,m=2325,a=765,s=42} +{x=1759,m=8,a=54,s=2275} +{x=1550,m=2813,a=222,s=1004} +{x=526,m=1300,a=1735,s=1030} +{x=643,m=260,a=99,s=69} +{x=363,m=477,a=3110,s=1145} +{x=3215,m=158,a=1768,s=789} +{x=1288,m=625,a=786,s=103} +{x=407,m=384,a=394,s=1204} +{x=1611,m=101,a=73,s=1241} +{x=27,m=512,a=492,s=45} +{x=2186,m=510,a=174,s=797} +{x=664,m=131,a=2981,s=1545} +{x=203,m=783,a=472,s=974} +{x=1358,m=128,a=708,s=698} +{x=1934,m=1329,a=3590,s=1450} +{x=376,m=1681,a=1135,s=1147} +{x=2609,m=6,a=258,s=367} +{x=331,m=1410,a=3015,s=460} +{x=144,m=144,a=166,s=196} +{x=598,m=2965,a=997,s=24} +{x=6,m=1058,a=176,s=130} +{x=3239,m=414,a=530,s=242} +{x=334,m=352,a=1643,s=781} +{x=226,m=401,a=662,s=590} +{x=264,m=1398,a=294,s=227} +{x=806,m=889,a=1774,s=1833} +{x=1503,m=856,a=2800,s=317} +{x=106,m=3177,a=85,s=2853} +{x=3606,m=1243,a=574,s=300} +{x=2268,m=18,a=112,s=178} +{x=28,m=340,a=853,s=541} +{x=990,m=388,a=370,s=738} +{x=598,m=779,a=2183,s=2063} +{x=318,m=656,a=3512,s=1110} +{x=386,m=78,a=2626,s=1734} +{x=1796,m=472,a=589,s=201} +{x=64,m=1121,a=195,s=1113} +{x=395,m=751,a=1600,s=57} +{x=364,m=467,a=466,s=2893} +{x=21,m=26,a=667,s=1636} +{x=12,m=341,a=2977,s=170} +{x=514,m=3431,a=246,s=828} +{x=82,m=1269,a=157,s=75} +{x=2178,m=1295,a=3189,s=418} +{x=1835,m=2538,a=222,s=2213} +{x=596,m=1197,a=1453,s=57} +{x=11,m=2703,a=1429,s=1535} +{x=1219,m=29,a=272,s=825} +{x=1789,m=598,a=2316,s=736} +{x=1495,m=44,a=204,s=2042} +{x=1594,m=477,a=2334,s=1665} +{x=1998,m=236,a=188,s=107} +{x=493,m=1677,a=669,s=3215} +{x=1560,m=258,a=1737,s=477} +{x=77,m=39,a=1604,s=3270} +{x=468,m=1742,a=866,s=203} +{x=593,m=1650,a=715,s=1074} +{x=2581,m=475,a=1337,s=200} +{x=1566,m=475,a=137,s=1855} +{x=78,m=1832,a=257,s=1434} +{x=1935,m=1719,a=2092,s=263} +{x=275,m=95,a=1280,s=924} +{x=902,m=57,a=668,s=1006} +{x=737,m=175,a=1837,s=1256} +{x=840,m=424,a=1710,s=1377} +{x=169,m=1677,a=1335,s=768} +{x=469,m=1245,a=75,s=949} +{x=806,m=96,a=6,s=911} +{x=204,m=396,a=1496,s=264} +{x=366,m=874,a=762,s=743} +{x=1577,m=56,a=113,s=519} +{x=1298,m=2117,a=2767,s=103} +{x=52,m=618,a=34,s=2370} +{x=473,m=512,a=1227,s=2512} +{x=797,m=242,a=1528,s=761} +{x=42,m=2898,a=137,s=1034} +{x=2053,m=12,a=368,s=2044} +{x=1712,m=649,a=2966,s=32} +{x=1103,m=664,a=204,s=592} +{x=1335,m=679,a=2306,s=1390} +{x=537,m=969,a=178,s=2460} +{x=1619,m=840,a=957,s=59} +{x=1654,m=233,a=619,s=1679} +{x=1206,m=3148,a=1783,s=1387} +{x=1976,m=2208,a=31,s=2577} +{x=979,m=301,a=3360,s=186} +{x=114,m=983,a=2019,s=876} +{x=212,m=384,a=8,s=1132} +{x=118,m=3319,a=2320,s=1586} +{x=557,m=254,a=225,s=1252} +{x=953,m=895,a=2335,s=485} +{x=719,m=421,a=293,s=3266} +{x=3373,m=249,a=695,s=242} +{x=68,m=359,a=254,s=2548} +{x=747,m=1213,a=625,s=748} +{x=101,m=1100,a=37,s=1493} +{x=1317,m=66,a=3054,s=1855} +{x=518,m=2049,a=75,s=150} +{x=17,m=70,a=40,s=12} +{x=1560,m=1853,a=1279,s=2104} diff --git a/inputs/input19_test b/inputs/input19_test new file mode 100644 index 0000000..a08746e --- /dev/null +++ b/inputs/input19_test @@ -0,0 +1,17 @@ +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} \ No newline at end of file