summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Vink <ivi@vinkies.net>2023-12-02 22:10:34 +0100
committerMike Vink <ivi@vinkies.net>2023-12-10 20:35:22 +0100
commit9dbbbc4fe5d85e917e8efa977501b4ebacb349be (patch)
tree06339fa764a7dacd9b1f6e2093e0e9cdba4c2f8b
use tree for day1, why not 🐒
-rw-r--r--.envrc4
-rw-r--r--.gitignore1
-rw-r--r--Cargo.lock223
-rw-r--r--Cargo.toml9
-rw-r--r--flake.lock154
-rw-r--r--flake.nix58
-rw-r--r--input/1/in.txt1000
-rw-r--r--input/1/test.txt7
-rw-r--r--input/1/testlong.txt14
-rw-r--r--run.sh16
-rw-r--r--src/bin/cli.rs20
-rw-r--r--src/bin/daemon.rs3
-rw-r--r--src/bin/main.rs117
13 files changed, 1626 insertions, 0 deletions
diff --git a/.envrc b/.envrc
new file mode 100644
index 0000000..1305de8
--- /dev/null
+++ b/.envrc
@@ -0,0 +1,4 @@
+if ! has nix_direnv_version || ! nix_direnv_version 2.2.0; then
+ source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.2.0/direnvrc" "sha256-5EwyKnkJNQeXrRkYbwwRBcXbibosCJqyIUuz9Xq+LRc="
+fi
+use flake
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..87d5a54
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,223 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "anstream"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
+dependencies = [
+ "windows-sys",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628"
+dependencies = [
+ "anstyle",
+ "windows-sys",
+]
+
+[[package]]
+name = "aoc2023"
+version = "0.1.0"
+dependencies = [
+ "clap",
+]
+
+[[package]]
+name = "clap"
+version = "4.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+
+[[package]]
+name = "heck"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.70"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "strsim"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
+
+[[package]]
+name = "syn"
+version = "2.0.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+
+[[package]]
+name = "windows-sys"
+version = "0.48.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+dependencies = [
+ "windows-targets",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+dependencies = [
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.48.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..fd8ecb6
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,9 @@
+[package]
+name = "aoc2023"
+version = "0.1.0"
+edition = "2021"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+clap = { version = "4.4.10", features = ["derive"] }
diff --git a/flake.lock b/flake.lock
new file mode 100644
index 0000000..6ef4886
--- /dev/null
+++ b/flake.lock
@@ -0,0 +1,154 @@
+{
+ "nodes": {
+ "fenix": {
+ "inputs": {
+ "nixpkgs": [
+ "nixpkgs"
+ ],
+ "rust-analyzer-src": "rust-analyzer-src"
+ },
+ "locked": {
+ "lastModified": 1701498074,
+ "narHash": "sha256-UNYTZtBYa/4G5+dRzNNXNcEi1RVm6yOUQNHYkcRag2Q=",
+ "owner": "nix-community",
+ "repo": "fenix",
+ "rev": "ce8747b0d8d6605264651f9ab5c84db6d7a56728",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-community",
+ "repo": "fenix",
+ "type": "github"
+ }
+ },
+ "flake-parts": {
+ "inputs": {
+ "nixpkgs-lib": "nixpkgs-lib"
+ },
+ "locked": {
+ "lastModified": 1698882062,
+ "narHash": "sha256-HkhafUayIqxXyHH1X8d9RDl1M2CkFgZLjKD3MzabiEo=",
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "rev": "8c9fa2545007b49a5db5f650ae91f227672c3877",
+ "type": "github"
+ },
+ "original": {
+ "owner": "hercules-ci",
+ "repo": "flake-parts",
+ "type": "github"
+ }
+ },
+ "nixpkgs": {
+ "locked": {
+ "lastModified": 1701068326,
+ "narHash": "sha256-vmMceA+q6hG1yrjb+MP8T0YFDQIrW3bl45e7z24IEts=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "8cfef6986adfb599ba379ae53c9f5631ecd2fd9c",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs-lib": {
+ "locked": {
+ "dir": "lib",
+ "lastModified": 1698611440,
+ "narHash": "sha256-jPjHjrerhYDy3q9+s5EAsuhyhuknNfowY6yt6pjn9pc=",
+ "owner": "NixOS",
+ "repo": "nixpkgs",
+ "rev": "0cbe9f69c234a7700596e943bfae7ef27a31b735",
+ "type": "github"
+ },
+ "original": {
+ "dir": "lib",
+ "owner": "NixOS",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "nixpkgs_2": {
+ "locked": {
+ "lastModified": 1695644571,
+ "narHash": "sha256-asS9dCCdlt1lPq0DLwkVBbVoEKuEuz+Zi3DG7pR/RxA=",
+ "owner": "nixos",
+ "repo": "nixpkgs",
+ "rev": "6500b4580c2a1f3d0f980d32d285739d8e156d92",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nixos",
+ "ref": "nixos-unstable",
+ "repo": "nixpkgs",
+ "type": "github"
+ }
+ },
+ "root": {
+ "inputs": {
+ "fenix": "fenix",
+ "flake-parts": "flake-parts",
+ "nixpkgs": "nixpkgs",
+ "systems": "systems",
+ "treefmt-nix": "treefmt-nix"
+ }
+ },
+ "rust-analyzer-src": {
+ "flake": false,
+ "locked": {
+ "lastModified": 1701447636,
+ "narHash": "sha256-WaCcxLNAqo/FAK0QtYqweKCUVTGcbKpFIHClc+k2YlI=",
+ "owner": "rust-lang",
+ "repo": "rust-analyzer",
+ "rev": "e402c494b7c7d94a37c6d789a216187aaf9ccd3e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "rust-lang",
+ "ref": "nightly",
+ "repo": "rust-analyzer",
+ "type": "github"
+ }
+ },
+ "systems": {
+ "locked": {
+ "lastModified": 1681028828,
+ "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+ "owner": "nix-systems",
+ "repo": "default",
+ "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+ "type": "github"
+ },
+ "original": {
+ "owner": "nix-systems",
+ "repo": "default",
+ "type": "github"
+ }
+ },
+ "treefmt-nix": {
+ "inputs": {
+ "nixpkgs": "nixpkgs_2"
+ },
+ "locked": {
+ "lastModified": 1699786194,
+ "narHash": "sha256-3h3EH1FXQkIeAuzaWB+nK0XK54uSD46pp+dMD3gAcB4=",
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "rev": "e82f32aa7f06bbbd56d7b12186d555223dc399d1",
+ "type": "github"
+ },
+ "original": {
+ "owner": "numtide",
+ "repo": "treefmt-nix",
+ "type": "github"
+ }
+ }
+ },
+ "root": "root",
+ "version": 7
+}
diff --git a/flake.nix b/flake.nix
new file mode 100644
index 0000000..eb14a44
--- /dev/null
+++ b/flake.nix
@@ -0,0 +1,58 @@
+{
+ inputs = {
+ nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
+ flake-parts.url = "github:hercules-ci/flake-parts";
+ systems.url = "github:nix-systems/default";
+ treefmt-nix.url = "github:numtide/treefmt-nix";
+ fenix = {
+ url = "github:nix-community/fenix";
+ inputs.nixpkgs.follows = "nixpkgs";
+ };
+ };
+
+ outputs = inputs:
+ inputs.flake-parts.lib.mkFlake { inherit inputs; } {
+ systems = import inputs.systems;
+ imports = [
+ inputs.treefmt-nix.flakeModule
+ ];
+ perSystem = { config, self', pkgs, lib, system, ... }:
+ let
+ nonRustDeps = [
+ pkgs.libiconv
+ ];
+ in
+ {
+ _module.args.pkgs = import inputs.nixpkgs {
+ inherit system; overlays = [inputs.fenix.overlays.default];
+ };
+ # Rust dev environment
+ devShells.default = pkgs.mkShell {
+ inputsFrom = [config.treefmt.build.devShell];
+ buildInputs = nonRustDeps;
+ nativeBuildInputs = with pkgs; [
+ (fenix.complete.withComponents [
+ "cargo"
+ "clippy"
+ "rust-src"
+ "rustc"
+ "rustfmt"
+ ])
+ cargo-flamegraph
+ rust-analyzer-nightly
+ ];
+ };
+
+ # Add your auto-formatters here.
+ # cf. https://numtide.github.io/treefmt/
+ treefmt.config = {
+ projectRootFile = "flake.nix";
+ programs = {
+ nixpkgs-fmt.enable = true;
+ rustfmt.enable = true;
+ };
+ };
+ };
+ };
+
+}
diff --git a/input/1/in.txt b/input/1/in.txt
new file mode 100644
index 0000000..8478f1b
--- /dev/null
+++ b/input/1/in.txt
@@ -0,0 +1,1000 @@
+9sixsevenz3
+seven1cvdvnhpgthfhfljmnq
+6tvxlgrsevenjvbxbfqrsk4seven
+9zml
+52sevenone
+41onevfsgvssxnpsix38four
+15ninedzhkpfstrscggbqhktwo
+rxbfsvhpnjvsixmxfhhmvdvg26rgrfj43
+gcbq2sghsv4fiveeightrlhchsfs2hsrjknfz
+tworgqpdjzrzf7one
+fivefive18
+sixfztrcxmbzktwofour3fiveeight
+2g4stjrjjmbngvljfvg24
+5jkcdxkltwo71
+vhpttjh2
+3threegmsppjrngfive7
+ktkgsvkthreevone2xxrxzgdqpnone2xnf
+llxzczt3seventwotwosix5
+eighteighthvllljmgg82eightseven2
+9hcjzphpktwo76xfpdvnhklzthreejrzkdknhrktwo
+fourtwojrvzzctzs5eight2vlm
+zoneightthree2hvhfsprqxmlsix7onevn4
+56sixssevenfour5twonine
+58fourfour
+683
+8fourninenhfpz9eightptsnnb
+gddmrzlpn9
+g3qsbqmbhqqp1eightkjggcxpmzgg
+6bzjqs7nxpvgtwoseven
+271lonepxp2flbmbz
+5sgshnrfn9qxt8xsnhtdtx6
+cnhflx4sevensixonethree
+595six93
+6eight8jbtmxdqpj96mqkrdxt9tpbpppl
+68qvmgth371lqcrglmvqxtwonfk
+mbqbhpmhspsbbxgflg98zn
+8oneqzvdcrh
+kb6
+mhgvpmfgjfourfourtwo4
+81mvcgqxlktbpkkrsgbdgeightbqn65
+hlbhthree1seven9
+vqczmtvqsnd3sh63
+qrzngvmk8
+chpldqtkhqbvdvmnqd5
+6three6two
+sevensix4tjvkcfgpone98
+96zgpcq9four
+cbvksjgvvklhnksixfive7kmmxg
+threeljfr1vzskggfvjsccc
+8pfourthreetwosix
+l2sbdcvngvmtzrtq
+hjdxfj94
+2hbhfbjfteightnr5sixfpfjkn
+2sevenjqlpprggjlkddqv9oneightpj
+fivebfmkdrrrdkclkscqmtwo6five7
+fourrp8fnbp9d1fl7
+six8pffqfpjl2nine
+91sdjlghq5
+fivemrmcnjmfcnck2
+v1
+78htfvqsztlsixeight
+5zpjtbgpkvkxbgpsp3cgklflkhdteightwortv
+mcxqfgxt49sevenone9
+rt2dsvpf
+9dzxmfour76six
+tsbmbdrgmzsjeightonezqhqb5qn
+seven8zllmz
+373onefourthree
+1fourfivezthdcxfr
+996seven2four
+8smnghninezczdlzxxgf
+7cbqfzrmhxdmrdr94tz
+6vstr65tfivelmhjshhj
+248fourlckvrtnzz4sxdqpgkvh
+zfivejfgfgdhfrhr6
+one2tworsmtnzfjhvvqjnp
+5threefourjsnfzninethreejrknzfn
+seven9nine
+gthree15fivemzpnqgttcq1
+fivevvvkgtvs3four4
+five121three
+7fourn
+sixdnineqvfqglmn98516
+ninesixrppx4
+threesevenxbskhlqbone276
+fivesixfour82
+tmdnvgrkjxfour9
+61nine
+vtxpkcgb48jzx8rgeight7
+twoonetwo3
+four167bnbdtxq4xvdgckkpb2
+xgbxvx7ninehmvqlldtxls88qhztfldr4
+5qxsfdchthree41
+fournb5gfqzfrlnc5fivethree1
+t6fourh3
+ninefgzksevenseven5sbcpnczgflqptjhk
+6three4
+5tnplthreeeightvsk2fivesix9
+three8hcvnmvbhbtwo
+6jnfourdbcgzgfzczbc
+z53
+fourxzhgjfrrbmkcheightfive7seven8oneightb
+2fivehkhnbtm
+rptgktsnzvsslcvfsevensixfive72
+95chcvtxv4
+ninenldnphcpn93fivetwo7
+threeeight675vmhvgtxxc2bp
+hfdmpv6
+xpffsljjcm27
+8sevensix8
+7hmszcvzpf9eightqqxgjdnhpfour68
+2czrnzdpxsjsdldcxq2vzgfrthsssix
+four5bdxdnvtgcbdzzsxjdlbckninetwo5
+35fourfive6
+z5eight3r84hvptgskcclbsgh
+2eightljldmconeeightgvhm
+4sixsixsixfourthree
+tnnthreelfmhone1onepfivevdg
+8nine9lmpptxstrrbqbjrjtm4seven
+2ltqd9mnrbhcsprz
+two5ptcjzbqnk2spvlcxqvglndgvrlm5fiveeight
+52sqstnqpdeight55
+2nvskvthreeqhkqvjzqrk1
+gbkqz127four
+8zmngr5381rb
+klrlqvkhslvbxdtwofour4cmlpbdm6
+eightninenjnmc8zrnrltgfmfour
+38sv7
+eightvtkkmhhninebmgdvconenine7sixjkdzxcr
+h14bdgvknbnjq4fv
+74svtwo
+7three5sixone4
+zseightwo6five
+shkznseven5ninefivefour8
+mcmztmrgctqszzpqs8tworfvkseven
+onejjmdfour15nine4
+7bxqxxxvlthree4tb9five
+twoqzpx6hj
+68hbdjdd45two
+68
+4hxlfbgvtdmbhnpfzxpnltfivemtmczjcbffour4
+fourseven4hfffmtqoneglgnnsrqsmbnxr
+dhbbmcxtv7five9ffjjcmshv31seven
+foursbgvhgbggnine6three4zznzcvmxxqktpdhff
+681cvdh
+3ninefivefive
+jg4dnnxzdtwoqdbvfsix
+g4dbeight6rkc
+236bjcppxmlnine
+5crthreefive8
+6twoknqfbmeight5c
+64eightrkvvtjtsonefour9eightwoqxq
+sm7sixfivexbrkvhtl9
+threeninetwotwo1one
+tjjeightwoj3gsdmdseventwo1
+63sevenk4blssxzkcq29ztjlnx
+ckpleightxgngnhkj2threem
+8knckxzrfbbpxldzninennnmkxkzzstsflv9two
+rmldrlcvccgdbvdnxvqr3ninefznpqrrtd1cfpjrvjzs
+5twojdflbxnlslnsjtklqkrbklvkthreejgxkfzeight
+sevenxfpzvss6
+one61
+2seven7eight
+fivefive5fourtwo9vjmxmtpv
+4pxfour
+twofive1eight9ldjbfbzhhffdb
+onefive7four93pjchnkrzvz
+4194hgfslhdczj1ztjtnccpjseven8
+sixtkjmtcthreezjfcgbdhvqlmbpzmc7
+nineeightvnd55sftvbf4sevenrkgbjskxbj
+kqoneighttpqcnsphsfour7eight9sixthree
+5foursvfsztnfivekkkftdfbptmrgcone
+sevensix8one5zjlfcrqzvp
+1hmvpbhzcbgbgvdkblnhgklltxx
+55xszsjgbd2fk
+hdrhmddj6ninebcfhbd
+f91six
+3tltgktntqpkeighthbqhlxcqnffgbfvxrkmr2
+3jthree
+2eightplclghthree
+771
+5gccqqmzmx81twob
+6pgnqbsqglk44mvslnxghckcbtffxvkq2
+twooneone5
+twohbxsxj2six826hlkdjnnz
+17tbdmntksvn89fivethreeseven
+sixplznhmbgzmlh3six1
+h2kvpbnkcxrssevenfive
+jhpmnksix7fgnbhgv8fztxfrpfvmnrvhzr
+vskpbnine3vjqdlmv9
+vmg86ht36sbnzphxfive
+klqxeightnine6
+4nfninelzshl26
+zqsb243hfdtvgx
+two9tzcrmrsix81xsgvldl
+ggqeightwo5bdpqtjkgzdclxsqptwo1eight1
+pvfzftdxqzfourmmbzlbzcfsevenfivesix5
+fivelt5fivegshvshpvkpqlddmfj6
+cjpzgsvgsz7kzcpr1sixfour
+8two4onesevenseven7v
+ztwonefouronezdvggfive8eightzflpvlnxfspgrtwo
+one7tphmqvfltwo
+49seven2three
+9rntqtxseveneightgflqzkrxhglrnvrvz1
+four6nine7
+5nine3
+4ddpkhft12hrhjvbtdxthree1tpknk
+7k
+fmlrpkxqktzdldrs84onefptgdjspldljvnine8
+oneseven4nineqbqlbxf2kqnpr
+ffivetwo97mp
+47h92ffcd6
+two7tcjvxdvctfivepcqxjnzfourfcndmdmnjseven
+cjdjxmnmpqr6cqvcscdpg
+onefour95
+seven9onenine
+trpvv6six64kfmxqrdvbsevenhqzk9
+tsgpcfxsgsgmhd7rvfz
+66788
+five26b
+chcbxone1
+6mrlfkqjssdxbtzkshvc8hjltjjxthkl
+four5sdsevenvztqmzkm21threenine
+snxrlctcztlbntnxkpmbs2
+652nnhvz6vcgx
+2zrxljdgsnnfour5fourp4
+85lzkjln55239
+51fourrnbkb4
+xbvsjmgsjdvhjpxdjhl1
+6sevencfhtbm4svgpzeight8three4
+827cclvxpdgqlhrjvrgxbxthree
+8pgqr
+three2ninesjztqjdhdv
+538one59one
+6lcmxone4ninehzzb13
+phckzkgtxdcnine8onefour744
+five61
+skbknb9qknrlszdt
+fivenine6jnxfsseven7
+lfj2onethree4198
+bb9
+kfljcb5zssbrlzml
+twohmspvflmxnine2eight8
+4onegfnxxqpqnfour7
+qvg7seven4
+85bheightghccknine1three
+fivedpthreeseven1fiveseven2
+6nine3gzlbtvtvlnine6eightmdn
+seven3seven58gzmdjmchdrzxgkgbbfrf4
+2lxbnnsixgdcv6hrqjnfhdmz
+8threefiveflbfmthreegtvckvpxkd856
+jbnkkbvfivexqzm238zxvztfl
+68kglf7
+9fivetzjsixkvfrngxbfbbjpd69
+ninejgz82fivenltntmfs6xpxc
+fourlseight3qrrrrddzlone
+seventwoqfkj2qxzddcgtb348
+xgjddt5
+q8bfhspkgmsevenninevdqmlzxznhmdlg
+qc2sqqlkfrkj652xpgzjskr3four
+two3tpl1cvmldrrghr
+qhoneoneseven9zfivevrkkjhtdf
+ddjczzpcvkksjzdcmxkhmbds2
+qnvgskzdb3nine77sdvfhfqsnv2kjffgsvz
+six8three3vbpnkb
+rgjmvgtgfour36qqbqznkjv78cbpdqb
+fournshtzbqfourthreefive8hsbpflngrvzdhone
+toneightone9four
+fourkkxtzpfivetwovnvxmtkeight4t9
+tbxlvkc5vgcmdckzv
+7threethree
+9ntqnzpldshfqlc2six
+8zs7five
+3threethreentqthree
+jmxjl4four5
+jnmrhzpdvbvvg9qcxjjmv2msrszndl
+onezjrkeight4two2seven
+32jlkhszgnkklbrsgpplphh
+1gsdqlbgt5eight1
+219
+93gcgx2twothree9xggt
+5fivenine1fiveplgmlffsvzbtqpb
+qv7lthszlgxeightnine
+7sevenmhmkcrkkq
+mxmmgqp4rptkbhfourvjh
+3mrmhgjmdv6pvfkbmconelmlckqkxjfiveznxg
+7one1kbjnmtpskgsix99
+bsvjlfgrcvvhmnfjzktdeight9914
+csfrjtwofivebcrcmggfpfsevenlmhncfb1two
+3five1vphfournine1kvfvzrtm
+nineeight3vxrdvttwo
+snncrseventwo5sevencjgl
+ngmgxnlsjjhvqpcxjshninesix63
+4threeone2twotzsseven4prqdrnjln
+fivegfmn391
+three5xflqlnrjgfpzt5
+28two
+six729twoeight7
+eight11
+sevenseven1fqcsevenonekrgxmone
+8rvlj62
+one3ninethree
+89s6two2twofive
+pnhhshxqb312
+vlnj5eight9
+5seven5eights3eight1
+6kqvkbjrfveighttwo6
+5twofour
+ztnkthreefive1fivetwovqjpx3three
+qs2
+2vft3
+zjr1zjpxndcsc
+76threesix
+1four88n7
+9mrrkjzlxdc
+1ll89
+fgvcseven81
+4789vtvtcseven
+2lcfbmqcqt
+5sixonefive
+cdoneight1onetwo96lpllgksff4hrzjkxng
+gntghdtwo1
+eightninefpdttgflvr2
+8zcnfm4krxhfive67seven6
+2hxpgvxgsmc
+trlvltteighteightrzkxntpdtpl24
+hkttzcmnck7s1seven
+sevensnmhgdxpbksngnflnthreemlqgdvphzk5tvmzjvdzbcseven
+eightpsbcshqcbppkgfxcnrgtwoeightfour6four
+53xktsrztnxninehpjjjktqnsixfivefive7
+sevenonebkdseven1seven
+11sixzdqbbppninehhkpxdbmlv2chddf
+3one3fivesevenlljjmxvzbcnqtszvzspsevenb
+1txlrnsb1vq28kpvv
+1two855
+2lxzhcjl1qfslvldkpdcxf
+9seven3fcqtzfive
+eight4phtznrb69xqbmxmdvxnsstnine
+eightfive2sixnhxcffkq95
+five28cppfive1two6
+p8
+kn8
+6hvzkkr4nine2seventwo4
+39134
+dztwone3kqlbbbknfive
+xvvdhddonekcgqqqzgxhlg2seven
+237rhppmlcmhsevenvnjxhzfnzbzrsdl
+1kgq1qsphhpcdeightjnfsdggnlnckgfbj2
+bnvpzxtnt16two
+mkhvcrfqdtwo3qfmhs
+1hkjncflcz5four7bbgpgcmnv94seven
+7seventmmhfgngfxt4
+98238
+3zmnhxqjqhjtptwoqtptmxfdp3seven
+bkqxlrtf4
+onefive8tvb6fiveone6
+1four3seventhree5mvsbsdjz
+jtjsjflv5gxvhdgvrbgbdcjjtchkvmf
+sixthreefcrbqzqs7psczkdc
+dc572twonejgl
+2xkrpz9dfslbjvmbdkgsixhkgcvdgktq
+five114
+8two85
+9fbh79mqbfsxcnn1two6
+6one9fivetwo
+gsjljnkhhvqlmmvcthreemfcbnjsbkvzzsnkb7
+nine49twojdqjsfbzsixrhbjhn4
+3threesix1
+52six1twoseven
+eight9dbb6hhjnt
+gsnqmninefivefbqcrlneight1
+jxczccqqpxbcq8
+1ckvkgqtvqrpvdrfivejjhhfkxvvhfm
+sixdxgvgglfh4qzczn8jpgqmgbzkmcdjfnhmh9
+eight7nine9
+tzqv6fivefourhfz
+sixnine2vkmdnkgtgnbbkcxvvsc2bf22
+78two41
+srpeightwovrhmbnkpnsix1
+fourninemfcvlstbmflzqf9lgvlvrlff2srxpzvrp2
+kcgtwone9eight
+7three1onesix1m3
+rgk2fiveeightthreegckdbd9dml
+sevencx9onenineeight6
+9ninetwocb4thttbkqj
+five26vrc2krtfivejpgdmtjg
+2ninethree7cnxbkpvthreefiveqclhc
+98seven28
+onetwosevensix9three8
+sevensix2
+ninesixlrdgpbrzs7onedrtlqpfour1
+pmvxzronexxxvbdrjr7
+15eight
+crksmfive64
+onetwo6fivemqkddjfxndjfpzmeight5xzk
+gq3ninetwo9
+8mgkvbpmbzpd7
+xfbvzlbpvb79
+kkbrvppqcg5
+94dkngltfzs98
+rchmjsrh7onejcknbl
+9threesixxrbzjt
+3963seven48sixeight
+98992
+7zqd
+sevenseven814htznfour1
+ninefivedfrtwoone5
+qzgrrng8six
+3742zsgbqgfvzlgsgfmxql86eight
+seven7zdfrhonemfhcfmclxj25three
+8pnhpnsqxh
+62seven
+eightpfgmmdg945ksctbstnh6cdxvgqbl
+932zsnvmcone1ktfqfmbnsfive
+dglzhqjthreemzpm78
+one7sk13ghnmvsrprg
+jdvzccvczspscxj5rzzdqdd44txvprhqx
+sevengmtcflgvpzonecvmbtgknine7kngpspbg
+xmqk6jmhmdtvh2kbchmsgpjrv2four
+tntsjnine3jksrrvone
+xfzgbzfive3ninekmnjrlqkzq96foursix
+3xbcth723
+zbvtsrxh94s
+threesix8mjchcpvmdgfive17xb
+8eightnbbzhfhf4fiveeightmnzqldztsnfour
+tkglxsb6one62rhzggrtgqxqnvjzfmb
+gtj2onempqp34qfjnlxtztvjvsv
+2eightzxdgc3
+32dgskjkh2
+sevendnvrcm5166
+5knxkkjh5
+fssjcvvckqjrcghcmlrkcvxl22
+2jbhdlfjtbfivetkjbjmtrgxrdmxsix
+fivedm8pzjfngzfsk35
+two31ldnvx
+5mfive9ggkq
+vqdhfsfkrpp44trqpnkqsdxvvdxc
+lkdqckshmn1rgrvtjqj
+ttwoneqzmsxzskbbnkfh8onespphhmsix31
+jknbnfvbf1snjscz5
+sevenvjn9
+ninetjzhbdjsffthreecfctlsfrz2
+6ninedqmxfqxssbhrrffpdhjvhqtkxfour9
+6tlrxcvhtllkrhjxqt3two3
+eighteightfive79
+5sixfive7bjlkninefour
+xrgrxsvm5bhcmzggbkrljnssxgpgdlv2four8
+1mxlnrtsjgdlcsncktrsfour
+8xtkgjjbtjfnc62vsshkjp
+91twoninetwo
+ninefour5nbnnzhtfiveggrjf7zqzblbml
+sixfour42rtbvlpcnv4
+oneczchdtwoglj9279
+jfvv5rdkpzldsxh
+ninexghzhdqk67
+gnllbntksevenseven7sixeightvgnfd
+qzqjxcqrs8fivesevenrnvnq9nqnchpjpmfkgtjqcsvtv
+6sixsixspzppcstlhqlssvt
+4hhfndc17rjrrzvbjj
+xm6sevenseven2fivendnn
+threesixd6nrxmxgcbjfrtlmpkjnoneshmrn
+ncnpmsixfour4two
+pqvz9fourkkmfvzbjqbfour
+szspfourhsqkfkfcndcnineone5khdb
+six29sixlkfbphnrzcjl
+cdtwonenine73
+mtlqpjcqcseven29
+8onekdvdmjbmbjtdngxhjjchdv7bvsbjqszlhvht
+fivevqnjsvnhvnine1kxcsjmzx
+6six32twonine
+nnsix5fcsrdvoneightcn
+11rzzpnrtnsevenmvnhgrsgngthree
+3fourjfonefoursevenbbfour
+fiveclfour7seventwoeight
+4zvzlfive7hkzhbqrleight8
+4eightthreemthreeq
+66nine
+dlnm59eight
+fourthreexvgpp7
+85sixfnrjqvmzmtbpxttrn
+one2seven
+63fourztwofdssrbjbcvhltg7
+fdstgbg1qdznxnvftfvfnr6djj
+5dcmbkrlvsrfvbdfqfour
+xp6fourrcfxdnktdctwofour
+9three4threeone6
+8pjzglttwofive9
+2gsix9sixthree
+ptwofive3t
+4hqkqzjkqddnnhxkrfnhgbkthreethree2
+threedthcktqkcthree22
+2gdlntwoseven527tzxbzkdjbv
+6hbxrgxzcnlbnz6
+ds7mvjbvfkn
+sixrpd7eightfour6
+qfoursspgghsflcrvqeight6
+94hxsj5
+bhhhnfnnkninexnjtjxrphrkc9mdmjp
+pbttrcplcsrldftsgk4991threepcbhxxfrgjddpz
+6four1fgjmjcnj3nbxxnnxhjhv
+6onefourshbzqgxjnhpmz
+9onedvscbrdj5
+jgjrpgcjztvkqseven8sznzl16dzrhmhnq7
+ctlbzmcctmkzpqtsdztbmllqnoneoneonenine28
+znkkbdsix23msxkcs
+seventwo365one2nlmlbgh1
+mtzthdjtonezfsixms5mxjpftkd
+onenine8ksxnslf16njqldnnkjx
+pzjl78nztcgnj211zxnmhxzrjjh
+twozkf3fiveshpt
+seventwo387bnfsix
+2xvvtzthreexjfxxg4seven
+8vgjxlvjc4twoglhmpgtsbfonethreeqbpcfbmz
+mhlgjlbm68rmeightnineone
+threezhldnzscqfour9seventfkj
+cnprmbrprlhmonesixlksvgzseventhreehdzh2
+smp215344two
+5nineonefive8sevenzvlfrprdq
+rvf583
+four8nine4crzpff
+rhnsqgnncnjzhpx297qmj18
+oneqlx716452
+mg3zptnqbm
+4ssgqpsevenznzlnnsbjpxkfvlkrjckxrhqsevenzrgjlkcffb
+six9fourshjkhspkcffiveeightqqkvktvjsmmnfrthree
+sixdljbtwoninetwo6ninesevenn
+kcjqfvldclrmsd52qn
+352one
+7nine7
+9fourjcveighth
+5twoz73
+bbsvvbjc1one5gtts3nine
+four2six
+7nine5
+nxjfthslhc2sspz
+69onethreefour8nq4eightwoqh
+8mfpmmthree6eightbksq7
+98bzjlfjm
+six541threepklngxmfthreevvkdgxpfour
+seventhree4ninesix
+7ninejkcxsixsixlvffhbkjkfive2rdnd
+9flxnpfddx68mfgnkkdqlonenblbszdvvbfour
+threemfk22vf
+threeninemh6
+88six
+4eightrtthree
+4rkjjgppc2lkvnhbnhffnrvqsj8
+65gdpxxz
+5fourfour6
+six9m9eightfour
+21szgzbcg
+krzfvtsgp3
+six2threethreebskteight4twoeight
+58bjrnzbqg
+8eight4four3
+four6qcrnthree2
+j8nine7gqlvtqxlzdtcbonetwo
+sixvlthree55seven37
+48sevengfgzczbg82
+eightsix2qsqfgmsrscfive
+zpbxnxbnmjthreebmksffpkd7seight8nine
+vfvhcvnsevenkbnhxxhhc3csk79
+147threesixtwo
+hldlvjninehnqxd7fiveeight7sixkkbmjxnjf
+six3gjbkbpgzdszl3f
+donethree3seven7xvfgnthree
+3lgpzhzmfftwoeightjhlngfn6five57
+5fnfl6vkncfsrrrsmxsl
+7ss
+five6gsncdxsixnhphl85
+3rklhfbkhfour884
+xsjseven7
+58mxlmsevennine7cssix
+1jnbbfourv
+r21kstwo
+zrqlghpcsixeightseventlnpnxpzv3
+887
+zeightwo3xzjvmqxpjtbvj
+1brtqrcvbrrqsqbpsl1sevenseven22
+4qcddseven
+mg3xxlgdkblgg1htdjtfthpv
+9eightwoslp
+ggqvtwonsfsevenfour73ccmzkz1
+7rfjfqh9nine
+gnpnrzzkdtfcseven45hvv
+34one1
+xzkfl9fivebxhcxrmfzszonekgzcvk1six
+8pzscngsixsrtjqqlk25ldczspzfdxrzhh
+zktjxcb72twosix
+9mvtk5jqhtwo
+two82klbfdf
+xstrdlsmx2onesevenrmgpjlrtfsfourfive4
+four1djgssbq8sixfive
+j1jkgzrjmnfxonejsvgzznsevenprbqbjn
+two65ffglkhgqb8xdxmldhtllj3
+lqqqsrjf27four9dgpjcgz
+fptvlnfzpfm99eight8five5xtgqt
+sgrdlpplhb2six6
+one4811eightrvkbchcngmone
+bcsv46dgxglfxsrn9two
+spshpxtwo6c
+1sevenrtbxc23
+sxppftvvfx4qvhbrrpcgfb
+rmcvzcl8dj4ninenpgjhlblbeight
+threeseven7lljggng5two9
+four47bnnine2chscshsrone
+kxtknjfourjr1pxxkqlxjsix9
+sixtwoseveneight8sixthree
+8djjznt4
+pj48hjlqfour7
+onedvpqsevensncd5fivenhftwo
+twonls1fivednlbmttzszjczdjfqcspxpt5
+11hbdpbbrjddrmlghs
+7seventhreeonemsszrjxd
+4smtgkzzrxlcslkhlnrft14fbtznvq5six
+rdv9four39
+four8fourvthreebrnmqmhb
+msgrzsdxfxfivecpjqxtphffm3zvgqxkrtwo
+1sevenseven3vlcmzlgseight3
+three1bkmpjqxsjmjsmlvhfrnine
+213sevenfkslf4ldg
+fivegflgdlqrfkmh81
+jrkqklq5sevensevenddlzbljvf
+5zjxsxqpthreeone
+fvh6
+154xqxjfvt
+32fnpjclfgjplmkf83
+6nine785six
+5one9fiventcxnine37
+24seveneightrp
+hbd6two1knqnfgcftq839six
+6eightzzqghd
+fiveptonesixnkslhvpkpsbfltfqnnqjfqjlhthree1
+ztdjmvrspdtbqsffive8onetwoblslmlxssjks
+876fivenhzmftccrcgvqnssixthreejhg
+jpvxbhbrv55ninefive1three
+ndpdvz2sevenn
+dkzpptsmbfhnnrqqtwodllstjtd87
+eight1fivejftckmgxmzbsq416one
+2q16ninesevenfour
+thdst7fourfivetwosixgfjsnvftone
+ztwone8tjlsrsqpnqsxfll9five39eight
+threefive757nzddvxh6three
+71two
+nbgsnbdvqkqr6nvsqhr
+four487eight
+mgqtnlqxpvbjrgqffourzbtvcxj4xht3twoone
+fourninefivefive97hzfxr
+4dhrgdrsr4onejzgs5x1
+cvnmzrdmtwotlvk4five
+7sixzghv5rxlbslsninefrsxht
+6lcmjnckbjrtwosevenvmtxcnfvkfqvgzp7
+dvndcdmtfxbtznqjrprksseven6twosevennine3
+threethreeone11ninesixeightone
+dvvcbsix96cxhgjpmqdsixone
+five4sevenmnzgktwo
+9rlsseventhree6xhtbxdnn
+bxlbjtmone15jsixeighteight
+1fivejlsevenmbbfksks
+eightsix35fourgcptzrfjhkrnfbbznine
+seven8sixfive72eightqjmcfjx
+seven8616xszttt3seven
+53twoone22
+onefour9ninetsrvczrnbsbrfstwogkkzs
+zpsplntwoeighttwo49three
+twoeightseventhree4
+eight5twofourgpnlsmppt1
+fourccknqs7dndlqhbsdhfmqgr1lvnpmxjtnkshgm
+five9ptrnrfdfgdkgxzlr6three
+pjxgrrgmfk57hdgclbftr
+gdcxzqldf3z2prsmfivenlklnrtbhfst
+999
+85lctfptljktwobtfnfrttlxrvlfvdnbsm
+172
+tmrcrhkvnfsixkvzhjxmngcrfmkfpzqcfivermnkxlfive7vtvvmmnfsz
+sixseven6two8kfrpjksixeight
+75pzmmlvsjn9987dftrvbf
+4z1fivethreefive
+foureightrdnnpxlnn32knstrmxg71
+svzljxbj113zpnpshmnf
+hj2hmvp3eight38gxngvkdmnzzzcxjkl
+gnrhzjzvrzsix33vqnnrmgtdvvkbsmglckd8
+onelgjfczsevenninehkhkxcskvcvnncbpj5
+onesevenninethree1
+dqqnkzfv9bnine
+8sevensjtppblkhh4seven
+ninekggzmfsfpbfnvtv3sevenczrhzztlsfour
+eight59hkthhk
+blskkshczzone7
+6one4pffxsgmc
+4lrbncnn8
+314ninefivesevennine6seven
+threeone3ccrfthz2seventwoctg3
+bfxknbtwortcfgnrcqsvqfcrxzmlmk83krb5
+fiveone8
+nine6661
+eight8884zbdzcsseventwonexgg
+16ninetnzftqzlpvgd2
+jxfccks1
+sixtfvgpjrvpr6pmsseveneightvbrxnq
+6eight5
+tdbs3cbfhglpfdnxlt
+nbcgkzchlj6pbcx4
+661
+jcjggnnn1
+eightdbtfgpfivecnlmnkrpgf1nine
+33bngjpkhgfqp4tl97one
+6rkmbdjztnfninecdlhnbnf6ninekmvxrqzbl
+465
+nfklpzppbq65threeeightsix9
+2gddbjlcdkx
+kclqnmpsixsix4fivepb
+stvlnrfdgcslqmveightbmbgmnzlrq8gfjndq6rsv
+sjzcfxn7hs
+oneeight32nine2ghx2nine
+2lhx9
+6eightseven9
+three9nineone7five
+1nrmk
+dccbdjqhvfoneeighthjsmfp89hheight9
+sixrfjshf9nhzngkgeight
+zsixone5fiveeightsix7
+vkthreesevenq42982
+2h
+8five9jkvqtwo9
+lkxvfm7qdhvnkt
+8jtttvnmxt
+1nine91sixsixfour
+8threenmffourone
+two2zjj39seventhree
+c4eighteight7hssvhvlm2six
+9eightfivezmnknpl5eight8seven7
+threenine4eight14vzmmhczfhxppqs
+seven22fivehgtttqthreeseven
+5nineeightthree
+hfffcgvnkrp5threevccpjmnfn3
+19seventwonelj
+4nine8
+2sixfggckcdt91three6
+9fpztvd
+pbm384
+rqxzzqtlsx8one91tjmqtcmkxhplcmns5three
+four13sixgreight64
+seven22four
+2six946
+nine1767three
+mdpvkhvbqstqpskhdxgbzt2zsdvsclhlzbcskckz
+1775
+pgdbfmvffninezhthree6qlrdkbvqthree
+29fourtwo
+fiveone14bsnrd
+loneight1fourpvcgxjsscssftbfxtkq
+fhtwobfnmvjxqzbzctxseven8lhxv
+ninefive67rqvgnbt
+2fivesevenfive4rhpvklfjz9ninezszc
+616vvbxfjplsppgpx
+rttqfddgone3rcvdljn88jqrlbdmxgv4
+8282eightseven
+mkhxlkksgsjrczffqmzzsevenv7seven6zv
+5hvkqdnpgtzfjbqrtzx5tncqbmxjpqmmzcf9
+llpkjvonesixlnf7one8oneseven
+five65qzjtwo
+xhcjxj1jghxktnmbxml5bbpklmdcthreedzt
+h3sevenonevdnjp5zpzfmch
+seveneight1mrrkcpbqd
+8one5rn
+qbffrljhl48qtg1jhngrrbsdhxl6
+ndc5sixcxlcgxpbstwoqfffive5
+fpfsqrzfjthreehzbcmhss4fivegbtwo8
+nine2two
+mddbqdmtcjrkqhv2dxfvdg8eight
+jbrkj2llgmg36twocvhmxnb
+mhdbsnine1
+four1mcvjdkmthmhcsz4
+59fbsnx7qrtclvrkfoursdpmhdz
+6d6four27zeight
+1sevenvjbqrd
+9fourlmjqn9rd
+gfxsrconexrgdzrhzcsh4six
+4one5jhsztrspthree
+four5eight2
+onebtwo4eightfourhkrsgeight
+51kjcqqxrjcnnine5
+kprdj25twotwovsdhzgmc
+htwone4344five1
+dvmkvcfcpsqrh1
+9twogzkc572sixhktmslseven
+fivefive7qnll7seven
+svbpx64n31onevzjhhhl
+8fbjkdcttwofourtwokj
+6twotwo5zkcnxczszfive32
+mbfcmsjmg9hmqngl
+ninesixsgnfzsmbgrlxbxjstkmmfxc5
+two8fourthree9sdxzvpgseventwonez
+td3two
+onespktrhrktzrcvdgqvdxgbgctdhjmm7shqcbzvfxhzlt
+5zfpfksszthtzxznxgkrpc
+8xvmsseven592ssmzjdmz
+64fkcmhmqdxnseven
+vdhkbktf1seven5
+tzfvfour3three
+fourl7four
+dkbbtpd5qbqgb
+qzdlttqfhn8chxxbnplt4
+qmd78hqdqxtx2rrdvkvvfourtwo
+91mmlbnbs5peightmznzhskfjv
+2rftqscv
+4oneonenineddktjvjlhone
+ninetwo5four
+1f36xndmtmmbpx1qzqmdkpbp3
+hxsevenjg6fiveeightwodps
+4mrndsix18
+r6klzqlz
+ndbrrsvp9
+sixsnkh1gvcnine5
+bsstxkninethree5ktwo7five
+fiveeight9five7
+3nine5sixkqlfrpdpcfive3
+lrrqkznlrcmbvdr6
+8xklphsevenonetworjgpjlrllgqcrxhlskfhpq
+fourmsthcgcxjsixcvnvninebdhttzm85
+8gnqnhptgkfivesix
+8onenine
+fivesixone3kpzvnbrjf
+9four54
+6twothreefthreefivetx
+4nxqzkkbgvthree7qxdhtpjv
+six5three2ninesevenfive
+3cqkmxnbkkh6tnszgzxqk
+82tzncrpvjts7
+39one5fivenine
+51jrdstpqnjdfbbtjz9three6
+nqrmg8
+7threesix
+one6fsxsflbnfivesixthree5
+bxbonethree55one
+7onextpttrflql6snmbdtbnvvfive
+threeklkjkvqzone2vhzsqdg
+eight231eightsix5
+cflpngxndfivefiveeight4rjrsfrmmtwonen
+three8sdone
+nine4nine
+two2dxzjxkbb2knvg
+bplttc53
+69hqtkfivesixtwopffgltlsj1rhhslz
+6fbg1scccrkjjsnnhpqmphksevendt5pcdl
+9onesixsevenfmmxtkdzone
+1onetwocrhcqhrxt7sevenr
+sixeightxjjqndfqtwo35
+9cqvtmfsqrfqhhbkjgbdk
+foursixfrtkpcbxgxx5one
+429three
+84mxhzmbdk8
+nine79
+xgntrzninemhxtqnine4ltvx
+four3seven6qhrzznzctwofour
+5h
+16eightninejmddlknrxfone
+3gjpbjdone
+654twocbczrzjnhkgdpqdd
+2xkptbxsixnprkhfslj
+19mlqcgbfpdonegdvzghjjb
+dnslxvmdlpmlsggq1one18
+lbxnz487vjlhhsxvcl
+sevengvgkk8mfbplfshlhqnrvbtwofour
+djfptvqgmkqgnzdvstwomzpcxfthvzpfsglc7
+1nlsztzzcbmqseven4fourdqq2
+cqcvkcthreeflhbcsbddg8
+sevensvtbtdkfkxzbfqznlh1
+sevenksn54
+4dzv6
+lsixninesevenrxn2seven2
+bsix2hqsvvvxvkpbg
+hplfzmghmbddz2htfkcfblqcdzfrvqpssbxdone
+19sqgxkn8four
+64ksmvcseven1748
+oneoneonedlmsdc1mjn
+7218
+3xdskntkmlcldqjgxbgx38rkbddntz13
+tnqnvshmhrkxbjvxcvdhmx1
+twocrzgfourbvtkcthdkrqpbsevenkfv8zczzszpf
+fdkdqfgbgnttlpnjrvnine6dvpdhtchfourbv
+qqrznptxjseven9twofourtwo
+hpdrqkonetvgfour5onepdk
+6eightsixninetclcsllxknspxfgxmlxqddvone
+twosixmcbbjthreekclp3
+kklgzxnk2eight
+zgmnine8oneseven
+gmcgzggsixvjzzgrs3gbzmxninezrlcfsphzhseven
+7sevensix5fivefourh
+rh1qzxvcmqjmtspknine
+12threecjltwozchdsfnkmchhgv
+vktfhngfb391ghtnrqfourfiveone
+9eight46xdxkqtkflqdv59four
+839sonesix2btrctxfm
+hzpjkvqdfg6three2twocsq8tskmdnvdl
+5f
+dgmvxqbpbjpbronefivehlf8ls9four
+sixm7m8three
+vgppvrgdlb26623csvkhsd1
+2hjfccgbjnhl8176xkpftwo
+seven12vgdnrvmmp1
+oneoneone7eighttworvpvsjzl
+738one99six
+sixrjm3
+15six44qndpslhnine8twonehkb
+912
+3blcn
+eight81fivexsbkzcthree
+kdqlzbnbnkh2mrpz82six3six
+sckfhxxjxfivejgtlmdhc3threeoneightrc
+znjgdjd8six6onesevenfour4qpnmvtdnnf
+7gnbonesixninehreightlmjone
+six3fhhlfgmdlgvhvqctcrxxh
+982vbjgptnc
+sgfnlppbvfzrmntwo9ggqzsixsixxgqvjvffour
+ninenine8
+kzfmgls5seveneight2
+8ninefourzrgjgrqkxrmjlzqb5
+eight7five
+fbjt4eight7rnhvfkl5knpvjhqdhvmvczxbvrx
+35five
+7gzjqslr13qsqxltsninetwoxmhgzhl
+threefour2three
+onethree45
+zvt8nvxctwo6
+sevenkfournine1drrmrmljsclgbgsd
+jfcnrxjjnbsrlblzpvxc84seven3six
+sevenonemt7eightseven6
+sevenrddndpj85fzzn4zhvthzp
+78zfdbmrfgeightgjtqnx
+ninerdqndgffive2dlsblldpfthree9
+lvzlfqzsixeightkqbnlv5njjsc4plh
+jsqhmbt1xvmkgfbghzdplkxdmgvcrkbngrjlpfj
+lfnvhdxcx7twoq
+five85
+1two3two22bdpbskrlph
+ninefc31fnhsnhf5
+2cxnrgtlvfvmvvmnfjllshmdvvfc48sevennjfk
+xbglffkvrzsmz1
+czlrrchbkhmz5qkdbtcjlffd5
+eight65sn4
+7seven2four99mlpskrgoneighthm
+9kfpfgzdjdgxjkltdkbkeightmxteightthree
+9bdsbeightjvkrmhdkghfive73four3
+xeightwoninehcrsdbnvtwovtbkhtxktjslsix3
+15fourlgrsk
+5xjqd9
+four8ttpzxpnrqnkz1
+fourvbfhg1rbrngbgfj6nineldqfxvrx
+sdpnkkfive9twodz23
+sixone4twoktcx
+8rjgbnxsixfivebsnthree2fivenmjxx
+fourddtxngtd4jvlttthhmz
+2nine95four1six9nine
+2gmxtrrkftjfnknknineqjqnscctfourzrqdrgs
+flghzhfgmn9tckbpmkgsix9
+jg9svtdrmlzm31rsrqvc4mggcj
+eightdpvfplptwofdgrkstvh8qseven87
+eightfour2fourvzksqhxmlkpkfktmdzpmthreetwonehv
+nine86kzqvkjqtjfourmpcggd8
+8nstjmtmstcnffnksqh
+bvgcmbcrgqfourpvs5xs
+8three12
+5398db9sixvnvcrztrqz
+7one62fourlndnshczz522
+qxrhp5eight183tfour
+fhpzgkt81two57
+ktlfdnbone6
+stsninecqxpfmdhk41vlpq
+eighttqcc5fqnfour84
+25gmh12threeltfnfdrxhh5
+57four
+mqgdhfour67
+37ninetxkddhfive
+rzrsskzrlzjbcgthreeghbqhdpxfvgjfqclcf4
+fourvone2vbpltlrj
+xz5four3nineseven
+1szrhcmzkftwo9eight2ltjmgjzcblzone
+zlnkddtgsb1sixsxvjxgxp2
+26sixpzpsixtwozqff
+seven99fzqxfmttfgxm
+9twonineonefourpttbgkxt8two
+fv9
+5qcmjsfk6zxjld1
+fkjstnvmchsr9q699
+nine78three
+4rcs6bhbbgzhsstwomnineksbxfzj8
+4fmblhqninefive6qbkm
+zsgjbfrjfour1sp3
+zbfeightfive1oneonernfd
+5bxtfvzczbhtzfourqglqdxsc
+f9five7five8ddvseven
+23bszpdxfjmzg
+fivegctmd3vlcgfgnine
+63hbdkxljlq
+64eight6eight6gxdpmtnbfone
+28xcbtt1
+1six5
+four289
diff --git a/input/1/test.txt b/input/1/test.txt
new file mode 100644
index 0000000..41aa89c
--- /dev/null
+++ b/input/1/test.txt
@@ -0,0 +1,7 @@
+two1nine
+eightwothree
+abcone2threexyz
+xtwone3four
+4nineeightseven2
+zoneight234
+7pqrstsixteen
diff --git a/input/1/testlong.txt b/input/1/testlong.txt
new file mode 100644
index 0000000..dd3fa0b
--- /dev/null
+++ b/input/1/testlong.txt
@@ -0,0 +1,14 @@
+9sixsevenz3
+seven1cvdvnhpgthfhfljmnq
+6tvxlgrsevenjvbxbfqrsk4seven
+9zml
+52sevenone
+41onevfsgvssxnpsix38four
+15ninedzhkpfstrscggbqhktwo
+rxbfsvhpnjvsixmxfhhmvdvg26rgrfj43
+gcbq2sghsv4fiveeightrlhchsfs2hsrjknfz
+tworgqpdjzrzf7one
+fivefive18
+sixfztrcxmbzktwofour3fiveeight
+2g4stjrjjmbngvljfvg24
+gthree15fivemzpnqgttcq1
diff --git a/run.sh b/run.sh
new file mode 100644
index 0000000..9582548
--- /dev/null
+++ b/run.sh
@@ -0,0 +1,16 @@
+#!/bin/sh
+day=$1
+token=$2
+inputdir="input/$day"
+mkdir -p $inputdir
+if ! [ -f "$inputdir/in.txt" ]; then
+ curl \
+ -s \
+ -o input/$day/in.txt \
+ --cookie "session=$token" \
+ -- \
+ https://adventofcode.com/2023/day/$day/input
+else
+ echo "already got input!"
+fi
+cargo run --bin main
diff --git a/src/bin/cli.rs b/src/bin/cli.rs
new file mode 100644
index 0000000..49c35a8
--- /dev/null
+++ b/src/bin/cli.rs
@@ -0,0 +1,20 @@
+use clap::Parser;
+
+#[derive(Parser)]
+struct Cli {
+ pattern: String,
+ path: std::path::PathBuf,
+}
+
+fn main() -> Result<(), Box<dyn std::error::Error>> {
+ let args = Cli::parse();
+ let result = std::fs::read_to_string(&args.path);
+ let content = match result {
+ Ok(content) => content,
+ Err(error) => {
+ return Err(error.into());
+ }
+ };
+ println!("file content: {}", content);
+ Ok(())
+}
diff --git a/src/bin/daemon.rs b/src/bin/daemon.rs
new file mode 100644
index 0000000..1937da4
--- /dev/null
+++ b/src/bin/daemon.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("Hello, daemon!");
+}
diff --git a/src/bin/main.rs b/src/bin/main.rs
new file mode 100644
index 0000000..47f2774
--- /dev/null
+++ b/src/bin/main.rs
@@ -0,0 +1,117 @@
+// This code was made to try and touch as many different rust concepts as possible
+// To make it faster I would probably use slice equality somehow
+#![feature(test)]
+use std::error::Error;
+
+const WORDS: [&str; 18] = [
+ "1", "2", "3", "4", "5", "6", "7", "8", "9", "one", "two", "three", "four", "five", "six",
+ "seven", "eight", "nine",
+];
+const REVERSE_WORDS: [&str; 18] = [
+ "1", "2", "3", "4", "5", "6", "7", "8", "9", "eno", "owt", "eerht", "ruof", "evif", "xis",
+ "neves", "thgie", "enin",
+];
+
+#[derive(Debug)]
+struct Node {
+ char: char,
+ children: Vec<Node>,
+ num: Option<i32>,
+}
+
+fn build_trees(words: [&str; 18]) -> Vec<Node> {
+ let mut roots: Vec<Node> = words
+ .iter()
+ .map(|w| w.chars().nth(0).unwrap())
+ .collect::<std::collections::HashSet<char>>()
+ .into_iter()
+ .map(|c| Node {
+ char: c,
+ children: vec![],
+ num: None,
+ })
+ .collect();
+
+ for iw in 0..words.len() {
+ let w = words[iw];
+ let mut node: &mut Node = roots
+ .iter_mut()
+ .find(|n| n.char == w.chars().nth(0).unwrap())
+ .unwrap();
+
+ for c in w.chars().skip(1) {
+ if let Some(idx) = node.children.iter().position(|n| n.char == c) {
+ node = &mut node.children[idx];
+ } else {
+ node.children.push(Node {
+ char: c,
+ children: vec![],
+ num: None,
+ });
+ node = node.children.last_mut().unwrap();
+ }
+ }
+ node.num = Some(((iw % 9) + 1).try_into().unwrap())
+ }
+ roots
+}
+
+fn find_match<I: Iterator<Item = char> + Clone>(trees: &Vec<Node>, iter: I) -> Option<i32> {
+ let mut it = iter.peekable();
+ let mut node: Option<&Node> = None;
+ while let Some(ch) = it.next() {
+ if node.is_none() {
+ node = trees.iter().find(|t| t.char == ch);
+ }
+ if let Some(mut r) = node {
+ let orig = it.clone();
+ loop {
+ if r.num.is_some() {
+ return r.num;
+ }
+ if let Some(c) = it.peek() {
+ if let Some(n) = r.children.iter().find(|t| t.char == *c) {
+ if n.num.is_some() {
+ return n.num;
+ }
+ it.next();
+ r = n;
+ continue;
+ } else {
+ node = None;
+ it = orig;
+ break;
+ }
+ }
+ }
+ }
+ }
+ None
+}
+
+fn main() -> Result<(), Box<dyn Error>> {
+ let trees = build_trees(WORDS);
+ let rev_trees = build_trees(REVERSE_WORDS);
+
+ let mut sum = 0;
+ for line in std::fs::read_to_string("input/1/in.txt")?.lines() {
+ let left = find_match(&trees, line.chars()).unwrap_or(0);
+ let right = find_match(&rev_trees, line.chars().rev()).unwrap_or(0);
+ sum += 10 * left + right;
+ }
+ println!("{}", sum);
+ Ok(())
+}
+
+extern crate test;
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use test::Bencher;
+
+ #[bench]
+ fn other(b: &mut Bencher) {
+ b.iter(|| main());
+ }
+}