heh
bendn 2024-12-24
parent ef9a8fd · commit dc2da5d
-rw-r--r--out46
-rw-r--r--src/inp.txt3693
-rw-r--r--src/main.rs259
3 files changed, 458 insertions, 3540 deletions
diff --git a/out b/out
new file mode 100644
index 0000000..dc6d162
--- /dev/null
+++ b/out
@@ -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) });
}