heh
| -rw-r--r-- | out | 46 | ||||
| -rw-r--r-- | src/inp.txt | 3693 | ||||
| -rw-r--r-- | src/main.rs | 259 |
3 files changed, 458 insertions, 3540 deletions
@@ -0,0 +1,46 @@ +x00 XOR y00 -> z00 +brk XOR hmc -> z01 +rhd XOR rcm -> z02 +psb XOR sgb -> z03 +jhh XOR vws -> z04 +ckj XOR tbw -> z05 +wtm XOR phh -> z06 +std XOR jfr -> z07 +cct XOR cjn -> z08 +wpc XOR rds -> z09 +kgd OR kqf -> z10 +mwk XOR jtg -> z11 +jnk XOR tqk -> z12 +vbn XOR mkk -> z13 +njj XOR mjm -> z14 +qkj XOR fdg -> z15 +sbt XOR hrt -> z16 +thq XOR mfd -> z17 +y18 AND x18 -> z18 +wsq XOR cvr -> z19 +spr XOR vcn -> z20 +tsq XOR pmr -> z21 +kdn XOR cpv -> z22 +gwq XOR wrn -> z23 +jmh XOR mrs -> z24 +mtn XOR tff -> z25 +png XOR gdq -> z26 +qqs XOR tdp -> z27 +grq XOR vfq -> z28 +wws XOR cdh -> z29 +dkj XOR gqs -> z30 +fkf XOR whs -> z31 +bgf XOR mcr -> z32 +cvt AND wwp -> z33 +vkd XOR vtd -> z34 +swf XOR hqk -> z35 +wfd XOR cwj -> z36 +bmt XOR jsp -> z37 +bhv XOR kqb -> z38 +wpd XOR ndm -> z39 +rbn XOR whm -> z40 +jhm XOR fqt -> z41 +jgh XOR gms -> z42 +bmw XOR bng -> z43 +cwt XOR mcd -> z44 +fmp OR pcq -> z45 diff --git a/src/inp.txt b/src/inp.txt index 3cfb7c6..573622c 100644 --- a/src/inp.txt +++ b/src/inp.txt @@ -1,3380 +1,313 @@ -qn-ub -ra-sg -zx-kx -go-xf -kz-fc -vb-sp -mt-oc -da-xb -hu-gq -cg-nn -le-lw -zk-uf -ss-wn -yg-mf -vw-pe -bc-jp -xb-qi -jd-fj -en-os -du-ha -zo-rx -ss-jf -xs-zt -an-wj -ua-pj -am-tq -ae-pb -gy-ce -yp-qk -qs-cw -da-qi -nu-cr -wp-ui -jn-im -zm-pq -gc-yl -cs-xs -wo-xx -bo-cg -nu-nt -pr-op -ha-bm -qm-ld -go-ef -wo-jp -cq-sf -dh-sm -wy-bl -av-wg -fa-ue -eo-qz -fk-mj -mh-bi -ui-lt -ep-og -jg-oa -yb-ft -sz-oo -jl-yu -cb-lo -ln-hu -ak-ou -yx-gg -cr-ag -pj-al -kl-os -hl-zp -yj-lp -li-rz -qr-uh -qs-tx -mj-eq -bd-ev -jm-kh -et-oy -br-ku -na-em -mw-rn -sx-fw -og-wq -rs-bu -bl-tt -hg-ba -qs-sb -la-tu -ab-ma -eq-ca -ex-uz -iz-we -kn-of -nd-jf -wh-gb -pj-gz -et-lz -xq-ga -tw-ew -sv-im -uv-xl -ud-hx -jf-eo -kd-xo -jb-sa -og-vz -jm-sg -cg-lg -ol-vd -dm-qv -vq-mw -id-pr -tk-cp -dw-hn -ai-oy -rm-xe -vy-xb -gx-rw -di-to -fl-gc -vm-go -db-kh -ap-vm -nv-ua -eu-zi -gt-la -df-xa -xz-ig -lv-bs -ch-mj -za-bz -mh-vz -ta-wc -qp-qv -gv-mw -ju-xo -tt-sa -pc-js -cc-vn -ca-it -hw-mc -qy-rq -iw-xg -di-if -an-gf -gi-wj -yn-rk -sp-fz -ps-fq -gy-zp -hq-fc -uw-jx -pd-zm -ho-uo -gm-ni -ei-wv -vj-gn -dt-de -ss-ys -oc-jy -bw-nm -hl-ci -uv-ry -jn-bb -vn-yz -sg-ms -jf-dr -ox-dp -pe-yy -he-dd -ei-gw -fr-ic -ag-qw -ht-pa -sf-gl -hq-ea -xx-rs -bc-fh -uf-yu -bf-qz -pl-ye -dg-xo -rf-ui -uu-xc -gi-xp -yt-ll -qm-zc -zp-yy -qf-sa -sq-od -rz-yg -gh-sp -ui-rx -lp-qk -jb-hf -fp-ru -xv-gy -uo-un -dm-ug -ln-hx -ux-zc -zr-ic -tv-jz -kz-wx -xx-ed -ld-ij -ab-yt -wm-vx -rv-ww -tn-ym -fj-vm -se-sp -yy-mz -ds-qq -nd-od -tl-jc -ym-xz -ro-ql -vj-jh -fj-zv -yv-kh -zb-ff -lv-tq -nc-dp -mp-ko -aj-hk -yx-ch -vx-hn -vh-zw -py-xk -ue-rg -ek-ma -co-ed -ll-qn -ox-nc -lo-tw -uw-as -sk-sv -at-bi -cj-rx -bi-wq -za-fx -ui-zo -di-qp -fq-sp -bf-dq -vo-gb -lk-yd -gp-mp -zu-jk -ch-je -sm-rh -gm-fm -nq-gl -ig-aa -vd-sp -zt-cs -dx-uy -ld-uo -sk-wx -ka-pl -jh-ht -ha-yk -wu-xz -hm-fk -tl-xf -io-uf -jj-yb -zd-lz -fq-je -ht-kl -ee-le -qf-bl -yn-xp -mb-nv -xa-nz -ji-sb -gb-jl -nx-vv -ff-bb -vr-ow -rs-sr -ok-nc -cw-gx -wy-hf -dn-sp -cc-mw -ou-gw -ep-dy -rb-ld -sf-nq -rg-kc -qy-sw -eu-nh -yp-ij -py-ah -bz-zb -ai-ul -ga-rn -mp-nn -wp-sn -cu-as -jf-aw -ky-ze -eu-bp -hm-zb -wl-bf -yt-xa -pc-ao -az-ty -pq-kx -lw-kd -jh-pd -qr-nh -qs-ou -by-bu -wu-so -fm-ve -kd-ok -ds-yg -eq-it -ix-nx -bc-jj -uy-zm -mc-sx -av-yk -bt-uz -mj-gg -cb-me -ul-oy -fu-vt -ro-cr -lv-oj -ng-rr -rs-gn -xs-hk -dt-zb -ah-at -xq-dx -gx-ak -ca-er -qw-yq -dw-vv -rq-yb -ps-ab -nh-uh -vn-as -zo-sn -bq-pl -lw-dp -fj-ap -rv-nm -se-fz -du-va -vn-zu -fz-it -ti-gi -ze-jm -cx-bt -rz-ow -wi-gm -at-xh -xe-sa -or-ub -dm-qp -sj-zu -en-qn -ng-df -ab-xc -gf-uu -tk-no -nz-jk -od-dr -qk-fa -jx-cc -ka-oj -er-yx -ph-vc -pk-vj -yw-jr -xo-ok -rv-zd -we-bl -pd-pq -bu-iv -yc-mp -zu-vh -dm-oc -hu-ht -la-iw -kh-sg -pb-yk -nd-aw -qj-aj -uz-qf -bz-jn -ic-nu -wg-yk -ix-dw -qm-rw -ye-dl -df-iq -iz-gg -jp-by -mn-hk -id-uq -kc-td -xp-hf -yp-sl -aj-nq -ry-go -kv-ed -iz-ca -aa-fu -sz-hw -li-hy -gy-or -cj-sn -sg-gz -lv-kh -io-jl -yz-rg -ao-hz -tq-bs -iw-oo -ot-gw -rm-ak -zt-qj -ol-gh -ky-fx -lt-zo -fu-hq -or-yy -mu-kk -vm-zv -hk-qb -iv-ed -dr-nd -ym-fn -rn-dx -zd-ww -se-vb -sx-iw -cx-ex -ow-mf -kv-gn -ux-fa -ek-xa -bt-bl -vc-vo -xw-cv -sw-pm -ga-hv -mc-in -yz-ux -bo-ao -rl-sw -wl-cp -qz-ba -oa-yr -yg-jg -ow-li -gp-nn -as-jx -wc-uz -xv-yy -rf-kp -dp-ee -vw-ce -ds-li -rg-fi -br-fn -rh-nv -ln-nx -hm-iz -un-gy -xh-ep -in-iw -ou-tx -ba-oq -mc-iw -bb-im -xo-st -jh-pq -ng-mb -zc-kc -od-ss -we-mj -nv-sm -mb-cb -sw-jj -sx-oo -vr-of -jk-as -yp-lp -pd-sl -sg-db -wh-vl -kq-tq -yo-co -ou-xe -ve-rw -rb-hx -jq-uu -zm-pk -mx-vb -or-tj -rl-rq -vx-jh -bi-xh -fy-hf -py-ru -kr-lg -in-xo -fr-hl -os-ev -aw-lq -cb-tr -uu-yn -qk-wk -du-av -uu-uf -kc-au -vq-vh -ra-jm -gt-hw -wj-rk -hq-tb -jg-sm -im-yf -tr-mb -qk-yj -wq-ep -sk-su -et-nm -fo-ot -ea-gd -jh-sl -sq-dr -if-qh -dm-di -lr-rn -av-ha -an-uu -gb-cq -ul-jn -wp-lt -zs-nc -kd-nc -gc-ff -hz-to -bp-qr -sa-ex -cc-pd -bd-uw -ak-gw -gm-da -gv-uw -jd-ap -lc-vy -mq-iv -gz-jm -yf-xa -bx-uv -mu-oo -dy-wu -nb-eg -ai-bw -sx-la -nx-em -mw-uw -rf-ty -gc-zb -cw-ak -yk-pr -qf-cx -bo-lg -lm-sn -fk-ca -lo-me -ha-fc -ef-ap -rb-qm -fd-pq -xv-jz -ae-av -hs-xp -sn-ui -sz-la -gq-ev -hb-dd -hq-aa -fu-kz -zx-sl -zv-ef -nj-wp -nq-hk -er-ch -hw-sx -ox-kd -vq-gv -fy-uz -xe-ak -vr-rz -iz-eq -oq-tk -kp-ui -cj-ty -tn-ku -no-dq -ib-il -wv-pj -le-zs -hn-sl -te-ds -vw-or -sd-ys -nn-lg -nb-sp -zt-mn -qd-mp -ig-ku -eo-oq -gm-vy -lq-jf -xp-xc -og-mh -zi-xq -tn-xz -cz-ba -as-sj -ro-nu -ia-hl -ae-op -cd-ps -tt-jb -to-dm -bu-hg -yf-dq -fp-ls -dl-oj -nj-ui -st-ee -mc-kk -ix-bh -vd-gh -sm-yr -st-zs -sb-ak -ue-ux -it-yx -jg-yr -lp-il -zw-vq -dd-rw -zb-fl -gx-gw -gv-vh -dh-pj -ot-cw -xk-xh -la-mc -ql-ww -fk-me -iv-lg -qf-hf -lv-cn -zs-ye -ah-bi -wk-lk -to-ml -rq-fp -vb-vd -bo-gp -vw-gs -yv-fx -ka-bs -vb-pi -rv-ai -fw-mu -zd-ac -vy-ni -nq-cs -tj-ce -mu-hu -ul-ac -dt-jn -po-tq -py-bi -zw-on -dg-st -xu-nx -lr-bj -hb-he -ze-ra -ws-yw -no-cz -xf-fj -hg-cp -eq-er -kc-bj -pq-wm -bs-bq -ew-iq -ah-xk -zb-im -ql-et -cq-yu -wu-tn -fz-ol -ng-ew -fd-pl -on-dn -ys-wg -qn-bd -ju-lw -iw-fw -yr-fg -az-rx -zx-vx -pi-sp -ib-wk -zk-po -sc-ij -ua-jg -ty-rx -ek-cd -gd-kz -du-bm -os-am -rl-bc -wa-ij -ca-mj -lg-ko -aj-gl -lr-ux -nj-sn -dl-ji -ot-tx -zv-do -ru-og -vt-jj -tn-fn -uh-vl -rs-wo -gn-th -wi-qi -yw-jk -oy-lz -rg-td -ds-mf -gy-yy -ta-ps -no-bf -jd-do -jg-pj -lr-zc -xe-ff -vd-nb -yv-gx -cu-pm -gn-ed -wk-yj -yl-qw -id-yk -go-jd -vb-eg -vw-gy -xs-nq -az-lt -bd-en -vt-fp -ht-gq -qi-jr -lt-lm -ff-ol -jl-cq -tq-pl -pg-bl -ah-ep -ma-wc -jg-zz -vy-jr -ai-nm -il-ph -cx-tt -hv-eu -hy-te -am-pl -ku-dy -so-tn -tk-hg -tj-vw -ex-fy -jl-wh -xx-th -qi-ws -vi-ti -uw-vq -dz-mf -pc-kr -tj-tv -js-sb -le-xo -tt-bt -hg-eo -dr-ss -dt-gc -ei-pj -ef-do -dl-ka -ow-hy -kv-wo -en-kl -yu-vo -hs-an -bs-oj -zv-xf -ka-am -xb-yw -nt-ir -sj-uw -dm-hz -hv-dx -pc-qd -pe-gy -ua-ei -yw-wi -er-fk -cb-iq -bo-qd -tz-tl -bf-tk -rn-eu -ft-bc -og-hi -ey-fa -nn-kr -yc-bo -fi-kc -sx-sz -ro-fr -tl-go -bt-ex -fy-cx -mt-ba -qw-ff -ox-le -ps-xa -mu-hw -yr-rh -ag-ia -ld-ve -tz-sz -am-kq -jc-zv -il-wk -sn-kp -nh-xq -ds-rz -bf-cp -jj-rq -sm-wv -wv-rh -ds-hy -xh-yu -sb-tx -xu-vv -vm-xf -vl-cq -dz-te -dz-rz -le-st -eq-ch -zi-bp -wa-yp -ir-ro -jz-tj -po-cq -jy-mt -yq-bb -zk-vo -ku-xl -td-xm -dg-ju -oo-kk -tb-sv -go-ap -gi-vi -xj-qm -au-yv -tz-zv -ze-fx -pc-gp -if-ug -qy-zg -vy-wi -qk-sc -tk-qz -sr-cr -hn-pq -ve-uo -lz-ac -vc-io -wm-hn -nz-ta -fj-rl -lv-ye -wq-py -id-va -dl-tq -bh-nx -jy-if -dd-xj -cd-yf -at-nj -hk-qj -kk-hw -nz-ps -uo-rw -en-pn -mx-dw -iw-mu -py-hi -ud-ix -fs-bf -uv-tn -ij-lk -vc-zk -ub-os -wn-co -ng-te -tq-mi -eo-tk -if-hz -je-cd -os-ll -vi-xp -pf-hx -aa-ea -rv-oy -zm-hn -lo-ng -pn-hu -he-ve -bu-gn -if-mt -sz-fw -as-zw -fi-ey -jr-da -pq-vj -cz-cp -vr-ds -qq-vr -al-dh -uh-rn -cq-vc -bs-ye -lt-sn -vr-li -ok-ox -wn-dr -mt-qh -no-qz -xw-cb -ao-nn -gg-ca -mw-jx -oo-gt -dy-so -at-wq -yd-eq -gt-gd -gq-qn -ef-tl -nx-mx -lt-rf -su-tb -jp-xx -tv-or -xe-fo -hn-xj -wk-yp -cd-xa -xj-hb -vh-mw -ta-xa -ze-za -qb-zt -tv-mz -fz-vb -nc-ee -oc-ml -df-lo -tx-ak -st-ok -li-yg -xt-ij -ym-ku -yl-fl -ka-tq -hn-kx -qi-lc -id-av -lr-xm -wj-yn -dq-oq -ic-ro -fi-lr -gi-uu -ef-vm -fe-zi -dy-ym -gb-vw -hw-oo -jd-xf -kp-az -vc-gb -ix-mx -od-aw -yf-ps -kk-sz -rg-ey -jc-ef -ro-ia -ql-ai -qp-ml -bw-ql -yu-zk -bg-er -pq-vx -ww-ny -le-dp -cc-vq -po-gb -ty-zo -cv-tr -eu-kl -dl-bq -pi-dn -kv-by -by-th -fo-tx -ek-fq -cz-bf -zr-cr -uv-so -wy-qf -ng-xw -da-vy -yb-fh -rr-tw -dp-kd -ue-td -he-ld -sl-pk -jq-ti -kv-di -xv-mz -uy-eu -lc-xb -ql-rv -am-dl -qw-fl -wm-zm -kl-gq -ek-ab -jg-al -vq-kk -re-vz -ag-ci -ft-qy -wc-ab -df-tr -rg-bj -dt-bz -br-xl -fe-uh -cb-ng -oq-wl -xh-ah -or-jz -zc-ey -rf-wp -su-fc -cd-wc -xz-uv -qq-yg -fx-tn -po-uf -xv-gs -ry-jc -se-on -nj-az -qf-ex -ev-pa -wm-ta -pm-xs -wg-du -fn-so -mc-tu -ga-bp -rq-sw -yd-ib -nd-yo -vt-ft -wp-ty -wx-tb -te-rz -yy-ce -kz-sk -in-la -jc-tz -ty-lm -rm-tx -pk-wm -zu-uw -fz-oz -ua-yr -eu-fe -hg-dq -jj-fp -oz-pi -sx-tk -to-ug -pr-wg -lo-xw -pf-ud -de-ff -ah-mh -jp-mq -dw-pf -gd-wx -jm-mo -pi-se -hz-jy -va-bm -pg-uz -dm-if -zk-gb -rm-fo -wg-ae -dh-ua -wl-hg -dx-fe -lr-kc -qm-ve -ab-fq -fi-yz -gh-fz -uo-kn -ew-mb -yu-ph -jb-fy -it-iz -ue-xm -os-ht -td-ey -fk-we -em-hx -dh-jg -fd-pk -mj-hm -vt-sw -tv-xv -xp-gf -sm-zz -mn-pm -le-ok -su-sv -jj-qy -br-uv -ix-hx -ok-zs -ch-iz -gw-xe -fm-yw -yc-nn -rq-bc -bc-ls -li-dz -am-cn -ni-qi -nb-pi -il-wa -xw-tr -wo-xg -aj-sf -wj-ti -co-ys -qk-ij -ot-gx -fw-in -ed-mq -jq-gf -sr-nt -yz-td -qs-me -pa-en -xv-or -xz-qy -or-pe -cw-ji -kk-in -ng-iq -gq-ll -se-oz -uf-wh -jz-gy -on-gh -qm-ms -do-ry -ga-qr -tz-fj -uh-bp -qd-cg -hv-fe -jk-vq -oz-dn -ho-qm -uq-ha -mj-bg -hs-rk -et-ai -th-rs -cw-tx -yj-yp -xj-un -rb-uo -qp-to -sk-kp -qd-ko -fy-pg -wu-xl -yg-ow -qb-cb -bx-ku -az-ui -dq-fs -fc-ea -pm-hk -oy-nm -xh-mh -bw-lz -xl-xz -na-xu -au-fx -uw-vn -ds-kn -rf-zo -gg-it -jh-zm -ek-cs -sj-gv -bw-ww -dd-ve -yj-wv -cp-qz -zi-uy -wu-ig -gp-js -rq-vt -ew-xw -wh-po -jq-hs -fn-xz -tj-gs -un-ho -za-ra -an-ti -vo-cq -xm-wh -fl-bz -ju-ee -sz-gt -bl-sa -na-ix -ux-ey -lk-qk -mq-kv -bx-tn -fl-nq -sq-lz -ug-oc -lq-sd -jb-cx -ga-dx -rh-zz -ze-db -by-aa -ul-bw -ul-nm -ub-hu -tq-oj -fk-iz -fl-dt -ru-at -ud-em -gb-yu -vt-rl -cg-mp -xe-cw -hf-cx -gv-jx -jx-vh -bj-tv -kd-xl -by-iv -mf-fk -zw-sj -fl-ff -of-dz -ef-xf -sq-nd -ju-dp -ug-qp -xt-yd -lc-wi -pk-pd -eg-vd -qy-bc -ot-ia -av-pb -ko-js -tb-fu -zd-bw -tn-br -kh-ky -gn-xg -fo-gw -zi-rn -er-we -xb-gm -fh-zg -ao-cg -gn-xx -xm-fi -vb-nb -oo-in -gh-eg -eq-yx -ha-pb -qf-fy -vr-te -wl-cz -ce-gs -kl-qn -dr-vm -cw-rm -wl-dz -aj-xs -wx-su -av-op -js-bo -vt-ls -ps-ek -op-pb -ei-oa -rg-ux -pf-xu -zz-oa -yz-ue -oa-dh -qj-gl -wg-id -gq-pn -zz-dh -un-he -lk-ib -bz-de -tw-ng -wy-bt -sk-hq -gz-kh -ds-dz -ln-ix -pa-bd -hz-ls -fk-yx -ug-qv -uz-qh -na-hx -cs-aj -vi-yn -yv-sg -qi-hy -ci-ic -lc-en -he-qm -ao-ko -un-ld -sx-ah -fn-dy -ba-dq -xq-eu -kh-mo -hn-zx -ny-zd -lk-sc -ma-yt -gh-ny -vy-gs -du-uq -nn-pc -mz-pe -kd-ju -qy-fp -sc-lp -pe-ce -il-lk -za-db -iq-xw -cb-df -rr-iq -fq-xa -ew-df -hl-ic -oo-fw -ao-qd -ca-hm -zd-ql -ee-zs -je-ma -ep-at -vm-ry -xo-nc -mz-vw -qi-fm -za-iz -uy-ga -rb-he -ko-nn -rq-ls -nq-mn -bm-wu -zi-ma -uv-ig -hf-sa -st-ju -ol-eg -on-pi -xt-lp -hq-su -ox-lw -et-ul -dn-fz -pl-oj -ug-qh -sl-vx -bd-gq -fa-rg -ji-tx -ny-ql -xl-ga -bj-yz -ln-ud -mh-ep -hs-yn -kh-za -oo-la -og-xh -wl-eo -nc-dg -rb-hb -bm-wg -vr-ey -pg-qf -ah-hi -fd-hn -nv-dh -oz-vb -dq-wl -by-mq -iz-er -go-jc -bb-yl -bz-gc -it-er -if-to -wp-rx -qn-yp -mf-hy -as-vh -qb-xs -lp-jd -fc-sv -ba-tk -lo-iq -zt-aj -nd-if -we-yx -ni-wi -jb-wy -tt-pg -cz-oq -xf-qp -mh-wq -hm-gg -jl-vl -kn-ow -ia-ic -je-ab -fi-bj -yj-il -sl-fd -we-bg -tv-pe -sd-co -lg-pe -gx-ou -ae-du -ju-ok -xl-so -dl-kq -sv-re -ux-fi -im-fl -ab-nz -pf-na -wa-ib -am-bq -dm-qh -hi-mh -ed-by -kn-yg -fs-ku -tj-it -zz-nm -hw-la -bi-ru -al-nv -ms-xj -pe-zp -zv-go -ky-ra -nn-js -rk-uu -ws-wi -il-yd -ey-lr -py-mh -av-pr -ib-xt -dx-eu -cj-lt -de-qw -bi-tw -dx-ac -di-ug -ra-mo -bm-pr -zu-jx -sb-fo -jy-to -cw-zp -ga-zi -ea-tb -eq-gg -ry-zv -xv-tj -xj-kl -tv-zp -tv-gs -pd-vj -yj-sc -ex-pg -rm-sb -fu-sk -jd-zv -jy-qv -xo-dp -ef-jd -ji-gw -mb-iq -am-ye -nh-zi -ta-yf -na-dw -qq-rz -wa-xt -fg-qi -yw-ni -lg-js -re-kz -tl-ap -wq-pb -fy-sa -yo-ss -di-ml -fi-rq -he-xj -aw-ys -zo-az -dm-ml -ei-zz -uq-pb -ho-dd -fq-nz -po-vc -lw-ee -sk-gd -du-pr -am-mi -fg-fm -kp-rx -ql-lz -zm-vx -vo-vl -de-yl -pr-oq -co-jf -an-vi -ft-rq -cr-ia -ro-nt -nd-ys -by-wo -nv-ei -gf-xc -eq-hm -yb-zg -ig-ym -gy-tv -hg-fs -vo-wh -rg-xm -ru-vz -jk-sj -ud-zk -fh-ls -rx-lt -gg-ch -st-ox -cw-sb -xw-mb -bd-ub -ev-ht -qv-to -ir-ua -ea-sv -va-av -fg-gm -wn-yo -cz-dq -su-ea -al-wv -ea-re -qq-li -jm-yv -bq-ye -fg-xb -aw-kz -fu-fc -ta-cd -tu-gt -aa-gd -fr-nu -dt-im -oc-qp -zp-ce -ag-ro -bw-ny -mq-wo -xg-jp -cx-pg -rb-rw -ry-tl -of-yg -mp-kr -uu-hs -sn-az -pm-aj -ms-rw -xo-ee -qh-ml -wa-db -mz-gy -dy-ig -no-oq -eu-uh -jp-gn -zr-ag -qi-gm -rn-bp -yu-po -ys-wn -jb-pg -iv-xx -so-ig -jp-kv -bo-pc -oo-mc -rx-nj -ky-jm -cd-ma -ci-nt -mu-la -yk-uq -tw-tr -jm-fx -sb-ou -cp-oq -wn-aw -tz-xf -aa-sk -so-fw -nz-ek -xb-ws -zc-fi -gs-rz -ul-ww -lz-ny -gf-zw -ma-xa -wx-hq -yq-pf -fu-re -yx-mj -ic-ir -au-mo -sk-tb -gd-sv -iz-mj -jx-vq -dh-jb -vn-mw -tb-kz -og-py -xb-ni -cq-wh -ao-gp -wv-ua -qk-xt -qm-un -pk-jh -ag-sr -bg-ch -xf-ap -og-at -pj-yr -xj-rb -xc-vi -xm-yz -xq-qr -uf-jl -lp-ij -lw-dg -tt-hf -ht-bd -xk-ep -gv-as -pb-wg -yp-lk -wc-xa -dt-bb -xw-df -xk-mh -ps-ma -fx-gz -rf-lm -jc-jd -rl-fp -dl-lv -gw-tx -qy-ls -kx-fd -wj-gf -pn-bd -wj-ai -ag-nu -de-zb -lq-ys -rm-qs -pj-rh -zg-bf -ac-ww -so-br -kc-yz -pm-qj -bl-cx -vl-gb -nb-se -of-mf -fh-sw -jx-jk -sd-jf -hs-vi -yl-zb -nj-lm -mo-ze -qp-hz -so-bx -ib-li -cd-ab -cp-ba -va-pr -ry-ap -jz-rh -an-gi -ic-nt -op-wg -pe-tj -pf-nx -mx-ud -yl-jn -au-za -su-kz -ma-ta -xq-fe -rn-xq -fs-tk -ub-pn -tv-vw -yp-ib -hq-gd -pr-ae -ww-iq -co-od -de-ds -ci-fr -mi-pl -pb-du -db-au -ye-kq -wg-ha -di-qv -qp-mt -db-mo -cz-eo -cu-sf -rv-bw -ev-pn -bi-hi -da-vo -mu-tu -sc-il -kd-st -we-hm -qs-ji -ew-me -do-ap -xb-jr -bu-wo -na-oy -dd-qm -tr-rr -yz-zc -dx-qr -hy-yg -qs-xe -za-jm -fu-su -fx-db -ed-jp -bx-br -mf-qq -su-aa -yo-ys -cq-uf -mq-lt -yr-nv -uq-pr -yl-yq -ht-en -ey-kc -vh-uw -hk-cs -za-yv -yd-lp -da-wi -de-yq -ue-lr -nm-ny -fm-ws -oz-ol -wh-ph -xt-wk -ka-lv -jq-gi -bx-xz -mx-hx -az-cj -sb-gx -iv-jp -ix-pf -cd-xu -tz-jd -oq-bf -cv-ew -kx-zm -qr-yn -qy-vt -oc-hz -jf-sq -an-rk -xf-jc -gf-hs -ch-fk -wo-bx -jl-vc -gh-pi -rb-ms -br-wu -ph-vo -mx-ln -yq-jn -vx-fd -yd-sc -ig-tn -tk-cz -hk-zt -rr-df -lo-cv -od-wn -sg-au -bl-uz -dz-kn -da-yw -rm-gw -ph-io -jq-tr -ml-mt -gt-iw -ru-xh -rk-vi -pb-pr -sc-wk -jy-ix -cb-ew -rv-cx -ba-bf -ra-gz -qj-pa -em-hs -ms-dd -yy-vw -sv-wx -qh-oc -al-zz -js-cg -vx-rk -eq-fk -fw-mc -zb-qw -rs-ed -yp-sc -ui-ml -yf-yt -aj-cu -rf-nj -qj-qb -ku-wu -vc-uf -xb-yx -pk-hn -fl-yq -im-yl -tz-do -yf-wc -uq-ae -cz-fs -hm-yx -al-yr -ak-ot -jb-ex -nx-bs -fq-cd -yg-te -ra-io -kc-ue -se-pk -fo-ou -bu-xx -li-mf -ce-tv -aw-ss -sk-ea -gd-fu -te-qq -jq-rk -vr-mf -ep-ru -ti-yn -qp-jy -yn-jq -ew-tr -pg-sa -he-uo -cu-nq -lz-rv -fy-tt -dn-ol -uz-jb -ft-sw -uy-rn -fn-uv -ls-jj -ir-ag -ue-fi -xl-tn -mt-ug -gp-ko -wl-fs -lp-wa -xc-wj -fh-qy -sn-rf -em-dw -tu-oo -we-gg -it-ch -lr-td -wx-aa -zt-nq -ps-wc -zw-vn -ua-al -cg-kr -tn-dy -sf-xs -sd-yo -de-bb -zu-cc -de-jn -mj-it -ma-nz -sx-tu -vi-wj -nx-ud -or-ce -hm-bg -pn-ux -va-ae -oc-hq -ps-je -th-kv -kr-ao -ox-ee -tu-sz -bs-pl -vz-xh -fw-tu -xw-me -yp-il -cw-ou -mz-or -ht-qn -wl-ba -xo-ox -xu-ud -pl-kq -mt-dm -ml-qv -di-yk -uq-av -os-pa -iq-cv -rl-yb -fo-ji -pc-lg -hx-xu -mi-kq -zt-sf -zr-fr -yu-vc -vv-na -vv-ud -ub-ll -xq-uy -cu-xs -xl-fn -au-ze -gs-gy -ae-ha -ab-ta -cn-tq -rb-un -zr-ia -fh-jj -re-hq -hb-un -sg-ze -ux-bj -jl-po -di-mt -xm-ey -je-xa -qd-js -wp-lm -dw-hx -wy-pg -je-yt -mz-gs -cg-yc -sv-fu -eg-se -hy-kn -gz-yv -dy-uv -eg-pi -ta-fq -vj-vx -st-nc -di-qh -je-ta -sl-vj -qn-ev -lq-ig -ys-he -sz-in -yg-ky -vd-on -td-zc -fs-qz -on-ol -cx-sa -yl-dt -wi-xb -do-go -ky-db -lw-xo -xc-ti -fz-on -fo-gx -tu-kk -fg-ni -yt-cd -jp-rs -je-wc -em-bh -th-xg -rr-xv -yu-wh -rk-xc -qz-dq -ps-yt -ji-ou -qk-il -sm-bg -nz-yf -gz-ze -os-bd -oq-fs -fa-yz -vz-bi -hy-of -ql-ac -vd-dn -pe-gs -wv-yr -re-su -bl-jb -yd-yj -nu-ia -pn-pa -sz-mc -mc-gt -ds-ow -mo-za -vl-uf -nq-qj -on-oz -fr-ir -xz-so -bq-mi -jb-bt -vy-ws -th-ef -cn-pl -zm-fd -bc-vt -xc-hs -bp-ho -ox-dg -qz-wl -nx-hx -pf-bh -vb-dn -gv-zu -in-sd -ty-ui -ed-xg -eo-no -vj-zm -le-zv -ib-yj -vi-ev -nu-zr -ij-yj -hf-uz -uq-op -qq-ow -yp-xt -xe-sb -pf-ln -pj-sm -rw-ho -hs-wj -mo-fx -ui-lm -vj-fd -ek-ta -st-qz -fe-uy -pa-qn -ey-ue -xh-wq -ia-sr -hi-ug -os-pn -en-ll -fh-rq -cr-fr -lg-ao -bz-yl -xo-zs -wn-ep -fz-nb -xs-mn -bi-xk -ls-sw -hq-sv -ew-lo -kr-bo -em-jx -io-vo -gt-kk -bb-zb -tb-re -iv-xg -nm-ww -fh-rl -cr-gi -fq-ma -sq-lq -ic-ca -yq-bz -wa-qk -db-yv -sf-qb -bs-am -kp-lm -tz-ap -vw-xv -ru-xk -cj-kp -oj-bq -dq-eo -rw-he -bz-im -vz-xk -tl-fj -ex-bl -jl-ph -sc-ib -qp-qh -mx-xu -bj-td -gx-ji -qv-oc -fm-vy -tb-fc -mu-gt -ue-zc -sl-zm -xj-rw -se-ol -mq-bu -jc-fj -iv-wo -th-ed -re-sk -hl-cr -kh-ze -yn-gi -yo-od -nh-rn -fs-cp -wc-yt -ft-fp -sr-zr -gl-xs -ra-au -pr-ha -cr-nt -gf-vi -le-dg -ft-jj -nj-cj -jk-cc -sq-wn -pk-vx -tt-wy -et-bw -nu-qf -dd-rb -pn-ht -qv-qh -os-hu -nm-lz -mi-ye -ku-fn -wo-ed -hm-ch -fa-bj -aw-co -vh-sj -kx-vx -lz-ai -oo-gp -hl-ag -mq-xx -gt-fw -nh-hv -ae-yk -uv-ku -ye-oj -ee-xg -uy-hv -yt-nz -bx-ym -kl-pa -rz-mf -rb-ho -hk-nm -kq-bq -mu-sx -zg-ls -ro-zr -ib-ij -td-fa -gc-de -fa-kc -by-xx -ll-hu -nh-fe -yx-ca -zx-vj -vc-sj -cb-rr -yc-js -rh-jg -ij-wk -ms-ho -in-tu -ae-bm -fc-gd -hf-pg -kl-pn -ci-ia -ht-ub -rb-ve -qm-hb -lw-su -un-ve -tl-jd -fk-bg -ko-yc -zt-gl -gb-ph -tj-mz -oc-to -oa-nv -xp-uu -fa-zc -kl-ev -ga-fe -vl-io -tw-mb -ee-kd -rv-et -zd-ul -pa-gq -lw-st -jk-vh -jz-gs -go-fj -ao-js -pc-yc -yv-ra -bt-qr -or-zp -br-dy -zx-zm -of-li -ab-xa -xc-gi -oy-ac -lv-mi -sp-ol -cu-gl -qb-pm -xw-rr -nt-wi -fj-ry -bc-fp -kn-mf -zi-hv -op-id -jg-wv -wa-lk -zs-lw -qn-hu -tw-cb -fx-kh -iq-me -ek-yt -vd-nh -xs-ex -bt-sa -dd-cn -hz-mt -ka-kq -mb-rr -fg-vy -st-dp -ma-zd -ji-rm -xe-ji -il-ij -dl-mi -ei-dh -cr-ir -dw-ud -ow-sr -fq-yf -xp-rk -hx-bh -iz-bg -mo-sg -wy-ex -hb-uo -jz-zp -jr-td -zz-pj -zr-ci -lq-yo -sz-iw -em-mx -gx-rm -tq-bq -cs-mn -zz-yr -vy-yw -wa-yj -ny-ul -ir-hl -en-hu -mw-as -mf-te -xv-pe -vv-mn -sx-kk -dz-ow -oa-on -hv-uh -tu-hw -ps-ir -zr-nt -po-vl -df-cv -qq-kn -fn-bx -ni-fm -vz-ep -jy-di -ci-ro -oj-bj -tt-ex -jn-qw -fl-jn -dg-ee -ac-rv -fw-kk -du-dn -pm-nq -bb-bz -lz-ww -jn-zb -rn-fe -tk-dq -jd-ry -sq-ss -db-ra -gs-or -vr-yg -wx-fu -mb-lo -vn-gv -hl-sr -dl-zt -kx-jh -zw-cc -gt-sx -ln-em -da-lc -yk-op -gz-mo -gc-yq -lt-kp -sf-mn -ls-ft -vi-uu -ka-mi -qk-ib -lq-dr -ky-au -ap-zv -tj-gy -uo-ms -sj-vn -gw-cw -zp-xv -zd-et -ln-xu -rs-kv -fn-ty -cx-uz -mn-cu -pf-mx -ss-co -vr-kn -an-ox -ru-mh -hg-oq -mc-mu -xg-by -ia-ir -zx-ql -fr-oz -gn-mq -yx-iz -le-nc -sn-rx -xt-vh -sl-kx -jy-qh -dd-ld -hb-ld -qv-mt -wu-bx -rx-od -hi-ru -rk-gi -kz-hq -do-tl -mi-oj -gg-fk -uz-wy -zr-xw -oy-ww -ka-bq -aa-re -vz-hi -ye-tq -ml-hz -cr-ic -zs-kd -ju-le -eo-fs -vl-ph -dt-yq -of-ds -pm-gl -bh-vv -vm-jd -ch-we -qr-zi -mh-yc -fq-yt -tw-cv -gz-db -ha-op -xp-ti -uf-gb -ze-jr -fx-ra -du-fh -nv-wv -kv-bu -kx-xm -nu-hl -nc-ju -az-wp -gv-kq -xf-ry -ql-ul -df-tw -ei-rh -hg-qz -bp-uy -nd-lq -lc-ws -nd-sd -cc-vh -qs-ot -mo-ci -fd-zx -hz-ug -fp-yb -sg-za -yy-gs -fm-da -xv-ce -ig-bx -na-mx -gm-ws -ra-kh -gh-oz -aj-an -wc-nz -jc-py -fw-hw -bh-dw -rs-xg -uq-wg -no-cp -yw-lc -dz-tx -al-sm -jp-bu -cs-nb -kk-la -ak-ji -id-bm -ou-sc -zu-vq -bb-gc -bc-sw -qq-hy -fz-vd -hu-ev -yc-gp -ys-sq -of-rz -uy-uh -at-mh -cd-nz -tu-iw -pc-mp -zg-la -yr-dh -cs-qj -gh-se -bo-mp -pq-sl -pf-vv -hw-to -od-ys -mo-ky -yf-ab -sv-kz -gx-qs -xg-bu -jm-yy -un-ms -yr-ei -jr-lc -hn-vj -ha-id -tv-yy -ol-nb -gh-dn -pd-hn -cu-cs -kx-vj -ho-ve -pd-kx -yt-ta -wk-lp -fw-la -uf-vo -kz-ea -kk-iw -cj-lm -fs-no -kv-xg -xm-kc -nx-na -et-qq -yb-qy -gn-wo -cb-cv -lq-od -im-qw -mw-jk -al-oa -ia-nt -yq-zb -en-ub -ub-ev -rm-ot -jr-ni -so-ym -ka-cn -wk-yd -kr-jf -tr-lo -wm-sl -sw-fp -zs-ft -fg-da -ss-sd -jj-yc -nv-zz -oa-pj -gf-rk -qq-of -wn-sd -vl-vc -ac-et -gf-ti -hy-vr -ss-nd -tl-vm -dz-hy -rn-hv -ok-nn -wm-vj -gd-su -eg-wy -ek-yf -gl-hk -dt-yn -rl-ls -wc-fq -sq-yo -tb-aa -ot-xe -jq-xc -rq-zg -on-vb -nt-hl -un-dd -bp-dx -io-gb -oa-sm -fe-xu -vt-yb -nc-hi -dr-ys -bo-rf -bs-dl -jc-ap -qf-tt -og-xk -pn-qn -sf-hk -yc-kr -zo-nj -to-qh -wn-jf -mz-wk -dp-dg -ww-ai -oj-am -kn-rz -dx-nh -xx-kv -fr-nt -hv-mi -aw-yo -eq-bg -zc-rg -ci-cr -qb-aj -jq-wj -lg-gp -jq-vi -mb-df -ix-xu -ho-hb -co-sq -tu-wp -lk-lp -zw-gv -zw-jx -lr-rg -gq-ub -dr-aw -th-wo -kc-ux -zi-dx -eq-we -ud-na -yu-io -lc-gm -wa-wk -sz-mu -wq-hi -yd-qk -gx-tx -xh-hi -dy-bx -gl-pq -ak-qs -zp-tj -pk-kx -bh-xu -cs-gl -te-li -bc-zg -ae-dp -kq-cn -ml-jy -ev-en -lq-co -bh-ln -bg-ca -ws-da -ia-fr -en-gq -fd-pd -qw-bz -ka-lk -aa-sv -zi-uh -uo-dd -ah-wq -ju-dm -hg-cz -ny-oy -ga-eu -br-xz -wg-va -zr-ir -co-dr -bj-zc -qr-hv -rl-zg -xl-dy -sr-ro -jr-wi -qb-cu -ol-vb -wx-re -bi-og -ji-ot -sr-ci -cj-do -of-tt -uw-cc -hw-iw -ll-ev -cu-qj -qf-bt -fo-cw -cg-ko -tw-xw -du-yk -vn-jx -nj-lt -fo-gg -au-gz -ag-ic -gf-yn -ek-je -dh-rh -te-of -yv-ze -nm-zd -gi-gf -do-vm -eg-sp -gz-za -pc-cg -pi-ti -ws-ni -dm-jy -zp-mz -me-mb -gq-os -qi-vy -lg-qd -cj-rf -uu-ti -xt-il -pq-pk -jq-xp -fl-de -xf-do -ea-wx -te-ow -ok-dg -dz-qq -gl-qb -va-vm -rx-rf -yb-ls -zx-wm -lv-am -au-kh -td-fi -qv-ym -qz-oq -ky-gz -bm-uq -ym-uv -ve-hb -bp-xq -mo-yv -xz-ku -go-tz -he-ho -xj-ho -zw-mw -av-bm -rs-by -as-zu -ac-ai -iq-tw -jz-yy -ow-of -kx-wm -no-lm -tr-me -jq-an -fm-lc -qb-nq -cs-pm -ko-bo -gd-re -yq-im -ah-ru -iq-tr -py-ep -ty-nj -rh-oa -ok-ee -bl-hf -ga-nh -eg-dn -dw-ln -lz-ul -sj-jx -ce-mz -qr-fe -pl-dl -ru-wq -ac-nm -zw-uw -aw-sq -al-rh -bs-cn -sm-ei -ww-et -eo-ba -sg-fx -gv-cc -ed-bu -mn-aj -wu-uv -cp-eo -hv-bp -ai-zd -ok-dp -av-mj -id-ae -wm-pd -sk-fc -bd-hu -er-gg -rl-ft -dg-ss -gc-qw -jk-gv -fh-fp -sp-oz -ig-fn -xq-sf -xq-hv -mi-bs -pb-bm -uw-jk -go-gm -sw-yb -ue-rm -br-ym -ff-dt -bg-gg -vc-wh -uz-sa -ud-bh -sr-fr -oc-di -uu-wj -ln-vv -pj-nv -op-bm -wh-io -fc-re -ms-hb -lr-yz -bh-na -ox-ju -vl-zk -jz-ce -jg-ei -oj-kq -ku-so -lm-az -yo-jf -kl-ub -yq-ff -xj-ve -jm-db -wp-kp -fr-ag -kp-ty -zs-ju -zx-pd -id-pc -bd-kl -ni-da -uh-dx -vo-jl -sw-zg -zw-zu -zo-kp -ht-ll -cg-gp -qf-jb -xx-id -kr-js -qd-kr -cn-bq -hm-er -jg-nv -as-cc -vh-vn -xp-an -hi-xk -qj-mn -oz-nb -jh-wm -wa-yd -oy-zd -qd-tz -pn-ll -dp-az -ql-oy -de-im -nj-kp -te-kn -rf-az -dz-vr -je-yf -ph-uf -cv-rr -rr-me -ib-lp -yv-ky -ff-yl -in-mu -vz-ah -bd-ll -ll-kl -vv-mx -cn-mi -nc-lw -ey-bj -th-jp -ag-nt -kd-dg -zk-wh -yj-xt -hx-vv -zp-vw -gm-cn -ix-em -ig-br -bq-lv -zk-io -ty-sn -vw-jz -qb-mn -os-qn -dg-zs -on-eg -sr-nu -sm-ua -bg-it -uh-xq -nd-co -ry-ef -bq-ce -fz-eg -ws-fg -lt-ty -yj-lk -vm-jc -em-pf -hb-rw -qp-if -xk-cp -jk-vn -pb-id -zo-cj -xl-ym -ph-cq -bh-fy -ln-na -ci-nu -qj-sf -op-va -pa-ub -cj-wp -jy-ug -yw-gm -hs-gi -uy-nh -fm-jr -jh-zx -bb-qw -qb-cs -mn-gl -fc-aa -kr-ko -jn-gc -rl-jj -cu-zt -fa-xm -pl-lv -mp-lg -ld-ms -wu-fn -th-mq -ny-et -sj-cc -rl-qy -wl-mp -lq-ss -bg-yx -wx-dh -hl-zr -tj-yy -iv-kv -og-mq -lk-xt -yc-ao -wi-fm -wm-fd -ot-sb -li-kn -pm-zt -vz-py -fy-wy -ot-ou -yn-xc -gp-qd -eo-bf -vv-em -io-cq -zg-jj -cz-qz -ua-zz -va-ha -du-op -ng-me -bj-ue -iv-th -pg-bt -un-rw -sf-pm -hg-bf -le-kd -zg-ft -ix-vv -mw-zu -zx-pk -rg-al -sn-yb -wx-fc -fe-bp -cj-ui -me-df -va-uq -pa-ll -bh-mx -vn-vq -fo-ak -xk-at -dn-nb -ew-tt -py-xh -at-hi -if-oc -mb-cv -yo-vt -vo-po -bo-nn -yo-dr -bz-ff -ap-kz -ey-yz -fg-jr -xu-dw -ew-rr -sc-wa -pb-va -tl-tk -sb-gw -hz-qh -tw-ky -me-cv -do-jc -sg-ky -ep-bi -ij-yd -fs-ba -au-jm -fo-qs -gw-qs -yc-qd -va-yk -gn-iv -gn-by -we-it -pe-jz -ou-rm -je-nz -ok-lw -ca-we -ve-ms -rs-iv -xb-fm -tr-ng -hz-qv -wp-zo -pc-ko -td-ux -ux-xm -oa-wv -ng-cv -tb-gd -nu-ir -if-ml -vt-fh -oa-ua -ml-ug -uq-zo -ef-fj -rz-hy -zk-ph -eu-qr -mp-js -cu-hk -mz-jz -wv-zz -xl-bx -jr-ws -no-hg -it-hm -fl-bb -ah-og -ic-sr -no-wl -ny-rv -ac-bw -ea-cz -fz-pi -yl-pg -ym-wu -ni-lc -cn-oj -vx-pd -rs-mq -pi-ol -ga-uh -nn-qd -ws-yd -br-cg -he-ms -sq-sd -eg-oz -hf-ex -jh-po -er-bw -zk-cq -xk-wq -qi-yw -zk-jl -xe-tx -xs-qj -lv-kq -nh-bp -ea-fu -wn-nd -rv-ul -xt-sc -oz-vd -gt-in -al-ei -lc-fg -rx-lm -nx-dw -gh-nb -bt-hf -uy-qr -bm-yk -bb-wv -gq-ph -mt-to -xj-ld -hw-in -at-vz -wq-vz -ft-fh -ny-ac -ba-no -jl-hb -xz-dy -op-mc -sj-vq -xm-zc -rk-ti -zx-pq -dn-se -cx-wy -cv-gc -yw-fg -ff-jn -bt-fy -ao-mp -nb-on -dt-qw -wn-lq -fa-fi -fg-wi -as-vq -py-at -io-po -fa-lr -ni-ak -sj-mw -gc-im -rw-ld -tz-ry -se-vd -yb-bc -ua-rh -kr-gp -do-fj -wj-xp -aw-sd -ai-ny -ef-tz -zu-uo -dq-cp -gh-vb -lm-zo -bs-kq -sp-lo -qm-uo -rr-lo -th-bu -wy-sa -ca-ch -zs-ox -fy-bl -xg-xx -od-sd -ti-hs -jf-od -xc-an -hu-pa -ye-ka -hl-ro -yu-vl -ye-cn -fp-zg -qv-if -ko-tb -oy-bw -jh-fd -er-mj -wc-ek -pi-vd -ir-ci -zv-tl -sd-dr -ho-ld +x00: 1 +x01: 0 +x02: 0 +x03: 1 +x04: 1 +x05: 1 +x06: 0 +x07: 0 +x08: 0 +x09: 1 +x10: 0 +x11: 0 +x12: 0 +x13: 0 +x14: 0 +x15: 1 +x16: 1 +x17: 0 +x18: 1 +x19: 0 +x20: 0 +x21: 0 +x22: 0 +x23: 1 +x24: 1 +x25: 0 +x26: 0 +x27: 0 +x28: 1 +x29: 0 +x30: 1 +x31: 0 +x32: 0 +x33: 0 +x34: 1 +x35: 1 +x36: 1 +x37: 0 +x38: 1 +x39: 1 +x40: 0 +x41: 0 +x42: 0 +x43: 1 +x44: 1 +y00: 1 +y01: 1 +y02: 1 +y03: 1 +y04: 0 +y05: 1 +y06: 0 +y07: 1 +y08: 0 +y09: 1 +y10: 1 +y11: 1 +y12: 1 +y13: 1 +y14: 1 +y15: 0 +y16: 0 +y17: 0 +y18: 1 +y19: 1 +y20: 1 +y21: 1 +y22: 1 +y23: 1 +y24: 0 +y25: 1 +y26: 1 +y27: 0 +y28: 1 +y29: 0 +y30: 1 +y31: 0 +y32: 1 +y33: 0 +y34: 1 +y35: 1 +y36: 0 +y37: 1 +y38: 0 +y39: 0 +y40: 0 +y41: 0 +y42: 0 +y43: 0 +y44: 1 + +rds AND wpc -> cmj +vbn XOR mkk -> z13 +y04 AND x04 -> bbw +ftn OR swv -> bmw +dkj AND gqs -> vbm +x38 XOR y38 -> bhv +jhh XOR vws -> z04 +y38 AND x38 -> tbv +whm AND rbn -> tpt +fkf XOR whs -> z31 +x37 XOR y37 -> bmt +y43 AND x43 -> jbc +qkj XOR fdg -> z15 +tsq XOR pmr -> z21 +x11 XOR y11 -> jtg +x35 XOR y35 -> hqk +whs AND fkf -> vpr +y16 XOR x16 -> sbt +y15 AND x15 -> gmt +tdp AND qqs -> sph +bsn OR bdc -> mkk +y12 AND x12 -> bdc +qmj OR rmv -> tdp +fdg AND qkj -> fjw +wfd XOR cwj -> z36 +rgm OR vgp -> cvt +vws AND jhh -> shg +qgd OR ggn -> cvr +x28 AND y28 -> rtf +y42 XOR x42 -> jgh +jsv OR kbr -> cwj +hdp OR rtr -> gms +gdm OR kqg -> wpc +x00 XOR y00 -> z00 +x17 AND y17 -> qqc +hrt AND sbt -> dfq +y07 AND x07 -> nsg +y18 AND x18 -> z18 +mjm AND njj -> bch +y39 AND x39 -> qnt +x16 AND y16 -> hsb +grq XOR vfq -> z28 +rbn XOR whm -> z40 +x25 AND y25 -> rwp +x41 AND y41 -> hdp +x42 AND y42 -> ftn +rcm AND rhd -> qvh +wsq XOR cvr -> z19 +rwp OR bvm -> gdq +kgd OR kqf -> z10 +x40 AND y40 -> gkj +x09 XOR y09 -> rds +jhm AND fqt -> rtr +y07 XOR x07 -> jfr +x35 AND y35 -> kbr +sqr XOR mwq -> mwk +hmc AND brk -> pjk +y23 XOR x23 -> gwq +tdd OR nsg -> cct +y14 XOR x14 -> njj +wtm XOR phh -> z06 +wws AND cdh -> dff +thq XOR mfd -> z17 +y13 XOR x13 -> vbn +y24 XOR x24 -> hsw +x12 XOR y12 -> jnk +vvj OR hph -> jsp +swf XOR hqk -> z35 +jjg OR pjp -> tqk +vbm OR wss -> whs +x22 XOR y22 -> kdn +y11 AND x11 -> pjp +x08 XOR y08 -> cjn +std XOR jfr -> z07 +tjj OR vpp -> jhh +pjk OR vpj -> rhd +vkd XOR vtd -> z34 +cjn AND cct -> kqg +hnw OR nth -> phh +x30 AND y30 -> wss +ptr OR dnq -> wrn +wfd AND cwj -> vvj +wpd AND ndm -> jcq +jmh XOR mrs -> z24 +x29 XOR y29 -> wws +x33 AND y33 -> wvp +y02 AND x02 -> wwc +nfh XOR nqq -> qgd +y30 XOR x30 -> gqs +jcq OR qnt -> rbn +wws XOR cdh -> z29 +bmn OR cmj -> mwq +y06 AND x06 -> mgc +wkt OR ddd -> swf +phh AND wtm -> cjd +wvp OR gqp -> vtd +jhm XOR fqt -> z41 +x20 XOR y20 -> vcn +gms AND jgh -> swv +y23 AND x23 -> sdd +ndb OR qqc -> nfh +png XOR gdq -> z26 +nfh AND nqq -> ggn +x40 XOR y40 -> whm +y33 XOR x33 -> wwp +sph OR hpb -> vfq +vjs OR sfm -> cpv +y43 XOR x43 -> bng +cct XOR cjn -> z08 +jmh AND mrs -> bmv +x01 XOR y01 -> brk +tsq AND pmr -> vjs +cwt AND mcd -> pcq +jfr AND std -> tdd +sbt XOR hrt -> z16 +y20 AND x20 -> twp +y05 AND x05 -> hnw +y27 XOR x27 -> qqs +bmv OR hsw -> mtn +y10 XOR x10 -> sqr +bmt XOR jsp -> z37 +sdd OR hcp -> mrs +shg OR bbw -> ckj +y04 XOR x04 -> vws +jsp AND bmt -> mwp +png AND gdq -> rmv +mwk XOR jtg -> z11 +twp OR rqv -> tsq +x19 AND y19 -> dtr +x18 XOR y18 -> nqq +wpc XOR rds -> z09 +kdn XOR cpv -> z22 +x31 AND y31 -> vjp +rtf OR cbh -> cdh +dkj XOR gqs -> z30 +y34 XOR x34 -> vkd +mgc OR cjd -> std +tff AND mtn -> bvm +gwq AND wrn -> hcp +vcn AND spr -> rqv +y44 XOR x44 -> mcd +y01 AND x01 -> vpj +vbn AND mkk -> tsd +tqk AND jnk -> bsn +x27 AND y27 -> hpb +bhv AND kqb -> nrc +spr XOR vcn -> z20 +ckj XOR tbw -> z05 +y22 AND x22 -> ptr +ckj AND tbw -> nth +cpv AND kdn -> dnq +fjw OR gmt -> hrt +qvh OR wwc -> sgb +gwq XOR wrn -> z23 +jgh XOR gms -> z42 +y32 AND x32 -> vgp +mwq AND sqr -> kgd +gkj OR tpt -> fqt +x34 AND y34 -> wkt +x14 AND y14 -> pwr +y31 XOR x31 -> fkf +mwk AND jtg -> jjg +y05 XOR x05 -> tbw +pwr OR bch -> fdg +x21 AND y21 -> sfm +vfq AND grq -> cbh +x41 XOR y41 -> jhm +y36 XOR x36 -> wfd +mcr AND bgf -> rgm +psb XOR sgb -> z03 +bmw AND bng -> trs +x02 XOR y02 -> rcm +jnk XOR tqk -> z12 +dfq OR hsb -> mfd +vtd AND vkd -> ddd +bhv XOR kqb -> z38 +y37 AND x37 -> ftj +fmp OR pcq -> z45 +brk XOR hmc -> z01 +dff OR hcb -> dkj +cvt AND wwp -> z33 +x13 AND y13 -> vwv +qqs XOR tdp -> z27 +x26 XOR y26 -> png +x15 XOR y15 -> qkj +x17 XOR y17 -> thq +trs OR jbc -> cwt +y36 AND x36 -> hph +x10 AND y10 -> kqf +x06 XOR y06 -> wtm +x32 XOR y32 -> mcr +mtn XOR tff -> z25 +y28 XOR x28 -> grq +mwp OR ftj -> kqb +x03 XOR y03 -> psb +x25 XOR y25 -> tff +njj XOR mjm -> z14 +y03 AND x03 -> vpp +x00 AND y00 -> hmc +mfd AND thq -> ndb +x26 AND y26 -> qmj +x29 AND y29 -> hcb +y19 XOR x19 -> wsq +bgf XOR mcr -> z32 +vpr OR vjp -> bgf +rhd XOR rcm -> z02 +bmw XOR bng -> z43 +nrc OR tbv -> ndm +y24 AND x24 -> jmh +x44 AND y44 -> fmp +wwp XOR cvt -> gqp +cvr AND wsq -> ghw +x39 XOR y39 -> wpd +x09 AND y09 -> bmn +hqk AND swf -> jsv +y08 AND x08 -> gdm +sgb AND psb -> tjj +vwv OR tsd -> mjm +y21 XOR x21 -> pmr +cwt XOR mcd -> z44 +ghw OR dtr -> spr +wpd XOR ndm -> z39 diff --git a/src/main.rs b/src/main.rs index 0079efc..fabbd10 100644 --- a/src/main.rs +++ b/src/main.rs @@ -34,181 +34,120 @@ )] extern crate test; pub mod util; -use atools::ArrayTools; pub use util::prelude::*; -#[no_mangle] -pub fn run(x: &str) -> impl Display { - let g = Graph::load(x); - let x = g.mxq(); - let mut i = 0; - const c: u8 = b','; - static mut out: [u8; 38] = [ - 0, 0, c, 0, 0, c, 0, 0, c, 0, 0, c, 0, 0, c, 0, 0, c, 0, 0, c, 0, 0, c, 0, 0, c, 0, 0, c, - 0, 0, c, 0, 0, c, 0, 0, - ]; - for j in 0..WORDS { - let mut x = x[j]; - while x != 0 { - let bit = x.trailing_zeros(); - unsafe { - out[i + i * 2..i + i * 2 + 2].copy_from_slice(&C! { NAMES[64 * j + bit as usize] }) - }; - i += 1; - x &= !(1 << bit); - } - } - unsafe { String::from_utf8_unchecked(out.to_vec()) } +#[derive(Debug)] +struct Gate { + op: fn(u8, u8) -> u8, + inputs: [usize; 2], + out: usize, + run: bool, } -fn p1(x: &str) -> impl Display { - let adj = Graph::load(x).adj; - let mut has = [false; 676]; - let mut sum = 0; - for computer in 494..=519 { - has[computer] = true; - let nbors = Graph::adj_on(adj[computer]); - for (&elem2, i) in nbors.iter().ι::<usize>() { - for &elem3 in &nbors[i..] { - if !has[elem2] && !has[elem3] && adj[elem2][elem3 / 64] & 1 << (elem3 % 64) != 0 { - sum += 1; - } - } +#[no_mangle] +pub fn p1(x: &str) -> impl Display { + static mut wires: [u8; 15547] = [u8::MAX; 15547]; + let mut gates = Vec::with_capacity(128); + fn h(gate: [u8; 3]) -> usize { + // println!("{}", gate.p()); + if gate[1].is_ascii_digit() { + let [_, b, c] = gate.map(|x| (x - b'0') as usize); + 15547 + b * 10 + c + } else { + let [a, b, c] = gate.map(|x| (x - b'a') as usize); + a * 26 * 26 + b * 26 + c } } - sum -} - -fn main() { - let s = include_str!("inp.txt"); - println!("{}", unsafe { run(s) }); - // dbg!(exec(&program, regi)); -} -#[bench] -fn benc(b: &mut test::Bencher) { - let i = boxd(include_str!("inp.txt")); - b.iter(|| unsafe { run(i) }); -} - -struct Graph { - // vert: [[u8; 2]; SIZE], - adj: Box<[[u64; WORDS]; SIZE]>, -} -const SIZE: usize = 676; -const WORDS: usize = (SIZE + 63) / 64; -fn h([a, b]: [u8; 2]) -> usize { - a as usize + 26 * b as usize -} -const NAMES: [[u8; 2]; 676] = include!("../lut2"); - -impl Graph { - fn load(content: &str) -> Self { - const INDEX: [u16; 3295] = { - let mut l = [0; 3295]; - include!("../lut"); - l - }; - let mut i = content.as_ptr(); - let mut adj = Box::new([[0u64; WORDS]; SIZE]); - for _ in 0..3380 { - unsafe { - let a = *(i as *const [u8; 2]); - let b = *(i.add(3) as *const [u8; 2]); - let ha = h(a); - let hb = h(b); - i = i.add(6); - let i = INDEX[ha] as usize; - let j = INDEX[hb] as usize; - *adj.get_unchecked_mut(i).get_unchecked_mut(j / 64) |= 1u64 << (j % 64); - *adj.get_unchecked_mut(j).get_unchecked_mut(i / 64) |= 1u64 << (i % 64); - } - } - Graph { adj } + let mut i_ = x.行(); + let mut i = x.as_ptr(); + let mut x = 0; + let mut y = 0; + for j in 0..45u64 { + x |= (unsafe { *i.add(5) - b'0' } as u64) << j; + unsafe { i = i.add(7) }; } - - fn print_mat(x: [u64; WORDS], l: [u8; 2]) { - let n = Self::adj_on(x); - print!("{}: ", l.p()); - for neighbor in n { - print!("{} ", NAMES[neighbor].p()); - } - println!(); + for j in 0..45u64 { + y |= (unsafe { *i.add(5) - b'0' } as u64) << j; + unsafe { i = i.add(7) }; } - - fn first_2_bits(x: [u64; WORDS]) -> [usize; 2] { - let mut out = [0; 2]; - let mut index = 0; - for j in 0..WORDS { - let mut x = x[j]; - while x != 0 { - let bit = x.trailing_zeros(); - out[index] = 64 * j + bit as usize; - index += 1; - if index == 2 { - return out; - } - x &= !(1 << bit); - } - } - panic!() + let mut i = i_; + i.by_ref().take_while(|x| !x.is_empty()).for_each(drop); + fn gate(x: &[u8]) -> [u8; 3] { + x.try_into().unwrap() } - - fn adj_on(x: [u64; WORDS]) -> Vec<usize> { - let mut n = Vec::with_capacity(13); - for j in 0..WORDS { - let mut x = x[j]; - while x != 0 { - let bit = x.trailing_zeros(); - n.push(64 * j + bit as usize); - x &= !(1 << bit); + fn and(a: u8, b: u8) -> u8 { + a & b + } + fn or(a: u8, b: u8) -> u8 { + a | b + } + fn xor(a: u8, b: u8) -> u8 { + a ^ b + } + let mut z = 0; + for connection in i { + let mut i = connection.split(|x| *x == b' '); + let [i1, op, i2, _, out] = std::array::from_fn(|_| i.Δ()); + let [i1, i2, out] = [i1, i2, out].map(gate); + let op = match op { + b"AND" => and, + b"OR" => or, + b"XOR" => xor, + _ => unreachable!(), + }; + if i1[0] == b'y' || i1[0] == b'x' { + let index = (i1[1] - b'0') * 10 + (i1[2] - b'0'); + let res = op((y & 1 << index != 0) as u8, (x & 1 << index != 0) as u8); + if out[0] != b'z' { + unsafe { wires[h(out)] = res }; + } else { + z |= (res as u64) << index; } + } else { + gates.push(Gate { + op, + run: false, + inputs: [h(i1), h(i2)], + out: h(out), + }); } - n } - - fn mxq(&self) -> [u64; WORDS] { - 'out: for computer in 0..SIZE { - let neighbors = self.adj[computer]; - if neighbors == [0; 11] { + let mut all_run = false; + while !all_run { + all_run = true; + for gate in &mut gates { + if gate.run { continue; - } - // neighbors[computer / 64] |= 1 << (computer % 64); - // self.print_mat(neighbors, *b"nh"); - for node in Self::first_2_bits(neighbors) { - let inter = (0..WORDS) - .map(|i| (self.adj[node][i] & neighbors[i]).count_ones()) - .sum::<u32>(); - // check that the current node has 11 neighbours in common with either its first or second neighbour - if inter == 11 { - let mut v = [0; 11]; - let mut pop = 0; - for j in 0..WORDS { - // self.print_mat(neighbors, *b"nh"); - let mut x = neighbors[j]; - while x != 0 { - let bit = x.trailing_zeros(); - let n = 64 * j + bit as usize; - let inter = (0..WORDS) - .map(|i| (self.adj[n][i] & neighbors[i]).count_ones()) - .sum::<u32>(); - // they all have 11 neighbours in common with the current node - if inter == 11 { - v[j] |= 1 << bit; - pop += 1; - } - x &= !(1 << bit); - } - } - // self.print_mat(v, *b"ot"); - if pop != 12 { - continue 'out; + }; + unsafe { + let [a, b] = gate.inputs; + let a = wires[a]; + if a != u8::MAX + && let b = wires[b] + && b != u8::MAX + { + gate.run = true; + if gate.out > 15547 { + let index = gate.out - 15547; + z |= ((gate.op)(a, b) as u64) << index; + } else { + wires[gate.out] = (gate.op)(a, b); } - v[computer / 64] |= 1 << computer % 64; - // v.push(computer); - // println!("whoa"); - return v; } } + all_run &= gate.run; } - panic!() } + z +} + +fn main() { + let s = include_str!("inp.txt"); + println!("{}", unsafe { p1(s) }); + + // dbg!(exec(&program, regi)); +} +#[bench] +fn benc(b: &mut test::Bencher) { + let i = boxd(include_str!("inp.txt")); + b.iter(|| unsafe { p1(i) }); } |