Mercurial > lbo > hg > aoc22
changeset 34:6f2c271c91da
Clean-up day 01
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Sat, 02 Dec 2023 13:53:44 +0100 |
parents | 00f7efc7934e |
children | e66716229c5e |
files | 2023/aoc23/.ocamlformat 2023/aoc23/aoc23.opam 2023/aoc23/bin/day01.ml 2023/aoc23/bin/dune 2023/aoc23/bin/main.ml 2023/aoc23/day01.ml 2023/aoc23/dune 2023/aoc23/dune-project 2023/aoc23/lib/dune 2023/aoc23/test/aoc23.ml 2023/aoc23/test/dune 2023/day01.ml 2023/input/01.txt |
diffstat | 11 files changed, 1195 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2023/aoc23/aoc23.opam Sat Dec 02 13:53:44 2023 +0100 @@ -0,0 +1,34 @@ +# This file is generated by dune, edit dune-project instead +opam-version: "2.0" +synopsis: "A short synopsis" +description: "A longer description" +maintainer: ["Maintainer Name"] +authors: ["Author Name"] +license: "LICENSE" +tags: ["topics" "to describe" "your" "project"] +homepage: "https://github.com/username/reponame" +doc: "https://url/to/documentation" +bug-reports: "https://github.com/username/reponame/issues" +depends: [ + "ocaml" + "dune" {>= "3.10"} + "base" + "core" + "stdio" + "odoc" {with-doc} +] +build: [ + ["dune" "subst"] {dev} + [ + "dune" + "build" + "-p" + name + "-j" + jobs + "@install" + "@runtest" {with-test} + "@doc" {with-doc} + ] +] +dev-repo: "git+https://github.com/username/reponame.git"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2023/aoc23/bin/day01.ml Sat Dec 02 13:53:44 2023 +0100 @@ -0,0 +1,1 @@ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2023/aoc23/bin/dune Sat Dec 02 13:53:44 2023 +0100 @@ -0,0 +1,5 @@ +(executable + (public_name aoc23) + (name main) + (libraries aoc23)) +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2023/aoc23/bin/main.ml Sat Dec 02 13:53:44 2023 +0100 @@ -0,0 +1,1 @@ +let () = print_endline "Hello, World!"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2023/aoc23/day01.ml Sat Dec 02 13:53:44 2023 +0100 @@ -0,0 +1,111 @@ +open Stdio +open Base + +let input () = In_channel.stdin + +(* Part 1 *) +module Part1 = struct + let calibration_value_of_string s = + let digits = String.filter s ~f:Char.is_digit in + let first, last = (String.prefix digits 1, String.suffix digits 1) in + Int.of_string (String.concat [ first; last ]) + + let process ch = + let f lines line = calibration_value_of_string line :: lines in + List.rev @@ In_channel.fold_lines ch ~init:[] ~f + + let _part1 () = + let r = process (input ()) in + Out_channel.printf "%d\n" (List.fold ~init:0 ~f:( + ) r) +end + +(* Part 2 *) + +module Part2 = struct + let folder ix acc x : (int * int) option = + match (ix, acc, x) with + | ix, None, d -> + let i = Int.of_string_opt (String.of_char d) in + Option.map i ~f:(fun i -> (ix, i)) + | _, Some d, _ -> Some d + + (* Return the (index, value) of the first digit in the string *) + let find_first_digit s = String.foldi ~init:None ~f:folder s + + (* Return the (index, value) of the last digit in the string *) + let find_last_digit s : (int * int) option = + let%map.Option ix, v = find_first_digit (String.rev s) in + (String.length s - ix - 1, v) + + let digits = + [ + (1, "one"); + (2, "two"); + (3, "three"); + (4, "four"); + (5, "five"); + (6, "six"); + (7, "seven"); + (8, "eight"); + (9, "nine"); + ] + + (* generate a counting sequence *) + let count_seq (from : int) (upto : int) : int Sequence.t = + let f c = + if Int.equal c upto then None + else Some (c, if upto > from then c + 1 else c - 1) + in + Sequence.unfold ~init:from ~f + + (* try to find number string `number` with value `value` in string `s`, from the beginning if `fwd`. *) + let find_number ~fwd s value number : int option * int = + let ixs = + if fwd then count_seq 0 (String.length s) + else count_seq (String.length s - 1) 0 + in + let check pos = String.is_substring_at s ~pos ~substring:number in + (Sequence.find ixs ~f:check, value) + + (* find any number word in the string, from the beginning if `fwd` or from the end otherwise. *) + let find_any_number ~fwd s : (int * int) option = + let f (value, number) = find_number ~fwd s value number in + let found = List.map digits ~f in + let compare (ix1, _) (ix2, _) = + match (ix1, ix2) with + | Some a, Some b -> Int.compare a b * if fwd then 1 else -1 + | Some _, None -> -1 + | None, Some _ -> 1 + | None, None -> 0 + in + (* sort by index *) + let sorted = List.sort found ~compare in + match List.hd_exn sorted with Some ix, d -> Some (ix, d) | None, _ -> None + + (* Process line `line`, and return numeric result. *) + let handle line : int = + let maybe_first_dig = find_first_digit line in + let maybe_first_wrd = find_any_number ~fwd:true line in + let maybe_last_dig = find_last_digit line in + let maybe_last_wrd = find_any_number ~fwd:false line in + let match_num ~fwd (dig : (int * int) option) (wrd : (int * int) option) = + match (dig, wrd) with + | Some (ix1, d1), Some (ix2, d2) -> + if (fwd && ix1 < ix2) || ((not fwd) && ix1 > ix2) then d1 else d2 + | Some (_, d), None | None, Some (_, d) -> d + | None, None -> assert false + in + let first_dig = match_num ~fwd:true maybe_first_dig maybe_first_wrd in + let last_dig = match_num ~fwd:false maybe_last_dig maybe_last_wrd in + (10 * first_dig) + last_dig + + let process ch = + let f lines line = handle line :: lines in + List.rev @@ In_channel.fold_lines ch ~init:[] ~f + + let part2 () = + let r = process In_channel.stdin in + Out_channel.printf "%d\n" (List.fold ~init:0 ~f:( + ) r) +end + +let () = Part2.part2 ()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2023/aoc23/dune Sat Dec 02 13:53:44 2023 +0100 @@ -0,0 +1,5 @@ +(executable + (name day01) + (libraries base core) + (preprocess (pps ppx_let)) + )
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2023/aoc23/dune-project Sat Dec 02 13:53:44 2023 +0100 @@ -0,0 +1,26 @@ +(lang dune 3.10) + +(name aoc23) + +(generate_opam_files true) + +(source + (github username/reponame)) + +(authors "Author Name") + +(maintainers "Maintainer Name") + +(license LICENSE) + +(documentation https://url/to/documentation) + +(package + (name aoc23) + (synopsis "A short synopsis") + (description "A longer description") + (depends ocaml dune base core stdio) + (tags + (topics "to describe" your project))) + +; See the complete stanza docs at https://dune.readthedocs.io/en/stable/dune-files.html#dune-project
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2023/aoc23/lib/dune Sat Dec 02 13:53:44 2023 +0100 @@ -0,0 +1,2 @@ +(library + (name aoc23))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2023/aoc23/test/dune Sat Dec 02 13:53:44 2023 +0100 @@ -0,0 +1,2 @@ +(test + (name aoc23))
--- a/2023/day01.ml Sat Dec 02 12:26:52 2023 +0100 +++ b/2023/day01.ml Sat Dec 02 13:53:44 2023 +0100 @@ -22,18 +22,20 @@ (* Part 2 *) module Part2 = struct - let folder ix acc x = + let folder ix acc x : (int * int) option = match (ix, acc, x) with | ix, None, d -> let i = Int.of_string_opt (String.of_char d) in Option.map i ~f:(fun i -> (ix, i)) | _, Some d, _ -> Some d + (* Return the (index, value) of the first digit in the string *) let find_first_digit s = String.foldi ~init:None ~f:folder s - let find_last_digit s = + (* Return the (index, value) of the last digit in the string *) + let find_last_digit s : (int * int) option = let%map.Option ix, v = find_first_digit (String.rev s) in - (String.length s - ix, v) + (String.length s - ix - 1, v) let digits = [ @@ -48,6 +50,7 @@ (9, "nine"); ] + (* generate a counting sequence *) let count_seq (from : int) (upto : int) : int Sequence.t = let f c = if Int.equal c upto then None @@ -55,7 +58,7 @@ in Sequence.unfold ~init:from ~f - let find_number ~fwd s value number = + let find_number ~fwd s value number : int option * int = let ixs = if fwd then count_seq 0 (String.length s) else count_seq (String.length s - 1) 0 @@ -63,7 +66,7 @@ let check pos = String.is_substring_at s ~pos ~substring:number in (Sequence.find ixs ~f:check, value) - let find_any_number ~fwd s = + let find_any_number ~fwd s : (int * int) option = let f (value, number) = find_number ~fwd s value number in let found = List.map digits ~f in let compare (ix1, _) (ix2, _) = @@ -83,15 +86,6 @@ let maybe_last_dig = find_last_digit line in let maybe_last_wrd = find_any_number ~fwd:false line in let match_num ~fwd (dig : (int * int) option) (wrd : (int * int) option) = - let se v = - Sexp.( - Option.sexp_of_t - (fun (a, b) -> - List [ Atom (Int.to_string a); Atom (Int.to_string b) ]) - v) - in - let s = Sexp.to_string Sexp.(List [ se dig; se wrd ]) in - let () = Out_channel.printf "%s\n" s in match (dig, wrd) with | Some (ix1, d1), Some (ix2, d2) -> if (fwd && ix1 < ix2) || ((not fwd) && ix1 > ix2) then d1 else d2
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/2023/input/01.txt Sat Dec 02 13:53:44 2023 +0100 @@ -0,0 +1,1000 @@ +gsjgklneight6zqfz +7one718onegfqtdbtxfcmd +xvtfhkm8c9 +914two8 +vxzzvdhfqfsix83c1ttvbbstxgdrkfcnmm3 +76mkvhmbkpm +8sixssmlzlhrnineggmrvg6 +threeninedtr7219 +two2geight +3nine9fivetwo9twohxhc8 +llbfmnzzntdcfbslcl3xxvz +two3leighttvpkfmjhhonefour +1b9four +fivefdlqonesj2six +hfptgztwosix8 +fourkcxqfgxbsvjj3472 +xhzs7rdphtxhtwo +eightthree51 +3nmronemlqzfxgonepkh +9vnxqtjjrsg +533fivesixrvqfxjrdhl +bkrljtkjb42fqnp +4mrh734 +threefourfive83l +lcjftnpqfourfivesixtwof3 +sevennineh7two3 +onecgrmb74ctxhg +kmvtdrxvrfivethree2 +seven98mflv +tmoneightzstdjqjncnkpkknzoneonethreefive7 +fourzsqjbffmxf6lsqdttjfive1nine +ccs3onesgmmrb +kflkpscthreehjjgckfrfdhc3krgntwofour +7five2134 +pnfbrjhgprdsvzjrklrclmlgkk69four4 +cheightwofourxt2 +1167threetfqstpkc +6dsk2bhqmonejggkpvffhgnrbsix +five9threefour +one3136four +vvncdsg6jnxlbsb3 +fgftp5 +xxscpztpxteightv4mprlzmdhxtxmpvgfour +g4 +eightmbqbrxjbdx5 +8nineeighttwo6lcsvmvxdqbgpdbtjnnine +jkj86threeskgpnl3four +rtmpn5cbtthreefgxnhhvlkxcbtknnine +7dpn6cqstqrv7sbgzxhgrqrgn +3fivetxgjgndz1 +tfmkd8three2 +rcl55cvnfour9twofive +dmgdbkfjvsnpctj69four5 +xjlrvznbgl78eight +dmhkvgbc6four6eightwofkk +zlhzn898scffour +bdeighttxntvnslbf1nine59 +htjltzmzeight5foureightdvv +45fourl2 +seventhree39fivesixtwokchzgc +fxtbgsxch1lmdsldthreefour8rkxjz9 +five3five8 +threefvfcxnfgskqjdjknrgkvnkl6 +8jzdkxm +plttwo2fourseven99zthrklvcvp +gxjfdnzrcj2847eightnine +2onetwoxdc +35zlpzpvfn77 +nxppmskvrd1one89eightfive +glhp52f +mpptktkhrbbcsdheighteightqkjgckvxs6fourseven +1ninelspvpm +threefqn551 +eight95lhxrtwoh2hbnd +jlbclhxp72fivektxfxbtwonetxl +one7nflzdbdjchbbqqmn +fivesbgsrvzrhz2ncbkhsbrgnpbkgcsrln1zksfqkcxpf +1ftfour22hvdcqrseven +sevenjgrkpbxxnnv1nine6hzkrzzfl +fourthreefour98sevenbthreesix +sixgrrjkl3gdzz86onejpjlbpnthree +vhx3tnzcjvgg +six3one4sixeighttwosbkqdjfhfroneights +669eighteight32seven +jdpzkdnngc6bvqvtxtxfivesixthreedndsqmv +9eight6ssxcdt6fivedsnine +nine3onetjmdqpktwo +ninejjzrklhptsdzbt6tmxnpbrm +eightsevensixtxvxlqtdjfivebnvpdhvfsqbbssfkplzmkvvxh7 +xmeightone5cjgn1nhjsthree5 +xncbclzqqgskthree14bptlrknkmpntxmnf +sevenfour8 +34 +5ccslrvbfive +sixsixlqf72 +kknmskkfivezcmjrgfgclgrz1 +gqxtmrsqxfour12vlonefive +four8594kxsc +364 +hrbfxdpfivesevenjcjdm3nine9sixsh +mml5five +btcqdx7jjsix +4558seven4mjzsix +1mfckqcfk +4pjtbd18ghnnjqmjm6cvcdgjlcrmxpnnts +eight6hd +cdjdhpjccncpmrfour9qxlqfivenxjfssftnq +5bchcbpjxnsbkxgbqgbr +sixlhnzzmkbfourhzp58onetwoseven +kfgkqfivek3br +fnklssmgnine4eight +rbbnjvgpkgbs65sevenmeightsevennine +8ninenzgpldnfgjjmbqpmqvgqcthree5seven2 +seven6pdrgrldhtldhmndbjpj +5three4zmjpslhh +threesixsix45 +szxnvzrkseven2tctf +xqzpninesixseven5dndlqd7 +three6ghhzcvpkfivervsgplxq +eighttwoeightlfntmxptgk2pngplvr39 +33ninenine4fivejseven6 +fivehxbmjvxxrzrqr29npqhhlsjr2ttmnl +slmltqplzl73dxkxrpgn +lxg4371three +tjxsmjnthreefive5fivemshrhhj +5eighttwo +sixbpqtcrjzmveighteightjzgktzss1 +1qxjz57sixzh +4djpqz54122 +threeclg1ng7kgprvd +3143threenine71 +kcxmcthreesixeight23 +4zhvn4five +lmxfone47fbdsixjgl +kzcdzp2 +27twozjbtr +gpvkqdpbpzthreeone5 +bqvneightseven8qll +seven8brjrp272none +3kxhglddkjklkl +5sevennine52nine +3fourgznkfpfsxzsnmoneqsixtsm +twothreemkz6ttrtbj8 +qoneight28fourninempvltzrtzgvfdcdlxv +rllmkpvgqnkdgdrseven2five3 +7eight89fourlkfourfivejkqgffz +four6xr +6sixfive2hhzdkskxnine3nine +two6qmmkhb9eight +cqfxnmrlnhcsdqqxkn2nsncgvdxgmnineeight +7sixsdsfour4mrxeight +44threetcmtzmxzgjonesixnine8seven +dlonethreejh6bgxxmlkdseightwokp +four3lspkhhtsmone +89hjtnrrpvfzjdkzp +xc4sixvzpccdblczvleight7 +2twotwogzqhp9vnbp +rxsplmvb1two8pdtnxtbthreefiveeight +bsfdmnnj8eight +rntszdckhhcmqn21ljzqbhn +nineeight8 +1fhmnzzlfjpdp3ptj8threejqvmstbtp +267 +hkknsfivecrhthvbhhqj1 +six6xcqpnj9fivezcqbrfour4 +8one2gfsgg +mszrrqmr4nine9 +5fournine43three +5one9hvvrthreethreef3 +ninetwo6twofivefivennhjqkhzntkqptfxvdj +9onetwo5fiveeightnine8 +nineseventslmmgnsjbdgsb2sixlmvxpdg6 +8nineonethreehghh +jd1kr +drrsxljl4 +fqhfjdxdlsgjgkhcpjkqpgzjgchsixrvzqn7 +7one2qsnxhfqkseven6 +1vhljtwo1oneightqm +gl3 +two2eight1threethree +64nine +qglkhnfffsnine2three566three +7sixtwo6trbbklgjteighttwo +nkccpeight4sevensevenone +eight9ldkvgqhq3 +ttkqpxpzrxph1zfzhbvbgvn +46lqxxgrmvsix +twosixcqsmjsthree8pqthmd +ninesixdsns66lvnkhrq3 +seven413crqjpkfqleightlgxgck +onesxztkrtxksqklpqcmrlpjlnst6ftwo +jzb1oneightqqr +ninexrmlglbdlfqm4twolnlq +4seven4eightzds +fourngdzkklkxtsix8 +cggtwonebtkxtwothree16seven +three59threesix +3qfglrfcr4nine +9seveneighttwofoureightvvhpgmpnftwo +seven2sixvsmxv86 +mgvqr5two +lggjffzt2six7vxflh23 +hctpninesevenoneonevr3 +7threeqzgzm532mn5 +vltdnjhxgl6rjbmcb79s69eight +snkbpcgclpbflxbz6nkktqqgplm11bdnvpfour +75dllnlkthree93onedflbbmlvmd +sixthree94frdpkdccqkxv5 +hdpsvxl2bszdpgspqgxrzz3 +hztwonethreeeightzjqk8fivepvgrpsrxxsbfqfv +kfmh6sixv74two +one9three5 +lcn2hls3three66gsfmzvlx +tmlhhl72nhhkppscc +eightsevenprzgonethree7nine1 +1rngfnx78196sixrjbbkzp +6seven2182six +fpsl5xbdnjbzonethreezcfqmqonefive +5cxhrqzsfz34xdkvtxblkhvstcmjc +seven36ccqzfmmlvsevennine +5nrvq2nine2 +fljzxvninetqxjjcrsvp7 +1ninetwosevenvdtn4qcxnblgx2two +dcfxp2onefourfive +6czxzpsc +threeone1grvz8pvzvzkdzjfsix +hmbpnqntczjhdlsjonedr9prxvkt6one9 +dccns9threeninexgflfjltmvlssrhkbvktcfourg +sevenhbflnmglrn4rtseventwo55 +threehddkrvsp11 +6threegtk5five +29m5 +nine3threesixsevennineddgchfiveeightwovqq +2jtgvrldnbpfncfxtq +eighttwo6vtgkvpqzthree +5sixseven +twohj3seven3fourblqqbphcbfive +6one7twovjfqlsdgnrtzlzmjxgfljs +1nv +22five27two +3sevenlgeighteight +khpjmtsskfivefivexbjnkdtwogmxcxrqdpl2 +zmvpjtm6gzgztjrtnmgpsevenfive28vjvhmnr +9four71 +9zghgdjs +3oneqcjhsbv9threefive +47rsggonennqmbbckcdd31three +sevenfivesixone5eight +48hcmlcone8x6 +three9threesixjtxhlm3eightgtrskhqfjtgfjbcfdt +5ninefrpqjdhkkcldvhqkljpqpb1 +969nine +ninenine8ctprmxkvnine3xkl +seven648lpmxdn92 +rjhvlnz5two +dlvqhfmp587 +sevensix6 +eightsix34fourlgxrndbjjx9mztwo +czlpflntvpc1qnl2 +9seven8qsixbjoneeight +snnjcseventwo6qst +ndxgj756zqgt +krczgjpbfp199three4six +cjeightwoone8 +ffmddcrh7rrxhpnlkkdl +nine9hhppdvfczxkjninefivecdp +8eight19 +4fiveeightthree2twotwo +nine2four4941seven +fournine5twodqbkbjjmmqsn +nzqgngfxftwo6 +5bmlfbsql2sevenjrxkkdtwoone +jfeightwoppxbpgzdljnmmpvrckv8 +chj66fouronefourvcdd +fourzvgbsgkmgslntrzxtxvjnmhk5v7 +1fnzftqmtj9gqkblpknq6blmlkxbzhdsdljvqfour +116rqpdqq +xslxqcmlchmqlzmkxbk79hnlhthreesnnmnht +sixfive8kjhrfdxrtfour +nlv71clmzbnine6 +42one8lz +qspsdj2gv6vl8six5 +5gctkjzxlr2twoseventhree +rmgmkvqeightpfmrxqmvkg8 +3sixnjrjbbzl3 +1nineseven4three7qhdsxvbmlk +fourjbznsbgsn2pgxrzlkkjtctm3eight5 +36fourninecppsqfflbcbljnfgh2 +eight211ninegnfvhfxqcmpmeight +vbsg73 +3ninetwoonerbzcglkmdg +76ngkrtfonecltwovvgvgznzbmxm +977eighteightwocp +fxskxcdkdeight2225 +seven98rpzjxscseven3vtbbhqjrjfk +sevenseven97jxh +sevenfourfivexsspnqjnlxtbrfour24 +fivefive5two91six +gg2ptrsdxtfjtzztthree8 +eight2ncmps1qsix25 +eight486zfqfmgchtrrbcrjsevenrcqtxnqnrb +7vgn31lvqqvkdqlpddmllbn9 +1hlgrlmctseveneight9xfsfseven +onefourdqzvlh7 +four543ninethree +4seven1one +79twogmjcngj7rseven3 +xxtkcbkgqfldssix4five4nine +tqxnnspd7sevenvljzl2scsbkhqdq +cbz3rczscjfxtzfivenbjqone +threekkcjlmvkfrsgz6r +1sixvppcksdvrz7 +dvngzs74eight9 +qrncqtqxkfrndcrrpjcglfonesix75seven +eight6cksxfdthreefive2eight +four51sixfschln6 +hblmcggzgqsix2two +93two985 +78six6 +6sxmd289nine152 +gmpdcdcr4xzmhq3 +5threehpdmq +eight54xcrlsv8three4 +35twofourfivenine4tjthd +6kch9 +7fjlvptwo2ztrggpmsntwo +7twosix6kmdnvspnqgjxcdtgrspjj7 +tsix8fivethree +2pggbgxnft7 +sixthree69j +24l +cpzltvslq9nfhcv +six46eightsixsixbblvjjkvntmm +7five3 +six2three +seven2xxxhhjnl53sixjtgbnvh6 +fiveeightj1mrfvzfour3p +6foureight588zpjdcxlrshtwonine +xvtwonesix7prcjfsxjksknxqqsmsix +eight3fivexmrs1eightnc +vczdhchhsmlx7zdlcgfzrcgkcnqdvdtphxqqjxnsbd +six2fxqqdtrkgqpgjrvhxtsbqzz +twotwofour4six +9nzcvxthree +kggfkpvhrronep238nine +41seven4sevenfourvrmxkhpcmskbctwo +nbttnvh8nlhldjstkvdxxlvqeightoneights +tjqdkfourthree466 +twothbcvstwotwo2xpnqrldsmdtscnrp +sevennine3 +twodhbtlnzrt418dlszqkbc78 +3four8threeonetwoneh +drtcjpmrlnine3vgf8kssrsssgpnseven +eight78jqjjkgtbcckdndhdvz57q +five59onesixsevenflls +63bbznssjjsvt4 +fqkgmcrxf6gkcninesevennfzhccqtfour9 +5nine2three +gfkhpkfgb9four49rqcjrjkglpzxr +ds28eight33xl +qdgnn9ninecpcv +2sevenrlfkzmktzgsevenzzgxfrmp +twovpthxmxqgr94 +sk3gbmrknrmm +7sevenrpxjvzeightsix +9zxzqglvxqm6jphmvfsqvjjqsl +9kqmnkthcdhtwovbrqzftst3 +eight669zvrdpv +shgjkgthreeznz69pjltseven +ninebc5eight +5l +onesix5five2clxllfour +71three2fivecplsnlgsmthree +twofourone6fm7four26eightwox +7three9ftpvvbzpjzsixssxbqcfsix4 +92eightlsgrmpqtpptxrdfxthreemvlxfpsevenoneightdd +eight7three +drxxcghbsevenninenineljtczntp6 +nine55cpqfkdrthree3 +7fivefp3eight +97nine1ninexprdpvqzps +four3eightpgbdhnmqvhjjhg6frqkpqzbtwoner +3threefivesevenrvr3sixthree +sixs6zl184 +fourlfkxcvqkllbtz45threefivesix +2twodvklqcqdjjdnpx84xgthree4 +eightfour8dnqmlqmxd9cmt8 +t4sixkkfhgmn83eight +eightoneninehqddxnine75vppqhlcm +1threesdvsszeight5dcsgrsv +seven776smjhhb +onevmr62dqzt7 +pqxtspl19threesevenkjvxjdhxkseven +cgkvmx5lffclxgtsnseven +fqjctfrrlmmnpeightone19nineqgsnsqbjk +8twoone +c6eightonep3gxjnsjtwo3 +sixthree36sevenseven +5vgfsdkzbxmvxncxjpsxffcbnr62kmgmhcmkq +nineeightfour9kvdmxg5nnhrf +5blqszh97fhgpbdn44 +nhzbqprgptnineflxgvfkvlp453two +kpcqvjcjcj6dfpsljlrxdlzbf8grsnsdmklp +1zkjbnln +four2xvxrrvs +nine5nfmbxnrgfnine8onekqcnine +oneonedd8 +rr44 +8bckneightnqmkvqhkkmxfour +2pznjcxlj4onenine433 +nhmhkcqbsrrthreeeighttwo3f5 +eight64sixninefivethreecfbbdk +csmoneight1hrsevenfivesevenone756 +9qdrxl +26two3jq +pnrskrrvtonesevenrmkcxcm2five8five +sfvfr8three69three7fs +seven52bkslnnfrbqvmblknq3f4 +zqmtdtp31threesevennine3 +9tbvvjstzmdpqnpbmrb32cbdjgtsjndjrps3ckpmspm +5four4rvmtkppghb9 +24ftjxbdq3nine +ltj2oneeightonesix +76three2sevennine +hfnzxcjfxgseven5cpph3 +2one966dpjlgfqbmceightthreenine +5one9smzz76eight +348tworhzvqjdmqtwo +cjsvvksgzkktwo7hsfkrhkcsbrqcnrz26 +threethreez8 +m3335cdgbxqn5twodmcqk +27eight4 +sfmspqbzr9eight +rscxzq2fqlhbbhvkdbzqzqhzfourninepclrkkdrtwosix +pxbld2twonef +plpbbkvxqpvdxqcstp5threevljjqsqxsevenseven +2sevensix9 +5413sxmtrdjtcmdqpbpcprsix +tpdqxscxjldqvzncbvrpr9cvkqdffvfh8four +six14 +nsmqttrbhrznvonecmlxtdclnbk3 +ninecgbqh6twoctsixthreefive +hqsgonesix3oneightklm +cxxbjptkvkcttddmtwo37one5 +v13two +txxm84kmrpdkxhtbntkhj4four5 +jsrzgnine8nrmzpgf5sqdz +4six9dkxttsthreedgvjkqpk +msnrq7 +t2five4vtwo7sevenrjdrzvb +2rxbdzlszjseven7 +gmmninesix3119ninemdnprsmd +ninesevenpbfx6fourfivefdvhrsctztrheight +qk3two317hnpkqxbmkb3 +oneone6sixdzdmfonefiveone +427sixfive +17njgbgljkpxvhph +4hnfvpbvzxl6three +5sixnllvrvpjpv +3sevenfzjltglsjkdknfnmpsvfive6xdsm2 +1pxp8onesix +xclcfthreeln9ndqhvdxknkjzv4 +6fourtwo2seven1fcd +1eightseven4 +four21eightlfjzb +nine9ninenine81 +eight8zpfsshlqbdlfourmch5four +6sixjdmjjgmsk +ninesix8threetwoxtqdsffxlk6 +dgsddfcnnc3sevenseven532one +lsevennineninefive851dtqzv +nmrxfsmfcscftvzzbggglsfour6 +threesmxqlgmpvtwokvrx361eight +brbkgqcblcxghjp34bpnrctz +sixbzxfbfsjth14pqpvjqfmr +oneseven99 +7four6562zjjxxjlvfdqbssmcx +8fjssqgzthree4five3 +fourckmtsssqgdgcvmqhcqlcqqdhv5eight +bphtzndpdrfivefour8nine5 +ninesix57jvjtwo36vzljdfnndv +eightfourfivesixone2vg +5sevenkdgcmjthdxpxprcdnzpffsixcjmh2 +9cvldprttjk1 +seven6fivesfjjshfqmsjvfpc +eightsixstmhlldl21fourvgsmdlcd1 +5nv1two +tsqxlfnd6rtcvcv5 +eight3zdljlvkbp7hfive5xzgzspsnfour +945sevennrtnn57 +562 +3vtnlsfoursjbgbqmlx6 +8lprsrtvrh9two3 +pssfncbhqpfour1dgcjqpccfzfntphmtjthree1sixfour +rchfmfp18998rsbx +nineonedmlffz5 +seven2sevenonetwo +nine3gxttrkkzpj933mjzhphl +cdpqqhrcrrnspsr378two +fourrprdlkvqj8tntfttwofivesevenqmcsgpljvnl +978sixskr2gkrcgn +jcvldmcdqbjdcxhjcgngsevenfive2cfcmbb4 +szlsvrzzkseventwoone6ninesevensj +gzboneightmsblxgzmsq5seven +seven5eight5 +tsblj5onebkx882 +7kdgdfvx3sevenczgf +94g14onenine +7fournrkdxz4threethree +8eightqtworlcxtv4 +rbkbdsqbfour39eighteightwoxn +cxgmxtoneninennqtmzml6dq +8fivefour9 +8bhspzfsjr9 +fivekzgvvfour8sevensix4vlphpblsp +six63kbbxrfivefive5 +eight5gmkrhrkjjxhb +xtcfivepntwoeight9seven +6nine8fivenine2mf +5fourbthreenineslxfgtqrxcv5four +4vhkxmlsvfg +scphnsbz9h6qnlhcqmgl +tbbcqfxrllszbseventwofivethreeninef1 +zkvtlscldhngtk59 +one6fourrmftxfsvmtwo874 +37threeonefive4 +lrnnspbrgd6jzxtbninesevenngnpsljcr +xhldmfc4five76five +qrzfivexklqcjdnine46 +jkgb6ninesix41threeseven +134628twozlm +8ffrzgtbbfgfive2ninethreem +2132 +7xf +mfhmshvfivenfzjhslq7nfcfgvjhs8 +seven3248 +pvpdpxpg135seven9vpcpgrzlpjblmd +shnslhthreefourtwodnpfr7seven +6hxhhmfivesixseven +vppgmfivethreefivesevensix2two +hp98 +phlskgmgrjsbtq2gkjvrgsd +kkfourthree9fhnpdqcqhtwo +ftnvkprhvllkh9n +71one7twofourfourqtfmc6 +eightfivehssmqsptconefive4 +ninejcfqknhcfpcbcsmnpvn4six5j +one7jvmtxkjzfive +twof9pqcgdfqsq4d7 +krczdrpxbhsngqdvsqb1four7mb7lldv +seven9634tgcsplgmfivetwo +vjvpstpbgtsevennvpsvch97rslh4onefour +zbtgjgq23seven7lbnzdpnkzf +zndbhclr714 +twofive3 +9eight2twojxzdkptwo +gzqfcqpxnfhtb28dvfeight38 +rsqvgsqv9tdlvssj +f78hjftphgcv8bqgrckgldone +fivethreetjg2 +6vtqgdkxsmj +xgjdndnpsevenzfl6tfgxltvcthree +threenine82gqnffkvm +zmlblc4fiveseven3two +msmlvbnqbt9 +144bfcbsjztmdldveight +chceightwofivemcfrxv266 +two9f7gzhhsf6 +ninetwoffour8sevenjngv +foureight22g7twoonemlvq +one78ptfgbbvx +fx5 +5rvz2two +913 +9eightnkvhcksoneqsqgntfthdtjm +one1sixcsccdvbxzx +sevenoneninethree4one7seven2 +jqseightwockmxjd3gfmlhbn6seven7sevenkhcr +sevenqqhs4onemcn +fourseven3nine7pcn +sjjpsthkdfeightcsvlcvhltv6 +qpc16five +3jplhrj2threetwofpvrthree +4sixsix9two +one1eighteight +5tg +256five9 +seven9crnff9eighteight +16five1one4kqllsltrtn +eight3three +seventwoqtlxj8 +74seven5 +2five7mmgsbfc +five7four +bmtkcxvcj997eight +cpgrpgxtgkqr9 +sevenmdqtqhfvnknine929xm +nsix27vzglsevenseven63 +six1nqpsgtrllsnhmbnqxrdvrcx8s +eighttwoflrvzfq262 +twosxtf866hfhxn4fourone +3fourzbrtmd47three +four99eightbcldqfvrm +871 +2twobdtnzzqgvfggjntvgpnqslbdctppnfzpfpcbvzqccq +sdmkzhb8lnpjntj7 +threembr1 +5fd1sevenpsdpdlnb16 +7mnkkvpzrrnslfksrninexmpnfpbzhkx +nfrnvtt8 +24dsffiveqzmjrjznfksrknrfn +5foureight3pn3 +nine9three +nine74cmxrdvcxf3pdhbfour +frjnzrsixone53eight +four41fourhfjnjhpkzp +939rdjhlfpjsix +4kdkcq9two +329fivefive98 +65485 +dfsevensixmdbfour7jhxsfourfour +rqtwonerdkf3eight6fourfour +twoqnfthree5fx +rtwone1two89ntwo9 +sixskqssbccfour7fivevcmsevendqbfcvks +sgtwovmzmzm9 +vk9 +seventhree4 +48mv3eightnine +six7gxnj4six3 +twotwosixlm55dmzdrntzthreeseven +fivemhcdlm8fivemkffllv9 +fkxzdh69twoonesbrfhntk +zfourthreeseven1kllk +6ninethreefiveqdct +nineeight136three5nxvj +fivecpbkhqxpmf46twotxtfrhmvboneone +brrfqninetwohgqnkfctkseven1 +npblhpcpfivehdsnine34 +vksix4fourvrbfmjcrhb78 +72xfmds46threefive +five1kq8eight56three +3sevenfvcsglnjtbhdkqf +6tr6qxqrmstqg +15five5 +fthfvffour85 +seven81fouronefive +dhkknlbfjrnsfcvvkk9seveneightwos +2lngrlvrk4shgktcbpfonefivenine2 +sevenhhlrfqmzn2 +6seven927gdczblhjlmrxnjqfktwoneq +7phbj9fourvbx31seven6 +146 +jnqxslzpsxdftrqczq764 +tmbjdldtwogfvxhnvsfp8tzzp +fourgv68bblxfktsfdg98 +36tnrmd2jrllk2npbrctjcjthm +mx3nine3hkslkb5 +xvmgtlzmrfjcmqgtworc3 +vxscrns1lclnxtwo +foursevenone534 +jdmrj1sixkzdxn +two9threenine +2sevendsmlzh13jlslmvtnine +nine8nine +gthbsq953kxckzppcxqzl3 +xnrgzjzrbp5rptrpbsdgsqfeight5 +1sevendnmxkpdsrmrfkpmxcq22sixmdmvqlgpnbcxf +eight658x14fq +rzvgmdltnz9nvthrjvpzqf +9oneightgl +dsbtb88 +three4fourninelzvqhvjpk6 +seven59fourthreed +3671 +66nineeight8two +eightlszxlsxlcq3sixskqhj4gkblpj +three2eighttwothree +nine853qttjrjptxttwortkhmjss +twosix35 +5948lspjxzpbmthfive +fourthree8 +fourfivevbbqpppqrkkzjqqbnine3 +8nine4xszllqzzonesix2nine +crgnbqrfourrzjbpnnsqthreethreefbnine85 +dx79xjkcpxsndsrbnjlbnine2 +9nine89 +one7qmv1 +dlpbzxfm536392fp +3seventhree8eighttwoeightfive +twongjrfkcb66 +2eightseven8 +zffrln57eighttbqsgzbzhrzxt5kxxlcxb +one5three621ninetwonnprsbmm +3vmslzzp8xcpcgvf +threesix93 +seven3sixfnbbbeighttwo1fivezglzb +kgk7 +48seven2ccztcfnv5tzkrxffour +xczvzdjthreeeight6hnffivexxtmqs79 +three4nine36threehjp +nineqtdtmmpjpkzpxmmfive83sevenseventhree +22jfdpndrcvxbgz +7bljfctkbpc +4bfblqrphseven +fklxmcqxthmnvrlc9 +4seven9zspgftgvd53dsdkhgbns46 +7seven664fdqkcqtr9 +dvxtkqfqbhrllbone3six3 +4ktplgtgzlf3eightfxslssr +six2bhsjknjmgdddgnb6tbhvxbf29nine +two93twofngr8four +oneoneftmqvblcrjnng7jvch97one +9fivexmzstmlrmztwohsqmzfivehseven +5two2hggzchnn +one28ptdlfourgnrjftqd4vxfdrfx7 +six6zvkcszt4tfpkeightvdkjzbb +7oneftjp +1sevenseven9fsp +jqtznvrq8one11fivesix +3ninedkqxtmoneighthkt +8k +931 +clhvprlljttm9 +four14bfgf4eightwoc +xrflnnfb2rlv7twoseven2six +6366hlgklvjvxxlbkxgb +nbkxvp3eightgnznqqjbt5seven +98sntdts +cneightwotdkfxxxjfdpz3zkkthree +five1sfhq1lhhvjb +zdd56tcdchkvnbn +sevenhtpbmbntfivethree9scjfivenine +2spxggcvsvm4msdszqtml +4twoxsevencjgnine +89eightonetwo3ghqbckqkn +fvsgljnzgzfive1slhbxxhsrlmfivexqnkmtnzx +1g1 +94mcreight +threefntlsvvfnine9 +b3hnhvjhtrrv +11fourthree46 +plhclxcjrsgspx3b8fivecbx +mvjxqnqxtwo89bfive +three9nkjrh6two3 +dgprgjdgcrtqxgvknnk9six +dmbljtqg66zxjr95nine2seven +vdxoneight6 +22two9 +7oneppgrjnmrvchvsznsgfivexxdt7 +1three4mzc +bdnhvtsjmdnklsxbtmnztqjtpnz6fivesevenfourzddgsrfmlq +krzm2twotwo65sixfhpplvcgcs +qzcvbvsfive1oneqzc9threesevenseven +threesixninekghkvvzd4 +txqjpmlvdlpm7 +eightsix1l96xrljgg +two63d32six +8nine1fivesixfive3eightwos +sixninenkrpsix2nf4 +four2seven35four9threensbv +ncjhcskrx6 +3eightcpssngjlsqvmsxqqpldhsxsthreelzgzn +6zjnmxrgcz +9bbvkvnbmzshtdzxgqnqmqtthree +four2kqmzfgvpk35rhmqhtrqmfourhjxxfour +9eightfivefrpqtzmkkgkvjbbqmsqvq +eightsevenzpskfbrmcgzjjpnlgr51bdlcmsxhf +pt8two6seveneightjsqxjmlf4six +phjclrmpzm1292gdfivenine +sixfourtwo1 +9tvcnzknine2rdnqfive81 +sixtwopvxjcnmone2kxzxgmn +twosixpcntbtfivenine4two +rxdgeightone86twobzmnlgkdc +4two1twovtldl8one +fiveb1 +212three6twofour84 +74tstlfmrmcj +sixgxtwotmrmzkfsj9 +eighthksxmf144xltwo8 +mthjxjhnqxnhcbxg783 +prptwonehhdlrd71threeone +59fivefnsmzfsix +ninesixonetwo9six6jtptone +eight9ninefivezqvpstsevenjvcjmdcscnzlqsfnhnrnmn +2ckgjml4rcprzj7tp6 +sevenfivesevennhg136 +ninesevenvhl5 +fzflrseven1five5seven +seven5lcfxp +bqhjg4three3 +three8ninegtonetwo46 +cvdpr8 +32fivehfsdhxgjnn +sdndcpccpvdzdgn9fourlnslcmbtwojphzpnvrnp +9cqkgdf7fxgdfcllvnnmzpptninesixone9 +3chllzcgq5fivebffm9 +sqmtj4qlhlcrmrnb38v4dsix +sevennine84bcpvqjcrxpvtcgfhlfhncplktf +qkzxvstdgnfour4two +jkhoneonesixfiveone14lvzn +threethreefivensvlbfour2four +vgqlhqfrlfourlzcgppdbhq57 +bqzpzbtwolprtwo9 +lfjs9six1five2fzcldvnpxtmhsix +kslcntz36nine +nineseven8rzccgfhzsjnjveighttwo +three3fourfivedmjlgqfhmninemst8 +4qxvzgfvctwo73 +75961fivefourzg +spcbt66sevennine4four +hhb1 +dtmoneight9 +3mbctjhfmr2fourthreeseven86 +sixjsbmvzql6gfnttq +1vknfgmznmnzpgvsp3bsksdsevenfourrk +six4six7ninepfxjsshthree +4rqgzpnqcg8skfgksjone3four8 +seven5zkljftwo +76sctscqtsfcninefourrgmsbsxv9six +46fpdqhkfjzgtclfchbbsjcbjhsbkqggzhlb6four +bshbvfourzc79lvvdsqjksmzmqpbvrsrbtg7 +jdqmtfeight59fourtwo +ninefivejsl3 +94z7fouroneeight +5nbmvgheightfive +sixseven5one9ngk3 +eight3jddmgqnzcfjsvrd6five6kmbxss +seveneight9fourthree +eight83 +3spltxvtbg +92shzldthreefpckdtqhm7fivezzkdlz +6two9threeztrzxphhksqc +ninedlone3 +eight4nineonefournsmdgkdszt +9cpxhnksktwo15fivefkq +144eight77 +1sixjscflltdrgclmgrszdfive7lc +ttmfsx9dzgcqjzlzhvlfqrsj4six +846 +fiveseven7 +kqtwone2ninefour7fghmntkn +8r8one +5nnzqqgxl4gbgnzntfrhqzeight +onevpkxvrone8 +79klfd +gzrjvck1sixqnfdjxfive9eightcmhmsjpl +nszqhdfsixsixb3threenfiveqskccbffd +srbn928eight +eight2eightfivekmnjkndgrhjdpvxk3 +9four11oneeight +seven6fivezzktmsixv +fivebvtnzr4threeonetld68 +mgbfjcjbqctt71fgdbmmqdlhpxnpmvx +rjprxbxrfk233 +nxbjxbcvvskeightfiveglpnhbzz27four +kstwo2 +2btbzfournbfcxnvlvcbsjmplnprcrg +mkk6three271 +tfncrvlnfdmntdrmjqqtknsgpq671onethree +eight8twofivex +phreightfive81hftbkbdnztt +onetbhqqlcbqrlfzrqbtbl9ntcgvxr1rhgrspqkgklz +gckbonekhzcjhdb5 +twothree1lfivetwolpdxhn8 +threebqmxgpjfbzrrrrgdt8 +threejvlpxpfm9four4threeone +five68onesevennineone9two +mjqjrqmeight73 +fvfgrdppszgdhmninenineone7759 +lrhchsonek3twobblvn9bdmcbt +mdcqxbz84five6ninetwonergj +eightnine548ttfiveeight7 +74mfftzxhkl4 +seven5mdmrxlp +ptb76ndfpbtljpkhjthdfmsdddjssm +7vkeight +bzzpvht5fourthreeseven8 +rztztsix12nine +fvpqdnphtd1mmrhppbd2 +h8dpbvs2tjlqgfxhhbeight +51one +two86 +sixnine7sixseventwo34 +two45xjcpcnhgbsb1five7 +qqkzvpsixfivepfzdhtl92six4rhp +two6vqtxvxrvzpz +1qqsfrgdbsm8five +threeeightsix36xvtm +nine5eightczhsix3twoprztckvb +pxrsgpszonepdjvxcblqzkr61seven11 +5sevenonesevensix4six1dvhrx +cdxnbseven9qsevenvbv4 +sixlgjt3 +dhpxhpbkq3lc6rkjlpdz4five5pctfzsplrf +1kmsmgjpmkqfckr +sixeight1k44 +52qdfp1b8 +86fourthree42 +six2fourpjtsvskrxtmgxnj2one3dn +rjtfqxvfm88seventhreeeighttwo +fivepgfvxcds64sevenhg +glvhcrgbtphxfsfourthreerqhjxpzone5gh +1sevenone34 +689five9ninetwotwo4 +6two92sixjb1cbhmrq +fiverrvllhbgcsskh2 +foureight6fhtx1five8eight +pqvvjkhtxkxcjkrf9mn +threefive2hs6one6jhkbdh +twoninefzflrqqzvp2xnr8 +one51 +7bjpnfsgpszrfk5fourthreebvvn +six74 +twozcgbrrhxcpznx9dlcgdchpndcdc +nines566 +one72zshxlsix +vseven4fouronenine6 +7four1nine2threekzjbs4 +onecq3four +twodcrx8 +four35sjjhpfftzsixfqctsfonefiveseven +sxqnssjtwothree2 +8fdpjrztwoseventwo5rmqvoneeight +pjlbnl3rg3shchseven +zdcrnpddv2 +eight2foureighttgjcxtf2 +ghhxlxqttvonerh96715twonectr +9hmfxxrsdbsixbtwo7sevensix +32ghjqjfp7three4one +197 +twon8five2 +vtwobrlhqsq1twothreesixthree +xbdxninefour8seven +five39 +621eightsix +21fvdd11tsdzhjspzld4 +7seventwoeightfpnkhxmvc +96sjrcvzxsevenfqt4seven9 +xzxmtsrhbfivenineninerxgcrx9one +5pzgmrgrg2kdgl9one +lqzmttxcpp7cnfstnhtglzhssntjmsixseven6six +two711 +6onevjnvmkkx +eight7dbmznvztwo +9mlpltkt3 +7ninenine4tpjbsbtsgzttlgrtnfvr91four +foursevenq7 +six1sgtbsmgft9 +nineone28fourjtwo8 +76threebgqvh6lfbkdmfvcthreeone3 +13cvtpqnmbv +1sevenzjhtfpbfb73rccvtnmtthree7 +4xhvshhtmxx7sevenf9 +8one1 +931fivetmdmsrrmfxrplkfvfourthreeeight +qzbthffhlg2 +one4eight33 +qfjqt9jlcthreeqkfdpfiveeight8scfnlj +fvczqbtsix2bxkgsnsix5nine7 +9qxnvlnine2phnlqzninefive +tszjsxbsixtwoeight62ffjtdnxxtwofive +one2skxg +five5onexzgzkjvtqrfourfive +twozsxzqtrqbxqqqsbcvfpgdcdpttwo1six +8mqkgptxsixhqmbqshcl +lsdlsxrhdqthreesix2sevenchjxvmsjpvrnpcblgmsix +gngrfrhbxhqkxs5fourr8three4 +jlzszzz9one +twozrbjkjpzseventwonine8dbmfdjcb +3nine36ppqone4czxvkxjzv +ld6eightseven6twosix +1jnbfive +7threeglmcdhpvq4723fivethree +seven148oneightd +sevensevenseven6sixtwosix21 +8twojhdkdrcqgmclqlldv6sevenonedjthcz +ninesevenggsjbpt5ttlrq +59sixfivefive +eight9bsmcgkseventhree66qmgpkkxnpm +fourthree73fiveseven +9five9six8threet +3eight44 +dlcbjflsix5ttvjdxzzeightcffrtfjcjpxtwostrdc +fiveone645fivellfcmqqmnine +hxdtshfive115tfvrzqhgftwojtjrcshgtq +6nqrfrhv17jdxpfmmdt4five +sevenxtpjxnrr1 +krzkthreegjnqrfbsdrkqptd33rsvrzvvffqhreight +472ggfive56hgnvz +12tkpchqtnine +vdbsctv6eightth82 +fivetngxlttf4 +5nss +5onesixsevenphxtmlqhzfcjxrknpv +gldsixrhss186seven6 +gnpksz4 +4919 +pbc19