From e6f5aef7064be2ac90fe3e5c7cf4a5ea56df7c00 Mon Sep 17 00:00:00 2001 From: oabrivard Date: Tue, 19 Dec 2023 12:50:16 +0100 Subject: [PATCH] Completed part 1 of Day 19 puzzle --- day19/day19.go | 169 +++++++++++ day19/day19_test.go | 83 +++++ day19/input.txt | 716 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 968 insertions(+) create mode 100644 day19/day19.go create mode 100644 day19/day19_test.go create mode 100644 day19/input.txt diff --git a/day19/day19.go b/day19/day19.go new file mode 100644 index 0000000..c4eaf37 --- /dev/null +++ b/day19/day19.go @@ -0,0 +1,169 @@ +package day19 + +import ( + "fmt" + "log" + "regexp" + "strconv" + "strings" +) + +type Rule struct { + category byte + operator byte + value int + action string +} + +type Part struct { + xVal int + mVal int + aVal int + sVal int +} + +type Workflow []Rule + +func ParseWorkflows(lines []string) map[string]Workflow { + workflows := map[string]Workflow{} + var re1 = regexp.MustCompile(`^([a-z]+){(([^,}]+,)+)([a-zA-Z]+)}$`) + var re2 = regexp.MustCompile(`^([a-z]+)(<|>)([0-9]+):([a-zA-Z]+)$`) + + for _, line := range lines { + matches1 := re1.FindStringSubmatch(strings.TrimSpace(line)) + + if len(matches1) != 5 { + log.Fatalf("Regexp for %s should only have 5 parts and got %d", line, len(matches1)) + } + + wfName := matches1[1] + wfExp := strings.TrimSuffix(matches1[2], ",") + wfLast := matches1[4] + + expressions := strings.Split(wfExp, ",") + + wf := Workflow{} + for _, exp := range expressions { + matches2 := re2.FindStringSubmatch(exp) + + if len(matches2) != 5 { + log.Fatalf("Regexp for %s should only have 5 parts and got %d", line, len(matches1)) + } + + val, _ := strconv.Atoi(matches2[3]) + + rule := Rule{ + category: matches2[1][0], + operator: matches2[2][0], + value: val, + action: matches2[4], + } + + wf = append(wf, rule) + } + + wf = append(wf, Rule{ + category: 'F', + action: wfLast, + }) + + workflows[wfName] = wf + } + + return workflows +} + +func ParsParts(lines []string) []Part { + parts := []Part{} + + var re = regexp.MustCompile(`^{x=([0-9]+),m=([0-9]+),a=([0-9]+),s=([0-9]+)}$`) + + for _, line := range lines { + matches := re.FindStringSubmatch(strings.TrimSpace(line)) + + if len(matches) != 5 { + log.Fatalf("Regexp for %s should only have 5 parts and got %d", line, len(matches)) + } + + xVal, _ := strconv.Atoi(matches[1]) + mVal, _ := strconv.Atoi(matches[2]) + aVal, _ := strconv.Atoi(matches[3]) + sVal, _ := strconv.Atoi(matches[4]) + + part := Part{xVal, mVal, aVal, sVal} + + parts = append(parts, part) + } + + return parts +} + +func evalRule(partVal int, operator byte, ruleVal int, action string) string { + switch { + case operator == '<' && partVal < ruleVal: + return action + case operator == '>' && partVal > ruleVal: + return action + } + return "" +} + +func isAccepted(part Part, workflows map[string]Workflow) bool { + nextAction := "in" + + for { + wf := workflows[nextAction] + + nextAction = "" + + for _, rule := range wf { + switch rule.category { + case 'F': + nextAction = rule.action + case 'x': + nextAction = evalRule(part.xVal, rule.operator, rule.value, rule.action) + case 'm': + nextAction = evalRule(part.mVal, rule.operator, rule.value, rule.action) + case 'a': + nextAction = evalRule(part.aVal, rule.operator, rule.value, rule.action) + case 's': + nextAction = evalRule(part.sVal, rule.operator, rule.value, rule.action) + } + + if nextAction == "A" { + return true + } + if nextAction == "R" { + return false + } + if nextAction != "" { + break // move to next workflow + } + } + } +} + +func Part1(lines []string) int { + idx := 0 + for i, line := range lines { + if strings.TrimSpace(line) == "" { + idx = i + break + } + } + + Workflows := ParseWorkflows(lines[:idx]) + parts := ParsParts(lines[idx+1:]) + + fmt.Println(len(Workflows)) + fmt.Println(len(parts)) + + sum := 0 + for _, part := range parts { + if isAccepted(part, Workflows) { + sum += part.aVal + part.mVal + part.sVal + part.xVal + } + } + + return sum +} diff --git a/day19/day19_test.go b/day19/day19_test.go new file mode 100644 index 0000000..9ae00d8 --- /dev/null +++ b/day19/day19_test.go @@ -0,0 +1,83 @@ +package day19 + +import ( + "testing" + + "gitea.paas.celticinfo.fr/oabrivard/aoc2023/utils" +) + +func TestParseWorkflows(t *testing.T) { + lines := []string{ + "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}", + } + + result := ParseWorkflows(lines) + + if len(result) != 11 { + t.Fatalf("expected 11, got %d", len(result)) + } +} + +func TestParseParts(t *testing.T) { + lines := []string{ + "{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}", + } + + result := ParsParts(lines) + + if len(result) != 5 { + t.Fatalf("expected 5, got %d", len(result)) + } +} + +func TestPart1(t *testing.T) { + lines := []string{ + "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}", + } + + result := Part1(lines) + + if result != 19114 { + t.Fatalf("expected 19114, got %d", result) + } +} + +func TestPart1WithInput(t *testing.T) { + lines := utils.ReadLines("input.txt") + + result := Part1(lines) + + if result != 575412 { + t.Fatalf("expected 575412, got %d", result) + } +} diff --git a/day19/input.txt b/day19/input.txt new file mode 100644 index 0000000..d3b5af6 --- /dev/null +++ b/day19/input.txt @@ -0,0 +1,716 @@ +xn{x>3251:R,x>2998:R,kxq} +fzx{a<1013:A,a>1206:A,s<3847:A,R} +xjm{a<406:R,A} +mzl{m<755:R,a>679:R,A} +fnv{x>2143:sxm,m<2895:A,gh} +hx{x<2183:A,s>3619:A,A} +kvr{s>3669:A,a>584:R,m>2806:R,R} +ngd{s<3561:R,a<2595:R,a>3464:kch,hx} +qvh{s<1945:R,fng} +sr{s<3808:A,R} +rbs{m>562:A,a<333:A,A} +psg{a>561:shp,s>2745:vk,jtr} +dl{s<2761:hvq,fbg} +zfh{m<2326:szm,m<2485:A,R} +pt{a<2937:R,s<3935:A,x>3021:R,A} +rk{x<476:ljz,a<1937:jvg,R} +ps{m<3555:R,s>3909:zrm,R} +rv{s>795:R,s>480:A,R} +lnh{a>2617:gz,fm} +sqb{x>3735:gfv,a<1477:msq,zv} +md{x<1096:A,x<1619:A,s<217:R,R} +ztr{x>767:R,R} +sq{m>1364:A,s>244:A,a<3577:A,R} +rpc{m<420:A,R} +hs{x<554:R,R} +vdl{s<3309:A,a>1384:R,R} +jl{x<1879:mt,A} +zbc{m>1502:dl,rf} +ljr{a<3187:R,A} +bvv{x>2910:bpz,s>3676:qzt,x>2015:R,A} +zfd{m<3356:vgj,a>3007:zzt,gfm} +zq{a>2708:A,R} +fh{a>2705:R,jqg} +mhv{m<813:R,R} +kq{a>2126:R,A} +vk{x>2866:A,jxl} +pbs{a<3509:R,sq} +pkx{x>2891:A,A} +dv{x>326:A,R} +lgv{m<3070:fh,s<1467:mgh,a<2929:pj,nft} +hhb{m>3097:qmt,a>2942:bfr,dkx} +pxc{x<3132:R,m<1265:R,R} +cd{m>3540:A,R} +cq{s>211:A,s<106:A,A} +vqv{a>1867:R,x>3706:A,R} +nb{x>2068:fk,x>1696:svc,R} +th{x<3593:R,s<2701:cf,vjk} +sfs{m<252:gfq,a<618:R,m<353:hkq,cvz} +fzz{a>637:jvq,x<1757:A,x<2008:gxn,nr} +cxd{x<1726:A,x>1873:A,a>2383:A,R} +gtz{m>3441:R,A} +nh{s>2751:A,s<2708:R,s>2735:A,R} +lq{a>1765:R,R} +rzv{a<1448:cjn,gg} +cf{s<2626:R,x<3812:R,A} +mbf{a>2789:A,a>2651:R,m<1004:R,A} +cb{m<1452:R,m<3092:R,s<3880:A,R} +pd{x>2406:A,a<2484:R,m>3832:R,A} +qzt{x>2426:A,a<2554:R,A} +vf{a>1506:mgn,m<2895:cj,a>506:ps,dtx} +dzz{m>3559:A,R} +mr{s<2133:A,s<2292:R,a<2700:A,A} +rn{s>901:A,m>3204:bb,spv} +tnf{x>2142:A,x>1748:R,s>3539:A,R} +cs{s<2710:A,a<3268:R,R} +qc{x>1358:ftl,a>2473:kk,x>799:xsf,xht} +qdm{s>341:A,A} +glr{x<686:dfr,x>1172:vl,R} +cn{m<3652:cxd,A} +cm{m<151:R,s>3876:R,s<3842:A,A} +gfm{x>1439:cn,m<3716:tks,m<3855:jn,jcr} +bf{m<963:A,A} +vlh{m<3510:A,x>2910:R,A} +lpv{s<3981:A,a<1739:R,A} +vjd{m>3232:A,m>3185:A,R} +cbx{m>1016:A,R} +xnc{a>3100:A,R} +qkg{a>1138:R,x>1239:A,m<725:A,R} +stl{m>947:bm,s<3931:A,s<3956:A,pkx} +rf{s>2880:kcz,x>644:xk,zh} +xpd{x>3710:A,s<3512:R,R} +dt{x<3732:R,a<2881:A,a<3307:R,A} +jqg{s<1267:A,x>2703:R,R} +str{x<2942:vzf,x<3428:gl,a<2665:sqb,vt} +nl{m>3788:A,s>1087:A,s>683:R,A} +fc{s<3884:R,x>2689:R,R} +gxt{m>426:ll,m>178:R,x<1350:tmf,st} +zvg{a>3345:R,A} +rkr{a>1171:R,A} +vjv{s>2771:tv,dtz} +fvp{a<1356:sfs,s>928:ss,rsf} +nbf{s<611:R,a<1809:R,A} +jn{a>2068:A,nl} +fzm{a>2076:bpk,x>876:kdd,m<400:jf,tsv} +qvv{a<773:A,m>764:A,A} +hhq{x<921:pks,x>988:cl,qr} +in{s<2529:ntc,xz} +dh{s<3515:R,R} +dc{s>2919:A,R} +mgh{m<3466:rv,a<2753:R,R} +nm{m<3214:A,m<3302:qlm,x>3194:A,A} +spq{m>3854:zvg,x>1467:tfn,s>1060:A,R} +xh{s>2565:A,s>2547:mm,m>597:xkx,qq} +cv{s>2058:R,A} +lfp{m<3165:gdt,xnf} +jv{x>403:R,A} +bqh{m>2771:A,A} +pb{a<1100:A,A} +jcr{s<1408:A,m>3905:cng,x>1043:A,hns} +ccd{s>790:R,kd} +dtx{s<3858:sr,x>3627:R,R} +jfn{m<1123:A,s>3574:R,m>1296:R,A} +rrc{x>2142:R,x>1904:R,R} +jdp{x<3059:R,a>2402:R,A} +pks{s>1682:zpz,R} +ppj{x>304:R,a>1076:A,s<2714:A,R} +jf{x>487:ptd,zvr} +ll{m<826:R,a<714:R,m>1017:A,A} +lvd{m<1464:R,a<2106:tr,a<2987:fzc,js} +kk{a>3251:mbb,pp} +sg{m>2670:R,A} +ssj{m<515:R,x>660:R,A} +zxr{a<1482:tlg,x>1965:gsl,x>841:zfd,qdl} +qvl{m<3128:A,m<3608:A,a>1356:A,R} +bdc{s>3857:R,R} +vxf{s>3540:xtp,bvr} +zfk{m>2828:R,R} +rr{a<901:A,qvl} +vgj{x>1312:bpj,x>1146:lkq,x>1035:sz,rgc} +kb{m>2576:lsc,A} +thg{a>248:hm,s<3241:R,R} +dj{s<3857:A,R} +zc{s<1965:ht,x>1083:fzz,s>2211:dmb,gd} +cng{s<2122:A,m<3953:R,m<3974:A,R} +pg{s>878:R,R} +gp{a>1793:R,x<2223:R,s>3362:R,A} +kxq{x<2775:R,x>2923:A,A} +hsg{s<3226:A,s<3330:A,R} +qlj{a<1311:mv,A} +pr{x>494:mxk,a<2936:kmm,bht} +gpv{x<1269:R,x>1381:R,m>2765:R,R} +vt{m<2555:qst,xtv} +hfl{x<2629:A,a>3143:A,m<290:R,A} +zb{s<1697:A,A} +xrq{s<2864:A,a>2201:A,a>1934:R,A} +fm{m>3529:A,R} +xb{s<2818:A,a<3522:A,m>2849:A,dlx} +bx{a>2926:R,a<2074:R,A} +qmt{s>2887:ls,x>2904:th,dzz} +vp{x>2532:A,a>2417:R,R} +mxk{x<1016:ztr,a<2922:tf,nt} +vg{a>707:fbh,ndl} +mf{a<2235:A,a>3265:fc,vm} +ghh{m<945:A,x<2100:R,R} +mt{x>1602:R,a<2587:A,A} +dlz{s<2689:A,s<2755:rxh,x>3417:nhr,fv} +mbb{s>1105:zb,s>554:pg,a<3688:pbs,bn} +kch{m>2412:R,R} +rc{a<1071:A,m>1532:A,R} +hvq{s<2609:zs,A} +tfn{x>1675:R,R} +shp{a>885:R,A} +jtr{s>2671:jft,R} +kdd{a>1297:jzz,x>1193:gxt,fph} +qq{s<2538:R,x>917:A,s>2544:A,A} +ppl{s>1078:jl,vd} +xj{m<1834:jdp,A} +xk{a<2516:fsh,x<1010:R,gb} +xnm{a>569:A,x<2810:A,R} +dbc{x>494:A,R} +sz{s<1657:A,m<2658:A,s>1972:rt,A} +dmb{s>2330:R,m>2843:sb,zn} +dng{x>641:A,A} +vd{x>1849:kcc,a>1471:jdg,A} +gg{m>550:vvs,fqv} +tks{m>3561:R,x>1115:mg,rq} +sb{m>3390:R,s<2278:A,x>582:R,R} +cj{a>663:R,x<3722:hv,A} +sl{m>882:A,m<559:R,s>3121:R,A} +qg{m<3201:R,a>550:kj,m<3663:gtz,ks} +dlx{s>2981:R,m>2762:R,x>2900:R,A} +xsf{m>838:vr,x<1069:hhq,m<407:fvp,mp} +tdl{m<2890:psg,cph} +bpk{s>2756:lm,a<2944:hkj,s>2634:chv,xh} +msq{s>3563:R,A} +xr{s>969:pxl,x>1315:xp,s>808:rn,gqn} +bt{s>3877:stl,a<748:mbd,x>2916:mhk,zvt} +qbb{s<2087:qkg,a>1376:psf,m<701:tt,R} +pgd{s<3782:A,R} +gt{s>1429:mqf,s<883:lnh,m<3506:lmd,bnf} +dr{x<3120:cjf,xf} +kx{x<3805:dt,dbp} +zh{s<2685:mfj,a>2505:nh,A} +tx{s>3016:A,m>1589:R,m<1202:A,R} +mzr{s<2152:A,s<2369:R,A} +csz{m<3558:R,m>3644:A,x<1610:A,A} +pv{x<3403:R,m>1175:A,x<3663:A,A} +lxp{a<1349:sgq,vlh} +fk{a>1431:A,m>624:A,A} +qln{m>658:R,m>230:R,x>965:R,A} +tlm{s>2998:A,A} +bg{m<3564:A,m<3842:mr,a<2546:mrm,R} +gtt{x>3073:ndc,a>1514:A,m>3368:mz,A} +brb{a<1962:nhh,s<3414:A,x>3675:ntk,A} +jb{a>1737:ffs,x<1868:rr,s>3901:fnv,njm} +vvs{a>2420:pz,m<968:qzv,m>1325:pgd,jvv} +jqf{x<199:A,x>282:A,A} +zvt{s>3818:R,ghh} +fvn{x<862:zgv,m<3183:gpv,x<1080:kf,A} +rsf{m<168:A,A} +mb{m<946:jh,s>2952:lnn,dc} +dbp{a>2413:R,s<952:R,A} +jvv{m<1121:R,bvc} +qr{m>384:R,A} +fz{m<2651:A,x>521:R,kcm} +rt{x<1103:R,x>1126:R,m>2962:A,A} +xkx{x>721:A,s<2541:A,R} +bb{x>618:R,a<730:A,A} +cjf{s<1595:xnm,tz} +jzs{m>2205:mfc,R} +bvr{s<3504:mzl,m<529:A,sp} +njm{x<2075:R,x>2212:R,a>1001:A,A} +spv{a>556:R,a>311:A,R} +tr{x>2436:R,x>1998:R,R} +ptd{m<250:R,R} +qn{x<3690:jz,kx} +slb{s<3298:zfr,brb} +jh{x>440:A,A} +svc{m<571:R,R} +fbg{s<2892:kdc,m>1593:tlm,zcc} +mqf{a>2838:mzr,vzz} +fdx{a>1778:A,a>945:A,A} +px{x<642:zkg,a>2617:R,a<1806:R,A} +xtv{m>3271:hmr,zfk} +tn{s>3889:ct,s>3864:cb,R} +vfq{x>3064:nd,nb} +zs{m<1627:R,m<1709:A,A} +vzz{s>2045:A,R} +hk{x<1088:R,x>1343:A,A} +vtd{m>2563:A,A} +jtj{x>3274:A,a<473:R,m>823:A,A} +phs{a<598:R,A} +ntr{x<3138:qb,m<1906:gs,slb} +nt{m<864:A,m>1209:A,m>1035:A,R} +skf{x>566:A,m>1269:R,a<3927:R,R} +tv{s>2953:tx,bxq} +vl{a<2667:R,m>2153:R,R} +gs{x>3450:lvx,x>3289:vv,fdx} +rpk{s<3582:R,s>3612:R,A} +km{a<749:A,a<1284:A,x<342:R,cbx} +zkg{a<2466:A,m<3369:R,s>2999:A,A} +lj{m<2161:A,s<3583:R,s>3619:A,R} +qst{s<3562:xpd,s<3616:R,s>3629:R,gq} +vm{m>2189:A,R} +bfr{m>2602:xb,a<3314:zfh,x<2501:nj,mgm} +kmm{x>265:jv,x<101:R,a>2067:A,R} +lrv{s<3692:lxp,kgs} +ks{s>2992:R,a<290:R,A} +zcc{s<2977:A,a>2240:A,m>1555:R,A} +fb{a>3815:R,A} +brx{a<1936:R,a>2893:A,s>3670:R,R} +bvc{x<2575:R,m<1200:A,x>3153:A,R} +jsg{x>2068:R,a<2165:R,a<2560:R,vtd} +bpz{a>3141:R,A} +gqn{s>714:R,R} +vv{m<851:dx,hsg} +qb{s<3245:lvd,a>2518:ljr,np} +fv{x>2975:R,a>2100:R,a>1765:R,R} +fng{s<2198:A,R} +vxn{m>2540:td,jvj} +lvx{a>2367:qj,A} +sm{s>2865:A,R} +fd{x>3364:R,s>3207:A,R} +sk{m>3108:lrv,pgh} +qj{s>3332:A,s>3174:R,x>3682:A,A} +jht{x>199:R,x>73:A,s<1771:R,A} +gfv{m>3111:A,lj} +hkq{m<299:R,a>943:A,A} +cjn{s>3767:bt,s>3620:vg,vxf} +btx{m>230:gv,x>3120:dj,a>2783:cm,bdc} +qzv{a<1969:A,s>3716:A,s>3567:R,R} +rp{a>1988:A,R} +bht{m>645:tjd,dv} +rjg{m>3088:fjs,ssx} +rzs{x<2325:jb,x>3195:vf,xpt} +jz{m>2785:A,x>3494:hjq,R} +sgq{s>3667:R,s>3660:R,A} +kf{a>1699:A,x>994:A,A} +mp{s<1635:czp,m<586:qvh,qbb} +pxl{x<1199:xv,A} +dfr{m>2238:A,m<1922:R,A} +gz{m>3455:R,a<3120:A,s>295:R,A} +xf{s<1678:R,s<2190:A,m>2999:R,A} +nhr{a<2390:A,R} +mgm{x<3085:R,x<3642:cnz,mgf} +kdc{s>2843:R,a<2017:R,A} +np{a>1353:gp,rrc} +zvr{s>2854:A,m>163:ppj,A} +bm{s<3928:A,a<960:R,A} +mgf{s<2901:R,s>2964:R,R} +mg{m>3427:A,s<1295:R,x>1251:A,R} +kqf{s>3098:mj,m>1760:vxn,m<1117:fzm,zbc} +gsl{x<3238:lgv,m<3303:qn,mk} +bj{s<3795:A,s>3812:A,x>1973:R,R} +hr{s<1425:lt,a>1855:db,mjq} +nfr{a>1552:rk,s<1607:km,gx} +bp{m<2621:A,A} +gb{s>2681:A,m>1251:A,x>1179:R,A} +ftl{x<2273:ppl,hr} +tsv{m<675:zr,s<2869:kn,mb} +czp{a<1082:A,x>1225:R,A} +dkx{s>2822:zvc,x<2664:jsg,dlz} +ht{x<1235:mdn,A} +jvj{s<2836:glr,jzs} +jzz{m>737:R,x>1187:hq,x<990:sj,R} +qbt{a>1206:A,a>985:R,A} +rgc{x<947:A,x<991:A,x>1012:R,A} +nd{x<3626:A,x<3841:vqv,a>2478:gqd,R} +cg{m<773:A,m>1203:A,s>3570:A,R} +dtz{m>1577:A,s>2670:ln,a<2423:R,pxc} +mfj{s<2589:R,a<1910:A,R} +gqd{x<3905:A,s<2843:R,a>3373:A,A} +mhk{s<3815:qbt,x>3611:fzx,s<3851:A,R} +mqs{s>3564:A,dh} +bmr{m<1271:A,a>2611:R,s>1644:A,A} +qcr{x>551:R,jhb} +hgg{a>2468:hfl,s<3951:A,a>2090:A,lpv} +td{s<2884:fvn,a<1347:qg,px} +nr{m<3123:R,x>2159:R,m<3684:R,R} +nj{s>2799:A,x>1977:A,R} +cp{m<1866:R,s>1215:A,R} +qp{a<2790:bmr,x<368:jqf,R} +mdn{a<556:R,A} +hns{s<2117:A,a>2282:A,s>2269:A,R} +dm{s<2169:A,x<657:R,R} +sn{a>2210:R,m<964:A,R} +ln{x<2615:A,A} +xnf{x<655:vdl,A} +kn{a>917:A,x>513:hnr,R} +gfr{s<3532:R,s>3548:rkn,tnf} +ntk{a>3107:R,s>3439:R,R} +sj{m<479:R,a>1639:A,R} +gh{x>2028:A,x<1932:A,m>3475:A,R} +dkg{a<2503:R,m<2325:A,a<3432:R,R} +lsh{s<364:lp,s>682:R,A} +vr{m>1432:cp,pb} +xht{s>885:nfr,hcr} +db{x<3380:R,hbd} +jnx{s>2169:R,x<596:A,R} +bpj{s<1175:bqh,x>1662:sg,R} +xpt{m>2597:xjf,x>2895:rs,mf} +hm{m>618:A,A} +bn{s>189:A,s<81:fb,a>3814:skf,R} +ssx{m>2746:qdm,m>2510:A,x<1434:phs,A} +gxn{s>2260:A,A} +js{a<3442:A,R} +gx{x>491:dm,x<197:qvv,R} +mrm{m<3923:A,R} +pz{x>2933:pv,df} +mbd{x>2503:jtj,s<3826:bj,zqj} +ctx{x<546:R,A} +hbd{a>2961:R,a<2362:A,a<2699:R,A} +bxq{m>1600:R,s>2850:A,x>2409:A,A} +smn{s<3629:A,s<3759:R,x>225:R,R} +gl{x>3262:zj,m>2861:gtt,m>2162:mqs,xj} +rnf{a<518:R,a<850:A,sm} +hv{a>348:A,A} +qdl{m<3039:kxb,gt} +sld{s>3648:R,s<3591:R,a<2936:R,R} +ft{a<489:thg,s>3262:zzh,s<3200:fhn,qcr} +jkd{s<79:R,R} +tz{s<2153:A,A} +vjk{m>3655:A,A} +xc{m<3559:R,A} +xt{s<3621:cg,s<3701:brx,x>602:sn,R} +jvq{m<3015:R,a<1061:R,m<3598:A,A} +xp{s<797:R,R} +nft{a>3393:zqk,xnc} +ndc{a>2094:R,s<3548:A,R} +zn{s<2255:A,x<695:R,m<2583:A,A} +qrt{s<3513:R,a>2524:A,m>3693:A,R} +tjd{a>3589:A,A} +mv{a>1072:A,R} +pgh{s>3708:vfl,a>1668:bvv,a<818:kb,qlj} +gbs{m<3512:R,R} +gdt{a<1604:ccj,x>985:R,R} +hcr{x>394:pkk,m>1019:rc,m>439:dg,lsh} +chv{a>3345:ssj,a>3126:cs,s>2700:dng,R} +jzl{m>3037:hs,m<2491:sld,x<650:smn,hk} +ndl{s<3671:R,rbs} +cvz{a>979:R,a<739:R,a>832:A,R} +cnz{s<2781:A,R} +fbh{m<918:rpc,R} +lm{s>2892:A,m>711:A,R} +hq{s>2767:R,s>2637:A,s<2593:R,A} +mjq{a<825:R,R} +kcc{x<2092:A,A} +lnn{a>699:A,a>246:R,R} +fhn{s>3134:R,a<969:R,sl} +psf{a>2016:A,s<2253:A,A} +kcm{a>2827:R,x>440:R,a<1937:A,R} +jgz{a<961:xjm,s>2891:zvh,rvj} +fzc{a<2489:A,x<2494:A,a>2789:R,A} +zr{m>522:vtc,a>1052:A,s>2877:R,R} +gq{a<3145:R,R} +mk{s<1620:ccd,bg} +cl{x<1040:A,A} +nhh{x>3435:A,a>830:A,a>384:R,A} +zfr{m>2967:R,x>3600:A,fd} +fsh{m>1280:R,x<1162:R,A} +vh{s>878:mbf,bf} +dx{x>3388:R,a<1335:A,m<405:R,R} +vfl{m<2196:R,R} +pjd{s>3688:A,m>464:R,R} +cqz{a>954:thq,kvr} +pkk{x>638:rkr,a<1428:A,dbc} +qxb{s<3602:R,m>2491:A,A} +pj{s>2073:xc,x<2621:qqt,a>2186:A,A} +lkq{s<1018:bx,x>1224:A,bp} +zgv{a<2224:A,x>546:A,m<3141:A,A} +mgn{m>2921:gbs,s<3896:A,m>2103:pbt,A} +xz{x<1481:kqf,s<3486:vc,m>1519:mqn,rzv} +bts{s<3570:A,s>3606:R,a>2471:R,A} +zpz{m>496:R,R} +zv{a>2220:bts,x<3621:A,rpk} +rvj{x<3473:R,s>2733:A,a>1170:A,A} +xtp{x>2646:A,m>894:jfn,qbl} +xv{a>757:A,m>3128:A,R} +mj{s>3495:bs,m>1827:lfp,a>1367:pr,ft} +kxb{x<345:zgm,s>1073:fz,ctx} +mqn{s>3768:rzs,s<3653:str,sk} +ct{s<3949:R,x>696:A,a>1973:A,A} +jvg{a<1737:A,a<1847:R,A} +pvc{a>3381:R,x<2682:R,A} +thq{a<1154:R,x>977:A,a<1347:R,R} +tt{s>2365:R,x<1249:R,R} +qbl{s>3568:A,x<2082:R,R} +szm{x>3043:R,s<2878:A,R} +st{x<1400:R,m<91:R,m>123:R,A} +kcz{x>566:A,lq} +tlg{x>2401:dr,s>1357:zc,s<613:rjg,xr} +zqj{s<3850:R,s>3859:A,s>3855:A,A} +kd{s>460:A,A} +jdg{m<1150:A,s<484:A,A} +bnf{s<1222:bl,a<3052:R,s>1349:A,ql} +zrm{x>3630:R,s>3967:A,R} +zzh{m<1120:A,A} +gv{x>2542:R,R} +rkn{x<2195:A,x>2501:A,a<869:R,R} +zgm{s<1084:A,m>2642:jht,m<2408:R,A} +drm{s<3500:A,a>2102:R,x>3366:A,A} +tmf{a>760:A,R} +bnn{m>3608:R,s<3751:R,A} +df{m<962:A,m>1157:R,R} +rd{a>2303:R,s<2648:R,m<211:A,A} +kj{s<3017:R,a>858:R,A} +xjf{m<3438:A,R} +csx{x<2468:R,R} +bs{s>3824:tn,m<1628:xt,a>1461:jzl,cqz} +vzf{m<3123:ngd,s>3557:xd,a<1531:gfr,qrt} +xd{m>3497:A,m>3295:R,vjd} +mm{a>3536:A,m>555:A,s<2559:R,A} +hnr{s<2673:A,x<755:A,m<959:A,A} +hkj{m>555:A,a<2424:rd,x<902:gc,R} +pbt{s>3937:A,x<3468:A,A} +ffs{m>2730:R,dkg} +lsc{m<2798:R,a>430:A,s<3683:R,R} +pp{a>2975:mxc,x<771:qp,vh} +vtc{s>2892:R,s<2729:R,a>1134:R,A} +mfc{m<2380:A,x<828:A,A} +zvc{s>2931:kq,m<2670:A,xrq} +qlm{a<813:R,a<1069:A,s>2766:A,R} +kgs{s>3736:bnn,a>2532:pvc,s<3720:R,A} +gzn{s>229:R,m<3460:A,A} +fqv{s<3803:pq,s>3921:hgg,btx} +zj{s>3556:qxb,s<3519:drm,m>2588:A,A} +zqk{m<3685:A,a<3676:A,a<3814:R,R} +lp{s>202:R,A} +pq{s<3603:A,m<340:csx,a<2978:vp,pjd} +mz{a<608:R,m<3746:A,m<3854:A,R} +ljz{s<1757:A,R} +cph{x<2592:rnf,m>3387:xn,m<3074:jgz,nm} +vc{s>3088:ntr,m<2085:vmd,a>1475:hhb,tdl} +jkj{s>1425:cd,a<3393:A,x>1407:csz,A} +fph{a<450:R,x>1027:R,qln} +gd{a<869:cv,s>2117:jnx,A} +rxh{s<2723:A,R} +mxc{a<3082:R,x>586:mhv,x<250:A,A} +fjs{a<579:md,s>354:A,s<123:jkd,gzn} +hjq{a<2329:A,A} +dg{s<319:cq,R} +vmd{m<954:vfq,vjv} +lmd{a>2380:R,x>514:rp,R} +jhb{m>779:R,A} +ntc{m>2235:zxr,qc} +gfq{s<990:A,A} +gc{x>417:R,a<2769:R,A} +ql{m<3716:A,R} +dbs{s<490:R,a>2127:R,m<1237:R,R} +ls{m>3648:pd,zq} +sp{x>2541:R,R} +ccj{s<3261:A,a>646:A,s>3388:A,A} +rs{s<3892:R,a<2025:R,pt} +hmr{m>3621:A,a<3272:R,A} +sxm{s<3964:R,A} +lt{x>2927:dbs,m<1464:A,nbf} +ss{m<182:R,a<2068:R,A} +jxl{x>2236:R,A} +jft{m<2517:A,m<2717:R,x>2581:R,R} +tf{a>2125:A,A} +rq{x<977:A,x>1029:A,R} +zvh{x<3458:R,s<2980:A,s>3018:R,R} +zzt{m<3751:jkj,spq} +qqt{m>3553:A,a<2197:A,m>3284:A,A} +bl{a>2721:A,m<3736:A,R} + +{x=1,m=2238,a=2402,s=929} +{x=1167,m=654,a=205,s=508} +{x=1057,m=2051,a=35,s=1791} +{x=633,m=502,a=2726,s=178} +{x=3343,m=2315,a=845,s=2005} +{x=987,m=2081,a=111,s=499} +{x=464,m=1999,a=799,s=1982} +{x=801,m=3195,a=518,s=1247} +{x=1506,m=2075,a=285,s=1} +{x=1075,m=1366,a=384,s=697} +{x=33,m=1008,a=371,s=1901} +{x=426,m=43,a=115,s=14} +{x=595,m=2121,a=979,s=2493} +{x=557,m=3576,a=3003,s=3096} +{x=837,m=1269,a=921,s=1983} +{x=1367,m=230,a=3300,s=909} +{x=1713,m=1878,a=130,s=508} +{x=531,m=1098,a=675,s=886} +{x=508,m=2018,a=2121,s=1761} +{x=1579,m=399,a=19,s=226} +{x=163,m=35,a=243,s=1169} +{x=913,m=221,a=309,s=1305} +{x=1780,m=164,a=1685,s=239} +{x=86,m=208,a=2727,s=132} +{x=842,m=2703,a=2300,s=386} +{x=556,m=454,a=57,s=2120} +{x=1711,m=1273,a=875,s=1067} +{x=862,m=939,a=434,s=3341} +{x=842,m=417,a=1666,s=203} +{x=93,m=1955,a=213,s=2849} +{x=636,m=103,a=62,s=104} +{x=3715,m=2014,a=1917,s=3128} +{x=225,m=477,a=225,s=579} +{x=556,m=2243,a=1176,s=420} +{x=10,m=1556,a=62,s=275} +{x=1649,m=2498,a=368,s=305} +{x=437,m=1148,a=1488,s=2419} +{x=2918,m=540,a=2488,s=174} +{x=3431,m=3207,a=1089,s=2740} +{x=661,m=560,a=441,s=439} +{x=292,m=59,a=310,s=109} +{x=497,m=452,a=691,s=2012} +{x=227,m=1424,a=1182,s=1228} +{x=225,m=418,a=159,s=64} +{x=1490,m=216,a=38,s=1582} +{x=483,m=2919,a=840,s=973} +{x=3796,m=1362,a=183,s=589} +{x=177,m=455,a=2028,s=378} +{x=1603,m=1973,a=2024,s=1437} +{x=98,m=2714,a=270,s=3171} +{x=655,m=220,a=107,s=74} +{x=1911,m=196,a=919,s=445} +{x=199,m=766,a=33,s=81} +{x=666,m=997,a=211,s=25} +{x=1257,m=1933,a=178,s=1737} +{x=1418,m=2460,a=150,s=876} +{x=36,m=170,a=1027,s=2305} +{x=888,m=407,a=1228,s=1154} +{x=249,m=1320,a=237,s=504} +{x=612,m=1863,a=1157,s=584} +{x=2875,m=900,a=2159,s=1313} +{x=666,m=2748,a=1017,s=2853} +{x=1616,m=1549,a=2079,s=51} +{x=792,m=500,a=1142,s=2063} +{x=300,m=1241,a=315,s=687} +{x=2403,m=1700,a=697,s=375} +{x=136,m=171,a=911,s=8} +{x=1166,m=15,a=757,s=920} +{x=402,m=58,a=153,s=1538} +{x=25,m=2776,a=289,s=328} +{x=198,m=1391,a=43,s=726} +{x=1221,m=2017,a=27,s=3246} +{x=938,m=419,a=1419,s=15} +{x=3,m=312,a=1043,s=1592} +{x=622,m=418,a=1779,s=2738} +{x=1246,m=1775,a=2296,s=5} +{x=51,m=54,a=1279,s=271} +{x=283,m=513,a=3063,s=51} +{x=1283,m=232,a=916,s=316} +{x=13,m=1554,a=546,s=1334} +{x=757,m=1267,a=1330,s=378} +{x=645,m=867,a=927,s=2383} +{x=24,m=759,a=266,s=193} +{x=473,m=527,a=949,s=244} +{x=3364,m=3296,a=1615,s=411} +{x=992,m=1353,a=84,s=57} +{x=1578,m=568,a=655,s=955} +{x=1028,m=1647,a=2158,s=1077} +{x=2887,m=921,a=2764,s=1174} +{x=51,m=433,a=558,s=3544} +{x=83,m=1741,a=766,s=618} +{x=12,m=615,a=728,s=192} +{x=1395,m=2765,a=126,s=2257} +{x=1817,m=601,a=2066,s=1226} +{x=320,m=1235,a=1811,s=508} +{x=571,m=487,a=174,s=384} +{x=961,m=608,a=2038,s=75} +{x=714,m=2845,a=2142,s=1238} +{x=1766,m=547,a=401,s=283} +{x=441,m=694,a=2733,s=1217} +{x=2858,m=123,a=3890,s=916} +{x=253,m=12,a=430,s=1006} +{x=2658,m=3720,a=115,s=647} +{x=671,m=1761,a=3008,s=223} +{x=243,m=1305,a=642,s=1422} +{x=1139,m=516,a=1393,s=1171} +{x=543,m=1067,a=146,s=232} +{x=1414,m=1961,a=282,s=1623} +{x=2310,m=3149,a=1693,s=1152} +{x=320,m=108,a=3353,s=1458} +{x=1406,m=1560,a=691,s=916} +{x=36,m=382,a=3278,s=847} +{x=3058,m=1269,a=2230,s=276} +{x=161,m=93,a=986,s=1150} +{x=673,m=1621,a=122,s=443} +{x=224,m=1945,a=2445,s=1107} +{x=1349,m=252,a=188,s=1217} +{x=1619,m=614,a=2847,s=74} +{x=1850,m=376,a=861,s=223} +{x=29,m=384,a=9,s=1531} +{x=354,m=377,a=81,s=725} +{x=15,m=1362,a=97,s=800} +{x=250,m=129,a=1454,s=1099} +{x=1474,m=478,a=570,s=147} +{x=282,m=723,a=1045,s=768} +{x=1718,m=600,a=141,s=489} +{x=1069,m=314,a=9,s=1064} +{x=90,m=226,a=2461,s=1433} +{x=96,m=810,a=160,s=182} +{x=325,m=608,a=874,s=462} +{x=631,m=185,a=223,s=714} +{x=466,m=657,a=1138,s=34} +{x=706,m=598,a=684,s=169} +{x=202,m=948,a=1108,s=1550} +{x=1641,m=25,a=511,s=822} +{x=894,m=1284,a=116,s=215} +{x=1248,m=1254,a=966,s=3568} +{x=719,m=101,a=3277,s=366} +{x=1167,m=1559,a=1421,s=1406} +{x=2299,m=1014,a=201,s=1050} +{x=967,m=856,a=620,s=1483} +{x=1746,m=2505,a=2756,s=598} +{x=145,m=991,a=48,s=700} +{x=1030,m=623,a=787,s=1457} +{x=411,m=1156,a=1248,s=2082} +{x=622,m=421,a=2069,s=110} +{x=414,m=1681,a=1928,s=1609} +{x=43,m=2391,a=1710,s=91} +{x=1112,m=62,a=123,s=1481} +{x=201,m=84,a=627,s=1782} +{x=2576,m=3267,a=2457,s=765} +{x=1322,m=46,a=1087,s=2668} +{x=1711,m=494,a=2005,s=2149} +{x=467,m=484,a=497,s=282} +{x=1168,m=373,a=1067,s=31} +{x=46,m=414,a=1349,s=492} +{x=970,m=801,a=453,s=105} +{x=1317,m=1457,a=271,s=544} +{x=1473,m=810,a=99,s=1058} +{x=2432,m=314,a=2639,s=1813} +{x=137,m=526,a=944,s=572} +{x=442,m=1916,a=176,s=1922} +{x=746,m=520,a=489,s=1415} +{x=2874,m=852,a=1756,s=615} +{x=57,m=462,a=1542,s=607} +{x=39,m=1062,a=242,s=240} +{x=2395,m=1400,a=701,s=215} +{x=2194,m=479,a=1698,s=884} +{x=730,m=1239,a=598,s=309} +{x=1092,m=2266,a=323,s=463} +{x=2690,m=19,a=1676,s=1315} +{x=1225,m=1691,a=827,s=1638} +{x=296,m=719,a=31,s=2510} +{x=1446,m=658,a=317,s=124} +{x=2326,m=9,a=1793,s=3553} +{x=666,m=1152,a=1943,s=1416} +{x=848,m=56,a=477,s=21} +{x=2330,m=52,a=441,s=568} +{x=392,m=752,a=986,s=1940} +{x=1234,m=101,a=2553,s=59} +{x=105,m=484,a=629,s=39} +{x=207,m=10,a=558,s=193} +{x=1818,m=2864,a=561,s=160} +{x=1518,m=404,a=1611,s=913} +{x=300,m=864,a=276,s=132} +{x=3058,m=2953,a=415,s=2177} +{x=2082,m=762,a=375,s=62} +{x=857,m=2994,a=75,s=129} +{x=6,m=814,a=837,s=2241} +{x=2741,m=1165,a=277,s=987} +{x=320,m=359,a=1279,s=961} +{x=2283,m=1328,a=2564,s=660} +{x=1953,m=2089,a=205,s=444} +{x=100,m=154,a=33,s=324} +{x=119,m=2222,a=381,s=2509} +{x=3114,m=42,a=1689,s=631} +{x=230,m=1661,a=440,s=2263} +{x=2345,m=42,a=2341,s=103} +{x=1973,m=466,a=1694,s=1264} +{x=405,m=428,a=110,s=637}