From 413c80b41b75be6c15be5212a4b05024d5c0272c Mon Sep 17 00:00:00 2001 From: logaritmisk Date: Thu, 7 Dec 2017 11:08:39 +0100 Subject: [PATCH] 2017/06-07 --- 2017/06/Cargo.lock | 4 + 2017/06/Cargo.toml | 6 + 2017/06/input.txt | 1 + 2017/06/src/main.rs | 101 ++++ 2017/07/Cargo.lock | 4 + 2017/07/Cargo.toml | 6 + 2017/07/example.txt | 13 + 2017/07/input.txt | 1292 +++++++++++++++++++++++++++++++++++++++++++ 2017/07/src/main.rs | 197 +++++++ 9 files changed, 1624 insertions(+) create mode 100644 2017/06/Cargo.lock create mode 100644 2017/06/Cargo.toml create mode 100644 2017/06/input.txt create mode 100644 2017/06/src/main.rs create mode 100644 2017/07/Cargo.lock create mode 100644 2017/07/Cargo.toml create mode 100644 2017/07/example.txt create mode 100644 2017/07/input.txt create mode 100644 2017/07/src/main.rs diff --git a/2017/06/Cargo.lock b/2017/06/Cargo.lock new file mode 100644 index 0000000..c87e1a0 --- /dev/null +++ b/2017/06/Cargo.lock @@ -0,0 +1,4 @@ +[[package]] +name = "day-06" +version = "0.1.0" + diff --git a/2017/06/Cargo.toml b/2017/06/Cargo.toml new file mode 100644 index 0000000..7ef3113 --- /dev/null +++ b/2017/06/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day-06" +version = "0.1.0" +authors = ["logaritmisk "] + +[dependencies] diff --git a/2017/06/input.txt b/2017/06/input.txt new file mode 100644 index 0000000..b16e11b --- /dev/null +++ b/2017/06/input.txt @@ -0,0 +1 @@ +4 10 4 1 8 4 9 14 5 1 14 15 0 15 3 5 diff --git a/2017/06/src/main.rs b/2017/06/src/main.rs new file mode 100644 index 0000000..4315fc2 --- /dev/null +++ b/2017/06/src/main.rs @@ -0,0 +1,101 @@ +use std::io::{self, Read}; +use std::collections::HashSet; + + +fn parse(input: &str) -> Vec { + input.split_whitespace().flat_map(str::parse).collect() +} + +fn cycle(input: &mut [u16]) { + let (index, blocks) = input + .iter() + .enumerate() + .fold((0, 0), |acc, (index, blocks)| { + if *blocks > acc.1 { + (index, *blocks) + } else { + acc + } + }); + + input[index] = 0; + + let len = input.len(); + + for i in 0..blocks as usize { + input[(index + i + 1) % len] += 1; + } +} + +fn infinit_loop(mut memory: Vec) -> (Vec, usize) { + let mut states = HashSet::new(); + + states.insert(memory.clone()); + + let mut i = 0; + + loop { + i += 1; + + cycle(&mut memory); + + if states.contains(&memory) { + break; + } + + states.insert(memory.clone()); + } + + (memory, i) +} + +fn main() { + let mut input = String::new(); + + io::stdin() + .read_to_string(&mut input) + .expect("faild to read input"); + + for entry in input.lines().filter(|line| !line.is_empty()).map(parse) { + let (state, cycle) = infinit_loop(entry); + + println!("part_one={}", cycle); + + let (_, cycle) = infinit_loop(state); + + println!("part_two={}", cycle); + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse() { + assert_eq!(parse("0 2 7 0"), vec![0, 2, 7, 0]); + } + + #[test] + fn test_cycle() { + let mut data = vec![0, 2, 7, 0]; + + cycle(&mut data); + + assert_eq!(data, vec![2, 4, 1, 2]); + } + + #[test] + fn test_infinit_loop() { + let data = vec![0, 2, 7, 0]; + + let (state, cycle) = infinit_loop(data); + + assert_eq!(cycle, 5); + + let (_, cycle) = infinit_loop(state); + + assert_eq!(cycle, 4); + } +} diff --git a/2017/07/Cargo.lock b/2017/07/Cargo.lock new file mode 100644 index 0000000..ebbe97c --- /dev/null +++ b/2017/07/Cargo.lock @@ -0,0 +1,4 @@ +[[package]] +name = "day-07" +version = "0.1.0" + diff --git a/2017/07/Cargo.toml b/2017/07/Cargo.toml new file mode 100644 index 0000000..526e43e --- /dev/null +++ b/2017/07/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "day-07" +version = "0.1.0" +authors = ["logaritmisk "] + +[dependencies] diff --git a/2017/07/example.txt b/2017/07/example.txt new file mode 100644 index 0000000..8a41324 --- /dev/null +++ b/2017/07/example.txt @@ -0,0 +1,13 @@ +pbga (66) +xhth (57) +ebii (61) +havc (66) +ktlj (57) +fwft (72) -> ktlj, cntj, xhth +qoyq (66) +padx (45) -> pbga, havc, qoyq +tknk (41) -> ugml, padx, fwft +jptl (61) +ugml (68) -> gyxo, ebii, jptl +gyxo (61) +cntj (57) diff --git a/2017/07/input.txt b/2017/07/input.txt new file mode 100644 index 0000000..35df4ec --- /dev/null +++ b/2017/07/input.txt @@ -0,0 +1,1292 @@ +jovejmr (40) +fesmk (24) +gwhfv (74) +vxfoyx (101) -> aqytxb, ltnnn +pvtnv (77) +cpmuhnf (39) +ocezven (77) +xjqta (42) +hkckef (21) +nwuhqn (63) +wbbfc (49) +oictp (50) +zmizid (85) +uukembw (1054) -> yowehs, ytoju, jwyhe, bxqlx +iqdna (212) -> gmhwcj, vllsfc, ebptuar, lmcqa +vakapy (132) -> eiisyk, nghznvw, dqslnjk +qouck (77) +pqjeof (12) +faszmg (53) +jvjlfb (56) +oxwpxqj (44) +ryonf (18) +jrgndow (70) +iayecc (86) +lwuwrp (84) +haxfzky (72) +ahbxz (12) +muuyp (21) +emjuzdq (46) +csiof (258) -> rjyyh, rdqisk +orkisb (88) +yheewtp (13) +utrhfs (10) +kczko (84) +iwcqa (98) +chdtaz (59) +pqoybi (74) -> bsmwi, hsycjdc +pinapwf (88) +vpfsdll (93) +ohjniy (139) -> tvqfs, uyfca +cbldohy (92) +vvgyhb (526) -> ruqgy, xrgsnsh, wytylnc +wwjqcpu (90) +xvjuf (79) +zdsyu (67) -> ecstxkl, paofmv +eovjzwr (55) +ohsjl (36) +eduzwi (49) -> segwmpm, bfekpxz, gewtd, knvukf +oyhvxt (5) +kyoypr (69) +mfaftsr (34) +heqou (193) -> uriolfn, gfhfmig, crxpsq +ktbxbnn (132) -> fhzzvtv, oytgp +yscxlz (40) +dukpbd (44) +kzlpr (6) +qswzv (86) +pxjuos (61) +mvavmml (53) +kqxpxlx (57) +ixdllwp (1853) -> sialf, kjvaqy +nhrapmw (51) -> pifqyxs, wxloqgs, jkcrf, bmivh, btjjjxw, gfyvv, tpdaf +wurmmqn (14) +dqjxyyd (53) +vlnnmg (94) +rjyyh (68) +hwezjo (43349) -> rpyji, uukembw, pbthb +iyeuk (74) +lcaeg (92) +gfhfmig (44) +iugub (226) -> rauprc, bummi +tfpsrke (70) +nhjbg (267) -> fviaonx, uemcawn +rleprim (45) -> lruhxda, qxfvj +yowehs (1257) -> ynhgsj, deboo, jrovat +lefvu (10) -> pzths, vygkoys, etzfe, sudep +kcjcpk (9) +zhvyfkx (56) +ixeev (77) +rkjfzl (241) -> jakjzay, znfjlz, zftvgdy, bzhzzv, dhktab +cstxcb (31) +bzhzzv (212) +sqkae (73) +rpkaem (14) +krepomq (36) +hxdrc (4240) -> fcoaxeb, geniumj, wprzdkf, ygbuuxe, fvqwcn, dketeda, ozmbhy +nebobeh (37) -> pinapwf, qijqu, kccdhut +jkcrf (177) -> dahvvo, tbyfd +jlnxpy (156) -> akmzxzw, yrrhqap +xdqma (201) -> ggsdtdp, rbxfyau +dtpzna (83) +wovwg (83) +eaggakx (50) +imfepc (5) +uruco (74) +qbhev (1169) -> dptakt, qrsyoj, gzttehr, qwcyeqz +bvrxeo (3248) -> jnyexah, ltleg, fdnmqri, iysgr, dffdie, vvgyhb +exhjhpu (9) +zcubrms (41) -> bgwlsu, grlbob, lcaeg, dmdgesa +bqayvhe (142) -> nnsaju, xobzucu, qrlyc +kutvex (178) -> xqscl, jowbyue +tzlsvpk (348) -> pqyjyl, yrudth +jbqnyve (70) +aexqgs (98) -> ighxxvd, orkisb +sbgug (49) -> qmbfra, jlnxpy, zkljkp, ikves +mmsesaw (98) +xsnbmt (98) +pzhayls (59) +iqyrubd (73) +nwzzgtf (71) +jgbce (79) +blhjjx (81) +xyoatzj (79) +drukt (87) +bxxpwa (12) +uyfca (46) +qslflr (37) +czrmixj (84) +rogrsp (94) +bcmep (79) +tvqfs (46) +vhdfs (50) +quaqp (29) +kqaox (70) +lyetyd (1427) -> craakno, unxgbyg, ftmwpqg +uktdx (135) -> oyhvxt, imfepc +eyhbm (45) +vrlwo (79) -> nbdhcy, adsppu, dmwzg, odguqiy +xeoeht (67) +szgqmow (110) -> oarrrpk, nqdcbhp +hmxbpwl (12) +xorzt (21) +nohqdkf (39) +fbshzlu (139) -> ahjpc, tgspt +zlrod (188) +ftudp (56) +zskbac (94) -> oyvsrsc, dmroo, wfrqy, bbpyckh +sdkbbc (94) +qngcb (40) +xziemca (23) +rpvqak (300) -> mfpxtom, cltcdp, khcau, bqayvhe, efoouqi +bojkbqr (75) +jsthfix (191) -> sewnmby, qngcb +lxckefh (21) +qrlyc (22) +aemfgyt (156) +xbegaua (106) -> cbcxlyo, cejbp +hfcotwm (36) +wrmngqs (9) +anpriwx (67) -> uhczfn, ovpmj +gsuxkc (66) +qryxc (74) +tymwxrt (67) +ifmnxwy (57) +qwjcmlq (5) +qlmptj (82) +eazsmg (75) +kygcd (58) +surfn (36) +ikwre (46) -> lpsufo, eaugk +tdulat (184) -> qfcknc, dbzmyy +yophj (74) +gverkkt (51) +vwhmf (54) +krvsaqc (51) +qgmtntw (82) +dmtlzbj (80) +zewvip (48) +znhkve (90) +odnfifx (80) +affmx (39) +pfeewo (638) -> fhhqd, szgqmow, bdeol, dyxlbp +rviwwhc (40) +wpqqze (84) +zmmfuq (10) +qpnyq (19) +kjvaqy (19) +dkuhniy (1187) -> nbenm, obnnecx, gqvxml, zyzwas +tzgsm (1080) -> jevck, uqsrhrf, orgcvcg +xrgsnsh (24) -> abwhrjo, xycwfmc, qqvlmd, omupor +ozolfes (85) -> fncqp, lusiwnm, anoxy +zzrttv (73) +dvdnlr (87) +qqubd (61) +adsppu (46) +rblolc (45) -> ooilg, fbcqhv, palqz, lqdvwk +blslvmm (381) -> tijjvh, oceimpw, lndzbn +qhdtqi (70) +obpwxg (7) +bxqlx (57) -> rqglm, tzlsvpk, gmsbmq, tdulat, cianrio +bqjqj (44) +uxfnv (153) -> brooyl, lwvclga, jeqxuvl +socihs (33) +qnioy (400) +mbcxw (19) +wytylnc (398) -> yinrfyl, kcewvb +hckgf (162) -> kutvex, prvai, jwdmmcd, safph, nyfutww, xochdg +mnsxmc (137) -> oadcp, adxgp +olyrohd (73) +nglln (12) +qoiit (67) +vqezl (64) +deboo (116) -> vmldb, vdujht +dystb (247) -> ryonf, ixqkcbm +dpqxwea (162) -> ccsqmpv, pjtzjkm +lpfprd (164) -> hcnocre, polzw +fviaonx (7) +brvlzkw (34) +ocpzwk (71) -> vwske, sdkbbc +ynhgsj (70) -> jzocbg, efylyde +orgcvcg (88) -> frqrk, wzinm +jfikyhd (74) +ajpjme (73) -> tymwxrt, kysjzj, qoiit +atquwvk (1437) -> vpqyy, hmxbpwl, mryloc, hxphn +csmkbgh (257) -> pqoybi, liyxgoa, zlrod, yvupc, lpfprd +hercuw (999) -> rpvqak, jynanod, gyzhdk, vonee +kpjmq (56) +iuosq (1130) -> zlyxnww, yiitzs +onxwvpl (47) -> nwuhqn, udpuj +ooilg (70) +dkolh (310) -> vfgkz, xsewp +crxcdnk (300) -> wkvcgtu, fnodwc +xycwfmc (99) +hxphn (12) +uhczfn (82) +juxbbz (52) +fqevwyy (92) +ybhtg (56) -> wbona, lwiyyiu, ieqvf, fultd +itaxno (12) +eibsqe (245) -> hojzxhu, ifmnxwy +lrzlckm (1087) -> hxoswpm, quomvk, xadrr, xmsfn, kyziqis +anlre (24) +anetug (70) -> gypqe, otise +syhbs (188) -> nglln, ogrcxm +wpmpzel (30) +rthbso (152) -> jlrun, jswlnwo, xziemca, vdkklj +narpa (248) -> yheewtp, tovvd +luralcy (55) -> dcaxloo, ovpoqt, bvrxeo, osgijzx, uppcjl +xurtoj (80) +hsycjdc (57) +geniumj (535) -> lieexcn, mchtb, nupqbfq +pcissqn (229) -> jplusbc, fiwwr +mebfx (74) +fhyhg (75) +pxsdzax (62) +waneo (24) +zwhpl (89) +vnlmjy (146) -> exhjhpu, jtwov +litns (1340) -> jbmccc, lefvu, anetug +qsdrdp (41) -> wdhjt, pqgnd, ftdjg, dzvsp +rxulpe (83) +vxpjfrf (106) -> eptfjt, zprpamt +slxrrx (62) +gwtsp (76) +hkrkkvv (55) +dbzmyy (97) +kywdy (99) +btsfhej (80) +acgdfu (70) +kccdhut (88) +rcfkr (70) -> khebz, oekex, gdhnu, uhggwqa, nrslon, incqze, ajpjme +jwdmmcd (172) -> odanj, nppone +phwnp (14) +asxxcu (13) -> vmhyd, ufzrbo, fkajvpp +jsylrrl (19) +qvbyk (96) +atazf (40) +fierzfm (10) +kwhjz (64) +vdkklj (23) +hnfwgag (54) +eptfjt (50) +sdxlyd (93) -> bqldhq, kpcorrf +azddjb (49) +ydktfd (88) +tgspt (43) +eqjoky (166) -> wwhao, wjncmeh +oadcp (18) +ycihhx (36) +bgacyt (66) -> fjforb, wsclc +takkclx (77) +jvhuwnd (50) +dmohbhf (56) +wdzqhs (102) -> kwnpdyr, yophj +fjforb (73) +npkqfq (12) +qugbhqd (35) +jxovdlo (6) +nmgme (75) +njmpeyi (17) +oekex (136) -> emjuzdq, twhkffp, onzxd +uewmev (32519) -> yvngku, kvgcvel, xupjwd +gmxfl (88) +fhjnytd (95) +ytoju (1052) -> tqveqn, vlzkx, gzcqdt, jwahk, xookni +lsyuq (87) -> vhdfs, jvhuwnd, vujcsg, oictp +taple (283) +fdojsjr (52) +sosqk (10) +rmvwkb (350) -> ffelpox, ftklgzk, fwxntdg +boifbq (1867) -> yscxlz, nijws, wnymiji +xdwuc (776) -> jhgxjnj, zdsyu, thufrr, gftjrqd, tgmtpht +xnhowa (70) +qxrnvvk (169) -> krvsaqc, uyvchvp +adxgp (18) +vsfhp (227) -> wnwzo, qslflr +jnyexah (834) -> dpqxwea, ckguaj, eqjoky, asxxcu +rzirj (24) +bqhfmb (11) +scwyfb (99) -> ctgjnch, nxbmvbe, mgklkfr, nozhmci +kwlqal (104) -> jhehhp, anhlx +aeppvjo (74) -> pouqokx, gmxfl +prwwpd (42) +zzuzfn (74) +rqgoz (201) -> jxovdlo, lmildeh +rgumam (96) -> fezzdc, vesqwkh, vzxaf, oztts +nouzec (15) +tqveqn (179) +bbpyckh (194) -> rrrrgbe, nyubyy +kpcorrf (51) +inhsin (26) +ixflbkx (812) -> afely, ikrsja, sjrmzwh, krrjt, zhclzz, iglop, bmnanm +crutxb (488) -> rblolc, iwvgg, kagubg, heqou, rhkgi +iacjli (48) +nescogt (38) -> oshhfb, ofkhwy, zdrtwa +jldua (19) +opttfsy (49) +vckfvm (100) -> svufvq, cpmuhnf +fodddp (73) -> znhkve, kbvepc +vbrhq (92) +wwhao (36) +zmnxzz (15) +eqhbool (269) -> rvfxkl, grosthd +gqejbh (44) +dzcfaed (40) +khebz (274) +qjhegw (84) +zmfwxre (72) +jlvppc (74) -> mlidg, xzvhic +furqyga (145) -> nssmfal, qaietz +qaietz (43) +lfbke (76) +fbbsb (24) +mxseaq (303) +oumbw (40) +vedrnbs (86) +zsfuc (671) -> hmgsla, chhab, csguji +ydzlkcn (47) +uppcjl (9128) -> nvgih, vjiqdn, nhrapmw +gxgvu (47) +wezzh (56) +npmifyp (54) +mloey (36) -> qvbyk, nqsgzg +oqihebu (51) +evnqnr (178) +nozhmci (69) +swojpec (21) +yjlokcq (49) +rmndp (18) -> srpftd, mebfx, olxrjth, iyeuk +ufzrbo (75) +hdhmvr (71) +hojzxhu (57) +eevkfzp (33) +lmildeh (6) +rsmfalh (43) -> ixeev, gwmkt +sleezka (36) -> sdfxsnj, weyts, jovejmr +cvwwx (77) +vwvpuxj (64) +rqvni (40) +yocxtug (922) -> ujvwff, tkmobkr, syhbs, bgacyt +ruayalk (89) +kbvepc (90) +codnc (8) +ovpoqt (55) -> ffwzbh, ntmbavi, lrzlckm, ptogh, boifbq, vdkwttr, dkuhniy +wbona (86) +vaedn (244) +pdrswn (65) +mqynznk (92) +dboryfe (263) +iwvgg (165) -> hxomy, xurtoj +kzuimi (110) -> yveusc, fkoaesc +vmldb (57) +kwnpdyr (74) +olxrjth (74) +cjvpndj (33) +zenhi (35) +dyxlbp (154) +hrbeox (13) +lieexcn (51) -> yyiiqr, uoyigbs, crqwarc, iacjli +xochdg (112) -> acgdfu, jrgndow +ffelpox (25) -> tplmdae, arowo +ukqajr (32) +tujzdkt (51) +pdvqv (72) +tftmhfs (75) +vjiqdn (1078) -> kuwbj, vckfvm, evnqnr +qyqir (79) -> vpfsdll, jmavf +brooyl (28) +ggkue (255) -> wtegiqv, gwrgur +zdrtwa (83) -> tezpif, txbdsy +wtenp (16) +xigac (52) +thgbcuu (65) -> fycbjfr, sdagro +aupbre (16) +eksxd (19) +gyzhdk (76) -> kdutnp, dhmnja, mfvta, jcbaauf +djjwlxc (99) +xacioc (56) +efylyde (80) +qomll (151) -> udydca, zhvyfkx +fycbjfr (60) +foqhhy (44) +znfjlz (94) -> lbvmy, ndhxim +djaamm (235) -> bxxpwa, pqjeof, itaxno +jxjrfer (213) -> olyrohd, iqyrubd +xbuysgv (6) +lkbpaz (124) -> wuoeas, ftudp +iysgr (586) -> lucoli, qnioy, ybhtg +ajncl (55) +mgklkfr (69) +yxjiuum (269) -> sokvf, squxpbv +jsyhr (472) -> swhkru, fkprqmd, ylwlpkw, uktdx, hhzarm +ocmqewc (7) +pddkiy (95) +bwifylg (32) +txrvdmv (65) +samoayn (10) +tijjvh (262) -> qwjcmlq, tggkndf +hgayc (155) -> zoviki, zewvip +sphbex (188) +sjrmzwh (26) -> qouck, ocezven, pvtnv +nyubyy (48) +xnyow (146) -> wfekg, opttfsy +gqrflb (99) +sudep (18) +rlngreu (93) +tymld (19) +kqieiv (77) +jyawoxq (73) +aeosriz (591) -> dhpgc, mgclfp, oivliv +nbdhcy (46) +tnbess (20) +rridhkb (84) +gzcqdt (67) -> dmohbhf, vgomsg +ckguaj (238) +cpxwsyb (13) +jfwbrfo (77) +mtvlfz (61) +ebptuar (9) +mfpxtom (128) -> xmwnu, rviwwhc +awxpkvm (75) +nupqbfq (227) -> crxfc, xcuzkj +craakno (119) -> ooiiqt, mfaftsr +jcbaauf (8) -> zvlise, takkclx, cvwwx, fnzocu +hvqdejm (202) +zftvgdy (170) -> swojpec, muuyp +rrrrgbe (48) +jswlnwo (23) +vfewf (77) +aqytxb (82) +njahbu (20) +jwahk (91) -> oxwpxqj, bqjqj +oztts (82) +ybijr (85) +zvernrt (104) -> vzdse, wrdaarz +oufye (39) +ltleg (808) -> vnlmjy, bscjk, uycjw, kzuimi, kwlqal, lahieha +cvewsdi (16) +yiitzs (62) +sverl (128) -> twxadm, iicum, efuepo +htipqs (55) +pbcywz (40) -> iwcqa, lhrdfkg +krmjp (123) -> avqmq, cstxcb +ltnnn (82) +eioql (1890) -> huutudx, azddjb +vwohcb (61) +aiiswrv (37) -> ydktfd, khxsoaa +srahmep (45) +yveusc (27) +exshg (10) +qgbdih (77) +gmhwcj (9) +nghznvw (31) +kewlet (44) +tvjrjqj (14) +pzths (18) +wojzq (34) +hcnocre (12) +jowbyue (37) +vwske (94) +khxsoaa (88) +nxbmvbe (69) +cydve (166) -> uruco, qryxc +wpyem (59) -> tnbjq, aexqgs, narpa +safph (102) -> eaggakx, qvyaen, dcbopj +ekchuez (76) +nsyqlu (56) +cosbycn (13) +xxylgr (46) +kurvox (73) +iicum (45) +rkcdvt (65) -> ozolfes, dystb, jsaksiq, taple +qfyzmmx (70) +xzhabw (69) +cnvgrhz (10) +emxhh (97) -> hnfwgag, ddzekr, rngyvds +zgcmic (1164) -> hvqdejm, nczcs, gpshsuk +nomegvq (31) +kvgcvel (6512) -> bnluwnh, eduzwi, ehjakg, atquwvk +gftkh (77) +odwmuu (16) +bqldhq (51) +awbgrbu (41) -> vuqpnz, xsnbmt +ccsqmpv (38) +vxzcqpq (4742) -> yciltsr, ohjniy, vrppcq, rleprim, anpriwx, furqyga, waunp +dcbopj (50) +tznxngl (90) +dhmnja (144) -> jgbgjbe, lwespc +awwywgr (145) -> lfijt, oqmjin +alvmkwx (47) +arowo (60) +knvukf (311) -> jnczao, xgkduuc, odwmuu +ffwzbh (90) -> jsthfix, vglnwmg, ggkue, khbylqn, xxwarr, qxrnvvk, djaamm +yygabb (84) +nssmfal (43) +klcixar (191) -> hkrkkvv, ezzht +szosumk (1834) -> ocpzwk, evlze, oqtjh +chhab (285) -> kzzzjj, swavc +incqze (274) +krrjt (101) -> pzprcdg, hgusv +xpxwgaq (36) +udydca (56) +lucdp (85) -> nebobeh, tccwm, vsfhp, okczka, klcixar, aenkx +ogrcxm (12) +tovvd (13) +btjjjxw (95) -> kwhjz, jmlnsj +utnhs (42) +xhzrq (8) -> eevkfzp, ajkkb +utoegrc (17) +gzttehr (33) +iypfs (49) +xihwd (52) +tkmobkr (62) -> eazsmg, tftmhfs +dtyaw (13) +yljnodb (62) -> iugub, xnyow, vaedn, gctjzc, rthbso, inkttc, zwaygv +mydomlh (96) -> sverl, qomll, dboryfe, ytiaiv, metlwn, vrlwo +nybkt (51) +jlrun (23) +ehjakg (726) -> axzjpa, jpuqyc, fodddp +yinrfyl (11) +qwdhug (197) +axklth (79) +lnwutyi (4943) -> islwhh, evjspos, lkbpaz, pbcywz, djoxie, wcyrbc +khcau (90) -> fkttvdm, vvbshe +xgqtx (184) -> kbrdsqg, bktqd +xgkduuc (16) +tpdaf (49) -> drukt, dvdnlr +wdhjt (44) +swakad (43) +ibvgkc (281) +fkttvdm (59) +ptogh (1126) -> yvidh, lsyuq, uvxcv +jeacolj (59) +xtcpdsl (36) +inkwv (92) +dqslnjk (31) +mqwndjo (1703) -> uojfba, lxpdska +vkyped (74) +pmhvbof (934) -> uysnnym, nhaxbnh, ufxskgv, thgbcuu +fhrui (105) -> eyhbm, srahmep +jpdvph (75) +sialf (19) +pnuluh (42) +tlcfxef (47) +niniqlk (12) +xxwarr (217) -> scpjvm, gwxeoes +ktcfyc (75) +qvyaen (50) +ssmfscq (42) +nfyjqfo (73) +rqglm (78) -> buoykr, fhyhg, wralkrd, efxmb +jznvixs (51) +uoyigbs (48) +bmatbfz (44) -> vqezl, yiuyo +zfavx (33) -> vpqmyx, bmaynas +exqsvn (16) +pbthb (64) -> abqvi, pfeewo, iuosq, nvpon, iujrwvw, zskbac, cgrcmg +ndkmiz (79) +wkvcgtu (7) +obnnecx (60) -> yuqqx, jpqcyh +ajkkb (33) +xookni (17) -> sziei, fnxtff +vgjtzi (55) +vdkwttr (947) -> xgqtx, hbvvpki, iprpx, wjboxd +kbrdsqg (38) +ixndjgk (100) -> surfn, njvmjgm +mgxfso (148) -> wxmyjrh, bwifylg +mexsmgu (40) +uemcawn (7) +rauprc (9) +zhclzz (179) -> affmx, nohqdkf +uhggwqa (19) -> iqbde, ybijr, zmizid +sjnpi (90) +wkjpw (50) -> ecconsw, vprox +oqmjin (26) +uysnnym (131) -> hygxqrs, memzmo +qpeztu (47) +tvuov (75) +xydikn (70) +ftklgzk (145) +fyynvhy (72) +odguqiy (46) +sccddm (86) +trvwm (47) +agsdkbw (30) +hxomy (80) +fwupt (74) +hbbkfas (40) +jsaksiq (117) -> fxbhth, wovwg +lmcqa (9) +hlxwud (42) +cgewz (64) +xtjals (13) +rpyji (1036) -> qbhev, feeksc, cjfnt, bkeqil, rkjfzl, nnqrj +dgsalqk (93) +islwhh (68) -> rridhkb, yygabb +ujvwff (94) -> uozuk, jeacolj +ieqvf (86) +cnsxofp (67) +crqwarc (48) +pzprcdg (78) +nvgih (1516) -> waneo, fesmk, qlzywpm, jdvsc +jgbgjbe (86) +rdqisk (68) +dzsjhs (1026) -> vvyizmq, iqdna, yvpxb +jnczao (16) +xiita (91) -> kwgmma, fhjnytd +ntmbavi (1078) -> mxseaq, fomagh, fdtmx +yrgxyez (108) -> ndczjq, cvewsdi, wtenp, exqsvn +ydrdiyq (7) -> peubkss, mricpy, bqwljb +fwlhy (20) -> vghgf, ecyxemp, crutxb +wqlrw (13) +iwkhee (25) -> vlnnmg, owsotek +bummi (9) +kcuhnx (116) -> djjwlxc, ikqttp +gcnhj (30) +gctjzc (64) -> hzkfzz, wwjqcpu +tplmdae (60) +cfzstl (86) +xvxrg (13) +bmxcqpu (6) -> ktcfyc, tvuov +sgjinm (49) +kimpf (145) -> tnbess, njahbu +jryikzp (84) +pjtzjkm (38) +lucoli (226) -> avgopx, lsjnlpy +gruqu (32) +vqglff (264) -> emxhh, yaxgb, tvzcg +ukixq (76) +wcqxiv (50) +quomvk (52) -> fwxkh, cgewz +pgcvs (65) +mchtb (153) -> jxpmi, hcfgsnr +wuoeas (56) +dmwzg (46) +hmgsla (145) -> odnfifx, btsfhej +efuepo (45) +zfkiukq (66) +ficpk (271) -> foqhhy, bdgldyi +pqqqof (39) +nnsaju (22) +ruqgy (306) -> oezxnl, kqxpxlx +fhhqd (60) -> alvmkwx, ydzlkcn +yvidh (127) -> kcitnaj, dmtlzbj +wnymiji (40) +hcfgsnr (45) +abqvi (480) -> zvernrt, obrdxor, wmnengd +uduzaf (32) +ytiaiv (122) -> tlcfxef, nrkxpd, gihgnqc +xoakdt (84) +tgmtpht (107) -> quaqp, tnyhegn, vjtyvg, llfxe +vzdse (77) +neisr (97) -> ukqajr, uduzaf, melui, gzxumn +tjfhwma (195) +lndzbn (48) -> rgnxext, xacioc, hhunwd, nsyqlu +zwaygv (90) -> gftkh, wtlmura +ndpsefd (24) +yvfkur (97) +uwcgpwx (10) +neshq (58) +axzjpa (153) -> kkgpo, wcqxiv +dhfiwjb (13) +sampa (10) +yvupc (86) -> jznvixs, tujzdkt +nhaxbnh (185) +mjeja (53) +iprpx (150) -> rhaqwc, pyulzo +wcyrbc (204) -> codnc, fcfhlc, vejds, rzpph +uqsrhrf (164) -> sulpwi, utoegrc +cvuaf (56) +eaugk (14) +xcuzkj (8) +pifqyxs (115) -> vwhmf, npmifyp +sbknkwh (82) +peubkss (75) +hakzty (81) +llgxywa (11) +qesfmt (74) +lsjnlpy (87) +efoouqi (104) -> bfejcbh, xihwd +jevck (156) -> sntwas, uijfe +buoykr (75) +xdpxpu (65117) -> zsfuc, litns, cslci +lwvclga (28) +yutvqn (225) -> xvxrg, zkjjvwh +jmavf (93) +cjfnt (737) -> nozlte, zvfxidm, sphbex +qunku (1662) -> xpxwgaq, krepomq, ycihhx +ikrsja (113) -> haxfzky, pdvqv +uojfba (94) +wfrqy (23) -> zwhpl, ozyvo, ruayalk +vedjm (51) +sdagro (60) +bktqd (38) +ooiiqt (34) +qijqu (88) +qtrappj (78) +jbbvph (369) -> avcuzkv, uqmdsne +vdujht (57) +owsotek (94) +qfcknc (97) +gbdida (46) +mjbmx (76) +uozuk (59) +cgemz (70) +ahjpc (43) +fmpkb (47) +jmdype (203) -> rgujeec, raezxi +sbgpr (287) -> fdyit, gruqu +ksphb (40) +mricpy (75) +peclf (84) +jeqxuvl (28) +fcoaxeb (628) -> uhgqfua, ddljunb, mgxfso +oshhfb (87) -> zfzli, hakzty +nnwxxk (64) -> rlngreu, dgsalqk +onzxd (46) +uijfe (21) +rlsynsa (63) -> qegjm, rogrsp +hfqskw (125) -> pqqqof, gleaooi, oufye +otise (6) +fdyit (32) +cptpfpd (65) +djoxie (52) -> vbrhq, akffhfg +xvkhbq (90) +gzxumn (32) +avqmq (31) +vyzfw (5391) -> hfqskw, wkjpw, gyifp, nqvbxx +lqdvwk (70) +ddzekr (54) +fdnmqri (29) -> afucrtw, gpium, pcissqn, hgayc, satrfh, rlsynsa, yutvqn +jioqtp (14) +cianrio (216) -> blhjjx, sdeecr +azlnl (73) +qnhgur (26) +mfvta (246) -> gxasczp, ayuwttz +njvmjgm (36) +utbrib (42) +mxhxyj (29) +yiuyo (64) +ayrojfl (46) +jakjzay (176) -> vrqga, dsugcog +fiwwr (11) +klnhysy (28) +zyzwas (174) -> xtjals, dtyaw +gleaooi (39) +hznrevv (77) +oceimpw (106) -> rxulpe, dtpzna +iqhrmo (63) +hhzarm (25) -> mexsmgu, bxqfge, oumbw +hygxqrs (27) +iqbde (85) +hgusv (78) +xrglp (958) -> odugb, ktbxbnn, vxpjfrf, xbegaua, nmtme +bmivh (103) -> gcnhj, wpmpzel, agsdkbw, quqdh +isgef (31) +dptakt (33) +wzwey (29) +yvngku (9809) -> fhsmlky, wdtrk, wpyem +gwmkt (77) +vrqga (18) +gcenos (90) +luzjos (161) -> wurmmqn, jioqtp, rpkaem, tvjrjqj +kcewvb (11) +pexst (46) +odanj (40) +nrslon (76) -> nczno, zfkiukq, yapxbpt +dmdgesa (92) +melui (32) +sokvf (41) +omupor (99) +tggkndf (5) +gtuoq (28) +czondc (13) +nrkxpd (47) +vwipyfi (44) +uhgqfua (106) -> tzvnssx, dqjxyyd +fvqwcn (868) -> gjdquua, pwaugpr, ncdavn +kmjzj (97) +zbicwki (7) +nrdcpk (44) +nnutid (21) +vesqwkh (82) +rhaqwc (55) +fyuwn (118) -> jsylrrl, qpnyq +wfekg (49) +mlidg (30) +vrfek (33) -> nlgewi, hlsch, szosumk, ixflbkx, ggmjg +tvzcg (171) -> nrdcpk, kewlet +segwmpm (255) -> fdojsjr, xigac +vllsfc (9) +donhvzg (77) +nczcs (170) -> noaiz, aupbre +pouqokx (88) +afucrtw (119) -> fajcjs, gsuxkc +nawvci (10) +temwow (75) +aceweuo (52) +fcfhlc (8) +gypqe (6) +ndczjq (16) +bmaynas (76) +kuwbj (68) -> vgjtzi, eovjzwr +ggsdtdp (12) +yaxgb (105) -> hznrevv, qgbdih +vxbdi (77) +gihgnqc (47) +fultd (86) +tezpif (83) +sudwjj (92) +fnihd (92) +dmneolr (6) +ighxxvd (88) +yshkxu (24) +vxaqay (23) -> qgmtntw, mjofjlf, sbknkwh, rwzme +lhrdfkg (98) +oarrrpk (22) +lxpdska (94) +yyiiqr (48) +sdsyt (225) -> ywtsd, iqhrmo +nkxpqbc (336) -> dukpbd, vwipyfi +weyts (40) +gmsbmq (378) +akffhfg (92) +odoffm (78) -> jpdvph, temwow +cgrcmg (1214) -> hnaps, sosqk, fierzfm, sampa +dyfyibk (76) -> cptpfpd, txrvdmv, pdrswn, ixfyyyz +awrwywl (4435) -> brjneo, nsqlbvb, vrfek, hxdrc, wfqul +jxpmi (45) +unxgbyg (41) -> azlnl, sqkae +lwespc (86) +udpuj (63) +cugwenm (82) -> qnhgur, inhsin +vzxaf (82) +fkajvpp (75) +vpqmyx (76) +mifct (46) +nozlte (188) +vfgkz (57) +rhkgi (257) -> wojzq, brvlzkw +ufxskgv (61) -> pxsdzax, cndzkwl +jmlnsj (64) +dcbsi (56) +pqyjyl (15) +fwxntdg (15) -> pgcvs, qekneh +mgclfp (77) -> ndkmiz, xvjuf, axklth, jgbce +zvfxidm (64) -> slxrrx, fiwcv +gynpo (175) -> eksxd, mbcxw +fwxkh (64) +tnbjq (252) -> qxtfl, llgxywa +nppone (40) +qxtfl (11) +fkprqmd (41) -> aceweuo, juxbbz +wiadoyw (285) -> kfmqmy, invtlwg +vyyye (70) +crxfc (8) +qrsyoj (33) +rgujeec (74) +bfejcbh (52) +oybkcy (33) +cslci (16) -> cydve, kcuhnx, crxcdnk, phkuv, rmndp +xsewp (57) +xupjwd (62) -> zgcmic, yocxtug, aeosriz, yljnodb, urwawsz, qunku, dzsjhs +uuziu (21) +twhkffp (46) +avcuzkv (20) +wjnoks (112) -> tzyexd, pzhayls +palqz (70) +hvnmuj (80) -> mifct, xxylgr +dmroo (197) -> itkyzhq, nomegvq, lszwjv +tptvyz (31) +uqmdsne (20) +ecconsw (96) +vejin (36) +czxsvq (30) -> gqrflb, kywdy +llfxe (29) +veokoh (687) -> yrgxyez, bmatbfz, hvnmuj, fclal, diauot, sgonpal, ixndjgk +urwawsz (1059) -> hoqzhm, awbgrbu, uxfnv +evjeyvt (563) -> ikwre, xhzrq, jfikyhd +kyziqis (180) +sdfxsnj (40) +yrrhqap (46) +tccwm (43) -> qswzv, iayecc, cfzstl +twxadm (45) +rzpph (8) +kzzzjj (10) +xzvhic (30) +qekneh (65) +cltcdp (170) -> tymld, jldua +vejds (8) +qzlzlwd (98) +ylwlpkw (115) -> utrhfs, cnvgrhz, exshg +qxfvj (93) +ywtsd (63) +hxoswpm (32) -> fwupt, qesfmt +ayocum (95) +vwueokp (96) -> xeoeht, cnsxofp +gwrgur (8) +cndzkwl (62) +diauot (100) -> rzirj, ndpsefd, atusqwd +cdogip (355) -> cosbycn, dhfiwjb, czondc +feeksc (29) -> dkolh, nkxpqbc, rgumam +rgnxext (56) +jpuqyc (22) -> ueefesu, donhvzg, prubmmc +vygkoys (18) +lruhxda (93) +bdeol (112) -> ckqlnc, uhiwblp, phwnp +ctldb (99) +ovyleaj (10) +fiwcv (62) +sulpwi (17) +dcaxloo (7979) -> blslvmm, pqozwy, rkcdvt, csmkbgh, jsyhr +ipllhv (148) -> sopkpcj, utbrib +vuqpnz (98) +emtol (26) -> oqihebu, gverkkt, dytqamx, xzkuda +jhehhp (30) +txbdsy (83) +sdeecr (81) +fnxtff (81) +mryloc (12) +nvpon (246) -> iagud, mdpooc, dyfyibk +iagud (256) -> atazf, ksphb +lpsufo (14) +qmczi (64) +dmraxdz (49) +ahnofa (7) -> xdpxpu, uewmev, awrwywl, hwezjo, qqqxyrl, luralcy +oyuzm (77) +jqsfxta (99) +kfmqmy (33) +ucapi (21) +eirbxu (92) +pmvbbt (50) -> hrgtmp, faszmg +phkuv (204) -> ajncl, htipqs +hzkfzz (90) +uycjw (66) -> dmraxdz, yjlokcq +pqozwy (345) -> aiiswrv, gynpo, iwkhee, rqgoz +mjjkr (32) +inkttc (205) -> hrbeox, wqlrw, cpxwsyb +oytgp (37) +bnluwnh (93) -> ipllhv, vpfbm, dftmlo, dbibp, akgkxvi, ydrdiyq +itkyzhq (31) +oivliv (363) -> nouzec, zmnxzz +lwiyyiu (86) +polzw (12) +hlsch (98) -> ficpk, nignkea, ramkjx, jxjrfer, untjkhr, mzqmah, eibsqe +yapxbpt (66) +vvyizmq (74) -> fcpeviq, kygcd, neshq +wdtrk (413) -> fyuwn, sleezka, pmvbbt +ilfgjk (76) +jplusbc (11) +tzvnssx (53) +ftdjg (44) +zlgdgn (522) -> onxwvpl, dqbrxb, mnsxmc +ayuwttz (35) +gftjrqd (211) -> xbuysgv, kzlpr +xdfuik (10) +npirsdf (84) +bqwljb (75) +fbcqhv (70) +wxmyjrh (32) +gpium (109) -> nwzzgtf, hdhmvr +tjjfh (25) +vpqyy (12) +gvqylt (56) +qjwrvpi (92) +crreuak (24) +oqtjh (15) -> pxjuos, qynhr, qqubd, lyzzn +frqrk (55) +fhzzvtv (37) +ycalpp (84) +paofmv (78) +fridz (31) +uyvchvp (51) +fncqp (66) +zynkd (70) +ixfyyyz (65) +tvbtw (25) +rbxfyau (12) +fclal (106) -> oybkcy, socihs +ggmjg (1823) -> ubcdd, rsmfalh, qwdhug, awwywgr +nnqrj (176) -> ozikd, fewkvyo, scwyfb +crxpsq (44) +gqvxml (200) +zkjjvwh (13) +evjspos (180) -> gtuoq, klnhysy +swavc (10) +gpshsuk (80) -> mtvlfz, wzoauoj +metlwn (233) -> samoayn, ovyleaj, uwcgpwx +wmnengd (104) -> vxbdi, kqieiv +zwgerw (44) +ygbuuxe (709) -> zfavx, krmjp, kimpf +cejbp (50) +hoqzhm (9) -> lfbke, ukixq, mjbmx +hhunwd (56) +efxdvtm (11) +vpfbm (64) -> peclf, qjhegw +kwgmma (95) +vlzkx (31) -> nxualql, vkyped +dbibp (160) -> xtcpdsl, iiozto +qqvlmd (99) +khbylqn (19) -> alvsbd, jryikzp, wpqqze +wjncmeh (36) +satrfh (133) -> mufdsrz, chdtaz +akmzxzw (46) +nqdcbhp (22) +ozkdsot (99) +efxmb (75) +qegjm (94) +ukmzkes (97) +uhiwblp (14) +sziei (81) +ncdavn (112) -> frqulg, xdfuik +xobzucu (22) +vglnwmg (251) -> zmmfuq, nawvci +fhgujr (317) -> ayrojfl, pexst +bfekpxz (359) +wtegiqv (8) +scpjvm (27) +obrdxor (74) -> sudwjj, eirbxu +vjtyvg (29) +ikqttp (99) +kysjzj (67) +thufrr (51) -> sccddm, orlxs +bdgldyi (44) +dffdie (786) -> nnwxxk, aeppvjo, wdzqhs, hogtrz +tnyhegn (29) +nmtme (22) -> pgodqz, qjwrvpi +gdiqocb (34) -> lxnip, vwohcb +nbenm (56) -> fyynvhy, zmfwxre +dqbrxb (110) -> lxckefh, lhvil, uuziu +qftepgn (70) +fhsmlky (38) -> nhjbg, xiita, eqhbool +osgijzx (7268) -> mydomlh, hckgf, tzgsm, pmhvbof +jfwcwqn (84) +ozyvo (89) +onjzq (85) -> zynkd, vyyye +erwjvd (1820) -> nqcfsr, kpjmq, jvjlfb +untjkhr (311) -> yshkxu, anlre +afely (164) -> isgef, vlucb, fridz +ctgjnch (69) +wrdaarz (77) +vgomsg (56) +bscjk (66) -> pplqbii, sgjinm +brjneo (1742) -> lucdp, lkhka, xdwuc, ixdllwp, veokoh, mqwndjo +squxpbv (41) +ezzht (55) +lahieha (20) -> hfcotwm, vejin, ohsjl, nsrpwww +wfqul (1160) -> erwjvd, eioql, rcfkr, xrglp, lyetyd, fjgzrim +jynanod (545) -> qyqir, vxfoyx, bjhhjla +msokpnb (7) +sgonpal (60) -> dcbsi, cvuaf +dytqamx (51) +xqscl (37) +fewkvyo (325) -> tvbtw, tjjfh +ecstxkl (78) +bxqfge (40) +vmhyd (75) +fomagh (11) -> zzrttv, nfyjqfo, jyawoxq, kurvox +orlxs (86) +viwzkp (40) +lbvmy (59) +avgopx (87) +abwhrjo (99) +qynhr (61) +lyzzn (61) +ozikd (333) -> hkckef, xorzt +pyulzo (55) +wjboxd (14) -> qlmptj, iyvjjg, kewmzq +fnzocu (77) +kcitnaj (80) +akgkxvi (148) -> prwwpd, bskqnj +vrppcq (51) -> gcenos, xvkhbq +njvbqvi (75) +zoviki (48) +vlucb (31) +jpqcyh (70) +dgjzv (46) +nqvbxx (224) -> wrmngqs, kcjcpk +sewnmby (40) +atusqwd (24) +odugb (142) -> mjjkr, qdqphk +zlyxnww (62) +wtlmura (77) +dftmlo (127) -> qugbhqd, pehkkzk, zenhi +lfijt (26) +lkqqjqh (76) +jzocbg (80) +csguji (8) -> kralmj, ozkdsot, ctldb +ixqkcbm (18) +nlgewi (1927) -> czxsvq, mloey, odoffm +wralkrd (75) +dketeda (574) -> vwueokp, emtol, wjnoks +kagubg (45) -> xydikn, qftepgn, qhdtqi, jbqnyve +kdutnp (304) -> dmneolr, acrhuro +jtwov (9) +tzyexd (59) +frqulg (10) +grlbob (92) +qmbfra (214) -> njmpeyi, hwnasq +fcpeviq (58) +qqqxyrl (31721) -> ogyypi, hercuw, lnwutyi, vxzcqpq, fwlhy, vyzfw +iujrwvw (1047) -> kyoypr, cxtxnm, xzhabw +wzoauoj (61) +fdtmx (135) -> kczko, npirsdf +sntwas (21) +oegamc (55) -> xnhowa, tfpsrke +cxtxnm (69) +hogtrz (214) -> niniqlk, ahbxz, npkqfq +hrgtmp (53) +vonee (215) -> vakapy, fbshzlu, neisr, xdqma, onjzq +nsrpwww (36) +ofkhwy (97) -> ilfgjk, lkqqjqh +ddljunb (58) -> oyuzm, jfwbrfo +jbpwoh (195) +fjgzrim (1337) -> luzjos, imruiet, qsdrdp +kkgpo (50) +ygono (78) +sopkpcj (42) +fxbhth (83) +rvfxkl (6) +dahvvo (23) +memzmo (27) +gfyvv (29) -> kmjzj, yvfkur +fnodwc (7) +alvsbd (84) +evlze (167) -> gbdida, dgjzv +ikves (54) -> ukmzkes, rkjdd +lhvil (21) +gxasczp (35) +jdvsc (24) +mimilpa (106) -> obpwxg, ocmqewc, zbicwki, msokpnb +nignkea (253) -> mvavmml, mjeja +rkjdd (97) +bskqnj (42) +anoxy (66) +noaiz (16) +yvpxb (206) -> ucapi, nnutid +cbcxlyo (50) +tbyfd (23) +aenkx (301) +pqgnd (44) +nsqlbvb (10733) -> evjeyvt, nescogt, rmvwkb +zkljkp (58) -> ayocum, pddkiy +wzinm (55) +bkeqil (119) -> qmoorx, cdogip, csiof +rngyvds (54) +jhgxjnj (223) +xmsfn (8) -> vedrnbs, gynzo +grosthd (6) +kieip (84) +qwcyeqz (33) +imruiet (37) -> tznxngl, sjnpi +pgodqz (92) +rmvhy (99) +eqnowu (31) +ramkjx (337) -> bqhfmb, efxdvtm +ndhxim (59) +jwyhe (582) -> tjfhwma, nshgykp, sdxlyd, vtnfaa, oegamc, jbpwoh, fhrui +bjhhjla (171) -> fmpkb, qpeztu +nyfutww (54) -> rmvhy, jqsfxta +gjdquua (52) -> rqvni, viwzkp +huutudx (49) +ueefesu (77) +invtlwg (33) +oyvsrsc (106) -> inkwv, fnihd +lxnip (61) +prvai (182) -> stvon, hhumkf +ogyypi (3236) -> sbgug, zlgdgn, vqglff +vujcsg (50) +dhktab (56) -> ygono, qtrappj +ckqlnc (14) +jrovat (168) -> tptvyz, eqnowu +mjofjlf (82) +vghgf (7) -> wiadoyw, sbgpr, jmdype, sdsyt, yxjiuum, vxaqay +lszwjv (31) +hbvvpki (166) -> gxgvu, trvwm +dzvsp (44) +pplqbii (49) +ovpmj (82) +bgwlsu (92) +yrudth (15) +txrejp (49) +wsclc (73) +oezxnl (57) +swhkru (43) -> nybkt, vedjm +kralmj (99) +girvl (43) +yciltsr (73) -> xyoatzj, bcmep +quqdh (30) +qmoorx (58) -> lwuwrp, czrmixj, ycalpp, jfwcwqn +hnaps (10) +gdhnu (194) -> hbbkfas, dzcfaed +xadrr (92) -> gqejbh, zwgerw +gyifp (114) -> vwvpuxj, qmczi +ecyxemp (1270) -> ibvgkc, ericb, zeitsku +anhlx (30) +wxyel (49) +svufvq (39) +lkhka (1423) -> aemfgyt, gdiqocb, bmxcqpu +acrhuro (6) +uriolfn (44) +nczno (66) +fezzdc (82) +mzqmah (83) -> mqynznk, fqevwyy, cbldohy +ftmwpqg (39) -> zzuzfn, gwhfv +ozmbhy (862) -> cugwenm, mimilpa, jlvppc +eiisyk (31) +stvon (35) +pehkkzk (35) +lusiwnm (66) +raezxi (74) +ericb (127) -> xogkc, vfewf +dhpgc (393) +wxloqgs (223) +hwnasq (17) +fkoaesc (27) +zfzli (81) +gewtd (59) -> bojkbqr, njvbqvi, nmgme, awxpkvm +nqcfsr (56) +lvmyjp (33) +waunp (119) -> wezzh, gvqylt +xmwnu (40) +uvxcv (91) -> txrejp, wxyel, iypfs, wbbfc +liyxgoa (130) -> mxhxyj, wzwey +okczka (105) -> mmsesaw, qzlzlwd +qdqphk (32) +jbmccc (34) -> fbbsb, crreuak +wprzdkf (37) -> jbbvph, fhgujr, zcubrms +fajcjs (66) +dsugcog (18) +xogkc (77) +mufdsrz (59) +ubcdd (197) +nqsgzg (96) +nshgykp (129) -> lvmyjp, cjvpndj +qlzywpm (24) +kewmzq (82) +nijws (40) +prubmmc (77) +mdpooc (250) -> swakad, girvl +rwzme (82) +bmnanm (173) -> pnuluh, hlxwud +vprox (96) +yuqqx (70) +iglop (89) -> xoakdt, kieip +pwaugpr (6) -> utnhs, xjqta, ssmfscq +iyvjjg (82) +zvlise (77) +vtnfaa (43) -> ekchuez, gwtsp +iiozto (36) +hhumkf (35) +etzfe (18) +bsmwi (57) +xzkuda (51) +zprpamt (50) +zeitsku (71) -> qfyzmmx, cgemz, kqaox +vvbshe (59) +nxualql (74) +srpftd (74) +gwxeoes (27) +gynzo (86) +wnwzo (37) diff --git a/2017/07/src/main.rs b/2017/07/src/main.rs new file mode 100644 index 0000000..8c99608 --- /dev/null +++ b/2017/07/src/main.rs @@ -0,0 +1,197 @@ +use std::io::{self, Read}; + + +mod parser { + pub type Program<'a> = (&'a str, i64, Vec<&'a str>); + + + #[derive(Clone, Copy)] + enum State { + Name, + PreWeight, + Weight(usize), + PreAbove, + Above(usize), + } + + + pub fn from_str(input: &str) -> Program { + let mut name = None; + let mut weight = None; + let mut above = Vec::new(); + + let mut state = State::Name; + + for (i, c) in input.chars().enumerate() { + match (state, c) { + (State::Name, ' ') => { + name = Some(&input[0..i]); + state = State::PreWeight; + } + + (State::PreWeight, '(') => { + state = State::Weight(i + 1); + } + + (State::Weight(start), ')') => { + weight = input[start..i].parse::().ok(); + state = State::PreAbove; + } + + (State::PreAbove, 'a'...'z') => { + state = State::Above(i); + } + + (State::Above(start), ',') => { + above.push(&input[start..i]); + state = State::PreAbove; + } + + _ => (), + } + } + + if let State::Above(start) = state { + above.push(&input[start..input.len()]); + } + + (name.unwrap(), weight.unwrap(), above) + } +} + +mod tree { + use std::collections::{HashMap, VecDeque}; + + use parser::Program; + + + pub type Tree<'a> = HashMap<&'a str, Info<'a>>; + + + #[derive(Debug)] + pub struct Info<'a> { + weight: i64, + above: Tree<'a>, + } + + + pub fn build(programs: Vec) -> Tree { + let mut tree = Tree::new(); + + let mut temp = VecDeque::new(); + + for (name, weight, above) in programs { + if above.is_empty() { + tree.insert( + name, + Info { + weight: weight, + above: Tree::new(), + }, + ); + } else { + temp.push_back((name, weight, above)); + } + } + + while let Some((name, weight, above)) = temp.pop_front() { + if above + .iter() + .any(|name_above| !tree.contains_key(name_above)) + { + temp.push_back((name, weight, above)); + + continue; + } + + let info = Info { + weight: weight, + above: above + .into_iter() + .map(|name_above| (name_above, tree.remove(name_above).unwrap())) + .collect::(), + }; + + tree.insert(name, info); + } + + tree + } + + pub fn stacker(name: &str, root: &Info, level: usize) -> i64 { + if root.above.is_empty() { + root.weight + } else { + let mut total = 0; + let mut map = HashMap::new(); + + for (name, stack) in &root.above { + let weight = stacker(name, stack, level + 1); + + total += weight; + + map.entry(weight).or_insert_with(Vec::new).push(name); + } + + if map.len() > 1 { + let (wrong, correct) = + map.iter() + .fold((0, 0), |(wrong, correct), (weight, programs)| { + if programs.len() == 1 { + (*weight, correct) + } else { + (wrong, *weight) + } + }); + + let mut weight = root.above[map[&wrong][0]].weight; + + weight += correct - wrong; + + println!("{}: {} weight should be {}", level, name, weight); + } + + root.weight + total + } + } + +} + + +fn main() { + let mut input = String::new(); + + io::stdin() + .read_to_string(&mut input) + .expect("failed to read input"); + + let programs = input + .lines() + .filter(|line| !line.is_empty()) + .map(parser::from_str) + .collect::>(); + + let tree = tree::build(programs); + + let root = tree.keys().nth(0).unwrap(); + + println!("part_one={:?}", root); + println!("part_two:"); + + tree::stacker(root, &tree[root], 0); +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_parse() { + assert_eq!(parser::from_str("pbga (66)"), ("pbga", 66, vec![])); + assert_eq!( + parser::from_str("fwft (72) -> ktlj, cntj, xhth"), + ("fwft", 72, vec!["ktlj", "cntj", "xhth"]) + ); + } +}