Day 7, eventually
authorNeil Smith <neil.git@njae.me.uk>
Sat, 9 Dec 2017 17:18:46 +0000 (17:18 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Sat, 9 Dec 2017 17:18:46 +0000 (17:18 +0000)
advent-of-code.cabal
data/advent07.txt [new file with mode: 0644]
src/advent07/advent07-Copy1.ipynb [new file with mode: 0644]
src/advent07/advent07.hs [new file with mode: 0644]
src/advent07/advent07.ipynb [new file with mode: 0644]

index 341fc23f6c43cd868ec3a95fb76ccb67203e5557..48a78d4d06dade3cfffc4686a1c07ae0d0b61bda 100644 (file)
@@ -70,3 +70,12 @@ executable advent06
                      , containers
                      , vector
                      
+executable advent07
+  hs-source-dirs:      src/advent07
+  main-is:             advent07.hs
+  default-language:    Haskell2010
+  build-depends:       base >= 4.7 && < 5
+                     , containers
+                     , parsec
+                     , parsec-numbers
+                     
diff --git a/data/advent07.txt b/data/advent07.txt
new file mode 100644 (file)
index 0000000..9470a19
--- /dev/null
@@ -0,0 +1,1238 @@
+dihjv (2158) -> gausx, ncdmp, hozgrub
+qhvca (428) -> odttvb, ymehff, ymyzbqc, jtdtmsi, wciuyuh
+kuvqhnm (77)
+eauol (56)
+nwtkz (304) -> eykks, rxivjye
+kmyvaog (440) -> jrvona, cdoyc, vgbwb, lbttqhl, qizznfs, bftdz, xqhvz
+dcqofo (74)
+qnhthgm (63)
+fgkok (189) -> vjgjzbc, vjfllmr, drbqty
+tvfwp (74)
+jtwqgg (28)
+igogak (57)
+edaidjk (60)
+jxhqld (75)
+jbhxihl (79)
+fbrdpr (28)
+yjtudlp (60)
+wgbdxsx (98)
+ecpuvq (84)
+emzlv (5)
+isahru (26)
+oamyk (69)
+xxxcdbv (29)
+rogwn (357)
+jpovtel (31)
+gkvko (24)
+aqlfh (87)
+cbvzgp (24) -> weotr, pgofcu, czswzal
+vaqxfkm (43)
+fwraw (64)
+rqtlp (13) -> tmoib, pidha, yaqiuq, zprfu, ssjau, duhaz, qzaecfk
+qisdg (15)
+oryhdxc (12)
+lywem (78)
+ulrqrc (38)
+sszuwps (86)
+qanswmb (89)
+keubv (101) -> yhfkwn, toqhzbx, rokeyia, vpspcd
+lkpdlq (36)
+ddvbfi (75)
+nsfjyfr (79) -> pavvcsj, thidj, yvjkb, udkcxo, zehou
+yorihlo (5983) -> eihhef, iayesbs, nduld, darnez
+xfkhu (208) -> izjecb, edqurgi
+onnmq (24)
+zmbxthx (2453) -> tfjhcnn, uifjku, kgtcv
+turomx (35)
+pgofcu (82)
+yveziks (55)
+cbmcpho (20)
+cosmq (70)
+xvnqny (3179) -> dpmqmbp, pddgbo, mszglrh
+juqsjg (47)
+zfhup (56)
+agvvr (45)
+pkdqgo (84)
+yupciox (47)
+wplhnmi (689) -> qnmiv, esemf, qiftt
+qujsvg (58)
+bdnqwvw (10384) -> mqyvpvw, kfaib, rpgxh, kjudskk, gknpczm, mtukvee, xwbzev
+lfjwzpr (80)
+rpdiks (56)
+kveyw (87)
+eiwvcil (276) -> kmquncz, bsqltzs
+lflpbjx (28)
+nnoiyn (218) -> qthns, nhpvo
+togvh (177) -> qcsal, totymbv, wdrdfsy
+fmpkks (88) -> kbseli, tukvj, hygejev
+hoocyf (77)
+bbhffib (11) -> orrno, uaeuig, yjicxmr, yhmqg
+bjaferd (58)
+pjsevmq (112) -> sxnfkj, jyaztbk
+zsksm (26) -> nghpciz, pboxau, nykhzm, edteba, bbhffib
+mngpa (189) -> wevea, cjkpmpb
+clqlpi (96) -> jgvmp, ikfnuu, dqfeapy
+uppsb (10)
+thafg (61)
+dgmbzo (157) -> sjitmwi, krmoek
+xtcoefd (13)
+vnlbdhq (75)
+rfowcu (46)
+znpcapb (13)
+gnrgy (839) -> zuqew, prnpyu, payeaey, mxiqn, qmkod, rgovzj
+glmvo (1473) -> slilxt, fikmr
+kiwzzsi (26)
+lqrleq (114) -> xljwrd, lrymzqx, kszzcjg, ajxjsi
+xdvxnd (82) -> alxuwj, ynfamq, oymcuyi, iesan, urqvtwz
+oyort (96)
+nmzkhig (11) -> jponcak, vyyvfme, amzzkz
+cwgspa (10)
+fahjx (47)
+hckss (31)
+eflhrzc (210) -> jnswdp, hrhky
+gzgmcg (53)
+ctvqg (32)
+hmaslr (146) -> bvyiw, qeeyslp
+xsxpz (46)
+ztdib (46)
+xhsokp (60)
+gtadjbm (86)
+qrrzkla (54)
+zsmex (16)
+wmiuyq (55)
+mqovh (297)
+tfejm (26)
+hozgrub (96)
+plgyftr (130) -> daomuol, lynvr
+fjbxbui (57)
+rnxpn (84)
+jrrcr (22)
+dxujggm (73)
+gnows (81)
+ilziw (54)
+drbqty (15)
+bgfjxde (292) -> cwgspa, uppsb
+omcvezl (74)
+cejrzz (88)
+zbrant (83)
+rxnyoaf (59)
+vbobjo (98)
+ofydl (110) -> ssmijv, uxytt
+uwweklj (20)
+iodjrt (60)
+wdaxi (67) -> jxhqld, xxtds, udeyv
+jivcmug (241)
+rgovzj (147) -> cdmqq, iwvgsqj
+gsspm (506) -> wakslhh, wjjov, fwjvl
+cssxuh (85)
+bdbhdz (22)
+kjsimg (45)
+mfaiso (99)
+pzgihig (152) -> lggutbs, qrrzkla
+xzrts (87)
+alxuwj (241) -> sguelmy, wwibd
+socdh (28)
+tnezwo (65)
+tonetb (74)
+budlgt (226) -> edmdyyf, oulbft
+wgkylta (318) -> tozgnf, nybvxpl
+sddte (99) -> ywgsoss, pjgpn, unzqb
+ijlnjse (45)
+knkect (83)
+nftvm (40) -> hepgwl, xsnvuhk, awuntf
+nhpvo (56)
+khfehu (76)
+slnoou (74)
+qkmsfo (220)
+wciuyuh (184) -> waand, zutluof
+prnpyu (29) -> pkdqgo, gprqd
+illog (99)
+pxijfx (35)
+alcjel (83)
+owjae (264) -> jxawhq, mgxmj
+xsjmrv (178) -> husfjac, zsmex
+kgjnta (24)
+bfmatc (6)
+whnmg (1178) -> fajwz, fjbxbui
+ulsjdhh (44)
+todve (10)
+mgomqm (35)
+okvspp (63)
+kgtcv (41) -> mhbvu, wycrhq
+vzyknp (26)
+agmrdd (49)
+ilqgy (57)
+lhomu (99)
+ixknb (57)
+gffatn (656) -> rogwn, ralyx, xhnem
+rbgidcj (1416) -> bgczgya, xgbxcgw, shzcz, qonlajs, naxbp
+ikamn (24)
+qzaecfk (253) -> ctvqg, yunmx
+gknpczm (155) -> eiukshg, bomwsw, zsuhred
+kulazu (78)
+jgvmp (78)
+wxhex (24)
+tvdihgf (85)
+xwbzev (254)
+ankqb (83)
+zehou (270)
+yehoudc (237) -> tdvdbhx, rlzldzq, cchwxl
+gvktxip (74)
+kwbbdg (9)
+fnuem (788) -> sgxaa, wkqbmut, wkqtgn
+xljwrd (20)
+xsnvuhk (90) -> ibjay, tonetb, uowuztv, hdvwu
+pidha (77) -> iodjrt, wltkgyg, nipcsis, yjtudlp
+gausx (96)
+cbtfaaq (140) -> ochqzjy, oogoc
+onurc (93)
+oahfm (823) -> gxzkef, zujfczp, tmakc
+jujcekp (87)
+ochqzjy (32)
+wvihi (36) -> rhdngzm, udeckgc, aooskui
+eosnpun (42)
+vnivx (24)
+iziyeah (53)
+wrrjvv (138) -> kktnr, nduasyx
+rncwlve (45)
+ohvsnc (16)
+kuwksy (81)
+epmklw (24)
+bnhmicm (49)
+kamhkoi (154) -> bndye, wjxgvh
+sqvgekz (156) -> ogelzn, smueqkc
+fikmr (87)
+nipcsis (60)
+fevoc (49)
+itihxls (53)
+hygejev (63)
+xuwzr (289)
+zzbpjiq (80)
+aakqco (77)
+mhtrp (80)
+ftwjsi (5)
+slilxt (87)
+bgqxrj (98)
+gpaljor (160) -> kuzskeg, qloih
+vmrfkpj (97)
+extedk (63)
+wlswfp (38)
+fphae (82) -> yhjmn, ylkotm, zmfcp
+jlxseu (12)
+waaszgs (95)
+cdoyc (208) -> ikamn, ywfwlug
+xqlcwdq (82)
+iqsxq (61)
+iegfxt (84)
+lnbkylg (58)
+qcsal (55)
+onyvo (98)
+hrfldlv (61)
+pqccx (49)
+zkpvqfo (24)
+svpplpy (364) -> znpcapb, ervfo
+ksbkavj (145) -> cypwd, rxnlgc
+ucuojn (95)
+fmszt (23)
+sqoqld (5)
+ymtwg (89) -> oqhdqg, qwfzkh, qrbhvs, phkvd, ytkgrpj, ylfkshq, drwjl
+nxwsaq (59)
+skcbz (98)
+ygnrm (40)
+asfjop (15)
+doqmfx (152) -> ahsdq, gnows
+jfrda (3994) -> lnpuarm, oahfm, nsfjyfr
+kssoys (63)
+syqthpz (70) -> zyfrk, nhlvwm, lfjwzpr, zzbpjiq
+pxbyvn (98)
+goulcd (164) -> wdngppj, vmrfkpj
+keeet (281) -> wdpyn, hqyej
+pscda (342)
+edqurgi (91)
+phkvd (37) -> vmbhr, zppzac, euaulyx, cabffwx
+cpvefk (15)
+jyyeena (51)
+naxbp (17) -> ofgvb, ytvmvhy
+cabffwx (71)
+pvnch (61)
+omvoojd (20)
+edteba (305) -> qjdbq, yupciox
+gkmrz (29)
+qwfzkh (321)
+eatpn (88)
+ptfev (215) -> iemffhw, snzqh
+kuzskeg (30)
+acvbzia (390)
+zbuqlk (52)
+icbztci (67)
+awebzjn (46)
+hxwrnx (7)
+yvjkb (9) -> pttqho, jujcekp, sabsqv
+qdrqm (182) -> cssxuh, lpfrtfw
+pynygd (99)
+tthcan (67)
+vzlomr (127) -> rztel, fscztrk
+hljxim (70)
+wputsbp (91) -> zdrfc, iqsxq
+qsqxc (69)
+jzztae (158) -> wqrxb, yjqyh
+qloih (30)
+nsmsgmk (93)
+awuntf (276) -> kunyye, yveziks
+ibjay (74)
+ssszfaj (24)
+wildi (97)
+kunyye (55)
+hvporje (17) -> xfuimef, pscda, pklufv, vejgx, togvh
+ekcfvm (58)
+wkqtgn (96) -> brqztvl, rbjzgxt, jciigs
+dqfeapy (78)
+gsjkku (24)
+uxytt (92)
+qnrlrm (57)
+gvtcjha (98)
+kygnpb (75)
+yjqyh (78)
+pixawh (64)
+xwwdp (53)
+yjijem (124) -> jyyeena, frpagb
+uihqn (52)
+hdvwu (74)
+sijptix (87) -> ojatorf, wxlxyq, lkfttr, xfesea, ytatg, keeet, ghycpf
+nzylp (26)
+zcoqx (164) -> xxykvzq, slnoou
+vlrgx (88) -> bmntp, eatpn, yvoyt
+hqwqd (97)
+ybsouxh (24)
+wurmarr (46)
+bmejz (97)
+rfmtzl (9)
+lclhy (36)
+qyharq (92)
+ixtmdxo (24)
+nlrtoa (57)
+bnqinhv (440) -> hgwpks, wputsbp, mngpa, dasoy
+gndaa (12)
+syzkg (1697) -> qzdatks, buekex
+wevea (12)
+bcefufj (22)
+larhlj (152) -> tidour, qfxuh
+npvrbd (896) -> fmpkks, vpmnutl, uvsgv
+pjgpn (65)
+mzjypeq (90) -> ihhmv, jckrdlz, kylpt
+lfkfd (97)
+wysgri (142) -> gnutx, vbqxz
+zqhans (87)
+lqsdtq (43)
+zutluof (6)
+wqxbp (34139) -> bdnqwvw, bdlqru, ysgrizu
+mrdoeb (87)
+xuprtp (93)
+vgbwb (130) -> wesqml, ssinas
+zoibb (46) -> ctosb, pskrkrn
+qmoxv (42)
+bdfns (29)
+qqokzne (954) -> jscxo, fhcrsce, jscvn, amheqov, wvihi, wsxkjcu
+mxiqn (107) -> kjsimg, agvvr
+klyfish (1069) -> xxeoneh, kibotum, hmaslr, zuywf
+lzjvenf (21) -> tjfib, jgjgxgb, ibyqrv
+yeomv (42)
+qdyjn (78)
+kdvzyz (6)
+ncdmp (96)
+hdkeesr (56)
+dcbquim (48)
+ksjmqsc (529) -> oakpkr, ndsbbnm, fphae, extnd
+sczsl (64)
+akvfgdi (57)
+njldiph (83)
+dasoy (155) -> qppyecj, gkmrz
+jlhdq (52)
+ltwrzdl (16)
+fenxwbi (42)
+vhnpij (78)
+frpagb (51)
+hqxulc (5)
+tretx (11)
+jorvuw (83)
+vwyrjd (31)
+zpanms (59)
+qjdbq (47)
+qagqi (83) -> xqlcwdq, ezbdihm
+nydgtu (73)
+bndye (39)
+wlnpbx (83)
+vbqxz (85)
+levsigy (43)
+cdmqq (25)
+ekrwiea (91)
+rxnlgc (14)
+mtflqcm (68)
+kylpt (72)
+arwyg (238) -> ngsgolg, qephec
+gprqd (84)
+qawlwzi (45782) -> jfrda, jwebvqn, ujwqlf
+qjqqkjo (300) -> vwyrjd, ocddu
+azjdyr (89)
+xjgoko (622) -> larhlj, lrvaz, memnafg
+thidj (116) -> xzllgwq, vcfxh
+sguelmy (36)
+tjfib (59)
+rdnxsro (84)
+sdvzbk (262) -> atvztnt, zkpvqfo, gavzpv, rjmjlq
+ssvcrjn (26)
+rilzcsz (186) -> epmklw, sczuqy
+hkosdxh (79)
+iodtwit (30)
+lvlux (92)
+udkcxo (84) -> xuprtp, simsfkz
+acatw (69) -> tlpzsi, hakss, naiivve, pphbkn
+tflqwyl (51)
+zjlckg (9455) -> jvjdgph, sijptix, zmbxthx
+adqqjrz (81) -> ebjind, odhurs
+yceabkj (46)
+tomfuoi (6)
+vejgx (272) -> lzvpll, pxijfx
+qmpazxn (37)
+pskrkrn (90)
+eigivg (43)
+cvioak (68) -> qnhthgm, wboesxc
+dwfxj (76)
+kjudskk (206) -> vostn, ixtmdxo
+xltuf (66)
+rnjyw (55)
+uowuztv (74)
+zkmhy (220) -> rnjyw, tbswgx
+cfxrv (83)
+hrbse (124) -> lnwyra, xuzfgha
+urqvtwz (81) -> qcayjn, lnbkylg, yfrcx, bjaferd
+lzvpll (35)
+dngizd (81)
+sjitmwi (55)
+tqruh (31)
+tukvj (63)
+mvncpt (21)
+hzfarz (51)
+ujqoks (20)
+wezrgqw (210)
+hopsivz (387) -> tufywu, zhmevu
+cacfqur (9)
+udeckgc (59)
+lkimdg (10)
+nulkw (61)
+porcbbb (227) -> midrlp, cacfqur
+lmjpuv (296) -> kxaxt, fahjx
+wimpns (22)
+oymcuyi (280) -> tretx, njarebf, svezft
+qfxuh (20)
+fxjkoqn (202) -> fwraw, pixawh
+vcfxh (77)
+jtdtmsi (90) -> gzgmcg, nrkdwvs
+vkuusw (92)
+apjkf (22)
+ovdogi (165) -> shepkcs, npxgl, wxyrdp
+ewbuve (88)
+dqxfl (90)
+xnmtop (83) -> ckugbl, yeomv, fyktlox
+piewts (22)
+gcvxpm (64) -> kveyw, kchjfpg, mrdoeb
+tufywu (32)
+xfesea (243) -> tthcan, wljomq
+ysyfwqs (211)
+ozdrm (76) -> lclhy, zggsrug, zvhtk, lkpdlq
+oqhdqg (201) -> dunqe, fqhdf, ygnrm
+gmmxg (29)
+rokeyia (27)
+gavzpv (24)
+mifxlz (171) -> didfetj, rncwlve
+cqjoftq (63)
+fhcrsce (213)
+ssjau (253) -> askmldt, kojat
+wdsunq (58)
+tcqkzp (208) -> udzokmu, lzlvrqk
+eimcci (43)
+xwxof (55)
+spprj (68) -> jorvuw, cfxrv
+ivkvrj (81)
+xbabgu (155) -> lypml, zxvhoy
+osnyi (50)
+cdynw (89)
+ldswpyl (30) -> jkjnsj, lpxekhm
+rdbcued (24)
+zunuwi (208) -> iziyeah, wdafwyi
+pzjiiy (20)
+xqhvz (192) -> liearc, ohvsnc, ltwrzdl, ypyuum
+vtzay (74) -> vonbixj, qawlwzi, wqxbp, tcsrpxb, xlieqz, yghqsa, asexwc
+ralyx (357)
+rlpvqn (9)
+yjngab (1573) -> yiigm, kntzn, rilzcsz, eqoick
+vtnex (28)
+ctosb (90)
+zmicnlj (76)
+hbcjzma (149) -> bbmvgyu, rxnyoaf
+lmekort (6)
+jkjnsj (87)
+pyjymxj (59)
+pjczjl (20)
+wxmwf (29)
+othvtfq (49)
+atvztnt (24)
+ehzatio (57)
+ekdczsz (63)
+njarebf (11)
+qsjhc (59)
+ridrtgx (9)
+kamrqhv (57)
+wgjbas (15)
+ldtbli (78)
+cniapi (15)
+ulssbyo (62)
+ashohg (12)
+mtkliz (96) -> bxkicdp, pmlzll, ycqghs
+extnd (178) -> piewts, rpiyqq, bdbhdz
+wvdnc (77)
+iyalpvz (13) -> uohcpp, xcyfp, ypbgol
+smkeec (87)
+ezbdihm (82)
+amheqov (177) -> isnebf, rlpvqn, bllths, rfmtzl
+bmqggm (108) -> hkamx, extedk
+ajnnoo (99) -> ywpmdg, drsvx
+wgwucvi (26)
+xbwbjfa (46)
+omlxdye (56) -> tdstj, gnktgh
+esbswlu (246) -> kuvqhnm, aakqco
+wljomq (67)
+yowef (55) -> umhji, ucpgr, dpimy, nwxad
+qzdatks (15)
+ncuksjv (84) -> plcqel, mtflqcm
+mrssfl (26)
+uqjnlv (122) -> rqtgag, awebzjn, wurmarr, osbdc
+xxykvzq (74)
+ynfamq (187) -> fenxwbi, eosnpun, kybtr
+jscxo (99) -> dathq, ixknb
+ohpeic (695) -> cbvzgp, mjrxbh, aaibd
+bnuozu (107) -> rstvy, kovebn, zwsjm
+kxaxt (47)
+rztel (62)
+xubkl (102) -> bhzgqav, wftxaby
+owsebz (26)
+glqezpx (245) -> omvoojd, pzjiiy, oiuppwr
+ssmijv (92)
+mgdjgzf (573) -> fnsxlna, qjqqkjo, pgfhmr, tvtxqpd
+rnzzm (246) -> uwweklj, ujqoks, cbmcpho
+npxgl (13)
+lzlvrqk (42)
+xgbxcgw (97) -> ashohg, gndaa
+ibffwi (21) -> zfxdqi, yxqmz, dvnvwgj, xnhlg
+wzmrtpw (40)
+lcggft (139) -> qzuyecq, sslulx
+vlwmaxi (46)
+fnsxlna (110) -> cqjoftq, kssoys, fwyreea, wkgzwhi
+zlwnppb (491) -> uqjnlv, huidcr, rnzzm, mzjypeq, inycp
+jyaztbk (61)
+ipljy (79)
+wdpyn (48)
+pgfhmr (50) -> kulazu, lgmdhjw, qdyjn, lywem
+vjgjzbc (15)
+egtscru (9)
+plcqel (68)
+wbsul (175) -> ynqji, qcbubp
+fajwz (57)
+bftdz (24) -> fdpjo, ekcfvm, qujsvg, wdsunq
+wkhsng (24)
+nhrka (23)
+njkscdv (10)
+vihoep (161) -> qolkd, itihxls
+wesqml (63)
+xgsbu (19)
+iayesbs (2129) -> zhzwir, zoibb, kyvysg
+noutnp (202) -> kdvzyz, tomfuoi, bfmatc, lmekort
+whnnb (66) -> yceabkj, vlwmaxi, xsxpz
+ucpgr (38)
+qzuyecq (34)
+nwxad (38)
+ljmkw (53) -> imdmnn, hkosdxh
+vakhjoj (1289) -> reflh, himyfxm, hrbse
+mwzhn (75)
+otzqal (667) -> qagqi, vpdlxtj, fiilaqx
+kktnr (30)
+tmoib (303) -> hxwrnx, ukbfn
+bkuqfi (8) -> gvtcjha, pxbyvn, miwvcdi, wgbdxsx
+ifroqmy (4870) -> ksjmqsc, ohpeic, djomjuh
+ghycpf (199) -> azjdyr, qanswmb
+fecze (694) -> jzztae, doqmfx, givqy, zfrgif, budlgt, zunuwi
+derxp (22)
+siyudl (46)
+eqcpltg (79)
+sslulx (34)
+ibvmb (49) -> njldiph, zerai, ankqb
+lbnjp (122) -> ojcaeht, sszuwps
+vwzfjcq (241)
+ytatg (116) -> mldtcbl, jgsgm, aqlfh
+tdvdbhx (19)
+bomwsw (33)
+aonteu (15)
+ndsbbnm (76) -> mxdij, nmqoxw, eauol
+rpgxh (140) -> eetdzon, igogak
+ynqji (40)
+obhlzp (56)
+jscvn (169) -> twdnswr, bcefufj
+empkyy (61)
+peopfnu (17) -> etyhx, rpfhcus, yvyttr
+wycrhq (25)
+isnebf (9)
+naiivve (43)
+cchwxl (19)
+swtbqxz (266)
+hbcto (51)
+husfjac (16)
+uohcpp (63)
+yozose (88)
+ylfkshq (193) -> sczsl, ibdyuge
+ergcql (46)
+ebjind (65)
+tohprmh (2242) -> tflqwyl, mdjhnv, tamautu, qxxkyr
+bqbmy (49)
+urbqmk (52)
+zdrfc (61)
+wwibd (36)
+lawgz (35)
+lkfttr (320) -> luzwzm, mqebpw, eodubb
+ezxlkm (37)
+eihhef (1752) -> adqqjrz, ysyfwqs, ljmkw, synynkd, imrqsxa
+nduld (1449) -> lgkhn, cikijr, ijmrhsf, cvioak, lqrleq, ifncxs, bnuozu
+cdsjzoz (1888) -> yowef, wdsari, lcggft
+djxpma (93)
+rstvy (29)
+yvyttr (1210) -> qslmjtg, wrmovs, ibvmb, xmfrzwa
+vnhsudk (60)
+qrshe (43)
+flovshu (15)
+bwgjpdg (97)
+bgczgya (107) -> cvgdzag, qdextxi
+zfrgif (168) -> dxujggm, nydgtu
+vpdlxtj (151) -> wxhex, gsjkku, wkhsng, ssszfaj
+kwztfbl (88)
+nduasyx (30)
+jnswdp (60)
+rbjzgxt (24)
+cvgdzag (7)
+cbxomli (91)
+qmkod (57) -> hlauw, mgomqm, pmzvdb, lawgz
+weotr (82)
+ifncxs (54) -> fglgibd, hljxim
+ogelzn (35)
+pkdwpbh (15)
+mdjhnv (31) -> njkscdv, hincte
+hxxupnf (43) -> cjztdo, uvgvi
+imrqsxa (115) -> drwlyvx, ybsouxh, xfmyvg, oibng
+gnutx (85)
+iloykn (81)
+heudq (6)
+lggutbs (54)
+bllths (9)
+edmdyyf (44)
+wrmovs (132) -> alcjel, knkect
+nfwzt (69)
+esemf (99) -> iqeqpuv, seruan
+omspdwl (245) -> ggmpihl, emzlv, kjyhry
+uillw (1744) -> zfswb, wbsul, dumykdj
+ijmrhsf (102) -> ztdib, rfowcu
+xgllgu (62) -> illog, mfaiso
+ofgvb (52)
+fscztrk (62)
+iwfjou (31)
+egqaydx (814) -> ofydl, sddte, nqpyzt, yehoudc, szpoqm, lbnjp
+vvemxld (63) -> xoavai, subauko
+jkukq (9)
+tmakc (44) -> tqxmke, ipljy
+veefoj (99)
+cmopifq (234) -> zpanms, nxwsaq
+jkzwu (70) -> zhphopf, pcljlai, uillw, qamvl, cdsjzoz, yjngab, vqhriyt
+xkrxt (81)
+fgltnc (22)
+wdrbtqg (8) -> wezrgqw, eubxp, wmmmcdw, eealm, xsjmrv
+wspzdb (60)
+wzcttac (85)
+wqlzmvc (87)
+ervfo (13)
+bxkicdp (57)
+seruan (12)
+wqocyox (99)
+wdafwyi (53)
+drsvx (71)
+yntroh (82) -> rvakt, hoocyf, fgrvof, ccjmduk
+uaeuig (97)
+wspnoa (291) -> hqvtn, iodtwit
+bhzgqav (18)
+ycpxqjz (55)
+szpoqm (98) -> qqedfa, qeovb, agmrdd, othvtfq
+zxvhoy (85)
+waand (6)
+brqztvl (24)
+jatwhbu (93)
+tbswgx (55)
+nghpciz (205) -> lfkfd, hqwqd
+oulbft (44)
+pcljlai (949) -> fxmiw, gmawv, pzgihig, ipqct, xgllgu, omspdwl
+ggmpihl (5)
+qonlajs (73) -> smuzxf, trxfjv
+twijj (54) -> qrmgjdu, avyif, veefoj
+owiryv (54)
+yhfkwn (27)
+eprlek (42)
+xlieqz (18992) -> byytwu, yorihlo, vrpupk
+geznv (32) -> tvdihgf, fccyl
+smueqkc (35)
+wdngppj (97)
+vzits (78)
+bdavc (79)
+luzwzm (19)
+lrvaz (96) -> qflimon, dcbquim
+bvyiw (46)
+esvca (90)
+nylrq (400)
+tezto (34)
+qqedfa (49)
+nulkvu (29)
+xuzfgha (60)
+vsivyn (38)
+qzhemjq (91) -> cejrzz, yozose
+bmntp (88)
+pwotv (26)
+vonbixj (42470) -> orssb, ewqui, ifroqmy
+eleeg (82)
+ylpapdi (15)
+dpmqmbp (292) -> cmopifq, vlrgx, qdrqm
+ciiqis (295) -> cqxfbv, socdh
+lnwyra (60)
+vyyvfme (35) -> jqomxi, hwljl, onyvo, bvykqm
+jxawhq (47)
+kntzn (78) -> vhnpij, tqnucz
+fvbopgf (302) -> bnhmicm, pqccx
+mgxmj (47)
+dodbb (53)
+smlvcc (1242) -> lzjvenf, plgyftr, wrrjvv, dlrpc, nevkxz
+amzzkz (323) -> kiwzzsi, wgwucvi, mdyce, pwotv
+jzmezwj (40)
+yjicxmr (97)
+ssinas (63)
+ojcaeht (86)
+tfjhcnn (91)
+udeyv (75)
+rlxoojp (446) -> cbtfaaq, whnnb, srbtea
+ymehff (28) -> iegfxt, rdnxsro
+wxyrdp (13)
+hbncq (91) -> hwvxsq, dqxfl, hhoxisa, fuorh
+drlkvy (190) -> nixbq, fqcxo, itggp, egtscru
+scmwcz (20)
+lpxekhm (87)
+nevkxz (138) -> flovshu, iivqj, clikxp, wgjbas
+mqyvpvw (254)
+tdstj (88)
+lyfyg (1272) -> whzdf, qlgbx, pfzcu, swtbqxz
+bdejd (93)
+tamautu (15) -> jlxseu, oryhdxc, fbedmnf
+wdrdfsy (55)
+bvtwq (47)
+kjyhry (5)
+unzqb (65)
+jofsg (64) -> mwzhn, oumcdij, vnlbdhq
+ouadkun (43)
+byytwu (89) -> tohprmh, timjt, ncapjgu, yblxjc, wmhkk, dihjv, yxjeaj
+wsxkjcu (97) -> pdkxh, ahklb, bdfns, xxxcdbv
+ywthj (79)
+ehofuzh (26)
+ywpmdg (71)
+duhaz (93) -> rpdiks, zfhup, hdkeesr, zsrdtht
+mzozh (77) -> hiiqxv, qnrlrm, ehzatio, nlrtoa
+hzuprgn (665) -> xnmtop, keubv, yhkrp
+ltwvide (890) -> ajnnoo, acatw, qeyzth, jivcmug, aqzbepp, vwzfjcq
+hkamx (63)
+nrkdwvs (53)
+cjkpmpb (12)
+ojnmrwc (213) -> xbwbjfa, ergcql
+hrhky (60)
+xoavai (55)
+totymbv (55)
+aqzbepp (49) -> peaud, oyort
+zsuhred (33)
+aooskui (59)
+shepkcs (13)
+qggwp (87)
+tidour (20)
+avyif (99)
+pdkxh (29)
+kybtr (42)
+qizznfs (100) -> vykcb, ldtbli
+ykxrxbb (19)
+liearc (16)
+atkpc (43)
+oumcdij (75)
+knfad (87)
+hincte (10)
+nfwof (32)
+oxwbxc (10)
+bgnuk (65)
+iivqj (15)
+rlzldzq (19)
+qolkd (53)
+yxhfz (38)
+qeeyslp (46)
+qrmgjdu (99)
+vbtznz (6) -> vovinsx, vkzka, adkvr
+etcbg (54) -> eigivg, atkpc, tyzcg, jlhnkk
+adkvr (97)
+miwvcdi (98)
+jwiwydu (667) -> ihgiq, hxxupnf, hlgydhq
+kmquncz (57)
+vrpupk (9477) -> kktud, egqaydx, fecze
+kekabeg (17)
+bovla (327) -> arbcqfz, mvncpt, xhypb
+omfahxa (99)
+gvwkbp (300) -> wxmwf, qiwsut
+twgdnl (74)
+dumykdj (71) -> lvlux, rebxtnk
+zvhtk (36)
+pmlzll (57)
+fccyl (85)
+zfxdqi (76)
+fdpjo (58)
+lpfrtfw (85)
+tcsrpxb (48956) -> peopfnu, rajmc, xvnqny
+svezft (11)
+vqcjj (22)
+nqpyzt (294)
+subvci (97)
+askmldt (32)
+qeyzth (143) -> vlgwzi, bqbmy
+zxqrm (232) -> fevoc, kritjfi
+umhji (38)
+xifubdw (15)
+snxbszd (20)
+pfzcu (266)
+zhphopf (52) -> wspnoa, kaxrm, vmobtbb, ciiqis, threc, ysvmncq, twijj
+ysvmncq (173) -> cdynw, kzchhz
+paofxz (140) -> hckss, jpovtel
+qflimon (48)
+vovinsx (97)
+qchmzht (79)
+wkgzwhi (63)
+wxlxyq (272) -> turomx, zpekki, rfbnete
+drwlyvx (24)
+kfaib (206) -> rdbcued, kgjnta
+baovbha (65)
+odhurs (65)
+rpiyqq (22)
+twdnswr (22)
+ypbgol (63)
+xhpzhpq (292)
+ywgsoss (65)
+yrepvc (34)
+ocddu (31)
+zfswb (155) -> osnyi, ofrfo
+sxnfkj (61)
+tvtxqpd (322) -> lkimdg, yqmse, todve, oxwbxc
+qephec (76)
+swhlcvm (47)
+ahklb (29)
+ydibgyz (27)
+himyfxm (37) -> qsqxc, retzg, nfwzt
+lcfycgg (1529) -> lhomu, omfahxa
+zqozw (59)
+hwljl (98)
+zvlftj (53)
+inycp (78) -> dwfxj, rnyyal, ilcoe
+lynvr (34)
+hhjspt (241) -> jtwqgg, bdjgtz, bynxcni
+gkvojlo (87)
+xzllgwq (77)
+pboxau (399)
+oazcn (45)
+buekex (15)
+odttvb (162) -> kekabeg, momoy
+rfedd (74)
+ymyzbqc (144) -> vzyknp, mrssfl
+ftfvpmy (193) -> klmcwy, xltuf
+utqtp (87) -> zqhans, knfad
+ktnynk (23)
+jlhnkk (43)
+jponcak (339) -> ytgxvzv, derxp, cukeme, vqcjj
+subauko (55)
+bgkst (257) -> pjczjl, scmwcz
+uifjku (91)
+ujwqlf (46) -> xdvxnd, sbjvkrb, glilvcd, glmvo, eiennk
+vjfllmr (15)
+nhlvwm (80)
+dpslcf (82)
+tqnucz (78)
+yhmqg (97)
+bqqwwcn (1031) -> kamhkoi, omlxdye, ismqdcu
+ismqdcu (178) -> lfrwzbb, ydibgyz
+rebxtnk (92)
+lcpfw (296) -> vrjes, bvtwq
+drwjl (265) -> vtnex, qxzjhg
+nykhzm (11) -> bmejz, wildi, qoyub, epdfbvu
+rvakt (77)
+hakss (43)
+noqrlh (60)
+epdfbvu (97)
+iqeqpuv (12)
+ywfwlug (24)
+weywe (57)
+kchjfpg (87)
+fbedmnf (12)
+uvsgv (237) -> eyotuoe, slhfj
+fqcxo (9)
+vsfjq (56)
+whumv (84)
+sczuqy (24)
+hqyej (48)
+fglidf (9)
+yfrcx (58)
+ytvmvhy (52)
+vykcb (78)
+cukeme (22)
+pqiqied (93)
+cikijr (32) -> xkrxt, zspsh
+mtukvee (59) -> baovbha, tnezwo, bgnuk
+vlgwzi (49)
+wdsari (41) -> wlnpbx, zbrant
+shzcz (52) -> ztlsw, ktnynk, fmszt
+kaxrm (261) -> oazcn, ijlnjse
+eubxp (81) -> vaqxfkm, levsigy, lqsdtq
+vmobtbb (237) -> kamrqhv, weywe
+zzacgi (90)
+oogoc (32)
+dlrpc (40) -> jbhxihl, kdjcqk
+eealm (88) -> nulkw, pvnch
+jciigs (24)
+fpezemw (67)
+lgkhn (134) -> wzzjnrl, snxbszd, vexft
+ldyrkdm (40)
+zezecwh (53)
+pavvcsj (218) -> ssvcrjn, nzylp
+kwelmvo (46) -> siyudl, wxiks
+mszglrh (472) -> tcqkzp, xhpzhpq, wdaxi
+fmsgmoq (135) -> xgsbu, ykxrxbb
+ahsdq (81)
+lypml (85)
+simsfkz (93)
+bdjgtz (28)
+aaibd (174) -> vnivx, fcjoefo, gkvko, onnmq
+mgihcl (354) -> gwcwh, nhrka
+udzokmu (42)
+qactli (85)
+eqoick (176) -> nulkvu, gmmxg
+synynkd (167) -> jrrcr, apjkf
+darnez (77) -> syqthpz, lmjpuv, lcpfw, bovla, wgkylta, xfkhu, acvbzia
+vrjes (47)
+zemwgsa (130) -> isahru, cltdxy, tfejm, obzcog
+hlauw (35)
+pttqho (87)
+zhmevu (32)
+mhbvu (25)
+autys (32)
+qeovb (49)
+brhvbt (93)
+jrkohk (98)
+yiigm (122) -> qqwda, vsfjq
+gdfxr (1002) -> jrkohk, bgqxrj
+yqmse (10)
+bdbzuf (539) -> ztpizq, gbyiobd, vzlomr
+toqhzbx (27)
+obzcog (26)
+whzdf (140) -> vznyiu, eprlek, iovtj
+yytai (13)
+nwsjspa (18) -> noqrlh, edaidjk
+djomjuh (20) -> bgkst, skrnzrc, mqovh, vbtznz, druym
+pklufv (152) -> ucuojn, waaszgs
+vmbhr (71)
+jrvona (88) -> mowgm, whumv
+hepgwl (226) -> ufjxj, mhtrp
+oakpkr (132) -> obhlzp, qijjq
+wopxs (74)
+wltkgyg (60)
+gnktgh (88)
+yhjmn (54)
+klmcwy (66)
+bbmvgyu (59)
+eifws (205) -> bfvol, qmoxv
+xinyjeu (44)
+bfvol (42)
+mowgm (84)
+orssb (41) -> lyfyg, ymtwg, ltwvide, zuccp
+lnpuarm (918) -> ksbkavj, fmsgmoq, biumgl
+bvykqm (98)
+xnhlg (76)
+mxwdp (81)
+jowykql (63)
+atnmou (54)
+bdlqru (3118) -> gsspm, bdbzuf, whnmg, bnqinhv, hzuprgn, fnuem, nmzkhig
+ddcgqm (10) -> smkeec, wqlzmvc, tcifkj, xzrts
+gjkplw (85)
+gsbypm (52) -> msnnza, drlkvy, etcbg, sqvgekz, noutnp, yjijem
+jwebvqn (7762) -> iwudd, fvwwm, vvemxld
+eiennk (912) -> porcbbb, bqdtmvh, txoqtpz
+mqebpw (19)
+ztpizq (65) -> qwwur, xdwcgk, ulssbyo
+dunqe (40)
+ccjmduk (77)
+kzchhz (89)
+wkqbmut (34) -> icbztci, fpezemw
+txoqtpz (49) -> vbobjo, skcbz
+vpmnutl (232) -> cniapi, xifubdw, asfjop
+asexwc (93) -> tmclxe, aiuyg, jkzwu, zjlckg
+yvoyt (88)
+midrlp (9)
+qlgbx (98) -> ecpuvq, rnxpn
+bvczy (60)
+qnmiv (79) -> gxvlomg, wimpns
+qthns (56)
+kibotum (68) -> gjkplw, wzcttac
+nixbq (9)
+ckugbl (42)
+iveta (147) -> ywthj, oqahna
+rnyyal (76)
+vostn (24)
+fcjoefo (24)
+ibyqrv (59)
+tcifkj (87)
+jgjgxgb (59)
+yduyn (40)
+jnurmw (860) -> xuwzr, eifws, jofsg
+wboesxc (63)
+ibdyuge (64)
+ypyuum (16)
+yxjeaj (1226) -> mzozh, iveta, ojnmrwc, glqezpx
+kyvysg (158) -> yrepvc, tezto
+clikxp (15)
+ojatorf (98) -> nsmsgmk, djxpma, onurc
+eetdzon (57)
+pqzsukm (40)
+fgrvof (77)
+iovtj (42)
+zsrdtht (56)
+wnvzf (37)
+czswzal (82)
+zmfcp (54)
+hgwpks (213)
+bqdtmvh (141) -> jlhdq, zbuqlk
+qiftt (78) -> pkdwpbh, qisdg, cpvefk
+vqhriyt (1903) -> paofxz, iyalpvz, geznv
+udptfka (79) -> brhvbt, bdejd, pqiqied, jatwhbu
+yxqmz (76)
+zerai (83)
+kmpjivb (175) -> hrfldlv, empkyy, thafg
+kktud (72) -> sdvzbk, ddcgqm, goulcd, kmpjivb, awqjs, owjae, gvwkbp
+lrymzqx (20)
+fiilaqx (247)
+aiuyg (12841) -> xjgoko, gdfxr, nftvm, jwiwydu
+kojat (32)
+wmmmcdw (36) -> gkvojlo, qggwp
+gwcwh (23)
+eykks (13)
+qwwur (62)
+hodlob (312)
+iwudd (85) -> ulsjdhh, xinyjeu
+wxiks (46)
+zuccp (1166) -> zemwgsa, pjsevmq, bmqggm, spprj, fgkok
+qppyecj (29)
+uvgvi (67)
+upmft (70)
+ncmenyx (74)
+vznyiu (42)
+oiuppwr (20)
+zujfczp (122) -> yduyn, ldyrkdm
+sabsqv (87)
+tmclxe (8705) -> rqtlp, kmyvaog, qqokzne, smlvcc
+hqvtn (30)
+qcayjn (58)
+vexft (20)
+ihgiq (39) -> oamyk, fhyimvw
+qxxkyr (25) -> qmzef, xtcoefd
+ycqghs (57)
+rajmc (1933) -> rlxoojp, vtgfsqt, wdrbtqg, leytj, wplhnmi
+iesan (151) -> owiryv, ilziw, atnmou
+qslmjtg (283) -> hqxulc, ftwjsi, sqoqld
+rxivjye (13)
+qqwda (56)
+hhoxisa (90)
+yblxjc (2420) -> viqnxm, yytai
+rhdngzm (59)
+tlpzsi (43)
+glilvcd (423) -> bzsupo, ptynfu, ldswpyl, pwaypt, ovdogi, vomul
+ptynfu (110) -> swhlcvm, juqsjg
+qrbhvs (285) -> ridrtgx, kwbbdg, fglidf, jkukq
+hlgydhq (15) -> mxwdp, pwwtnz
+ilcoe (76)
+imdmnn (79)
+gxvlomg (22)
+djsyo (43)
+bzsupo (32) -> gtadjbm, hmsbly
+rjmjlq (24)
+yhkrp (165) -> fgltnc, kfqykbd
+kszzcjg (20)
+gxzkef (116) -> qrshe, djsyo
+jvjdgph (1373) -> hopsivz, hbncq, udptfka
+wjxgvh (39)
+ysgrizu (73) -> jnurmw, hvporje, syzkg, lcfycgg, bqqwwcn, gffatn, npvrbd
+jqomxi (98)
+vpspcd (27)
+rpfhcus (452) -> svpplpy, arwyg, nlzfsx, yntroh, eiwvcil
+eodubb (19)
+givqy (18) -> tvfwp, rfedd, wopxs, omcvezl
+kafnt (15)
+ytgxvzv (22)
+eyotuoe (20)
+zyfrk (80)
+bynxcni (28)
+kfqykbd (22)
+pphbkn (43)
+biumgl (97) -> ulrqrc, wlswfp
+viqnxm (13)
+hwvxsq (90)
+pwaypt (102) -> hzfarz, hbcto
+lbttqhl (130) -> ekdczsz, jowykql
+hmsbly (86)
+ewqui (3753) -> gsbypm, enurd, otzqal, qhvca
+krmoek (55)
+mldtcbl (87)
+sezloa (63)
+zggsrug (36)
+daomuol (34)
+nlzfsx (240) -> kygnpb, ddvbfi
+cltdxy (26)
+oqahna (79)
+orrno (97)
+fhyimvw (69)
+tqxmke (79)
+mdyce (26)
+zprfu (317)
+ytkgrpj (265) -> lflpbjx, fbrdpr
+iwvgsqj (25)
+yghqsa (56478) -> vakhjoj, klyfish, rbgidcj, zsksm, mgdjgzf, gnrgy, zlwnppb
+nedixbk (6)
+kbseli (63)
+zppzac (71)
+sgxaa (64) -> urbqmk, uihqn
+pddgbo (13) -> hbcjzma, vihoep, mtkliz, qzhemjq, dgmbzo
+memnafg (15) -> zqozw, pyjymxj, qsjhc
+mxdij (56)
+qxzjhg (28)
+xhnem (93) -> wrnejq, ewbuve, kwztfbl
+oibng (24)
+fxmiw (248) -> heudq, nedixbk
+qamvl (949) -> wysgri, wfuwg, bgfjxde, zcoqx, hodlob
+cuwpd (77)
+itggp (9)
+fvwwm (121) -> ehofuzh, owsebz
+qijjq (56)
+bsqltzs (57)
+trxfjv (24)
+zuqew (135) -> iwfjou, tqruh
+wfuwg (57) -> yscbbtq, qactli, znxntbo
+srbtea (204)
+cqxfbv (28)
+ufjxj (80)
+wmhkk (2150) -> gvktxip, ncmenyx, dcqofo, twgdnl
+ipqct (108) -> khfehu, zmicnlj
+fwjvl (82) -> zzacgi, esvca
+didfetj (45)
+pmzvdb (35)
+izjecb (91)
+ztlsw (23)
+lgmdhjw (78)
+momoy (17)
+payeaey (197)
+etyhx (92) -> nwtkz, zkmhy, fxjkoqn, zxqrm, eflhrzc, clqlpi, nnoiyn
+xcyfp (63)
+xxtds (75)
+gmawv (104) -> vzits, gvlbzp
+qmzef (13)
+skrnzrc (103) -> bwgjpdg, subvci
+wrnejq (88)
+ajxjsi (20)
+tyzcg (43)
+zuywf (118) -> pqzsukm, wzmrtpw, jzmezwj
+huidcr (66) -> vnhsudk, wspzdb, bvczy, xhsokp
+vtgfsqt (275) -> ptfev, mifxlz, utqtp
+wftxaby (18)
+snzqh (23)
+ylkotm (54)
+smuzxf (24)
+wqrxb (78)
+nmqoxw (56)
+lfrwzbb (27)
+hiiqxv (57)
+wakslhh (156) -> xwwdp, dodbb
+xdwcgk (62)
+jgsgm (87)
+fuorh (90)
+reflh (180) -> nfwof, autys
+mjrxbh (194) -> vsivyn, yxhfz
+xfmyvg (24)
+vomul (6) -> wqocyox, pynygd
+qoyub (97)
+tozgnf (36)
+pwwtnz (81)
+sbjvkrb (22) -> gcvxpm, ftfvpmy, xbabgu, ibffwi, hhjspt
+druym (60) -> eqcpltg, qchmzht, bdavc
+fyktlox (42)
+kritjfi (49)
+xmfrzwa (187) -> ezxlkm, wnvzf, qmpazxn
+dvnvwgj (76)
+euaulyx (71)
+rqtgag (46)
+threc (211) -> cosmq, upmft
+dathq (57)
+jckrdlz (72)
+osbdc (46)
+leytj (506) -> ngppbum, kwelmvo, nwsjspa, xubkl
+fglgibd (70)
+yscbbtq (85)
+cjztdo (67)
+slhfj (20)
+enurd (528) -> gpaljor, ncuksjv, ozdrm, qkmsfo
+yunmx (32)
+awqjs (204) -> cuwpd, wvdnc
+arbcqfz (21)
+qdextxi (7)
+rfbnete (35)
+wzzjnrl (20)
+xxeoneh (54) -> vkuusw, qyharq
+kovebn (29)
+kdjcqk (79)
+zpekki (35)
+zwsjm (29)
+ofrfo (50)
+fqhdf (40)
+iemffhw (23)
+timjt (2360) -> ouadkun, eimcci
+nybvxpl (36)
+ukbfn (7)
+ngsgolg (76)
+peaud (96)
+ldyke (294) -> zezecwh, zvlftj
+qcbubp (40)
+gbyiobd (87) -> dpslcf, eleeg
+wjjov (97) -> wmiuyq, xwxof, ycpxqjz
+xhypb (21)
+ncapjgu (46) -> esbswlu, bkuqfi, nylrq, fvbopgf, mgihcl, ldyke
+ngppbum (12) -> okvspp, sezloa
+dpimy (38)
+fwyreea (63)
+vkzka (97)
+zhzwir (112) -> akvfgdi, ilqgy
+znxntbo (85)
+xfuimef (18) -> kuwksy, ivkvrj, dngizd, iloykn
+msnnza (44) -> cbxomli, ekrwiea
+retzg (69)
+qiwsut (29)
+eiukshg (33)
+ikfnuu (78)
+zspsh (81)
+gvlbzp (78)
+yaqiuq (272) -> aonteu, kafnt, ylpapdi
+cypwd (14)
+ihhmv (72)
\ No newline at end of file
diff --git a/src/advent07/advent07-Copy1.ipynb b/src/advent07/advent07-Copy1.ipynb
new file mode 100644 (file)
index 0000000..aaf20b8
--- /dev/null
@@ -0,0 +1,609 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "{-# LANGUAGE NegativeLiterals #-}\n",
+    "{-# LANGUAGE FlexibleContexts #-}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import Text.Parsec \n",
+    "import Text.ParserCombinators.Parsec.Number\n",
+    "import Data.List (partition, intersect, sortBy, groupBy, sort, group, (\\\\))\n",
+    "import qualified Data.Set as S\n",
+    "import Data.Function (on)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import Debug.Trace"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data Program = Program String Int [String]\n",
+    "                deriving (Show, Eq)\n",
+    "\n",
+    "name (Program n _ _) = n \n",
+    "weight (Program _ w _) = w\n",
+    "supports (Program _ _ s) = s"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 52,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data Tree = Tree Program [Tree] Int deriving (Show, Eq)\n",
+    "root (Tree p _ _) = p\n",
+    "branches (Tree _ b _) = b\n",
+    "tWeight (Tree _ _ w) = w"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "onlySpaces = many (oneOf \" \\t\")\n",
+    "parens = between (string \"(\") (string \")\")\n",
+    "sym = many lower\n",
+    "commaSep sym = sym `sepBy` (onlySpaces *> string \",\" *> onlySpaces)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "mFile = mLine `sepBy` newline \n",
+    "mLine = Program <$> sym <*> (onlySpaces *> (parens int)) <*> supportsP\n",
+    "supportsP = (onlySpaces *> (string \"->\") *> onlySpaces *> (commaSep sym)) <|> (pure [])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "parseFile :: String -> Either ParseError [Program]\n",
+    "parseFile input = parse mFile \"(unknown)\" input\n",
+    "\n",
+    "parseLine :: String -> Either ParseError Program\n",
+    "parseLine input = parse mLine \"(unknown)\" input\n",
+    "\n",
+    "successfulParse :: Either ParseError [a] -> [a]\n",
+    "successfulParse (Left _) = []\n",
+    "successfulParse (Right a) = a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Right (Program \"kuvqhnm\" 77 [])"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "parseLine \"kuvqhnm (77)\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Right (Program \"dihjv\" 2158 [\"gausx\",\"ncdmp\",\"hozgrub\"])"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "parseLine \"dihjv (2158) -> gausx, ncdmp, hozgrub\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "sampleT = \"pbga (66)\\nxhth (57)\\nebii (61)\\nhavc (66)\\nktlj (57)\\nfwft (72) -> ktlj, cntj, xhth\\nqoyq (66)\\npadx (45) -> pbga, havc, qoyq\\ntknk (41) -> ugml, padx, fwft\\njptl (61)\\nugml (68) -> gyxo, ebii, jptl\\ngyxo (61)\\ncntj (57)\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "-- sample = \"pbga (66)\\nxhth (57)\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 40,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "\"pbga (66)\\nxhth (57)\\nebii (61)\\nhavc (66)\\nktlj (57)\\nfwft (72) -> ktlj, cntj, xhth\\nqoyq (66)\\npadx (45) -> pbga, havc, qoyq\\ntknk (41) -> ugml, padx, fwft\\njptl (61)\\nugml (68) -> gyxo, ebii, jptl\\ngyxo (61)\\ncntj (57)\""
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "print sampleT"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 41,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[Program \"pbga\" 66 [],Program \"xhth\" 57 [],Program \"ebii\" 61 [],Program \"havc\" 66 [],Program \"ktlj\" 57 [],Program \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"],Program \"qoyq\" 66 [],Program \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"],Program \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"],Program \"jptl\" 61 [],Program \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"],Program \"gyxo\" 61 [],Program \"cntj\" 57 []]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "sample = successfulParse $ parseFile sampleT\n",
+    "sample"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "allPrograms :: [Program] -> S.Set String\n",
+    "allPrograms = S.fromList . map name"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 42,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "fromList [\"cntj\",\"ebii\",\"fwft\",\"gyxo\",\"havc\",\"jptl\",\"ktlj\",\"padx\",\"pbga\",\"qoyq\",\"tknk\",\"ugml\",\"xhth\"]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "pr = allPrograms sample\n",
+    "pr"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "supported :: [Program] -> S.Set String\n",
+    "supported = S.unions . map (S.fromList . supports)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 43,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "fromList [\"cntj\",\"ebii\",\"fwft\",\"gyxo\",\"havc\",\"jptl\",\"ktlj\",\"padx\",\"pbga\",\"qoyq\",\"ugml\",\"xhth\"]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "su = supported sample\n",
+    "su"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 44,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "\"tknk\""
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "print $ head $ S.elems $ S.difference pr su"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 33,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "part1 :: [Program] -> String\n",
+    "part1 progs = head $ S.elems $ S.difference pr su\n",
+    "    where su = supported progs\n",
+    "          pr = allPrograms progs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "main :: IO ()\n",
+    "main = do \n",
+    "        text <- readFile \"../../data/advent07.txt\"\n",
+    "        let progs = successfulParse $ parseFile text\n",
+    "        print $ part1 progs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "\"vtzay\""
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "main"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "enTree :: Program -> Tree\n",
+    "enTree program = Tree program [] (weight program)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 37,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "leaves :: [Program] -> [Program]\n",
+    "leaves = filter (null . supports)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 45,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[Tree (Program \"pbga\" 66 []) [] 66,Tree (Program \"xhth\" 57 []) [] 57,Tree (Program \"ebii\" 61 []) [] 61,Tree (Program \"havc\" 66 []) [] 66,Tree (Program \"ktlj\" 57 []) [] 57,Tree (Program \"qoyq\" 66 []) [] 66,Tree (Program \"jptl\" 61 []) [] 61,Tree (Program \"gyxo\" 61 []) [] 61,Tree (Program \"cntj\" 57 []) [] 57]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "map enTree (leaves sample)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 46,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "forestNames :: [Tree] -> [String]\n",
+    "forestNames = map (name . root)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 47,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[\"pbga\",\"xhth\",\"ebii\",\"havc\",\"ktlj\",\"qoyq\",\"jptl\",\"gyxo\",\"cntj\"]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "forestNames $ map enTree $ leaves sample"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 48,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Program \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "head $ filter (\\p -> name p == \"ugml\") sample"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 50,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "sampleLeaves = leaves sample\n",
+    "sampleBranch = sample \\\\ sampleLeaves"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 51,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[Program \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"],Program \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"],Program \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"],Program \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "sampleBranch"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 65,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "forest0 = map enTree sampleLeaves"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 63,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[Tree (Program \"pbga\" 66 []) [] 66,Tree (Program \"xhth\" 57 []) [] 57,Tree (Program \"ebii\" 61 []) [] 61,Tree (Program \"havc\" 66 []) [] 66,Tree (Program \"ktlj\" 57 []) [] 57,Tree (Program \"qoyq\" 66 []) [] 66,Tree (Program \"jptl\" 61 []) [] 61,Tree (Program \"gyxo\" 61 []) [] 61,Tree (Program \"cntj\" 57 []) [] 57]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "forest0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 66,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "canBuild :: Program -> [Tree] -> Bool\n",
+    "canBuild program trees = all (\\p -> p `elem` roots) $ supports program\n",
+    "    where roots = map (name . root) trees"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 67,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<style>/* Styles used for the Hoogle display in the pager */\n",
+       ".hoogle-doc {\n",
+       "display: block;\n",
+       "padding-bottom: 1.3em;\n",
+       "padding-left: 0.4em;\n",
+       "}\n",
+       ".hoogle-code {\n",
+       "display: block;\n",
+       "font-family: monospace;\n",
+       "white-space: pre;\n",
+       "}\n",
+       ".hoogle-text {\n",
+       "display: block;\n",
+       "}\n",
+       ".hoogle-name {\n",
+       "color: green;\n",
+       "font-weight: bold;\n",
+       "}\n",
+       ".hoogle-head {\n",
+       "font-weight: bold;\n",
+       "}\n",
+       ".hoogle-sub {\n",
+       "display: block;\n",
+       "margin-left: 0.4em;\n",
+       "}\n",
+       ".hoogle-package {\n",
+       "font-weight: bold;\n",
+       "font-style: italic;\n",
+       "}\n",
+       ".hoogle-module {\n",
+       "font-weight: bold;\n",
+       "}\n",
+       ".hoogle-class {\n",
+       "font-weight: bold;\n",
+       "}\n",
+       ".get-type {\n",
+       "color: green;\n",
+       "font-weight: bold;\n",
+       "font-family: monospace;\n",
+       "display: block;\n",
+       "white-space: pre-wrap;\n",
+       "}\n",
+       ".show-type {\n",
+       "color: green;\n",
+       "font-weight: bold;\n",
+       "font-family: monospace;\n",
+       "margin-left: 1em;\n",
+       "}\n",
+       ".mono {\n",
+       "font-family: monospace;\n",
+       "display: block;\n",
+       "}\n",
+       ".err-msg {\n",
+       "color: red;\n",
+       "font-style: italic;\n",
+       "font-family: monospace;\n",
+       "white-space: pre;\n",
+       "display: block;\n",
+       "}\n",
+       "#unshowable {\n",
+       "color: red;\n",
+       "font-weight: bold;\n",
+       "}\n",
+       ".err-msg.in.collapse {\n",
+       "padding-top: 0.7em;\n",
+       "}\n",
+       ".highlight-code {\n",
+       "white-space: pre;\n",
+       "font-family: monospace;\n",
+       "}\n",
+       ".suggestion-warning { \n",
+       "font-weight: bold;\n",
+       "color: rgb(200, 130, 0);\n",
+       "}\n",
+       ".suggestion-error { \n",
+       "font-weight: bold;\n",
+       "color: red;\n",
+       "}\n",
+       ".suggestion-name {\n",
+       "font-weight: bold;\n",
+       "}\n",
+       "</style><span class='err-msg'>&lt;interactive&gt;:1:30: error:<br/>    â€¢ Couldn't match type â€˜IHaskell51.Tree’<br/>                     with â€˜Tree’<br/>      NB: â€˜Tree’ is defined at &lt;interactive&gt;:1:1-55<br/>          â€˜IHaskell51.Tree’ is defined at &lt;interactive&gt;:1:1-55<br/>      Expected type: [Tree]<br/>        Actual type: [IHaskell51.Tree]<br/>    â€¢ In the second argument of â€˜canBuild’, namely â€˜forest0’<br/>      In the expression: canBuild (head sampleBranch) forest0<br/>      In an equation for â€˜it’: it = canBuild (head sampleBranch) forest0</span>"
+      ],
+      "text/plain": [
+       "<interactive>:1:30: error:\n",
+       "    â€¢ Couldn't match type â€˜Ghci51.Tree’\n",
+       "                     with â€˜Tree’\n",
+       "      NB: â€˜Tree’ is defined at <interactive>:1:1-55\n",
+       "          â€˜Ghci51.Tree’ is defined at <interactive>:1:1-55\n",
+       "      Expected type: [Tree]\n",
+       "        Actual type: [Ghci51.Tree]\n",
+       "    â€¢ In the second argument of â€˜canBuild’, namely â€˜forest0’\n",
+       "      In the expression: canBuild (head sampleBranch) forest0\n",
+       "      In an equation for â€˜it’: it = canBuild (head sampleBranch) forest0"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "canBuild (head sampleBranch) forest0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Haskell",
+   "language": "haskell",
+   "name": "haskell"
+  },
+  "language_info": {
+   "codemirror_mode": "ihaskell",
+   "file_extension": ".hs",
+   "name": "haskell",
+   "version": "8.0.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/src/advent07/advent07.hs b/src/advent07/advent07.hs
new file mode 100644 (file)
index 0000000..6d08193
--- /dev/null
@@ -0,0 +1,121 @@
+import Text.Parsec 
+import Text.ParserCombinators.Parsec.Number
+import Data.List (sort, group)
+import qualified Data.Set as S
+
+data Program = Program String Int [String]
+                deriving (Show, Eq)
+
+name (Program n _ _) = n 
+weight (Program _ w _) = w
+supports (Program _ _ s) = s
+
+data Tree = Tree Program [Tree] Int deriving (Show, Eq)
+root (Tree p _ _) = p
+branches (Tree _ b _) = b
+tWeight (Tree _ _ w) = w
+
+
+
+main :: IO ()
+main = do 
+        text <- readFile "data/advent07.txt"
+        let progs = successfulParse $ parseFile text
+        print $ part1 progs
+        print $ part2 progs
+
+
+part1 :: [Program] -> String
+part1 progs = head $ S.elems $ S.difference pr su
+    where su = supported progs
+          pr = allPrograms progs
+
+
+part2 programs = (weight $ root problem) - wrongWeight + rightWeight
+    where tree = mkTree (findByName (part1 programs) programs) programs
+          problem = problemTree tree
+          pt = problemParent problem tree
+          wrongWeight = problemWeight pt
+          rightWeight = notProblemWeight pt
+
+
+allPrograms :: [Program] -> S.Set String
+allPrograms = S.fromList . map name
+
+supported :: [Program] -> S.Set String
+supported = S.unions . map (S.fromList . supports)
+
+
+-- leaves :: [Program] -> [Program]
+-- leaves = filter (null . supports)
+
+
+mkTree :: Program -> [Program] -> Tree
+mkTree program programs = Tree program subTrees (weight program + w)
+    where subPrograms = map (\n -> findByName n programs) $ supports program
+          subTrees = map (\r -> mkTree r programs) subPrograms
+          w = sum $ map tWeight subTrees
+
+findByName :: String -> [Program] -> Program
+findByName n programs = head $ filter (\p -> n == (name p)) programs 
+
+
+
+balanced :: Tree -> Bool
+balanced t = (S.size $ S.fromList $ map tWeight $ branches t) <= 1
+
+
+problemTree :: Tree -> Tree
+problemTree t 
+    | balanced t = t
+    | otherwise = problemTree problemSubtree
+        where subtreeWeights = map tWeight $ branches t
+              weightGroups = group $ sort subtreeWeights
+              pWeight = head $ head $ filter (\g -> length g == 1) weightGroups
+              problemSubtree = head $ filter (\s -> tWeight s == pWeight) (branches t)
+
+
+problemParent :: Tree -> Tree -> Tree
+problemParent problem tree = head $ problemParent' problem tree
+
+problemParent' :: Tree -> Tree -> [Tree]
+problemParent' problem tree
+    | problem `elem` (branches tree) = [tree]
+    | null $ branches tree = []
+    | otherwise = concatMap (problemParent' problem) $ branches tree
+
+
+problemWeight :: Tree -> Int
+problemWeight tree = head $ head $ filter (\g -> 1 == length g) $ group $ sort $ map tWeight $ branches tree
+
+notProblemWeight :: Tree -> Int
+notProblemWeight tree = head $ head $ filter (\g -> 1 /= length g) $ group $ sort $ map tWeight $ branches tree
+
+
+
+onlySpaces = many (oneOf " \t")
+parens = between (string "(") (string ")")
+symP = many lower
+commaSep sym = sym `sepBy` (onlySpaces *> string "," *> onlySpaces)   
+
+mFile = mLine `sepBy` newline 
+mLine = Program <$> symP <*> (onlySpaces *> (parens int)) <*> supportsP
+supportsP = (onlySpaces *> (string "->") *> onlySpaces *> (commaSep symP)) <|> (pure [])
+
+parseFile :: String -> Either ParseError [Program]
+parseFile input = parse mFile "(unknown)" input
+
+-- parseLine :: String -> Either ParseError Program
+-- parseLine input = parse mLine "(unknown)" input
+
+successfulParse :: Either ParseError [a] -> [a]
+successfulParse (Left _) = []
+successfulParse (Right a) = a
+
+
+
+-- sampleT = "pbga (66)\nxhth (57)\nebii (61)\nhavc (66)\nktlj (57)\nfwft (72) -> ktlj, cntj, xhth\nqoyq (66)\npadx (45) -> pbga, havc, qoyq\ntknk (41) -> ugml, padx, fwft\njptl (61)\nugml (68) -> gyxo, ebii, jptl\ngyxo (61)\ncntj (57)"
+-- sample = successfulParse $ parseFile sampleT
+
+-- sampleLeaves = leaves sample
+-- sampleBranch = sample \\ sampleLeaves
diff --git a/src/advent07/advent07.ipynb b/src/advent07/advent07.ipynb
new file mode 100644 (file)
index 0000000..2e12482
--- /dev/null
@@ -0,0 +1,1047 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "{-# LANGUAGE NegativeLiterals #-}\n",
+    "{-# LANGUAGE FlexibleContexts #-}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 113,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import Text.Parsec \n",
+    "import Text.ParserCombinators.Parsec.Number\n",
+    "import Data.List (partition, intersect, sortBy, groupBy, sort, group, (\\\\))\n",
+    "import qualified Data.Set as S\n",
+    "import Data.Function (on)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 151,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import Debug.Trace"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data Programx = Programx String Int [String]\n",
+    "                deriving (Show, Eq)\n",
+    "\n",
+    "name (Programx n _ _) = n \n",
+    "weight (Programx _ w _) = w\n",
+    "supports (Programx _ _ s) = s"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data Treex = Treex Programx [Treex] Int deriving (Show, Eq)\n",
+    "root (Treex p _ _) = p\n",
+    "trees (Treex _ t _) = t\n",
+    "tWeight (Treex _ _ w) = w"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "onlySpaces = many (oneOf \" \\t\")\n",
+    "parens = between (string \"(\") (string \")\")\n",
+    "sym = many lower\n",
+    "commaSep sym = sym `sepBy` (onlySpaces *> string \",\" *> onlySpaces)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "mFile = mLine `sepBy` newline \n",
+    "mLine = Programx <$> sym <*> (onlySpaces *> (parens int)) <*> supportsP\n",
+    "supportsP = (onlySpaces *> (string \"->\") *> onlySpaces *> (commaSep sym)) <|> (pure [])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "parseFile :: String -> Either ParseError [Programx]\n",
+    "parseFile input = parse mFile \"(unknown)\" input\n",
+    "\n",
+    "parseLine :: String -> Either ParseError Programx\n",
+    "parseLine input = parse mLine \"(unknown)\" input\n",
+    "\n",
+    "successfulParse :: Either ParseError [a] -> [a]\n",
+    "successfulParse (Left _) = []\n",
+    "successfulParse (Right a) = a"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Right (Programx \"kuvqhnm\" 77 [])"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "parseLine \"kuvqhnm (77)\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Right (Programx \"dihjv\" 2158 [\"gausx\",\"ncdmp\",\"hozgrub\"])"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "parseLine \"dihjv (2158) -> gausx, ncdmp, hozgrub\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "sample = \"pbga (66)\\nxhth (57)\\nebii (61)\\nhavc (66)\\nktlj (57)\\nfwft (72) -> ktlj, cntj, xhth\\nqoyq (66)\\npadx (45) -> pbga, havc, qoyq\\ntknk (41) -> ugml, padx, fwft\\njptl (61)\\nugml (68) -> gyxo, ebii, jptl\\ngyxo (61)\\ncntj (57)\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "-- sample = \"pbga (66)\\nxhth (57)\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "\"pbga (66)\\nxhth (57)\\nebii (61)\\nhavc (66)\\nktlj (57)\\nfwft (72) -> ktlj, cntj, xhth\\nqoyq (66)\\npadx (45) -> pbga, havc, qoyq\\ntknk (41) -> ugml, padx, fwft\\njptl (61)\\nugml (68) -> gyxo, ebii, jptl\\ngyxo (61)\\ncntj (57)\""
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "print sample"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[Programx \"pbga\" 66 [],Programx \"xhth\" 57 [],Programx \"ebii\" 61 [],Programx \"havc\" 66 [],Programx \"ktlj\" 57 [],Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"],Programx \"qoyq\" 66 [],Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"],Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"],Programx \"jptl\" 61 [],Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"],Programx \"gyxo\" 61 [],Programx \"cntj\" 57 []]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "successfulParse $ parseFile sample"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "programs :: [Programx] -> S.Set String\n",
+    "programs = S.fromList . map name"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "fromList [\"cntj\",\"ebii\",\"fwft\",\"gyxo\",\"havc\",\"jptl\",\"ktlj\",\"padx\",\"pbga\",\"qoyq\",\"tknk\",\"ugml\",\"xhth\"]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "pr = programs $ successfulParse $ parseFile sample\n",
+    "pr"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "supported :: [Programx] -> S.Set String\n",
+    "supported = S.unions . map (S.fromList . supports)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "fromList [\"cntj\",\"ebii\",\"fwft\",\"gyxo\",\"havc\",\"jptl\",\"ktlj\",\"padx\",\"pbga\",\"qoyq\",\"ugml\",\"xhth\"]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "su = supported $ successfulParse $ parseFile sample\n",
+    "su"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "\"tknk\""
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "print $ head $ S.elems $ S.difference pr su"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "part1 :: [Programx] -> String\n",
+    "part1 progs = head $ S.elems $ S.difference pr su\n",
+    "    where su = supported progs\n",
+    "          pr = programs progs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "main :: IO ()\n",
+    "main = do \n",
+    "        text <- readFile \"../../data/advent07.txt\"\n",
+    "        let progs = successfulParse $ parseFile text\n",
+    "        print $ part1 progs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "\"vtzay\""
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "main"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "makeSingletons :: [Programx] -> ([Treex], [Programx])\n",
+    "makeSingletons programs = (trees, others)\n",
+    "    where (sPrograms, others) = partition isLeaf programs\n",
+    "          isLeaf pr = null $ supports pr\n",
+    "          trees = map makeSTree sPrograms\n",
+    "          makeSTree pr = Treex pr [] (weight pr)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "([Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"qoyq\" 66 []) [] 66,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61,Treex (Programx \"cntj\" 57 []) [] 57],[Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"],Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"],Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"],Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]])"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "makeSingletons $ successfulParse $ parseFile sample"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 42,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "makeTree :: [Treex] -> Programx -> Treex\n",
+    "makeTree trees program = Treex program subtrees (w + (weight program))\n",
+    "    where subtrees = filter (\\t -> (name $ root t) `elem` (supports program)) trees\n",
+    "          w = sum $ map tWeight subtrees"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 43,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "addTreeLayer :: [Treex] -> [Programx] -> ([Treex], [Programx])\n",
+    "addTreeLayer trees programs = (trees', programs')\n",
+    "    where (sPrograms, others) = partition isSupporter programs\n",
+    "          isSupporter pr = not $ null $ (supports pr) `intersect` roots\n",
+    "          roots = map (name . root) trees\n",
+    "          trees' = map (makeTree trees) sPrograms\n",
+    "          newRoots = map root trees'\n",
+    "          programs' = programs \\\\ newRoots\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 44,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "([Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"qoyq\" 66 []) [] 66,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61,Treex (Programx \"cntj\" 57 []) [] 57],[Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"],Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"],Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"],Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]])"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "(leaves, others) =  makeSingletons $ successfulParse $ parseFile sample\n",
+    "(leaves, others)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 45,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "([Treex (Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"]) [Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"cntj\" 57 []) [] 57] 243,Treex (Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"]) [Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"qoyq\" 66 []) [] 66] 243,Treex (Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]) [Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61] 251],[Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"]])"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "(trs, oths) = addTreeLayer leaves others\n",
+    "(trs, oths)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 46,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "3"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "length trs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 47,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "1"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "length oths"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 52,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "([Treex (Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"]) [Treex (Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"]) [Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"cntj\" 57 []) [] 57] 243,Treex (Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"]) [Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"qoyq\" 66 []) [] 66] 243,Treex (Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]) [Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61] 251] 778],[])"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "(trs', oths') =  addTreeLayer trs oths\n",
+    "(trs', oths')"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 49,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[243,243,251]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "map tWeight trs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 173,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "balancedTree :: Treex -> Bool\n",
+    "balancedTree tr \n",
+    "    | null $ trees tr = True\n",
+    "    | otherwise = (1==) $ S.size $ S.fromList $ map tWeight $ trees tr"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 174,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[True,True,True,True,True,True,True,True,True]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "map balancedTree leaves"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 175,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[True,True,True]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "map balancedTree trs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 176,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[False]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "map balancedTree trs'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 177,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "treesByWeight :: Treex -> [Treex]\n",
+    "treesByWeight = sortBy (compare `on` tWeight) . trees"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 178,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[243,243,251]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "map tWeight $ treesByWeight $ head trs'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 179,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "oddWeight :: Treex -> Int\n",
+    "oddWeight = tWeight . head . head .filter (\\g -> length g == 1) . groupBy ((==) `on` tWeight) . trees"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 180,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "oddWeight :: Treex -> Int\n",
+    "oddWeight = head . head .filter (\\g -> length g == 1) . group . sort . map tWeight . trees"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 181,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "251"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "oddWeight $ head trs'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 182,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "-- oddMajorityWeight :: Treex -> (Int, Int)\n",
+    "oddMajorityWeight = extractWeights . oddMajority . groups\n",
+    "    where groups = group . sort . map tWeight . trees\n",
+    "          oddMajority = partition (\\g -> length g == 1)\n",
+    "          extractWeights (o, m) = (head $ head o, head $ head m)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 183,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "(251,243)"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "oddMajorityWeight $ head trs'"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 184,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "68"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "weight $ root $ head $ filter (\\t -> tWeight t == 251) $ trees $ head trs' "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 185,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "60"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "68 - 251 + 243"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 202,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "checkTrees :: ([Treex], [Programx]) -> Int\n",
+    "checkTrees (partTrees, programs) =\n",
+    "    if all balancedTree partTrees\n",
+    "    then trace (show $ length partTrees) checkTrees $ addTreeLayer partTrees programs\n",
+    "    else \n",
+    "        oddTreeWeight - oddWeight + majorityWeight\n",
+    "    where \n",
+    "        unbalancedTree = head $ filter (not . balancedTree) partTrees\n",
+    "        (oddWeight, majorityWeight) = oddMajorityWeight unbalancedTree\n",
+    "        unbalancedSubtrees = trees unbalancedTree\n",
+    "        oddTreeWeight = weight $ root $ head $ filter (\\t -> tWeight t == oddWeight) $ trees unbalancedTree"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 188,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Treex (Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"]) [Treex (Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"]) [Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"cntj\" 57 []) [] 57] 243,Treex (Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"]) [Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"qoyq\" 66 []) [] 66] 243,Treex (Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]) [Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61] 251] 778"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "ubt = head $ filter (not . balancedTree) trs'\n",
+    "ubt"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 189,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[Treex (Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"]) [Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"cntj\" 57 []) [] 57] 243,Treex (Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"]) [Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"qoyq\" 66 []) [] 66] 243,Treex (Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]) [Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61] 251]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "trees ubt"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 238,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "([Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"qoyq\" 66 []) [] 66,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61,Treex (Programx \"cntj\" 57 []) [] 57],[Programx \"fwft\" 72 [\"ktlj\",\"cntj\",\"xhth\"],Programx \"padx\" 45 [\"pbga\",\"havc\",\"qoyq\"],Programx \"tknk\" 41 [\"ugml\",\"padx\",\"fwft\"],Programx \"ugml\" 68 [\"gyxo\",\"ebii\",\"jptl\"]])"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "sglPrs =  makeSingletons $ successfulParse $ parseFile sample\n",
+    "sglPrs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 239,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"qoyq\" 66 []) [] 66,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61,Treex (Programx \"cntj\" 57 []) [] 57]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "fst sglPrs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 240,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "60"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "checkTrees sglPrs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 242,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "all balancedTree leaves"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 243,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[Treex (Programx \"pbga\" 66 []) [] 66,Treex (Programx \"xhth\" 57 []) [] 57,Treex (Programx \"ebii\" 61 []) [] 61,Treex (Programx \"havc\" 66 []) [] 66,Treex (Programx \"ktlj\" 57 []) [] 57,Treex (Programx \"qoyq\" 66 []) [] 66,Treex (Programx \"jptl\" 61 []) [] 61,Treex (Programx \"gyxo\" 61 []) [] 61,Treex (Programx \"cntj\" 57 []) [] 57]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "leaves"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 244,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "balancedTree $ head leaves"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 245,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Treex (Programx \"pbga\" 66 []) [] 66"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "head leaves"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 246,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "-- part2 :: [Programx] -> Int\n",
+    "part2 = checkTrees . makeSingletons \n",
+    "-- part2 prs = all balancedTree $ fst $ addTreeLayer ts os\n",
+    "--     where (ts, os) = makeSingletons prs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 247,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "main :: IO ()\n",
+    "main = do \n",
+    "        text <- readFile \"../../data/advent07.txt\"\n",
+    "        let progs = successfulParse $ parseFile text\n",
+    "--         print $ part1 progs\n",
+    "        print $ part2 progs"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 248,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<style>/* Styles used for the Hoogle display in the pager */\n",
+       ".hoogle-doc {\n",
+       "display: block;\n",
+       "padding-bottom: 1.3em;\n",
+       "padding-left: 0.4em;\n",
+       "}\n",
+       ".hoogle-code {\n",
+       "display: block;\n",
+       "font-family: monospace;\n",
+       "white-space: pre;\n",
+       "}\n",
+       ".hoogle-text {\n",
+       "display: block;\n",
+       "}\n",
+       ".hoogle-name {\n",
+       "color: green;\n",
+       "font-weight: bold;\n",
+       "}\n",
+       ".hoogle-head {\n",
+       "font-weight: bold;\n",
+       "}\n",
+       ".hoogle-sub {\n",
+       "display: block;\n",
+       "margin-left: 0.4em;\n",
+       "}\n",
+       ".hoogle-package {\n",
+       "font-weight: bold;\n",
+       "font-style: italic;\n",
+       "}\n",
+       ".hoogle-module {\n",
+       "font-weight: bold;\n",
+       "}\n",
+       ".hoogle-class {\n",
+       "font-weight: bold;\n",
+       "}\n",
+       ".get-type {\n",
+       "color: green;\n",
+       "font-weight: bold;\n",
+       "font-family: monospace;\n",
+       "display: block;\n",
+       "white-space: pre-wrap;\n",
+       "}\n",
+       ".show-type {\n",
+       "color: green;\n",
+       "font-weight: bold;\n",
+       "font-family: monospace;\n",
+       "margin-left: 1em;\n",
+       "}\n",
+       ".mono {\n",
+       "font-family: monospace;\n",
+       "display: block;\n",
+       "}\n",
+       ".err-msg {\n",
+       "color: red;\n",
+       "font-style: italic;\n",
+       "font-family: monospace;\n",
+       "white-space: pre;\n",
+       "display: block;\n",
+       "}\n",
+       "#unshowable {\n",
+       "color: red;\n",
+       "font-weight: bold;\n",
+       "}\n",
+       ".err-msg.in.collapse {\n",
+       "padding-top: 0.7em;\n",
+       "}\n",
+       ".highlight-code {\n",
+       "white-space: pre;\n",
+       "font-family: monospace;\n",
+       "}\n",
+       ".suggestion-warning { \n",
+       "font-weight: bold;\n",
+       "color: rgb(200, 130, 0);\n",
+       "}\n",
+       ".suggestion-error { \n",
+       "font-weight: bold;\n",
+       "color: red;\n",
+       "}\n",
+       ".suggestion-name {\n",
+       "font-weight: bold;\n",
+       "}\n",
+       "</style><span class='err-msg'>Prelude.head: empty list</span>"
+      ],
+      "text/plain": [
+       "Prelude.head: empty list"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "main"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Haskell",
+   "language": "haskell",
+   "name": "haskell"
+  },
+  "language_info": {
+   "codemirror_mode": "ihaskell",
+   "file_extension": ".hs",
+   "name": "haskell",
+   "version": "8.0.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}