From 46aec35ab4569750e0c199533c6235d02ac1cae0 Mon Sep 17 00:00:00 2001 From: Maksim Litvinov Date: Mon, 23 Dec 2024 08:13:50 +0200 Subject: [PATCH] add day 23 with questionable solution --- 23/alt/main.go | 130 ++ 23/input.txt | 3380 ++++++++++++++++++++++++++++++++++++++++++++++++ 23/input2.txt | 3380 ++++++++++++++++++++++++++++++++++++++++++++++++ 23/main.go | 139 ++ 23/sample.txt | 32 + 23/task.txt | 83 ++ 6 files changed, 7144 insertions(+) create mode 100644 23/alt/main.go create mode 100644 23/input.txt create mode 100644 23/input2.txt create mode 100644 23/main.go create mode 100644 23/sample.txt create mode 100644 23/task.txt diff --git a/23/alt/main.go b/23/alt/main.go new file mode 100644 index 0000000..a995f0d --- /dev/null +++ b/23/alt/main.go @@ -0,0 +1,130 @@ +package main + +import ( + "flag" + "fmt" + "maps" + "os" + "sort" + "strings" + "time" +) + +func catch(err error) { + if err != nil { + panic(err) + } +} + +func main() { + flag.Parse() + if flag.NArg() != 1 { + fmt.Println("Usage: go run . input.txt") + os.Exit(1) + } + + bs, err := os.ReadFile(flag.Arg(0)) + catch(err) + + parsed := parseInput(string(bs)) + part1(parsed) + part2(parsed) +} + +type Parsed map[string]map[string]bool + +func parseInput(input string) Parsed { + lines := strings.Split(input, "\n") + if len(lines[len(lines)-1]) == 0 { + lines = lines[:len(lines)-1] + } + parsed := make(Parsed) + for _, line := range lines { + parts := strings.Split(line, "-") + if parsed[parts[0]] == nil { + parsed[parts[0]] = make(map[string]bool) + } + if parsed[parts[1]] == nil { + parsed[parts[1]] = make(map[string]bool) + } + parsed[parts[0]][parts[1]] = true + parsed[parts[1]][parts[0]] = true + } + return parsed +} + +type Triplet [3]string + +func part1(parsed Parsed) { + timeStart := time.Now() + // find triplets, where each computes is connected to the other two + + triplets := make(map[Triplet]bool) + for c1, cs := range parsed { + for c2 := range cs { + for c3 := range parsed[c2] { + if c3 == c1 { + continue + } + if !parsed[c3][c1] { + continue + } + t := Triplet{c1, c2, c3} + + if c1[0] == 't' || c2[0] == 't' || c3[0] == 't' { + sort.Strings(t[:]) + triplets[t] = true + } + } + } + } + + fmt.Printf("Part 1: %d\t\tin %v\n", len(triplets), time.Since(timeStart)) +} + +type Party map[string]bool + +var calls int + +func dfs(connected Parsed, visited Party) Party { + calls++ + var largestParty Party +NextC: + for c := range connected { + if visited[c] { + continue + } + // check if c is connected to all visited + for prev := range visited { + if !connected[c][prev] { + continue NextC + } + } + // it is connected to all visited, so we can add it to the party + + visited[c] = true + party := dfs(connected, visited) + if len(party) > len(largestParty) { + largestParty = party + } + delete(visited, c) + } + if len(largestParty) == 0 { + largestParty = maps.Clone(visited) + } + return largestParty +} + +// does it need memo? :) +func part2(parsed Parsed) { + timeStart := time.Now() + + largestParty := dfs(parsed, make(Party)) + fmt.Printf("calls: %d\n", calls) + sorted := make([]string, 0, len(largestParty)) + for c := range largestParty { + sorted = append(sorted, c) + } + sort.Strings(sorted) + fmt.Printf("Part 2: %d, %v\t\tin %v\n", len(largestParty), strings.Join(sorted, ","), time.Since(timeStart)) +} diff --git a/23/input.txt b/23/input.txt new file mode 100644 index 0000000..1a7189f --- /dev/null +++ b/23/input.txt @@ -0,0 +1,3380 @@ +yp-db +ma-sm +jo-yy +vf-jz +yb-md +nk-ts +nf-pc +ln-on +ou-gb +vr-yy +tq-qa +ja-fr +fc-ah +qx-cy +ht-jk +yl-mx +zg-kb +ln-db +yg-lf +on-bt +tw-ic +rs-fz +jn-ka +iq-wb +tg-dn +pr-oo +uo-pe +qt-qe +cn-ts +we-uz +uq-pi +ns-vd +kp-eg +hb-up +rj-ry +ah-uu +op-sn +he-ka +kb-up +tm-vk +jy-on +fv-nt +bk-qv +pp-ds +ge-be +py-hs +tv-vv +dy-ap +yz-xs +in-ob +ld-bz +mo-oa +zg-dn +lu-gc +nv-pt +zp-jv +mj-vx +no-cq +en-mi +ex-br +eo-ht +xe-fu +cf-pa +jv-tx +cr-zh +by-pj +xj-wo +sg-qx +ia-hd +dm-pc +sv-gi +bd-nm +nz-jn +bg-jr +wf-ke +rh-wo +mw-ba +cy-sg +rn-hw +ib-gb +lz-et +mt-qb +vn-iw +sk-gj +fi-wz +bg-xd +ng-xn +vh-zp +jc-bd +nv-kv +sj-rj +ie-up +fp-dv +hh-va +ur-ux +lb-zq +iq-je +aw-ww +bo-ob +jx-cr +wj-ft +kh-pr +nl-rf +lk-rk +yx-kg +do-fe +nn-wq +na-xk +sb-ul +mr-mn +fu-yh +bt-bl +av-yv +bd-nu +gs-pp +kv-fg +eo-jk +gv-ui +rs-cn +ut-nh +ew-bc +sy-vn +zw-yk +ga-hx +ih-fs +ur-ga +xr-lo +il-ch +in-lu +sr-ij +ul-zh +ke-ud +jq-xc +va-da +mz-li +iu-hl +zl-tm +kg-iw +ik-dm +od-ps +tx-xb +co-rp +zl-qp +yh-hm +pw-nh +ra-xd +pe-ko +xo-qc +es-wg +gw-bf +jq-xv +yc-rc +nt-vx +wq-ua +jf-kt +ug-cj +kc-uq +yg-cp +jf-fc +ys-ox +zq-pl +jt-ph +fl-qp +ok-sj +yp-on +zl-fl +my-tt +ss-rk +fe-ls +dz-lh +tq-xp +oa-ng +pr-ei +iq-uu +zm-pk +ui-yu +uo-tg +gg-tm +nn-xs +iq-dr +sz-es +kd-ji +is-ps +kf-bb +cr-va +sd-ep +ol-bo +js-mi +dp-xg +wk-qp +ek-hu +fe-wu +lq-lf +ir-ku +ac-uh +tk-ma +ns-tz +yk-zk +oi-ul +mi-ge +pc-mb +ip-jq +hm-xe +wz-pa +us-gn +ls-ql +gj-li +wn-oz +tz-tx +sz-dy +pu-yi +iu-sj +ux-nf +pk-ff +fq-mp +qy-mf +xj-xv +dt-hj +zs-gp +kj-fw +kf-br +in-fs +ap-xv +gr-je +au-xl +eq-xl +ux-ga +py-ie +oz-pz +db-xk +yy-jv +lb-bz +zg-pe +bq-pd +nj-yh +sx-go +vq-uc +im-vs +yg-wq +me-ew +ig-hh +by-de +cg-wu +sf-aa +qe-rx +ih-rn +cm-fy +xa-tk +zj-zv +ep-ha +hd-jz +jr-wk +tg-pe +mb-im +dc-do +tk-ba +nh-cb +vd-vr +tk-ae +tq-is +tv-ef +tw-ix +ff-fa +vc-ld +ic-yl +ic-pz +dz-ro +ir-ur +kl-xt +jx-yo +qy-np +oq-xl +qy-be +vi-fy +lr-dt +zv-xp +yn-pl +bc-aq +sx-ta +jw-il +fm-zn +ou-qx +nw-so +ps-sv +ss-lk +iw-jh +xm-bk +gs-kj +kc-jw +ne-sg +pf-vg +kf-ya +dz-iv +fl-jr +gw-zg +tb-gs +nq-ba +my-pa +jy-db +kl-xx +uh-ei +tm-jr +vx-jb +nx-jt +fi-sn +jc-eu +aq-sy +gn-we +sr-kp +xo-nf +pq-ih +cq-hw +ev-zl +sz-sx +nk-wh +xf-kc +wh-fg +xx-vq +aa-co +qz-dj +qy-su +mh-sd +aa-yt +rl-ig +zx-ic +qa-zv +xm-qp +gn-ii +lj-eq +ge-js +un-gk +bk-be +yv-go +yf-jy +lq-pa +gl-ka +vr-nq +zl-vt +qf-jn +qy-bk +mt-jo +vc-za +rc-rd +la-yx +xk-bt +rg-iq +zj-nf +fs-hw +vu-de +ry-iu +ph-nk +zj-qm +uy-hj +ke-mx +nv-nk +hg-ff +qr-fu +mw-ma +ry-un +mx-iv +yv-me +nc-ux +hu-ru +qz-qx +dc-eo +rd-vg +ok-un +ey-im +cm-zt +ki-vv +fr-tp +al-af +ey-sv +su-bk +xj-es +sm-ae +bb-wf +ue-lx +ar-ru +na-dr +su-ge +os-cn +qh-yj +lo-af +cy-hz +ih-lu +el-lo +jc-au +zr-vi +zq-mq +ec-eu +pt-fw +gw-ko +pa-sl +aa-yi +bj-ow +af-nh +un-sj +ub-qj +ba-fp +zs-rp +vk-zl +gv-lt +cq-lu +ln-bt +vd-xb +ne-ou +zr-tw +xv-rh +lf-cp +de-yi +gy-yv +dj-pf +jk-oc +sb-va +uu-wb +fe-fh +fo-lb +lm-nw +lj-md +yw-lc +vh-jv +jd-cg +xs-ii +uw-qe +zn-iv +pt-tb +nb-rx +wk-tm +ln-gv +it-dq +uq-xf +fc-rg +ae-or +nt-wr +gu-gh +cl-gr +cd-bg +wl-hg +an-nu +jt-nv +ar-pn +ux-em +fv-ox +po-rj +kp-yj +gu-eb +ql-sm +ey-vs +ln-yp +ja-qb +br-mw +tp-cj +nq-vh +bb-jk +iw-pi +sv-wv +kq-hw +bj-he +do-cg +nx-kv +xe-rk +gh-bh +vl-yx +pq-gc +gj-kh +ng-ph +yt-zs +sd-an +ys-mr +wo-ap +sb-vl +pq-lu +cg-ow +dc-ol +oc-vr +sl-cv +pq-rn +ct-wz +yw-qe +gk-qt +wd-ld +mq-yn +co-mi +uo-ie +ns-vh +uc-rw +nh-ht +eu-nm +tb-kj +rg-ah +wm-lx +wz-sl +wo-es +xs-wq +ds-sr +vl-fb +go-ew +pr-nt +rp-pu +gj-xb +rn-in +ae-fp +un-mn +lo-al +re-fv +lh-np +pd-pw +qu-hs +pj-sf +xk-dr +fh-qb +gi-wv +ok-ry +bb-so +be-fz +ez-ng +gg-wk +zj-ps +sb-ig +pi-jh +es-rh +rp-by +ud-dz +pq-no +ru-ek +xk-gv +hy-sb +yd-ct +he-im +pd-uj +fq-bj +kg-il +op-ta +yr-jz +do-bx +ua-cp +qf-he +ys-xt +sb-jj +jj-hy +tx-ns +jz-jx +bv-no +sr-yj +up-sg +nw-ol +oh-qi +qm-qa +jg-eo +nb-nt +tw-fy +wb-fc +do-zk +zr-oz +iv-ro +bo-jk +si-kv +lc-fv +yd-wz +cg-vy +sf-zs +wy-rh +zx-zt +mv-yu +gr-hf +ah-hf +nc-mp +ka-et +ga-qc +ry-yn +wv-ey +ib-ou +ry-pl +cz-ct +cl-ah +gb-oi +sz-bm +bl-xk +fr-ri +lo-dx +oz-cm +jh-la +uc-qa +at-aw +qu-wl +ox-yu +de-yt +pe-up +ic-zt +ji-hc +vs-mv +rw-is +qz-bh +mh-tf +je-wb +au-oq +el-al +hs-wl +vn-ch +mx-rs +hg-zm +bd-ep +zf-ui +hf-oi +ys-cs +ss-hm +tc-dt +me-yz +ob-bv +we-hu +cm-zx +ri-bz +qe-re +hg-hs +ch-jw +lb-ja +li-ac +gu-qz +pi-xf +ls-fm +jd-zw +ku-nf +pt-qh +cs-mn +ki-aw +ey-pc +ef-dp +gu-yc +ra-tq +ok-mo +yo-bn +ok-iu +gr-fc +ys-xx +uz-pf +lj-cn +bo-nw +vx-nb +wj-ib +fa-qd +il-pa +he-ow +lu-kq +fh-zk +bj-qf +ff-zm +qg-yg +ki-ur +fg-nk +yo-dt +vt-yh +rx-vd +jk-kf +ya-nw +sk-uh +ar-gn +ga-tz +nv-oa +wn-ix +ol-jk +vk-xr +dr-yf +dy-mm +mh-nu +fz-eq +ts-kw +jk-jg +ts-xl +fg-jt +fc-uu +vs-eh +bn-ne +nu-jc +mf-bk +rl-hy +iq-kt +ka-lz +cj-al +cf-ct +zv-qm +lh-ud +xm-mi +he-et +br-dv +tf-jc +ld-fo +pa-cz +ex-fp +fq-ow +em-nf +eb-pf +cn-kw +lk-nj +vk-jr +wq-vf +vk-cx +ec-cs +js-qv +tf-bd +sn-yv +ui-mr +bc-sy +md-os +or-mw +ek-nl +bt-yp +kd-cy +dq-cj +it-ri +cz-wz +eu-ha +ow-ka +gr-wb +jc-ec +db-bh +wl-vl +pr-sk +cr-sb +wk-qw +hb-ct +dj-rc +xa-ql +fa-vf +qv-qy +xo-wc +pn-we +eb-gh +su-en +je-uu +bj-nz +wm-ei +xn-kv +ki-qi +dq-ug +yf-yp +ep-rj +ar-we +ix-zt +ox-xt +yw-wr +vq-kl +zq-po +hf-iq +wh-uw +ng-wh +wy-lv +yu-ys +ez-nv +qe-nt +em-hx +fu-ss +wg-sz +lt-jw +is-uc +yd-vw +fi-yd +oq-cn +ue-oo +ap-es +cx-fl +ek-ar +fh-jd +gb-wj +rw-od +gw-kb +vd-nq +mt-fe +kb-ie +qb-zw +bj-et +yj-tb +zj-rw +qo-yw +od-ra +ls-zn +qe-nb +hb-bf +ub-xg +ki-at +cb-lo +po-sj +ya-ol +ba-br +iv-lh +ou-hz +ge-xm +ue-pr +iu-pl +oc-zp +oc-tz +au-yb +pl-gk +pk-bc +xn-fg +vn-pi +qh-gs +pw-el +xb-oc +jq-on +oi-gr +it-wd +qc-ur +fq-gl +oi-cl +wn-gx +od-xd +sm-xa +pp-qh +zn-wf +fh-wu +yh-xe +ka-mp +fa-pk +fh-zw +mm-es +ls-dz +mr-zf +po-pl +rx-jb +hb-ko +ji-qx +ff-yc +ta-lt +gs-eg +de-sf +zk-fe +yd-my +qd-hs +ol-lm +qd-qu +iv-ke +sz-rh +un-po +fm-vj +nz-lr +nz-fq +yw-vx +vv-ub +dc-ht +dz-wf +gu-rd +cb-af +ei-oo +ey-mb +mn-mv +fz-lj +bx-yk +mb-vs +vg-bh +ol-bb +hx-nf +me-av +mn-yu +dj-rd +rj-zq +xj-qu +kw-yb +zt-oz +lf-wq +cn-cm +mn-ij +hf-cl +wn-vi +fj-mf +oq-kw +vi-cm +uy-lr +au-md +so-ht +tc-jx +rl-cr +ky-vt +lt-dr +rf-ek +ip-nn +no-hw +ua-yg +gu-rm +qi-ub +qa-rw +no-ih +cf-ib +jo-nq +ut-dx +dc-rl +xk-yp +ut-pw +gc-rn +ri-ja +gv-jy +sx-sn +dj-si +ep-jc +wo-hz +eh-gi +li-pr +pt-ds +sk-kh +af-ut +ul-hy +kz-rl +ua-ip +xn-ph +qi-aw +py-ff +zv-ha +ir-qc +gl-qf +lj-xl +fu-kc +pi-il +ru-we +br-ql +po-ry +eb-qz +ip-yz +eu-an +oq-fz +oo-wm +wb-oi +ph-ez +ph-nv +kz-cr +rz-gn +lt-jy +yz-jq +wr-vx +uc-tq +dx-cb +at-fy +br-ae +rc-gu +so-ir +oo-li +ra-uc +pl-rp +wl-py +yg-xs +qw-gl +rn-no +jd-yk +xm-np +mq-rj +pj-yt +ef-xg +qb-yk +fv-wr +eq-yb +uq-jh +kl-yu +ef-ww +ry-zq +cn-yb +vh-oc +lh-fm +iq-ah +zr-zx +cf-wz +iq-jf +qf-sd +yl-iv +ui-kl +ft-jq +bd-ha +ek-bm +sx-da +rg-gr +wu-vy +jt-ez +kz-wg +fb-cr +cv-ct +up-uo +jk-dc +or-xa +dn-gu +tf-sd +ls-ke +jh-xf +vw-ct +oz-zx +hl-gi +fk-hm +tp-ug +hj-vf +xe-qr +tc-hj +kq-no +ic-ix +ds-tb +ae-xa +hj-lr +bl-dr +dr-db +fh-do +de-pj +vj-dz +bl-na +sk-ac +bk-fj +iq-cl +xj-wy +eh-ey +gb-bn +qw-cx +ld-tp +xr-el +tf-an +js-en +py-pk +pd-al +gr-ah +lr-jz +vw-my +sl-fi +bq-ux +pi-bf +md-fz +py-qu +eo-bb +ji-ou +zq-gk +zx-tw +pn-ru +la-xf +wv-hv +yr-hj +tb-fw +qw-vk +tq-zv +da-ta +be-mi +sm-br +ez-uw +kh-wm +vt-ss +pk-sy +dy-wy +ut-cb +ib-cy +sk-ei +zr-zt +rw-ra +uj-af +vi-zt +wf-ud +hd-fn +rs-os +ne-hc +zs-by +go-sn +vd-vh +zh-kz +bm-rh +rm-bh +vr-lk +bx-fh +kz-hy +ei-mz +lh-mx +aw-xg +cj-ld +ds-gs +fy-pz +jv-nq +tv-aw +ok-po +lx-gj +vs-ik +yi-yt +zv-is +rg-jf +md-cn +hg-qd +uy-hd +wr-rx +qa-xd +xn-uw +vn-yx +sn-av +ia-lr +vd-zp +su-be +hx-ir +wd-ri +qo-xe +xb-jv +vc-me +dj-gh +ub-ds +gl-nz +fa-aq +gc-ob +hy-hu +ij-tb +hv-dm +tv-ww +be-en +na-gg +ts-oq +vt-hm +fj-js +nm-oy +ma-ae +dp-ae +rl-zh +rj-iu +rm-qz +mt-bx +cq-ih +ew-op +sb-hh +nb-yw +ud-zn +bq-nc +pd-cb +lt-yp +uu-rg +mm-ch +wj-kd +fu-nj +qf-mp +nk-ng +nz-et +ix-pz +pc-im +cg-zk +eq-yh +nu-eu +ke-ro +nb-fv +rx-mj +dv-ae +de-zs +bf-zg +ry-gk +mb-gi +pa-vw +xg-qj +mn-ox +gs-kp +rd-av +wh-nv +pf-rm +zg-hb +xe-fk +yw-re +da-go +dj-fc +dj-eb +gc-cq +xv-sz +wg-wo +ij-pt +mh-an +zg-te +tw-gx +ev-jr +tg-hb +be-qv +ec-nm +ia-vf +hf-rg +kc-iw +lc-rx +lq-my +lu-ob +hf-fc +ia-hj +qw-tm +pq-ob +mf-si +fz-kw +bh-yc +do-yk +cd-ev +cl-kt +hz-hc +kw-nt +ac-ei +fa-py +bx-qb +yy-zp +ff-qd +bm-ap +ol-jg +yj-fw +sl-yd +mf-qv +nc-ir +nh-dx +uz-ar +zp-gp +is-xp +fz-ts +hy-zh +pu-pj +iq-gr +iu-mq +hh-jj +vj-yl +ro-zn +bf-pe +bc-qu +iu-mo +cb-uj +je-cl +ud-ls +pc-ik +nn-lf +aa-de +lc-jb +tt-wz +we-yd +uq-kg +kp-pp +cq-kq +fv-yw +ww-uw +tc-lr +ng-nm +qc-ux +pd-lo +xc-wq +dq-fr +wz-lq +lm-eo +su-js +in-ye +uw-ph +ig-zh +mj-fv +al-cb +aq-hg +ef-qi +vx-qe +lt-na +wf-fm +vc-op +ua-lf +ff-wl +za-go +hz-ln +md-kw +vq-mv +ta-vc +xc-nn +qi-ww +qm-od +af-ue +me-op +we-us +ru-us +wf-mx +op-za +mh-bd +va-fb +nl-gn +pu-by +pn-ii +su-mf +ex-ql +db-bl +qu-ff +lh-ls +ok-gk +ec-an +ib-hz +ar-rf +yh-rk +mm-yf +ba-ql +zx-yj +wu-do +or-ba +oh-at +af-hv +re-aw +oc-yy +pe-te +vd-tz +ui-ox +in-kq +fj-qy +vi-gx +qp-vk +ut-al +dy-es +jv-vr +kf-jg +kt-gw +lf-ip +qx-gb +ys-vq +cf-fi +sf-lu +ji-bn +mb-sv +fz-yb +gn-uz +pl-ok +pd-xr +oq-yb +jd-bx +ei-kh +nu-oy +qa-zj +xd-zj +dm-im +rx-re +sj-mq +yk-wu +hs-pk +aq-sl +cv-my +rc-qz +vc-sx +mx-dz +hh-bt +hv-vs +pe-hb +gc-hw +vg-rc +bb-dc +ui-mv +xp-od +tv-qj +uc-ps +cl-wb +yz-nn +zw-vy +sy-qu +uj-pw +wd-bz +fb-kz +rf-hu +nw-ht +ba-ae +lq-sl +kd-hc +ra-ps +zf-vq +gu-dj +jo-vh +wg-xv +vu-ma +mp-nz +ky-qr +vt-xe +pj-zn +et-jn +ac-mz +wj-sg +lt-bt +nc-xo +kl-ox +ok-yn +nm-ha +ww-dp +ou-hc +cv-cz +lb-zf +oi-kt +pr-wm +bx-fe +lk-vt +ja-wd +ke-dz +ql-or +dq-lb +ts-lj +sr-kj +yn-oz +fq-he +oa-wh +bt-na +jk-so +zw-cg +tt-cv +hm-lk +zv-xd +cs-yu +wg-xj +kf-eo +em-wc +lx-ei +vj-gl +uy-ia +db-yf +ma-ex +md-ts +zm-qd +ud-fm +vw-cf +lj-os +gl-lz +sx-ew +oc-ns +ux-ku +it-ja +ex-ae +an-oy +bv-hw +iu-yn +wn-ic +fq-qf +lz-ya +bd-oy +pk-aq +rk-nj +xo-ir +ft-cp +so-bo +wu-mt +vy-mt +gp-yi +sv-ik +wl-sy +oo-sk +sb-kz +gr-kt +ux-wc +gj-wm +xl-kw +hb-ie +kh-mz +te-ko +tg-gw +yw-jb +no-in +fn-ia +fm-ke +ua-xs +cz-vw +bd-sd +cx-jr +de-zm +nh-kx +ry-sj +ut-pd +ip-xc +bz-fr +qe-jb +jf-uu +lz-jn +fb-rl +fo-wd +dm-vs +pq-fs +wg-wy +hl-ik +fp-ma +yo-lr +np-js +ta-me +bh-dj +ia-dt +is-qa +dn-hb +no-gc +sg-hz +ux-ir +fg-uc +wq-cp +eb-vg +ko-up +vy-fe +ur-hx +nu-sd +xm-js +oz-mw +up-bf +zq-ok +uw-jt +zj-od +hw-ob +vg-gh +hh-ul +yr-tc +wk-cx +nx-ng +ma-xa +ww-qj +hx-xo +tq-ps +gp-rp +ry-mo +jt-kv +xx-ox +dc-kf +lc-wr +pf-bh +zh-fb +qt-mj +we-ek +na-yp +cp-xs +xm-su +cf-sl +xr-al +ta-ew +yj-eg +ga-nc +ss-fk +yw-mj +kp-rw +jo-tx +cv-pa +oz-vi +yg-ip +si-bh +jt-wd +ia-jz +jd-mt +dr-yp +lq-fi +lc-vx +uy-fn +vw-fi +uw-nv +kg-ch +yi-rp +yt-co +em-an +ua-pw +dx-xr +yr-yo +rc-bh +lk-qo +dx-el +av-za +yv-vc +hh-kz +yb-lj +yh-qo +fg-uw +qo-hm +zj-ra +uz-nl +vi-tw +bf-te +eg-mj +pt-yj +ig-fb +rh-lv +yu-nk +dm-sv +wc-ku +bb-jg +xe-nj +zf-ox +im-wv +ac-co +qp-ev +mj-lc +ez-xn +uh-pr +mz-cd +ki-ef +wy-bm +tf-ec +fc-kt +dt-vf +af-kx +xd-qm +eh-wv +ux-wy +fi-my +pj-zs +xv-dy +wl-fa +rf-pn +cp-cr +nj-hm +na-db +em-nc +zg-yg +bq-wc +cm-wn +bv-fs +je-oi +fw-ij +fk-lk +sr-fw +eu-bd +ub-at +zn-ke +ch-la +bq-nf +vj-lh +oy-jc +ol-qm +jn-bj +gb-kd +yo-jz +kh-li +dn-ie +tf-ep +ji-wj +qe-fv +rn-lu +mf-be +kz-ig +yp-bl +qv-su +wg-lv +oa-nk +he-zp +ub-tv +zx-pz +tw-oz +qi-dp +sn-da +vu-yi +ui-ys +qr-yh +ki-xg +tw-cm +ij-gs +tc-vf +wm-ac +xc-eb +cd-wk +ft-lf +fm-dz +aa-pj +fr-qc +ix-ko +by-sf +ry-mq +ep-eu +hx-bq +zn-dz +xk-ln +dp-ki +ru-rf +jh-ne +wy-es +wy-xv +qj-pc +tx-el +uh-li +xg-ys +mh-fw +wg-dy +qg-lf +je-ah +gy-me +bt-yf +bo-ya +yn-sj +mq-pl +fv-rx +hj-xf +ma-or +wy-sz +fj-qv +aq-qu +cr-jj +mt-fh +ru-nl +ko-zg +wq-yz +qy-oo +oo-gj +mw-sm +zq-sj +cf-yd +oh-tv +jq-ua +xa-ex +qc-wc +re-qt +yw-rx +rg-wb +gv-dr +fl-ev +fn-yr +sg-kd +jy-ln +ft-ua +lv-sz +cj-bz +mq-ge +eh-hl +mp-he +bx-zk +it-cj +tx-vd +nz-qf +eh-sv +vg-dj +yh-ss +rc-eb +ia-yo +na-gv +bg-gg +my-cf +rz-hg +yt-gp +fk-ky +mn-vq +np-en +xc-ua +ij-pp +xl-rs +nw-kf +bm-wo +uh-ue +ki-qj +ok-xl +cv-lq +pp-tb +qi-xg +gi-ik +sb-rl +zk-vy +lx-mz +fs-gc +ia-bl +tm-ev +nq-xb +jy-pk +mo-po +zx-gx +cd-fl +pn-hu +mq-ok +pf-gh +rm-kg +fv-vx +kt-wb +vj-ro +eh-dm +uz-rf +nk-ez +eu-oy +de-gp +qw-ev +wq-ft +oi-iq +jh-il +me-da +ae-mw +ub-is +jd-dx +ft-qg +la-il +zr-ix +si-yc +gj-mz +me-za +vg-ap +qj-vv +ut-el +yp-gv +jf-je +ar-us +ii-rf +xj-bm +mw-dv +tw-pz +rl-va +mo-un +mh-ha +lz-qf +jw-iw +vj-ud +sv-hl +fg-ng +qp-tm +il-yx +qr-nw +pi-kg +uz-hu +aw-qj +za-gy +rd-gh +rs-kw +fc-iq +ul-kz +ga-em +yr-ia +oq-os +qj-ef +va-ul +cv-wz +ev-iv +qm-rw +zf-kl +fp-sm +oy-ec +pe-gw +iv-fm +bq-ur +uy-jx +jz-fn +zr-dq +ae-ql +cr-hy +fi-cz +it-tp +fc-cl +wl-bc +pe-kb +mb-ik +tv-ki +lc-tw +kv-wh +vw-lq +jt-xn +ds-yj +mb-eh +ql-mw +yl-dz +ko-tg +by-qo +lm-bb +oh-ww +vl-ig +ss-xe +fh-cg +hx-qc +ow-lz +da-gy +uz-rz +tq-rw +zg-up +zl-wk +mr-mv +mr-yu +zp-vr +do-jd +ld-lb +mh-jc +at-ef +zx-fy +bn-sg +xl-cn +bj-gl +an-jc +nn-iw +vn-gn +yn-gk +sy-zm +fo-ri +hd-jx +ja-tp +cs-vq +ip-qg +ei-li +oh-xg +lz-bj +te-kb +jb-wr +jr-cd +on-na +vg-gu +ra-zv +ey-ik +cx-zl +je-fc +yc-dj +zn-mx +vn-jw +qf-ow +np-bk +sz-mm +ix-cm +xt-yu +bo-kf +xm-qv +co-sf +he-ye +nw-jg +eo-bo +ys-mn +qo-ky +yi-fq +kx-xr +ug-ja +ki-ww +ul-cr +he-lz +cx-bg +it-bz +jz-uy +yv-da +dm-mb +qm-tq +xt-mv +lt-yf +fc-oi +eg-kj +ns-jv +ei-ue +ga-nf +vl-jj +xg-tv +dm-wv +fs-rn +ou-wj +mt-cg +qo-qr +gp-pj +tp-fo +vk-bg +ww-vv +dv-tk +xb-zp +ps-xd +kd-kj +lq-tt +xs-qg +mm-rh +zg-tg +yw-sm +bv-cq +cy-gb +jw-pi +zj-is +rz-ii +vy-jd +rm-yc +wk-ns +yt-sf +ye-qf +at-xg +ac-pr +vc-go +tv-dp +eh-pc +fs-ob +oy-ha +nn-cp +bn-qx +ie-pe +lu-hw +xp-qm +zr-cm +ur-ku +os-au +ct-pa +zr-wn +ic-vi +zr-pz +jf-cl +sy-rg +sr-qh +ch-iw +hc-cy +ng-jt +lt-bl +mb-hv +ky-xt +vy-qb +mn-kl +re-vx +qj-at +fl-ur +ql-lx +ph-wh +bc-hs +up-tg +fh-yk +fl-wk +mo-zq +lj-kw +qu-pk +dr-jy +bc-fa +za-da +ur-wc +he-jn +ta-go +jz-tt +sk-ke +fi-cv +wh-jt +ln-yf +fl-gg +ud-yl +fu-hm +pq-cq +ka-fq +qu-fa +wu-qb +kd-bn +sy-hg +ow-jn +fr-lb +ge-qy +mr-vq +et-ow +ix-fy +qx-ib +tq-zj +jt-nk +la-kc +jo-vr +bo-lm +mx-ro +ky-hm +jw-kg +oh-ki +tg-bf +dp-ub +dq-bz +nn-jq +ss-ix +rc-yr +qr-fk +jv-oc +wr-qe +jo-jv +fl-bg +os-ts +oh-ub +pw-kx +qj-dp +jo-vd +kw-os +yy-tz +qu-zm +sy-ff +xj-mm +pd-dx +nx-fg +kg-vn +qz-yc +pj-vu +cb-pw +pz-wn +ir-em +wz-my +zs-aa +fn-vf +us-rz +ht-ol +zw-zk +ne-gb +ip-ft +fe-qb +jj-kz +ev-bg +jc-kx +lq-cz +jb-nb +vi-zx +zp-nq +mf-js +mh-nm +su-fj +wg-rh +wv-vs +mz-ue +yl-wf +rs-yb +we-ii +tk-or +de-co +mx-ls +wy-mm +iu-zq +tp-dq +cx-gg +yf-on +fv-jb +oy-mh +sl-cz +yn-rj +xa-dv +vy-fh +bb-ya +gl-et +cj-fo +ft-xc +bf-kb +ew-av +jd-wu +fy-oz +so-dc +bm-xv +pj-yi +gc-ud +ug-eh +gi-vs +me-sn +xx-xt +tc-hd +lz-nz +fq-lz +ku-hx +qm-cb +qy-mi +cr-ig +aa-jg +ah-oi +em-qc +mv-xx +vl-zh +iu-gk +ke-lh +qc-bq +ik-wv +wo-mm +hj-hd +xf-il +fo-fr +kb-dn +cm-gx +xc-qg +hx-wc +cv-vw +re-lc +da-av +gp-sf +mo-yn +xp-zj +xj-sz +sk-ue +jn-uh +al-uj +ef-oh +yj-gs +ey-eu +zm-aq +te-uo +qr-ss +yo-hd +gn-hu +qc-nf +em-xo +ld-dq +mr-cs +nk-kv +la-jw +gv-yf +pz-zt +is-xd +za-yv +ln-dr +mz-wm +ta-gy +mt-yk +vg-yc +qz-rd +fk-qo +sy-hs +gw-te +tz-jo +dm-ey +oh-dp +ye-fq +ky-ss +bj-mp +nn-qg +go-me +tg-ie +sb-fb +gy-op +vk-fl +qx-wj +pt-kp +en-qy +sy-fa +ob-no +jx-hj +sn-ew +gr-uu +ii-nl +xv-lv +rd-si +mx-ud +la-uq +ip-cp +oq-xx +sz-wo +ew-yv +ys-mv +rg-cl +hj-jz +fu-lk +qa-xp +uj-lo +ri-tp +av-sx +mt-zk +ye-bj +rl-jj +rg-kt +xo-ga +mp-ye +cv-dy +rx-qt +hd-ru +ih-rh +ic-zr +qc-ku +qp-gg +fj-en +bt-db +ky-rk +rw-ps +yg-xc +ln-na +uy-ro +ap-wy +ik-im +ru-ii +mi-mf +ku-bq +uo-hb +yy-nq +cj-lb +hh-fb +nx-oa +br-or +wc-ga +uh-mz +sl-tt +qg-ua +ww-at +bb-ht +pt-gs +la-pi +pf-rc +bv-ut +ue-ac +vk-gg +kh-oo +jr-tk +ou-cy +hx-ux +ku-rn +te-up +la-za +uj-kx +pn-ek +qj-oh +uy-dt +ts-rs +wh-js +it-fo +ia-jx +us-pn +gx-zs +xl-md +nj-vt +jj-os +zg-uo +vw-sl +yx-kc +fw-gs +jz-dt +ac-oo +vc-da +hy-fb +sg-ou +sd-nm +yy-tx +sl-ct +lk-ky +bg-qp +ex-mw +mt-zw +gg-ev +nk-nx +ut-lo +nl-us +wf-ls +nt-qt +bz-fo +lf-xs +fp-br +mp-jn +uz-pn +rd-rm +wn-zx +xa-mw +nq-tx +hc-ru +co-pu +qd-qg +vw-zh +jy-yp +uz-ek +hf-jf +cn-eq +pp-kj +av-gy +lo-pw +kb-yp +tw-zt +xr-ut +mq-po +od-zv +tp-bz +gp-pu +cd-qp +qc-nc +nl-gr +gx-ix +gk-rj +sx-gy +gn-ek +pu-sf +ow-ye +nx-ph +jn-fq +cp-yz +ne-cy +jx-uu +ex-sm +tg-kb +on-gv +xk-yf +br-xa +fr-cj +ga-bq +lj-zs +tq-od +mi-fj +ff-hs +mq-un +lx-sk +af-pw +un-gs +vh-xb +kq-ob +xv-wo +ib-hc +es-wb +xx-zf +uq-jv +il-uq +aw-vv +yr-jx +ef-vv +ii-ar +kq-qa +hh-vl +en-qi +eq-rs +wf-vj +zl-cd +ra-qm +in-cq +mq-gk +gg-qw +te-ig +cx-tm +yd-cz +mo-pl +pp-eg +ge-mf +dt-jx +wc-nc +gh-rc +gw-up +ww-py +ic-cm +nn-ft +mf-np +ep-oy +de-pu +ns-xb +oq-md +li-wm +jr-qp +ye-gl +xx-cs +kp-tb +vc-sn +rj-mo +qa-od +hl-dm +mr-kl +cy-wj +va-kz +xk-wz +lx-uh +dy-wo +pf-rd +lv-xj +pd-kx +lm-ht +zr-fy +uo-xv +vc-ew +ky-fu +sl-my +ns-nq +wc-nf +tp-wd +tb-eg +da-op +yz-xc +lj-oq +el-af +pu-nb +vn-il +cg-bx +wb-ah +bl-on +eb-rm +kq-pq +vs-sv +zw-do +vg-rm +jt-oa +cj-wd +vl-kz +sr-lo +hz-bn +fb-ji +uy-yo +tm-bg +uo-bf +si-pf +yx-jh +ss-nj +rp-sf +pn-gn +kf-ol +lv-ap +zt-gx +mw-fp +qw-bg +tk-mw +yt-by +qt-lc +su-kl +tf-nu +si-eb +yt-pu +wh-ez +od-jf +su-mi +lk-yh +zq-ah +fw-kp +ol-eo +vj-mx +nz-ka +kp-ij +pi-yx +lr-hd +dc-lm +hw-ih +ol-so +ul-ig +ek-ii +ex-tk +jk-lm +vn-xf +jx-lr +fn-lv +fi-tt +qw-qp +oy-tf +ef-aw +qh-wc +pq-in +qv-yy +hl-vs +ru-uz +ep-an +pp-wv +ld-it +nc-ku +xm-en +qv-ge +bv-pq +we-rz +rz-hu +qx-hz +ic-gx +at-tv +nb-wr +yx-xf +wo-lv +rw-zv +me-sx +cr-hh +tf-nm +ha-jc +lr-vf +wu-zk +vy-yk +lf-jq +uw-nx +dv-ba +ar-rz +fk-nj +dr-bt +vc-av +xl-yb +xx-mr +no-lu +lx-ac +ug-lb +wr-mj +li-ue +kd-qx +jj-va +uy-yr +gj-pr +bn-hc +xg-vv +nx-uj +ub-aw +ha-an +pz-vi +jy-bt +si-vg +jh-kg +gn-ru +fb-ul +dn-uo +or-fj +oz-gx +la-iw +rp-pj +wr-qt +ht-bo +qv-en +gc-bv +mm-bm +al-pw +dx-et +wr-re +wq-qg +uo-ko +zr-gx +al-nh +vu-yt +nb-qt +ct-my +tk-ql +wm-jg +jd-qb +ye-et +xt-zf +si-rc +xf-iw +dm-lm +pc-hl +tt-vw +jn-ye +ey-hv +va-vl +do-vy +gx-pz +po-hm +cj-ja +iw-uq +so-lm +vh-tx +dv-us +kc-pi +si-gu +rp-vu +rj-un +zl-gg +xo-ur +wf-ro +ft-yg +pa-fi +ox-mr +vy-bx +ex-ry +pc-gi +yf-bl +tz-zp +eu-mh +kv-uw +tt-yd +lv-mm +qd-bc +af-pd +nt-re +ye-nz +in-bv +rp-yt +hh-zh +ln-rf +yj-ij +em-ku +bn-wj +tb-sr +eg-pt +ik-hv +nb-mj +ra-is +ec-mh +kw-au +js-qy +hl-mb +hx-xn +yy-ns +im-hv +at-dp +ie-bf +cz-rm +hz-kd +xa-mr +ur-nc +bf-dn +hg-py +jq-yg +so-eo +vv-dp +pn-ew +zl-bg +mp-lz +nl-ar +ui-wn +zh-sb +yz-lf +wq-jq +fo-ja +zm-py +zp-jo +ht-kf +do-qb +lq-yd +fy-zt +vf-hd +rs-oq +eg-fw +gi-hv +ib-ne +qa-ra +ps-zv +us-ii +ge-nj +wd-fr +rn-cq +bd-ec +qd-pk +ky-xe +uu-kt +it-vv +ft-xs +cx-ev +jk-ya +ie-te +fn-tc +qi-at +kv-ez +dc-nw +lu-bv +yh-fk +bv-kq +tz-jv +vk-wk +or-sm +nh-pd +zn-lh +ke-vj +rj-ok +ik-zg +eg-ds +zs-yi +kl-ys +gy-ew +hs-zm +cn-au +by-yi +xd-tq +cs-zf +uc-xp +ih-bv +ri-ld +nm-an +fz-os +oa-xn +dy-lv +yn-un +go-gy +nu-rz +cy-za +yt-qw +hl-ey +xd-uc +pz-ez +il-iw +fz-cn +mn-xx +yz-ua +oc-tx +sg-hc +fn-lr +qv-mi +yl-ro +ps-xp +cd-cx +ow-gl +fk-vt +uj-ut +li-lx +cz-my +fo-ih +ul-jj +nt-lc +sr-gs +yv-ta +yg-yz +hj-fn +vq-xt +pl-rj +dn-pe +eq-ts +uz-ii +wv-mb +oo-lx +jk-nw +sd-oy +tt-cz +ap-rh +qo-rk +sv-pc +pn-rz +bq-xo +op-sx +kv-oa +py-qd +db-on +ng-kv +rl-hh +ob-cq +oh-bd +nj-qo +pd-el +db-lt +rm-dj +gh-si +fg-ph +qh-kj +ps-qm +ek-rz +hy-va +ri-pp +kf-so +dy-bm +uu-cl +in-hw +fj-ge +bv-rn +cs-kl +vx-bk +ir-nf +ep-mh +hy-vl +ur-em +dn-ko +fs-kq +or-ex +jg-lm +ir-bq +xs-xc +vt-rk +jy-bl +hb-te +wr-fm +qr-hm +af-xr +pp-sr +bj-ka +aa-vu +hu-ar +xj-rh +jo-ns +ql-fp +gc-kq +sj-ef +dt-fn +fw-qh +ro-ud +ko-ie +ya-eo +yd-cv +za-ta +qt-fv +yu-zf +nv-fg +uq-jw +yk-fe +al-dx +kh-pq +sv-hv +fe-cg +vi-ix +gj-ac +rs-md +lu-fs +nh-uj +hg-qu +us-ek +xb-yy +vu-co +rl-ul +vu-by +hu-nl +fg-oa +nh-el +sj-pl +jq-xs +xn-nv +ij-kj +zp-ns +qe-lc +ch-pi +zv-uc +ui-cs +yd-pa +nf-nc +ha-nu +vr-tz +do-mt +yo-tc +qw-zl +hy-ig +kb-uo +pf-gu +eg-ij +ts-ue +xj-ap +ew-da +ib-bn +gh-yc +gw-dn +xv-es +eq-kw +un-pl +jr-qw +jr-gg +kc-jh +yr-vf +ka-ye +cg-yk +vh-tz +eb-bh +xm-qy +hd-dt +ga-ir +bo-dc +xk-lt +ij-ds +nj-qr +kc-kg +vr-xb +be-js +tk-fp +ls-iv +hw-bx +tb-qh +fa-zm +tt-cf +gc-in +js-bk +zh-va +wn-zt +tm-fs +uq-vn +ds-kp +ch-kc +tg-dt +wu-bx +eu-tf +po-yn +iv-ud +xe-lk +xf-kg +op-cl +vv-oh +rp-de +al-kx +vq-yu +qo-ss +lz-ye +au-fp +qt-vx +mq-mo +et-qf +nx-xn +zw-fe +hs-ou +aa-gp +uu-oi +wh-nx +rf-us +su-np +bb-nw +od-uc +gi-ey +jy-xk +lt-on +wg-mm +mz-oo +kb-ko +aq-wl +lm-ya +go-av +iu-po +jq-cp +ku-xo +ri-ug +yr-dt +iv-wf +ep-nu +vn-la +ev-wk +fy-wn +xf-ch +vk-ev +kx-dx +pz-cm +nt-rx +ra-ka +bm-es +cd-tm +sd-eu +nh-xr +tx-vj +xp-rw +gj-ei +iv-vj +sm-tk +jg-bo +ba-ex +wb-jf +ig-jj +wd-ug +op-av +nl-rz +gh-qz +xt-mn +mv-ox +ne-jb +kg-la +lo-nh +vd-jv +yc-eb +yi-co +zn-vj +ub-ef +rw-xd +cs-ox +ma-dv +pp-pt +yl-fm +il-kc +wd-dq +en-mf +ob-vh +uc-zj +fz-xl +qz-si +mz-sk +ui-xx +no-xe +gk-po +yc-pf +fo-dq +go-tc +hs-aq +jw-xf +ji-gb +bd-an +dy-xj +fp-xa +be-fj +ct-fi +rz-rf +ji-ne +cp-xc +yi-sf +he-nz +sg-ji +qe-mj +jg-ya +fu-vt +pw-dx +mj-re +lf-xc +yb-os +nu-nm +ug-ld +vq-ox +ib-ji +qi-qj +sd-jc +bb-bo +ac-kh +rl-vl +hx-nc +gp-co +pt-kj +ug-it +bc-hg +vn-jh +uo-gw +lo-kx +uu-hf +rn-kq +ez-oa +lj-rs +zq-yn +jb-qt +uy-vf +qi-tv +vr-tx +hw-pq +zt-nm +dy-rh +ct-lq +lj-au +jb-re +fe-fw +qz-vg +mp-gl +et-fq +ph-kv +cv-cf +np-mi +qz-pf +va-ig +fw-ds +pu-vu +cf-lq +fp-or +hc-wj +eg-sr +ah-jf +mv-kl +fo-ug +fu-li +yr-hd +bj-bz +wh-xn +vq-ui +rd-bh +ih-kq +vv-qi +wl-zm +kf-lm +nq-tz +pr-lx +hf-kt +yl-ls +uj-xr +cz-cf +tg-te +wb-hf +nk-xn +yx-iw +np-fj +ge-bk +oy-zk +jo-xb +uw-ng +mx-fm +np-qv +hl-im +kc-jf +xt-ui +hg-fa +bg-wk +aq-qd +zw-tq +hz-wj +oc-jo +ar-ie +xl-os +ap-wg +jh-jw +dn-up +tw-wn +jn-gl +vd-oc +em-bq +hv-hl +tp-lb +tz-xb +cq-vs +zs-pu +qm-is +im-gi +yu-xx +wm-ue +hj-yo +is-od +uj-dx +oq-eq +kx-el +xt-cs +nu-ec +fa-hs +ul-vl +sr-pt +sf-vu +ka-qf +sx-yv +ch-uq +hb-kb +ug-fr +nq-oc +xr-cb +rf-gn +fy-ic +lc-nb +fj-xm +uh-gj +no-fs +vd-yy +rk-fk +hz-gb +gb-hc +ip-xs +rd-yc +rp-aa +qb-cg +gp-by +nl-we +oi-rg +gk-mo +ub-ki +au-eq +wj-ne +nx-nv +hf-ip +mo-sj +wm-sk +sg-ib +dc-ya +xp-xd +rk-fu +zf-mv +bc-zm +by-co +ph-gi +hv-pc +ue-kh +yx-ch +nj-ky +nv-ng +pa-tt +bl-ln +bh-gu +np-vi +bm-lv +vc-gy +fn-jx +qr-lk +sz-ap +fu-fk +lb-it +dv-sm +sn-gy +ha-ec +tb-yb +qd-wl +rd-eb +pj-co +yy-vh +hg-pk +qt-yw +kd-ib +sg-gb +be-np +mf-xm +lv-es +rx-vx +sb-gh +hb-gw +jw-yx +cy-bn +te-dn +qr-rk +ji-hz +ex-dv +vw-wz +ns-vr +aa-by +ih-in +cs-mv +ps-qa +kd-ne +eh-hv +tv-md +lx-kh +lb-ri +ou-kd +us-hu +gj-gy +wy-wo +ah-kt +ht-ya +qg-cp +xr-pw +bc-ff +kt-je +ro-ls +qo-vt +jy-na +ta-av +hy-hh +wv-pc +qx-hc +sy-qd +ik-eh +oz-ic +mp-ow +gh-rm +wu-zw +vu-zs +yg-nn +bm-wg +zx-ix +en-ge +ta-sn +iu-un +ro-lh +or-dv +nz-ow +ba-ma +xt-mr +jj-fb +it-fr +ke-yl +kj-kp +ha-sd +ww-xg +jh-ch +my-je +ja-bz +gv-db +nw-eo +sn-za +eg-qh +yb-ts +sk-li +uh-kh +vh-vr +ld-ja +hl-wv +bt-gv +ne-qx +ri-dq +cd-gg +cb-kx +zf-ys +uj-el +yz-qg +nb-re +ob-rn +mj-jb +gp-vu +ma-br +gi-dm +wd-tf +bz-ug +lh-wf +fy-gx +tf-ha +fr-ld +ep-nm +zw-bx +ga-ku +be-xm +tm-fl +hu-ii +hf-je +uy-tc +yf-na +rk-ma +ei-jd +tt-ct +ip-wq +xa-ba +oa-ph +im-sv +ut-kx +sx-za +gk-sj +ie-gw +yo-vf +uq-yx +kp-qh +xp-tp +jd-zk +gr-jf +ft-yz +ux-xo +qr-vt +uz-us +jg-so +rg-je +el-cb +fm-ro +qb-zk +md-eq +on-xk +cq-fs +mn-zf +cd-qw +zn-yl +at-vv +fk-dz +xp-ra +hm-rk +dr-on +os-eq +wl-pk +fl-eo +ec-sd +bk-mi +au-rs +lh-yl +ds-qh +mb-fh +py-aq +cy-ji +nn-ua +go-op +im-eh +yh-ky +bf-ko +nx-ez +en-bk +we-rf +tk-br +bc-py +et-mp +yo-fn +yv-op +aw-dp +uw-oa +gc-ih +bl-gv +vy-cx +rm-rc +tc-ia +uh-oo +sm-ba +mz-pr +fz-au +ir-wc +dq-ja +jb-nt +cd-vk +lr-yr +zl-jr +aa-pu +mm-ap +yj-pp +jj-zh +ij-qh +ds-kj +ht-jg +yk-xo +nt-mj +uh-wm +so-ya +dv-ql +yv-pe +ou-bn +aw-oh +aq-ff +ec-ep +qg-wu +ri-cj +tc-jz +ez-fg +pn-nl +yj-kj +cx-qp diff --git a/23/input2.txt b/23/input2.txt new file mode 100644 index 0000000..79bf581 --- /dev/null +++ b/23/input2.txt @@ -0,0 +1,3380 @@ +ur-jg +sh-sz +nv-hr +bm-xn +np-xc +ii-hj +jf-zv +bz-sn +iw-fl +tw-vd +yk-xc +hz-uv +hh-fy +ng-mx +ps-rz +jx-mk +sf-gb +qz-ec +hw-du +if-nk +mb-ob +ln-fc +sc-rr +ss-rn +hn-fx +aw-qu +km-mj +uk-ho +tu-ah +me-ld +bi-lg +xe-zm +cs-rn +tj-tf +qk-yi +bm-dl +fa-im +of-bk +ib-jf +sa-lb +ws-fg +ev-yt +qb-aq +qt-aa +gu-su +si-zi +kf-ix +as-lx +ss-fe +il-ea +sv-la +nf-mg +un-ov +lq-jx +vm-tc +ac-gd +oc-ec +aj-ia +bg-ul +ok-xf +yj-tc +js-la +nf-xe +gb-gi +vq-eg +iy-ka +xd-di +gq-oo +wz-hx +fu-ij +gx-ob +tk-ea +rx-ea +lt-wm +yy-me +re-jy +wb-sl +de-lg +eh-jg +kj-jk +xp-ph +lb-pf +oc-si +cv-yg +hi-lk +fm-jw +ub-ey +ir-de +yj-ek +pb-gm +as-xq +ok-kt +rd-md +aw-gv +wn-qn +js-xq +fb-rx +ix-jt +ze-gi +um-cs +hs-sa +dt-ib +ld-qe +zj-cf +li-sn +dw-nr +fv-ly +zr-qb +ge-wj +mw-cj +lw-pu +et-pc +ze-sf +ky-km +wi-oq +en-qi +qm-ym +rr-mx +ve-me +le-ao +lz-bc +xw-ul +ib-zc +dy-mx +yy-qe +ka-nr +me-gq +ga-lh +al-bi +cj-gs +ga-mv +uf-yx +aw-og +nl-ys +fk-gv +ym-ti +oh-sy +pt-tb +ze-cp +fa-hz +iq-cl +sv-lc +xc-ec +nj-kb +kj-mk +fu-qe +ll-bb +zt-ra +mh-sh +ei-gg +tb-oa +ic-fo +lh-ll +rp-qi +yi-kw +qm-yo +zm-nc +gs-fv +iz-zc +oo-qe +zr-zj +cg-hr +nd-qu +fc-aq +zm-oy +pw-zp +ya-ws +fl-bq +la-kd +vh-cu +tq-wz +xm-ef +nu-fc +wu-zj +cj-fv +xp-ak +ch-oc +ez-nz +eg-qj +ak-nl +au-ak +lb-hs +lx-sb +xe-ac +dk-vs +nh-fj +vh-ug +sf-xf +jp-po +iw-kv +wu-aq +lo-ii +le-yy +ua-ap +nd-ta +xd-dm +nl-el +tq-nz +gl-gx +dc-mu +yc-bq +oe-xf +nv-kk +kj-tx +wm-oi +yq-ug +no-xq +qe-ao +bz-se +ou-sx +lh-mv +uc-yh +wx-pw +ev-sp +nd-rl +xw-kx +oa-yd +gp-qs +pq-wl +ss-qo +jy-lk +gh-bs +nv-ei +xs-un +fr-rp +rj-ug +rr-bf +rl-qt +pz-qt +nc-mg +cn-qo +li-se +uc-rz +ps-yh +wc-wd +md-ce +sc-ce +zc-jf +te-vo +kx-we +gb-cp +cm-wv +lf-jn +yh-wb +rr-bv +uv-fa +tj-kf +vh-bc +xp-ku +ge-of +rz-vi +mj-tt +rx-mv +qy-bv +ye-ap +ym-sd +ka-wv +qt-ta +hw-yr +rk-hk +jp-gn +yr-cm +yg-au +uv-gp +ly-nk +aa-ih +xu-dw +hm-ui +pu-tg +ry-yt +ii-tq +vp-xr +ho-iw +jy-zx +lz-cd +ty-iw +ie-pb +vt-uj +ad-nw +me-oo +wv-nr +mw-pz +wf-cf +ox-po +ub-qs +zb-pw +xw-rk +pd-zh +sx-km +wx-kq +lb-jt +tw-xt +au-sx +ta-wi +pu-fx +wn-qv +tk-ka +mb-so +ui-oh +ge-bk +nz-xl +se-rk +nd-vg +an-ns +gj-zt +tf-zh +tk-tl +ev-sv +rm-sb +cu-cy +ef-rf +tq-lo +yn-ix +wp-nk +os-ck +hw-oi +xe-tu +tn-pd +nj-hs +gi-ji +aq-uz +kg-mj +ul-rc +ns-hf +qu-mw +sq-tk +rf-tt +um-rf +uf-lc +ef-gs +gc-pu +dc-if +wo-sl +oo-nx +rl-gr +mv-er +on-rc +aq-fx +ku-ak +ox-wg +kt-ze +wy-si +qe-wq +kv-zt +bi-ju +dk-un +yd-ot +vd-ie +eq-wz +aq-nu +vy-ws +qs-ey +aw-re +sf-qq +gi-ok +wy-cq +qh-ds +al-vv +hw-yv +tl-sq +dp-eh +in-md +xc-iv +de-ma +ic-vt +kq-zb +mu-tp +xe-oy +nd-mw +io-eh +yv-ia +cw-kx +nv-ua +cd-kv +ky-kg +dq-gz +zx-ju +jc-xk +hm-uk +cl-vt +ba-fz +or-we +df-sy +ui-df +hd-oz +wq-dh +ai-rj +di-lt +sh-mk +nf-gd +oa-ot +xp-dk +tl-ka +sp-sv +ln-jx +xu-ka +tg-gw +mi-pa +dc-wx +cb-jk +vq-hx +sf-kt +zx-ma +du-cm +ii-eg +lz-ij +ur-of +by-zf +ch-ub +nc-ah +lm-pj +jd-zy +tw-xy +gv-po +wc-oy +gj-iw +zc-dt +bl-gw +ez-xl +pn-lr +tc-wb +eh-rm +lf-di +tw-fx +yd-ya +vs-ap +sz-tx +vx-vh +no-bk +xm-ue +mp-yv +as-sb +rg-wv +yq-hw +av-kq +wu-bu +qm-fi +mw-ta +gg-yb +fz-xz +dd-zm +oe-kt +gr-qu +il-tl +dl-pa +lq-cv +sz-kj +vb-oc +qz-ek +dj-ac +gb-ca +kj-mh +wx-kb +cn-pt +us-jf +rr-xp +zt-ty +em-xv +ie-ro +ys-el +dc-ww +rg-tk +na-op +er-ue +pn-uk +cd-ls +zx-db +rg-ig +ar-yb +cb-mk +uq-bs +qq-gi +lr-uk +gw-wz +jf-so +nw-jw +fa-su +ao-oo +mg-gd +xy-pu +ac-dd +ir-fw +dv-hx +lr-ui +wf-ia +re-fk +wl-zo +pe-jh +ch-xc +do-ym +aq-ln +rz-ek +um-rn +pk-xn +bs-zp +np-vb +io-zc +nw-wp +oa-ws +yg-tt +tk-ig +oy-wd +db-kz +vi-yj +ri-vx +lq-km +ej-hm +dt-gl +kd-as +mg-zm +is-pa +ig-il +pj-fk +dk-ak +dt-mb +sp-ts +yn-kf +zf-ri +lw-ia +ho-cd +cn-tb +sv-te +dx-tj +vv-lg +ka-rg +fh-yx +gr-qt +oc-iv +bl-hj +op-mv +uh-td +yv-py +ys-fv +wz-qj +wz-wt +ys-ph +zy-bd +jz-qc +rz-wb +dj-gp +fx-ki +wl-kb +qk-kw +if-ly +qc-ro +pc-ov +us-zc +kt-qq +en-ur +ih-qu +lt-dm +ri-vh +ib-zv +mk-xr +nu-wu +pa-bd +sb-la +bs-wx +nr-ig +yk-cq +et-el +ii-hx +zm-wc +db-vv +ec-cq +sp-uf +yi-wp +ps-ek +hi-jy +uc-ps +lq-mj +dl-pk +he-ds +qq-cp +op-rx +jc-ue +wt-ms +uc-sl +zf-vh +ix-oz +gz-xn +qc-ie +nz-wp +ja-mo +jg-os +vx-px +pj-lk +go-uj +zt-fu +dl-jd +ra-fl +qs-fp +en-mo +qh-ym +ga-ue +om-ja +kv-qs +ap-hr +ej-oh +fr-os +qh-xv +is-th +ku-et +eg-gw +ln-uz +of-lr +mq-nx +ad-kp +sn-se +ck-fr +hn-gc +fk-kc +oa-sc +fv-fe +sx-ee +xq-ek +er-ga +fg-kr +in-bf +ng-bv +vo-ts +qk-ye +et-ph +oz-dx +bl-dv +fh-sp +pn-hm +nc-oy +fm-xl +ow-pf +zf-cy +kj-xr +pb-uh +ps-vm +qm-do +ob-or +cw-rk +ub-dj +ov-vv +wf-sn +nt-yr +hz-gu +ov-ak +xj-zv +fn-or +pc-ph +ga-jc +zu-uh +wj-of +xu-sq +sl-ib +bg-hk +qy-ce +pw-dc +lb-kb +ka-dw +xw-or +an-yr +tn-oz +lw-xt +fe-rn +jf-mb +bs-dc +kx-bg +bd-jd +hx-eq +xm-er +ao-wq +jk-mh +bk-df +cx-dj +bk-hm +vh-ad +zr-ln +sd-ds +ai-oi +ll-na +fl-ij +rd-rr +ej-ge +fo-fe +uc-qz +ur-ja +uf-qv +cd-ah +mz-ck +kg-lq +xw-we +ua-kk +st-xt +lm-ce +ti-jl +qy-sc +ts-pn +db-lg +pz-ta +uj-hh +xn-lx +wv-tl +vq-eq +ih-nd +gr-aa +kq-pw +zi-ec +ou-mj +xt-tg +gs-bp +gr-oq +sy-ej +dy-rd +pn-ui +gw-hx +do-qh +lr-wj +bq-ia +su-xw +ic-ba +kx-xk +nh-zr +rc-kx +nh-nu +ib-iz +he-lr +bp-fo +iw-ra +me-qh +jt-sa +qy-lm +uv-aj +sd-ti +ds-do +kc-aw +oz-zh +ti-ii +ju-de +kw-ly +rc-we +dv-eq +sv-yt +jf-gl +xs-pc +ss-mm +pt-kr +gp-gu +ip-sr +ty-ra +zv-gx +nt-cm +qo-vy +ku-un +pw-bs +hp-fk +vo-ev +ue-bb +et-nl +wt-uh +dh-oo +th-vt +kd-xq +ye-gg +np-oc +uk-ej +pc-el +ix-zh +lo-hx +so-zv +ja-gj +ri-wn +iq-wd +zt-ho +mw-oq +bg-cw +nk-nz +ua-ar +cu-oh +qn-cu +lx-js +rd-sc +dy-qy +bl-qj +kx-ul +pz-ih +tu-ac +gu-ms +qo-fg +kk-gg +tn-dx +tj-hd +xr-mh +bd-bm +cy-vh +em-qm +ja-tr +ob-jf +vy-kr +dx-pd +nj-qw +hf-yq +px-vh +lw-xh +gx-dt +ow-jt +tp-wx +py-wf +bz-wf +gh-tp +xh-st +ez-kw +jd-is +lo-gw +qi-mz +nf-hm +fz-fy +hh-cl +dp-la +fe-mm +iq-ic +bb-mv +dz-xz +he-qh +na-gd +rf-cs +et-ys +kw-xl +ge-hm +kr-pf +se-py +ts-lc +nk-ez +ee-cv +xe-mg +tn-yu +st-ki +oi-an +fe-cs +ok-qq +ga-na +gm-af +jp-xd +xp-et +lx-eh +ma-bi +gm-ms +go-cl +zp-wx +af-jz +ot-ws +bg-or +il-pm +dj-ey +gb-ji +np-ec +ge-ld +nx-gq +hj-tq +ad-by +ot-qo +oy-tu +nz-if +sp-te +ym-em +tu-dd +dh-le +lf-wm +sv-ry +ig-ka +tr-en +sr-og +he-ym +ic-dz +df-nj +gu-qs +tt-ky +hs-jh +xp-pc +yx-ts +ts-te +wv-il +ro-uh +nf-zm +fn-kx +dt-xj +kg-ap +vi-yh +hr-gg +tw-lw +gm-td +nu-bu +dx-zh +au-lq +pq-jh +iv-ch +kq-gh +fa-qs +um-fe +tn-kf +yd-tb +em-jl +of-df +ia-bz +cd-ra +fa-gp +ro-zu +xn-dl +fm-ly +hr-kk +cj-ss +ww-gh +tx-sh +na-fb +ot-vy +jd-yh +jt-kb +gu-ub +fu-fl +wd-ah +oo-xy +wt-td +cm-hf +pf-pq +zu-pb +di-wg +zu-af +we-hk +ki-vx +jg-qi +ms-jz +dt-ob +dh-te +tl-ig +zy-gz +lg-av +nw-kw +bf-qy +ef-rn +yk-ch +lb-nj +rz-qz +gm-vd +rf-fe +rg-nr +kg-tt +wo-qz +jw-if +jn-jp +ou-ky +fc-uz +uv-qs +nt-ns +dl-zy +io-no +kf-hd +sr-hp +yo-do +ee-ou +fh-ev +dz-go +tu-wd +me-qe +tb-qo +du-rj +zy-nr +tj-mf +xr-dr +na-lh +el-un +xv-do +vg-qt +cp-gi +iv-vb +qj-tq +xj-gl +yc-yv +xz-uj +ck-rp +fj-qb +bg-rk +kb-qw +wp-fm +fe-ef +xu-il +dy-bv +yx-te +tt-ou +ho-ra +el-jw +zf-kp +jh-wl +sx-ky +oq-rl +xn-bd +ne-yd +tc-uc +tp-zb +km-kz +fa-ey +so-ob +dj-fa +xr-rv +yn-oz +hl-ln +mu-kq +vs-uy +xr-zv +ao-dh +qw-pf +by-vx +hl-nu +tk-il +ec-si +yq-an +ia-py +cy-kp +bu-uz +vy-yd +eh-la +zc-mb +hi-og +lm-mx +go-ic +tw-pu +bb-ga +ra-lz +he-sd +cg-no +gv-pj +ox-wm +yk-zn +qo-ws +ul-fn +vq-ze +cq-si +vq-dv +cf-ia +kj-jx +ma-ir +nh-bu +on-hk +gl-ob +zr-wu +uq-zp +oc-cq +gz-gm +zx-bi +ss-cs +em-ds +ef-mm +du-hf +mq-me +nl-un +wi-ih +zi-iv +tw-tg +tx-cb +jn-dm +bc-vx +ga-ll +ux-vt +hk-xw +mq-ao +pq-ow +bu-zr +nw-ez +wo-ps +nj-pf +yc-wf +mi-th +th-bd +ck-mo +gl-iz +vx-cu +ww-dy +fr-tr +us-zv +en-kg +rc-hk +wz-bl +ww-av +vp-jk +al-lg +xt-fx +im-gp +sc-bf +bi-db +aj-py +in-qy +lf-um +qj-eq +qb-hl +de-rn +gv-re +ls-ho +rd-in +zj-nh +jz-bu +tg-st +no-kd +yv-bz +vm-zu +gu-cx +pd-hd +og-ya +dp-ok +db-fw +dw-sq +tc-ek +hs-pq +qu-vg +dy-sc +nz-kw +mj-ee +jc-rx +oz-tj +cj-bp +zp-dc +bm-zy +zu-jz +fe-bp +ra-ls +kv-fl +jw-yi +yb-nv +ky-lq +mq-pq +sx-pe +gb-oe +ti-do +gn-po +gn-dm +yv-sn +iy-lw +hn-ki +vo-sv +eh-kd +px-cy +wi-vg +sh-cb +iq-uj +op-bb +fj-zr +hl-aq +jj-cq +gg-vs +zn-vo +yg-kc +bc-kp +cg-lx +kr-ya +nw-fm +hn-tg +ls-fu +nc-tu +tu-gd +ls-ij +nd-oq +ad-ri +oy-mg +bu-hl +mo-rp +of-sy +nv-ye +zb-dc +aw-hp +tb-fg +up-ma +oe-cp +ly-xl +sy-wj +lh-rx +gp-su +js-io +oq-pz +ym-xv +tn-ix +re-pj +ub-fp +kc-hi +qz-vi +li-bq +dc-kq +qk-fm +gj-ra +kf-yu +mz-tr +tf-ix +tj-zh +nd-pz +bc-ri +zp-ww +xv-sd +ys-ov +mg-wc +ui-uk +fj-fc +ry-uf +ux-ic +cl-fz +oz-pd +lb-zo +og-hp +iz-ob +qe-dh +qb-ln +lh-xm +ie-jz +vs-ar +hl-yo +no-sb +oc-wy +bi-de +ap-uy +ne-pt +tc-qz +qe-ve +ib-so +wj-na +ye-hr +rg-pm +md-bf +ps-yj +cb-kj +sy-uk +lm-bf +ei-lk +vo-uf +kc-lk +ju-kz +ly-wp +ck-jg +xe-dd +af-ms +cm-ns +bl-qn +ti-ov +zm-wd +cy-wn +ku-el +go-fz +xr-cb +jw-kw +go-vt +xf-cp +iv-np +cl-uj +ma-lg +ea-nr +uh-ms +yh-qz +xp-el +yu-dx +jn-xd +zv-gl +kt-gi +oh-bk +yc-mp +gz-jd +aq-fj +dr-tx +uc-uj +vt-xz +ys-un +bp-cs +fl-zt +jd-bm +kd-rm +cn-vy +tf-mf +kj-rv +tr-pk +vb-zi +ro-td +nf-oy +ce-rr +wn-kp +oz-tf +lr-ge +dq-dl +fr-yy +ev-qv +wx-cn +gd-oy +pj-jy +gc-tg +hh-vt +ok-gb +kr-ws +tp-dc +jn-po +ku-ph +js-cg +fy-ux +zx-al +sd-sp +jj-gb +ve-hf +sr-hi +km-yg +mg-wn +rl-ih +yt-lc +qs-im +ai-yq +hk-ul +ui-ej +iu-dm +ok-ca +sd-fi +qc-ms +th-jd +mo-os +nu-ai +wv-tk +wx-uq +kr-qo +xj-gx +mh-dr +ow-hs +dz-hh +oy-dd +oq-aa +ty-fl +js-xe +kf-tf +af-pb +lq-tt +bu-aq +wp-ez +ti-fi +lc-sp +vp-mk +vm-ek +el-ov +vd-qc +lw-gc +lt-yi +em-he +tc-sl +fv-ef +dw-tk +nc-ac +xm-na +gc-xh +pn-ge +ca-jj +pd-kf +re-lk +yi-xl +vi-uc +xs-dk +lx-dp +si-ui +vb-wy +ch-si +cg-dp +cp-jj +vt-iq +ir-vv +fj-hl +oo-yy +oa-ne +lt-lf +ki-xh +qt-ij +pu-ki +of-ui +bk-ej +us-mb +kt-xf +uj-ux +yg-ou +on-ul +ws-tb +hm-df +ta-vg +wj-pn +rk-ul +cq-zn +pz-qu +oh-pn +uy-gg +jp-cn +bz-py +iu-po +tg-xh +wt-jz +ho-lz +oi-ug +ch-zn +mw-gr +cv-kg +vt-dz +fg-ya +sh-rv +tu-al +kv-ho +ro-af +py-li +mi-bm +ms-vd +ox-mu +nj-wl +hx-eg +fy-dz +mo-mz +us-ob +pa-zy +eh-js +gj-ho +rn-rf +xu-nr +ih-qt +go-xz +vx-zf +qk-ez +ej-df +wq-nx +zx-ir +lq-ee +jk-sh +nf-wd +yo-ti +hz-su +df-pn +np-yk +zn-ec +zv-oc +np-kd +sr-gv +tw-st +wc-so +en-ck +vy-ne +ja-fr +dq-yk +ij-iw +se-cf +cy-wu +ey-im +xt-xy +ze-jj +zi-zn +iu-lf +wi-rl +zf-ad +qq-ji +kj-vp +wz-hj +cv-pe +sy-hm +ln-zj +cx-gp +ye-vs +jp-wg +pn-ej +ys-dk +iv-wy +zc-gx +lb-qw +bl-eg +yh-vm +no-dp +uq-av +us-gx +lk-gv +gr-rz +fh-ts +wt-zu +xs-el +op-fb +hp-wp +xu-tk +pe-km +lb-kw +ix-hd +jz-uh +im-dj +sp-vo +vp-rv +xv-jl +vi-op +in-bv +fn-hk +md-dy +in-sc +mf-zh +ju-lg +ry-fh +cn-fg +sa-kb +ot-pt +ii-dv +jp-wm +ds-xv +wq-mq +gz-bm +go-fy +bg-we +uz-hl +mj-sx +wg-iu +zy-is +ve-gq +af-td +jg-tr +li-bz +ll-mv +mo-fr +wj-hm +kr-ne +uv-im +dh-yy +ce-pd +na-jc +hr-ei +ou-pe +cb-bd +sq-il +eg-dv +yi-nz +ms-zu +vp-jx +nk-nw +vi-ek +aa-nd +nu-zr +fm-if +em-ti +cl-xz +ea-sq +um-cj +bm-dq +kr-cn +wo-uc +fe-cj +cj-rn +ga-fz +ge-oh +ne-ya +nx-ve +hn-iy +bq-aj +os-en +wg-gn +jt-qw +wz-lo +tp-ww +po-dm +jt-wl +ob-ls +gq-yy +pk-pw +wu-fc +ww-zb +on-ho +np-zi +st-fx +dk-ph +hx-hj +zn-iv +ee-kg +ir-kz +kt-ca +ng-bf +zx-lg +gd-xe +th-gz +kp-vh +mv-ty +hj-lo +kt-gb +sa-jh +or-cw +vo-lc +nc-wc +ku-ip +ld-wq +dh-mq +lk-sr +le-ld +rj-fh +au-ky +ul-xk +ai-ug +ln-fj +mj-ix +mb-xj +on-xk +ln-bu +wj-df +ty-lz +xh-xt +mh-mk +pb-ro +jx-mh +re-hp +xz-hh +oe-xr +un-pc +ls-lz +le-gq +uy-fq +nk-fg +wg-dm +kd-lx +ox-jn +yj-vm +jx-cb +by-wq +zn-vb +yn-zh +ip-hp +pm-xu +uk-ge +sh-hh +xs-nl +ti-ds +cu-bc +wl-lb +sz-vp +xf-gb +wv-ig +of-hm +ld-mq +se-aj +bv-mx +xj-ob +bs-zb +hz-qs +qh-jl +bi-vv +ov-xs +mf-hi +zj-nu +pq-lb +ah-mg +ix-yu +pc-ys +fv-ss +dh-me +gw-qj +nt-hf +jl-he +jk-jx +wx-ww +yj-uc +so-us +ka-mh +by-qn +vm-wb +sb-cg +xe-ah +hz-gp +xl-ou +gu-uv +ie-by +lm-rr +mz-ji +cf-li +ju-fw +er-lh +cb-rv +fw-fm +rx-er +bk-sy +ec-yk +jp-dm +lf-dm +cg-xq +an-sy +ur-tr +jg-en +uf-te +no-la +wp-qk +yg-mj +iu-ju +gs-fe +vb-ch +oq-au +zj-fj +tc-rz +do-fi +cp-er +ur-rp +cw-ry +ap-ar +zh-xs +ow-lb +rc-xw +fz-dz +cq-zi +ts-uf +qy-ng +pz-rl +pf-wl +tw-hn +rd-qy +ge-df +zx-up +wy-ec +vh-wn +jz-gm +ib-gx +wc-ac +oc-zi +ly-ez +mp-sn +bv-bf +mu-av +mj-cv +er-jc +jp-dt +oe-ji +wi-pz +ky-mx +wo-vp +if-kw +li-yv +xq-lx +ns-ai +bb-fb +kr-oa +xz-ux +jc-op +fk-aw +yd-ws +so-dt +ng-rr +ap-fq +wb-uc +dv-wz +kv-gj +ev-uf +yi-nk +cs-ng +di-po +sq-ka +nc-gd +yk-si +mx-rd +vs-fq +gh-pw +tb-vy +fg-ne +tq-gw +gn-wm +bg-rc +mx-bf +tg-iy +yj-sl +qw-zo +is-xn +hz-cx +xm-ga +ph-ws +pm-ea +pj-kc +pc-nl +kq-tj +zm-ah +so-xj +as-no +zf-cu +ok-ze +sn-yc +yb-hr +fe-yb +pn-sy +pt-yd +yk-zi +dt-zv +ca-cp +tb-fp +ll-fb +oq-vg +qn-ad +lt-xd +um-ef +kr-tb +sz-mh +or-ul +xn-pa +qz-yj +jh-qw +mq-ve +dq-pa +du-nt +iy-pu +ey-hz +ld-nx +xy-gc +jz-td +zp-kq +yh-tc +aj-yv +oy-ac +ub-uv +ns-rj +sv-ts +jg-mz +ku-dk +sy-lr +af-qc +zu-vd +kk-vs +tx-jx +pe-lq +kx-dd +tp-nh +vx-cy +on-cw +wf-li +nk-xl +oo-ve +ug-nt +iz-zv +eg-eq +bd-gz +um-bp +th-bm +ra-kv +dm-di +rr-in +or-rk +sx-cv +fn-cw +py-mp +ds-ym +xe-nc +bu-fc +oa-ya +mf-ix +ov-nl +hn-pu +ym-jl +zf-bc +ad-bc +ls-iw +yy-mq +px-qn +xq-io +fn-le +ba-ux +mb-gl +aa-mw +tx-xr +ue-ll +yo-fi +rf-ss +iu-jp +th-dq +sd-do +ib-us +ef-bp +mj-ky +uk-wj +mm-gs +js-kd +te-yd +mw-qt +ki-lw +gv-ip +fb-ga +af-vd +de-kz +qb-wu +no-eh +kt-uz +ak-et +em-ul +kd-cg +ye-ua +aw-lk +qc-uh +ux-iq +ef-ss +qo-yd +fy-iq +ce-mx +om-qi +mb-is +sr-fk +we-xk +ve-ld +he-xv +io-lx +ip-hi +om-jg +pt-ws +pa-jd +cw-xw +ca-ze +cy-bc +ce-ng +me-ao +iv-yk +zh-yu +qm-ds +ef-cs +cm-oi +xk-rp +gv-hp +jc-mv +fg-yd +cv-ky +iz-so +bq-bz +jn-wg +ok-jj +hj-dv +mm-fo +qn-kp +nc-nf +gj-cd +bz-qc +in-ce +rj-yr +dp-xq +ng-sa +sq-ig +bk-ui +rv-jk +le-oo +wm-jn +gw-vq +kk-ar +tb-ne +md-qy +if-xl +cn-ot +mm-fv +df-oh +ll-xm +ju-vv +xv-qm +ic-uj +fx-xy +ai-cm +yn-pd +as-io +xe-wc +kp-px +su-dj +fw-ma +vg-aa +oe-gi +ij-ra +el-ph +fo-gs +cl-mo +dj-qs +pe-mj +pq-jt +pd-pz +sf-gi +mk-rv +ac-nf +ux-go +yb-kk +sd-qh +js-sb +wo-ek +up-bi +jw-nz +is-dl +fo-uq +ck-ja +px-wn +kq-ww +os-mz +rn-fv +rp-mz +iw-cd +ij-zt +fq-ar +yg-sx +rg-xu +wc-nf +kq-uq +xz-iq +pk-gz +ul-we +gs-rn +no-lx +ig-ea +lo-eg +kb-jh +na-rx +uq-tp +du-an +nv-uy +nc-dd +ot-ne +qv-sp +vs-yb +ja-os +dr-vp +mb-iz +av-wx +sf-ok +gq-ao +hi-re +ox-gn +yo-jl +np-cq +qq-ca +nd-ne +om-ur +yr-ug +hw-hf +dl-mi +vb-ur +hw-kj +qt-nd +ih-in +rn-mm +ai-nt +tt-km +nu-qb +fz-iq +uz-zr +px-ri +uz-zj +ro-qe +pt-vy +cm-rj +sz-jk +sh-xr +xj-iz +ry-te +fp-fa +rx-bb +mm-um +xd-hd +qm-sd +pf-jh +fq-qy +lo-bm +ee-ky +dz-uj +li-aj +gv-og +jn-iu +xw-fn +kt-ji +mo-om +cg-dz +hw-ug +lt-gn +ty-fu +un-et +mu-pc +fo-ef +dq-is +hh-ic +fn-rc +lf-xd +xl-qk +or-rc +dy-ng +hs-jt +vb-yk +ic-cl +cp-mi +yq-nt +cv-km +ss-gs +yj-wo +oz-yu +rd-bf +yy-ao +pe-ee +of-py +tc-ps +gx-iz +zr-aq +ph-un +zy-xn +dc-uq +zi-xc +vy-gg +dd-gd +us-iz +ta-qu +md-rr +yh-rz +vv-kz +oq-qt +vm-qz +yc-ia +ya-vy +wv-dw +fc-nh +mx-sc +vm-sl +hi-pj +tr-rp +ca-xf +sb-xq +hf-an +dr-jk +zf-wn +sr-jy +tx-mh +gd-wd +uq-pw +qj-ii +bb-lh +pd-mf +fl-ho +tj-ix +el-ak +bi-dx +ly-yi +hl-nh +rl-aa +us-xj +qi-tr +zh-kf +me-nx +fq-ei +ki-gc +vd-wt +jf-xj +bv-sc +ek-yh +lo-qj +aj-sn +cj-rf +ad-px +fa-cx +qu-oq +sq-rg +xd-iu +xu-wv +io-cg +nx-dh +kw-wp +fk-qw +hl-zr +rf-fv +wc-gd +jc-xm +dp-io +yo-qh +pb-td +su-fp +qc-gm +ij-gj +ma-vv +vp-tx +om-fr +ga-op +nx-mp +sb-io +yv-se +tp-bs +oo-mq +hm-oh +pn-bk +il-ka +mj-au +pk-dq +pt-fg +sn-py +dr-mk +ji-xf +ad-vx +rk-we +uv-su +qi-ja +nj-jh +om-os +if-nw +db-up +qq-xf +wm-xd +su-ey +di-gn +cg-as +nl-ow +lb-jh +yn-tj +fy-ba +zm-ac +le-wq +ea-dw +up-fw +fr-qi +hr-ua +po-wg +um-fo +fm-nk +ap-gg +hd-dx +ip-aw +ie-uh +qb-uz +hx-yq +cw-hk +sa-ow +zy-mi +py-yc +ot-kr +jl-qm +ps-qz +ba-go +ri-kp +io-rm +bi-fw +um-gs +so-gx +hs-pf +fi-em +wm-wg +yq-rj +sl-rz +mu-uq +oy-ah +il-tc +rg-tl +ai-yr +hk-kx +fa-ub +ih-oq +hh-ba +ya-tb +iy-xt +dw-hj +yo-ym +fx-iy +rc-rm +hd-tf +zm-gd +xz-fc +ul-cw +ey-gu +nj-pq +gz-pa +zo-sa +xc-si +oi-yq +iy-ki +cv-au +pb-vd +ph-xs +qo-pt +in-dy +zr-gx +wc-ah +wc-dd +gs-rf +cn-ne +ov-xp +nu-ln +qk-nw +lt-ox +vi-ps +nr-il +yu-tf +gh-zp +bp-re +vp-mh +hk-px +dz-ux +vq-lo +kt-jj +fc-zr +bd-dl +hj-gw +ok-cp +lr-df +fb-jc +uv-ey +cx-qs +kp-vx +yc-cf +eq-tq +tx-mk +js-as +pq-kb +aq-nh +oz-mf +oe-ze +we-cw +nk-kw +ho-ty +ow-jh +cy-ad +cs-cj +hi-gv +gl-fy +uf-sv +qn-vh +yo-sd +pm-dw +ri-cy +pm-tl +qb-nh +qi-os +ja-en +uj-fz +sh-kj +xk-xw +jt-nj +rv-ue +xu-ea +pt-lg +fb-xm +fr-ur +pc-dk +vm-uc +nu-uz +ma-db +re-kc +cy-by +dw-tl +jy-gv +ki-tw +ta-oq +rc-xk +ux-cl +gh-mu +sc-lm +ip-kc +eg-tq +md-ma +ll-jc +ki-tg +lm-ng +ys-xs +hw-ns +ij-ty +yq-ns +qm-tk +ow-qw +zi-wy +kk-ap +yg-ky +dx-tf +pk-mi +iv-cq +pd-yu +fh-vo +po-lf +rv-sz +rv-mh +mz-fr +np-wy +sf-jj +yi-ez +gc-tw +of-uk +jj-xf +ob-zc +fw-vv +mp-ia +vb-cq +fp-hz +qi-nc +cf-aj +ld-yy +em-qh +vx-wn +aa-wi +go-hh +om-rp +er-ll +qq-ze +ph-ov +dc-av +av-zb +dl-xt +gc-st +oi-ns +fg-oa +hk-or +wi-mw +pf-sa +ge-sy +jf-sf +wp-xl +iy-st +rk-xk +ov-dk +og-fk +oe-jj +kz-ma +yb-ye +zu-ie +eq-ii +qo-oa +im-su +fo-rn +zc-so +ig-sf +jn-lt +ln-wu +ki-xy +aj-yc +wv-sq +db-de +hw-ai +tp-pw +ar-ei +ur-mo +li-ea +lt-rd +xd-wg +ey-fp +ck-tr +up-lg +ve-ao +jl-fi +eh-as +rd-lm +vv-zx +by-kp +ro-ms +kg-ou +uz-nh +ox-jp +le-ve +vg-hs +rv-dr +kc-hp +hx-qj +ry-ev +dv-tq +uh-vd +cn-ws +ac-mg +ir-up +de-fw +db-al +on-bg +tt-pe +tj-pd +dm-ox +wg-lt +nt-oi +bz-yc +xm-rx +zt-zi +ck-ur +mb-gx +uj-ba +wo-wb +dv-qj +yx-yt +cm-an +sn-bq +hs-zo +nz-qk +ib-gl +iv-ec +up-al +jn-gn +bg-fn +nw-ly +ka-pm +hs-qw +dj-hz +yk-oc +cx-fp +tt-ee +ez-bf +aw-pj +cp-ji +uv-do +ux-hh +qe-le +hi-aw +px-by +qt-qu +hs-wl +di-jp +og-lk +yu-yn +im-hz +em-yo +fu-lz +de-al +xu-tl +ls-kv +qv-yx +ds-tx +ns-fp +bk-wj +al-fw +yx-vo +kc-gv +sc-md +ty-gj +wm-di +ox-xd +ns-du +qi-mo +kz-zx +gg-fq +hr-fq +ll-op +cd-fu +dx-yn +ts-yt +ys-ak +xj-ib +db-xf +bf-ce +bl-ii +qm-he +aa-qu +os-iz +fj-bu +pb-ms +ic-xz +jg-mo +zb-wi +ie-ms +yv-cf +yu-tj +dz-ba +vv-up +mm-bp +zj-hl +fu-iw +wl-qw +ic-fz +tg-fx +xe-wd +zu-gm +ln-nh +ou-lq +ye-ar +tq-hx +yb-ap +bp-ss +re-og +qb-pa +kz-al +lt-iu +ll-zn +he-do +oe-ca +tn-yn +fj-uz +ev-te +fl-gj +fu-gj +cb-sz +if-wp +ry-vo +gu-fa +ro-cm +sq-pm +dk-el +ih-mw +mv-fb +bg-xk +wy-yk +ja-jg +rm-lx +xs-ku +iy-gc +xw-bg +dq-jd +ey-gp +wy-xc +ac-ah +jx-rv +md-mx +xq-eh +nj-sa +vx-qn +yo-he +vy-oa +di-ox +er-op +qv-vo +jw-qk +yr-hf +oe-qq +qn-zf +yh-wo +wu-fj +ec-ch +yj-rz +dx-kf +td-rg +io-kd +mz-en +tw-xh +sd-em +cf-bq +ky-pe +yj-qq +wf-eg +zb-uq +qm-qh +iq-hh +ku-ys +bc-by +ju-ir +dp-sb +hs-kb +qw-sa +mw-rl +fp-im +wz-ii +ih-vg +lz-fl +rf-bp +bv-md +ee-km +cv-ou +ve-dh +dw-il +vs-ei +yx-ij +gn-wl +jh-zo +yq-cm +dq-mi +hp-jy +xd-gn +ip-jy +au-ou +dv-gw +lk-hp +hi-hp +au-pe +oi-yr +ii-vq +yg-pe +gw-ii +oa-pt +hw-rj +fx-gc +kd-sb +zt-iw +rg-ea +wy-uy +ux-xu +ze-ji +bg-np +qe-mq +hf-oi +zo-nj +dw-ig +wb-ek +pb-jz +wb-yj +yv-bq +kf-af +pm-nr +rf-fo +kz-bi +im-ck +ya-cv +zo-ow +et-ov +hn-st +nl-ph +fq-ye +zb-mu +nc-wd +tu-zm +tn-tf +vg-pz +bl-eq +yr-yq +vi-wb +lo-eq +fi-ds +ls-zt +zj-bu +ar-gg +iw-ba +as-ra +ua-vs +vt-fz +lr-oh +jh-mm +ac-wd +bz-mp +ip-pj +fh-sv +gl-so +ld-dh +ba-cl +te-yt +tn-hd +hd-mf +ps-bl +mv-xm +tt-cv +vq-hj +cx-su +dt-us +rm-no +zv-mb +mz-om +hj-eg +zj-aq +rp-jg +xk-cw +en-om +un-rl +ya-pt +ai-du +tl-nr +cx-ub +fi-xv +tr-os +se-ia +ce-bv +fy-cl +nt-an +tf-yn +ek-uc +gm-ie +ca-ji +yv-wf +qm-ti +ue-mv +gu-fp +ld-ao +td-vd +wg-ua +dp-rm +if-yi +gd-ah +ip-og +bs-kq +sz-dr +ta-gr +on-kx +kf-mf +wo-rz +zi-ch +lg-kz +nl-xp +ar-aa +cu-ri +uk-oh +wf-bq +yu-mf +dl-gz +yx-sp +lf-gn +fh-uf +sq-nr +yc-li +wb-hl +nk-jw +ap-nv +nx-ao +zb-wx +oc-xc +ug-du +or-kx +yt-uf +wf-se +wl-sa +rg-dw +jk-eq +an-ai +ye-kk +dm-sx +ba-xz +yg-kg +iv-zm +xu-ig +rp-en +iq-ba +yy-ve +fc-qb +du-yq +tu-wc +su-ub +ry-yx +fg-ot +fy-uj +uy-yb +xf-ze +ox-lf +jt-pf +xn-th +ll-rx +ng-rd +nx-le +ec-vb +mq-le +fz-ux +ro-gm +uh-af +jl-do +nl-dk +yt-qv +mu-zp +uh-mk +vb-si +tw-iy +vs-nv +mx-in +wq-gq +we-fn +cu-px +ow-wl +ja-mz +qb-zj +tc-vi +vq-wu +pb-qc +vg-gr +xh-fx +ue-os +mp-aj +mi-is +fk-ip +nv-fq +ly-qk +os-rp +ap-ei +ar-nv +cu-wn +yi-oz +wy-ch +ws-ne +pj-og +qj-go +lh-bd +aw-sr +zb-gh +oa-cn +ps-wb +bb-er +qb-bu +kv-fu +iq-go +qh-ti +mh-cb +uy-ei +ti-xv +cj-ef +na-er +xw-on +rj-oi +bq-mp +dz-iq +as-rm +ta-fw +eh-cg +is-gz +lm-in +vm-wo +iu-wm +ej-wj +qq-jj +ts-ry +bz-aj +ww-mu +bi-ir +yb-ei +ju-up +pz-gr +ua-fq +zv-zc +js-dp +mf-yn +rn-bp +ls-fl +op-ue +td-zu +rl-qu +oy-ca +lw-hn +yx-sv +mi-jd +mp-li +cf-qv +rm-xq +pk-jd +mi-gz +wv-ea +ku-nl +bp-fv +rp-ja +ix-dx +yx-lc +lw-tg +aw-jy +ih-gr +px-zf +eq-hj +ku-we +th-zy +dy-lm +hh-xc +uq-gh +pu-xt +zc-xj +xc-zn +zn-si +pk-bm +xh-iy +fx-lw +fa-hn +jf-dt +gp-yt +nw-nz +rr-dy +ue-lh +cs-mm +is-pk +lz-iw +mu-bs +qj-hj +bc-qn +gh-wx +yy-nx +ya-qo +jl-sd +ns-ug +qv-ts +zn-wy +jw-xl +ev-om +fw-kz +or-on +xs-ak +ce-dy +no-js +by-ri +nf-tu +qh-fi +qj-vq +om-ck +dq-zy +dr-cb +pa-th +ma-ju +hx-bl +wt-qc +un-xp +ek-sl +po-xd +hl-fc +iy-xy +gw-eq +of-ej +re-ip +ma-al +wt-af +pa-pk +fj-sq +lc-ev +og-jy +ot-yu +ww-bs +iz-dt +df-uk +ne-qo +sh-dr +rg-il +wn-bc +fq-yb +xh-xy +rd-bv +pw-ww +qk-nk +mo-tr +um-ss +pm-xj +de-vv +ye-ei +ra-fu +rc-rk +kv-ij +rc-cw +re-sr +si-np +uk-bk +pq-sa +uq-ww +iz-jf +wu-nh +uv-cx +gb-pu +if-qk +fp-gp +we-on +cu-by +on-rk +ph-ak +uh-gm +ty-ls +nt-rj +ez-fm +oe-ok +sl-vi +kf-oz +lw-xy +al-ir +ds-yo +jw-ly +wt-xv +fk-jy +dd-uf +iu-di +vp-sh +ce-rd +ei-ua +fj-nu +dh-gq +wf-mp +in-ng +pe-kg +se-yc +nw-yi +qe-nx +de-up +uv-dj +qq-gb +cs-gs +fq-kk +kb-zo +mx-qy +sn-yn +jx-sh +vb-xc +tk-pm +tn-mf +wm-dm +fo-ss +uy-ua +oo-wq +em-do +pu-xh +fr-jg +bm-is +ej-cx +lf-wg +ua-yb +cg-la +xs-xp +yj-yh +fg-vy +ys-xp +zy-pk +qv-ry +hw-an +di-nd +tt-sx +gc-he +si-iv +im-ub +fl-cd +gl-us +kk-ei +mp-fi +fh-yt +tl-ea +fn-on +ba-vt +lq-yg +bv-lm +yg-ee +tj-tn +ji-jj +ow-kb +wd-mg +hi-fk +ey-zf +fb-us +hf-ug +kb-pf +lr-hm +lz-kv +vi-vm +gq-hz +tx-jk +ig-pm +sf-ji +gg-ua +jk-xr +ia-sn +bs-ee +cd-ty +ai-hf +ah-nf +ez-if +fm-kw +bb-na +zp-tp +qu-wi +db-ir +bc-px +by-vh +hr-uy +dd-nf +fi-ym +dl-th +un-ak +xv-yo +fb-lh +tq-vq +cu-kp +td-qc +fy-ic +jd-xn +wj-ui +lr-bk +yt-vo +gh-sr +xy-du +ym-yr +ta-rl +se-bq +fn-oh +ui-ge +gn-iu +uy-ar +nz-fm +dz-cl +qt-wi +kg-sx +le-me +dr-jx +eh-sb +gj-ls +py-bq +qy-rr +kc-jy +hn-xh +db-ju +su-qs +jw-ez +jj-gi +zx-de +tx-rv +zo-jt +au-tt +kk-uy +mp-se +fo-cj +ah-dd +lc-ry +jz-vd +fh-lc +la-as +an-rj +gp-ub +ob-ib +wv-pm +oe-sf +dd-wd +bl-lo +cf-sn +kr-yd +ih-ta +sb-dr +ze-gb +rx-ue +ku-pc +hn-xt +gs-tn +kd-dp +zh-tn +rj-hf +op-lh +me-wq +fm-gr +cp-kt +cs-fv +kc-og +ho-fu +ug-an +ca-sf +yx-ev +mg-tu +lc-qv +av-zp +pk-th +om-tr +km-ou +wz-eg +wt-ie +kz-up +aj-wf +zo-pf +cm-ug +sl-qz +mm-rf +qi-ur +bb-rm +qw-pq +wi-gr +la-io +dx-mf +lf-jp +gi-fz +dv-lo +ki-xt +cs-fo +tp-kq +vd-ro +bd-mi +gq-mq +lc-pb +wu-uz +zb-zp +mv-na +av-bs +lq-sx +vp-cb +td-ie +gh-dc +xm-op +yr-du +hp-pj +ca-gi +fh-te +qi-ck +ot-tb +wi-nd +gm-wt +ow-nj +yt-sp +kk-ir +ro-jz +ev-ts +or-xk +cn-yd +pa-bm +wo-vi +vs-tf +jc-lh +vg-mw +wp-jw +wj-oh +ar-hr +fr-en +ie-af +bb-xm +nv-gg +ly-nz +py-cf +cu-ad +po-wm +bd-is +im-gu +gh-av +fy-xz +dy-bf +qz-xh +hk-xk +tf-pd +zp-hr +nr-tk +av-tp +fn-rk +cd-zt +jl-ri +ia-li +zn-oc +pu-st +kx-rk +ga-rx +xt-gc +ad-wn +st-xy +rm-js +hw-nt +qv-sv +et-xs +wo-tc +ch-np +sz-jx +zc-gl +zo-pq +um-fv +fh-qv +zx-fw +hd-zh +av-pw +ak-pc +fi-he +mk-sz +ij-cd +di-jn +nv-jt +fb-er +lc-te +wq-yy +ld-gq +ps-sl +vg-rl +xn-dq +dk-et +ju-al +yr-ns +ld-oo +cx-im +kv-ty +cq-ch +la-rm +fb-ue +hn-xy +mg-gq +la-lx +ms-td +fy-vt +aa-pz +ip-lk +wz-vq +st-lw +lr-ej +pn-of +xl-nw +wb-nt +cj-mm +cy-qn +jf-gx +sl-yh +bb-jc +du-oi +lz-gj +fc-zj +sz-xr +mk-jk +ey-cx +bv-st +ub-hz +sz-tg +lt-po +bl-tq +mi-xn +fk-lk +as-dp +zo-up +xc-cq +ry-sp +uy-ye +gu-dj +zt-lz +kp-yc +la-xq +kg-km +yu-hd +jn-et +fp-dj +ta-aa +tl-md +lg-ir +ya-ot +iu-ox +wq-ve +ee-au +sc-ng +vm-rz +yn-hd +dr-kj +ib-mb +qn-ri +wt-pb +lm-md +dv-ao +sr-kc +zu-qc +ds-jl +km-au +xf-gi +pj-sr +sy-ui +ur-mz +pw-mu +bd-dq +bz-cf +ok-ji diff --git a/23/main.go b/23/main.go new file mode 100644 index 0000000..1ceebbd --- /dev/null +++ b/23/main.go @@ -0,0 +1,139 @@ +package main + +import ( + "flag" + "fmt" + "maps" + "os" + "sort" + "strings" + "time" +) + +func catch(err error) { + if err != nil { + panic(err) + } +} + +func main() { + flag.Parse() + if flag.NArg() != 1 { + fmt.Println("Usage: go run . input.txt") + os.Exit(1) + } + + bs, err := os.ReadFile(flag.Arg(0)) + catch(err) + + parsed := parseInput(string(bs)) + part1(parsed) + part2(parsed) +} + +type Parsed map[string]map[string]bool + +func parseInput(input string) Parsed { + lines := strings.Split(input, "\n") + if len(lines[len(lines)-1]) == 0 { + lines = lines[:len(lines)-1] + } + parsed := make(Parsed) + for _, line := range lines { + parts := strings.Split(line, "-") + if parsed[parts[0]] == nil { + parsed[parts[0]] = make(map[string]bool) + } + if parsed[parts[1]] == nil { + parsed[parts[1]] = make(map[string]bool) + } + parsed[parts[0]][parts[1]] = true + parsed[parts[1]][parts[0]] = true + } + return parsed +} + +type Triplet [3]string + +func part1(parsed Parsed) { + timeStart := time.Now() + // find triplets, where each computes is connected to the other two + + triplets := make(map[Triplet]bool) + for c1, cs := range parsed { + for c2 := range cs { + for c3 := range parsed[c2] { + if c3 == c1 { + continue + } + if !parsed[c3][c1] { + continue + } + t := Triplet{c1, c2, c3} + + if c1[0] == 't' || c2[0] == 't' || c3[0] == 't' { + sort.Strings(t[:]) + triplets[t] = true + } + } + } + } + + fmt.Printf("Part 1: %d\t\tin %v\n", len(triplets), time.Since(timeStart)) +} + +type Party map[string]bool + +func dfs(connected Parsed, c string, visited Party) Party { + visited[c] = true + + var largestParty Party +NextC2: + for c2 := range connected[c] { + if visited[c2] { + continue + } + // check c2 is connected to all visited + for prev := range visited { + // Problem: if prev c is not deleted from visited, it will be in this loop + // and we will check connections to unnecessary node. Yet it gives correct answer. + // (╯°□°)╯︵ ┻━┻ + // I'll commit this for now, but I'll be back. + if !connected[c2][prev] { + continue NextC2 + } + } + // it is connected to all visited, so we can add it to the party + party := dfs(connected, c2, visited) + if len(party) > len(largestParty) { + largestParty = party + } + } + // no more connected, so the current one is the largest party + if len(largestParty) == 0 { + largestParty = maps.Clone(visited) + } + // visited[c] = false // why does this work????? it leaves c in the map, just with false value + // delete(visited, c) // and this goes into loops... wtf? + // special input fuckery? (╯°□°)╯︵ ┻━┻ + return largestParty +} + +// does it need memo? :) +func part2(parsed Parsed) { + timeStart := time.Now() + + var largestParty Party + for c1 := range parsed { + party := dfs(parsed, c1, make(Party)) + if len(party) > len(largestParty) { + largestParty = party + } + } + sorted := make([]string, 0, len(largestParty)) + for c := range largestParty { + sorted = append(sorted, c) + } + sort.Strings(sorted) + fmt.Printf("Part 2: %d, %v\t\tin %v\n", len(largestParty), strings.Join(sorted, ","), time.Since(timeStart)) +} diff --git a/23/sample.txt b/23/sample.txt new file mode 100644 index 0000000..3d49766 --- /dev/null +++ b/23/sample.txt @@ -0,0 +1,32 @@ +kh-tc +qp-kh +de-cg +ka-co +yn-aq +qp-ub +cg-tb +vc-aq +tb-ka +wh-tc +yn-cg +kh-ub +ta-co +de-co +tc-td +tb-wq +wh-td +ta-ka +td-qp +aq-cg +wq-ub +ub-vc +de-ta +wq-aq +wq-vc +wh-yn +ka-de +kh-ta +co-tc +wh-qp +tb-vc +td-yn diff --git a/23/task.txt b/23/task.txt new file mode 100644 index 0000000..3b0eb2b --- /dev/null +++ b/23/task.txt @@ -0,0 +1,83 @@ +--- Day 23: LAN Party --- +As The Historians wander around a secure area at Easter Bunny HQ, you come across posters for a LAN party scheduled for today! Maybe you can find it; you connect to a nearby datalink port and download a map of the local network (your puzzle input). + +The network map provides a list of every connection between two computers. For example: + +kh-tc +qp-kh +de-cg +ka-co +yn-aq +qp-ub +cg-tb +vc-aq +tb-ka +wh-tc +yn-cg +kh-ub +ta-co +de-co +tc-td +tb-wq +wh-td +ta-ka +td-qp +aq-cg +wq-ub +ub-vc +de-ta +wq-aq +wq-vc +wh-yn +ka-de +kh-ta +co-tc +wh-qp +tb-vc +td-yn +Each line of text in the network map represents a single connection; the line kh-tc represents a connection between the computer named kh and the computer named tc. Connections aren't directional; tc-kh would mean exactly the same thing. + +LAN parties typically involve multiplayer games, so maybe you can locate it by finding groups of connected computers. Start by looking for sets of three computers where each computer in the set is connected to the other two computers. + +In this example, there are 12 such sets of three inter-connected computers: + +aq,cg,yn +aq,vc,wq +co,de,ka +co,de,ta +co,ka,ta +de,ka,ta +kh,qp,ub +qp,td,wh +tb,vc,wq +tc,td,wh +td,wh,yn +ub,vc,wq +If the Chief Historian is here, and he's at the LAN party, it would be best to know that right away. You're pretty sure his computer's name starts with t, so consider only sets of three computers where at least one computer's name starts with t. That narrows the list down to 7 sets of three inter-connected computers: + +co,de,ta +co,ka,ta +de,ka,ta +qp,td,wh +tb,vc,wq +tc,td,wh +td,wh,yn +Find all the sets of three inter-connected computers. How many contain at least one computer with a name that starts with t? + +--- Part Two --- +There are still way too many results to go through them all. You'll have to find the LAN party another way and go there yourself. + +Since it doesn't seem like any employees are around, you figure they must all be at the LAN party. If that's true, the LAN party will be the largest set of computers that are all connected to each other. That is, for each computer at the LAN party, that computer will have a connection to every other computer at the LAN party. + +In the above example, the largest set of computers that are all connected to each other is made up of co, de, ka, and ta. Each computer in this set has a connection to every other computer in the set: + +ka-co +ta-co +de-co +ta-ka +de-ta +ka-de +The LAN party posters say that the password to get into the LAN party is the name of every computer at the LAN party, sorted alphabetically, then joined together with commas. (The people running the LAN party are clearly a bunch of nerds.) In this example, the password would be co,de,ka,ta. + +What is the password to get into the LAN party? +