refactor for yearly

This commit is contained in:
RingOfStorms (Josh) 2024-09-28 21:52:31 -05:00
parent da00eb3606
commit dddda24957
57 changed files with 3 additions and 0 deletions

2
2023/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
/target
.env.local

4
2023/.mise.toml Executable file
View file

@ -0,0 +1,4 @@
env_file = ".env.local"
[env]
# AOC_SESSION = "set in .env.local"

4
2023/.rtx.toml Normal file
View file

@ -0,0 +1,4 @@
env_file = ".env.local"
[env]
# AOC_SESSION = "set in .env.local"

2600
2023/Cargo.lock generated Normal file

File diff suppressed because it is too large Load diff

39
2023/Cargo.toml Normal file
View file

@ -0,0 +1,39 @@
[package]
name = "aoc23"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
async-recursion = "1.0.5"
expanduser = "1.2.2"
futures = "0.3"
regex = "1.9"
reqwest = { version = "0.11", features = [
"json",
"gzip",
"brotli",
"deflate",
"stream",
"cookies",
] }
reqwest-middleware = "0.2"
reqwest-retry = "0.3"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
tiktoken-rs = "0.5"
tokio = { version = "1", features = ["full"] }
itertools = "0.12"
derive_builder = "0.12.0"
rayon = "1.8.0"
static_init = "1.0.3"
grid = { version = "0.12.0", features = ["std", "serde"] }
indicatif = "0.17.7"
pathfinding = "4.6.0"
geo = { version = "0.27.0", features = ["serde"] }
[features]
part1 = []
part2 = []
default = ["part1"]

1000
2023/aoc_puzzle_cache/day_01 Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,100 @@
Game 1: 7 green, 4 blue, 3 red; 4 blue, 10 red, 1 green; 1 blue, 9 red
Game 2: 2 red, 4 blue, 3 green; 5 green, 3 red, 1 blue; 3 green, 5 blue, 3 red
Game 3: 12 red, 1 blue; 6 red, 2 green, 3 blue; 2 blue, 5 red, 3 green
Game 4: 3 green, 1 red, 3 blue; 1 red; 2 green, 1 red, 1 blue; 3 green, 1 blue; 2 blue; 2 green, 4 blue
Game 5: 3 blue, 3 red, 8 green; 5 blue, 1 red; 1 green, 19 blue, 3 red; 1 red, 5 green, 3 blue; 4 green, 20 blue, 4 red; 20 blue, 4 green
Game 6: 7 green, 6 blue, 1 red; 3 blue, 5 green, 3 red; 9 blue, 3 red, 6 green; 8 blue, 11 green, 3 red; 2 blue, 1 red; 7 green, 4 blue, 1 red
Game 7: 5 green, 1 blue; 2 green, 2 blue; 1 blue, 1 red; 5 blue, 2 green; 3 green
Game 8: 5 blue, 5 red, 10 green; 6 green, 1 blue, 1 red; 5 red, 2 blue, 16 green; 2 blue, 14 green, 9 red; 9 red, 3 green, 7 blue; 8 red, 4 blue, 10 green
Game 9: 1 red, 1 blue, 7 green; 4 red, 6 green, 2 blue; 6 green, 14 blue, 3 red
Game 10: 1 red, 16 green, 3 blue; 1 red, 3 blue; 6 green; 4 green, 2 blue, 1 red
Game 11: 5 red, 2 blue; 14 blue, 8 red, 10 green; 8 green, 1 red, 15 blue; 2 green, 5 red, 11 blue; 8 red, 11 blue, 4 green
Game 12: 5 green, 8 blue, 4 red; 15 green, 8 blue, 8 red; 13 red, 1 blue; 6 blue, 7 green, 14 red; 9 red
Game 13: 7 blue, 5 red; 3 green, 10 blue; 5 blue, 2 green, 5 red; 3 blue, 1 green, 5 red; 6 blue, 4 red, 6 green; 5 red, 2 green, 6 blue
Game 14: 5 red, 1 blue, 5 green; 6 blue, 13 green, 4 red; 7 blue, 4 red, 1 green; 6 blue, 5 red; 2 red, 7 blue, 2 green
Game 15: 8 red, 16 green; 10 green, 1 blue; 16 green, 7 blue, 3 red; 13 red, 7 blue, 8 green; 4 red, 2 green, 8 blue
Game 16: 1 red, 1 blue, 5 green; 5 green, 2 red; 2 green, 1 red; 3 red, 4 green
Game 17: 3 green, 7 blue, 5 red; 2 red, 1 blue; 8 blue, 1 red
Game 18: 9 green, 6 blue, 3 red; 3 red, 15 green, 5 blue; 7 green, 3 red, 3 blue
Game 19: 4 green, 3 red, 7 blue; 4 blue, 6 red, 4 green; 6 red, 5 green, 1 blue; 6 blue, 4 green, 3 red; 5 green, 5 red, 2 blue
Game 20: 3 green, 5 blue, 1 red; 1 red, 1 blue; 1 red, 6 blue; 1 green, 4 blue
Game 21: 2 green, 1 blue, 3 red; 16 green, 1 blue, 4 red; 11 green, 2 red, 1 blue; 6 green, 1 blue; 10 green, 1 red, 1 blue
Game 22: 1 blue, 2 green, 4 red; 3 red, 4 green; 1 blue, 3 red, 10 green; 7 green, 1 blue
Game 23: 2 red, 14 blue; 2 red, 14 blue; 1 red, 14 blue, 1 green; 1 red, 6 blue; 13 blue, 1 green
Game 24: 3 green, 7 blue, 3 red; 4 green, 2 blue; 12 blue, 8 red, 4 green; 10 blue, 9 red, 1 green; 13 blue, 4 red; 12 blue, 9 red, 2 green
Game 25: 9 green, 11 red; 14 green, 3 red, 1 blue; 8 red, 7 green; 10 red, 8 green, 1 blue; 6 red, 11 green, 1 blue
Game 26: 10 blue, 6 red, 11 green; 9 red, 2 green, 10 blue; 5 red; 9 red, 8 blue, 7 green; 13 green, 10 red, 1 blue
Game 27: 3 blue, 1 green; 10 green, 1 blue; 8 red, 6 green, 6 blue
Game 28: 10 blue, 2 red, 13 green; 2 blue, 2 red, 6 green; 10 blue; 4 red, 4 blue, 11 green; 3 green, 2 red, 6 blue; 14 green, 2 red, 2 blue
Game 29: 8 blue, 5 red, 6 green; 1 green, 4 blue, 15 red; 8 blue, 14 red, 3 green; 9 blue, 4 red, 5 green; 3 red, 3 green, 4 blue
Game 30: 19 green, 14 blue, 2 red; 2 red, 8 green, 7 blue; 4 blue, 1 red, 13 green; 10 blue, 3 green; 8 blue, 2 red
Game 31: 12 green, 5 blue, 3 red; 15 blue, 11 green, 6 red; 6 green, 6 red; 4 green, 6 blue, 10 red
Game 32: 7 red, 2 green, 3 blue; 9 red, 1 green; 2 green, 5 red, 1 blue; 12 red; 14 red, 4 blue
Game 33: 9 red, 4 green, 6 blue; 4 red, 10 green; 16 red, 4 green, 4 blue; 15 blue, 12 red
Game 34: 5 green, 1 blue; 18 red, 1 green, 1 blue; 1 blue, 9 green, 3 red; 6 green, 11 red
Game 35: 2 blue, 19 green, 6 red; 16 green, 1 red, 1 blue; 1 green, 2 blue, 5 red; 8 green, 3 blue, 13 red; 11 red, 10 green, 4 blue
Game 36: 17 green, 6 blue; 10 blue, 2 red, 8 green; 16 green, 4 blue, 1 red
Game 37: 9 green, 7 red, 8 blue; 1 blue, 10 red; 10 red, 4 blue, 11 green; 8 green, 11 red, 5 blue
Game 38: 8 green, 11 blue; 13 green, 2 blue; 7 blue, 2 red, 8 green
Game 39: 14 red, 2 green; 2 red, 3 green, 1 blue; 4 red, 5 green, 4 blue; 2 blue, 3 red, 1 green; 17 red, 2 blue; 5 green, 3 red
Game 40: 10 blue; 2 red, 9 blue; 5 red, 1 green, 2 blue; 8 blue, 2 red; 6 blue, 2 red; 4 red, 2 blue, 1 green
Game 41: 2 blue, 3 red, 2 green; 4 green, 2 red, 11 blue; 11 blue, 3 red, 1 green; 1 red, 6 green, 1 blue; 5 red, 7 green
Game 42: 1 blue, 14 green, 1 red; 2 blue, 2 green; 5 green, 2 blue, 8 red
Game 43: 15 red, 5 blue, 5 green; 15 green, 15 red, 1 blue; 4 blue, 13 green, 13 red; 3 red, 16 green; 2 red, 3 green, 2 blue
Game 44: 8 green, 8 blue; 9 blue, 9 green; 9 green, 3 blue; 8 green, 3 blue; 8 blue, 2 green; 9 blue, 1 red, 8 green
Game 45: 4 red, 4 blue, 4 green; 5 red, 2 green, 9 blue; 8 blue, 5 red, 3 green; 4 red, 3 blue; 5 red, 5 green, 1 blue
Game 46: 1 blue, 9 green, 2 red; 2 blue, 9 green, 1 red; 8 green, 3 red
Game 47: 2 green, 4 blue, 10 red; 4 green, 5 blue, 1 red; 10 green, 13 red, 6 blue; 4 green, 4 blue, 12 red; 15 red, 1 blue, 4 green
Game 48: 1 red, 7 green; 2 blue, 4 green, 5 red; 5 red, 3 green, 1 blue; 8 green
Game 49: 3 blue, 4 green, 3 red; 6 red, 5 green, 5 blue; 1 blue, 4 green, 3 red; 6 red, 1 blue, 5 green; 4 red, 3 green, 5 blue; 2 green, 3 blue, 1 red
Game 50: 1 green, 5 red, 6 blue; 3 red, 2 green; 1 red, 1 green, 6 blue; 1 green, 7 red, 3 blue
Game 51: 7 green, 8 blue; 6 blue, 6 red, 4 green; 6 green, 1 blue; 8 blue, 5 red, 4 green
Game 52: 7 red, 3 blue, 6 green; 7 green, 5 red, 4 blue; 6 red, 4 blue
Game 53: 12 blue, 1 red, 5 green; 4 green, 2 blue, 5 red; 5 red, 4 green; 1 green, 3 blue, 5 red; 5 blue, 2 red, 5 green
Game 54: 15 green, 12 red; 11 red, 3 green, 2 blue; 3 blue, 6 green; 3 red, 1 blue, 5 green; 17 red, 7 green
Game 55: 7 green, 10 red, 7 blue; 8 red, 4 blue, 11 green; 9 green, 11 red
Game 56: 7 green, 3 blue, 5 red; 6 green, 1 red, 4 blue; 4 green, 2 red; 5 blue, 6 red, 8 green
Game 57: 1 green, 3 red, 3 blue; 5 blue, 2 red, 2 green; 1 green, 5 blue
Game 58: 4 red, 2 green; 13 green, 4 red, 1 blue; 12 green, 4 blue
Game 59: 4 red, 4 green; 5 blue, 1 green, 20 red; 11 red, 3 green, 15 blue; 5 blue, 7 red, 3 green; 18 blue, 4 green, 19 red
Game 60: 5 blue, 8 red, 4 green; 4 blue, 12 green, 19 red; 3 blue, 1 green, 17 red; 1 green, 3 blue; 2 green, 6 blue, 3 red
Game 61: 3 red, 7 blue, 12 green; 7 red, 1 green, 6 blue; 6 red, 2 green, 18 blue; 14 blue, 5 red, 1 green
Game 62: 1 red, 2 blue; 1 green, 3 red; 1 green, 9 blue, 4 red
Game 63: 6 green, 4 blue, 17 red; 2 green, 2 blue, 12 red; 10 green, 9 blue, 13 red; 15 red, 8 green, 5 blue
Game 64: 4 green, 7 blue, 10 red; 3 green, 4 blue, 12 red; 6 green, 6 red, 8 blue; 4 green, 9 red, 1 blue; 2 blue, 15 red, 15 green
Game 65: 5 green, 4 blue, 7 red; 6 green, 7 blue, 8 red; 1 green, 7 red; 1 blue, 10 red, 8 green
Game 66: 5 green, 5 blue, 2 red; 3 red; 1 red, 1 blue, 16 green; 2 blue, 1 green; 8 green, 1 blue, 3 red; 14 green, 4 red
Game 67: 12 blue, 7 green; 7 blue, 7 green, 1 red; 12 blue, 1 green, 6 red
Game 68: 2 blue, 8 red, 1 green; 9 blue, 3 green, 12 red; 14 blue, 15 red, 6 green
Game 69: 7 red, 1 blue; 11 green, 2 blue, 13 red; 3 blue, 13 green, 3 red; 1 blue, 10 red, 8 green; 15 red, 2 blue, 19 green
Game 70: 10 green, 10 red, 12 blue; 7 red, 15 blue, 2 green; 8 blue, 9 green
Game 71: 1 blue, 2 green, 13 red; 7 red; 1 green, 5 red
Game 72: 2 red, 1 blue, 11 green; 1 red, 2 blue, 18 green; 5 red, 3 blue, 3 green
Game 73: 13 red, 3 blue, 4 green; 3 green, 17 red, 1 blue; 6 blue, 4 green, 4 red; 13 red, 7 blue
Game 74: 1 blue, 3 red; 13 blue, 5 red, 2 green; 1 red, 8 green, 11 blue; 4 blue, 1 green, 5 red; 11 blue, 8 red, 6 green; 8 red, 3 green, 4 blue
Game 75: 7 blue, 4 green, 1 red; 3 green, 4 blue; 5 green, 2 red, 3 blue; 6 blue, 3 red, 5 green
Game 76: 9 green, 1 blue, 4 red; 6 red, 9 green, 3 blue; 2 red, 6 green, 2 blue; 5 green; 6 green, 2 red, 3 blue; 6 blue, 5 red, 5 green
Game 77: 2 green, 2 red; 1 blue, 6 red, 2 green; 4 green, 3 red, 2 blue; 2 blue, 1 green, 1 red
Game 78: 2 green, 10 red, 2 blue; 6 green, 2 red, 2 blue; 2 blue, 9 red, 6 green; 11 red, 6 green; 3 red, 8 green; 1 blue, 6 green, 1 red
Game 79: 3 blue, 8 green, 13 red; 3 blue, 2 red, 3 green; 10 red, 6 green, 4 blue; 11 red, 1 blue, 3 green
Game 80: 3 green, 5 red, 9 blue; 3 red, 5 blue, 2 green; 5 green, 6 red, 2 blue
Game 81: 2 green, 7 blue, 3 red; 9 blue, 3 red; 1 green, 17 blue, 2 red
Game 82: 4 green, 8 blue, 7 red; 10 blue, 1 green, 10 red; 7 blue, 4 green, 5 red
Game 83: 7 green, 4 blue, 3 red; 15 blue, 3 red, 14 green; 9 blue, 4 red, 7 green
Game 84: 5 red, 5 green; 16 blue, 1 red, 7 green; 17 blue, 11 red
Game 85: 7 red, 1 green, 11 blue; 13 blue, 5 green, 6 red; 11 blue, 2 green, 8 red; 5 blue, 17 red, 4 green; 12 blue, 2 green, 8 red
Game 86: 3 red, 8 blue, 2 green; 15 green, 15 blue, 2 red; 18 blue, 2 red, 11 green
Game 87: 1 blue; 6 red, 6 green; 1 blue, 9 red, 3 green
Game 88: 10 green, 2 blue, 1 red; 7 blue, 1 green, 1 red; 9 green, 4 blue; 8 green, 1 red, 7 blue
Game 89: 6 green, 2 red, 2 blue; 5 red, 3 blue, 3 green; 3 blue, 4 red, 1 green; 5 red, 4 green, 5 blue; 4 blue, 6 green, 3 red; 3 red, 1 green
Game 90: 1 green, 6 blue; 1 blue, 1 red; 2 blue, 3 green; 7 green, 6 blue; 1 red, 7 green, 6 blue
Game 91: 8 blue, 14 green, 5 red; 8 red, 6 green; 4 red, 7 blue, 14 green; 4 blue, 7 green; 9 blue, 7 red; 14 green, 7 blue, 4 red
Game 92: 11 blue, 8 green, 6 red; 11 blue, 1 red, 11 green; 10 blue, 19 green, 5 red
Game 93: 5 green, 1 red, 7 blue; 8 green, 14 blue, 2 red; 5 red, 14 blue, 7 green
Game 94: 2 blue, 6 red, 3 green; 4 red, 2 green, 2 blue; 4 red, 1 blue, 1 green
Game 95: 9 red, 15 green, 1 blue; 2 blue, 10 red, 18 green; 3 red, 10 green; 10 red, 17 green, 2 blue; 3 blue, 13 green, 1 red; 2 red, 2 blue, 6 green
Game 96: 8 green, 1 blue; 1 blue, 1 red, 11 green; 2 green, 15 blue; 1 red, 2 green, 1 blue
Game 97: 3 green, 3 blue; 5 green, 3 blue, 1 red; 5 green, 1 red, 3 blue; 1 green, 1 red, 2 blue; 2 green, 2 blue, 3 red
Game 98: 6 red, 6 green, 5 blue; 19 red, 7 green; 6 green, 8 blue, 4 red; 10 green, 4 red
Game 99: 9 red, 8 blue, 10 green; 3 blue, 7 green, 8 red; 6 red, 12 blue; 8 blue, 8 green, 2 red; 16 green, 14 blue, 5 red
Game 100: 8 red, 13 green; 5 red, 4 green; 7 blue, 3 red, 8 green; 13 blue, 6 green; 1 blue, 8 green, 7 red; 2 red, 1 green, 16 blue

View file

@ -0,0 +1,140 @@
..975..95..................717..........................................747................................................622..............
................/47...........@....701...610.........252.660*.............*..236.....323..........108........653............................
.......69............313..............$...$...*....@.........640........81.....*................................*332..92....................
........................*...210.............767...912...367.......505.......817..................*.........478.........=....223.....568.....
..76...968............108...@.....556.....................=..........*...............412..313...575......../...........................*107.
............773/..891............*....................744.....805...14................../..../................320&.567..#...................
.962..708............&........399....146.....385.................*..........825.......................................-..655....485...-.....
...*.........+..........................*76...+..................242....997..*......185..........207.390..870...883............*.......337..
....929...299....................*.................249........-...........*.373.....*.............*.....*.*....*.............549............
................196.745.996...364..............409...-.926.....273.....580.........31...........545..547...862......810.....................
................*.......*..............900+....*..........*........586.........936...................................*.........673..........
.../..........864.683.215....*......%.........702..166..46..........&....341..........694..496.......528.%...........839...105..*...887.....
....506...617.....*........51.807....942..424...............................*..........@..+............@.84...................*......=......
...........@....594.........................*..........*675...........345..52...$..................-..............899.........804.$.........
.362*366.................487+.48&.......600..180....845........................535...18...........397.#908....432*........229......346......
.................*................835....................578......*502...............*..416.............................................391.
....610&...514...501......./........*....*71.........../.......674......925...............*.869.....966........393................/.687.*...
............*...............786...248.104........92.633.....%..............*104...&466..138..@.........*.525...+......974......339..=...260.
....372/.889..............................55.406........134..250.=228..609...........................69...............*.....................
...........................................*........976...*...........=.......357...........................191.....150.....................
...-...........595.634.........*396......592..594......*......411.856...760....../..................201.....#...709................168......
.936..236.........*....@....436.....100....../......35...../.....*........*....................917%............*.....................*..#63.
.......*..............542..........................*........689.........26....667.&...................738....831..$.............513.53......
........10.....529........*250..........162.......390...........................*..70.............................701..........*............
..355.........&........394......301@..........542..............................142..........%..............%..........*.....507.............
.....*.........................................*.....%..283.....*.........997&.......@670....402..........808......308.459.......712...152..
..291......246.@....+986.....336/.......976...468.264...*....739.187.............................................................*.....*....
........../....46...................186.$..............674............................227......-............975...............436.......492.
.491........................810.......*........................772*.........742........%....198.....*702.......*.596=....64.......=.........
...................706......=......415..................=.199......235......*...47........................72.607...................443......
.214..............*.....771.............302...........230..+..............810.....*219.606........912.....................=.................
......277......320.............937.....*.....+....632...........&374..............................*....................898.....642%.........
.........#....................*.......716....229./.........................$................934...233...............98............../.......
.....*........-659..457.........964...................659....786....619.666........277...@.....*......930*460..618...........910..265.......
..845.877.343......................*537.../120.......*.......*.....*.................&...175..631.............=.................#...........
............*....................+................@...35.949..34.381......273...880......................451........326.....................
............876..880......827..733.......645.......38......*.........402.....+..........902....459.775........837.....*.185.......813.......
........578................/............*...............622..18.........*234..............+....%..........448.......935....#.............350
..........*...468.....546................588....146=.........*..142.795..............*424................../.....................=..........
........245............@...746.......362..................970......*..............593...............487.......+.............709..593........
...990......&415..............*381......*.....................435.......214..908..................*....*.....351.....876.25....*............
......*............293*.....%...........271.............135......*......=........540............177....604...........&.....-.46..........166
...609.....................910.................@........$.......321..........141....+.45.....................750......................98....
.......#....779........944.....653...........797...........788.................*......+....164.724....475&...+.............-.471......&.....
..794...487....&..81...........*...................@............666@.....*981.937.............*.....%..........888....+...81................
.....*...........+......694.............748...104..859..............................675.434.......290.............*..352........353=..$.....
...619.977.........859..#....235....230*......*..............429........335....-.......*......631.......=.......27...................192....
.......*............=...........&.........121..680.195.959......*417.....*..938.............../..........739..#..............194.750........
....309...439.............14...............*..........*...............723.........163..748...........853.....885.........175*........487....
.............*707..-626..........464.....382................356...........868#....*...*.....13......*............450............#.....*.....
........216......................*...619......$..270........*.....892............25.494.841*.....971.............*............157.+...119...
...#40...../............343..559.425.......536........718....739...#.......284...............726.....985..136...597.621.173.......203.......
................383............/......................*...................@....348............*.....*.......*........./...*...811.......*158
...=..............$......@....................776.829.85...&........541.......*....*...&....700......341.995.....73......114....*....267....
.700.203....591.*.....924..........$217.......@.....*.......590....*.........812.579....517.......................*.............730.........
......#......*...586.........312..................806............435...259...........................573........453.282*132.243.............
..........224.................#.......468@............-...%.............*..............453...................$.....................-........
....................................................227.673....881......828..&.....632*...................589.....................284..-....
.....680.........871....17+................117.................*.............506..................#...410...................616.........519.
........*..386................78*762.........@........28..557.655.......359........-............124..#......&..........843./................
......724...*..584.....552............................*...&.................209..857...633-..............602...932......*........132&.......
..........41../.........*..........................#..427.............=370....*................................*...353...902...........529..
.....................150.......868.......370....549.........779...................284...........431.....3.....889.............189..103.=....
.......530..355..........442...*............*63............+.......852.....935.....*..............%.....*..................@....*.-.........
..........*...*...976.....*...500....@...........572...........940....*990..*....627.790.................460..904..601-..821..930....699....
..........643.824.......248........358...4.........&..301.........&........538.........*.%436....565..........*......................../....
.768..$.....................186..........*...178........*.......................*.&520..............%........782..........497.-......*......
......762..828*...972......*..............3.*.......................@....../..836...............278..............666......*...927.413.185...
....&..........40.......86.122..........&....450....................1....202............42...51....*..............*.....215.................
.353.................94*.................995.....655.....520...828....*...........612..........&.119...........486...............713........
.........................255........................*.......+.....-..463..........*........235........836....................668............
...................................................286........338........=.393....398........*....199./............631..........*631........
................64%....704...928.........470...125............*....708.15...*.............193.......*........641....*......687..............
........$..............*...................&.....*..........582......*....652.@358..643..........125.....458........168....$.......$194.....
........293.........305......417...............117....................612............*......262.............*903............................
.....$...................615*..........581.........335...139..505.419.............656.........+.......506................710.....956........
776..110.....+............................-........#..........*....*...447......*......................*...*.....938.366*.......#....376....
..........366............844....305..761......780......560........236........725.272.....450.............67.126.....................*.......
.................669$.......$.......=............*220./.....+665........495................*.@103....992....................&........600....
.......*......................812/.........................................$............940...........+...................146...975.........
....410.650.282.....*...............696.833....957...............996...*......772.287...................921..935................%.....$.....
............*....413.921...713....................%.....769.........@.390.216..#.....@..........................=...........*.......46......
.....798.136..............%....150.....236..............*......31...........*..........@.64..17......616..........901......344..............
..............................-........*.....402......873.......*......692...592....390...*.............*277................................
......539.....799.../.....272....%.@....694.#.............667...318.......=...............762.......71%.......-153......................531.
..........556*......573.......465...916...................*..........602.........................=.......145...........................*....
........................451.............../....%.....625.401.........*........428-.....493......479.427....$.........60......951......281...
..947+....36....270....*............517....521..258.*............108..812.............*................*........................*372........
...........*....*....957.823...290.....*.............415..........*...............908..730..........589......+..............................
857.........843............*........794......................677..27........................121...........670.........548.837*....&.....664.
......175..........-.....=........................422.......*..................226-..344.......*...................2....%..........474......
...................283..190..@...........458........*.162@.666.517....202...............*..@...545.%.........705.............*..............
...............*............296.466.....#.........................*..*.....852..208...999.475......256..........=....642..188.386...........
............504.888..................52....416......394...349.....53.953...*......*...........@521.........213........*.....................
......225...............272*32........*.....*..........*...%..............728.........827.513..........287*.........924..388%.........&.....
..453...*..................................71.....*..437.......501...869.......928....%...#....................%225.............734@..157...
....*..400...........810=.300@...13.15.537.....997........./......*.....*.........+.........407.758...674............604....500.............
..970..........409...............*...*...*................159...788....338..............636*...../....#.......#895....*......./.............
..................................52.....872........+...........................-........................524.........297............314.....
...........=...469.....408.............&.........641......364%.780...526.........540.865....742............*..............549..505...*......
........404.......*...-....58..%....577...............655......*.............613......*.............343..779./854............*....*...567...
...103............284......./...999....................=.....640.....284..............566.982..........$...........476...478.793..556.......
......*.....436........916.................941.............@.........&...........284.........*183.........857.953...........................
...............*.404=.....*910..703@...20......266......815.....201.....54.332...........................@......*...........95..............
.............898........................*........*..........13.....*806...*.......280.........................905........63*................
........&.........642..271.627..920.+....534...96..780......@....=...........246../......99........................................../......
....$....518.......@......*......*..323..............-............477....*4...*...........*....979......810.................366....697......
.....439........................364.........161..594.....647..................802.........234..............*17......125..82....*............
................187....667....................*..#.......*.......*................604..................946.............*....414.............
....585...218.....*...*.............-....536.396........950...200......296*935...*..........#...382..........883......182.......326....*....
.....+......-...557.349...........217............................./105..........527..387....394...*...........#..430*.....501.......393.190.
.......*474.............16....................675.....999..............362..............*..........576...................*..................
....449.....+.296*468.....................607....*...........-..#.................619....177...............31...........194..198..187.......
.........156......................330.......+..332...631...936...477................*...........658..........%..845..........*..............
....*262.........$......362......*.....429=..............................*324....296...........+.......161.....*....57.....309..............
.403............492..97.@.....695..696......$.840..&.................21.....................@.........*.......178...+....$.............364..
......178..692*.....%.....82..........=...176.......456.....517........+...238.704.......682......266.................&..222..........*.....
......*........993........*....931*...........445..............*.................=...........@...*.......448.......251................222...
.......824............467..232.......664..299*.......322*512..850..............@..........585....259........$..................&............
...458.....572.................379....*........123.....................-........298..................-................336...908....*........
....&......*....&..732...701/....*....440.....$...........739..636.....65..../.......%151.............823.455............&..........119.....
........550....391..%.............259....................#....*............834............232.179............*.........4...795.784..........
.............%...............729...............568.............936...............952........*..*..............726..........*.........-......
...627.....87....@...........-...........6.....%...106.......................458*.....281..811..282..500..............=....833....214..780..
..............320................665..............*........584.........................*............................343...............*.....
..................997....84.590.....*795.90*487.842..%431....*.......233..692....259....391.113*........*338............./..391.............
.....62.....#689.*.........*.................................444.......*...*......*.............445..861...........498/.857..*.....505*.....
......*...........436.869.....634@..663...599..901*678.100..........666....301..493.986....174.............838*492..........454........313..
.....362.....983....../................+..*.............=.............................*....*.......259.............+....464.........27......
...%........................580....68.....45.........................................21..768...267....*.+....661..879..@....&......$........
.643....545......./435.....*.........+.............................823....919.......................20..102.*..............267.690.....55...
.........*...............557....247.......653....584.5*....430....*........../...529+...........856..........305.254..212.............*.....
........945...528................/...775..+............204...-.537....$..528................276*...................%....*....863......612...
....572.......*.........614.........+................................810...............842........438.....26...&.....%.........*............
.......*....201.@......*....671..$........................../.............................*...832*.......*....214.899..........795.421+.....
994..797.........684.390....*....452../..................989..728............685....23+.856...........498.............443...................
.....................................424.......%...............@.......228.....+..............+.......................$.....................
.....2...812.517.........602*967.........262....953...*.....*....67...*...........+......1.431.....721.....402%..&.......*.....504..........
.............*....%..................963*...........96...287.255.*...548.........534....*.............*..........896..531.789.=.......855...
...........579....595...........8................................781...............................547......................................

View file

@ -0,0 +1,202 @@
Card 1: 34 50 18 44 19 35 47 62 65 26 | 63 6 27 15 60 9 98 3 61 89 31 43 80 37 54 49 92 55 8 7 10 16 52 33 45
Card 2: 90 12 98 56 22 99 73 46 1 28 | 52 77 32 8 81 41 53 22 28 46 48 27 98 1 94 12 99 72 84 90 92 73 24 63 56
Card 3: 48 10 39 87 23 78 49 40 55 8 | 48 80 78 87 39 24 27 19 41 73 30 52 10 2 67 40 88 53 59 84 55 49 5 33 82
Card 4: 21 45 91 26 64 51 42 84 11 94 | 55 56 36 65 84 2 68 44 52 58 86 6 33 7 97 40 30 14 39 80 82 57 79 1 10
Card 5: 33 6 67 89 64 31 85 11 2 15 | 6 70 29 89 12 11 64 80 7 82 46 16 33 68 48 72 31 2 99 15 67 57 4 49 85
Card 6: 51 20 11 66 38 39 69 48 25 74 | 39 74 3 86 19 25 21 55 2 38 46 60 66 82 51 11 98 88 8 48 49 94 20 69 72
Card 7: 4 50 82 51 52 77 12 11 57 42 | 56 11 73 69 42 82 32 77 52 98 12 51 36 94 46 4 50 39 85 90 93 70 18 71 57
Card 8: 96 31 27 93 7 8 6 23 15 72 | 55 79 86 4 6 35 12 27 95 29 73 81 87 43 7 13 62 15 72 71 58 48 63 94 89
Card 9: 16 90 79 29 93 31 40 24 82 88 | 86 16 73 20 22 93 83 39 36 90 79 72 40 29 35 97 88 12 8 24 31 82 21 59 95
Card 10: 17 36 50 39 96 43 41 38 55 8 | 39 93 38 96 56 27 4 72 17 87 99 78 75 11 55 41 43 68 64 28 50 40 8 36 97
Card 11: 76 96 78 64 80 28 11 24 93 97 | 66 34 64 35 97 47 54 13 79 11 67 24 36 28 17 30 82 93 21 49 4 86 76 12 8
Card 12: 16 73 39 24 54 90 89 55 11 25 | 17 92 1 61 86 2 25 7 50 55 88 74 64 83 24 48 39 84 54 32 58 34 89 28 99
Card 13: 66 99 94 51 17 67 73 32 76 86 | 97 61 50 64 57 41 39 89 60 13 43 72 44 83 84 18 87 20 92 48 75 8 82 36 53
Card 14: 3 56 26 47 68 66 22 20 27 77 | 75 22 63 26 55 66 3 73 47 90 44 64 76 4 92 19 91 62 51 77 58 17 2 40 52
Card 15: 91 1 44 6 51 43 61 5 12 31 | 49 97 10 78 87 95 36 56 96 46 4 14 43 54 94 81 41 67 91 11 83 38 93 22 86
Card 16: 61 46 35 13 79 38 80 3 95 87 | 80 98 46 74 28 26 84 73 75 57 52 91 40 44 2 51 95 77 3 96 35 67 41 55 79
Card 17: 50 89 17 18 60 81 37 29 3 52 | 13 19 83 98 77 25 97 52 10 35 94 99 50 6 27 84 41 11 33 34 20 4 54 89 56
Card 18: 57 1 68 3 86 40 15 2 38 41 | 88 96 18 25 16 15 12 47 37 27 39 48 32 43 33 82 60 13 57 53 40 61 26 99 5
Card 19: 30 48 3 82 23 91 41 63 99 16 | 78 6 46 54 22 85 7 49 59 53 68 12 70 97 77 92 56 41 83 5 75 37 58 61 28
Card 20: 28 5 15 55 66 24 25 93 6 22 | 94 68 4 2 98 37 76 71 78 21 47 67 97 51 99 3 57 89 95 30 26 60 12 9 11
Card 21: 90 98 42 76 23 83 8 29 5 50 | 93 13 90 19 25 61 97 39 99 73 40 38 6 72 65 43 91 20 33 86 55 62 47 1 84
Card 22: 14 49 50 4 1 13 65 30 10 51 | 26 40 32 73 16 93 94 22 59 76 89 27 33 44 87 42 74 3 71 47 67 6 12 43 57
Card 23: 29 57 10 79 78 30 86 69 32 72 | 26 8 96 78 51 90 86 19 3 10 57 29 22 72 35 28 97 34 69 38 79 33 93 32 30
Card 24: 99 66 67 60 23 90 73 1 29 77 | 79 80 74 63 27 68 12 81 19 91 28 56 71 38 24 35 18 4 87 13 62 3 34 44 14
Card 25: 87 8 39 28 6 89 34 17 51 25 | 50 37 16 36 90 60 28 17 84 70 32 22 64 61 6 34 24 56 99 89 40 77 47 68 87
Card 26: 42 82 14 23 59 8 62 53 37 2 | 62 8 14 85 76 53 21 60 79 1 90 19 78 82 42 17 11 49 87 13 59 37 81 2 23
Card 27: 75 95 56 30 17 58 61 11 39 93 | 68 73 94 9 11 86 80 22 61 50 75 62 36 98 17 39 89 93 34 56 30 78 95 58 96
Card 28: 10 54 26 76 5 35 81 67 34 28 | 28 88 89 93 76 35 81 94 26 98 10 84 67 5 65 50 57 34 54 82 4 45 62 24 53
Card 29: 6 40 97 56 4 43 98 55 79 72 | 79 15 43 54 97 4 95 42 40 57 82 91 87 86 68 63 19 1 22 72 7 67 10 84 55
Card 30: 22 85 5 42 74 28 1 63 29 53 | 63 86 80 48 13 2 74 85 25 97 5 43 21 53 88 7 38 29 82 3 30 77 51 11 44
Card 31: 11 69 64 47 44 13 50 33 83 53 | 59 9 57 81 98 69 32 40 11 33 53 20 52 12 37 93 79 64 74 80 71 35 44 7 13
Card 32: 94 44 62 75 35 86 34 20 1 74 | 17 29 50 65 60 57 33 59 31 92 70 11 54 85 99 22 46 53 98 93 97 51 67 64 12
Card 33: 90 55 21 9 10 41 24 51 88 70 | 30 77 78 20 32 1 57 92 15 75 21 37 31 43 60 39 72 54 46 99 53 61 50 33 94
Card 34: 8 77 92 34 84 28 90 40 97 75 | 61 40 99 77 17 28 80 50 37 47 22 70 81 79 97 85 93 15 49 48 69 14 2 12 94
Card 35: 44 61 20 43 35 24 45 53 52 47 | 46 54 93 78 87 31 30 80 23 51 13 99 60 57 38 9 1 19 90 71 70 26 40 97 62
Card 36: 64 40 1 89 19 70 16 71 31 94 | 10 89 43 1 63 77 3 74 62 17 38 54 72 41 50 14 35 59 99 34 52 55 22 44 96
Card 37: 74 56 86 52 37 58 30 55 79 9 | 49 28 37 12 97 61 19 36 90 45 48 21 86 58 96 82 9 87 66 44 35 77 81 70 22
Card 38: 34 46 73 59 45 65 85 27 16 42 | 17 93 58 98 88 64 26 35 2 84 86 80 89 4 48 83 28 50 32 21 74 69 95 40 57
Card 39: 51 82 59 67 24 8 32 23 96 40 | 76 40 59 83 65 24 4 29 88 21 82 68 95 64 10 1 62 37 81 32 74 47 56 63 48
Card 40: 80 57 26 4 27 39 34 24 49 78 | 65 64 86 59 25 16 92 66 13 54 46 91 29 47 32 21 81 14 30 7 62 37 55 41 36
Card 41: 12 70 15 72 82 43 53 21 58 51 | 7 56 3 30 36 45 28 94 67 89 39 2 48 47 24 29 16 20 22 18 41 37 49 93 77
Card 42: 60 85 83 5 82 63 48 36 4 40 | 89 43 57 86 31 45 88 37 90 3 46 94 29 12 25 40 38 50 72 5 9 15 49 16 87
Card 43: 33 94 66 90 14 72 73 59 55 15 | 87 34 37 35 4 77 25 80 54 10 86 6 12 48 60 61 36 55 43 64 97 30 41 5 95
Card 44: 31 17 65 48 36 63 33 46 25 87 | 9 70 4 42 53 97 57 32 80 14 95 23 3 12 15 52 6 34 71 74 39 27 66 22 20
Card 45: 88 52 86 36 5 15 65 61 18 17 | 36 96 32 56 1 80 48 89 95 97 60 91 85 21 82 10 3 75 66 93 51 37 28 23 83
Card 46: 23 86 32 98 41 65 17 89 69 39 | 69 4 80 41 89 43 86 44 16 40 99 8 77 32 39 51 19 36 73 56 90 83 5 17 76
Card 47: 80 15 87 14 9 27 40 44 60 8 | 33 27 15 67 34 8 14 58 37 80 40 73 38 87 84 55 94 60 9 35 42 46 4 79 44
Card 48: 94 32 34 99 60 33 11 3 30 96 | 72 27 32 33 56 11 97 61 94 96 26 93 30 41 83 17 3 60 34 2 47 99 40 24 90
Card 49: 53 60 74 44 36 88 64 45 8 34 | 89 84 68 79 30 67 75 76 21 53 26 72 51 85 18 44 7 25 60 74 64 17 37 88 86
Card 50: 90 69 91 1 43 26 77 19 61 65 | 65 34 92 13 48 46 69 19 44 77 99 11 63 91 76 61 73 53 1 81 23 12 40 26 43
Card 51: 22 94 42 24 28 37 61 88 86 12 | 5 31 3 34 56 82 70 68 39 91 53 22 16 81 71 54 99 41 44 90 24 37 12 27 61
Card 52: 93 57 50 9 14 42 66 23 21 1 | 21 33 48 18 71 1 27 54 11 77 74 22 92 41 34 14 98 36 61 70 89 80 82 10 55
Card 53: 21 12 1 93 98 69 91 8 4 89 | 80 7 1 68 92 32 83 21 76 20 63 33 28 73 43 12 56 5 15 40 89 52 16 22 9
Card 54: 22 52 94 9 63 10 16 1 82 4 | 43 47 48 81 24 35 9 16 94 44 85 18 13 64 49 82 52 77 10 21 41 12 74 79 39
Card 55: 71 92 42 84 19 43 13 54 1 88 | 73 23 32 18 52 38 35 81 45 96 92 15 57 19 55 43 51 12 7 88 62 69 71 5 53
Card 56: 13 52 23 69 26 92 37 47 99 54 | 38 64 66 22 26 99 93 23 86 9 29 98 57 48 51 79 50 42 90 60 87 13 25 5 4
Card 57: 62 8 38 58 6 99 10 14 72 94 | 29 56 27 53 61 77 95 39 24 46 19 40 30 31 9 93 78 91 79 25 20 4 12 67 87
Card 58: 34 57 49 6 78 13 53 81 75 98 | 41 58 21 56 64 7 97 11 80 4 83 12 44 51 62 26 5 22 46 45 27 95 10 16 43
Card 59: 86 27 78 51 67 90 10 44 85 87 | 13 66 32 54 65 92 91 55 53 47 5 11 64 49 18 10 8 16 23 9 12 29 50 70 61
Card 60: 26 62 95 72 31 98 50 9 25 44 | 56 94 2 53 11 51 22 66 12 45 36 17 37 14 78 48 4 29 64 76 39 65 1 15 24
Card 61: 47 54 93 76 68 98 64 15 53 22 | 70 19 86 7 44 45 5 39 30 38 6 83 33 15 3 51 49 29 98 37 56 21 78 60 90
Card 62: 46 53 15 99 29 7 10 34 79 12 | 46 56 94 40 66 26 33 99 39 28 12 67 53 74 11 22 92 34 29 79 7 32 98 15 10
Card 63: 44 3 92 7 24 33 23 31 10 12 | 23 1 96 92 72 33 86 4 80 68 25 12 40 45 17 29 94 36 81 44 61 83 10 24 19
Card 64: 21 95 89 20 7 16 23 73 58 86 | 84 47 11 18 96 90 73 2 38 51 29 30 58 99 76 86 21 1 37 68 16 32 39 22 35
Card 65: 15 42 28 50 91 52 73 79 70 45 | 98 70 45 19 4 46 86 11 68 96 41 58 39 7 64 15 50 89 28 72 47 17 40 27 79
Card 66: 91 48 16 1 24 3 75 60 41 86 | 98 52 55 23 66 14 92 50 74 75 3 1 58 91 13 97 90 73 78 62 48 79 65 77 87
Card 67: 74 29 43 82 93 73 58 98 3 8 | 32 63 13 60 49 73 18 74 65 78 97 92 29 23 43 5 72 35 48 99 3 15 93 52 64
Card 68: 35 33 72 82 59 8 27 67 19 31 | 35 36 80 7 63 62 33 44 55 31 8 75 1 64 95 27 47 79 40 14 72 19 42 69 91
Card 69: 96 20 45 65 51 91 49 30 79 78 | 58 73 89 36 32 69 81 37 20 60 42 76 29 25 75 65 30 86 19 26 66 34 31 99 8
Card 70: 13 59 90 5 63 29 14 32 77 53 | 56 66 32 77 16 85 47 73 55 86 1 90 69 97 4 78 76 59 49 8 48 37 63 50 72
Card 71: 9 31 29 5 50 37 71 94 78 53 | 28 80 53 55 39 58 42 86 57 81 83 64 95 43 69 51 65 20 75 13 30 70 50 63 5
Card 72: 86 87 49 67 68 46 45 60 23 12 | 35 93 94 6 55 49 40 28 38 62 63 32 52 36 69 17 81 73 16 7 56 89 21 20 86
Card 73: 80 81 75 68 33 79 94 53 8 25 | 9 47 95 99 85 48 62 17 44 77 31 12 1 70 86 34 75 83 68 87 88 96 78 4 18
Card 74: 62 64 51 12 54 2 85 81 22 28 | 98 14 10 71 2 61 29 82 39 55 17 76 31 18 86 97 60 87 93 26 69 33 21 13 6
Card 75: 96 50 88 5 16 85 7 27 51 58 | 94 80 41 53 93 20 83 45 61 40 72 95 97 39 26 32 91 70 99 3 48 62 64 79 86
Card 76: 1 73 41 87 54 57 20 7 98 85 | 21 16 15 66 23 75 86 46 11 90 36 96 34 78 58 33 88 56 93 74 8 64 30 28 5
Card 77: 91 50 88 4 58 31 20 6 24 44 | 10 61 50 55 62 47 75 78 80 88 93 4 41 59 95 91 58 31 24 70 22 20 6 12 44
Card 78: 22 28 36 88 75 82 4 99 90 55 | 14 33 24 75 43 4 41 88 16 15 77 36 99 22 52 82 61 55 28 27 89 97 51 32 90
Card 79: 96 3 13 91 24 65 77 1 44 43 | 13 43 24 56 6 3 77 65 61 5 41 73 44 60 21 96 74 72 19 16 1 52 37 91 46
Card 80: 71 29 61 75 72 55 16 26 6 62 | 15 65 38 71 16 10 75 50 6 92 4 26 79 29 94 46 62 63 45 61 51 86 74 55 72
Card 81: 34 57 14 90 99 97 44 31 73 64 | 38 47 54 86 50 4 46 48 14 43 16 15 82 27 51 8 33 59 17 55 84 57 44 19 12
Card 82: 77 46 25 67 61 5 37 49 50 24 | 77 89 5 4 61 43 50 76 55 78 46 6 42 66 25 52 49 7 85 95 37 24 48 23 67
Card 83: 66 30 35 68 10 67 18 14 52 59 | 6 37 16 61 95 66 91 54 79 50 97 21 2 33 74 29 80 77 1 59 41 31 10 13 9
Card 84: 29 39 48 7 2 90 47 93 88 46 | 57 90 50 84 74 52 7 27 93 96 54 78 48 39 29 46 40 88 47 13 2 89 70 25 86
Card 85: 91 93 84 76 7 1 96 60 98 67 | 98 88 10 21 91 27 93 44 1 67 79 7 58 87 47 30 76 96 20 60 2 84 41 73 54
Card 86: 73 1 14 37 79 63 97 75 2 60 | 80 3 56 45 43 23 1 95 72 13 49 27 9 78 55 15 74 40 75 94 86 63 76 32 52
Card 87: 76 35 41 4 25 97 62 99 77 98 | 93 35 81 77 37 76 88 98 53 38 4 48 25 23 84 97 2 49 46 99 42 1 41 95 62
Card 88: 3 15 12 58 57 4 43 44 10 55 | 78 55 51 54 4 44 42 35 69 3 79 25 57 10 77 34 30 38 12 58 43 93 14 86 15
Card 89: 4 99 45 58 49 30 59 21 25 13 | 73 43 99 85 74 13 30 58 45 31 21 52 25 49 29 4 6 62 19 92 39 16 18 89 59
Card 90: 81 84 6 57 1 69 3 68 13 49 | 20 25 40 92 84 38 83 53 94 66 49 52 17 72 56 8 33 43 22 81 64 47 28 36 5
Card 91: 68 97 58 96 34 66 61 81 56 90 | 25 28 51 34 59 40 64 96 97 48 30 90 63 37 89 74 16 87 81 5 1 54 66 57 62
Card 92: 10 53 16 70 72 21 34 4 65 54 | 98 21 63 53 55 75 72 93 7 24 15 25 92 61 67 86 70 10 12 34 65 54 3 5 36
Card 93: 77 45 87 88 72 16 51 26 99 23 | 42 36 65 78 52 92 2 44 9 83 58 37 20 99 57 94 3 66 22 93 86 43 1 17 75
Card 94: 86 29 2 71 17 60 43 8 11 81 | 92 35 45 12 38 47 22 9 13 11 48 58 63 68 20 96 46 94 85 42 66 25 83 26 57
Card 95: 41 71 40 45 4 50 15 94 69 75 | 99 37 47 74 95 19 5 54 20 36 63 23 4 38 28 44 3 83 80 67 93 49 84 6 40
Card 96: 16 14 18 42 90 63 96 37 41 76 | 52 22 37 10 25 99 76 73 93 89 1 79 23 85 6 64 16 97 39 55 96 18 77 69 92
Card 97: 32 69 95 78 91 75 76 45 43 79 | 8 89 34 49 55 71 3 23 83 2 61 68 31 35 46 87 42 13 45 18 25 47 28 39 86
Card 98: 24 37 74 59 60 94 39 40 63 45 | 23 52 8 85 53 70 18 11 46 30 6 83 90 26 24 34 55 71 82 97 37 31 38 68 5
Card 99: 98 5 72 42 44 82 65 57 81 54 | 61 95 32 6 37 43 33 35 49 85 10 17 52 71 68 20 83 58 77 36 69 50 96 38 23
Card 100: 27 84 51 44 31 19 34 98 77 18 | 44 43 39 5 30 48 74 88 23 22 6 35 59 2 20 92 79 89 72 58 80 11 52 10 57
Card 101: 82 38 31 7 27 6 19 20 3 94 | 75 77 95 65 69 15 52 16 34 32 66 9 28 12 22 73 44 61 70 30 88 72 71 45 18
Card 102: 16 59 11 8 88 9 48 1 68 90 | 44 12 18 99 73 27 91 82 29 20 63 1 84 57 87 86 3 54 42 85 78 98 51 60 36
Card 103: 84 77 29 61 67 60 23 89 19 87 | 48 1 84 7 87 15 32 81 25 67 38 29 23 45 9 89 61 88 55 19 50 58 3 56 64
Card 104: 51 4 13 59 15 92 17 65 26 84 | 3 29 85 4 58 66 51 31 2 55 65 54 13 16 24 92 38 26 59 90 67 99 71 33 70
Card 105: 55 58 37 46 12 74 62 16 47 26 | 16 64 46 68 47 56 72 73 4 66 80 58 35 12 55 37 74 62 26 60 69 75 13 63 33
Card 106: 39 80 37 10 26 47 66 79 12 64 | 34 82 72 10 12 20 40 7 39 25 89 9 26 93 5 1 47 64 79 96 66 18 80 37 13
Card 107: 95 28 45 60 91 73 11 23 26 94 | 16 26 8 58 83 90 31 44 80 50 30 11 97 70 89 37 60 38 41 69 55 99 28 65 45
Card 108: 39 54 74 12 56 63 13 34 32 40 | 88 70 89 74 87 96 44 58 2 79 34 37 63 16 30 61 41 23 54 95 33 72 73 40 82
Card 109: 98 96 81 13 69 5 73 50 76 47 | 20 49 30 80 76 50 31 81 66 74 3 86 12 73 5 64 47 34 15 9 25 13 24 96 79
Card 110: 47 43 1 83 76 38 30 45 50 12 | 56 99 38 43 74 68 27 83 55 49 48 78 91 41 51 72 33 76 15 12 22 50 53 26 13
Card 111: 51 68 7 71 30 79 14 26 59 66 | 11 16 79 30 26 7 27 18 53 45 68 76 15 87 77 92 57 62 71 14 10 59 66 78 91
Card 112: 84 37 54 21 19 30 38 20 94 88 | 40 19 38 21 68 62 48 26 44 12 91 74 20 30 42 89 98 51 7 54 37 58 1 88 64
Card 113: 91 41 56 30 18 47 74 45 17 9 | 87 77 68 93 88 56 2 1 69 41 36 9 47 33 13 44 18 25 70 86 45 8 32 91 46
Card 114: 83 62 7 35 48 11 37 69 93 84 | 90 24 81 74 17 54 49 65 67 19 55 47 43 14 64 99 33 28 29 98 36 63 57 52 58
Card 115: 44 84 39 20 33 59 31 34 8 95 | 31 81 39 7 16 92 35 53 11 97 59 78 10 80 91 62 54 29 65 3 75 47 26 24 63
Card 116: 65 74 70 33 44 56 13 10 85 63 | 11 20 54 17 73 41 24 79 18 92 43 76 88 39 95 80 7 75 36 52 94 35 78 31 4
Card 117: 34 82 96 60 48 66 6 37 14 98 | 89 64 6 95 11 54 66 17 45 10 83 98 63 15 1 55 52 68 60 94 79 22 85 57 39
Card 118: 20 80 46 41 97 57 99 56 64 91 | 48 61 98 11 95 50 62 81 10 79 22 32 37 71 43 19 36 58 29 9 16 64 65 17 96
Card 119: 96 42 71 23 45 73 84 94 51 77 | 68 35 22 56 81 54 47 3 77 50 73 51 90 29 82 4 52 8 66 76 15 92 65 24 14
Card 120: 56 34 70 85 68 77 79 94 84 73 | 1 82 60 23 78 10 58 29 26 70 93 2 88 87 4 33 44 69 47 12 48 6 54 41 96
Card 121: 60 85 78 83 68 26 62 65 91 69 | 97 63 12 4 9 46 5 10 52 99 24 74 40 95 35 79 23 39 45 17 38 85 59 69 89
Card 122: 48 51 12 57 61 41 98 22 11 37 | 27 24 95 81 20 73 92 31 32 68 6 63 38 40 83 56 96 62 99 7 30 11 85 75 46
Card 123: 47 62 78 39 69 77 2 43 83 36 | 28 89 49 13 40 70 22 16 23 19 57 61 14 51 44 53 91 50 64 66 33 18 8 15 79
Card 124: 22 28 12 21 40 57 84 5 87 46 | 67 46 31 64 58 22 76 75 37 82 70 21 87 69 13 3 12 5 84 28 14 57 95 61 40
Card 125: 54 74 63 95 39 93 11 81 24 69 | 39 67 71 19 81 84 53 66 51 74 40 63 17 49 95 3 44 11 9 72 91 24 54 56 86
Card 126: 49 98 17 94 19 37 69 1 40 20 | 19 90 77 21 94 96 98 34 49 15 28 76 71 22 83 37 1 69 53 12 31 40 17 42 20
Card 127: 97 45 16 74 87 96 76 60 29 3 | 87 2 45 66 29 17 72 22 15 74 54 38 3 37 60 76 97 62 49 96 61 51 5 16 25
Card 128: 19 79 62 95 67 59 77 5 70 98 | 56 70 21 85 18 68 88 98 79 95 5 83 16 77 91 63 90 19 84 76 37 59 62 67 44
Card 129: 94 73 69 51 30 98 1 65 11 45 | 71 5 44 7 52 79 61 99 11 25 10 8 78 33 57 51 75 20 77 9 6 91 4 46 12
Card 130: 26 98 8 44 84 7 29 47 70 24 | 13 54 48 6 45 78 83 28 10 2 29 71 16 44 62 89 24 53 46 67 20 43 84 91 88
Card 131: 41 27 22 4 39 82 84 68 29 85 | 22 85 16 24 44 25 41 46 23 39 88 9 82 51 90 64 13 80 74 15 4 78 91 94 93
Card 132: 32 46 49 99 77 63 37 18 54 80 | 59 65 42 55 47 18 6 32 9 37 85 52 30 94 72 13 77 97 22 46 26 99 90 92 17
Card 133: 70 72 53 32 24 71 17 27 39 67 | 9 87 57 49 90 81 40 28 37 8 67 51 18 65 99 16 3 31 73 12 91 44 55 70 60
Card 134: 10 65 66 5 88 67 83 75 52 33 | 90 37 65 2 52 69 34 4 45 72 15 1 44 96 94 36 35 76 5 56 63 79 20 12 75
Card 135: 71 54 43 41 34 29 16 88 77 44 | 9 33 48 82 52 74 28 10 22 42 15 47 27 5 7 23 56 55 94 49 63 72 61 78 46
Card 136: 10 97 3 82 73 87 95 80 35 63 | 20 63 50 79 52 77 2 38 84 83 59 74 51 26 5 46 9 49 19 8 13 36 15 7 23
Card 137: 97 53 91 22 90 12 93 23 3 86 | 96 82 24 21 30 51 65 44 50 31 71 34 54 38 36 88 94 48 32 83 99 84 74 27 33
Card 138: 8 97 59 46 75 32 65 82 40 44 | 5 81 19 36 54 2 14 39 20 76 3 68 46 50 47 15 96 89 95 41 37 22 99 40 58
Card 139: 66 97 45 10 72 63 29 43 84 9 | 61 3 74 56 58 4 15 6 68 55 20 23 80 47 83 44 91 19 31 50 54 73 93 45 53
Card 140: 1 9 81 51 8 90 35 61 82 27 | 55 49 88 60 7 93 46 96 70 75 18 37 41 52 36 78 77 80 5 31 76 79 65 99 20
Card 141: 93 8 76 47 31 92 18 23 29 34 | 95 67 73 27 9 98 85 70 96 36 87 89 52 63 65 78 37 24 3 90 2 97 19 93 51
Card 142: 34 71 94 2 79 18 69 89 44 19 | 3 10 9 62 71 44 37 32 97 85 2 89 48 6 14 95 17 91 5 99 11 33 41 39 22
Card 143: 1 91 47 65 14 42 96 12 52 6 | 70 47 45 3 2 54 52 42 65 25 16 38 91 57 72 96 90 36 34 14 79 78 1 39 76
Card 144: 32 9 19 63 16 5 81 1 2 49 | 90 19 52 28 23 75 34 57 70 81 1 36 26 2 32 27 63 43 16 4 49 99 9 21 5
Card 145: 11 45 95 1 92 20 34 49 70 28 | 66 27 57 51 23 24 81 69 56 80 55 89 1 47 95 32 7 5 14 92 99 73 20 84 65
Card 146: 29 84 70 31 61 77 47 89 96 63 | 32 96 52 23 73 79 47 66 67 46 31 26 8 82 15 29 89 84 77 72 11 1 63 97 27
Card 147: 90 51 66 50 32 47 39 20 24 46 | 82 49 76 79 57 9 94 84 80 97 51 4 35 83 63 50 69 72 20 58 31 93 7 24 62
Card 148: 50 53 44 71 81 41 31 57 88 2 | 41 2 68 51 53 37 25 65 34 24 50 98 95 76 88 69 82 42 81 58 31 11 77 33 21
Card 149: 54 32 10 37 35 3 64 4 34 14 | 77 80 53 7 4 29 12 33 69 35 40 32 11 44 83 15 34 2 54 48 30 46 84 14 81
Card 150: 68 41 72 13 84 60 20 54 6 90 | 56 54 65 25 5 32 39 34 26 63 16 86 75 92 95 28 78 62 24 8 48 98 83 69 57
Card 151: 61 48 8 19 95 28 56 34 68 72 | 96 73 69 11 10 29 91 44 28 39 49 34 17 35 19 90 82 61 40 86 95 31 33 81 46
Card 152: 24 65 90 26 97 95 55 68 54 96 | 30 43 70 47 92 96 68 74 26 73 77 97 8 90 86 54 69 17 79 55 16 78 7 38 6
Card 153: 8 61 75 62 12 30 66 64 97 6 | 63 70 81 41 47 85 76 11 90 58 45 39 95 97 22 34 78 82 86 7 99 18 35 31 29
Card 154: 42 2 81 53 80 36 62 64 89 49 | 99 80 49 84 24 91 93 70 88 30 19 47 79 32 33 18 62 25 8 60 28 92 14 89 42
Card 155: 30 76 60 19 12 49 63 33 77 90 | 91 22 96 4 76 47 8 64 58 40 27 49 52 19 63 15 43 73 97 83 61 80 65 34 9
Card 156: 75 23 40 88 39 96 9 36 21 51 | 39 70 67 1 92 62 57 5 27 87 78 81 51 28 63 23 56 2 93 84 75 21 29 97 20
Card 157: 95 86 3 18 98 85 31 22 71 79 | 6 8 89 88 7 38 39 18 15 40 22 96 87 55 90 80 36 9 20 83 1 34 49 73 98
Card 158: 31 36 87 28 57 21 64 35 55 5 | 96 2 78 38 62 32 40 75 14 43 65 71 70 74 61 87 86 1 80 47 23 27 45 67 42
Card 159: 52 31 14 72 16 90 94 45 88 29 | 64 87 46 77 51 74 40 5 16 92 95 82 12 6 38 35 72 98 89 11 84 97 99 57 93
Card 160: 69 51 53 88 58 54 27 48 78 4 | 70 87 72 32 33 23 94 83 10 73 76 19 91 68 80 89 34 64 58 13 98 5 78 75 52
Card 161: 68 34 80 98 81 36 19 61 79 40 | 50 74 25 29 57 12 73 42 83 8 86 30 66 55 20 17 49 84 82 41 46 97 71 23 44
Card 162: 94 12 32 66 57 67 97 39 65 7 | 71 23 76 47 49 9 86 58 50 78 88 15 90 43 54 27 37 81 75 13 34 64 87 2 40
Card 163: 57 72 66 78 45 23 76 2 24 81 | 58 17 19 44 5 3 2 57 39 82 88 24 47 8 90 31 66 92 68 45 72 78 81 76 23
Card 164: 22 57 61 52 83 80 99 37 39 36 | 80 23 67 54 43 99 83 28 37 13 3 55 91 52 51 98 82 27 21 61 22 36 85 57 39
Card 165: 62 81 8 72 15 53 36 98 51 22 | 76 6 26 73 65 98 36 72 33 97 5 81 53 69 22 15 14 44 11 8 51 62 13 45 20
Card 166: 28 33 40 30 17 74 81 2 88 62 | 4 79 81 96 93 48 62 39 40 78 33 75 26 29 37 30 2 17 31 28 15 88 97 72 74
Card 167: 16 1 46 98 76 85 35 91 21 18 | 21 82 94 95 87 66 89 30 64 10 33 93 23 29 34 47 96 20 77 83 81 75 88 46 49
Card 168: 50 86 74 64 85 75 80 21 5 46 | 85 74 50 64 96 51 49 55 48 72 5 14 3 39 92 54 46 38 21 86 33 97 61 75 15
Card 169: 51 49 66 48 30 10 32 67 60 69 | 42 32 67 43 62 66 10 38 37 60 51 48 9 29 16 49 74 25 36 91 24 69 81 17 30
Card 170: 17 24 18 73 64 60 56 38 80 8 | 94 45 30 39 71 12 88 89 61 2 23 40 9 48 42 52 28 96 59 95 19 72 36 81 25
Card 171: 38 32 75 85 98 11 17 57 89 56 | 52 57 75 85 32 61 38 98 3 16 60 50 56 34 26 89 77 11 17 49 81 9 20 8 1
Card 172: 1 30 98 25 63 39 29 17 58 40 | 98 6 30 85 27 25 69 17 93 47 29 31 63 5 23 56 87 7 91 39 35 58 59 22 38
Card 173: 88 59 3 87 21 91 24 4 82 48 | 97 53 67 73 28 66 45 27 36 88 64 99 92 24 26 87 72 96 84 59 85 68 82 49 10
Card 174: 56 79 60 1 77 37 83 9 30 92 | 2 15 71 79 60 31 32 58 34 74 42 1 18 5 38 83 97 12 92 86 56 95 19 85 98
Card 175: 2 50 25 89 41 75 94 78 95 17 | 72 81 28 48 55 17 69 66 40 91 78 32 27 2 95 13 50 80 15 3 49 94 90 85 25
Card 176: 51 22 14 16 1 62 64 84 12 25 | 22 34 91 76 62 38 88 78 35 95 51 45 12 92 61 28 81 16 36 14 8 66 9 10 56
Card 177: 83 47 79 45 75 15 44 52 11 88 | 26 5 59 93 83 88 79 44 4 28 32 86 52 89 56 47 97 48 80 15 3 40 98 18 33
Card 178: 87 42 52 70 32 7 39 6 9 17 | 17 9 5 45 52 4 70 72 27 3 78 24 50 39 94 87 47 14 42 6 44 95 85 88 7
Card 179: 79 87 75 44 93 9 71 16 11 5 | 44 37 11 92 59 50 13 91 36 45 87 77 99 31 68 94 9 62 71 38 8 16 42 55 5
Card 180: 18 98 61 58 87 41 51 37 28 79 | 65 32 36 92 49 45 10 93 40 4 67 76 55 42 88 30 75 44 23 71 98 51 14 78 24
Card 181: 7 17 80 68 38 36 86 59 75 96 | 68 64 54 8 12 6 88 45 80 98 51 60 53 22 75 50 34 77 29 38 24 9 48 70 36
Card 182: 9 57 37 30 78 31 18 40 49 32 | 11 57 40 50 68 22 18 36 74 91 29 52 70 81 75 69 38 7 26 24 33 55 5 34 95
Card 183: 36 15 99 95 83 87 22 80 59 31 | 61 99 31 20 55 57 89 34 26 72 39 67 4 22 2 91 24 83 56 44 14 81 49 10 12
Card 184: 70 55 77 4 95 51 10 13 75 27 | 70 38 97 88 85 24 48 67 69 89 13 49 28 60 71 10 93 72 84 15 57 98 33 16 20
Card 185: 32 53 24 75 26 20 94 4 73 57 | 80 22 1 10 4 71 16 44 87 35 19 72 47 40 59 36 58 2 8 43 23 46 37 34 12
Card 186: 93 84 73 24 6 37 72 41 55 75 | 36 71 80 32 2 68 58 47 33 6 70 10 78 19 44 82 39 90 54 91 88 20 28 64 87
Card 187: 62 23 40 15 57 69 94 64 60 85 | 63 26 36 8 90 42 58 73 30 28 32 18 50 48 54 88 72 86 13 37 22 5 87 79 77
Card 188: 84 42 64 5 88 96 45 91 66 25 | 91 32 93 75 25 2 73 85 88 33 66 58 45 53 28 42 57 40 39 24 5 84 96 78 67
Card 189: 59 99 36 6 34 46 98 29 69 53 | 52 17 67 11 98 25 41 34 59 69 46 99 72 92 80 14 26 1 51 76 33 95 36 6 29
Card 190: 75 5 85 72 81 96 7 74 21 39 | 32 44 7 87 42 72 86 4 71 81 95 84 85 33 75 78 74 76 96 21 37 58 10 64 73
Card 191: 28 83 55 46 56 85 78 21 47 37 | 46 47 82 21 57 29 54 59 78 39 30 33 89 48 83 55 28 85 94 24 72 96 37 56 9
Card 192: 72 91 29 35 2 42 71 24 82 55 | 49 29 84 40 69 85 24 48 3 42 61 9 63 37 41 79 11 20 72 14 80 71 16 38 82
Card 193: 61 88 76 45 71 29 84 78 81 83 | 85 63 56 2 49 92 47 30 71 43 38 76 60 88 81 84 98 94 8 6 51 58 42 70 61
Card 194: 28 18 61 86 27 79 32 48 58 96 | 13 20 95 38 63 46 51 78 90 3 80 15 72 76 88 77 69 24 6 35 28 62 5 36 65
Card 195: 96 89 40 50 26 36 86 75 62 10 | 6 5 69 72 82 45 3 33 86 71 97 34 36 91 42 20 80 93 40 35 96 89 17 31 50
Card 196: 45 11 82 74 51 55 19 43 24 94 | 63 14 22 75 94 29 19 39 13 8 82 32 76 41 53 43 54 91 11 17 62 21 71 42 86
Card 197: 20 64 71 4 50 90 49 17 8 6 | 65 92 6 60 94 54 56 33 80 75 69 15 49 71 26 81 67 37 74 11 20 25 43 85 19
Card 198: 28 11 15 25 97 2 22 31 29 73 | 14 35 15 87 81 54 49 2 20 79 44 96 38 94 55 97 17 86 65 46 32 21 67 58 27
Card 199: 50 83 4 30 82 92 76 11 55 19 | 47 50 57 53 5 14 28 85 46 88 94 51 13 38 3 89 66 45 87 24 31 96 69 73 44
Card 200: 55 23 78 25 87 33 36 80 79 38 | 99 30 52 4 85 95 66 26 28 91 20 45 72 68 8 35 92 86 93 43 65 97 14 50 44
Card 201: 33 75 55 46 25 63 76 37 1 73 | 68 64 22 99 12 56 43 28 44 80 91 65 78 27 71 32 95 29 59 36 45 60 77 62 82
Card 202: 66 29 75 28 68 42 98 21 82 99 | 23 92 38 44 45 12 6 4 17 64 67 60 36 79 46 58 14 73 71 72 81 49 13 2 30

View file

@ -0,0 +1,197 @@
seeds: 3127166940 109160474 3265086325 86449584 1581539098 205205726 3646327835 184743451 2671979893 17148151 305618297 40401857 2462071712 203075200 358806266 131147346 1802185716 538526744 635790399 705979250
seed-to-soil map:
931304316 1786548802 232453384
3500539319 2322065235 6421609
496396007 147739714 266329192
3169724489 768672891 39526579
3689153715 1361862036 346985
1936948751 3328259881 542896984
3209251068 3154345676 173914205
1163757700 2814318523 24125066
2484210664 1362209021 231487475
3991904247 2133571422 188493813
1187882766 4045525873 83717994
861951350 3084992710 69352966
2715698139 2838443589 43714032
3830303258 4025104215 20421658
768672891 1268583577 93278459
4180398060 2019002186 114569236
3689500700 1593696496 10659519
1271600760 808199470 460384107
166497091 526585653 102729094
3700160219 3894961176 130143039
2966889400 2882157621 202835089
147739714 414068906 18757377
3850724916 4133608796 141179331
2759412171 2328486844 183672918
2479845735 4129243867 4364929
3480360150 4274788127 20179169
402636637 432826283 93759370
3383165273 2717123646 97194877
3506960928 1604356015 182192787
269226185 629314747 133410452
2943085089 3871156865 23804311
1731984867 2512159762 204963884
soil-to-fertilizer map:
3368312743 826425240 243745914
1045038113 3682756471 174490549
3931158487 1530223690 363808809
1219528662 2460222182 131099318
3020480207 1894032499 63879875
121779694 248970341 36319877
1993634034 2662348686 86667553
3612058657 1323325837 196530127
1531175223 2604354699 57993987
158099571 121779694 127190647
1867147432 3317666386 126486602
2080301587 2768963716 548702670
1402482267 1070171154 21180243
2959841028 4051272297 60639179
834756529 1966243663 128160296
3911211010 2749016239 19947477
962916825 3857247020 82121288
2629004257 3444152988 238603483
826425240 1957912374 8331289
1350627980 3939368308 51854287
1589169210 4214533702 80433594
2867607740 2094403959 92233288
1669602804 1125781209 197544628
3084360082 1519855964 10367726
1483712212 1091351397 34429812
3094727808 2186637247 273584935
1423662510 3991222595 60049702
3808588784 4111911476 102622226
1518142024 2591321500 13033199
fertilizer-to-water map:
206818393 1973789958 18543481
2641351404 1992333439 41420268
58400970 2574944960 107826712
3710426911 4065366707 42793360
4217161704 4274048011 20919285
1926695368 705931711 328031436
1449580741 1210970895 50549447
907984567 1421828853 15115545
769748018 1108192216 102778679
451427938 35457870 38201654
2254726804 2033892789 137829519
923239194 1513967644 270588891
3753220271 4108160067 165887944
499804857 310274559 109862756
3061525238 3535532059 426476055
1193828085 73659524 196024324
872526697 0 35457870
1766386857 1261520342 160308511
4057593930 3283950856 159567774
1389852409 646203379 59728332
3919108215 3962008114 103358593
1577153434 1784556535 189233423
4022466808 3443518630 35127122
489629592 1098016951 10175265
923100112 2033753707 139082
2392556323 2390203683 158894869
1500130188 1436944398 77023246
2577297600 1033963147 64053804
609667613 2171722308 160080405
3488001293 3061525238 222425618
2551451192 2549098552 25846408
4238080989 3478645752 56886307
166227682 269683848 40590711
0 2331802713 58400970
225361874 420137315 226066064
water-to-light map:
1833244152 0 764535859
212138399 2132863085 224047237
445686952 1600446740 163005122
3322180377 2914685303 488586806
2739726430 3712513349 582453947
3946546331 3589340640 8839399
1441711040 799272484 245821386
1038755613 1763451862 6623730
608692074 1587251997 13194743
701103180 2356910322 39153476
1687532426 1045093870 145711726
2597780011 764535859 34736625
740256656 1490869662 54307168
0 1920724686 212138399
2632516636 1545176830 9229765
668257778 1554406595 32845402
3955385730 2739726430 39179725
4180633986 3598180039 114333310
3810767183 2778906155 135779148
1291061946 1770075592 150649094
436185636 1481368346 9501316
1045379343 2396063798 245682603
794563824 1237176557 244191789
621886817 1190805596 46370961
3994565455 3403272109 186068531
light-to-temperature map:
432141642 1268486741 19474646
3617581823 3276436954 357008111
3505110084 3786131308 49942802
0 1287961387 432141642
3096011130 1808659179 409098954
1347993824 2675880000 161612192
3019335150 3199760974 76675980
3555052886 3137232037 62528937
2778092757 1720103029 88556150
451616288 2217758133 458121867
1509606016 0 1268486741
909738155 3836074110 138515824
1048253979 2837492192 299739845
2866648907 3633445065 152686243
temperature-to-humidity map:
646729740 1519504972 559297346
1894539176 2990410634 44298872
232257988 972432123 414471752
2277879451 278205785 108711195
1775790220 132298732 118748956
3371687162 2663455233 326955401
1612056920 272509895 5695890
1208383109 3703499740 147415518
4070380190 4053129082 69974785
4155541210 3305585510 139426086
81956384 386916980 150301604
3987543096 896459472 75972651
2148980475 1386903875 128898976
1617752810 3445011596 154599732
4063515747 2078802318 6864443
2392568787 3599611328 101532389
2386590646 4123103867 5978141
2494101176 2122546980 187027686
2681128862 2085666761 36880219
4140354975 2648268998 15186235
1772352542 3051742077 3437678
1355798627 3850915258 202213824
3720104770 3055179755 250405755
3032992830 2309574666 338694332
1206027086 3701143717 2356023
1938838048 537218584 44257139
1558012451 81956384 50342348
3970510525 3034709506 17032571
1608354799 1515802851 3702121
1983095187 4129082008 165885288
3698642563 251047688 21462207
2718009081 581475723 314983749
humidity-to-location map:
971626884 4275486551 19480745
1218249913 2090555906 502249162
2914848039 2902831882 224865747
3341591733 2819947352 82884530
991107629 2592805068 227142284
3424476263 606585628 95279547
4279176998 2064757318 10971709
3139713786 4068790015 201877947
606585628 701865175 365041256
3534582689 3291885426 744594309
1916997152 1066906431 997850887
1752809355 3127697629 164187797
1720499075 4036479735 32310280
4290148707 4270667962 4818589
3519755810 2075729027 14826879

View file

@ -0,0 +1,2 @@
Time: 53 91 67 68
Distance: 250 1330 1081 1025

1000
2023/aoc_puzzle_cache/day_07 Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,756 @@
LLRLRRRLLLRLRRLRRRLRLRRLRLRLRRRLRRRLRLRLRRLLRRRLRRLRRLLRLRRRLRLRLLRRRLLRRRLRLRRRLRRRLRRRLLLRRRLRRLRRLRLRRLRLRRRLRLRRLRLRLRRRLRLLLRRRLLLRLRRRLRLRRLRLRLRLRRLRRLRRLRLRRRLRRRLRRLRRRLRRLRRLRRRLLRLRRLLLRRLRRLRLRLLLRRLRRLRRRLRRLLRLRRRLRRRLRRLRRLRLRRLRLRRRLRRLRRRLLRRRLRLRLLLRRRLLLRRLLRRLRLRRLRLLLRRRR
BNR = (DLB, QNM)
CTN = (NVJ, DRS)
VHS = (XDL, LVL)
MLQ = (VXK, CJK)
CNX = (CTN, DRK)
MVD = (SRT, SRT)
LLM = (VKX, VTT)
GDS = (PJT, DBD)
QFF = (BQR, HCT)
QNP = (NXM, MRQ)
SKT = (GGD, BXR)
KND = (JKT, VKS)
NSJ = (VLH, HMK)
TKV = (SMR, BVG)
STR = (KFR, NQK)
VDL = (PRB, KLG)
DBN = (NPF, VDL)
PCQ = (CNL, QBX)
PQS = (KKJ, GNV)
JQM = (DBD, PJT)
FHL = (SSL, PLN)
KVT = (KBG, SKT)
CDR = (HCM, DGT)
MKT = (RGP, CQR)
MKK = (RMJ, DBK)
AAA = (TFQ, VSD)
QHL = (JBG, RNL)
LXJ = (HPJ, QXC)
QLT = (HQL, XDP)
FHN = (MMF, CKL)
SHF = (FHQ, FHG)
MTJ = (SJT, KFG)
DPJ = (SVF, HPV)
FPX = (BNR, RSG)
CVL = (XRS, HHM)
NSK = (DBN, SBK)
QNF = (PQK, RJC)
KKJ = (BVJ, NTK)
XNP = (KPD, QTF)
XTJ = (HNS, XBV)
KQT = (BHG, KTL)
BPL = (QRS, PJB)
JSX = (LCN, VQK)
MLC = (JLF, JLF)
QBX = (VVX, TNJ)
PGP = (CMN, SRR)
HRX = (HFM, JDB)
GGK = (SQS, LLM)
HVV = (VRG, JNJ)
RND = (HHM, XRS)
RPQ = (RMQ, JMH)
LRF = (QBX, CNL)
GJN = (TLF, LNB)
CTJ = (HPT, MBC)
HSR = (DKT, GFK)
KTL = (PMJ, CRN)
BDF = (LRF, PCQ)
PFS = (XBP, NQC)
VRQ = (KBL, VVD)
QRR = (VNR, LGB)
BNJ = (PVP, HPC)
PQC = (GPT, HFK)
CVX = (KKF, PFS)
BTQ = (BLC, VGC)
SDG = (LXT, QRR)
RJM = (FNN, QJJ)
JRF = (NSK, LFQ)
DFB = (DKJ, MGR)
XSC = (CFX, DHF)
JKH = (QRS, PJB)
NQQ = (NCR, CGS)
JHV = (CTJ, SLC)
LBB = (NVS, QJG)
SBK = (VDL, NPF)
HLD = (LXJ, XQB)
XCR = (DJM, PPS)
KPD = (GDF, KJL)
HKL = (VQK, LCN)
JKT = (BLH, CCN)
SRQ = (XFS, QHQ)
LXT = (VNR, LGB)
PJT = (TTC, QLT)
VNC = (BQR, HCT)
XNQ = (TDD, QFZ)
FDN = (MBR, DVG)
JBL = (MNK, VPC)
NRX = (PVH, PVH)
TTK = (VQQ, FSH)
XSJ = (BFQ, RDK)
VTP = (NXM, MRQ)
BCP = (MLC, PRC)
JQS = (LRF, PCQ)
QJC = (RJR, CNX)
KSP = (MHL, QJH)
KPN = (TKL, HKQ)
LCN = (KXQ, FBF)
GLG = (XVX, CQQ)
JTM = (FJH, DDP)
RQH = (PHJ, PKD)
TVV = (HJV, JGJ)
NKQ = (KKK, DSB)
GXS = (PVP, HPC)
SPS = (HVX, CFR)
GXD = (MFV, DMH)
QXJ = (HVT, MSF)
PTP = (MTT, VFN)
RMB = (DXR, RKJ)
NTN = (JMH, RMQ)
GJV = (JDH, NQQ)
JFV = (PKD, PHJ)
BMB = (MLB, QJL)
DFC = (GFH, SMN)
FFK = (XNT, JSQ)
PHJ = (VVL, RMS)
QRS = (RMC, VCJ)
PNX = (BXH, JLS)
GNB = (VHB, HFG)
QJN = (LXX, MRV)
MDM = (VCR, JHD)
BSR = (LXG, LST)
HXJ = (SRQ, HND)
HCT = (TTX, RNP)
HJV = (KCQ, QCB)
VXK = (FFK, JVQ)
GNP = (KQX, TSS)
RKD = (FCR, BXX)
FXP = (BXX, FCR)
FSH = (QSB, FPX)
QJJ = (DVB, GLR)
XPC = (KKJ, GNV)
HVQ = (NMR, DRN)
RSG = (DLB, QNM)
JSQ = (HMS, RJH)
FHS = (DHS, CDT)
JQB = (GQR, GVT)
QXC = (KTG, TTD)
JTL = (QLS, XGR)
VNR = (QFF, VNC)
PHG = (FTJ, TVR)
PMJ = (PJV, PJV)
SRJ = (LCV, JCL)
MDF = (XBB, QTH)
NDS = (SRF, RQP)
RHP = (XQQ, SHF)
NBL = (PXH, KGQ)
JGS = (HFC, FJJ)
QRD = (RGF, FMN)
NDX = (SHX, HBB)
LXG = (XMJ, RQS)
NGH = (RLX, CDR)
DJB = (FLC, RJS)
TTD = (MKK, BRS)
XVZ = (QSX, DJF)
BQV = (NQQ, JDH)
TTC = (HQL, XDP)
DHF = (BSJ, MCL)
VLV = (LSH, KTF)
QLS = (TCX, BXB)
QCT = (HFK, GPT)
XDP = (JQX, SVH)
LQL = (XCR, GCH)
MXH = (VHB, HFG)
HQB = (DMN, TNR)
CKL = (VVR, PSF)
KVG = (KMF, CRS)
MXT = (TLX, FQN)
VTV = (JHV, FDL)
TTT = (KPD, QTF)
PLN = (LMM, KCF)
VCJ = (QHM, PTR)
VCX = (XKM, RBG)
RDK = (VDG, RFD)
JCC = (QJL, MLB)
RFD = (GXS, BNJ)
RQP = (NQH, PKG)
GST = (PNB, DVN)
KFR = (JBP, GLM)
PPS = (XXC, FDG)
VJL = (PGH, PGH)
TVR = (LJN, QJV)
SLR = (BDH, QJC)
SMM = (KGR, TTK)
HGH = (QKX, KJP)
GDD = (PQS, XPC)
RPB = (TLD, LPB)
KKF = (XBP, NQC)
SCB = (MBR, MBR)
PPC = (LXT, QRR)
TFT = (XPK, SHP)
XQQ = (FHG, FHQ)
PVH = (TDD, TDD)
SJT = (QNP, VTP)
RRS = (JPC, JQB)
CMR = (JQM, GDS)
KHC = (BDF, JQS)
BLH = (KXD, SKF)
BFN = (LPB, TLD)
LSH = (NTN, RPQ)
NMN = (DRN, NMR)
QJL = (VHG, VVC)
XNJ = (SMN, GFH)
RGF = (HLD, RVL)
NGF = (PGQ, NLV)
RMX = (LXX, MRV)
QDK = (BCP, JNX)
LVL = (SPS, KQJ)
QFP = (SSV, QCP)
DNT = (CQX, XSJ)
MCL = (DCV, QBR)
HNJ = (PRQ, KKR)
QNM = (DBX, FNP)
XLQ = (TKL, HKQ)
JTD = (HXL, VTV)
KXD = (XSH, PNX)
THC = (JRF, FSV)
VCR = (FXP, RKD)
KKK = (DNG, DNM)
PKQ = (BLC, VGC)
PGQ = (DNT, PNK)
DMH = (NJG, RVM)
VVL = (JLT, GQH)
RFN = (QHL, CXS)
RKR = (PRQ, KKR)
XNT = (HMS, RJH)
JLL = (RTH, BNG)
HCM = (TDX, VGM)
NVH = (HNS, XBV)
HFM = (MST, PTP)
LJF = (XLR, KHC)
GSV = (JLG, QQC)
STF = (KGD, NSJ)
DHB = (FHL, GPM)
FJC = (QCL, HGP)
BPN = (MVD, LQF)
KSR = (JPC, JQB)
KGD = (VLH, VLH)
DPN = (TFT, LGT)
QHQ = (QPV, JLL)
FJH = (XFV, NMV)
QBP = (XXJ, KVG)
PNK = (CQX, XSJ)
TBN = (SPT, JCV)
DVG = (HRX, VGZ)
NXH = (JTD, SCS)
DDD = (BJC, JTM)
HFC = (SDG, PPC)
QKX = (XPM, QRP)
GFK = (GCL, HGH)
LMM = (MPD, BMK)
PKG = (HLC, XSD)
MLB = (VVC, VHG)
BMK = (JKH, BPL)
HBN = (XTT, LXV)
QMN = (JTR, PHF)
TLM = (DHS, CDT)
PPZ = (HCG, NGT)
VPK = (QJD, KCK)
BRS = (RMJ, DBK)
RQS = (XNP, TTT)
NNM = (RRR, NDS)
SRR = (HBN, QDP)
TTN = (XLQ, KPN)
LDL = (QXJ, FQP)
PQT = (PGH, PPZ)
BLM = (LGT, TFT)
FMQ = (BTQ, PKQ)
KQD = (TSS, KQX)
XLR = (BDF, JQS)
PKL = (LMK, FJS)
KCF = (MPD, BMK)
MHD = (KBG, SKT)
RMQ = (THC, LFF)
QPM = (JGF, TDH)
QCP = (VPB, PKL)
LCV = (LCJ, XQM)
BCD = (PKQ, BTQ)
RBG = (MLQ, STS)
LVT = (DKT, GFK)
DKJ = (LKN, CBS)
DKB = (HDL, QFP)
HPV = (RMX, QJN)
MDT = (RCH, CMR)
CFQ = (LXG, LST)
XDV = (FQN, TLX)
KXQ = (VRH, VRQ)
CVB = (DSB, KKK)
DBX = (DHB, QHF)
DSB = (DNM, DNG)
CFX = (BSJ, MCL)
KJL = (QDK, VKJ)
RTP = (KGQ, PXH)
FJS = (QTR, FJC)
HGJ = (VKQ, DCR)
NXM = (LNC, HXR)
CQX = (BFQ, RDK)
BVV = (NQB, GMG)
RRL = (DHF, CFX)
JMH = (THC, LFF)
DVH = (CCV, DLR)
JFX = (RTB, XBH)
GLR = (NXH, BLP)
RMC = (QHM, PTR)
NQB = (SXX, FSL)
CTB = (CKS, XQD)
VSJ = (QCT, PQC)
NCR = (CNR, VQX)
JTR = (MDT, LFL)
DGT = (TDX, VGM)
KFM = (CTB, LFG)
SQG = (FPN, NHP)
RTB = (XVQ, MDF)
DSC = (GXD, PLD)
PRB = (XDQ, XLJ)
LSV = (LCP, VHS)
CCQ = (MLM, TKV)
DRS = (DPN, BLM)
RVL = (LXJ, XQB)
DKT = (HGH, GCL)
GCP = (LCP, VHS)
MPD = (JKH, BPL)
BVJ = (PCK, HMC)
LST = (XMJ, RQS)
LRB = (NGH, BVD)
MNM = (JGJ, HJV)
QSB = (BNR, RSG)
BVB = (BGT, CLM)
NMV = (JCC, BMB)
HVX = (GDD, BJS)
FBL = (BJC, JTM)
SFR = (RGF, FMN)
KCK = (JRD, NFC)
FTJ = (LJN, QJV)
VSD = (SBB, GST)
MSF = (RCJ, NDX)
CNL = (VVX, TNJ)
CLH = (JBM, JSB)
JRQ = (TGH, LFN)
HCV = (QPM, FXJ)
NMR = (RRL, XSC)
BGT = (RJM, NMQ)
NQC = (KND, CRG)
BXV = (KSP, MRN)
SCS = (HXL, VTV)
JCL = (LCJ, XQM)
JTQ = (NLV, PGQ)
TSS = (LVT, HSR)
CDT = (KNG, VLV)
QBR = (QMN, XXH)
QJD = (NFC, JRD)
JDH = (CGS, NCR)
SLC = (MBC, HPT)
BLC = (BSR, CFQ)
JJN = (BCD, FMQ)
DXR = (SCB, SCB)
CRG = (JKT, VKS)
DNG = (KXS, FQX)
GCL = (QKX, KJP)
SPT = (KSK, KSK)
PQK = (XTJ, NVH)
NPF = (PRB, KLG)
RCJ = (HBB, SHX)
GCH = (PPS, DJM)
QRA = (DJF, QSX)
DJF = (MDM, LKV)
RRR = (SRF, RQP)
TLD = (RVV, HGJ)
LNC = (XGJ, VSJ)
VVD = (TTN, PRD)
TNJ = (XLF, CLG)
JNJ = (LVK, LBB)
GXH = (NRX, TNT)
DFR = (PGP, TCC)
RCH = (JQM, GDS)
FMN = (HLD, RVL)
TFQ = (GST, SBB)
NSQ = (FQP, QXJ)
LFF = (JRF, FSV)
HVT = (RCJ, NDX)
SHR = (KFM, TVX)
SQS = (VKX, VTT)
PHF = (LFL, MDT)
PJV = (SPT, SPT)
LFG = (CKS, XQD)
HND = (QHQ, XFS)
FFD = (BGT, CLM)
KMF = (LQL, FHT)
XVQ = (XBB, QTH)
JCV = (KSK, ZZZ)
JVQ = (JSQ, XNT)
DHS = (KNG, VLV)
SKF = (PNX, XSH)
BJC = (DDP, FJH)
GGD = (RQH, JFV)
JBP = (BVB, FFD)
JRJ = (NBL, RTP)
HMK = (LJF, QQZ)
JBG = (GGK, NHR)
XQB = (QXC, HPJ)
NTK = (PCK, HMC)
RTH = (BQV, GJV)
LFQ = (DBN, SBK)
KKR = (RJB, PKR)
DRK = (DRS, NVJ)
SHP = (SMM, SSN)
KCQ = (LSV, GCP)
KTG = (BRS, MKK)
GJT = (DPJ, KTV)
JPN = (DMN, TNR)
HNS = (GRL, TKH)
KBG = (GGD, BXR)
RVM = (QNF, MQF)
KQA = (XLR, KHC)
LNB = (MXT, XDV)
KGR = (VQQ, FSH)
BXR = (RQH, JFV)
MNK = (XNJ, DFC)
CQR = (SFR, QRD)
MTT = (SRB, JBL)
CQQ = (QKG, GSV)
MTH = (BHG, KTL)
MBC = (FXS, CCQ)
CLM = (RJM, NMQ)
VGZ = (JDB, HFM)
PRC = (JLF, NKV)
LPB = (HGJ, RVV)
QPV = (BNG, RTH)
ZZZ = (VSD, TFQ)
VKS = (BLH, CCN)
FDG = (MTL, RMB)
FQN = (NRN, LRB)
MGR = (LKN, CBS)
GMG = (SXX, FSL)
BVG = (BVV, CSL)
VQX = (JXS, JRJ)
DFA = (HFM, JDB)
RMS = (GQH, JLT)
XFV = (BMB, JCC)
BLP = (SCS, JTD)
HST = (DQH, GVC)
JLF = (VJL, VJL)
BQR = (TTX, RNP)
FDL = (SLC, CTJ)
HSQ = (SHR, VFR)
FPN = (DJB, MBX)
DMN = (GJT, HRJ)
MFV = (NJG, RVM)
VPB = (FJS, LMK)
KSK = (TFQ, VSD)
VRH = (VVD, KBL)
VTT = (QBP, HVJ)
PXH = (RND, CVL)
JLT = (PKV, GLG)
DVB = (BLP, NXH)
QTH = (FHN, JFF)
SSV = (VPB, PKL)
PTR = (KQD, GNP)
XRS = (JPN, HQB)
NLV = (PNK, DNT)
KQX = (HSR, LVT)
VPC = (XNJ, DFC)
PJB = (VCJ, RMC)
FHQ = (BHV, SBM)
NRN = (BVD, NGH)
TLF = (XDV, MXT)
MMF = (PSF, VVR)
QCB = (GCP, LSV)
RGP = (SFR, QRD)
DBA = (NGT, HCG)
JNV = (VRG, JNJ)
JLG = (GJN, LKQ)
DDP = (NMV, XFV)
BHV = (CFJ, GRP)
HXL = (JHV, FDL)
JDB = (PTP, MST)
HFK = (DTK, PLF)
KQJ = (HVX, CFR)
MHL = (PMR, DKB)
GVL = (RBG, XKM)
TNR = (HRJ, GJT)
FQP = (MSF, HVT)
FQX = (KJT, SRJ)
FJJ = (SDG, PPC)
LCJ = (XQS, STF)
SVF = (RMX, QJN)
CXS = (JBG, RNL)
NJP = (FPN, NHP)
TNH = (KSP, MRN)
CSL = (NQB, GMG)
NFC = (FBL, DDD)
QFZ = (DSC, DKD)
XQS = (KGD, KGD)
BJS = (XPC, PQS)
JGJ = (KCQ, QCB)
XSD = (TLM, FHS)
QHM = (KQD, GNP)
XBP = (KND, CRG)
KFG = (QNP, VTP)
JRL = (FXJ, QPM)
XSH = (BXH, JLS)
BDH = (CNX, RJR)
GNV = (BVJ, NTK)
SBM = (GRP, CFJ)
BXH = (JGS, XRM)
GQH = (GLG, PKV)
FNP = (DHB, QHF)
TDH = (HGM, MTJ)
VKX = (HVJ, QBP)
PLF = (BJH, DFB)
FSL = (HCV, JRL)
VQK = (KXQ, FBF)
BJJ = (HND, SRQ)
SRT = (DJF, QSX)
LGT = (XPK, SHP)
CFR = (BJS, GDD)
LFL = (CMR, RCH)
SHX = (HXJ, BJJ)
VHG = (VFJ, RHP)
BXX = (BXV, TNH)
JBM = (HNL, JFX)
CKS = (GBT, CVX)
HVJ = (KVG, XXJ)
CMN = (QDP, HBN)
HRJ = (DPJ, KTV)
FSV = (NSK, LFQ)
FBF = (VRH, VRQ)
GRP = (PMT, DFF)
VFN = (SRB, JBL)
HMC = (JRQ, SNK)
TCC = (SRR, CMN)
XBH = (XVQ, MDF)
TVX = (CTB, LFG)
DQH = (MDC, HSQ)
DVN = (PHG, DSS)
QCV = (DQH, GVC)
NVJ = (BLM, DPN)
KXS = (SRJ, KJT)
QRP = (CMS, JTL)
MBR = (HRX, HRX)
SRF = (PKG, NQH)
VHB = (NJP, SQG)
PRQ = (PKR, RJB)
BNG = (BQV, GJV)
TTX = (NNM, LFH)
XDQ = (CVB, NKQ)
MRV = (JSX, HKL)
QQZ = (KHC, XLR)
XVX = (GSV, QKG)
RJC = (NVH, XTJ)
GLK = (PGP, TCC)
XBV = (GRL, TKH)
STS = (CJK, VXK)
XTT = (RKR, HNJ)
SBB = (DVN, PNB)
JRD = (DDD, FBL)
GRL = (MNM, TVV)
SMR = (CSL, BVV)
DCV = (XXH, QMN)
GFH = (JTQ, NGF)
HXR = (VSJ, XGJ)
CCN = (KXD, SKF)
SXX = (HCV, JRL)
RJH = (KMT, VPK)
RJS = (VCX, GVL)
TLX = (LRB, NRN)
SSN = (KGR, TTK)
XLF = (QCV, HST)
SVH = (SLR, JBK)
RJB = (STR, BJQ)
RMJ = (RFN, DXF)
LGC = (FMQ, BCD)
VRG = (LBB, LVK)
HGM = (SJT, KFG)
JFF = (CKL, MMF)
QQC = (GJN, LKQ)
PLD = (MFV, DMH)
DSS = (FTJ, TVR)
NKV = (VJL, PQT)
CBS = (BRN, GXH)
JBK = (BDH, QJC)
HKQ = (RRS, KSR)
GQR = (DVH, TRF)
BJH = (DKJ, MGR)
TKL = (KSR, RRS)
BFQ = (RFD, VDG)
LCP = (LVL, XDL)
FCR = (BXV, TNH)
HFG = (NJP, SQG)
GPM = (PLN, SSL)
NHR = (SQS, LLM)
CLG = (QCV, HST)
PKV = (CQQ, XVX)
JLS = (XRM, JGS)
PRD = (XLQ, KPN)
HLC = (TLM, FHS)
QDP = (XTT, LXV)
DXF = (CXS, QHL)
KTF = (NTN, RPQ)
QJG = (JJN, LGC)
QCL = (MXH, GNB)
PCK = (JRQ, SNK)
HDL = (SSV, QCP)
FNN = (DVB, GLR)
HGP = (GNB, MXH)
VGC = (BSR, CFQ)
XRM = (HFC, FJJ)
DLB = (DBX, FNP)
LFH = (NDS, RRR)
RNL = (GGK, NHR)
DBK = (DXF, RFN)
HPT = (CCQ, FXS)
LXV = (RKR, HNJ)
HQL = (JQX, SVH)
TRF = (DLR, CCV)
QJV = (HVQ, NMN)
VFR = (TVX, KFM)
HNL = (XBH, RTB)
LJN = (HVQ, NMN)
GVT = (DVH, TRF)
FHT = (XCR, GCH)
HCG = (PJD, CLH)
QKG = (QQC, JLG)
MRQ = (LNC, HXR)
FLC = (GVL, VCX)
PNB = (PHG, DSS)
VVR = (NSQ, LDL)
QJH = (DKB, PMR)
VFJ = (XQQ, SHF)
SSL = (LMM, KCF)
MST = (MTT, VFN)
PVP = (SND, MKT)
HBB = (BJJ, HXJ)
PMR = (HDL, QFP)
KTV = (HPV, SVF)
XXJ = (CRS, KMF)
CGS = (CNR, VQX)
SNK = (TGH, LFN)
GPT = (DTK, PLF)
RVV = (VKQ, DCR)
KBL = (TTN, PRD)
JSB = (HNL, JFX)
JPC = (GQR, GVT)
NGT = (CLH, PJD)
LQF = (SRT, XVZ)
LMK = (QTR, FJC)
QTR = (QCL, HGP)
XBB = (FHN, JFF)
NJG = (MQF, QNF)
XLJ = (CVB, NKQ)
LGB = (QFF, VNC)
NQK = (JBP, GLM)
LVK = (NVS, QJG)
HJA = (DKD, DSC)
XXH = (PHF, JTR)
BHG = (PMJ, CRN)
KJT = (LCV, JCL)
MQF = (RJC, PQK)
KLG = (XDQ, XLJ)
XXC = (MTL, RMB)
PGH = (NGT, HCG)
XPK = (SSN, SMM)
BRN = (NRX, NRX)
MRN = (QJH, MHL)
QSX = (MDM, LKV)
SRB = (VPC, MNK)
VGM = (MQR, BPN)
JNX = (MLC, PRC)
VQQ = (QSB, FPX)
DRN = (XSC, RRL)
LKQ = (LNB, TLF)
LKV = (VCR, JHD)
MTL = (DXR, RKJ)
PKD = (RMS, VVL)
DNM = (KXS, FQX)
FXS = (MLM, TKV)
CFJ = (PMT, DFF)
XFS = (JLL, QPV)
JXS = (RTP, NBL)
TCX = (KQT, MTH)
TGH = (DFR, GLK)
JHD = (RKD, FXP)
MDC = (VFR, SHR)
XGR = (BXB, TCX)
RJR = (CTN, DRK)
LKN = (BRN, GXH)
DFF = (KVT, MHD)
GDF = (VKJ, QDK)
PSF = (LDL, NSQ)
HPC = (SND, MKT)
CRN = (PJV, TBN)
KMT = (KCK, QJD)
QTF = (KJL, GDF)
XQM = (XQS, STF)
TKH = (MNM, TVV)
KGQ = (CVL, RND)
GBT = (PFS, KKF)
DTK = (BJH, DFB)
TDD = (DKD, DSC)
BXB = (MTH, KQT)
DCR = (HVV, JNV)
VLH = (LJF, LJF)
GLM = (BVB, FFD)
CCV = (BFN, RPB)
MBX = (RJS, FLC)
CMS = (QLS, XGR)
XMJ = (TTT, XNP)
JGF = (MTJ, HGM)
VDG = (GXS, BNJ)
LFN = (DFR, GLK)
TDX = (MQR, MQR)
PMT = (KVT, MHD)
PKR = (BJQ, STR)
XDL = (KQJ, SPS)
XKM = (MLQ, STS)
XGJ = (PQC, QCT)
MLM = (BVG, SMR)
PJD = (JBM, JSB)
GVC = (MDC, HSQ)
NVS = (JJN, LGC)
RLX = (HCM, DGT)
BVD = (CDR, RLX)
RNP = (NNM, LFH)
TNT = (PVH, XNQ)
KJP = (XPM, QRP)
NMQ = (QJJ, FNN)
XQD = (CVX, GBT)
SMN = (NGF, JTQ)
DLR = (BFN, RPB)
MQR = (MVD, MVD)
NHP = (DJB, MBX)
DBD = (QLT, TTC)
DJM = (FDG, XXC)
CNR = (JXS, JRJ)
VVC = (RHP, VFJ)
BJQ = (NQK, KFR)
HHM = (JPN, HQB)
NQH = (HLC, XSD)
QHF = (GPM, FHL)
BSJ = (QBR, DCV)
JQX = (SLR, JBK)
XPM = (JTL, CMS)
CJK = (FFK, JVQ)
VVX = (CLG, XLF)
HMS = (VPK, KMT)
VKJ = (BCP, JNX)
LXX = (JSX, HKL)
CRS = (FHT, LQL)
FXJ = (TDH, JGF)
FHG = (SBM, BHV)
HPJ = (KTG, TTD)
VKQ = (JNV, HVV)
KNG = (LSH, KTF)
SND = (RGP, CQR)
RKJ = (SCB, FDN)
DKD = (GXD, PLD)

View file

@ -0,0 +1,200 @@
8 7 3 3 21 91 297 830 2098 4940 11041 23745 49682 102071 207392 418543 839856 1672689 3294947 6393907 12179007
14 16 21 48 126 306 696 1534 3320 7031 14440 28549 54126 98307 171187 286281 460690 714762 1070999 1551934 2176694
16 25 28 16 -15 -58 -95 -93 27 484 1843 5395 13786 31983 68678 138244 263370 478515 834334 1403242 2286295
11 14 21 40 76 125 170 186 176 285 1081 4181 13601 38634 99880 241509 555257 1225456 2610109 5381286 10759714
14 22 47 116 268 548 997 1638 2458 3386 4267 4832 4664 3160 -511 -7454 -19098 -37250 -64153 -102548 -155740
16 17 29 64 133 246 412 639 934 1303 1751 2282 2899 3604 4398 5281 6252 7309 8449 9668 10961
7 17 44 98 194 359 639 1106 1865 3061 4886 7586 11468 16907 24353 34338 47483 64505 86224 113570 147590
23 34 41 50 76 155 375 943 2318 5456 12232 26126 53285 104101 195476 353979 620137 1054142 1743299 2811586 4431746
9 19 33 48 60 64 54 23 -37 -135 -281 -486 -762 -1122 -1580 -2151 -2851 -3697 -4707 -5900 -7296
12 15 21 49 138 352 778 1528 2774 4870 8652 16072 31448 63860 131720 271603 555820 1128761 2284679 4637247 9488786
15 34 61 103 183 355 725 1476 2893 5379 9445 15646 24421 35778 48745 60485 64947 50896 -867 -121319 -358325
11 13 20 35 61 101 158 235 335 461 616 803 1025 1285 1586 1931 2323 2765 3260 3811 4421
0 -2 -5 -17 -38 -48 -1 167 503 959 1256 680 -2193 -9841 -26210 -57218 -111414 -200940 -343079 -562875 -897600
-2 -6 -12 -25 -52 -102 -186 -317 -510 -782 -1152 -1641 -2272 -3070 -4062 -5277 -6746 -8502 -10580 -13017 -15852
6 0 -1 16 72 200 451 902 1666 2904 4839 7772 12100 18336 27131 39298 55838 77968 107151 145128 193952
-1 13 48 114 226 408 697 1147 1833 2855 4342 6456 9396 13402 18759 25801 34915 46545 61196 79438 101910
-4 3 27 79 170 311 513 787 1144 1595 2151 2823 3622 4559 5645 6891 8308 9907 11699 13695 15906
9 19 32 53 107 254 601 1321 2710 5338 10383 20301 40144 80237 161864 329686 678973 1414585 2976164 6297977 13336423
8 22 43 82 162 319 607 1119 2058 3925 7937 16861 36593 79128 168277 351007 720344 1461600 2944167 5899128 11752624
17 29 41 46 36 5 -43 -65 107 970 3771 11324 29582 70700 159050 342953 717151 1464954 2936061 5789659 11260094
7 23 51 94 156 247 388 616 989 1591 2537 3978 6106 9159 13426 19252 27043 37271 50479 67286 88392
1 4 8 4 -8 -7 56 271 823 2164 5463 13660 33772 81706 191968 436790 963244 2064587 4316461 8834963 17760843
-2 14 52 132 296 630 1296 2586 5019 9512 17674 32314 58355 104578 187128 336789 614256 1142126 2171220 4215984 8325814
2 -1 -4 -3 9 54 198 605 1629 3960 8841 18376 35962 66913 119417 206098 346668 572477 934234 1514815 2449935
17 25 30 32 31 27 20 10 -3 -19 -38 -60 -85 -113 -144 -178 -215 -255 -298 -344 -393
17 15 24 59 139 293 571 1074 2038 4043 8487 18611 41665 93398 207137 451589 964595 2015027 4112774 8198631 15963739
-5 -10 -15 -20 -25 -30 -35 -40 -45 -50 -55 -60 -65 -70 -75 -80 -85 -90 -95 -100 -105
0 6 15 27 57 159 457 1178 2682 5484 10263 17853 29211 45357 67281 95812 131444 174114 222927 275823 329181
3 7 23 67 176 423 932 1893 3577 6351 10693 17207 26638 39887 58026 82313 114207 155383 207747 273451 354908
7 13 26 68 179 417 852 1563 2672 4498 8012 15971 35500 83659 199038 465377 1058965 2342607 5049574 10638354 21964697
10 2 -11 -18 14 151 515 1330 3002 6244 12257 22978 41406 72017 121279 198278 315466 489542 742477 1102694 1606414
2 10 37 91 192 384 748 1417 2593 4566 7744 12734 20595 33578 57103 104632 208868 445946 984871 2183653 4768098
20 36 50 68 104 178 314 538 876 1352 1986 2792 3776 4934 6250 7694 9220 10764 12242 13548 14552
13 12 8 6 14 43 107 223 411 694 1098 1652 2388 3341 4549 6053 7897 10128 12796 15954 19658
-2 9 27 56 115 251 564 1261 2764 5910 12300 24889 49004 94255 178538 337047 642862 1252940 2507292 5135812 10678959
9 4 7 27 82 207 459 930 1786 3365 6412 12643 26076 56039 123595 274489 603851 1301070 2727841 5548807 10942978
3 2 -2 -9 -23 -54 -119 -238 -401 -453 196 3193 12476 36657 93621 219447 485691 1032538 2131441 4301698 8525093
19 30 52 106 217 425 820 1612 3256 6669 13610 27367 54059 105227 203167 392014 760501 1487468 2929844 5786716 11394577
15 24 36 49 72 146 393 1105 2880 6800 14621 28900 52911 90092 142608 208400 275805 314464 260770 -4469 -689182
1 13 39 81 151 290 597 1271 2669 5383 10339 18921 33123 55732 90545 142623 218585 326945 478495 686737 968367
19 48 88 142 224 360 597 1029 1847 3425 6469 12293 23382 44650 86410 171474 351819 746370 1623174 3570632 7839828
28 57 105 180 291 448 662 946 1334 1958 3258 6465 14622 34626 81107 183410 397508 825395 1645623 3160830 5872881
8 15 40 107 265 598 1235 2360 4222 7145 11538 17905 26855 39112 55525 77078 104900 140275 184652 239655 307093
7 11 24 55 113 207 346 539 795 1123 1532 2031 2629 3335 4158 5107 6191 7419 8800 10343 12057
8 14 43 120 289 619 1205 2169 3674 5967 9461 14850 23242 36356 57112 91749 156464 295332 623251 1419764 3319523
13 35 65 116 224 470 1017 2168 4460 8837 17020 32355 61725 119626 236310 473083 949519 1889631 3697059 7073238 13197454
-1 -5 -12 -22 -35 -51 -70 -92 -117 -145 -176 -210 -247 -287 -330 -376 -425 -477 -532 -590 -651
9 4 9 40 119 274 539 954 1565 2424 3589 5124 7099 9590 12679 16454 21009 26444 32865 40384 49119
20 38 74 139 244 400 618 909 1284 1754 2330 3023 3844 4804 5914 7185 8628 10254 12074 14099 16340
7 20 53 120 244 456 798 1330 2150 3456 5702 9912 18205 34557 65835 123315 225497 404488 721211 1300196 2404090
17 29 42 63 98 158 280 570 1289 3029 7064 16011 34998 73610 148970 290410 546297 993701 1751726 2999471 4999746
-2 -4 -4 -2 10 62 222 618 1482 3258 6871 14369 30377 65224 141353 305913 654622 1375755 2829859 5693690 11223106
-4 -4 16 78 225 541 1173 2350 4391 7689 12665 19733 29446 43260 65828 110503 210886 442914 964270 2080952 4354815
26 40 56 80 121 184 256 296 256 178 435 2217 8413 25116 64091 146709 310078 616412 1167090 2123390 3736561
11 20 34 63 134 300 663 1419 2928 5815 11127 20609 37227 66198 117118 208669 379720 716425 1418415 2956810 6438303
25 43 74 130 238 448 850 1610 3031 5637 10273 18231 31500 53510 91433 162689 311687 649692 1444052 3307963 7586800
12 33 66 113 174 247 328 411 488 549 582 573 506 363 124 -233 -732 -1399 -2262 -3351 -4698
11 18 35 84 204 460 959 1871 3453 6087 10395 17637 30928 58504 121666 272821 634630 1482571 3416169 7710686 17034753
-1 7 32 87 184 331 536 831 1334 2373 4716 10007 21631 46461 98326 204639 418505 839867 1650928 3173303 5957210
25 43 77 134 224 368 610 1033 1779 3073 5251 8792 14354 22814 35312 53299 78589 113415 160489 223066 305012
2 1 10 50 157 378 777 1465 2668 4847 8884 16348 29855 53536 93627 159195 263014 422605 661454 1010422 1509361
14 19 23 35 86 236 583 1284 2599 4975 9220 16915 31441 60475 121736 255471 550180 1193159 2565693 5415679 11160144
10 15 31 83 212 474 937 1678 2782 4345 6483 9349 13160 18236 25053 34312 47026 64627 89095 123111 170236
8 15 33 87 228 547 1195 2409 4543 8106 13816 22690 36205 56584 87284 133790 204850 314321 483835 746537 1152194
10 21 24 19 22 72 244 684 1698 3955 8920 19743 43040 92413 195393 407212 838266 1708765 3456172 6942059 13839906
13 21 41 98 236 521 1050 1973 3534 6150 10589 18394 32845 60970 117424 231467 458803 900707 1733681 3253858 5941530
7 15 30 61 112 183 272 369 433 363 29 -452 239 7205 35514 123890 363303 953775 2312372 5270455 11421086
12 29 60 105 164 237 324 425 540 669 812 969 1140 1325 1524 1737 1964 2205 2460 2729 3012
-5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 -19 -20 -21 -22 -23 -24 -25
10 13 12 15 39 110 263 542 1000 1699 2710 4113 5997 8460 11609 15560 20438 26377 33520 42019 52035
8 12 33 75 140 233 365 558 861 1399 2506 5042 11071 25209 57205 126827 273118 571922 1168779 2339573 4599646
6 10 24 72 186 408 807 1528 2900 5641 11216 22444 44540 86968 166870 315640 591906 1107760 2082476 3952728 7596590
6 12 30 73 157 307 570 1036 1869 3353 5960 10437 17863 29502 46004 64975 74988 42506 -114398 -575675 -1708563
10 34 68 112 166 230 304 388 482 586 700 824 958 1102 1256 1420 1594 1778 1972 2176 2390
7 18 31 56 113 228 437 815 1548 3062 6214 12536 24504 45780 81346 137415 220965 338698 495177 689840 912531
6 11 29 61 119 256 621 1549 3696 8229 17081 33281 61369 107906 182089 296481 467866 718239 1075941 1576949 2266331
13 22 36 63 120 251 559 1257 2758 5853 12073 24403 48623 95706 185922 355599 667899 1229504 2215802 3908047 6747074
6 11 19 41 95 222 520 1198 2654 5591 11220 21698 41186 78410 152561 306090 630970 1320243 2765809 5739355 11720997
2 12 43 108 230 459 898 1735 3277 5981 10476 17569 28227 43526 64557 92278 127300 169594 218105 270258 321340
9 21 57 121 221 387 693 1291 2475 4800 9285 17730 33175 60524 107349 184878 309157 502359 794193 1223343 1838841
5 1 -7 -13 1 82 337 978 2381 5159 10249 19013 33353 55840 89857 139756 211029 310493 446489 629095 870353
11 19 38 93 234 557 1236 2571 5075 9668 18140 34213 65797 129413 258251 515930 1018695 1969461 3707702 6779553 12032472
13 35 74 140 251 433 720 1154 1785 2671 3878 5480 7559 10205 13516 17598 22565 28539 35650 44036 53843
-7 -8 8 59 170 389 815 1638 3191 6014 10930 19133 32288 52643 83153 127616 190821 278708 398540 559087 770822
11 28 66 147 306 600 1121 2013 3493 5876 9604 15279 23700 35904 53211 77273 110127 154252 212630 288811 386982
23 37 54 71 83 83 62 9 -89 -247 -482 -813 -1261 -1849 -2602 -3547 -4713 -6131 -7834 -9857 -12237
13 26 40 72 151 310 570 913 1253 1433 1301 953 1298 5269 20441 64850 180015 459521 1109694 2573981 5780871
11 29 49 71 101 152 246 425 781 1513 3007 5910 11144 19834 33333 54166 90210 167439 362022 871617 2159474
3 2 8 44 158 434 1014 2151 4316 8395 16056 30479 57884 110755 214490 420659 832557 1653032 3271856 6422098 12454958
20 31 42 53 64 75 86 97 108 119 130 141 152 163 174 185 196 207 218 229 240
-1 4 23 68 158 324 620 1156 2178 4243 8602 18065 38975 85620 189701 419688 918489 1973410 4140609 8457982 16796612
18 37 66 118 223 441 875 1696 3208 6009 11370 22112 44618 93376 200976 439412 963937 2100368 4513605 9524129 19688464
16 21 41 96 222 479 959 1794 3164 5305 8517 13172 19722 28707 40763 56630 77160 103325 136225 177096 227318
-6 2 26 84 210 460 929 1789 3358 6210 11336 20366 35862 61692 103495 169247 269938 420370 640086 954440 1395818
7 27 56 89 133 220 426 903 1931 3997 7908 14945 27065 47158 79366 129471 205359 317567 479920 710265 1031309
1 -1 9 41 116 274 584 1162 2216 4171 7988 15884 32789 69044 145053 298853 597859 1156375 2160835 3905147 6838954
0 -3 1 31 114 281 562 976 1507 2052 2322 1672 -1169 -8502 -24235 -54677 -109598 -203609 -357921 -602547 -979016
15 31 59 111 203 357 615 1074 1963 3808 7774 16345 34636 72912 151519 310814 631553 1276860 2577662 5203507 10497645
16 26 41 68 114 186 291 436 628 874 1181 1556 2006 2538 3159 3876 4696 5626 6673 7844 9146
16 21 26 44 99 237 545 1178 2390 4567 8277 14406 24596 42557 77600 153293 327117 732628 1666477 3764163 8352022
-5 -4 7 45 149 404 988 2256 4880 10069 19898 37780 69120 122195 209309 348277 564297 892274 1379665 2089919 3106591
21 31 41 51 61 71 81 91 101 111 121 131 141 151 161 171 181 191 201 211 221
16 34 69 123 196 289 407 562 776 1084 1537 2205 3180 4579 6547 9260 12928 17798 24157 32335 42708
8 22 46 93 182 331 558 897 1445 2490 4842 10612 24871 58885 135976 301516 639134 1295918 2520238 4716815 8524828
12 13 10 11 45 172 493 1160 2386 4455 7732 12673 19835 29886 43615 61942 85928 116785 155886 204775 265177
6 22 50 95 167 276 437 704 1253 2536 5533 12143 25792 52433 102381 194174 363632 686126 1330952 2689399 5662421
4 4 0 -7 -16 -26 -36 -45 -52 -56 -56 -51 -40 -22 4 39 84 140 208 289 384
13 17 25 57 150 372 847 1791 3559 6703 12041 20737 34392 55146 85791 129895 191937 277453 393193 547289 749434
1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61
9 7 7 23 87 260 660 1516 3257 6645 12961 24253 43655 75786 127238 207162 327961 506099 763035 1126291 1630663
8 9 25 79 208 475 999 2016 3985 7745 14720 27180 48631 84573 144192 244113 416222 722865 1284563 2327869 4264274
9 11 28 79 199 453 967 1992 4024 8028 15868 31141 60782 118137 228910 442944 858083 1668933 3265728 6430635 12716521
18 40 74 122 184 258 340 424 502 564 598 590 524 382 144 -212 -710 -1376 -2238 -3326 -4672
9 9 18 56 161 400 881 1775 3378 6279 11770 22785 45981 96237 206097 444874 955731 2024641 4203378 8520350 16828917
1 12 28 57 131 325 788 1793 3822 7732 15114 29074 55848 107927 209728 407318 784295 1486668 2760472 5006919 8861137
3 19 49 99 175 283 429 619 859 1155 1513 1939 2439 3019 3685 4443 5299 6259 7329 8515 9823
17 34 61 103 179 329 624 1193 2297 4503 9041 18464 37775 76236 150132 286828 530529 950232 1650445 2785341 4577115
4 17 40 71 107 144 177 200 206 187 134 37 -115 -334 -633 -1026 -1528 -2155 -2924 -3853 -4961
14 29 55 109 231 503 1087 2306 4813 9922 20212 40560 79812 153362 286978 522291 924448 1592523 2673381 4379799 7013765
8 24 47 75 107 152 242 445 874 1688 3081 5255 8373 12488 17444 22745 27388 29656 26867 15075 -11281
17 21 20 14 3 -13 -34 -60 -91 -127 -168 -214 -265 -321 -382 -448 -519 -595 -676 -762 -853
10 33 71 131 222 361 592 1018 1853 3523 6888 13722 27670 56001 112635 223286 434488 830477 1566685 2938113 5518450
-6 -7 -7 6 59 206 553 1297 2772 5490 10168 17746 29427 46807 72208 109375 164742 249503 382731 595758 937947
3 3 18 77 225 522 1055 1973 3550 6276 10971 18912 31958 52653 84282 130850 196949 287473 407136 559743 747159
13 19 48 121 273 561 1074 1956 3461 6075 10772 19537 36435 69826 136994 273780 554374 1131454 2316989 4744788 9698474
1 1 10 41 107 221 396 645 981 1417 1966 2641 3455 4421 5552 6861 8361 10065 11986 14137 16531
11 23 46 91 179 337 604 1061 1899 3539 6818 13255 25411 47357 85264 148129 248651 404271 638390 981779 1474195
4 0 11 58 169 382 758 1416 2611 4886 9347 18157 35457 69149 134379 260204 501882 962544 1829727 3434368 6342333
28 53 90 136 196 305 566 1212 2714 5995 12880 27020 55683 113027 225801 442938 851340 1601513 2948890 5320104 9418714
15 14 5 -5 7 91 338 899 2020 4112 7884 14585 26440 47438 84747 151194 269445 478718 844999 1475707 2539421
0 7 29 86 221 517 1134 2377 4812 9477 18319 35179 68037 133987 269858 554126 1150832 2395419 4958601 10152004 20484933
17 37 81 166 329 646 1259 2423 4605 8708 16571 32034 63095 126099 253623 508987 1012497 1988167 3845573 7320774 13714389
8 19 28 38 52 67 81 128 356 1163 3406 8698 19808 41179 79579 144900 251120 417443 669632 1041550 1576924
14 20 28 48 109 274 663 1493 3157 6389 12607 24620 48088 94545 187629 375758 757456 1530898 3088682 6194964 12308847
1 12 37 80 146 252 449 864 1789 3885 8643 19368 43163 94761 203714 427619 876109 1753874 3437021 6607308 12485900
29 45 68 115 210 376 637 1051 1804 3406 7043 15154 32319 66563 131202 247380 447471 779547 1313142 2146573 3416112
9 31 64 108 163 229 306 394 493 603 724 856 999 1153 1318 1494 1681 1879 2088 2308 2539
-1 -2 7 39 116 288 662 1441 2973 5810 10777 19051 32250 52532 82704 126341 187915 272934 388091 541423 742480
-2 13 55 134 270 516 1004 2032 4225 8833 18293 37316 75017 149069 293682 574677 1117608 2159875 4147202 7912909 15013186
22 34 46 58 70 82 94 106 118 130 142 154 166 178 190 202 214 226 238 250 262
-6 -4 14 53 110 171 213 227 293 754 2546 7735 20291 47127 99546 195687 365787 664983 1204769 2227592 4275927
10 22 44 83 162 328 660 1277 2346 4090 6796 10823 16610 24684 35668 50289 69386 93918 124972 163771 211682
0 7 28 83 197 401 753 1396 2671 5308 10741 21657 43028 84133 162497 311269 592260 1117427 2081504 3806821 6796649
5 23 51 97 187 368 718 1369 2542 4579 7931 13011 19731 26400 27477 9528 -55129 -216609 -553905 -1168495 -2137857
3 17 47 92 144 200 288 515 1151 2775 6536 14634 31214 64002 127209 246501 467195 867309 1577685 2812136 4911460
17 33 62 117 228 451 878 1651 2983 5186 8701 14119 22176 33700 49485 70067 95381 124287 153968 179225 191724
21 40 87 186 381 757 1477 2849 5445 10302 19243 35364 63741 112419 193753 326179 536501 862788 1357983 2094334 3168765
-5 9 33 73 147 287 541 975 1675 2749 4329 6573 9667 13827 19301 26371 35355 46609 60529 77553 98163
-1 3 8 14 21 29 38 48 59 71 84 98 113 129 146 164 183 203 224 246 269
-9 -13 -17 -21 -25 -29 -33 -37 -41 -45 -49 -53 -57 -61 -65 -69 -73 -77 -81 -85 -89
12 24 45 66 73 47 -36 -205 -494 -942 -1593 -2496 -3705 -5279 -7282 -9783 -12856 -16580 -21039 -26322 -32523
1 -7 -5 36 159 421 893 1660 2821 4489 6791 9868 13875 18981 25369 33236 42793 54265 67891 83924 102631
8 7 4 8 29 68 100 56 -170 -628 -1012 82 6803 29505 91748 243988 589428 1331125 2854868 5870172 11642713
17 18 23 47 113 249 494 924 1717 3308 6769 14741 33640 78604 183971 424370 955538 2091410 4448557 9218722 18691990
5 4 8 34 114 300 681 1424 2849 5541 10489 19228 33968 57793 95374 155649 260420 468619 939039 2083089 4921517
23 32 41 50 59 68 77 86 95 104 113 122 131 140 149 158 167 176 185 194 203
18 29 43 78 174 406 903 1887 3762 7299 13986 26658 50616 95620 179442 334143 616954 1128665 2043837 3659038 6467762
-1 -2 -4 -10 -25 -49 -50 96 712 2493 6774 15938 34032 67690 127502 230018 400637 677704 1118224 1805702 2860733
30 53 98 179 310 505 778 1143 1614 2205 2930 3803 4838 6049 7450 9055 10878 12933 15234 17795 20630
-6 1 16 39 70 109 156 211 274 345 424 511 606 709 820 939 1066 1201 1344 1495 1654
21 33 60 121 242 467 886 1691 3276 6413 12566 24444 46936 88635 164356 299737 541051 978609 1804192 3448255 6892074
-3 -4 9 48 125 252 441 704 1053 1500 2057 2736 3549 4508 5625 6912 8381 10044 11913 14000 16317
8 15 34 71 135 237 399 688 1298 2711 5978 13177 28139 57625 113400 216356 405565 759024 1440935 2806156 5621716
3 15 37 69 106 146 202 329 690 1697 4271 10262 23045 48246 94434 173418 299485 486475 740977 1049107 1353252
1 7 36 103 221 408 711 1256 2336 4552 9025 17700 33766 62219 110598 189927 315899 510341 803002 1233709 1854939
13 18 34 82 204 485 1085 2291 4605 8896 16685 30741 56399 104441 197111 380060 745214 1473958 2919643 5770066 11378567
-1 7 33 88 184 337 572 930 1477 2315 3595 5532 8422 12661 18766 27398 39387 55759 77765 106912 144996
9 32 63 110 187 309 499 825 1495 3056 6768 15258 33629 71393 146114 290861 570109 1113560 2185909 4324846 8602263
-3 2 12 20 20 24 96 408 1333 3623 8803 20083 44397 96680 208275 442589 923203 1883614 3756016 7334016 14080712
-6 0 23 69 157 346 775 1711 3604 7156 13424 24001 41374 69698 116584 197405 345861 639891 1264259 2657809 5848656
7 15 37 79 147 247 385 567 799 1087 1437 1855 2347 2919 3577 4327 5175 6127 7189 8367 9667
1 0 4 17 43 86 150 239 357 508 696 925 1199 1522 1898 2331 2825 3384 4012 4713 5491
-2 -6 -12 -6 50 232 675 1610 3446 6958 13696 26824 52751 104146 205271 401145 773292 1467962 2750914 5123462 9583214
11 11 17 40 90 185 369 741 1505 3066 6234 12683 25980 53804 112527 236373 495423 1030789 2123107 4325038 8714342
7 19 48 109 220 399 659 1013 1513 2365 4191 8554 18935 42494 93286 198454 410975 837155 1696738 3452459 7081034
5 18 36 63 105 178 331 701 1633 3929 9347 21570 48036 103327 215391 436977 866793 1688972 3247154 6183973 11703543
23 38 59 94 157 283 552 1114 2215 4242 7831 14109 25153 44717 79156 138197 234679 381486 582475 812064 975061
13 38 76 140 251 440 764 1351 2491 4801 9525 19099 38231 75933 149213 289508 553433 1040056 1917706 3464302 6126379
17 18 21 29 51 116 287 668 1399 2636 4524 7227 11263 18867 38171 94179 254740 687497 1777538 4358940 10152174
5 19 55 143 328 670 1244 2140 3463 5333 7885 11269 15650 21208 28138 36650 46969 59335 74003 91243 111340
11 14 21 45 127 354 896 2089 4618 9910 20957 43989 91754 189694 387102 776485 1525933 2931406 5498613 10067693 17998353
10 13 23 61 165 403 890 1814 3498 6572 12411 24122 48545 99980 206674 421509 838834 1619991 3030807 5495171 9669797
21 38 66 120 239 497 1029 2084 4116 7933 14958 27744 51079 94401 176942 338209 658323 1295676 2553710 4994836 9628155
13 31 59 105 195 382 764 1527 3044 6080 12171 24251 47575 90898 167681 296760 501387 804793 1219407 1725593 2234279
-7 -2 16 46 79 92 51 -53 -91 465 3056 10949 30743 74717 164331 335260 644417 1179504 2071720 3512352 5774079
28 50 93 177 335 620 1126 2032 3681 6715 12309 22597 41496 76396 141789 267250 514978 1017580 2056897 4222417 8717573
4 17 33 47 49 25 -40 -157 -326 -527 -709 -777 -577 121 1642 4427 9056 16273 27013 42431 63933
7 11 23 52 116 252 534 1111 2298 4785 10069 21272 44621 92112 186392 369873 721825 1390063 2648339 4997292 9336554
2 4 9 29 91 243 572 1253 2658 5564 11509 23355 46127 88207 162972 290975 502778 842556 1372601 2178865 3377691
19 28 43 83 186 425 932 1938 3857 7477 14373 27727 53828 104630 201866 383348 712223 1290098 2275087 3905963 6533710
10 8 4 14 77 263 688 1540 3115 5867 10508 18275 31653 56195 104783 207024 428953 912587 1952373 4138229 8616090
21 29 44 83 185 422 910 1828 3470 6393 11794 22362 44018 89188 182562 370687 737235 1426389 2677512 4875117 8619151
21 31 47 88 193 432 925 1892 3767 7411 14450 27741 51929 93998 163636 273125 436329 666183 969881 1340718 1745257
15 13 2 -11 7 129 482 1261 2743 5301 9418 15701 24895 37897 55770 79757 111295 152029 203826 268789 349271
-8 -11 -14 -17 -20 -23 -26 -29 -32 -35 -38 -41 -44 -47 -50 -53 -56 -59 -62 -65 -68
18 28 36 48 72 122 228 449 886 1692 3076 5298 8652 13434 19892 28155 38138 49420 61092 71572 78384
14 23 47 104 221 446 873 1686 3232 6142 11533 21353 39008 70604 127566 232240 429598 810693 1557495 3024738 5883107
16 29 52 81 108 121 105 56 45 420 2321 8809 27076 72420 174990 390905 820690 1641111 3163610 5947757 11028712
21 29 40 58 84 112 134 159 245 535 1281 2841 5664 10389 18477 34425 71752 166672 405377 971947 2221091
-6 -14 -27 -33 -7 89 306 708 1372 2388 3859 5901 8643 12227 16808 22554 29646 38278 48657 61003 75549

View file

@ -0,0 +1,140 @@
|-L.FL-FJFL.|7FJ7F|F7-7F77.FL7---.7FF77--.|-F|FF--7FF7F-7F--77FFFJFJF7.F-LF7LFJJ.F|.|77F7F---7FLL.|FFJ.FF7-77..F77.-F-7FL-FF|77F-FFLL-FJ-|.J
|7JF77-|L7J-F-JJL7|-|LJLF-|7.|.LLLJ7|-7.LFJFF--JF7L7|||FJ|F-J77L|F7.L-FJF----L7.FF.FJ-J-L-7|L|LJ7FJJJ.F|L-7L7.FF-|-7F-|J..||LJ-|-J-.|L|J|LF|
LJ-LL|F7|LL7LLL-|-F7||..||..FJ.FJJF-7JJ|.7JLL--7|L7LJLJ|FJL-77|..FFJ7FJ7L7-|-JL.F--7LJJ|LJJ.F-|L7.FF-L7-F-7F77|J7||FLFJ|FFLL7.|JFJJ--J|.7-7|
|.FJ.|F7-7L77|||L7JL-7LF777-JJ.|7F-L7JFJ7|F-|.LLJ|L---7||F--J7JFLF|JF-.--7||J.|F-.7LLLFF7||7F777L7FJ-||LJ7|||F|L-7.JJ.||7||J7.|-LL.7J.F7L7--
F-7LF||.FLJL-7|FF|L7FL-L||F-7|FL7LJ|L7L|.LLJ|FJJLF---7|||L---7L7|L|7||FLFLJ|-FF-7|777FJ7|-FFJ|L77LL-F.JJJL7LLJ.|L7FJFF-77LF-7-|-|77L|7.L--7|
F-JF-L7--J|JLL7-|LJ|F|J7L|J.J-|F7J7F|JF-7.|LF7F77L--7||LJF---JL-JJ|LJ7FJL7L|JLFJF|7FF7.-JJFL7|-F77J-777JF|L7J.|--L|J7|7LJ7JFJJ..|-J--7.L7.FJ
L7J|7||J--L-F7.||LFL-JF7.F7.|.FL7.FF7L|7F|FF-7F-7F7FJLJF7L----7JFFJJ.J|7L|7L7JLL|JFFJ7.|.|F-J|FJL7|F7-|F7JF|FF.|.||7L-J7LF-||.L7J7L7FJ7.L-.|
L7.L-FJJJF|FJ-.|JF--J7FJ7LLJ-..LJF||L-7F-7-L7|L7|||L--7|L-----J-FF-F7FL77|---F7JLL-|JF-77FL-7LJF-JFJ|-|-7-7L-7-7-JLJ-|L7-JJLF7-J-7|L77JFJJ.|
LL-|FJL7.L|J7|-L7F.|FL-.FJJ.F-F-F-7L-7LJFJ|F|L-JLJL7F7|L----7|.F7F7F7JJ-L--|JJ7|-7-LF|FJF7J|L-7||FJFJ.LLJ.77||.L.LF7LF-F77F-J.F7-J7L-F7FJF-.
FJ.|J7L77-7LL7J-7---FJ-FL---|||FJFJLLL-7|F7FL-----7||||F--7FJ-FJ||LJ||..LF7|JL--F||.FJL7||LF-7|L7|FJF7-.F-LJ.-7.F7.77F7||7-|L7LJJJFJ.FJJF-L.
|.F|F7-.|.JJ.L..L|JL7..FJL|FF-7L7L-7F--JLJ|7LF7F--JLJLJ|F7LJJFL7||F-J--J7|7..F|-FL|FL7FJ|L7L7LJFJ|L7||7F|J|L7.F7F77.FJ||L--7--7|7.L-7L-77J|7
LF-LL.L7J.FF-.F-||--.|-|-F--|FJ7L-7|L--7F7|F-J||F7F---7|||F7LFFJLJL7JL|.FF-77FF7JJF77|||L7L-JF-JLL7||L7F7|F-|.||||LFL7||F7FJ-LJ-77J-J7.LJF7J
FF.|..7JJ7FLJ7|L-7F|F|.|7LLL|L7F--JL7F7||LJL7FJLJLJLF7|||LJL7FJF---J-|F77|JL7L|||FJL-JL-7L--7L7F7FJ|L7||L7L-F-J|||F7F||||LJ7LLJ.7JFFLF-L7LJ-
L.FJ-|77--F||F77JJLF-7-J7F7LL7||F--7||LJL7|FJL-7F--7|||LJF--JL7|F-7JF--F7|.L7.|L7L----7FJF7FJFJ||L7|FJ||FJ77L-7LJ||L-JLJL7-|..-.|F7--77LJ-|J
F|.L7||--FLJ7.L7F-J|FJJFF7FF7||LJF7||L7F7L7L7F-JL-7||||F-JLF-7|LJFJ7JFLF--77L-L7|7FF-7|L7||L7L7||FJ|L7LJ|F7F-7|F-JL--7F--J7F|J-F|7|LLJL7JF|.
J|LF|FJFFL.|F7LLJ|.|L7F7||FJLJL--JLJL7LJL7L7|L--7FJLJLJ|LF-JFJ|F-JF7.|.L7FJF7JFJL7FJFJ|FJ||7L7||LJFJ7L7FJ||L7|||F-7F7||F7LLJJ7.FJ.F77JF|F7|F
||JFJ|F|J|7|JJL|-7-L7LJ|||L-7F7F--7F7L7F7L7LJF--JL--7F7L7|F-JFJL-7||-F-7||FJL7L7FJL7L-JL7||F-JLJF-JLF-JL-J|FJLJLJFJ|LJLJ|7J.F|7LJL|--7FJF|||
L7--.LLJJ--|.FFJF-7-L-7||L-7LJ||F7LJL7LJL7L-7L-7F7F-J|L7LJL77L7F-J|L7L7|||L-7|FJL7FJF-7FJ||L-7F7|F7JL7F7F-JL--7F-J|L--7FJF77J|F|JLL7FLFLLJ|F
.JLLF77.L-.|.LJ-7||FF-J||F-JF7LJ|L--7L-7FJF7|F-J||L--JLL-7FJF7||F7L7|FJ||L7FJLJF-JL-J||L7|L-7LJ|||L7FJ|||JF7F-J|F--7F-JL-JL7F---7JJ|F-JJ7LL-
7-F7|FLJ7|7L-|.FJFL-L-7||L7FJL7LL-7FJF7|L-JLJL-7|L7F-7F7FJ|FJLJLJL7||L7||FJL-7FJF7F7F7|FJ|F-JF7|||FJ|FJLJFJ|L-7||F-JL--7F-7LJF--JJ7||||.7F|.
L7LL|J|FFJ7FL7.FFJFFF-JLJFJL7FJF7FJ|FJ||F7F---7||FJL7||||FJ|F-7F7FJ||FJLJL7FFJL-J||LJLJL7|L-7||||||L||F7FJFJF-JLJ|F7F7FJL7L7FJF7.F7J-FF.FL-7
LJ.LL7-J-JL|F|F---7FJF7F7L-7|L7|LJFJL7|LJLJF7FJLJL-7|LJ|||L||7LJLJJ|||F---JFJF---JL---7FJ|F-J|LJ||L7||||L7||L---7LJ|||L7FJ-|L-JL-J|.F-JFF.L7
FJF|.L--L|-FLFL--7|L7||||F-J|FJL-7L7FJ|7F--JLJF----JL-7LJL7|L---7F7|LJL-7F7|FJF-7F-7F7|L7|L-7L7FJ|FJ|||L7|L7-F-7L-7LJL-JL-7L--7F--J.|.7JL|L|
F-|77FJLFFJ|J.|F7|L7LJLJ||F-JL7F7L7|L7L7L----7L----7F7L-7FJ|F---J||L---7||LJL7L7|L7|||L7||F-JFJL-J|FJ||FJ|FJFJFJF7|F---7F7L7.LLJJJ.--7J.F777
|..77-L-7-.LF7FJLJFJ7FF-J|L--7||L7||FJFJF7F7L|F---7|||F7|L7|L--7FJL7F7FJ||F7FJFJ|FJLJL7|||L7FJF7F-JL7LJL7|L-JFJFJLJ|F7F|||FJ-LJ|LLL.J|F-F.|.
-7-LL|7FJ7L-|-|F-7L--7L-7|F7L|||FJ||L7|F|||L7||JF7LJ|LJ|L7||F--JL7FJ||L7|||LJL|FJL---7||||FJ|FJLJF--JF--J|F--JFJF--J|L7|||L7JFFF7L|7.L|F77J7
F|7J.-J-LL7L-JLJ7L7F-JF-JLJL-JLJ|FJL7|L7||L7LJL7||F7L-7L7|||L-7F7|L7|L7|||L---JL7F-7FJ||LJL-J|FF7L-7FJ|F-JL7F7L7L7F7|FJLJL-J-F-7.F|F7JL-JFFF
FLF.LLL7|.|-7.F7F7||F7L-------7FJL7FJL7|||LL7F-J|||L--JFJ|||F-J|||FJL7||LJF-----JL7||FJ|F---7L-J|F7||F7L--7|||.|FJ|LJ|F7.F7|7L7L7-J|FJL|LLJJ
LJ.|7|LF|7J.LFJLJLJLJL7F--7F--JL--JL7FJ|||F-JL-7||L---7|FJLJL-7|LJL77|||F-JF-7-F7FJLJ|7LJF--JF--J|||LJ|FF7|||L-JL-JF7LJ|FJL77FJFJ|.JJ7F-J|||
FF-|-J|LJ||7LL--7F7F7FJL-7|L-7F7F-7FJ|FJ|||F---J|L-7F-J||F----JL--7L7|LJ|F7L7L7||L--7L--7L--7L--7|||F-JFJLJLJF7F7F-JL--J|F7L-JFJJ-LJL-J.|F--
-J||-LJJF-F-J7L-LJLJ|L---JL--J|||FJ|FJ|FJ||L-7F-JF7|L-7LJL-7F-7F7L|FJL7FJ|L7L7|||F7FJF--JF7.|F--J|||L-7L--7F-JLJ|L------J|L---J7|-J7FFL77||J
LL||7.|LJ.|L-7L7-F-7|F7F-7F7F7|LJL7LJFJL7||F-JL--J||F7|F-7FJ|FJ|L-JL7FJL-JFJF||||||L7|F-7||FJL7F7|LJF-JFF-J|F--7L-7F-7F--J7F7|F7777LFL.LF-77
.LL-F-77J.J7-|-F7|FJLJLJ-LJLJLJ-F7L-7|F7|LJ|F7F7F-J|||LJFJL7|L7L---7LJF---JF7|||LJ|FJLJFJ||L7FJ||L-7L--7L-7LJF7L-7||FJL----JL-JL77FF|-|-7|LL
F7.F|-|--7JFF77|||L7F---7|F7FFF7|L--J|||L-7LJLJ||F7LJ|F7L7FJL7|F7F-JF7|F--7||||L-7LJF--JFJ|FJL7||F7L7F-JF7|F-JL-7|||L7F--------7L7----|FJ-7L
L|-L--|FFFF7||FJ|L7|L--7|FJL7FJ|L---7|||F7|F---JLJL7FJ||7||F7||||L7FJLJ|F-J||||F7L-7|F77L7|L7FJ||||L||F7|||L---7LJLJFJL-------7|FJ-77JF77.7J
F--||.F--7||||L7|J|L---JLJF7|L7|7F--JLJ|||||F-7F7F-JL7|L7|||||||L7||F7FJ|F7|||||L7FJ||L7FJL7||FJ||L7|||LJLJF7F7L--7-L-7F7F----J||--J-7LLJ-JJ
LJFJ|FL-7LJLJL-JL7L----7F7|||FJL7L---7F||LJ||FJ||L7F-J|FJ|LJ||LJ-||LJ|L7LJ||||||FJL7||FJ|-FJ|||FJL7||||F---JLJL--7L--7|||L-7..LLJ7|.|F7FJ7L7
|.L7L-|-|F7F-7F-7|-F7F7LJ|||LJF7L77F7|FJL-7|||FJ|FJL-7|L7|F-JL--7LJF7L7L7FJ|||LJ|F-J|||FJFJFJ||L7FJ||||L---7F---7|F--JLJL--J-FF7JLL-F7LJ||J.
-J-LJ7LFLJ|L7|L7|L-JLJL-7LJL7FJL7L-J|||F7FJ||||7LJF--JL7||L7F7F7L7FJL7L7|L7|||F7|L-7||||FL7|FJL7|L7||LJF---J|F7FJ|L-7F-7F7F7-FJ|-|.F777F|JFJ
|F-LL7F|J.|FJL-JL7F----7|.F7LJF7L--7LJLJ|L7|||L--7L7F7FJ||J||LJ|FJ|F7L-J|F|||LJ||F-J||LJF-J||F-J|FJLJF7L----J|||-L--JL7||LJL7|FJJ|-|L-7JJ.L7
L-J.|L7JJ.LJ.F7F7LJ|F7FJL7|L--JL--7L7F7.|FJLJ|F--J.LJ|L7||FJL7FJL7LJL7F7|FJ|L7FJ|L7-|L-7L7FJ||JFJL7F-JL------JLJF7F7F7|||F--J|L-77.|F-JJ7JF|
|-7F|J|.|.F7.|LJL---J|L-7LJF7F7F-7L-J|L7|L7F-JL---7F7|FJLJ|F7|L7FJF7F||||L7|L|L7L7L7|F-J.||JLJFJF-JL-----------7|||||||LJL7F7|F-J7-|L-7.F.-L
F7L7|L|F-7|L-JF-----7L--JF7|LJLJFL---JFJ|FJL-7F7F7||LJL--7LJ||-LJFJL7LJ||J||FJFJ7|FJLJF--J|F--JFJFF7F---------7LJ||LJLJF7FJ|||L7F7FJF-J7|F..
.FFFJ.|7.F|F7FJF-7F7L--7FJ||F7LF7F----JFLJF7FJ|||||L7F7F7|FFJL--7|F7L--JL7|||FJF-JL-7.L7F7|L--7||FJLJF-------7L--J|F---JLJFJ||FJ|LJFJ|7L|J.F
--7|LJ-JF-LJLJ|L7LJL---JL7LJ||FJ|L-7F--7F7||L7|LJ||7||LJ|L7L7F-7|||L7F-7FJ||LJ-L7F--JF7LJLJF--JL7L7F-JJF-----JF---JL--7F77|FJ||FJF7L-7--J||J
FLLJ-LF7J||F-7F7L---7F7F-JF7||L7L-7LJF7|||||7LJF7LJFJL-7|FJFJL7LJLJFJL7||FJ|F---JL---JL-7F-JF-7FJFJ|FF7L-----7|F------J||FJL7|LJFJ|F7|F|FFL7
JL---77J|--L7LJL-7F-J|LJF-JLJ|7|F7L--JLJ|LJL---JL-7|F7FJ|L7|F7L--7FJF7|||L7||F7F7F7F-7F7||F-JFJL7L-JFJL------J|L---7F--J|L7FJ|F-JLLJ||7LFJFJ
.|L7||JF--JL|F7F7||F7|F-JF7F7L-J||F7F7JFJF7F7F7F--J|||L7L7||||F-7|L7|||||FJ|||||LJ|L7||||LJ-FJF7|F7FJF----7F7.|F---J|F--JF|L-JL-7L|-LJ--77FL
L7LLJ.LJ.|FLLJ||||LJ||L--JLJL7F-JLJLJL-JFJLJ|||L--7|||FJ7||||||FLJF||||LJL7||||L-7|FJ||||F--JFJLJ|LJFJF---J|L7||F7F7||F7|FJF---7L7-7L|-L-7J|
.J7.LL7F--J-||LJ|L-7||F-7F7F7LJF----7F--JF7.LJL7F-J|||L-7|||||L7F--J|LJ-F-J|||L7FJ|||LJ||L7F7L7FSL--J.L--7.L7||LJLJLJLJL7L7L--7|FJF-F|7|LL-7
F||JJFFFJ|FFFF-7L7FJLJL7|||||F7L---7||F7F|L---7||F7|||F7||||||FJL7F7L--7|F7|||FJ|FJL--7|L7LJL7||L----7F--JF7|||F--------JFJF--JLJ7L7F777|.|L
FL77.F777FF7JL7L-JL7LF7|LJ||LJL----JLJ||FJF7F7||LJ|LJ||LJ||||||F-J|L7F7|LJ|||||FJ|F7F-JL-JF77LJL---7FJL---JLJLJL----7.F7-|FJF--7F7L7J|JL-.L|
|.L-77JL7F7F7.L--7FJFJ|L-7|L----------JLJFJ|||||F-JF7||F7LJLJLJ|F7|FJ||L-7||||||FJ|||F-7LFJ|F-7F7F-J|F7F--------7F--JFJL7|L-JF7LJL--77--J7L-
L7FL7J|L7|LJL----JL-JFJF-J|F-7|F7F--7F7F-JFLJLJLJF-J||LJL7|F--7LJLJL7||F-JLJ||LJL-JLJ|FJFJFJ|FJ||L-7LJ|L-----7F7LJF-7|F-J|F--JL7F---J..F|LF|
|.|LJL|-FL----------7|-L-7|L7L7||L-7|||L7F-----7LL7FJL7F7L7|F-J-F---J||L-7F-JL7FF7F-7|L7L7L-JL7||F7L-7|F----7LJ|F7L7||L--JL---7LJ7|7-J-7|-7|
|.LF7FJF7F7-F7F-----JL-7FJ|7L7LJL--JLJL7LJF----JF-J|F7LJL7LJL-7FL----J|F-JL7F7|FJ||FJL7|FJF7F7LJLJ|F7||L---7|F7LJL7|||F--7F7F7L--7F77.LLJLJ7
L7LJ7J|LFJL7||L-------7|L7|F7L--------7L7FJF---7L-7LJL--7L-7F7|F------JL-7FJ|||L7LJL--JLJFJLJL--7FJ|||L----J|||F-7LJLJL-7||||L7F7LJL-7-LJ||J
F|7LF-7FJF7LJL--------JL-JLJL---7F7F--J7LJ.L7F-JF-JF7F--JF7LJ|||F7F-7F7F7||FJ||7L----7F-7L7F--7FJL-J|L7F---7||LJFJF-----JLJ|L7LJ|F7F-J7F-|J|
77-7L7LJFJL7F7F7F7F7F---7F-7F7F7LJLJF7F7FF7-|L-7|F-JLJLF-JL-7LJ||LJFJ||||||L7||F-----JL7L-JL-7LJF--7L-J|F--JLJF7L7L---7-F7FJFJLFJ||L-7F|F7LL
||LJ.L7FJF-J|LJLJ||LJ-F-J|FJ|LJL-7F7|||L-JL7|F-J|L----7L-7F-JLLLJF-JFJ|||||FJ|||F----7FJF----JF7L-7L7F7|L-----JL7|F7F7L7||L-JF7|FJL--JFF777|
F-.J7LLJF|F-JF77FJ|F--JF7|L-J.F--J|LJLJF7F7LJL--JF----JF7|L7F7|JL|F7|F||LJ|||LJLJF---JL7L7F-7FJ|F-J7LJLJF------7|LJLJL7|||F77||LJLF7|F7|L77|
F-|LJ7.|F||F-JL-JFJL7F-JLJF7F7L7F-JF-7FJ|||F7F7F7|F-7F7|||FJ||77LLJLJFJL7.||F----JF7F7FJL|L7LJFJL-7F---7L-----7LJF---7LJ|LJL-JL---J|FJLJFJF7
.FL77F|LFLJL--7F7|F7||F---JLJL7LJF-J-LJFJ|LJ||LJLJL7||||LJ|FJL7-|.|L-L-7|-LJL--7F7||||L7FJFJF-JF7FJL7F7L------JF7|F--JF7|F------7F-J|F-7L-J|
FL7|L77FJ|FF-7|||||LJ|L7F7F-7FJF7L----7L7L-7LJF7FF7|LJLJF-JL7FJ-F--7|L.LJ-||F--J|||LJ|FJL7L7|F-JLJF7LJ|F-------JLJL---J||L7F---7|L--J|LL7F7|
FJ77.L-7JFLL7|LJ||L--J|LJLJFJL-JL-----JLL-7L7FJL7|||F7F7L7JFJL7.|FLFF-FJ|7.LL7F7|LJF7||F7L7||L7F--JL--J|F--7F7F--------J|FJ|F--JL7F-7L-7||LJ
|LFL-7.-JFJFJL-7LJF-7-F7F7LL--7F7F-7F7F7F7L-J|F-J||||LJL7L-JF-JF77-|J7J-J7-|.||LJF7||LJ|L7LJL-JL-------JL-7|||L---------JL-JL-7LF||||F-J||JJ
-.F|-L.L-F-JF-7|FFJFJFJLJL-7F-J|||JLJ||||L--7|L--JLJL--7L---JF-J|-7|J||7LJ7LLLJJF|LJL7-|FJF--7F7F7F-------J||L7F-7F-----7F7F7FJF7LJ-||JLLJ..
LF-|JL|JLL-7|FJL-JFJFJF-7F7|L7FJ||F--J|||F--J|F-7F7F7F7L-----JF-J-|J-|FFJ|-JFLF|-L-7FJFJ|FJF7LJLJ|L---7F-7FLJ|LJFJ|F-7F7LJLJ|L-JL7J|LJ77.|F7
FL.|..L-JF7LJL---7L-JFJFLJ||FJ|LLJL---JLJL-7FJL7LJ|||||F-7F7F7L-7-|J7L--7FJFFFFJ7LFJL7L7|L-JL7F-7L7F7|LJLL----77L-JL7LJL7.F7L---7L--7-LF-7.7
|FJ77F-J-||F----7L--7L7F--J|L-JF------7F---J|F-JF7LJLJ|L7|||||F7|J|F|F-7|J|F-J|F7FJF-JFJL7F7FJ||L7LJL---------JF7.F7|F-7L-JL---7L7F-J7-|-F7|
L||L--JF-JLJF7F7L--7L-JL--7L--7L-----7||-F7FJL7FJL--7FL7|||LJ||LJ.|-F-J|.F7JF7F||L7|F7L7FJ||L-JF7L-------------J|FJ||L7L--7F--7L7LJ||.||L7-J
.JJJ.J||F7F-JLJL7F7L7F7|F7L-7FJF-----J|L-JLJF-JL7F-7L-7||LJ7FLJJF77L-7||F-JLF7FJL-JLJ|FJ|FJL-7FJL----7F---------JL7||FJ.F7LJF7L7L---77F--|-L
FL|.FJFLJ||F----J|L7LJ|FJL--J|-L-7F7F7L7F7F7L---JL7L7FJ|L7F--7JFJL-7||-|L|.|||L-----7LJFJL--7|L-----7|L----7F7F7F7|LJL-7|L7FJL7|F---J-JJFF-L
-.FJ|.F|7LJL-----J|L-7|L----7|F7JLJLJL7|||||F7F7F7L7||FL7LJF-J7F|-LL77.J.77FJL------JF7L-7FFJL7F----JL--7F7LJ||||LJF7F-J|FJ|F-JLJF7J.FJ-F|7|
L-F-7-F|J7FF7F----77FJL-----JLJ|F-----JLJ||||LJ|||FJ|L-7|F7L7-L.|JJL|J-F7.LL--7F7F7F7||F7L7L7FJL----7F-7|||F7LJLJF-J|L--JL-JL---7||7F7J|FJFL
LFJL|LJL|F-J|L--7FJFJF----7F--7LJF---7F77LJ|L-7||LJFL--JLJL-J.FJ.777L7FF7.L7.|LJ||LJLJLJL7L-JL7F7F77LJFJLJLJL7F-7L-7|F-7F7F-----J|L7-J.-J7F7
7J.|JF|7-L-7|JF7|L-JFJF-7FJ|F-JF7|F-7LJL-7FJF7||L-----7F7-F--7JJ-F7J-FL-..LLF7JLLJJ-F7.F-JF7F7LJLJL--7L-----7LJ7L--J|L7|||L------JFJ7|||FFL|
|7L.L||JLF-JL-JLJF7FJ7L7LJFJL7FJ||L7L----J|FJLJL7F----J|L-JF7|J.FF7-F7F||7L||L----7FJL7L--JLJL7F-7F-7L-----7L-7F7F7-L-JLJ|F7F-7F--JF7FF--JL|
|7-|.L|..L---7F7FJ||F--JF7L7FJ|FJL7L---7F7LJF---JL--7F7|F--JLJF7FJ|7F7J7F7FFL----7|L7FJF7F7F77LJFJ|FJF----7L7FJ|LJL--7F--J|LJJLJF--JL7J.|.FJ
FJ7L|J|FF--7FJ|LJ7LJL--7|L7|L-JL--JF7F7LJL7|L------7LJLJL-----J|L7L--7.-JL-F.LF--JL-JL7|LJLJL-7FL-JL7|F-7FJ|LJFJF----JL--7L---7FJF7F7|.FJ-|7
L7|J|JL-L-7|L7|F-------JL7LJF----7-||||F-7L-7F7.F-7L7F7F7F7F7F-J-|F--J7|-J|JFLL-----7FJL-7F7F-JF7JF7LJL7|L----JFJFF77F-7FJF--7LJFJ||||F--|.|
L|.FF7|LLFJL7LJL-7F------JF7L---7L-JLJLJF|F-J|L7|FJ7LJLJLJLJLJJFFJ|L|FF-7|F7JLF-7F--J|F-7LJ||F7|L7|L---JL---7F7|F7|L-JFJL7L-7|F7|7||||7LF-|7
-L-FFFJ7FL-7|F--7LJF------J|F---JF----7F7LJF7|FJ||FF7F----7F--7-L7L7|7L7L-7LF|L7|L--7|L7L--JLJ||FJL--------7|||LJLJF7FJF-JF-J|||L7||LJL7|J|L
JLLLJ|-F---J|L-7|F7L7F7F--7|L--7FJLF--J|||FJ||L-J|FJLJF---J|F-JF-JFJF7|L7FJF7F7|L---JL-JF-7F-7LJL7F--------J||L7F--JLJ-L-7L-7LJL-JLJJ|J.F7F7
LL7LL||L---7L7FJLJL7||LJF-JL--7LJF-JF-7|L7|FJ|F--J|F--JF7F7|L-7L-7|-|L7||L7|LJLJF7F-7F-7|FJ|JL7F7|L----7F7F7LJJ|L-------7|F7L---7L|7L|-F-JLJ
.F|7|.F-7F7L7|L--7FJLJF7L----7L7JL-7|FJ|FJ||FJL-7FJ|F--JLJLJF-JF7||FJFJFJFJ|F--7|LJLLJFJ|L-JF7LJ||7F7F7LJLJL--7L-------7|LJ|F-7FJ.L7-|L.FJJ7
LJ|FF-L7LJL-JL-7FJL7F7||F7F-7L7L-7FJ||J|L-JLJF7FJL7LJF------JF7||||L7L7L7|-LJF7LJF----JFJF--JL--JL-JLJ|F-----7L-------7|L-7||L||-L-F77.FFJ.J
||L77FFJF-----7LJF7LJLJLJ|L7||L-7|L-JL7|F--7FJLJF7|F7L-7F--7FJLJLJL7|FJL|L7F7|L-7L----7L7L-7F7F7F7F7F7LJF--7LL--------JL--JLJ-LJ.|.L--FJ.F||
.F7FF7L-JJF7F-JF-JL-7F--7|FJL---JL---7LJL-7|L---JLJ|L7FJL7FJL7F---7|||7-|FJ||L7FJF7F--JFJF7LJLJLJLJLJL--JF-JF7F----------7F7F7J.F77FL-L|.F7-
F|FFJL7F7F||L-7|FF7|LJF-J|L7F---7F--7|F-7FJL--7F7F-JF||F7|L-7LJF--JLJL7FJ|FJ|FJ|-||L7F-JFJL7F7F-7F7F-----JF7|||F--------7LJLJL-7-7-|F--F7JL|
-FLL-7LJL-JL--J|FJ|F7JL-7L-J|F--J|F-JLJFJL---7|||L--7|||||F-JF7L----7FJL7|L7|L7|FJL7||F7L-7LJ||FJ||L------JLJLJL7JF----7L------J.|J|F-FLJ..F
LLLF-JF-7F7F-7FJL7LJL---JF7FJ|F7FJL7-F7L---7FJLJ|F--JLJ||||F7||JF7F7||J.||FJ|FJLJF7|LJ||F-JF7LJL-J||F7F7F--7F7F7L7|F---J7F7F----7JJLF77-77.|
|LFL-7L7||||FJL7LL7F-7F7FJ|L7LJ||F-JFJL---7||F-7LJF7F7FJLJLJLJ|FJLJLJL7FJ|L7|L7F-JLJ7FJ|L--JL7F-7FJFJLJ|L7FLJLJL-J||F7F--JLJF---J-LJ|L|---77
J7|JLL7|||||L--JF7||FJ|||FJFJF-J|L--JF----JLJ|FJF7|LJ|L-7F----JL-----7|L7|FJL-JL7F7-FJFJ|F7F7||FJL7L-7FJFL-----7F7|||||F---7L7F7F7|FF777L-JF
|F7J.F||LJLJF7F7|LJ|L7|LJL-JJL--JF---JF----7F|L-J|L7FJF-J|F7FF7F--7JFJ|FJ|L----7LJ|FJFJJFJ||LJ|L-7|JFJL--------J|LJLJ|||F-7L-J|LJL7FJ|7--JFJ
L7J.-L||F---JLJLJF7L7LJFF---7F--7L-7F7L7F--JFJF7FJFJL7L-7||L7|||F-JFJFJ|FJ|F--7L-7LJFJF7|FJL7FJF-JL-JF7F----7F-7|F---J|||FJF7.L-7FJ|FJ..FFF7
||.L|JLJL7F7F-7F7|L-JF7FJF-7LJF-JF-J||FJL7F-JFJ||FJF-JF-JLJFJ||||7FJFJFJ|F-JF-JF7L7FJFJ|||JLLJJL7F7F7|||F-7FJL7|||JF-7|LJL7|L7F7|L7|L77-FLL-
|77||7|.LLJ||FJ|||F--JLJFJFJF7L--JF7|LJF-J|F-J.LJL7L7.L---7L7||||FJFJ|L7LJF-JF7|L-J|FJFJ|L7F7F--J|||LJLJL7LJ-FJ||L7L7||F--J|FJ||L7||FJF-7JJJ
|J|-7-JFLLFJ|L7|||L----7|-L-JL----JLJF7L-7||LF77F7L7L7F7F7|FJ|||||FJF77L-7|F7||L7F-JL7|F|FJ||L--7|LJF-7F-J|F7|FJ|FJ7||||JF7|L7|L7|LJL-JFJJ||
|.|LJL|7|.L7|FJ|LJF----J|F-------7F--J|F-J|L7|L7||FJFJ||||||FJ||||L7|L--7|||||L-J|LF-JL7|L7|L7F7LJF7L7LJF--JLJL-JL--JLJL-JLJFJL7||F---7||.F7
7FJ7JFJ-LF7LJL-JF7L-----JL------7|L--7LJF-JFJ|FJ|||FJFJLJLJLJFJ|||FJL7F7||LJ|L--7L7L-7FJL7|L7||L7FJ|FJF-JF7F7F---7F-7F-7F7F7L--JLJL-7-LJ77L-
FJF|-|J-J|--FLF-JL--7F----------JL---JF7L7FJF||FJLJL7|F--7F--JFJ|||F7LJ||L-7|F7J|FJF7|L-7||FJ||FJL7|L-JF-JLJLJJF7LJFLJL|||||F7F7F7F7L77|||7|
F7F-7|F|FL-77JL----7|L-7F7F7F7F-----7FJL-JL7FJ|L--7FJLJF7|L7F7|FJ|||L7FJ|F7||||FJ|FJ||F-J||L7|||F7||F7FL---7LF7|L-----7||||LJLJ||||L7L77JLFJ
|-J|-|F|7J.LL-.F7F7||F-J|LJLJLJF-7F-JL---7FJL7|F7FJ|F7FJ||FJ||||FJ||FJL7LJLJ||LJFJL7|||F-J|FJ|||||||||F7F--JFJLJF---7FJLJ|L---7||LJ||FJ|.7.|
7FFJF-F--.|F-JF|LJLJLJF7|F-77F7|FJL7LF7F7||F7||||L7||||FJ||7|||||FJ||F7L---7||F-J.L||||L-7||FJ||||||||||L-7J|F-7L--7||F7.|F7F7|LJJF7LJF-..F7
-FJFJF|JJ7L|JL|L---7F7|LJL7L-JLJL--JFJ||||||||LJ|FJ||LJ|FJL7||||||FJ|||F-7FJ||L7F7FJ||L7FJ||L7||||||||||F7L-JL7|F7FJ|LJL7|||||L---JL--7|FLF-
L|-|F7.L7--7FF-F---J|||F--JF7F7F-7F-JFJ|LJ||||F-J|FJ|FFJL7FJ|LJ|||L7||||FJL7||FJ|||J||-||-LJFJ|LJ||||LJ|||F7F-J||LJLL-7FJ|||||F-7F7F--J--LJ|
.|FJF-7-LLLLFJ.L---7|||L7F-JLJ||FJ|F-JFJF-J|LJL7FJL7L7L-7|L7L-7|||FJ|||||F7|LJL7|||FJL7||F7-|FJF-J|||F-J||||L-7|L7F-7L|L7LJLJ|L7|||L-7J|LJF7
F7J|L|-.J.|.JJ.LLF-J||L7LJF---J|L7|L-7|JL-7|F--JL7FJFJF7LJFJF7||||L7||LJ||LJFF7LJ||L7FJ|LJL7|L7L7FJ||L-7|LJ|F-JL7LJFJFJFJLF7FL-JLJL--JL7-7LJ
LJ.FLJ|.|F-7|7-JJ|F7|L-JF7L----JFJL7FJL7-FJ|L7F7FJL7L-JL-7L7|LJLJ|FJ|L7J|L-7FJL--J|.|L7|F-7|L7L7||||L7FJL-7|L--7|F-JJL7L-7|L------7L|7F|.|J|
L77JLF|7|.L|LJ7.|LJLJF--J|F-----JF-JL-7L7L7L7LJ||F-JF--7FJFJL--7FJ|FJFJFJF7|L-7F7FJFJFJ|L7||FJFJ|L7|FJL7F-J|F-7|LJ|F-7|F7LJF------J-F|J|7.LL
||J7F7LJ-7|L-LL7F|L||L--7|L7F-7F7L7F--JFJLL7|F-J||F7L7LLJFJF7F-J|FJL-JFJFJ||F-J|||||FJFJFJ||L7||L7|||F-JL7FLJ||L---JFJ|||F-JF-----7L||LJ7F7|
LJ-L7LF7.F7|7LJLF|7FF7F-JL7LJ-LJ|FJL--7|J7|LJL-7|||L7L--7|FJ||F-JL7F--JFJ7LJL-7||L7|||L7|FJL7LJF7LJ||L--7L---7L7F7F-JFJ||L-7|F----J|LJ7L7JL7
L||LL-L|77-FL-J.LLF-J|L7F7L-----J|-F7FJL7FFF7F7LJ|L7|F-7|||-|||F-7||F-7L7F----J||FJ|L-7LJ|F7|F-JL--JL7F-JF7F-J.|||L-7L7||F7LJ|F--7L7.L7-L.LL
7--7..7L|-J|L-7F.FL-7L7LJL---7F-7L7|LJF7L7FJLJL--JFJ||FJ||L7||LJ-LJ|L7L7|L-7F-7|LJFJF7L-7|||||F7F7F7FJ|F7||L--7|||F7||||LJ|F7LJF-JF77F7JL-7.
|J7|..JFL.F|7L7JFF|7L7L------JL7L7|L7FJL7|L7F--7F7L7|||FJ|FJ|L-7FF-JFJFJ|F-JL7||F7|FJL--JLJ||||LJ|||L7LJLJ|F--JLJLJLJFJL-7|||F7L--JL-7LF7.L7
.FF.J-JF-L-7--F.F.F7FJF-7F7F---J-LJFJ|F7LJFJ|F7||L7|||||FJL7|F7|FJF7L7|FJL7F7||||LJL------7|||||FJ|L7|7F--JL------7F7L7F-JLJ||L7F7F-7|7LL-J|
.F|.L|.F7JFJJL7.LF|LJFJ|LJLJF----77L7LJL-7|FJ|||L7|||||||F7|||LJ|FJ|FJLJF-J|||LJL7F7F7F7F7|LJ||FJFJFJL7|F--7F7F---J||L|L---7LJJLJLJLLJJJ.|JF
FLJJFFFF77J-J7|..FJF7|F--7F-JF--7L7F|F7F-JLJFJLJFJ|||||||||||L-7||FJL--7L--J||F--J|||LJ||LJF7LJL7||L7FJ||F-J|||LF7FJL7L7F--J7L7JJ7..LL7FF77J
L-JJL7-7J--7JLJ.LL-JLJL-7|L--JF7L7L-J|||7F--JF7FJFJ||||||||||F-JLJL-7F-JF7F-J|L7F7||L-7LJ7FJ|F--J|F-JL7|||F7||L-J||F-JFJL-7JJ7|FFF7FFJ-7LJL.
FL7-|J.L7LJJF-F--F------JL-7F-JL-JF-7||L7|F7FJLJFJFJ|||||||||L7-F7JFJL--J|L-7|F|||||F7L7F7|FJL7F7|L-7FJ||LJ|||F-7LJL-7L---JJLFJ7F|-JJ7LL7-|7
77|.|L7LL7J--.L.-L----7F7F7LJF-7F-JFJ||FJLJ|L7F7L7L7||||LJLJ|FJFJL-JF7F-7|F-J|FJ|||||L7LJLJ|F-J||||FJL7LJF-J|||FJF7F7L----77FL7|JL77J|F|-FL7
J-77J7L7LF-7L-LFJ|L|L|LJLJ|F7|FJL77L7||L7F-JFJ|L-JFJLJ|L---7|L7L-7F7|LJ.||L-7|L7|||LJFJF-7FJL--J||FJF7L7FJF7|||L7||||F7F7FJ77JF--LJJ-LJJLJJJ
|..--|LJ7.FJJ.L--F-F7F7F7FJ|LJ|F-JF-J|L7||F7L7L7F7L--7L7F7FJ|FJF-J||L--7LJF7||7|||L-7L7|-LJF7F7.LJ|FJ|FJL7|||LJFJ|LJLJLJLJ.JJ.---JJ|JF7|-FJJ
L-J-F|.FJF|FFF-7J.L|LJLJLJFJF-JL7|L-7L7||LJL7|FJ||F--JFJ|LJF|L7|F7|L7F7|F-JLJL7LJL--JFJL---JLJL77FJL7||L||||L7JL7L-----7J77|F|-7LFJ|-LF--J|7
LJ7LJJ.LJ-F|JL7L7--L-7F-7FJL|F7FJF--JFJ|L--7||L-J|L-7|L7L--7L-JLJ||FJ|||L-7F-7L-7|F--JF-7F-----JFJF7||L-7||L7|F-JF-7F--JLFJL-LJF7F7|.FF7-J7.
F-LF7.JJ|L-F7F7FJ7|JFJ|FJL-7||||FJF7FJL|F-7|||F--JF7L-7L---JF----J|L7||L7F||LL7FJFJF-7L7|L7F7F-7|FJ|||F7|LJLLJL7FJFJL---77.L77L-JJLF|.JJJ7.J
|-LL-7JF7.FL-|J7|F7FL-JL7F-JLJ||L7||L-7||FJ|LJL--7|L-7L-7F7JL-7F7FJ|||L-JFJL7FJL7L7|FJFJL7LJLJFJ||FJ||||L7F-7F-JL7|F-7F7L7JJL7|L-F--|-LJ.FF.
L7LF-7LJJF|FL.LJ7J.F.F7FJL-7F-J|JLJL7FJLJ|FJ7F7F-JL-7|F-J|L-7F|||L7FJL--7L7FJ|F7|-LJL7L-7L7F7FJFJ||FJ||L7LJFJL-7FJ|L7LJL-J|-|F|LF7.LJ.LF|FJ7
LJFL-J7.L-LF-F-L|JLF7|LJF7FJL7FJF---JL7F7LJ-FJ|L--7FJ|L--JF-J-LJL-JL-7F-JFJL7||||F---JF7|FJ||L7|FJ|L7LJLL7FJF--J|.L7L--7JL7-F|F7JL-.L|7LL|-7
JFJLL-L7J.||F7JLJ7J||L7FJ||FFJ||L7F7F7LJL-7-L7L---JL7|F-7FJ.F|-|-|JJLLJJFL-7|||LJL7F7FJ|||FJL7|LJLL7L7F--J|LL7F7L-7L7F7|.|L7LL7J||LJ.FF7||F-
.|J||7JF-7FJ-J-FJFFJL-JL7LJFL7L7L||LJ|F-7FJF-JF7F7F7|||FJ|7-J7.|FF-L7J-LF--J||L-7FJ||L7LJ||7FJ||7..L-JL--7L-7LJ|F-J||||L7---7L|-FFFJF-JLF7J.
FJ7JFLFF..JJ||F--LL---7FJJ-FJL7|FJ|F-JL7LJFJF7|LJ||LJ||L7|-.LJ7LJ||7||LFJF-7|L7FJL-JL7L-7|L7L7L-7-J|.F7.FJF7L7FJL7F-LJL-JJ|.|.|JLJ||-|F.-|..
F.F----J.F|LF7F7-|JLJ-||JL.F-L||L-J|F-7L-7L7|||F-JL-7|L7||.|7FF7FFFJ-L-L7|FJ|7LJ.LF7FJF-J|FJ-L7FJ7JF-|L-JFJ|FJL-7L7.L..|L7JF7-|J7-F.L7JFJJ7F
LLJL|FJJ7LF-J7|7F||J|.||F|F--7LJJFFJ|FJF7L7LJLJL7F7FJL-J||.LLLLJJL7.7J|LLJL7|7F---JLJFJ-FJL7-LLJJLFJFL7F7L7LJJ..|FJ7..FJ7.LLJ|.FF-J--7F-.77|
-7JLF||-|LJJ..LJJ||FJ-LJ7J-J.7JFF-L-JL7||FJ-J.LFJ|||J...LJ--7L7J|7J7L-L77.FJL7L-----7L-7|F7|J|FJJL.F|L||L7|J|.-FJ|JF-77..FFJFFLJ-7L-J.F.JJ--
J777L|7L--LJF-|7L7J7.LJ7F.|..F.|.J.L|.LJ|||-J-FL7|||LL..||.LFFJF--F-.F|F-7L--JJLLLF-JF-JLJ||F77.FL.|J.|||LJL---L7|7LLFF7-FJJLLJ|F7.|.7|J|F|J
L--J.7|.|.FF7--7.J-F|--F|-7.FL7|7..FL-J-LJ-7|JLF||LJ7|7.FFJ7JLL7F7JJ.F|J.FJ.JJ.7.LL7FJJL7LLJ-J77FJ-|FFLJJ7|.|FFL||--7|J.|.L77L-L|7FL7-|L7-77
LJ-LJ.F-|.7|...||7F77|F|J-.|FLFL77-|J.|.|JLJJ|LLLJ|-F|77-||L|.F-FJJ.|-LJ7L7J.F--7LLLJ.FJJ.F|J-|||.F|FFJ|||7.|-J-LJ.L--7L--|FFJJ7.F7J|-JL-.F7
7JFF.FF-L-LJJJ-7JL7LLL|7JJ.LJJLLLFJLFJ7JJL.LL--JJLJ..JLL-FF---J.J.F.L.J.|-|LFF--7-L|-LF.J-JJJLLF--L-|J.L|L|.J-J.LLJJ-L|.|-L-F---J.LJJJ.FJL|7

View file

@ -0,0 +1,140 @@
...#...................#.......................#.......................................................#....................................
........................................................#...................................................................................
...............................#..........#..........................#.....#......................#.........................................
......#.................................................................................#.............................#..............#......
...........................................................................................................................................#
.................#........#.........................#...........#................#....................#......#..............................
........................................#................#....................................#..............................#..............
......................#.....................................................................................................................
..#.........#.......................#..............................#...............................................................#........
.............................................................#..................................................#...........................
...................#...........#...................#....................#...............................................#...................
...........................................#...................................#.....................#......#...............................
....#.........................................................................................................................#.............
........................................................................................#..........................#........................
...........#........................#..........................#............#...............................................................
.#...........................#..............................................................................................................
...............#..........................#................#.......................#.......................#................................
.....................#...........................................................................................#..........................
.........#.......................................#..................#..........#............#..........#..................#.................
.......................................................................................................................................#....
....................................#........................#..........................#...................................................
.....#.....................................#................................................................................................
...............#......................................#......................................................#....................#.........
....................#................................................................#.......#...............................#..............
...........#................................................................................................................................
.........................#......................#...........................................................................................
...#..............................#....................................#...........................#........................................
..................................................................#..................................................................#......
..........................................#..........#......................#............................................#..................
...............#......................................................................#..........................#........................#.
.....................#......................................................................................................................
..................................................#.............#.................................#.........................................
#..........................#.........................................................................................#......................
.....................................#......#................................#..............#...............#..................#............
........#............................................................................................#................................#.....
................................................................................................................#...........................
...............................#.......................#..................#................................................#................
..................................................................................................#...................#....................#
............................................................................................................................................
................#..........#....................#..................#..........................................#.............................
........#.................................#........................................#.....#.....................................#............
.......................#............................................................................................#.......................
.........................................................................................................................#.........#........
........................................................................................................#...................................
....#.......#...............#........................................#......................................................................
...........................................#.....#.............................................................#..............#.........#...
............................................................................................................................................
.....................#................#..................#....................#..............#..............................................
......#.....................................................................................................................................
...............#......................................................................................#.........................#...........
........................#...........................#..........#......................................................#.....................
.........................................#...........................#.................#......................#.............................
............................................................................................................................................
............................#.............................#.................................#..............................#...........#....
.#...........#......................#.........#...........................#.................................................................
............................................................................................................................................
.................#..................................................................#...........#.........#......................#..........
............................................................................................................................................
............................................................................................................................................
.........#...................#.................................#.............#..............................................................
...............#....................................................#...............................................#.....#.................
..........................................#..............................................#...........#.......#..............................
..#..................................................................................................................................#......
..........................................................................#.........#.......................................................
....................................#.........................#.........................................................#...................
...............................#................................................................#...........................................
...........#.............................................#............................................#............#........................
...........................................................................................................................#............#...
................#...........................#......................#..........#.......#.....................................................
#......................................................................................................................#............#.......
........................................................................#..................................#................................
..............................................................#...........................#.....#.........................................#.
......#.......#.....#.............#.........................................................................................................
.............................#.........#..................#.................................................................................
..........#.........................................................................................................#.......................
......................................................#................................................#...................#................
....#....................#.........................................#.........................................#..............................
....................................#.........#...............#...............#..............#...................................#..........
............................................................................................................................................
.............................#..................................................................................#.......#...................
........................................#................#...............#..................................................................
............................................................................................................................................
.............................................................#.........................#................#...................................
..........#......#............................#..................................#...............#..............................#.........#.
..................................#.................................................................................#.......................
....................................................#.......................#...............#.................#.......................#.....
.#...........#........................#..............................................#......................................................
................................................................#.......#..............................#....................................
..................................................................................................#...........................#.............
............................................................#............................................................#..............#...
......#.....................#......................................#...........#............................................................
.....................................................#.............................................................#.............#..........
.......................#.............#.....................................................................................................#
...........#.................................#............................#...........................#.....................................
.#...............................#....................................................................................#.....................
...................#...................................#..........................................#..............#..........................
.........................#.......................................#.............#............................................................
..........................................#.......#.....................#................#..................................#...............
...#.......................................................................................................#............................#...
............#.............................................#..................................#...................................#..........
............................#..........#.............................................................#.............#........................
......................#.....................................................................................................................
.............................................................................................................#..............................
....#........................................#.....................................#.......................................#................
.....................................................#..............#...................................................................#...
#....................................#....................#.......................................................................#.........
................................................................................................#...........................................
...........#.........#....................#...............................#.............#................................#..................
............................................................................................................................................
......#..........................#...........................#...........................................#...........#......................
.#.............#.........#.........................................#...........#.....#..................................................#...
.....................................#...................#.....................................................................#............
...........................................................................................#................................................
...................#................................................................................#..............#........................
...........................................#......#........................................................................................#
..#........................#..................................#.........................#...................................................
........#.............................#...............................................................................#.....................
...............................#........................#...............#..............................#....................................
.................................................................#..........................................#...............................
....................................................#........................#........#....................................#.........#......
....#.........#....................................................................................#.......................................#
......................#.....#.............................................................#.................................................
#......................................#......#....................................#...............................#.............#..........
.......................................................#..................................................#.................................
.........................................................................#......................#...........................................
...............................................................................#............................................#...............
....#........#................#...............................#.......................................................................#.....
.......................#.................................................................#..................#...............................
.....................................#.............#........................................................................................
...................................................................................................#......................................#.
..#.........................................................................................................................................
........#.................................#.............#...........#................#......................................................
...............................................................................................#............................#...............
.................#....................#.........................#..................................................................#........
....#.............................................#........................................................#........#.......................
.........................#.............................................#............................#.......................................
......................................................#.................................#................................................#..
.............................#...............#.................................#............................................................
.........#....................................................................................#........................#........#...........
..................#...........................................#.................................................#...........................

1000
2023/aoc_puzzle_cache/day_12 Normal file

File diff suppressed because it is too large Load diff

1311
2023/aoc_puzzle_cache/day_13 Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,100 @@
O...O..###.#..#O...###.......#....O#.O...O....#.O...O..O..##.O.O#...O........O...#.#.O...O#O.......#
...O#..#O...#....O..###.O.....#......#.OO.O#..#.O..##...#....##...#.O....##O##OOO..#.O..OOOO..#..#.#
...##.OOOOO#.OO....OO#O.###.O..O...OO.......O....O...OO##....#..O.....#O#.O.O.#O..O.##....##.#.OOOO#
O..#O..O.....#.#...#....#O.O..#..O.O..#O#..O....O..O.#.O.#..O.O#...#O#...##O.#O.##.OO...#.#.#OOO....
.#O#O.O.......#O.#.O#.O..##.#.O.....#..#.....O..#..###..OO.#.O.OO#..O.O.........O..O...#.O.#....OO#.
..........#...O.OO....#.O.O##OO#......#OO.#.O...O....O..#OO#..O...#..#.#.....O#O#..OO#...#OOO.O.#O..
#O#OO.O.#.O.O...O.###O.........#O.O.#...O.#..O.O..#..O##.#O.O.OO.....OO.#.#.#..#.O..O#......O..O....
.#....O#O.OO..#..O#..O..O..O.#..O..#.O#....#.O....O.O.....#O#....#.#.#..O...O#OO#.#O.#O.#...OO..OO#O
.O.........#.#O#....O.O#OOO......O..#O#...#.....#.......#...#....#.##.O...O..#O..#O...O.#..O.OO..#..
O...O...O.....O..O...........OO.##..OO.OO#.O.##..O#OO#......O..O#.O#.OO..#####......O....#....O...#.
.....#O.....#....#O......#..OO.O.O.#..O..O....O..#.#..#.......O..O.O....O.OO......OOO#.OOO......O...
..O#.O.O.#O#O...#..........#..O##...O..O#OOO.OO..##O.#OOOO...#..O....#.....O...#....#.#.#...OO.O.#..
#.......#.O....O#.#O..#OOO..O..###O#..#.O...OO.O.......##O#..O#...OO.........OOO.#O...O...#OO#O#...O
#O#...#O.##..O.........O#..O..O..........#.##..OOOO...O..#.OO......O#....##....O.O...O.OO...O..OOO.O
.OO..#.....O#O..O..OOOO.#.#..#.O......#..#..O..O..O.#O..OO....#...O##O.O.O.O.#......O...O..#.#O...#.
..OO.O......O.O.OO.....O.#..#.O..#O.#.O.....#.O..OO.OOO#..#.#OO.#.OO#.....##O....#.#O.....#..#......
.#..O#.#O#.....##.O.#......O#.O.#..#O.#..O#.OO.O.#.O#..O.....#.##..###O..O.OO.##.O.O..#......###...O
#.O.O....O##...#..OO..#...O#O....O....O.OO.........#..OO..#...#...OOO#O.....O.#.OO.OO##.O....#......
O#.O.O..#..#....O.O.......#.#...#...##O..O.O...O.OO#..#O.O..O.......#...#O.#.O.#O##.#.O..#..O....#.#
.O.O..#...O#..O....O..#.#.OO......O.O.O.O##........#.O#.#..#....O..O....O...O##OOO..O.#O..O.......##
......#..........O#..O..O..O#.OOO#O.#........#...O.#..OO..#.#.#..O#...###.#...#.#.O#..#O.#O....O..O.
..#.......O...#..O..O#..........#.......#....#...O........##O....#O..OO.###.O#.#O........OO#.#O..O#O
.....#.O.O........O.#.O.#.O...##.......#..#........#.O..O...###...O.O.O#....OO.#.....#.......O#..O..
#..O.O.O#.....#.OOO##.....O..OOO.OO...#..#O..OO.O...##...#..###......O...##..#....#..OOO.O...#OO.#..
..##...O...#O..O#.O.#...O.O#......OO..O...O.#...O.O.OO...O.O.O.#..#O.O........#.#..##.O.....#.#O...O
..#O...O.O.#.O....O#.....#..O.O................O....O..##O#.#O....O.O......O...#.....O..O#...O..#.O.
..#..O.#......O#.O.O...O#...O#.O#...O..O....#..O...#.#......#......#O....O.O.O..O..O..#....O..O.....
..#...O....OOO.O##..O#.#.......O##.....O........OO.O...OO#.....#......O.#O#OO##O....O#.OO........#..
....O##..#.....##.O##...O.#..O...#O.#...#.#...#O....O.O.....O.OO.##..#O...#O.O#.#..O#...............
O..O.......O#O.......OO....O.OO....#...#O.OO#..##O....#..#.#O#OO##O...O.O...#...OO#.....O..#..OO....
..#..#O....#...O.##...#O#.O..O.O....O.....OO#O.#..#.....O..O.###.OO.O.......O..#.......OO.#.#..O....
#.O..O.O.#O..OOO##OO....O.OO#OO...#OO.#.#O.OO.OO...#..O.....O....O.O.O#.OO..O.#..#.O.O..OOO##..O#OO.
O.#O.#.OO.#...#.##..OO...#.O##..#O.#.#.#.....O.O##..O..#..O.O.....#....O...O......O..O##.###..#O.#OO
#.........#....O...O........OOOO.##.O.O.#......O####O..#..O##.O.#O.#O...#..#.....O...#.#..O#.#...#O.
.......#.#OOO.....O#O..#.#....#.OO.....O..OOOO#...#.............###.........O.OO..#.O#O..O...O..#.O.
O#...O.......O.O..O.#.O.....OO...O...O.O#OO....##.##.#O#..........O.O.......#.....O.....O.O..OOO#..#
#.O#......O.O..#O.O..O....#..#O..#.#O.O...OO...##.#.O.O..#..#O.#.#.O#.......O..O.#...#O.....#.O#...O
..O..O#...##.#..##..#O..O.OO#..#.##O.O..O..#.O..##.O#.O..#.O.#...........O#.O...O.O#.#...#..#..O.O.O
#.#.O...OO....O..O.#O.#.OO..O#..O..O....O.#.#O.##O.....#.O.#...#...#....#....OO.......#.O..O...#..#.
..O.O#O..O.......#.......O#OO..O....O##.....O.#.O..#.#.....#...OOO.......#...OO#......O..........O.O
..##.#..O.O..#....##..O...O..O#.#O....O##....##O.....OO.O..#.O.O#.#.....OO..O........#........O#O###
..#.#...O#..O.......#.OO##...OO#O...#.O....#OOO......O.O.O.#O..#.....##..#O#.OOO...O......OOO#.O.O.O
O...#...O..#O......O.O......#.....#...#..#.O...O.#O##..#.#...#..O#....O.#OO#..O.....#.#..#OOO#...OOO
...##..#O...#...O.##O.O#.........O........OO#O..#.OO.#....O..#...OO..#O.......O..O.O#...#......OO..#
.....O.O....O.O#....#O#......O.............O.OO#.....#OO...........O#.......#......OO#O#.OO..O..O...
O##.....O...#.#.#..O..OOOOO..#.#.O##.O...#..O...O.....O.#.#...###O.O..#.#.O..O#....#.O...O#.O.......
#OO.....O.O.#...#.O#.....OO...##.O...O......O.#O.........#.O....OO.OO.#.O.#O.O......#O.###..#.#.OO#.
.OOO..O.OO#O..O##.......##...##......O..O...#...O...#.O.O.#.#O.#OO...O.O..#.O#...O..#...OO....#OO...
.##.O.OOO..O#.##O...#O#O...#...#.....#.....O...O......#..##O.OOO.O#..O.#..#.#..O........O..#.O#O....
....O..O.............#......O.#O..OO...OO.....O..#..#......OO......O....OO..OOOO.....#.#O..#.#...O.O
.###.....##.#......###....O#....O....O...O....#.#O.O#..#..O..#O...OO..OO.O.....#O.O..#.#.....O...O#.
..O..#O...O.OO.O........O...O.O.....O..#O.O.O...#........O........OO.O..OO#O.#.O..#.#O#...O.#.##.O..
OO..OO.O..#OO..OO#..........#...............#.O#....O...O.#.O.O#..#.#.OO#...O.#O..##........O#.O....
#.O......#....#...O.O...O....OO..O..#...O..O..#..O#........###...#..#.#..OO..O.....#.....#...#...O..
..#O.O..O.....OO...............O....#.....O.....#O.OO.O..O..##O....O..#.#.#O...O#O##O#.#OOOOOO.#..O.
#O#O.....O..#...O#......OO...#..OOO#O..O##.OO..#.#.##.#.OO..O.###.O.#..O...#O#....O....O##O..#O.O.O.
..O.....O#.O#.....OOO.O..O......O.O..#O..O.O.........#.###..#.O.O.O.OO#.O..#...O.#..#.#...O##.#...O.
#..O#..O#..#...#.#......##.....#OO.O#.OO..#.....OO#...O.O..O.......O#.#.........O.#O#O.O..#.O.......
..O.#..#..O.O..##..#.#O.......OOO#.O.#.OO.##...O...........#.O..#...#.O........O..O..#.....O.#.....O
O.....O.....O...O....#..#......OO#....O......O..O#.#...O...##.O####O#..O.OO.O.O.O.##...........O...O
OO#.O..##O.O..O..#.#..#...#...O.O.#..#...#.#...O.#..#O......#####..##.OOOOO......O.O..#OO.O.#..O.O..
O.O..#.O.OO.#.O.#....O.#......O.##..#O...O..##.#...O.#...O.O....#...O.#...O.......###....#....#.....
#..#.........O....#........OO.#..OO..OOO....#.....O....##O.O.O....O.O..O....#O#.###.O...#..O.O....#O
#...O##..O#..O..#.O.......O.....#....#O###O#OO.O.O..O...O..OO...#.#.#..O..O...O..#...#.#....#.#.#.OO
......#..........#...#..O..#O#..O....#.O..O..#.O.#O...O#.......#........O#O....OO.....O..OO...#..#..
O..O...#...#..O##....#.O....O..#...O..###..O...O....OO..O..O.........O..##OO......#O...O.O##...OOO.O
..#......OO.#.......#...O#.#.O#...#...#O...O......#.....O#....OO........O#O.......#O..#OO#.O.O....#.
.O.##....#OO.O...O#....O..O......O..#.....#O..O.#...#.......O....OO#...O....#....#.O...OOOOO.#O.O..O
....#....OO#..#O....O...#.OO#...#O......#.#.OOO..#...O#......#...O..##.OO..O....O.#O...OO.#.#.O..O..
O.O....OO#...#..O...O.#OO.O..O.....#....#.O..O.#..........OO..#.#.#.O...O.O.#.#..#.#......#..O.###..
....#..O.O....OO...O.....#.......#........O..#.OO##O#OOO#O.......#.#.#....#.#.O..#.O##.#..O....##.OO
O.....#.#....#.........O.O....O..O#.....#O.O#O...O#O...O...##........OO.O.........OO..#...OO.O..#...
.O....O....#.#O..O...OOO.......O..O..O..#............O.....#.O...OO....#.O#O.O##.#.O........#...O...
..##.O..OO#..O.O...O....##...O.......#..O...O.#O.O..........O.#.#OOO#..O...O..O.OOO.....O.........O.
OO..#..#.....#....##...#..#..##.O.OO...O#........O..O.....#.......O.O.O..O...O.O.OO..O...#.###.#.O##
O.#O...O......O.......O#.O......O#..O..#...##.O...##......O.O.#O.##.O.O#....O#O#..#..#O#...#........
#OOO.O...O...O.#.#O....#....O..#.#..O.......#OO......O........O#..O..##..#.O...O...##O...........O#O
.O.#.OO..O.....O...##O.#O.#...O#..O.#....#..#OO#.#.OO...#.O#...OO......O.....#O..O...O...OOO#.O..O##
..O...O...#..O..O#..O.OO.#.OO.O...OO.#.....#.O..#..#O..OOO.##O#O....#...#O.O....OO..#.O...OO#O#....O
#O..OO.###.OOOO....O#......O.O.#OO......OO..O.O..O...O...O..#.OO.....##.O.OO...O..#O.###..O..OO.#.O.
...O.O##....O.#..O#.OOO#.........#....#....#.......#.O...O...........O.O#O.O#..OO.O#....O.#.O.#O.O..
#....#....O..O..#.....#..O#O.#..O.O.#O.O....OO.#.#.O.O....#O....#..O..#.O.#O...#.....O.O...#..#...O.
.#....O.....O..OO.O.O#..#...##.....OO....#.#.OO.#..O..O.......#......#.....OOO#O.#######.##......O#O
#OO..#..OOOO.O..#.###..#.O..#.O...O#.O..#....#...#OO#..#....#OO....#...OO..#...O.O.....OO...#.O.#...
#..O....OO....#.#.OO...O.O....O.##..#.O..O....OO..#.O..O.OO......#.#O..O.O........O.O.O...O.....O#.O
.O.#...O.#....O..O#.O..O.OO.....O...........#.##OO....O..#O###..#..O.O.O.....#.......##O#.#...O.....
.....O.OO.#O.O##............O.O...##.O......#....#....#...#.#...O...#OO.#.O.....O.#..O...........#..
..O.OO..#O..O.O.##.O#..........OO..O...OO..OO.OO.OO#...O.#O.O...OO.......#OO.#..#..O...#....O.......
O.OO....O#....#...#.#O##..O#...#..#......O.......#O..#O..O..O...#......#O..O##.O....O..O.O#.#....O..
.#.O..O..O.........##O..#..OOO...O##.O.#O#.O...O.#....#..O..O.......O..#..O..O#..#....O..OO.##..O...
...#...OO.OOO..#...O.#.O.......#...##.O#.##..##..#..#.##.....##O..O..O..#OO...#....O..O.......#..#O.
.....O...O.#......##O.O..#...#.....O..O....#O#.#..#O.#....O#.O...#O....###...OOO...O#..O..O..###..O.
..#..........O..O..O...O...O....O............O.....#O....O..#.....#...O.....#..O.#.#..O..O...O.#O...
...OOO......O...#.O#....##..#...O..O#..##..O....#.O.OO.......#....O....##.#.#.O...O#.#O..OOO..O.O...
O...#.O....O..OO..O...O....#.#.....#O#O....#O.##.O.OO.#.O............#.O#...OO..OO#..#O.#....O......
#.O.....#.O#.OO.#........O..O.#.OO.........#..#...#.O#O...O...O..OO.#.......O.O..#..O.O...OO..O..O.O
..#....#O#.O.O#.OO..O...#..O......O#O.......OO..OO.....#O#.O.O..#O.......OO.#.O..O....O.O.O.........
#...O###O..O.O##..#.#.##..#...#.#.#...O.#....#.....#.#...O#..O.O...O..O........#.###....O...#..#...#
.......O........O.....##..O##...O...OO..#O..O...#...O.........#OO.....OO.O..O..#OO.#.#O..O#.OO...#O.
.OO..O.....#.O.....#O..#O...O....#..O.....#....#O......O...#.O###.OO......O..O.......#####.........O

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,110 @@
\\..../........-...-........-.-.|..................-...........................-.........-...---..............
..../.....................\...........|........|...........\...|./...-...|..|.|-.....-.....|........\....../..
............|...........\.....................\....|.....|/./........../.....................-................
.......\.|.\-....--../..........\.../.../.../......................\.............\............................
.............\/...../..........................|....-.....-.......\|...........-....|.........................
.-............-../......|.............-................../|....-...-....../|...-....--...\.......\..|.......-.
.......-......./....................\......................\.....|........../.......\............|..\../.../..
........................-.....\.......\........................./............................|......\..-......
...................-................./......|.....-....\\............./.....\.................................
.............|.........................\.|.....|\....../.......|..............\\../..................../......
-......\......./........\.-/...................|../-./................/.........................|......\.....|
..........................\...........................\...........................|...........................
....-...../|.............................-........./...-..................|..........\..\................\....
............/........-.-.................//..\................................-.......|.-............//....-..
.......-.....|.\........\...|....-......./......\.......-.......\...................../...\...................
...\.|..-........./........................-.....|..-............................\..-.........................
..../.........................................--.............|...................................\..../....../
..........\...........--........./.|.......\./................/.........\.|..|......\........-//............./
...\.|..\......\.......-\........\|......./.......\..|...........-..............\-..|...................\.....
..../........|..|.........................../..\....................|.......\.......................-........\
.....\.......\...\.|.........\.................|......|..-...................-.../.\...................|......
........\................./..............-....-..................|.....\|\................./...../............
.|................\../..........................|.....\.......................................................
...|.........................|........|...|...\.-.-...................\..|./..\\......|.../..................-
......-..................................|.................................\.|.\..-........\..................
.-..........\|..-.....-.\..-...............\........-.....................-.....|....................\..|.....
..../....-..............................-\................................................................../.
............./....................\...................|...........\.../.............-......-....-.............
........../....../..-.|.............\\......../.....................|....-..........\.........\....../........
.............|......\......../../..........|...........-......\|........\...........././....\..........|......
......-................../.....-................-..............\.-..............|................|............
...-...-./..................................................|.\..\........\-........-.................\.......
.......................\.\.........|................\....../.|....\.../..\.|\.....-.|..............-..........
..-.........-|...\.\....|.-.\........................\........................./.-................/..........-
.........|.......-.................\/......../...............\..|..................|....|..\..|.............\.
......\........................-......\..-...-..........-......./....\........................\..............-
.......\...-....\\...........................\......................./..|../........./................|....../
...............|...|..\..-......................../............\-............/.\..........-........|.........\
...-..\......|......\............/................/...\../.|../...........|-...........\.........\.....-..|...
.........\.....-......|..................-.....................................................-.............|
....../.....|.................|./....-\......................|...-..............|...\..-.......|.......-../...
................................/............\..........\................./............\.-.....|............/.
........\.............\.......|..................-.......................-....................................
....-.-................\..............-......-.../............\............................../|...............
............................\.\..........././........|..\/....-|...................\.......-...../.\..........
-.................../...\....../.|.........................../..........\...........\..........|......-.......
...|-|...............|...\..../|.............-...............\.........-....|-...................|............
..\\.......\.....|....\./\............./.|...../...\...........................-.......--......-.......\\.....
....-..//...../....................|....-...../\..................................|......................-....
......................................../..-...................../.......|.--......\....|..-..\...............
.......-..\........../..................-........\...........|..|.....\...-.....\../.-..\.....-.||...|..-.....
/./....../|...................-............/.....|..-..................................|........./\....-......
................/............................/......-...\...............................\..........-....-....|
.........\.....\......-.....\.........................-............./........./......\...................\....
.....................|...................|...........-............./........\.........../.................\...
........................................../................-|.......||....\...|......\........................
|..-.../|......-............-.....||...|...........-./....................../...\....\-........//......\......
../.-......../........./.-..|..|....||........./......-..\................../.....|.....|...|....|\...........
.-/..\...........\........\...............\..................|......../............-...........-..........|...
...|..|................|............./\....-....-...-......-......-................-................/........|
..-....\....|...../..........|..-./.\......./|.........\.....-|.......\.......................-...|...........
-.......\\...................-....\|........|............|.......................\.............\....../....\./
-......................................../.............-./\.........\.|......./|......../.....|...............
........-.\\\...............-.../............\.................||.............../../..........................
.....................\............\............................-..|.........\......................../........
\..././.....|....|.....-............\./....-.............|..-...-..........-.|....-...\..........|....\.......
.|..........|.....|.......\................................../......./.../...|....\...-..-...\................
..\...\......-..........................................-.........../........--..........--......|............
................................||...-.....|.....-.\..............\.|...\...............-...-.................
............................../..\..|....../.......\......\...-..|../............-.......................\..\.
./............./..|.......|............-.........|.......\../...................|....\...................../..
.|...................|\...................|.....................-.......\...|................-|...............
/|......./../.........\.................\............../.../......|....|......./....|-..........\.............
............|....\.............-.....-./|/.................../......./.\...-.........-..................|.....
.-.../..........................\\.......|.......|.....-........../........\.................|.|..............
....-.\....................../.-......||................/\\.........../..............|........................
\/.....\....-......|...................|.\......\.|............/...\.|.../................|.\.................
..-.\...............-......../.......\....../........-.......-\....../......|../..................|../........
..-./..........\.....................................|.........-.......|................/........|............
.............-....../......./......................|.............../............\..../........................
..|......-........|...................-...........|............../........................|../................
..../..........|-.....-......./....../......./.\.....\.........-...|......................................\...
....\......../..................../..-......|..............-.................||...........\.\...|/............
........\.............|.................................\......./.............-.......|..............\.-......
.....|...........-.............|..........-......\..................................|..-............\.../.\.-.
..................................\...........\...\.......\................\-.................../.............
......-............../...........-......\./..........|..\..................|...|....|...|-./..............|...
........\..|.\......................../..........\..........\.|..|../....\..|.....|.|..............\..-.......
...........-..........|..../.-........../..................|......./.................\.............../........
..........-..../\....\........./............/..................\..........-/................................//
.............-../.-.............\.............../-....-....|..../.............|...............................
........./............|....................|./........\...../................................-.......|........
........./..../..........\..\.....././.........|...........\..................../....../...\.........../.../..
.-....\.........\....-............/...................-.....|.....................|...........................
................-.......................|.........|.................................................\.......|.
...../............|....//...../................|.\...........|............\.....|-........|.........\.........
\..././-....................|...................-..............-..............|.........|....|............./..
..-...........................././-./...\-.................|...-.....-/........\....|............\-..-........
...............|...............//........../.......-.-......................-.........|.............\.........
../............/..................\\......../............................\................../........./.......
......|.\...............................................|................................/.........-.-........
....\.\...\..................-..-.................\\.....-....|................\.................|............
........................./.............-...|./.................\....|....\..|...|..........\-.................
..........|.............\..................\..................../.\.......|..................\/......|........
............|....\..\..../...........-....\....................\...........................-../...............
.....................|......../.././.............\......|.-......\.............-../...|...............-......|
..................-...................................................-.............\............./.|......-..
...\.............||...........................\........\......-......-..\...\...\............./-...........|..
...\........|...................|.......|.............|..-......../..-...-............/.........\....|........
......-...........|................./......|.....-./|..\\...............\|././...............-........\....\..

View file

@ -0,0 +1,141 @@
314412134515235343233533333536633455653353226524463545367577644655564375735567774443767545555476326253354625332434443364224465621314212153555
541151354452244522426632553456444465355436252633745744545656765664467373344353475666347765767443443552326263264235346622346265464551153535535
331313213153324653452333663333462335265624455475544677337533645646454544573377667566554353775343377532656434266344566626434262245532313441542
231231134242452536244266236256525426355273354474573763575656667355645557536446754366667563657447367737456645352222534556245645343351335322223
251433112552564352445455233433553362245337533756634643733533466354356373567633334767437674677465346746774546242625352644324265246422513313355
413125324132545243423242425355265226355444733776744656536465355674555733753474534534433566567674774473567333452433553242344623352255235253434
532355354346566256462226323353453233574773645645433345534463465454533556537575575577754774536656666577567366323533434336553634632645651225243
455311523432626356642246453352635354666745454767466646743434437774334444766744753773634355543363377575473337333424664332326565454236653544323
424523363662246263654465624464655447744774567556775663763465367677374675753355374345346677343654333775353543635753655256634466626335324551131
312234524445243642435564344443643546563334674463666677677375666374376637677377675656367674677655374445445436364656344562424423465563566224112
115435666634232345425362663436566563773563533376643646553453766464636476757674637467374456676436444363454454565354445236442434463546522456311
154534345264644332453643233644775666573434664657335643647354474373543563433577357373746663547554745737536477775465743462232356456544633335612
451266255244444535322452434645573365766537743665343557476666464758667467776574476764465334655477443443745655654457677624263534623665264555224
353335563222253235535444636573356337445367344474777333557878464768444788856675585565465366454733456455674536433473654575346243664464634353361
133423654653562566524555363736665736664674537436557377575766444544774854555847644678448674465647577673665776754454646667262236226252353332253
133244534342626454662664766673363454654775367333568448688558578768686448546868444748457676856473435435676655374655443447465552545633333543332
243466552334262456344733345534573753356536657446767756788575445478764548775685776647768646456856765643745556543743664466543662642344456546633
225656624252654654257373356646344537466547455766887558787658686656447855868447485884684656856578745535456436454746473564736542642544625222354
263225332334642334675643644754654536773763445878468566857854558584444644768557757487854646584847654777756335644546467463376674663436535646452
462346565445343656664446656746533643745447844866758554785454458448648877657447474444486777886656567775334434446577467565433575636665445223642
363266453445466566556667366355434346533355777566657774487686846454565466845574688847467448668876766446676776475563644443566363242625262335623
325363664656255465436433336773567347537767485744446565664446855866487664586568787776655755686868765886664344557456735673467475426333444333354
622523453334652767737546677766537644476465885765644778876688488446747664448447488668445647744766848776656844776733757447477443333425525625425
333623242525533576376533574476577337665748887566464644665446655885548856787747865488577777487546544876644587367343333376355575457243464345323
543454255433367553446637345433677465656546447845788656747548755757888785557588445647856758456654456888685858475473564764673634765655244332245
623536555425575563774673767455733665777686666786545674684485686454886457575558854685585754647856666454488644483445777757775736767455653333323
335365452534347455445473435765736686586454476877577676868665648588444785645788688755665567847847585545847774845545765767665374567754666353346
465462453636344566675354655574674445647778775756448777556676575896785898598558875578854754655544448684755674768743663367375367764556356656544
363442635343777335564633673354845878587776886578665748646577867786688655765785766556946866764484465548878588568456776747534365377563626244552
232634453453763747553644733568475457767854754657478566598876656677877858987888958665955775887757458758846446485486633766635574537637743535463
522344452575745446776443535457848555475857457855478488988789876956765857655568587967855966667854884755868658474447474543647465737337736454553
663552627334333773546633445548767755868645584584477759875859697897758656889957568796889865757587657865664687876775763343644433447356576623322
445264645556337754376544665585466787575557454745756756569865889888669678579697997988759885795864747457454586846847864776454355655747776434462
622455277467655667357753578774565877584888457466786879796679896785676566558958878758687656579956856668584545646457888846333776555447355326455
332544567353564566667655876454688564476674785685585555898896589897779866986569586598987767875687986855654688558578465866465363654354575635354
362352774453665775437766846688756656644468774687855675597596697959675558598777586676566558856799988477458485845764474846545665733565465642235
653443463447775343644765866587748864448654759898689676566898666986677759957898699679989767966696878566674676885568556746354374333576755645346
233457756564473374745676786648657667555644559576795697887955798889695765895777795769767775857776555687668866577657748875665546353337347453544
544435543735775756436586648877447574576649986595589858785976896678788775858975897998958798577699775668576788768487847776466567574473543737433
552254545736366367557746645875766864684655876967787578968965796566679766856567978896897569787898896679846454688458564765474667745344575656652
446576536675377537777877667464484755588965569999587859678868658589679797766778779556888989997779955859977746666655578676475336765356674466355
664473477475337634746565456787867874856975589795859955596796869957859878755688955799686898799975987695678655645557444554578533555356365636576
465574733563457536788876484884757745657879799597655969996679655767876986677677885995975575988689878558975568885475654565747543764777545434764
655353564364767347457778866577575747857576977959767669999755887968768679988668899777968856587559585695675755788768567745454887754734566654776
367447364467773735858756877784568848579768578757989966677688997788886686879996878778959688959859779665977976845865465575445443764647473556443
575575376547735375465674555454756677556699558557789786866688889777886986677798966766867857656867689689857999565775845768554668773553355667455
234337435764637437477847577878544788568595659969575976666789796968969867888879989998669978798695996588697968856484458578564864454363357443746
757374646667343374658776784548485699556687968567959887878767769896667677769799977697998887555798975859969987654847844667488486337577646667436
746675344636443355447847877775585975688786658585856976688798979766676667669777869966786696985578695567558879587875686667857658435634537537574
565477576353557754765856675584756757758869688899685888866867969967789996777977696786786799899578969989676858577478878648884558444634344565534
545776547376457656484767664474675785787867996876586886969967867667968766667869896988688866988899565575789556889485458685687857857634755536555
556547536534744464666677768654665678867877599566799896796696767679697779667679787798778776868867566879877875598887644644556565875437573346464
475674567766655748846675487577896855868786656856889676967777888896899798696668996799767868967695859567789998779678567645654866474475575474564
575776574667667488585664655566878858856696985666978969677996768866897769698998978797769697696678578875896978895756568847474676767653445435775
654337754774366757587856446454599578896669889566879786768967788796796669876779987979768676978667976655798586598867767646745874485743333475573
654535367644768656654887558678576586959758878969989678877897997899999966989878689799986869688867799655667586798667456578885664544463374435766
373454367345364747845477877778675566899885865996967677867679667777788676989889796668969976888798995987599977865979678558884576658675654335775
445765373433585588645685488858679558587596589669677997776969767976999889898898766997786967866698797999857865789796785754485546845444454775674
337734475564468456565466675695986676969896699869686898678978677788879779787799996887768688996869667576965976777685546448666856777733574373737
644734774466757856744886858488965696559799868986877886989867976897888778788788798986886797677969698965795977998975557467585758586844655756455
554577373345575856457564758579875559586586796866798868679677697988989997977997877768988676689966886665767569769698685685548846746574457776477
667557463566744755788558777855777886587799679787686877796677897998989989988989787886668788678666969975976669795676556888447866647567743646364
477373654454748646848578744889989655567667976978866867686997789989879798778898999797966898766997896877988557566598698448764657467667475673343
547767744463684588776576646599966657599868977798867767969869998988789788779979999878667887668677976995895669795776694454475565788475343635657
575346733753567857486747775687658558698895999787897796978778979899978798987797778998888699888676688686959695889576575786886446768854464455437
473546446375756484756475658876679886997566686887666679669897979779788997978979778799998867676769798987567787967859975765844867475587534537454
776453776365684567446656644967786587775958996676668967679898799998788799879898877877989898977976777678699685585766764777775447488756354556446
736736635634666666775484566586558589788997989786967767799887998789888988797899987888989886989697987667599676976788787665844667557685574343647
573544375367857645884646554755995555778899999998889786688779888888989988897997798979897867888697867777955555886985854554867878658455476654776
547366346654785856677675467857768875867789767867687996698877797797899878799797879777887699877699896968665989587996796455854847576445446464566
553774575776675458645746458988598759889577967677669966899798979999979999789878997799789966699879979775697777599869796745465885585456345737663
353767574665657756756574574787569598778898766697776969787797997797878998797878779887779986689876898989659798867989978566746888666457646435435
653737743445665787556877448595787969666796786787697768767778799999788897889878889979979888788689777869688958985877955585488544558456364563435
763637337773885888664576787665577575587575866776988989688778799898797888889889798798876887679867876995756675876698764657588677588473535647734
637644466754745688456758488895558797777587677768679999666877988788777879979897997898778676778876797665975669889776876777657444686464667776673
666575766736756646478667475789986767858855969986999798899899997877987998799899899987896677686676868779995578576986677485854676545866776337365
766455377434588788655477784898599856578797767798869686878899988797778797777877899788897777699996979975569757859898676546748776486667636474556
545447346666475474465466565586969777578988877798779686777788998788798997877998897979899997796697788985669755797567897486874854548465473567557
444655447566445854654474455756878599795979666889787989699799799788789899798878779887786786978766799797798756556977755677546455687663556373733
457756474767867685745767766688656959868969669698696779769987889977889997879978988997869666968688686686667595765685954465848754645545676346656
577777634634784475566585487766898679766857589876666797878786899778877977888988789997897987777866866875865657958858898886558674477546645373733
375564455343464778546576465699596776656969768977898766987868978799797977799899998977676887796966769685566567875598986866656546864673577335644
764536374744688766576577885877665755778667698767767896866976678787887997777989979797997897886879998588785565797599856764646476874865657375337
543643663577445575575746865856699797886966697787689988987898997887889778799878876968676879669667867865969569598866786777478684447473535476464
636376576444445784685557667858867858989886768887678798987997786899978898979778799676976968699687687696799958596989878545477776884836466676544
763557453467756688577756587779998976955765595888976888986678666799789998989886898897796979988899965969688858788595854765644557856563554676536
577357635456488886845878554769765556955985655979997878697999677778688978698787966866789866976999769896799668958869464854575446585434637564676
364747645336576587565657758877675688959786977998788886798766997696767666867669986699686998698989755758698855876979464485786565446476634357363
764673654455638867657864677868688686876669689896868776679986866978666986986777787686788676788988756558765565677587548746675558674337566464735
467553475334767444466644884457796887977895865685877786688968766788798869987667677976979679776875687896785677785585464887785478847566336676367
754553573564374878888686745468795559998559558576899666976769996769969687868797787688689676689897687688897755999976676746558645464445673675377
654645755747464485667558574456877887787569867679887798667687868677876778669689666779886968896876685659976676658686566557864768873645664376734
445544646666653788765567845564557669976567696868566987669896966988769778889996997766998998877788995567766676565676856665458647445467373676373
335345454544774365576884545776447679769795858986755876876678877988676979788677979897688799775658967569577968775874488767645745846353477357637
366377754753734477674448744864875789898856866979656686786676967688978696879889689678998668967576985558585659776884567855454458533567566333343
634577374346476446555445785448644766995595858979896666888979689876778998787897688787799698888955955598989698964778556874557885545653374555466
677556475565736667777484485656567599957978799986798886767978668896669897777678898796786667657569787669575865654655784846475888734563453447733
436473576775565774677876476556488659989779567768788785959799789889869898668776868679767999878696597975756768458548448585844656454736734654746
547357337753544344646667465664866846685869885977886995876969889768689977867696698867687576899598699757796587666875856478644854555674435777546
347756377665473476788767458886747667756788579676986758786598768688666796797777766975688995896569669597986656644477885868658863643356336436767
435655633356663457687474657867868586557857757898656955676959979987699988668797969575679668986989599968778575744456465555448545746745553656636
232735335633336435364776478856564678779895856986785956779795856697686755768967786866756967879579989575999767445845658488464367745456563766652
365534555754666343356858854544586845478695766698595578657657699589559657775566978578796968698978756676686864564748787854774355466336575533356
332456745574334636435755766547766858677477558867578676869797997655556578565658577689657675777885779856545854766587588785885553755574346447734
642637766374645667576784676645584544887786985679965689779986669967558768898687899778796895789897896869675566888667844764866335475676646746344
446266775465654344746545588648865455558567795956557678858587988789596567768697587755599776658585659584746544448586656576843675434737573434342
224663653636375747635334754667777785765845587767875669699965575665656696965569779879659798977576858957685655475765764488774657635437473366356
625426436574367576377455445457768877844667877696677657787998676675855585695556989557695768975657585787668568586645766544775754777736377573643
254365447437365344543734686478587446577464478577858696676989769786995956675995686669859566789766667744858454484774566846375675636477476676335
422222654656766733456576778578576885587687484547879668859979585659755658767565669789967569955759486556587466846657846867463337773463345653456
222663564645657663455455778578554485465786786857688856768877956578786888557568998985866787655554855578544846755487777674735775777464734622546
254425667467346335477743536684857855446886765847878588867978695556586758898799875967867665697587665575484878864786575464647575364434365244232
545624253753775647574566377467768786547854476484446767697887679959597569976686666989776986887485646865745586658564643373645345733746736652366
445252323737357543544335573665464678448566785686457785666686788888585959758897989777867765544747588555474847478855647656665644764466453436244
624334552663634667443673377457587668454844544466745588644789865859879759688676686967574556546474878564576746445776434547637734437356426553336
646342663527575634777653454344647768685555578668685585747484849669788588997988769574756864788445847464484765785557365333564764664464523466625
433646226555554733443535333646458856474776865656467548576566554476676858654688585874478857475648667678875678885646635637756557467755533632524
524224632242777744344347444334366578578575877467887886555676854678445574565875655468577574858767577688754564753666644467764676465333565552463
332524536526246557754755777633656654474784458587665548686487884874566865658745654485687757788578847456445876553653343573443456766725335256642
232554544665423736756756355734633455656467675747788778876765845585468587877455867666855787577686557854444777576433354455347456475525443524464
442536554246245356477665466553537546467888677788466877467686486657667685476657657467447667888766845477874466347633375765374567555252355555234
466244246525246247457757744364447343554644867457546676778874586655685744567645544464686645886845556867444547446577475333544476334534663633245
256564536546536663747336555334445355353685446444654655484676486875548856554568564566857447765885764477666734375743576475547457262563335256256
422666323232323265733677534764557654535733767547847748648476454756566877767566745674454856755477854786445654433454543465347365665232624666552
424322552553422235336774436334655656753464566788846587546678666644787566484885754665684866448466644745643776645476477537765745622326366565354
345543454253666434265365537663576573436433745778877446564777478457575846747454774548745457745447684757344355355745445557775262543464556444634
336332264656464436433635346557737336357437635546658478488856868457865746755647874844656478545747333465337573563736436377474556263642424323626
522645624243565434556446456664775367336437757757366675878887787775687654585666655745655846458333674745667336355753654677662464322345536366444
555355255625526523556533365744375654336575555355636447444755865586587665788476558447664564566644433656467374766543333653256234262433543666243
352442235334564446432432343454456456335337663466436474364547647547857775677445776846844647434465354643576547346346673562543352236432233355555
513442263654563562566354553554666563746565354466655433636643784876456456474465676577343673465465554337444354653537646325625464335245434545645
412166442223555666442324255746337746664773367543767373733737677365555364633674664745736555765655345666573457674453644222662456622244462436234
335154546633442632244453333547453533644646357535376775746533656673644367657346633466673535437637674353457475533764463643233554553226563253531
344355262636555362325466655254444447336435574534775754465675544754737373636474353733766573766355474364665466456367352423244564562442343664431
311413135435554264436263252552354346437465375467563776374733477357475637647547553646677354774353547337664736454445366643346246333553342424441
535433415243554224545433322662227453333764757337343766763564757456745673733566554346344364757363656755345357754222664244523544535662564243331
134111534364445323222623622364552434633767676433737455655363547774354473747466434563657563745543347455674446543443655424426366324335634323325
351255341465626465234256523662254632653447333533467334465363354667336765477454734657366335356637333466453444525332662564422333455463641114144
552341443344524565642265436465366522436473534654637564453564353534556774457633576376544536465446545333744663365656323344662535233245324445313
221252532115466236652623632522433654526676365575647434775344354564367573777346436744774454673664564335344245253635255564364626663532252232132
144524115433215643653323636235532663522464736374347774777656443757553555345734367444567773663755546434263345354363654655245244254515334312415

View file

@ -0,0 +1,738 @@
L 4 (#3db750)
U 10 (#0e0433)
L 5 (#526490)
U 6 (#3e9193)
L 4 (#526492)
U 5 (#4418e3)
L 5 (#3ad2e0)
U 5 (#579f63)
L 4 (#118202)
D 5 (#411263)
L 5 (#135ac2)
U 4 (#1196f3)
L 4 (#5df7d2)
U 5 (#22e353)
L 4 (#1615c2)
U 5 (#17bc73)
L 9 (#038720)
U 6 (#16cff3)
L 7 (#57beb0)
U 4 (#16cff1)
L 6 (#3da480)
U 8 (#43bb73)
R 4 (#2c2540)
U 8 (#374033)
R 9 (#4f95d0)
U 7 (#374031)
L 9 (#0ff0e0)
U 8 (#12b433)
L 3 (#29b7c0)
U 5 (#57fa93)
L 4 (#3b4d90)
U 5 (#175463)
L 7 (#2945d0)
U 3 (#151b23)
R 6 (#34c720)
U 2 (#1f0a03)
R 8 (#3d8772)
U 4 (#3eba93)
R 7 (#0e4442)
U 2 (#012851)
R 2 (#2618e2)
U 8 (#5ca961)
L 3 (#0a2972)
U 3 (#5980f3)
L 4 (#43a0a2)
U 2 (#0450c3)
L 8 (#09fae2)
U 3 (#320053)
R 4 (#52e1a0)
U 4 (#03ce91)
R 8 (#330070)
U 3 (#03ce93)
L 5 (#43c770)
U 3 (#3d18a3)
L 8 (#488e60)
U 5 (#2d0d63)
L 7 (#1e78d0)
D 4 (#1680c3)
L 9 (#31ee60)
D 3 (#483563)
L 4 (#0c6710)
D 3 (#467ed3)
R 3 (#02df40)
D 2 (#1e2ad3)
R 10 (#3f20c2)
D 4 (#447ef3)
L 5 (#3f20c0)
D 7 (#07f723)
L 6 (#1a71e2)
D 7 (#23f173)
L 2 (#079be2)
D 2 (#5cd243)
L 7 (#3d9fc2)
D 3 (#107ee3)
L 3 (#165230)
D 4 (#69e463)
L 9 (#2159c0)
D 2 (#1dd863)
L 4 (#47e9a0)
D 4 (#1bff13)
R 10 (#12df90)
D 3 (#364e23)
R 3 (#517e12)
D 3 (#0a71a3)
L 8 (#2edfe2)
D 8 (#339f93)
L 5 (#27d7e0)
D 8 (#4a91f3)
L 8 (#44e320)
D 9 (#0ea943)
L 4 (#13a2f0)
D 5 (#6356e3)
R 10 (#05f220)
D 4 (#2644a3)
R 8 (#65bb92)
D 4 (#2ae573)
R 10 (#65bb90)
D 4 (#312573)
L 8 (#3b10c0)
D 6 (#154f21)
L 5 (#018462)
D 5 (#552bb1)
L 7 (#018460)
D 4 (#0a3be1)
L 3 (#2efbf0)
D 12 (#17a7c1)
L 4 (#30d400)
U 4 (#624c61)
L 7 (#38d3f0)
U 3 (#214351)
L 11 (#027d02)
U 4 (#3bdac1)
L 7 (#027d00)
U 6 (#13f621)
R 6 (#1c4f70)
U 6 (#1c1f81)
R 5 (#30ce40)
D 6 (#149481)
R 7 (#0d93b0)
U 5 (#491791)
R 7 (#50ae60)
U 5 (#128a91)
L 4 (#1f7990)
U 7 (#010331)
L 6 (#253e60)
U 6 (#1f2643)
L 3 (#232c10)
U 5 (#3d8083)
L 6 (#294c32)
U 10 (#3fcf53)
L 3 (#294c30)
U 7 (#1c9cd3)
L 8 (#26b342)
U 2 (#2107e3)
L 6 (#26b340)
U 6 (#3a17c3)
L 8 (#232c12)
D 6 (#3199c3)
L 7 (#34c162)
U 9 (#0a6463)
L 4 (#2f5132)
U 9 (#1ef1c3)
R 6 (#2318c0)
U 3 (#21b8f3)
R 3 (#40f9d0)
D 7 (#1a5473)
R 4 (#28adf0)
D 2 (#2e6181)
R 7 (#00d3f2)
U 9 (#355a41)
R 3 (#00d3f0)
D 10 (#1b04c1)
R 2 (#0ddf40)
D 3 (#298111)
R 4 (#42a8e0)
U 2 (#5b93c1)
R 4 (#4282b0)
U 11 (#25af91)
R 3 (#0ff3e0)
U 7 (#002661)
R 5 (#365a20)
U 10 (#3382c1)
R 6 (#3a83a0)
U 3 (#376591)
R 7 (#0894a0)
U 6 (#379891)
R 5 (#44e3d0)
U 3 (#41e791)
R 6 (#0133c0)
U 4 (#070071)
R 4 (#0627e0)
U 4 (#33bea1)
R 7 (#456812)
U 5 (#5ac051)
R 7 (#4254e2)
U 7 (#49a231)
R 5 (#0e82b2)
U 3 (#14b5a1)
R 4 (#320942)
D 8 (#126031)
R 8 (#103262)
U 7 (#3b7aa1)
R 4 (#103260)
U 5 (#30f9c1)
R 5 (#29ced2)
D 8 (#1ac681)
R 7 (#62bf32)
D 4 (#1a4041)
R 4 (#14df02)
U 8 (#443071)
R 4 (#47db32)
D 10 (#1b21b3)
R 4 (#129c02)
D 2 (#3e68b3)
R 11 (#533d52)
D 3 (#09d713)
R 3 (#058242)
D 6 (#52db63)
L 7 (#1c7002)
D 5 (#65d703)
L 4 (#1c7000)
D 7 (#0965f3)
R 6 (#1c20e2)
D 7 (#1d2273)
R 5 (#4389b2)
D 5 (#044e11)
R 4 (#27a040)
D 2 (#1178a1)
R 6 (#120170)
D 9 (#44ebc1)
R 3 (#120172)
D 9 (#152cc1)
R 4 (#27a042)
U 3 (#1f7081)
R 12 (#2fcb02)
U 2 (#1d0f31)
R 8 (#42cb20)
U 4 (#43ab11)
L 4 (#42cb22)
U 2 (#377091)
L 9 (#3b2d12)
U 3 (#1b21b1)
L 7 (#51b2b2)
U 6 (#3caf91)
R 10 (#4018c2)
U 5 (#2d7c51)
L 5 (#525612)
U 4 (#0c3071)
L 4 (#16b6f2)
D 6 (#400511)
L 7 (#263730)
U 6 (#13acb1)
L 4 (#42d5d0)
U 3 (#47f3a1)
R 9 (#4018c0)
U 7 (#154771)
R 2 (#2fbd52)
U 3 (#3a1df1)
L 8 (#51aed2)
U 7 (#4edb11)
L 3 (#120e82)
U 7 (#64c5f1)
R 9 (#0937d2)
U 4 (#1c4f21)
R 7 (#4551f2)
U 5 (#5a5493)
R 4 (#1edfb2)
U 5 (#169093)
R 10 (#37eac2)
D 3 (#188731)
R 5 (#0f1a82)
D 5 (#585df1)
R 3 (#120232)
D 2 (#2ae331)
R 8 (#2287d2)
D 5 (#103e81)
R 6 (#4690b0)
D 4 (#0772d3)
R 7 (#3305c0)
D 3 (#0772d1)
L 10 (#38f400)
D 6 (#380261)
L 6 (#29e240)
D 6 (#06f581)
L 5 (#439b60)
U 12 (#201da1)
L 3 (#402420)
D 6 (#144c91)
L 9 (#22f100)
D 4 (#3870e1)
R 6 (#0c31f2)
D 2 (#03ac33)
R 3 (#5bc432)
D 9 (#137063)
R 3 (#26ea62)
U 4 (#137061)
R 6 (#450eb2)
D 9 (#03ac31)
R 5 (#43b222)
U 9 (#05c961)
R 5 (#4055d0)
D 4 (#20af11)
R 7 (#1c10f0)
D 5 (#3943c1)
R 2 (#26e682)
D 4 (#1129c1)
R 8 (#358042)
D 4 (#070c01)
R 5 (#2956d2)
U 7 (#191821)
R 3 (#224300)
U 3 (#2af351)
R 2 (#0feeb0)
U 6 (#23cac1)
L 5 (#5dfd50)
U 5 (#2a7f41)
L 3 (#527870)
U 5 (#2a7f43)
L 8 (#4aaf60)
U 9 (#287f01)
L 2 (#13a150)
U 4 (#269d21)
R 10 (#35e962)
U 7 (#281351)
R 8 (#35e982)
U 4 (#281353)
R 9 (#15be82)
U 3 (#14d581)
R 3 (#251f22)
D 3 (#42a4e1)
R 4 (#04bf90)
D 9 (#1f56e3)
R 6 (#3438d0)
D 10 (#1f56e1)
R 4 (#36fdd0)
D 9 (#0cd891)
L 4 (#38caa0)
D 6 (#0cd893)
R 6 (#11cc20)
D 7 (#2ca3a1)
L 6 (#3e7d60)
D 7 (#271f11)
R 4 (#20ba00)
D 6 (#53c2b3)
R 3 (#11a9f0)
D 7 (#34ada3)
R 8 (#567fe2)
D 7 (#1f43f3)
R 7 (#10e032)
D 3 (#515b63)
R 7 (#1a0d52)
D 2 (#06c953)
R 3 (#1bd910)
D 8 (#339df3)
R 6 (#483b90)
D 8 (#2b9943)
R 5 (#040ff0)
D 8 (#249a13)
R 2 (#4a2a82)
D 2 (#2be7b3)
R 10 (#1dfa12)
U 4 (#23ec53)
R 4 (#4e4080)
U 4 (#431f73)
R 7 (#332ce0)
U 7 (#151433)
L 6 (#532250)
U 6 (#281c83)
R 6 (#3b2fa0)
U 3 (#580361)
R 2 (#381920)
U 4 (#423571)
R 3 (#365c20)
D 10 (#357b83)
R 4 (#2bc910)
U 10 (#17cef1)
R 6 (#0d2f50)
U 2 (#496f61)
R 5 (#0d2f52)
U 4 (#0a78e1)
L 5 (#0db930)
U 6 (#057ac3)
L 5 (#065930)
D 6 (#4034b3)
L 5 (#065932)
U 5 (#2607c3)
L 3 (#3772f0)
U 6 (#260ff3)
R 6 (#0a16c2)
U 5 (#0984c3)
L 6 (#4ebf82)
U 5 (#0984c1)
L 4 (#181ef2)
U 9 (#1d1d53)
R 4 (#384730)
U 2 (#219013)
R 6 (#065250)
U 6 (#2232b1)
R 5 (#3f4030)
U 5 (#471ca1)
R 6 (#33c210)
U 3 (#37cbe1)
L 7 (#53b020)
U 6 (#070661)
R 6 (#2199f0)
U 9 (#1d8d61)
L 6 (#35c702)
U 4 (#13cc81)
R 7 (#22f592)
U 3 (#36f1d1)
R 6 (#17d3d2)
D 7 (#4a1db1)
R 4 (#161810)
D 12 (#019c31)
R 4 (#46b5a0)
U 9 (#4bc491)
R 4 (#13c2b0)
U 2 (#07bdd1)
R 4 (#1bce00)
U 8 (#48c791)
R 5 (#54aa00)
U 3 (#079a91)
R 5 (#19b550)
D 4 (#2ff601)
R 7 (#1560c2)
D 10 (#3afde1)
R 5 (#1560c0)
D 5 (#19b1e1)
R 4 (#29d140)
D 2 (#1c83b3)
R 6 (#274ae0)
D 9 (#4f3ae3)
R 4 (#2e2280)
U 7 (#12aea3)
R 3 (#121630)
U 9 (#590343)
R 5 (#121632)
D 8 (#0f1813)
R 8 (#2e2282)
D 5 (#01f683)
R 4 (#0b3350)
D 8 (#2582f3)
R 2 (#358bc0)
D 8 (#495e93)
R 2 (#2b6380)
D 6 (#202a83)
R 2 (#025d40)
D 4 (#0600f1)
R 6 (#492c30)
D 9 (#310791)
L 8 (#06d2c0)
D 4 (#328091)
L 2 (#060230)
D 6 (#1d2163)
R 10 (#04a2c0)
D 4 (#201cc1)
R 5 (#047b62)
D 4 (#0e0ec1)
R 4 (#17bd32)
D 7 (#560041)
R 3 (#41b672)
D 5 (#1c40b1)
R 9 (#01fea2)
D 4 (#018691)
L 7 (#13d742)
D 4 (#56c211)
L 5 (#2f7662)
U 4 (#0e8e01)
L 3 (#46d980)
D 5 (#402761)
L 7 (#1e38e0)
D 8 (#402763)
R 3 (#3e28e0)
D 8 (#075c91)
R 3 (#4cd990)
D 2 (#1c83b1)
R 6 (#0df200)
U 6 (#4877c3)
R 2 (#0ab900)
U 4 (#5d14b3)
R 8 (#3f7a60)
D 5 (#061dd3)
R 6 (#265810)
U 3 (#4d7453)
R 4 (#113c80)
U 4 (#300853)
L 6 (#45ab00)
U 2 (#1ced03)
L 6 (#0eace0)
U 5 (#264f53)
R 12 (#41dc40)
U 3 (#199863)
R 5 (#3b2dc2)
U 10 (#0f4223)
R 4 (#482cf2)
D 5 (#1face3)
R 8 (#321642)
U 4 (#56f7a3)
R 4 (#321640)
U 10 (#2b6ef3)
R 5 (#325182)
D 5 (#4040a1)
R 5 (#02d5b2)
D 9 (#61d2d1)
R 8 (#3d5d32)
D 4 (#0f4221)
L 7 (#176402)
D 4 (#03b113)
L 8 (#01d860)
D 3 (#136273)
L 7 (#206090)
D 9 (#0ed183)
R 3 (#21eee0)
D 3 (#4b9c73)
R 4 (#27e9e2)
D 5 (#097b83)
R 5 (#27e9e0)
U 5 (#50f633)
R 5 (#16b820)
D 4 (#138331)
R 5 (#34b750)
D 8 (#5413f1)
R 7 (#134940)
D 7 (#4d4881)
L 6 (#53aa40)
D 7 (#00d6d1)
L 5 (#0a3520)
U 12 (#3c9a03)
L 3 (#4c3bd0)
U 5 (#3c9a01)
L 7 (#24a000)
D 10 (#0fb971)
R 5 (#4631b2)
D 3 (#3f5441)
L 8 (#01d1e0)
D 6 (#46ff21)
R 8 (#3ee970)
D 6 (#00a091)
L 5 (#51a350)
D 4 (#00a093)
L 8 (#46c180)
U 4 (#365041)
L 2 (#47fbe2)
U 4 (#226d01)
R 4 (#67b392)
U 10 (#226d03)
L 4 (#191b92)
U 4 (#416111)
L 2 (#105522)
U 7 (#5b2ce1)
L 7 (#4631b0)
D 8 (#334d41)
L 7 (#1e4350)
D 6 (#3021b1)
L 3 (#299130)
D 3 (#2b4123)
L 3 (#414a00)
U 5 (#2b4121)
L 8 (#0fafb0)
U 2 (#254f91)
L 4 (#3b0f82)
U 4 (#070d61)
L 4 (#0a6292)
U 6 (#070d63)
L 6 (#3518d2)
D 7 (#2b8b01)
L 7 (#1a4b62)
D 3 (#27a0c1)
L 5 (#66c7d2)
D 6 (#37f161)
R 3 (#482732)
D 5 (#1baa01)
R 9 (#45b112)
D 2 (#1baa03)
R 6 (#07fad2)
D 4 (#2f35a1)
R 5 (#4d0002)
D 6 (#1fa731)
L 8 (#696b42)
D 6 (#31c791)
L 9 (#08fd42)
D 2 (#0052f1)
L 3 (#065eb2)
D 5 (#2418b1)
L 5 (#3dbd92)
D 9 (#10bcf1)
L 5 (#09a212)
D 7 (#4ac071)
L 2 (#0c2842)
D 4 (#0299a1)
L 6 (#39aa72)
D 5 (#1eaff1)
L 3 (#302492)
U 4 (#4588d1)
L 8 (#13af62)
D 4 (#35a861)
L 7 (#4c5b02)
U 5 (#2dd353)
L 3 (#0077d2)
D 5 (#0ba793)
L 12 (#38e632)
D 5 (#476a13)
L 5 (#35f252)
U 7 (#5311a1)
L 2 (#047cf2)
U 8 (#267d63)
R 4 (#0affa2)
U 9 (#6a7183)
R 4 (#25b702)
U 7 (#0ab9d3)
L 11 (#1dd902)
U 2 (#0f0bd3)
R 11 (#17dea2)
U 6 (#0c2d03)
R 5 (#18de02)
D 11 (#52bf93)
R 4 (#18de00)
D 4 (#1199a3)
R 4 (#0ddee2)
U 3 (#063403)
R 6 (#46dcc2)
U 5 (#11b683)
R 7 (#0f98c2)
U 3 (#610763)
R 6 (#17f292)
U 6 (#312333)
R 4 (#2fd3e2)
U 4 (#083981)
L 6 (#4b2332)
U 5 (#083983)
L 7 (#161f42)
U 3 (#097733)
R 8 (#079502)
U 5 (#28a1b1)
R 5 (#60e982)
U 5 (#174aa1)
L 4 (#60e980)
U 7 (#2d1801)
L 5 (#3a7fc2)
U 6 (#267c01)
L 8 (#10ae32)
U 5 (#64c141)
L 3 (#39bea2)
U 4 (#0061e1)
L 2 (#03c742)
U 9 (#00fa21)
L 5 (#3f4a42)
D 13 (#0048e1)
L 3 (#21f600)
U 5 (#13e0d1)
L 5 (#57fcf0)
D 5 (#13e0d3)
L 9 (#4e0b20)
U 5 (#2fbea1)
L 10 (#1d7ee2)
D 6 (#5a3821)
L 4 (#187d12)
D 6 (#02da81)
L 5 (#39b022)
D 6 (#1e48d1)
L 5 (#0a01a2)
D 3 (#4f90e1)
L 7 (#0b91d2)
D 6 (#269903)
L 4 (#322902)
U 5 (#412583)
L 10 (#322900)
D 5 (#07dcc3)
L 4 (#416db2)
D 2 (#0118f3)
L 6 (#002942)
D 3 (#46c203)
R 10 (#1ec1c2)
D 7 (#0b31d1)
L 10 (#48d2b2)
D 6 (#499a71)
L 4 (#00dc22)
D 3 (#1adf01)
R 10 (#20c8b2)
D 8 (#2376b3)
L 10 (#34ebc2)
D 8 (#119bd3)
R 4 (#393252)
D 12 (#3a98c3)
L 3 (#6119f2)
D 10 (#22a903)
L 8 (#0f5442)
U 9 (#4466f1)
L 6 (#32ebf2)
U 6 (#291b41)
L 8 (#089fc2)
U 3 (#171d13)
L 6 (#4607a2)
U 6 (#3a53d3)
L 3 (#4607a0)
D 4 (#1c1153)
L 5 (#3aa062)
D 3 (#07ed63)
L 10 (#285362)
D 3 (#2033d3)
R 8 (#053532)
D 7 (#550e63)
R 7 (#233902)
D 7 (#159493)
L 3 (#428bc2)
D 3 (#4d6bc3)
R 10 (#434cf2)
D 2 (#220413)
R 5 (#3b8d52)
D 5 (#2d9a53)
L 6 (#24c242)
D 6 (#192663)
R 4 (#084250)
D 5 (#42e773)
L 4 (#580d40)
D 3 (#221923)
L 3 (#2c4a70)
U 5 (#1955e3)
L 2 (#22aa00)
U 9 (#325ae3)
L 4 (#45a220)
D 5 (#1b6af3)
L 5 (#2e7230)
U 7 (#47b843)
L 6 (#4786f0)
U 8 (#004a03)
L 8 (#25caa0)
D 4 (#2857e3)
L 6 (#2bc040)
D 7 (#216fc3)
L 5 (#28ac22)
D 4 (#0c70e1)
L 4 (#27c792)
D 9 (#0c70e3)
L 8 (#3ccc22)
U 10 (#236703)
L 5 (#248f22)
U 5 (#351f23)
L 8 (#1cdae2)
U 9 (#196223)
L 4 (#262512)
U 5 (#18a9e1)
L 6 (#374d42)
U 9 (#35d761)
L 3 (#1a1ad2)
U 2 (#357863)
L 5 (#124822)
U 5 (#02f933)
L 3 (#09dcf2)
U 3 (#51fde3)
L 8 (#09dcf0)
U 7 (#41c033)
L 6 (#1ddaf2)
U 7 (#15c193)
L 3 (#609412)
U 7 (#0a4e23)
L 8 (#2d99f2)
U 5 (#01ac13)

View file

@ -0,0 +1,753 @@
vhh{m<1253:R,R}
fz{x<607:hgz,A}
nt{s>1658:A,m>2167:R,x<1701:A,knr}
sk{m<662:R,R}
jmf{a>994:A,x>2248:A,s<202:R,A}
vkg{m>304:sv,m<201:lqf,gc}
pd{a>714:R,s<705:R,A}
drf{a<743:jhr,s<2525:bq,jtz}
dnc{x<2550:A,x<2871:A,s<3255:A,R}
sdd{m<3059:R,x>1469:grz,a>643:A,bcm}
bcd{s>1882:ctg,s<1552:sbv,mz}
qlc{m<1024:qvh,vx}
pgt{s<871:R,A}
ss{s<2152:R,jq}
xlv{m<863:gdq,jm}
vf{s>3033:R,s<2916:R,A}
qb{a>1142:lg,m>792:R,A}
hbj{s>1495:R,m<3875:R,R}
lb{a<977:gg,x>674:fxn,zzp}
jjp{a>1402:jzd,a<903:xf,bgp}
xz{s<2053:nn,m<819:jbc,m<1387:rrq,zl}
jl{s>2490:A,x<1531:A,A}
glc{s<861:A,m>625:R,A}
sz{s>3282:dk,x>3252:qjx,vfv}
bn{s>789:A,m>376:A,A}
bk{a<3606:lpk,a>3817:fv,mxd}
xcm{a<1300:A,A}
tqs{a>1227:lzv,s<1984:ql,btm}
qlh{s<1420:R,R}
jfg{m<757:A,a<1311:A,m<1268:A,R}
rpc{m<1054:R,A}
ctn{m>2884:npp,s>1983:R,m>2664:bbl,vq}
zkr{x<918:R,a<2882:A,A}
rfl{s>3583:R,a>353:R,A}
fxn{a<1011:A,m<634:kpz,m<1226:R,R}
lbs{x>2854:R,a>785:R,A}
zr{x<978:A,R}
zc{x<3640:R,m>631:R,A}
vqc{s<3350:R,R}
sq{m>1329:R,R}
hqz{m<3697:ngb,x>892:xhv,R}
gxx{m>968:sn,a<126:qm,x<3104:rtz,zm}
jfp{s<1597:R,R}
rgx{x>3360:hd,rdn}
zx{a>2698:xls,zp}
bhm{x>3186:A,s>2907:js,lt}
sn{a<138:qfp,s>1828:kkb,nc}
hnj{x>401:A,R}
hq{a<2585:vbp,x<1122:zkr,m<3897:A,lff}
plb{x<3671:A,a<921:R,A}
xvn{a<3364:A,R}
hpj{a>519:A,a>315:A,A}
hn{m<1115:A,x<2632:R,x>2764:R,A}
gg{x>897:zhq,s>1653:qs,R}
ck{m<2051:R,x<901:R,A}
qfd{s<3141:A,m>1998:A,m>1909:A,A}
vc{s<409:bv,xs}
rd{s>1755:nq,qrp}
gc{s<2493:mmv,m<256:nk,kdx}
td{x<2197:R,x>2608:A,A}
qpx{x>1028:A,R}
cb{m<785:cjn,s>2054:dnc,xm}
bgn{s>3068:A,R}
rh{s>2433:A,a<651:A,x<3472:R,A}
tdc{s<3243:R,a<2939:R,a>3382:R,A}
smk{x<3796:lq,x<3880:R,s<1792:zs,R}
mkn{a>2659:A,a>2628:A,a>2621:R,A}
tz{s>2615:R,R}
qqn{s>995:A,a>56:R,R}
jlq{s>1442:pnl,a<2722:mkn,s>645:dhd,mcg}
cjn{x>2243:R,m<709:R,x>1956:R,R}
zjf{s<2605:ts,x>3507:fr,kr}
vfv{a<444:zmb,R}
pht{s>1905:ck,m>2063:R,s>991:A,A}
hj{a>3369:R,x>255:A,A}
rlb{a<2239:R,x>3333:A,A}
cls{x>651:R,m<3664:A,R}
dh{m<3872:R,s>2643:A,s<1996:A,A}
zs{a>1056:A,R}
hd{x<3618:bf,s>1990:R,s<805:pb,A}
rch{x>274:R,x>136:R,bs}
xt{m>958:gp,x>1443:tqt,x>713:mh,A}
mv{s>754:R,m>997:R,s>359:A,R}
ht{x<2088:A,R}
ts{s<1514:R,a>1255:xc,s>2161:R,zc}
hlp{s<3320:R,m<2175:A,a<3517:dlb,qh}
bt{x<324:A,A}
vr{s<299:R,x<1347:A,A}
kkz{m>607:R,R}
gz{x>1177:A,s>3045:gcd,a<748:xj,lv}
ptn{a>1251:R,A}
crf{s>2533:bqq,m>3663:R,s<2209:A,A}
pdk{s>2676:vlq,m>386:jkj,dn}
ptb{s<557:A,x<970:R,A}
rsr{m>3073:jhn,rct}
bbc{a>3016:prh,a<2607:zhz,a>2815:fjx,jlq}
sbv{a<1373:A,x<1473:R,R}
jhn{s>2149:tdc,a<2796:cgr,A}
lt{x>2928:A,x<2780:R,A}
hlj{s<492:R,x>1589:A,R}
lbx{m>2195:rt,a>3305:xbd,pht}
zl{x<3098:vjg,s>3015:A,s>2644:R,A}
zmb{m<3304:R,A}
cv{a>2201:A,R}
bqf{x<1277:R,R}
rg{a<3585:ljp,m<2211:A,x<3630:A,R}
mg{s>2602:fn,A}
hc{m>464:A,R}
qj{m<1135:bqf,m>1244:R,sj}
mkg{s<2420:R,R}
kt{m>2215:R,x>3386:A,x<3107:R,R}
jpj{x>1211:A,x<1089:R,A}
sb{a>1109:A,m<1078:R,A}
sc{a>803:A,A}
dtt{m>334:R,R}
sj{m<1177:R,m>1213:R,A}
jv{s<2957:A,a<689:zz,xqx}
nz{a<3414:R,a>3627:A,R}
hm{m<1514:A,s<1415:A,x<439:A,A}
rdn{m<863:A,A}
nx{s>817:A,m>738:A,m<651:R,A}
zhq{s<1894:R,A}
gs{m<2619:xn,mf}
fhq{x>1057:vrs,s<2274:R,R}
vx{s>2163:dzp,m<1317:qj,m>1518:bnf,ffv}
kj{s<2020:jp,s>2358:pm,x<1307:jkp,hv}
tj{s>710:A,A}
dzp{a<1315:R,a>1344:A,x<1344:R,A}
ffd{x>853:A,s<3210:A,x<366:A,qv}
xvv{a<599:R,a>844:A,A}
vj{a>50:A,R}
mnq{a<1168:A,x<2692:A,s<612:A,A}
zzs{s>821:R,x>588:R,A}
lz{m>3378:A,s>1821:A,A}
fm{x>1486:R,m<2571:A,a>1309:R,A}
ll{s<553:R,R}
crl{m>2478:ctn,s<2428:rg,hlp}
tr{a>520:rgf,a>486:fnq,kk}
xh{m<3422:A,A}
ng{a<779:R,s<926:A,R}
kgp{a>1024:R,a<983:A,A}
hpl{s>904:A,a<1300:R,s>558:R,A}
lfr{s>877:hs,a>360:cbs,R}
lxk{s<851:prx,s>1176:tp,s>1014:R,dhp}
md{s<799:qt,x<620:vml,a>3124:nm,hq}
nc{x>2858:A,dj}
zm{m<352:vb,x>3441:cc,m>578:vvj,sl}
kdx{m>282:R,m>268:R,R}
jd{a<2886:R,A}
gp{x>1532:A,m>1022:A,m>999:A,A}
mc{a<869:R,x>960:R,x>546:R,R}
mqs{a>473:R,R}
rcq{m>3330:ffd,sdd}
xrq{m>785:A,x<416:hj,m>700:A,nz}
lhd{s<2000:A,x>376:R,R}
jf{s<1662:R,s>2786:lj,m<244:pvz,A}
vjg{x<2497:R,x<2749:A,m>1548:A,A}
pk{m<3621:R,A}
njz{s<1939:A,A}
zvq{m<230:R,A}
hhj{x>2664:R,x<2502:A,R}
vbp{x>1084:A,s>1181:A,R}
npt{a>1293:klr,mxh}
spt{a>406:R,A}
ffg{a>298:A,s>1625:A,R}
xf{a>559:fg,x<1682:pf,a<362:gxx,qqm}
czb{x<2169:vd,m>579:hsk,a<735:gm,jf}
cq{m>605:A,x<937:A,R}
mxd{s<2598:A,a<3726:xl,m<3903:A,bgn}
zh{x>1813:R,R}
srn{m<1000:fsx,R}
tb{x<2314:tts,s<1629:gzg,x>2644:kz,mg}
bdt{m>340:A,s>3192:R,A}
kp{x<931:kxg,x>1022:R,m>1257:mzl,sb}
zpt{m<699:A,a>1194:A,s>3079:R,A}
fk{m>759:R,s<803:A,qlh}
tcf{a<205:A,m>292:A,a>410:A,R}
grr{a>2840:A,s<3459:R,m>3809:R,A}
hg{s<2052:R,m<2485:R,m>2555:A,A}
nkb{s>1347:zr,x<734:gkt,s<583:pj,lfr}
mzl{a>1112:A,m<1575:A,x<965:A,R}
jbc{a<396:cmx,a>419:hc,R}
fx{a<3812:A,m>3924:R,m<3887:R,R}
pmb{a<3384:R,a>3487:R,s>3022:A,R}
gm{m<364:R,m<438:R,R}
bs{s>1109:R,A}
dc{x<1435:bqk,m>419:glc,m<242:hlj,hpl}
ctg{x<1283:A,a>1373:A,m<566:R,R}
bvp{s<2372:A,A}
zp{a>2648:A,A}
hr{x<2598:R,R}
mxh{m>1096:A,a>1255:R,vqc}
vg{s>1216:A,x>102:A,a>3158:R,R}
qv{x>561:R,m<3759:R,R}
jhr{a<662:ch,A}
smh{s<2163:A,x<1409:A,R}
kks{m<591:vkg,m<885:tg,s>1503:hvj,rr}
rtv{m>768:cdv,dtt}
bqq{m>3706:A,m>3640:R,R}
fck{a>3188:kps,A}
mkj{s<1719:A,s>3137:R,A}
cdv{m<1246:R,a<1145:A,hlx}
qp{a>3555:A,x<1837:A,x<2044:ndg,vl}
txd{s>1260:R,a>2410:A,R}
bd{a>322:A,x>1042:A,qtn}
qt{s<292:qds,m<3916:ptb,s<524:ns,scg}
zzc{s>3127:R,hn}
rnk{a<347:R,R}
kkb{a<234:hr,m>1487:bcr,gk}
rqd{a<1012:R,s>2272:A,s<804:R,R}
brn{a>1086:A,a<935:A,A}
mzb{a<185:R,m<2294:A,A}
rgb{s<1147:R,x<2534:A,A}
dd{x>667:bd,m>1103:jhc,x<384:qk,vn}
xdb{x>3728:A,a<1566:R,a<1677:R,A}
sdv{m<931:R,A}
pt{m<3631:R,R}
cx{a<1042:lb,s<1432:rtv,x<745:qvv,bvk}
prx{m<3771:A,s<430:R,x>860:R,R}
vp{s>3461:A,A}
rqj{a<2350:lls,m>2129:kt,a>2428:A,A}
sx{a<1357:kkz,fj}
dsk{s>1588:mhb,gd}
ns{a<3061:R,a>3401:R,s<433:A,A}
tg{a<3036:bz,s>2191:fcv,x>825:qp,xrq}
lbz{a<210:A,x<3371:R,A}
jb{x>3055:kd,m<1445:dm,lbs}
qfp{a<80:mq,x>2922:A,R}
zsv{a>2555:grr,A}
ljp{s>1204:A,a>3115:A,A}
bv{a<2458:R,m<3711:pt,m>3773:zhl,dkz}
slk{a<847:kn,m<2666:nt,x<1985:mt,cmg}
qgp{m>263:R,m>115:R,m<72:R,A}
gtb{a<1533:A,R}
vml{x<209:vg,m>3897:R,A}
bf{a>510:R,s>2009:A,R}
qm{m>606:xqg,zvq}
cl{s>1521:tz,rzj}
gr{x<1904:A,m>372:R,A}
zz{m<1467:A,A}
qvv{s>2314:fcd,qb}
zj{a>706:R,s<398:A,R}
fcv{a<3531:tf,m<761:A,vdq}
bgp{x>1724:rhh,a<1212:cx,x<1026:gtg,qlc}
mrk{a<3128:A,A}
dzr{a<3025:ctx,m>3794:bk,pcj}
qz{m<3561:nj,x>1738:mj,s<1525:lp,dzr}
rm{x>3171:R,x>2793:A,R}
fr{a>1217:jfg,m>1190:lm,R}
klr{x>863:sdv,R}
qcr{x>1610:R,m<2179:R,R}
kkj{s>2614:R,x<2010:A,s<2264:R,A}
lj{s>3244:A,m<382:A,R}
fhj{s<1885:A,a>824:A,m<558:R,R}
pf{m<624:xgc,s<2448:nkb,dd}
vn{m<929:R,a>324:mqs,A}
bq{m<1220:A,s>975:njz,A}
cxp{s<1911:R,A}
cbs{a<459:R,x>1291:R,m<1391:R,R}
vl{x>2211:R,a<3304:A,s<878:A,R}
lm{s>3149:A,R}
xl{s<3195:A,s<3503:A,R}
tk{x<220:bvp,m<802:bt,gqh}
bh{a>851:R,x<3238:A,m>3147:R,A}
jss{s>1416:snm,x>461:A,ph}
rk{m>322:A,A}
gqh{a<1303:ptn,a>1347:A,A}
rct{m>2928:R,A}
bz{x>1564:A,s<2021:A,x<851:A,R}
ckf{x<3624:A,x>3804:A,s>3001:A,R}
pkp{m<2215:R,m<2460:R,A}
vd{a<682:dx,s<1565:ng,s>2392:R,fhj}
rvs{a>1298:sx,xlv}
qjx{x>3570:xvv,s>2626:R,A}
rn{x>2616:R,s>3454:A,m<1978:R,A}
xbd{s<1931:R,a<3678:qfd,m>1997:A,R}
pm{s>2579:R,x<1132:A,s>2434:A,R}
zpx{m<3773:R,s>816:A,R}
tjp{x<3526:A,s<504:A,A}
bp{x>3649:R,m<1264:A,R}
bqk{m<375:R,R}
vrs{s<1841:R,x<1291:R,a>2903:R,A}
xqx{s>3582:R,A}
tf{a<3254:A,a<3353:A,x>1084:A,A}
mj{m<3800:mzg,lvz}
pnl{x<2813:R,A}
fxb{m<2661:R,x<2111:A,A}
ctx{s>3156:zsv,hth}
hsk{a>697:gq,x>2818:rh,sbz}
vdq{x<1197:R,m>835:A,a>3752:A,R}
rc{m>3702:R,R}
mmp{s>3446:R,m>1291:A,s>3242:A,R}
nj{x>1965:bbc,gfp}
jh{a<2753:svc,m>974:hjh,a<3488:R,R}
qds{x>878:A,m>3885:R,m>3846:R,R}
hrf{x<442:A,x<669:A,x>848:R,A}
glm{a>2786:hpn,ht}
gkt{s>885:R,a<349:rpc,rsx}
zt{s>1459:qtx,fkk}
tq{x<3396:R,s>1507:kgp,x<3427:jgt,sq}
xls{a>2741:R,a>2721:A,m<2100:R,R}
sl{x>3321:lbz,A}
pvz{m<108:A,s>2235:A,R}
drg{s<532:R,R}
lqf{s>1779:A,a<2366:A,x<1301:R,jx}
ph{a>1933:R,m<1747:R,R}
spb{s<896:A,m<660:R,s<1276:A,A}
vq{x>3791:R,m<2600:R,A}
dkz{m>3737:A,x<802:A,R}
jq{m<586:R,a<1256:A,a>1282:A,R}
mzg{s<1564:gnv,a>3269:crf,mqc}
vvj{x<3300:R,m>790:sh,R}
xqg{s>1662:xg,x<2774:vj,m>755:qqn,spb}
zhz{m<3445:lz,cxp}
dk{s>3679:hpj,a<567:R,m<3407:bh,rm}
xc{a>1310:A,x>3386:R,a<1287:R,R}
grz{a>678:A,m<3206:R,x>1960:R,A}
xn{a>564:pkp,a<217:zh,R}
rr{x<1350:hjg,x<1851:jh,mv}
dj{a>220:R,s<1186:A,R}
vhd{x>581:A,crm}
hlx{m<1509:A,A}
kxg{x>855:R,x<791:A,A}
tc{s<2245:R,mrk}
ldq{m>3720:lxk,a>3288:sr,ll}
gdq{s<1090:R,m>376:A,A}
xpz{a<3808:R,a>3872:A,R}
jhc{x>275:rnk,s<3378:A,m<1341:xzs,A}
xgc{s<2067:pcx,s>3152:zg,pdk}
vb{x<3555:R,x<3725:R,jnp}
snm{x<725:R,m<1713:A,x<879:A,R}
qg{m<687:mzm,x<3206:vhh,x<3319:rqd,tq}
lzv{a>1600:zt,qd}
qx{a<312:A,a>412:A,R}
fnq{a<503:R,a>510:sm,x>2449:A,pr}
vt{x>2628:kvq,dzs}
xks{m<3949:A,s<2950:R,R}
blv{a<3304:hrf,A}
np{a<775:A,dcb}
nk{x>863:R,s<3306:A,m<223:A,A}
sdp{x<1476:R,m>3890:R,a<3451:A,A}
nhl{m<2352:R,x>2923:dp,jk}
gnv{m>3707:rrv,m>3637:A,A}
jk{x>2815:A,m<2839:A,R}
gjq{m>2997:qr,R}
mf{s>433:pd,a>622:jmf,hck}
zbl{s<880:zj,R}
qtx{a<1800:fxb,x<1831:dhk,dnz}
hgz{a>1320:A,m>785:A,x<536:R,A}
cmg{x<2985:brn,x>3380:R,x>3241:zn,R}
dlb{x<3684:A,a>3277:R,m<2362:R,R}
cgr{s<1023:R,m<3177:A,m>3227:A,A}
hvj{s>2773:xt,kj}
xvh{m<735:A,m>1413:mkj,a>931:A,plb}
pb{x>3849:R,A}
fv{m<3880:A,x<619:jvb,s>2354:R,hjq}
rrq{x<2862:R,R}
jkp{x<816:R,x>1084:A,a<2935:A,R}
lkx{s>2236:R,x<2351:A,a>2888:A,A}
fg{m<1099:czb,x>2564:nhj,m>1409:qvt,drf}
dv{x<1599:R,m<1517:A,m<1555:R,A}
hb{x>884:A,a<875:A,m>1324:R,A}
npp{s<1927:R,m<3037:A,A}
hth{m<3818:cls,m>3880:R,a<2449:qbx,R}
db{a>172:R,a>87:A,R}
jn{m<1606:dv,R}
lpk{x<587:pmb,a<3274:dh,m<3889:R,xks}
qk{m>849:R,x<242:R,m<753:A,jln}
cd{a>3197:A,R}
pj{m<1029:lqj,m>1387:vr,R}
gkc{a<988:xvh,smk}
ghh{m<1731:A,m>1765:A,R}
rhk{x<3091:R,a>3563:xpz,R}
jtz{m<1294:qjb,a<848:sc,m<1356:hb,mc}
dn{s<2289:R,R}
lff{a<2877:A,a>2976:A,A}
rzj{m<1228:R,s<713:R,R}
ch{s<2218:A,R}
lk{x>1968:A,a>1002:R,x>1816:A,R}
dm{x<2832:A,a>753:A,A}
tts{a<1115:lk,A}
cxn{s>1043:txd,m>3720:zpx,A}
rt{m<2296:A,jl}
sr{a>3689:zzs,pk}
gd{x>2473:A,a>331:spt,db}
tqt{x>1763:R,a<2539:R,R}
xm{x<2530:R,a>175:R,R}
kd{s<708:A,a>788:R,s<1456:A,A}
mzm{s>2314:bdt,s<1540:A,x<3283:A,pg}
knr{s<1390:A,A}
rq{s<541:R,x<674:R,A}
qhs{m<2705:R,a>3248:R,R}
qqm{a<445:xz,x>2962:rgx,tr}
qtn{m<1288:A,x<908:R,a>152:A,R}
pcj{a>3615:vhd,hqz}
xhv{a>3291:R,m<3743:A,A}
nzd{m<3103:A,R}
dzs{m<2395:lbx,m<2840:pbz,x<1544:rsr,glm}
xcv{a>534:R,mzb}
svc{x>1649:R,a<2028:R,s<549:A,A}
bg{m>732:A,x<2224:R,A}
nb{a>2519:R,s>1151:R,a<1781:xdb,R}
xjs{s<3128:qcr,x<2113:xcv,x<2755:qvq,kg}
nck{a>2589:rv,nvd}
rgf{m<688:A,s>2496:bfp,A}
kz{m>1079:A,a>1082:zpt,R}
fsh{m>2354:mqg,s>1339:bhm,a>2579:zx,rqj}
ql{s<1034:gs,a>496:slk,dsk}
css{x>776:cxn,m<3711:rch,hnj}
qvq{x<2502:smc,m>2182:R,rn}
mqg{a>2380:R,s<2169:rlb,a<2245:cv,R}
mz{x<1370:R,s<1734:A,A}
bvk{x>1121:klk,m>764:kp,fp}
mcg{a<2768:R,m<3382:R,A}
jvb{a<3938:A,a>3977:A,m>3920:A,A}
hjg{s<649:fh,R}
rrv{m<3751:R,R}
sd{m>3738:R,R}
sv{m>492:gsq,x>1070:R,a>2386:A,mk}
fp{m>471:cq,R}
hjq{x>1174:A,A}
lq{x<3568:R,s>1780:R,m>696:A,R}
crm{a<3752:A,m>3702:R,m<3609:A,A}
pph{s>3586:A,A}
in{m<1799:jjp,bdz}
lvz{a>3026:rhk,hbj}
fkk{m<2575:pgt,x>1787:R,x<902:tj,R}
mk{m<406:R,R}
hck{m<3321:A,A}
btm{m<2792:xjs,x<2487:rcq,sz}
pbd{a>720:A,a<613:A,R}
bnf{x<1385:A,m>1657:ghh,A}
kr{x<3292:R,m>701:A,x<3394:R,qgp}
dhk{a<1975:R,m<2911:A,s>2707:A,R}
fcd{a<1130:R,s<3191:R,A}
xg{x>2740:A,m<754:R,a>47:A,A}
bcm{s<3214:R,x<764:R,A}
kpz{a>1024:R,a>1016:R,A}
rhn{x<963:R,s<2257:R,A}
bcr{s<2914:R,s>3566:A,a<296:A,R}
gcd{a>690:R,m>1502:R,a<637:R,R}
mq{a<48:A,R}
qh{x<3604:A,A}
jln{x>325:R,s>3443:R,a<210:A,R}
fh{a<2968:A,x>527:A,A}
rv{x<977:blv,tc}
kn{x<1718:zpb,x>2652:A,pbd}
lp{m>3819:md,a>2795:ldq,s<702:vc,css}
gfp{m>3428:zxd,kqq}
pbz{x<1645:fhq,m<2636:hg,x<2254:fck,pss}
lqj{x<1273:R,A}
hhg{x<448:A,x<622:R,R}
lls{m>1995:A,m<1923:A,R}
lv{s<2619:R,s>2894:R,R}
rhh{x<2975:tb,a>1112:zjf,x<3446:qg,gkc}
lr{s<2659:R,R}
scg{s<618:A,R}
fcl{m<651:A,x<3400:R,s<3038:bp,mmp}
kg{a>780:vp,R}
rtz{a>209:df,m>639:cb,mnj}
jx{m>122:R,A}
cr{a<1417:fm,gtb}
mhb{x>1851:R,qx}
hjh{x>1552:A,s<907:A,s>1256:A,R}
xzs{m<1253:R,A}
smc{a>464:R,A}
kvq{a<2814:fsh,x<3395:gvm,crl}
gtg{x<433:tk,x<769:bsc,s>2477:npt,rvs}
fsx{a<2621:A,a<3519:R,R}
nn{m<915:rk,A}
xj{s<2545:A,A}
ffv{m>1422:A,x<1363:jpj,m>1361:R,lmx}
bm{m>982:R,bn}
bfp{s>3213:R,R}
bdz{a<2137:tqs,m<3266:vt,qz}
sbz{a>644:R,A}
qrp{x>3233:nb,x>2759:bm,srn}
mqc{x>2751:R,s<2721:lkx,s<3203:vf,rc}
qvt{m>1626:np,s>2238:gz,x<907:tbj,zbl}
dcb{m>1700:A,R}
dp{x>3217:A,m>2662:A,x>3064:A,A}
cmx{x<3034:A,a<375:R,m>508:R,A}
gq{s<1476:A,a<786:R,a>840:R,R}
mmv{m<262:R,x>1311:A,x<449:R,A}
ndg{x<1971:R,a<3265:R,R}
zpb{x<745:R,R}
ngb{x<798:A,m<3645:R,s<2497:R,A}
pss{s>1672:cd,qhs}
jm{m<1177:A,A}
jp{m>961:A,s>1784:A,A}
bbl{m<2805:R,x>3597:R,m<2849:A,A}
qr{m>3524:R,R}
kps{a>3665:A,R}
dhp{a>3587:R,R}
sm{m<821:R,A}
dnz{x>2559:A,s>2597:A,A}
zg{a<203:pph,x<973:R,x<1362:rfl,A}
prh{s>2052:xvn,x<2877:rgb,s<1031:tjp,xh}
rj{m>3917:R,R}
qvh{s>2604:xcm,s<1359:dc,a<1332:ss,bcd}
qjb{s<3285:A,A}
df{x>2352:R,m<538:ffg,s>1850:kkj,nx}
dx{s>2250:A,R}
klk{s<2623:smh,a>1109:dvl,x>1432:sk,A}
vlq{m<400:R,R}
gk{a>283:R,x>2989:R,A}
kk{m<1175:bg,td}
gvm{s<1760:nhl,hp}
qs{s<2928:A,m>783:R,s<3382:A,R}
nvd{m<1411:cl,x>1123:jn,m<1659:lr,jss}
jkj{m>473:A,x<637:R,a>261:A,A}
kqq{a>3249:rhn,s<1835:R,A}
tbj{s<1246:A,s>1711:hhg,a<755:R,hm}
tp{a>3324:A,m<3763:R,a<3097:R,A}
pmr{s>1708:A,m<3460:A,A}
dhd{s>990:R,m<3426:R,R}
fjx{x<3231:pmr,s>2189:ckf,m<3402:R,jd}
mh{x>1109:R,R}
hpn{s>1992:nzd,A}
lg{x<274:R,R}
hv{s<2197:R,x<1939:R,R}
rsx{s<436:R,A}
sh{a>243:R,m<886:A,R}
nq{x>2986:fcl,zzc}
zxd{a<2811:A,mkg}
bsc{s<1824:fk,fz}
fj{x>928:R,m>1085:R,A}
zhl{m>3798:A,R}
fn{s<3288:R,x<2433:R,x>2525:A,R}
nhj{s<1867:jb,jv}
mnj{x>2286:hhj,s>1392:gr,R}
qbx{m>3852:R,A}
pg{m>390:A,R}
hs{s<1082:A,x>1329:R,a>320:A,A}
xs{m<3677:rq,m<3749:R,a<2400:drg,R}
pcx{s>1363:A,tcf}
lmx{m>1337:R,a<1276:A,R}
cc{m<734:A,R}
hp{s<3126:A,R}
mt{m<3297:jfp,sd}
nm{x>1332:sdp,a>3454:fx,a<3290:qpx,rj}
qd{x>2236:gjq,cr}
zn{m>3552:R,s>1435:A,s>1267:A,A}
gzg{s>1066:R,mnq}
zzp{m<1020:lhd,A}
jzd{x>2390:rd,m<1069:kks,nck}
pr{x>1956:R,s>1500:A,m>843:R,A}
dvl{s<3137:R,m>605:R,A}
js{m<2084:R,x<2870:R,R}
jgt{m<1321:R,x<3410:R,A}
jnp{a<233:A,s>2408:R,x<3862:R,R}
gsq{a>3028:A,a<1961:R,a>2431:A,A}
{x=1637,m=1909,a=2036,s=1546}
{x=1501,m=118,a=732,s=800}
{x=3014,m=1069,a=3167,s=1318}
{x=435,m=1750,a=41,s=1563}
{x=477,m=185,a=1838,s=193}
{x=1347,m=244,a=2415,s=2626}
{x=578,m=553,a=2510,s=136}
{x=249,m=166,a=762,s=23}
{x=1172,m=489,a=2321,s=1040}
{x=23,m=3874,a=1228,s=980}
{x=2831,m=20,a=2235,s=205}
{x=2087,m=29,a=534,s=1455}
{x=2118,m=229,a=421,s=19}
{x=2014,m=2489,a=99,s=1385}
{x=1211,m=2963,a=1943,s=25}
{x=1342,m=1735,a=1478,s=6}
{x=1991,m=252,a=3415,s=83}
{x=246,m=151,a=321,s=1155}
{x=8,m=2267,a=3,s=2530}
{x=3159,m=558,a=805,s=1871}
{x=2923,m=465,a=1305,s=2882}
{x=1688,m=201,a=257,s=218}
{x=884,m=2083,a=864,s=119}
{x=143,m=2435,a=3623,s=2019}
{x=1667,m=481,a=1905,s=188}
{x=268,m=1858,a=1079,s=913}
{x=860,m=214,a=487,s=143}
{x=558,m=3198,a=2,s=42}
{x=2090,m=92,a=308,s=1373}
{x=767,m=2710,a=362,s=3}
{x=272,m=55,a=189,s=231}
{x=1359,m=87,a=90,s=11}
{x=124,m=42,a=3276,s=1632}
{x=2899,m=2442,a=220,s=3152}
{x=475,m=1049,a=1608,s=683}
{x=2820,m=385,a=266,s=1844}
{x=169,m=2898,a=150,s=179}
{x=44,m=224,a=1315,s=1709}
{x=35,m=45,a=99,s=87}
{x=12,m=338,a=823,s=301}
{x=436,m=2035,a=107,s=822}
{x=1512,m=38,a=469,s=549}
{x=1415,m=15,a=692,s=1507}
{x=1571,m=527,a=439,s=813}
{x=712,m=397,a=380,s=3369}
{x=68,m=958,a=350,s=1372}
{x=1040,m=1452,a=1976,s=526}
{x=2126,m=89,a=115,s=257}
{x=1320,m=534,a=2419,s=2958}
{x=1503,m=855,a=876,s=4}
{x=1448,m=793,a=253,s=1391}
{x=1590,m=569,a=110,s=1817}
{x=1880,m=936,a=322,s=252}
{x=13,m=520,a=1705,s=73}
{x=1668,m=2834,a=2717,s=1858}
{x=1186,m=1567,a=237,s=183}
{x=632,m=113,a=2854,s=342}
{x=1734,m=64,a=530,s=2831}
{x=1282,m=1059,a=213,s=14}
{x=42,m=34,a=2780,s=1054}
{x=662,m=824,a=441,s=39}
{x=728,m=881,a=1238,s=2748}
{x=732,m=742,a=978,s=2641}
{x=132,m=843,a=849,s=1306}
{x=1577,m=586,a=543,s=3118}
{x=4,m=490,a=114,s=990}
{x=3110,m=1960,a=703,s=608}
{x=808,m=1548,a=485,s=352}
{x=739,m=534,a=1613,s=51}
{x=1019,m=2004,a=1847,s=2174}
{x=2984,m=1413,a=169,s=2552}
{x=2762,m=23,a=1118,s=625}
{x=717,m=827,a=909,s=109}
{x=337,m=1378,a=1303,s=578}
{x=1069,m=1421,a=804,s=224}
{x=234,m=581,a=931,s=410}
{x=316,m=570,a=821,s=742}
{x=768,m=1915,a=737,s=281}
{x=9,m=80,a=1088,s=1711}
{x=101,m=37,a=719,s=2625}
{x=1354,m=15,a=395,s=833}
{x=504,m=2989,a=29,s=1744}
{x=1040,m=141,a=2771,s=186}
{x=396,m=947,a=473,s=1942}
{x=1364,m=173,a=15,s=2680}
{x=1823,m=872,a=600,s=367}
{x=717,m=1298,a=1419,s=685}
{x=2922,m=367,a=311,s=95}
{x=405,m=1169,a=272,s=574}
{x=2209,m=8,a=56,s=615}
{x=892,m=39,a=508,s=775}
{x=403,m=868,a=22,s=1485}
{x=17,m=834,a=191,s=612}
{x=30,m=718,a=659,s=199}
{x=1238,m=733,a=169,s=1232}
{x=538,m=66,a=434,s=1821}
{x=1328,m=2134,a=982,s=507}
{x=13,m=1934,a=498,s=3765}
{x=1806,m=445,a=551,s=70}
{x=178,m=540,a=1321,s=412}
{x=2363,m=1979,a=988,s=1604}
{x=61,m=52,a=2250,s=772}
{x=887,m=1865,a=2985,s=23}
{x=1805,m=1366,a=808,s=314}
{x=1542,m=649,a=1405,s=3211}
{x=1685,m=1393,a=359,s=1961}
{x=2482,m=1943,a=1461,s=2809}
{x=879,m=784,a=639,s=860}
{x=2039,m=105,a=659,s=812}
{x=626,m=1428,a=16,s=227}
{x=879,m=1455,a=2669,s=296}
{x=1373,m=1976,a=577,s=1808}
{x=387,m=2,a=2139,s=592}
{x=1127,m=443,a=1010,s=444}
{x=599,m=157,a=217,s=2041}
{x=1626,m=2839,a=388,s=365}
{x=648,m=884,a=2314,s=1900}
{x=1625,m=414,a=1168,s=723}
{x=1019,m=1323,a=715,s=784}
{x=2298,m=2611,a=513,s=383}
{x=222,m=189,a=150,s=1935}
{x=3557,m=122,a=320,s=2309}
{x=138,m=425,a=17,s=170}
{x=696,m=55,a=1910,s=869}
{x=571,m=5,a=1293,s=504}
{x=1024,m=492,a=2218,s=151}
{x=1412,m=1357,a=824,s=1767}
{x=501,m=752,a=243,s=488}
{x=506,m=2264,a=2049,s=1313}
{x=299,m=27,a=1827,s=188}
{x=9,m=2130,a=62,s=375}
{x=599,m=1968,a=1951,s=3584}
{x=162,m=1317,a=177,s=396}
{x=122,m=986,a=16,s=2061}
{x=281,m=79,a=1002,s=105}
{x=3,m=1686,a=830,s=1580}
{x=504,m=378,a=383,s=1149}
{x=763,m=37,a=364,s=808}
{x=146,m=142,a=189,s=1164}
{x=1365,m=1172,a=264,s=360}
{x=118,m=663,a=4,s=1059}
{x=1301,m=2155,a=1253,s=2866}
{x=1517,m=2329,a=366,s=95}
{x=339,m=1735,a=1898,s=1340}
{x=1261,m=2655,a=524,s=1216}
{x=79,m=3221,a=636,s=203}
{x=140,m=38,a=2493,s=733}
{x=1876,m=521,a=766,s=110}
{x=788,m=1326,a=257,s=527}
{x=556,m=58,a=384,s=123}
{x=1766,m=630,a=1054,s=17}
{x=419,m=851,a=190,s=122}
{x=180,m=2229,a=172,s=2138}
{x=29,m=73,a=394,s=53}
{x=785,m=2429,a=259,s=1174}
{x=2157,m=903,a=814,s=2252}
{x=311,m=441,a=158,s=1279}
{x=2662,m=1791,a=836,s=2162}
{x=513,m=536,a=331,s=1346}
{x=223,m=955,a=489,s=386}
{x=2017,m=362,a=931,s=1133}
{x=539,m=409,a=120,s=41}
{x=1686,m=587,a=1738,s=52}
{x=1056,m=552,a=59,s=146}
{x=2807,m=1088,a=88,s=2894}
{x=613,m=253,a=1044,s=1219}
{x=341,m=82,a=349,s=222}
{x=402,m=577,a=1059,s=739}
{x=217,m=3325,a=54,s=1457}
{x=144,m=82,a=951,s=1934}
{x=2731,m=33,a=2289,s=163}
{x=2556,m=873,a=281,s=2512}
{x=1805,m=124,a=2139,s=33}
{x=550,m=2530,a=2411,s=65}
{x=492,m=820,a=625,s=2324}
{x=864,m=377,a=1377,s=2620}
{x=2147,m=1173,a=151,s=116}
{x=201,m=143,a=2566,s=106}
{x=195,m=2048,a=305,s=2786}
{x=37,m=882,a=3088,s=100}
{x=421,m=277,a=2090,s=167}
{x=2032,m=1263,a=1288,s=658}
{x=2244,m=76,a=519,s=455}
{x=23,m=2544,a=699,s=22}
{x=2404,m=1411,a=1417,s=272}
{x=574,m=2109,a=507,s=865}
{x=354,m=471,a=38,s=1162}
{x=865,m=135,a=434,s=391}
{x=205,m=1244,a=942,s=961}
{x=791,m=2963,a=127,s=1359}
{x=3493,m=460,a=906,s=325}
{x=1312,m=237,a=393,s=7}
{x=819,m=1996,a=1259,s=387}
{x=133,m=911,a=161,s=362}
{x=534,m=1999,a=1237,s=114}
{x=62,m=70,a=1019,s=290}
{x=80,m=226,a=78,s=416}
{x=372,m=429,a=134,s=747}
{x=702,m=1387,a=3614,s=2657}
{x=1392,m=101,a=713,s=20}

1004
2023/new.out Normal file

File diff suppressed because it is too large Load diff

1004
2023/old.out Normal file

File diff suppressed because it is too large Load diff

3
2023/readme.md Normal file
View file

@ -0,0 +1,3 @@
# AOC 23
Complete all of AoC 2023 in Rust. No specific constraints, not going for any kind of high speed or clean code.

104
2023/src/bin/day01.rs Normal file
View file

@ -0,0 +1,104 @@
use aoc23::prelude::*;
fn part1(input: String) -> Result<usize> {
let mut sum = 0;
for line in input.lines().into_iter() {
let chars = line.chars();
let first_num: usize = chars
.clone()
.into_iter()
.skip_while(|c| !c.is_digit(10))
.take(1)
// This would get continuous digits: .take_while(|c| c.is_digit(10))
.collect::<String>()
.parse()?;
let last_num: usize = chars
.into_iter()
.rev()
.skip_while(|c| !c.is_digit(10))
.take(1)
.collect::<String>()
.parse()?;
let value = first_num * 10 + last_num;
sum += value;
}
// println!("Answer: {}", sum);
Ok(sum)
}
fn num_to_word(num: u32) -> Option<&'static str> {
match num {
1 => Some("one"),
2 => Some("two"),
3 => Some("three"),
4 => Some("four"),
5 => Some("five"),
6 => Some("six"),
7 => Some("seven"),
8 => Some("eight"),
9 => Some("nine"),
_ => None,
}
}
fn first_occurrence(str: &str, reversed: bool) -> Option<u32> {
if reversed {
for (i, char) in str.chars().rev().enumerate() {
let digit = char.to_digit(10).or_else(|| {
for num in 1..=9 {
if let Some(num_word) = num_to_word(num) {
if i + 1 >= num_word.len()
&& &str[str.len() - i - 1..str.len()][..num_word.len()] == num_word
{
return Some(num);
}
}
}
None
});
if digit.is_some() {
return digit;
}
}
} else {
for (i, char) in str.chars().enumerate() {
let digit = char.to_digit(10).or_else(|| {
for num in 1..=9 {
if let Some(num_word) = num_to_word(num) {
if i + 1 >= num_word.len() && &str[i + 1 - num_word.len()..=i] == num_word {
return Some(num);
}
}
}
None
});
if digit.is_some() {
return digit;
}
}
}
None
}
fn part_2(input: String) -> Result<u32> {
let mut sum = 0;
for line in input.lines().into_iter() {
let first_num = first_occurrence(line, false).ok_or("No number found in line")?;
let last_num = first_occurrence(line, true).ok_or("No number found in line reversed")?;
let value = first_num * 10 + last_num;
sum += value;
println!("Line {line}: a:{first_num}|b:{last_num} = {value} ++ {sum}");
}
Ok(sum)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day 1");
println!("=====");
let input = utils::aoc::get_puzzle_input(1).await?;
println!("part 1: {}", part1(input.clone())?);
println!("part 2: {}", part_2(input.clone())?);
Ok(())
}

View file

@ -0,0 +1,144 @@
use aoc23::prelude::*;
fn part_1(input: String) -> Result<usize> {
let mut sum = 0;
for line in input.lines().into_iter() {
let chars = line.chars();
let first_num: usize = chars
.clone()
.into_iter()
.skip_while(|c| !c.is_digit(10))
.take(1)
// This would get continuous digits: .take_while(|c| c.is_digit(10))
.collect::<String>()
.parse()?;
let last_num: usize = chars
.into_iter()
.rev()
.skip_while(|c| !c.is_digit(10))
.take(1)
.collect::<String>()
.parse()?;
let value = first_num * 10 + last_num;
sum += value;
}
// println!("Answer: {}", sum);
Ok(sum)
}
fn part_2(input: String) -> Result<u32> {
let numbers: [(&'static str, u32); 9] = [
("one", 1),
("two", 2),
("three", 3),
("four", 4),
("five", 5),
("six", 6),
("seven", 7),
("eight", 8),
("nine", 9),
];
let mut sum = 0;
for line in input.lines().into_iter() {
let mut chars = line.chars();
let mut peek_index = 0;
let first_num = loop {
// I wanted this to work but peek advances the iterator anyways despite saying it
// doesn't. I don't understand
//
// ```
// if let Some(Some(peek_digit)) = chars.by_ref().peekable().peek().map(|c| c.to_digit(10))
// ```
if let Some(Some(peek_digit)) = line.chars().nth(peek_index).map(|c| c.to_digit(10)) {
break peek_digit;
}
if let Some((_, digit)) = numbers.iter().find(|num| chars.as_str().starts_with(num.0)) {
break *digit;
}
if chars.next().is_none() {
break 0;
}
peek_index += 1;
};
let last_num = loop {
if let Some((_, digit)) = numbers.iter().find(|num| chars.as_str().ends_with(num.0)) {
break *digit;
}
if let Some(last_char) = chars.next_back() {
if let Some(digit) = last_char.to_digit(10) {
break digit;
}
} else {
break first_num;
}
};
let value = first_num * 10 + last_num;
sum += value;
// println!("Line {line}: a:{first_num}|b:{last_num} = {value} ++ {sum}");
}
Ok(sum)
}
fn part_2_no_peek(input: String) -> Result<u32> {
// We can just add the text versions of the number as well and this removes the
// need to peek at the digit like in the above method. Idk what I like better...
let numbers: [(&'static str, u32); 18] = [
("one", 1),
("1", 1),
("two", 2),
("2", 2),
("three", 3),
("3", 3),
("four", 4),
("4", 4),
("five", 5),
("5", 5),
("six", 6),
("6", 6),
("seven", 7),
("7", 7),
("eight", 8),
("8", 8),
("nine", 9),
("9", 9),
];
let mut sum = 0;
for line in input.lines().into_iter() {
let mut chars = line.chars();
let first_num = loop {
if let Some((_, digit)) = numbers.iter().find(|num| chars.as_str().starts_with(num.0)) {
break *digit;
}
if chars.next().is_none() {
break 0;
}
};
let last_num = loop {
if let Some((_, digit)) = numbers.iter().find(|num| chars.as_str().ends_with(num.0)) {
break *digit;
}
if chars.next_back().is_none() {
break first_num;
}
};
let value = first_num * 10 + last_num;
sum += value;
// println!("Line {line}: a:{first_num}|b:{last_num} = {value} ++ {sum}");
}
Ok(sum)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day 1");
println!("=====");
let input = utils::aoc::get_puzzle_input(1).await?;
println!("part 1: {}", part_1(input.clone())?);
println!("part 2: {}\t[peek method]", part_2(input.clone())?);
println!(
"part 2: {}\t[no peek method]",
part_2_no_peek(input.clone())?
);
Ok(())
}

134
2023/src/bin/day02.rs Normal file
View file

@ -0,0 +1,134 @@
use aoc23::prelude::*;
use std::{collections::HashMap, fmt::Display, str::FromStr};
#[derive(Debug, Eq, PartialEq, Clone, Hash)]
enum Cube {
Blue,
Red,
Green,
}
impl FromStr for Cube {
type Err = String;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
match s {
"blue" => Ok(Cube::Blue),
"red" => Ok(Cube::Red),
"green" => Ok(Cube::Green),
_ => Err("asd".into()),
}
}
}
#[derive(Debug, Eq, PartialEq, Clone)]
struct Game {
id: u32,
sets: Vec<HashMap<Cube, u32>>,
}
impl FromStr for Game {
type Err = String;
// Game 1: 7 green, 4 blue, 3 red; 4 blue, 10 red, 1 green; 1 blue, 9 red Game 2:
// 2 red, 4 blue, 3 green; 5 green, 3 red, 1 blue; 3 green, 5 blue, 3 red Game 3:
// 12 red, 1 blue; 6 red, 2 green, 3 blue; 2 blue, 5 red, 3 green
fn from_str(line: &str) -> std::result::Result<Self, Self::Err> {
let parts: Vec<&str> = line.split(':').collect();
let id = parts[0]
.trim()
.split_whitespace()
.last()
.ok_or("no id")?
.parse::<u32>()
.ok()
.ok_or("not a number")?;
let sets = parts[1]
.split(';')
.map(|set| {
set.split(',')
.filter_map(|part| {
let mut iter = part.trim().split_whitespace();
let count = iter.next().unwrap().parse::<u32>().unwrap();
let color = iter.next().unwrap().parse::<Cube>().ok()?;
Some((color, count))
})
.collect()
})
.collect();
Ok(Game { id, sets })
}
}
fn part1(input: String) -> Result<impl Display> {
let games: Vec<Game> = input
.lines()
.into_iter()
.map(|l| l.parse().expect("failed to parse line"))
.collect();
let mut possible_game_id_sum = 0;
let limit_red = 12;
let limit_green = 13;
let limit_blue = 14;
for game in games {
let out_of_bounds = game.sets.iter().any(|set| match set.get(&Cube::Red) {
Some(red) => red > &limit_red,
None => false,
} || match set.get(&Cube::Green) {
Some(green) => green > &limit_green,
None => false,
} || match set.get(&Cube::Blue) {
Some(blue) => blue > &limit_blue,
None => false,
});
if !out_of_bounds {
// println!("Valid game id, {:?}", game);
possible_game_id_sum += game.id;
} else {
// println!("INVALID game {:?}", game);
}
}
Ok(possible_game_id_sum)
}
fn part2(input: String) -> Result<impl Display> {
let games: Vec<Game> = input
.lines()
.into_iter()
.map(|l| l.parse().expect("failed to parse line"))
.collect();
let mut power_sum = 0;
for game in games {
let mut maxes: HashMap<Cube, u32> = [(Cube::Red, 1), (Cube::Green, 1), (Cube::Blue, 1)]
.into_iter()
.collect();
for set in game.sets.iter() {
for (cube, &count) in set {
let max_count = maxes.get_mut(cube).ok_or("default missing")?;
*max_count = u32::max(*max_count, count);
}
}
let power = maxes.values().into_iter().fold(1u32, |acc, v| acc * v);
power_sum += power;
}
Ok(power_sum)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day 1");
println!("=====");
let input = utils::aoc::get_puzzle_input(2).await?;
// ```
// let input = "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
// Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
// Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
// Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
// Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green"
// .to_owned();
// ```
println!("part 1: {}", part1(input.clone())?);
println!("part 2: {}", part2(input.clone())?);
Ok(())
}

189
2023/src/bin/day03.rs Normal file
View file

@ -0,0 +1,189 @@
use aoc23::prelude::*;
use std::str::FromStr;
#[derive(Debug)]
enum Item {
Digit(u32),
Symbol(bool),
None,
}
#[derive(Debug)]
struct Number {
pub value: usize,
pub row_index: usize,
pub char_start: usize,
pub char_end: usize,
}
struct Grid {
pub rows: Vec<Vec<Item>>,
pub numbers: Vec<Number>,
}
impl Grid {
fn get_item(&self, row: usize, col: usize) -> Option<&Item> {
match self.rows.get(row) {
Some(row) => row.get(col),
None => None,
}
}
fn get_adjacent_items(
&self,
row: usize,
start: usize,
end: usize,
) -> Vec<(&Item, usize, usize)> {
let row_start = if row > 0 { row - 1 } else { 0 };
let col_start = if start > 0 { start - 1 } else { 0 };
let mut items: Vec<(&Item, usize, usize)> = vec![];
for row_i in row_start..=row + 1 {
for col_i in col_start..=end + 1 {
if row_i != row || col_i < start || col_i > end {
let item = self.get_item(row_i, col_i);
if let Some(item) = item {
items.push((item, row_i, col_i));
}
}
}
}
return items;
}
fn get_adjacent_numbers(&self, row: usize, col: usize) -> Vec<&Number> {
let mut unique_numbers: Vec<&Number> = vec![];
for item in self.get_adjacent_items(row, col, col) {
match item {
(Item::Digit(_), r, c) => {
if let Some(number_at) = self
.numbers
.iter()
.find(|n| n.row_index == r && c >= n.char_start && c <= n.char_end)
{
if unique_numbers.iter().all(|n| n.value != number_at.value) {
unique_numbers.push(number_at);
}
}
}
_ => {}
}
}
unique_numbers
}
}
impl FromStr for Grid {
type Err = BoxE;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
let mut grid = Grid {
rows: vec![],
numbers: vec![],
};
for (row_index, line) in s.lines().enumerate() {
let mut row: Vec<Item> = vec![];
let mut num: Option<usize> = None;
let mut char_start = 0;
for (char_index, char) in line.trim().chars().enumerate() {
if let Some(digit) = char.to_digit(10) {
row.push(Item::Digit(digit));
num = if let Some(existing_num) = num {
Some(existing_num * 10 + digit as usize)
} else {
char_start = char_index;
Some(digit as usize)
};
} else {
if char == '.' {
row.push(Item::None);
} else {
row.push(Item::Symbol(char == '*'))
}
if let Some(value) = num {
grid.numbers.push(Number {
value,
row_index,
char_start,
char_end: char_index - 1,
});
num = None;
char_start = 0;
}
}
}
// This killed me, I forgot to add a check after the end of the line to see if I
// was still "scanning" for a number and adding it. There was 1 single number not
// getting parsed that was on the right edge of the grid and I could not figure it
// out for a while.
if let Some(value) = num {
grid.numbers.push(Number {
value,
row_index,
char_start,
char_end: line.len() - 1,
});
}
grid.rows.push(row);
}
Ok(grid)
}
}
fn part1(input: String) -> Result<usize> {
let grid: Grid = input.parse()?;
let mut sum = 0;
for number in grid.numbers.iter() {
let adjacent =
grid.get_adjacent_items(number.row_index, number.char_start, number.char_end);
let is_part_no = adjacent
.iter()
.any(|item| matches!(item, (Item::Symbol(_), _, _)));
if is_part_no {
sum += number.value;
}
}
Ok(sum)
}
fn part2(input: String) -> Result<usize> {
let grid: Grid = input.parse()?;
let mut sum = 0;
let mut used: Vec<(usize, usize)> = vec![];
for number in grid.numbers.iter() {
let is_used = used
.iter()
.any(|(row, char_start)| number.row_index == *row && number.char_start == *char_start);
if !is_used {
let adjacent =
grid.get_adjacent_items(number.row_index, number.char_start, number.char_end);
if let Some((_, row, col)) = adjacent
.iter()
.find(|item| matches!(item.0, Item::Symbol(true)))
{
let gear_nums = grid.get_adjacent_numbers(*row, *col);
if gear_nums.len() >= 2 {
// this is lazy.. adds duplicates but w/e
let power = gear_nums.iter().fold(1, |pow, gear| pow * gear.value);
gear_nums
.iter()
.for_each(|g| used.push((g.row_index, g.char_start)));
sum += power;
}
}
}
}
Ok(sum)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day 3");
println!("=====");
let input = utils::aoc::get_puzzle_input(3).await?;
let part_1 = part1(input.clone())?;
println!("part 1: {}", part_1);
println!("part 2: {}", part2(input.clone())?);
Ok(())
}

124
2023/src/bin/day04.rs Normal file
View file

@ -0,0 +1,124 @@
use aoc23::prelude::*;
use itertools::Itertools;
use std::{collections::VecDeque, str::FromStr, time::Instant};
#[derive(Debug, Eq, PartialEq, Hash, Clone)]
struct Card {
id: usize,
part_1_score: usize,
part_2_matches: usize,
part_2_count: usize,
}
impl FromStr for Card {
type Err = BoxE;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
let mut id: Option<usize> = None;
let mut winning_numbers: Vec<usize> = vec![];
let mut score = 0;
let mut matches = 0;
for part in s.split(':') {
if id.is_some() {
for (num_mode, wins_or_nums) in part.split('|').enumerate() {
wins_or_nums
.trim()
.split_whitespace()
.into_iter()
.map(|num| {
num.parse::<usize>()
.expect(&format!("could not parse number: {}", num))
})
.for_each(|num| {
if num_mode == 0 {
winning_numbers.push(num);
} else {
if winning_numbers.iter().any(|winner| winner == &num) {
matches += 1;
score = if score == 0 { 1 } else { score * 2 };
}
}
});
}
} else {
id = Some(
part.split_whitespace()
.last()
.ok_or("Failed to get last item")?
.parse()?,
)
}
}
Ok(Card {
id: id.ok_or("no id found")?,
part_1_score: score,
part_2_matches: matches,
part_2_count: 1,
})
}
}
fn part1(input: String) -> Result<usize> {
Ok(input
.lines()
.map(|line| line.parse::<Card>())
.filter_map(|card| card.ok())
.fold(0, |sum, card| sum + card.part_1_score))
}
fn part2(input: String) -> Result<usize> {
let mut sum = 0;
let cards = input
.lines()
.map(|line| line.parse::<Card>())
.filter_map(|card| card.ok())
.collect_vec();
let mut queue: VecDeque<&Card> = cards.iter().collect();
while let Some(card) = queue.pop_front() {
sum += 1;
for card_index in card.id..card.id + card.part_2_matches {
cards.get(card_index).map(|c| queue.push_back(&c));
}
}
Ok(sum)
}
fn part2_revised(input: String) -> Result<usize> {
let mut sum = 0;
let mut cards = input
.lines()
.map(|line| line.parse::<Card>())
.filter_map(|card| card.ok())
.collect_vec();
for i in 0..cards.len() {
let (count, matches) = {
let card = cards.get(i).ok_or("card not found")?;
sum += card.part_2_count;
(card.part_2_count, card.part_2_matches)
};
for card_index in 1..=matches {
cards.get_mut(i + card_index).map(|card_below| {
card_below.part_2_count += count;
});
}
}
Ok(sum)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day 4");
println!("=====");
let input = utils::aoc::get_puzzle_input(4).await?;
let start = Instant::now();
println!("part 1: {}\t[{:?}]", part1(input.clone())?, start.elapsed());
let start = Instant::now();
println!("part 2: {}\t[{:?}]", part2(input.clone())?, start.elapsed());
let start = Instant::now();
println!(
"part 2: {}\t[{:?}]\t[revised]",
part2_revised(input.clone())?,
start.elapsed()
);
Ok(())
}

253
2023/src/bin/day05.rs Normal file
View file

@ -0,0 +1,253 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use itertools::Itertools;
use rayon::prelude::*;
use std::{str::FromStr, time::Instant};
#[derive(Debug, Builder, Clone)]
struct Map {
destination_start: usize,
source_start: usize,
length: usize,
}
impl FromStr for Map {
type Err = BoxE;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
let mut parts = s
.trim()
.split_whitespace()
.map(|s| s.parse::<usize>().expect("failed to parse"));
Ok(MapBuilder::default()
.destination_start(parts.next().expect("no dest"))
.source_start(parts.next().expect("no start"))
.length(parts.next().expect("no length"))
.build()?)
}
}
impl Map {
fn includes_source(&self, source: usize) -> bool {
source >= self.source_start && source < self.source_start + self.length
}
fn apply(&self, source: usize) -> Option<usize> {
if self.includes_source(source) {
let diff = source - self.source_start;
Some(self.destination_start + diff)
} else {
None
}
}
}
#[derive(Debug, Builder, Clone)]
struct Mapper {
source: String,
destination: String,
maps: Vec<Map>,
}
impl FromStr for Mapper {
type Err = BoxE;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
let mut mapper = MapperBuilder::default();
mapper.maps(vec![]);
for line in s.trim().lines() {
if mapper.source.is_none() {
let mut keys = line
.split_whitespace()
.next()
.expect("no source-dest")
.split("-to-");
mapper.source(keys.next().expect("no source key").to_owned());
mapper.destination(keys.next().expect("no destination key").to_owned());
} else if let Some(maps) = &mut mapper.maps {
maps.push(line.parse()?);
}
}
Ok(mapper.build()?)
}
}
impl Mapper {
fn apply(&self, source: usize) -> usize {
self.maps
.iter()
.find_map(|map| map.apply(source))
.unwrap_or(source)
}
}
#[derive(Debug, Builder, Clone)]
struct Seeds {
source: String,
}
#[derive(Debug, Builder)]
struct Almanac {
seeds: Seeds,
mappers: Vec<Mapper>,
}
impl Almanac {
fn map_source(&self, source: usize, start_key: &str, end_key: &str) -> usize {
let mut current_key = start_key;
let mut current_value = source;
while current_key != end_key {
let mapper = self
.mappers
.iter()
.find(|mapper| mapper.source == current_key)
.expect("could not find mapper");
current_value = mapper.apply(current_value);
current_key = &mapper.destination;
}
current_value
}
}
impl FromStr for Almanac {
type Err = BoxE;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
let mut almanac = AlmanacBuilder::default();
let mut parts = s.trim().split("\n\n");
almanac.seeds(Seeds {
source: parts.next().expect("seed line missing").to_string(),
});
almanac.mappers(vec![]);
while let Some(mapper_section) = parts.next() {
if let Some(mappers) = &mut almanac.mappers {
mappers.push(mapper_section.parse()?);
}
}
Ok(almanac.build()?)
}
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let almanac: Almanac = input.parse()?;
let parsed_time = start.elapsed();
// algo
let start = Instant::now();
let answer = almanac
.seeds
.source
.split(":")
.nth(1)
.expect("seeds missing")
.trim()
.split_whitespace()
.map(|s| s.parse::<usize>().expect("failed to parse seed as number"))
.map(|source| almanac.map_source(source, "seed", "location"))
.min()
.ok_or("failed to get min location")?;
let algo_time = start.elapsed();
// output
println!("Day 5, part 1: {answer}");
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let almanac: Almanac = input.parse()?;
let parsed_time = start.elapsed();
// algo
let start = Instant::now();
let answer = almanac
.seeds
.source
.split(":")
.nth(1)
.expect("seeds missing")
.trim()
.split_whitespace()
.map(|s| s.parse::<usize>().expect("failed to parse seed as number"))
.tuples()
.flat_map(|(start, length)| start..start + length)
.take(3000)
// Squeeze with rayon for brute force approach
.par_bridge()
.map(|source| almanac.map_source(source, "seed", "location"))
.min()
.ok_or("failed to get min location")?;
let algo_time = start.elapsed();
// output
println!("Day 5, part 2: {answer}");
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
// TODO come back and revise for a faster solution
#[tokio::main]
async fn main() -> Result<()> {
let input = utils::aoc::get_puzzle_input(5).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
static DATA: &'static str = "seeds: 79 14 55 13
seed-to-soil map:
50 98 2
52 50 48
soil-to-fertilizer map:
0 15 37
37 52 2
39 0 15
fertilizer-to-water map:
49 53 8
0 11 42
42 0 7
57 7 4
water-to-light map:
88 18 7
18 25 70
light-to-temperature map:
45 77 23
81 45 19
68 64 13
temperature-to-humidity map:
0 69 1
1 0 69
humidity-to-location map:
60 56 37
56 93 4
";
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(part1(DATA.to_owned())?, 35);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
assert_eq!(part2(DATA.to_owned())?, 46);
Ok(())
}
}

109
2023/src/bin/day06.rs Normal file
View file

@ -0,0 +1,109 @@
use aoc23::prelude::*;
use derive_builder::Builder;
static DAY: u8 = 6;
#[derive(Debug, Builder, Clone)]
struct Race {
time: usize,
record_distance: usize,
}
impl Race {
fn get_roots(&self) -> (usize, usize) {
let a = -1.0;
let b = self.time as f64;
let c = -(self.record_distance as f64);
let n1 = (-b + f64::sqrt(b * b - (4.0 * a * c))) / (2.0 * a);
let n2 = (-b - f64::sqrt(b * b - (4.0 * a * c))) / (2.0 * a);
if n1 < n2 {
// floor and round up to ensure we win
let n1 = f64::floor(n1) as usize + 1;
// ceil and round down to ensure we don't exceed time cap
let n2 = f64::ceil(n2) as usize - 1;
(n1, n2)
} else {
let n1 = f64::ceil(n1) as usize - 1;
let n2 = f64::floor(n2) as usize + 1;
(n2, n1)
}
}
fn get_ways_to_beat_count(&self) -> usize {
let (n1, n2) = self.get_roots();
if self.time < n1 {
0
} else {
let n2 = usize::min(self.time, n2);
n2 - n1 + 1
}
}
}
fn get_ways_to_beat_in_all_races(races: &[Race]) -> Result<usize> {
let mut answer = 1;
for race in races {
let ways_to_beat = race.get_ways_to_beat_count();
answer *= ways_to_beat;
}
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
// let input = utils::aoc::get_puzzle_input(DAY).await?;
println!("Day {DAY}");
println!("=====");
let races: [Race; 3] = [
Race {
time: 7,
record_distance: 9,
},
Race {
time: 15,
record_distance: 40,
},
Race {
time: 30,
record_distance: 200,
},
];
println!(
"part 1, example: {}",
get_ways_to_beat_in_all_races(&races)?
);
let races: [Race; 4] = [
Race {
time: 53,
record_distance: 250,
},
Race {
time: 91,
record_distance: 1330,
},
Race {
time: 67,
record_distance: 1081,
},
Race {
time: 68,
record_distance: 1025,
},
];
println!("part 1, real: {}", get_ways_to_beat_in_all_races(&races)?);
let races: [Race; 1] = [Race {
time: 71530,
record_distance: 940200,
}];
println!(
"part 2, example: {}",
get_ways_to_beat_in_all_races(&races)?
);
let races: [Race; 1] = [Race {
time: 53916768,
record_distance: 250133010811025,
}];
println!("part 2, real: {}", get_ways_to_beat_in_all_races(&races)?);
Ok(())
}

207
2023/src/bin/day07.rs Normal file
View file

@ -0,0 +1,207 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use itertools::Itertools;
use std::{cmp::Ordering, str::FromStr, time::Instant};
#[derive(Debug, Clone, Eq, PartialEq, PartialOrd, Ord)]
enum Strength {
HighCard,
OnePair,
TwoPair,
ThreeOfAKind,
FullHouse,
FourOfAKind,
FiveOfAKind,
}
impl Strength {
#[cfg(feature = "part2")]
fn for_hand(hand: &Hand) -> Self {
let mut counts = [0; 15];
let mut jokers = 0;
for card in hand.cards.iter() {
if card == &1 {
jokers += 1;
} else {
counts[*card as usize - 2] += 1;
}
}
let mut strength = counts
.iter()
.fold(Strength::HighCard, |strength, &count| match count {
5 => Strength::FiveOfAKind,
4 => Strength::FourOfAKind,
3 => match strength {
Strength::TwoPair => Strength::FullHouse,
Strength::OnePair => Strength::FullHouse,
_ => Strength::ThreeOfAKind,
},
2 => match strength {
Strength::ThreeOfAKind => Strength::FullHouse,
Strength::OnePair => Strength::TwoPair,
_ => Strength::OnePair,
},
_ => strength,
});
while jokers > 0 {
strength = match strength {
Strength::HighCard => Strength::OnePair,
Strength::OnePair => Strength::ThreeOfAKind,
Strength::TwoPair => Strength::FullHouse,
Strength::ThreeOfAKind => Strength::FourOfAKind,
Strength::FullHouse => Strength::FourOfAKind,
Strength::FourOfAKind => Strength::FiveOfAKind,
Strength::FiveOfAKind => Strength::FiveOfAKind,
};
jokers -= 1;
}
strength
}
#[cfg(feature = "part1")]
fn for_hand(hand: &Hand) -> Self {
let mut counts = [0; 15];
for card in hand.cards.iter() {
counts[*card as usize - 2] += 1;
}
counts
.iter()
.fold(Strength::HighCard, |strength, &count| match count {
5 => Strength::FiveOfAKind,
4 => Strength::FourOfAKind,
3 => match strength {
Strength::TwoPair => Strength::FullHouse,
Strength::OnePair => Strength::FullHouse,
_ => Strength::ThreeOfAKind,
},
2 => match strength {
Strength::ThreeOfAKind => Strength::FullHouse,
Strength::OnePair => Strength::TwoPair,
_ => Strength::OnePair,
},
_ => strength,
})
}
}
#[derive(Debug, Builder, Clone, PartialEq, Eq)]
struct Hand {
cards: Vec<u32>,
bid: usize,
}
impl Ord for Hand {
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
let self_strength = Strength::for_hand(self);
let other_strength = Strength::for_hand(other);
match self_strength.cmp(&other_strength) {
Ordering::Equal => self
.cards
.iter()
.zip(other.cards.iter())
.map(|(s, o)| s.cmp(o))
.skip_while(|ord| matches!(ord, Ordering::Equal))
.next()
.unwrap_or(Ordering::Equal),
Ordering::Less => Ordering::Less,
Ordering::Greater => Ordering::Greater,
}
}
}
impl PartialOrd for Hand {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
impl FromStr for Hand {
type Err = BoxE;
fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {
let mut splits = s.trim().split_whitespace();
Ok(HandBuilder::default()
.cards(
splits
.next()
.unwrap()
.chars()
.map(|c| {
if let Some(digit) = c.to_digit(10) {
digit
} else {
match c {
#[cfg(feature = "part1")]
'A' => 14,
#[cfg(feature = "part2")]
'A' => 13,
#[cfg(feature = "part1")]
'K' => 13,
#[cfg(feature = "part2")]
'K' => 12,
#[cfg(feature = "part1")]
'Q' => 12,
#[cfg(feature = "part2")]
'Q' => 11,
#[cfg(feature = "part1")]
'J' => 11,
#[cfg(feature = "part2")]
'J' => 1,
'T' => 10,
_ => panic!("invalid card: {}", c),
}
}
})
.collect(),
)
.bid(splits.next().unwrap().parse()?)
.build()?)
}
}
fn calculate(input: String) -> Result<usize> {
let start = Instant::now();
let answer = input
.lines()
.map(|line| line.parse::<Hand>().unwrap())
.sorted()
.enumerate()
.map(|(idx, hand)| hand.bid * (idx + 1))
.sum();
let algo_time = start.elapsed();
println!("Day {DAY}: {answer}");
println!("\t{algo_time:?}");
Ok(answer)
}
// TODO come back and revise for a faster solution
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
calculate(input.clone())?;
Ok(())
}
static DAY: u8 = 7;
#[cfg(test)]
mod tests {
use super::*;
static DATA: &'static str = "32T3K 765
T55J5 684
KK677 28
KTJJT 220
QQQJA 483";
#[test]
fn test() -> Result<()> {
#[cfg(feature = "part1")]
assert_eq!(calculate(DATA.to_owned())?, 6440);
#[cfg(feature = "part2")]
assert_eq!(calculate(DATA.to_owned())?, 5905);
Ok(())
}
}

212
2023/src/bin/day08.rs Normal file
View file

@ -0,0 +1,212 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use itertools::Itertools;
use rayon::prelude::*;
use std::{collections::HashMap, time::Instant};
extern crate regex;
use regex::Regex;
use static_init::dynamic;
// Regex is slow to compile, don't do it in the parse loop, pull it out here and
// compile it once and reuse below.
#[dynamic]
static RE_PARSE_NODE: Regex =
Regex::new(r"(?<id>\w{3}).*?(?<left>\w{3}).*?(?<right>\w{3})").expect("re_parse_node invalid");
#[derive(Debug, Builder, Clone)]
struct Node<'a> {
id: &'a str,
left: &'a str,
right: &'a str,
}
impl<'a> Node<'a> {
fn new(s: &'a str) -> Result<Self> {
let re = RE_PARSE_NODE.captures(s).expect("No match for regex");
Ok(NodeBuilder::default()
.id(re.name("id").expect("no id").as_str())
.left(re.name("left").expect("no left").as_str())
.right(re.name("right").expect("no right").as_str())
.build()?)
}
}
#[derive(Debug, Clone)]
enum Dir {
Left,
Right,
}
impl Dir {
fn from_char(c: &char) -> Self {
match c {
'L' => Self::Left,
'R' => Self::Right,
_ => panic!("Not valid dir"),
}
}
}
#[derive(Debug, Builder, Clone)]
struct Map<'a> {
dirs: Vec<Dir>,
nodes: HashMap<&'a str, Node<'a>>,
}
impl<'a> Map<'a> {
fn new(s: &'a str) -> Result<Self> {
let mut splits = s.trim().split("\n\n");
Ok(MapBuilder::default()
.dirs(
splits
.next()
.unwrap()
.trim()
.chars()
.map(|c| Dir::from_char(&c))
.collect(),
)
.nodes(
splits
.next()
.unwrap()
.trim()
.lines()
.map(|a| Node::new(a.trim()).map(|n| (n.id, n)))
.try_collect()?,
)
.build()?)
}
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let map: Map = Map::new(&input)?;
let parsed_time = start.elapsed();
// algo
let start = Instant::now();
let mut answer = 0;
let mut current = map.nodes.get("AAA").expect("no start node");
let mut dir = map.dirs.iter().cycle();
while !current.id.eq("ZZZ") {
match dir.next().unwrap() {
Dir::Left => current = map.nodes.get(current.left).expect("no left node"),
Dir::Right => current = map.nodes.get(current.right).expect("no right node"),
}
answer += 1;
}
let algo_time = start.elapsed();
// output
println!("Day {DAY}, part 1: {answer}");
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<u64> {
// parse
let start = Instant::now();
let map: Map = Map::new(&input)?;
let parsed_time = start.elapsed();
// algo
let start = Instant::now();
let currents: Vec<&Node> = map.nodes.values().filter(|n| n.id.ends_with("A")).collect();
let steps: Vec<u64> = currents
.par_iter()
.map(|node| {
let mut dir = map.dirs.iter().cycle();
let mut steps = 0;
let mut current = *node;
while !current.id.ends_with("Z") {
match dir.next().unwrap() {
Dir::Left => current = map.nodes.get(current.left).expect("no left node"),
Dir::Right => current = map.nodes.get(current.right).expect("no right node"),
}
steps += 1;
// println!("Step: {answer}"); let _ = std::io::stdout().flush();
}
steps
})
.collect();
let answer = utils::math::find_lcm(&steps[..]);
let algo_time = start.elapsed();
// output
println!("Day {DAY}, part 2: {answer}");
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
// TODO come back and revise for a faster solution
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
static DAY: u8 = 8;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(
part1(
"RL
AAA = (BBB, CCC)
BBB = (DDD, EEE)
CCC = (ZZZ, GGG)
DDD = (DDD, DDD)
EEE = (EEE, EEE)
GGG = (GGG, GGG)
ZZZ = (ZZZ, ZZZ)"
.to_owned(),
)?,
2
);
assert_eq!(
part1(
"LLR
AAA = (BBB, BBB)
BBB = (AAA, ZZZ)
ZZZ = (ZZZ, ZZZ)"
.to_owned()
)?,
6
);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
part2(
"LR
11A = (11B, XXX)
11B = (XXX, 11Z)
11Z = (11B, XXX)
22A = (22B, XXX)
22B = (22C, 22C)
22C = (22Z, 22Z)
22Z = (22B, 22B)
XXX = (XXX, XXX)"
.to_owned(),
);
Ok(())
}
}

131
2023/src/bin/day09.rs Normal file
View file

@ -0,0 +1,131 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use itertools::Itertools;
use rayon::prelude::*;
use std::{arch::x86_64::_MM_FROUND_CUR_DIRECTION, str::FromStr, time::Instant};
static DAY: u8 = 9;
fn part1(input: String) -> Result<i64> {
let start = Instant::now();
let answer: i64 = input
.lines()
.par_bridge()
.map(|line| {
let mut sequences: Vec<Vec<i64>> = vec![];
line.trim()
.split_whitespace()
.map(|s| s.parse::<i64>().expect("Failed to parse number in input"))
.enumerate()
.for_each(|(idx, num)| {
// every new number of primary history can result in a new row of depth
sequences.push(vec![]);
for depth in 0..sequences.len() {
if depth == 0 {
sequences
.get_mut(depth)
.expect("top history expected")
.push(num);
} else {
let len = sequences[depth].len();
let above = &sequences[depth - 1];
let left = *above.get(len).expect("expected value left");
let right = *above.get(len + 1).expect("expected value right");
sequences
.get_mut(depth)
.expect("seq current depth expect")
.push(right - left);
}
}
});
sequences
.iter()
.rev()
.skip_while(|seq| seq.iter().all(|n| n == &0))
.fold(0, |acc, seq| seq.last().expect("expected last value") + acc)
})
.sum();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
Ok(answer)
}
// algo
fn part2(input: String) -> Result<i64> {
let start = Instant::now();
let answer: i64 = input
.lines()
.par_bridge()
.map(|line| {
let mut sequences: Vec<Vec<i64>> = vec![];
line.trim()
.split_whitespace()
.map(|s| s.parse::<i64>().expect("Failed to parse number in input"))
.enumerate()
.for_each(|(idx, num)| {
// every new number of primary history can result in a new row of depth
sequences.push(vec![]);
for depth in 0..sequences.len() {
if depth == 0 {
sequences
.get_mut(depth)
.expect("top history expected")
.push(num);
} else {
let len = sequences[depth].len();
let above = &sequences[depth - 1];
let left = *above.get(len).expect("expected value left");
let right = *above.get(len + 1).expect("expected value right");
sequences
.get_mut(depth)
.expect("seq current depth expect")
.push(right - left);
}
}
});
sequences
.iter()
.rev()
.skip_while(|seq| seq.iter().all(|n| n == &0))
.fold(0, |acc, seq| {
seq.first().expect("expected last value") - acc
})
})
.sum();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
static DATA: &'static str = "0 3 6 9 12 15
1 3 6 10 15 21
10 13 16 21 30 45";
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(part1(DATA.to_owned())?, 114);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
assert_eq!(part2(DATA.to_owned())?, 2);
Ok(())
}
}

428
2023/src/bin/day10.rs Normal file
View file

@ -0,0 +1,428 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use itertools::Itertools;
use rayon::prelude::*;
use std::{collections::HashSet, str::FromStr, time::Instant};
static DAY: u8 = 10;
#[derive(Debug, Clone)]
enum PipeDirection {
Vertical,
Horizontal,
NorthEast,
NorthWest,
SouthWest,
SouthEast,
Start,
Ground,
}
impl PipeDirection {
fn is_north(&self) -> bool {
matches!(self, PipeDirection::NorthEast | PipeDirection::NorthWest)
}
}
#[derive(Debug, Clone)]
struct Pipe {
position: (usize, usize),
direction: PipeDirection,
}
impl Eq for Pipe {}
impl PartialEq for Pipe {
fn eq(&self, other: &Self) -> bool {
self.position == other.position
}
}
impl Pipe {
fn for_char(c: char, position: (usize, usize)) -> Self {
match c {
'|' => Self {
position,
direction: PipeDirection::Vertical,
},
'-' => Self {
position,
direction: PipeDirection::Horizontal,
},
'L' => Self {
position,
direction: PipeDirection::NorthEast,
},
'J' => Self {
position,
direction: PipeDirection::NorthWest,
},
'7' => Self {
position,
direction: PipeDirection::SouthWest,
},
'F' => Self {
position,
direction: PipeDirection::SouthEast,
},
'.' => Self {
position,
direction: PipeDirection::Ground,
},
'S' => Self {
position,
direction: PipeDirection::Start,
},
_ => panic!("invalid pipe char"),
}
}
fn connects_to(&self) -> Vec<(usize, usize)> {
let deltas = match self.direction {
PipeDirection::Vertical => Some([(-1i64, 0i64), (1, 0)]),
PipeDirection::Horizontal => Some([(0, -1), (0, 1)]),
PipeDirection::NorthEast => Some([(-1, 0), (0, 1)]),
PipeDirection::NorthWest => Some([(-1, 0), (0, -1)]),
PipeDirection::SouthWest => Some([(1, 0), (0, -1)]),
PipeDirection::SouthEast => Some([(1, 0), (0, 1)]),
_ => None,
};
match deltas {
Some(deltas) => {
let mut to = vec![];
for delta in deltas {
let (row_delta, col_delta) = delta;
let (row, col) = self.position;
if row == 0 && row_delta < 0 {
continue;
}
if col == 0 && col_delta < 0 {
continue;
}
to.push((
(row as i64 + row_delta).try_into().unwrap(),
(col as i64 + col_delta).try_into().unwrap(),
));
}
to
}
None => vec![],
}
}
}
#[derive(Debug, Clone)]
struct Pipes {
grid: Vec<Vec<Pipe>>,
start: Pipe,
}
impl Pipes {
fn new(s: &str) -> Result<Self> {
let mut start = None;
let mut grid = vec![];
for (row_index, line) in s.trim().lines().enumerate() {
let mut row = vec![];
for (col_index, char) in line.trim().chars().enumerate() {
row.push(Pipe::for_char(char, (row_index, col_index)));
if char == 'S' {
start = Some((row_index, col_index))
}
}
grid.push(row);
}
// Get actual start pipe variant for easier code on the rest of the walking code
// later
let start = start
.map(|position| {
let mut up = true;
let mut left = true;
// We assume start always has two connections by definition of the problem. Will
// assume it is up and left and swap to the opposite after checking those.
let (row, col) = position;
if let Some(down) = grid.get(row + 1) {
match down[col].direction {
PipeDirection::Vertical
| PipeDirection::NorthEast
| PipeDirection::NorthWest => {
up = false;
}
_ => {}
}
}
if let Some(right) = grid[row].get(col + 1) {
match right.direction {
PipeDirection::Horizontal
| PipeDirection::NorthWest
| PipeDirection::SouthWest => {
left = false;
}
_ => {}
}
}
if up && left {
Pipe {
position,
direction: PipeDirection::NorthWest,
}
} else if up && !left {
Pipe {
position,
direction: PipeDirection::NorthEast,
}
} else if !up && left {
Pipe {
position,
direction: PipeDirection::SouthWest,
}
} else {
Pipe {
position,
direction: PipeDirection::SouthEast,
}
}
})
.expect("start");
Ok(Self { grid, start })
}
fn get(&self, position: &(usize, usize)) -> &Pipe {
&self.grid[position.0][position.1]
}
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let pipes = Pipes::new(&input)?;
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let mut answer = 1;
let mut starters = pipes.start.connects_to().into_iter();
let mut paths: [(&Pipe, &Pipe); 2] = [
(&pipes.start, pipes.get(&starters.next().unwrap())),
(&pipes.start, pipes.get(&starters.next().unwrap())),
];
loop {
// reached end
if paths[0].1.position.0 == paths[1].1.position.0
&& paths[0].1.position.1 == paths[1].1.position.1
{
break;
}
answer += 1;
for path in paths.iter_mut() {
let next = path
.1
.connects_to()
.into_iter()
.filter(|pipe| pipe.0 != path.0.position.0 || pipe.1 != path.0.position.1)
.next()
.map(|pos| pipes.get(&pos))
.unwrap();
*path = (path.1, next);
}
}
let algo_time = a_start.elapsed();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let pipes = Pipes::new(&input)?;
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let mut path = vec![
&pipes.start,
pipes
.start
.connects_to()
.into_iter()
.next()
.map(|pos| pipes.get(&pos))
.unwrap(),
];
loop {
let previous = path.get(path.len() - 2).unwrap();
let next = path
.last()
.unwrap()
.connects_to()
.into_iter()
.filter(|pipe| pipe.0 != previous.position.0 || pipe.1 != previous.position.1)
.next()
.map(|pos| pipes.get(&pos))
.unwrap();
match next.direction {
PipeDirection::Start => {
break;
}
_ => {
path.push(next);
}
};
}
let mut answer = 0;
for (ri, row) in pipes.grid.iter().enumerate() {
for (idx, pipe) in row.iter().enumerate() {
if !path.contains(&pipe) {
// println!("Pipe check, {}, {}", ri, idx);
let (intersections, _) = row
.iter()
// Start at current non path pipe we are checking
.skip(idx + 1)
// Add fake pipe at the end so we can match on pipes on the right edge of the Grid
// .chain(std::iter::once(&Pipe { position: (0, 0), direction:
// PipeDirection::Ground, }))
.fold(
(0, None),
|(i_count, intersecting_dir): (usize, Option<&PipeDirection>), pipe| {
if path.contains(&pipe) {
return match pipe.direction {
PipeDirection::Vertical => (i_count + 1, None),
PipeDirection::NorthWest
| PipeDirection::NorthEast
| PipeDirection::SouthEast
| PipeDirection::SouthWest => match intersecting_dir {
Some(last_direction) => {
match (
last_direction.is_north(),
pipe.direction.is_north(),
) {
(true, true) | (false, false) => (i_count, None),
(true, false) | (false, true) => {
(i_count + 1, None)
}
}
}
None => (i_count, Some(&pipe.direction)),
},
PipeDirection::Horizontal => (i_count, intersecting_dir),
_ => (i_count, None),
};
}
return (i_count, None);
},
);
// println!( "\t\tPipe check, {}, {} intersections: {} | {}", ri, idx,
// intersections, (intersections > 0 && intersections % 2 == 1) );
if intersections > 0 && intersections % 2 == 1 {
answer += 1;
}
}
}
}
let algo_time = a_start.elapsed();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(
part1(
"..F7.
.FJ|.
SJ.L7
|F--J
LJ..."
.to_owned()
)?,
8
);
Ok(())
}
#[test]
fn test_part_2_small() -> Result<()> {
assert_eq!(
part2(
"...........
.S-------7.
.|F-----7|.
.||.....||.
.||.....||.
.|L-7.F-J|.
.|..|.|..|.
.L--J.L--J.
..........."
.to_owned(),
)?,
4
);
Ok(())
}
#[test]
fn test_part_2_med() -> Result<()> {
assert_eq!(
part2(
".F----7F7F7F7F-7....
.|F--7||||||||FJ....
.||.FJ||||||||L7....
FJL7L7LJLJ||LJ.L-7..
L--J.L7...LJS7F-7L7.
....F-J..F7FJ|L7L7L7
....L7.F7||L7|.L7L7|
.....|FJLJ|FJ|F7|.LJ
....FJL-7.||.||||...
....L---J.LJ.LJLJ..."
.to_owned(),
)?,
8
);
Ok(())
}
#[test]
fn test_part_2_hard() -> Result<()> {
assert_eq!(
part2(
"FF7FSF7F7F7F7F7F---7
L|LJ||||||||||||F--J
FL-7LJLJ||||||LJL-77
F--JF--7||LJLJ7F7FJ-
L---JF-JLJ.||-FJLJJ7
|F|F-JF---7F7-L7L|7|
|FFJF7L7F-JF7|JL---7
7-L-JL7||F7|L7F-7F7|
L.L7LFJ|||||FJL7||LJ
L7JLJL-JLJLJL--JLJ.L"
.to_owned(),
)?,
10
);
Ok(())
}
}

173
2023/src/bin/day11.rs Normal file
View file

@ -0,0 +1,173 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use itertools::Itertools;
use rayon::prelude::*;
use std::{str::FromStr, time::Instant};
static DAY: u8 = 11;
#[derive(Debug, Clone, Eq, PartialEq)]
struct Vec2D {
x: usize,
y: usize,
}
impl From<(usize, usize)> for Vec2D {
fn from(value: (usize, usize)) -> Self {
Self {
x: value.0,
y: value.1,
}
}
}
#[derive(Debug, Clone)]
struct Space {
galaxies: Vec<Vec2D>,
x_max: usize,
y_max: usize,
}
impl Space {
fn new(s: &str) -> Result<Self> {
let mut x_max = 0;
let mut y_max = 0;
let mut galaxies = vec![];
for (y, row) in s.trim().lines().enumerate() {
for (x, col) in row.chars().enumerate() {
if col == '#' {
galaxies.push((x, y).into());
}
x_max = x;
}
y_max = y;
}
Ok(Space {
galaxies,
x_max,
y_max,
})
}
fn expand(&mut self, by: usize) {
for y in (0..=self.y_max).rev() {
if self.galaxies.iter().filter(|g| g.y == y).count() == 0 {
self.galaxies
.iter_mut()
.filter(|g| g.y > y)
.for_each(|g| g.y += by);
}
}
for x in (0..=self.x_max).rev() {
if self.galaxies.iter().filter(|g| g.x == x).count() == 0 {
self.galaxies
.iter_mut()
.filter(|g| g.x > x)
.for_each(|g| g.x += by);
}
}
}
fn galaxy_pairs(&self) -> Vec<(&Vec2D, &Vec2D)> {
let mut galaxy_pairs = vec![];
for i in 0..self.galaxies.len() {
for i2 in i + 1..self.galaxies.len() {
galaxy_pairs.push((&self.galaxies[i], &self.galaxies[i2]));
}
}
galaxy_pairs
}
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let mut space = Space::new(&input)?;
let parsed_time = start.elapsed();
let step_start = Instant::now();
space.expand(1);
let expansion_time = step_start.elapsed();
// algo
let step_start = Instant::now();
let mut answer = 0;
for pair in space.galaxy_pairs() {
let distance = pair.0.y.abs_diff(pair.1.y) + pair.0.x.abs_diff(pair.1.x);
answer += distance;
}
let algo_time = step_start.elapsed();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\texpansion: {expansion_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let mut space = Space::new(&input)?;
let parsed_time = start.elapsed();
let step_start = Instant::now();
space.expand(1000000 - 1);
let expansion_time = step_start.elapsed();
// algo
let step_start = Instant::now();
let mut answer = 0;
for pair in space.galaxy_pairs() {
let distance = pair.0.y.abs_diff(pair.1.y) + pair.0.x.abs_diff(pair.1.x);
answer += distance;
}
let algo_time = step_start.elapsed();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\texpansion: {expansion_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
static DATA: &'static str = "...#......
.......#..
#.........
..........
......#...
.#........
.........#
..........
.......#..
#...#.....
";
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(part1(DATA.to_owned())?, 374);
Ok(())
}
#[test]
// Must set the space.expand(1000000 - 1); to (100 - 1) instead for this test
#[ignore]
fn test_part_2() -> Result<()> {
assert_eq!(part2(DATA.to_owned())?, 8410);
Ok(())
}
}

164
2023/src/bin/day12.rs Normal file
View file

@ -0,0 +1,164 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use itertools::Itertools;
use rayon::prelude::*;
use std::{collections::HashMap, str::FromStr, time::Instant};
static DAY: u8 = 12;
fn count_possibilities(
layout: &str,
contiguous: &[usize],
cache: &mut HashMap<(String, Vec<usize>), usize>,
) -> usize {
if layout.chars().count() == 0 {
return if contiguous.len() == 0 {
// println!("\tLine is variant: {layout}");
1
} else {
0
};
}
let cache_key = (layout.to_owned(), contiguous.to_vec());
if let Some(&result) = cache.get(&cache_key) {
return result;
}
// Remove leading dots
let result = if layout.starts_with('.') {
count_possibilities(layout.to_owned().trim_matches('.'), contiguous, cache)
// Try both options for ?
} else if layout.starts_with('?') {
count_possibilities(&layout.to_owned().replacen('?', &".", 1), contiguous, cache)
+ count_possibilities(&layout.to_owned().replacen('?', &"#", 1), contiguous, cache)
// If group, check if it matches
} else if layout.starts_with("#") {
// no groups left to match || not enough # to make the group || not all of this
// group are #
if contiguous.len() == 0
|| layout.chars().count() < contiguous[0]
|| layout.chars().take(contiguous[0]).any(|c| c == '.')
{
0
} else if contiguous.len() > 1 {
if layout.len() < contiguous[0] + 1
|| layout.chars().skip(contiguous[0]).next().unwrap() == '#'
{
0
} else {
count_possibilities(
&layout.chars().skip(contiguous[0] + 1).collect::<String>(),
&contiguous[1..],
cache,
)
}
} else {
count_possibilities(
&layout.chars().skip(contiguous[0]).collect::<String>(),
&contiguous[1..],
cache,
)
}
} else {
panic!("Should not get here.")
};
cache.insert(cache_key, result);
result
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let answer = input
.trim()
.lines()
.enumerate()
.par_bridge()
.map(|(idx, line)| {
let mut split = line.trim().split_whitespace();
let layout = split.next().unwrap();
let contiguous = split
.next()
.unwrap()
.split(',')
.map(|s| s.parse::<usize>().unwrap())
.collect_vec();
let count = count_possibilities(&layout, &contiguous, &mut HashMap::new());
// println!("Line {idx}: {line} = {count}");
count
})
.sum();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let answer = input
.trim()
.lines()
.enumerate()
.par_bridge()
.map(|(idx, line)| {
let mut split = line.trim().split_whitespace();
let layout = split.next().unwrap();
let contiguous = split
.next()
.unwrap()
.split(',')
.map(|s| s.parse::<usize>().unwrap())
.collect_vec();
let layout = std::iter::repeat(layout).take(5).join("?");
let contiguous = std::iter::repeat(contiguous)
.take(5)
.flatten()
.collect_vec();
let count = count_possibilities(&layout, &contiguous, &mut HashMap::new());
// println!("Line {idx}: {line} = {count}");
count
})
.sum();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
static DATA: &'static str = "???.### 1,1,3
.??..??...?##. 1,1,3
?#?#?#?#?#?#?#? 1,3,1,6
????.#...#... 4,1,1
????.######..#####. 1,6,5
?###???????? 3,2,1";
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(part1(DATA.to_owned())?, 21);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
assert_eq!(part2(DATA.to_owned())?, 525152);
Ok(())
}
}

249
2023/src/bin/day13.rs Normal file
View file

@ -0,0 +1,249 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use itertools::Itertools;
use rayon::prelude::*;
use std::{fmt::Debug, str::FromStr, time::Instant};
static DAY: u8 = 13;
#[derive(Clone)]
struct Grid {
cells: Vec<Vec<bool>>,
}
impl Debug for Grid {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
for row in &self.cells {
f.write_str("\t");
for b in row {
f.write_str(if *b { "#" } else { "." });
}
f.write_str("\n");
}
Ok(())
}
}
type Split<'a> = (&'a [Vec<bool>], &'a [Vec<bool>]);
impl Grid {
fn new(s: &str) -> Result<Self> {
Ok(Self {
cells: s
.trim()
.lines()
.map(|l| l.chars().map(|c| c == '#').collect_vec())
.collect(),
})
}
fn all_vertical_splits(&self) -> Vec<Split> {
let mut splits = vec![];
for i in 1..self.cells.len() {
splits.push(self.vertical_split(i));
}
splits
}
fn vertical_split(&self, index: usize) -> Split {
(&self.cells[0..index], &self.cells[index..])
}
fn is_vertical_mirror(top: &[Vec<bool>], bot: &[Vec<bool>]) -> bool {
let tl = top.len();
let bl = bot.len();
for i in 0..usize::min(tl, bl) {
let t = &top[tl - 1 - i];
let b = &bot[i];
// println!("\tChecking {i}: {t:?} <=> {b:?} || {}", t == b);
if t != b {
return false;
}
}
true
}
fn is_vertical_mirror_with_smudge(top: &[Vec<bool>], bot: &[Vec<bool>]) -> bool {
let tl = top.len();
let bl = bot.len();
let mut claimed_smudge = false;
for i in 0..usize::min(tl, bl) {
let t = &top[tl - 1 - i];
let b = &bot[i];
// println!( "\tChecking {i}: {t:?} <=> {b:?} || {} || {}", t == b, claimed_smudge
// );
if t != b {
if !claimed_smudge && t.iter().zip(b.iter()).filter(|(z, x)| z != x).count() == 1 {
claimed_smudge = true
} else {
return false;
}
}
}
// FFS I had `true` here but all mirrors have EXACTLY ONE smudge, not at most
// one...
claimed_smudge
}
fn clone_and_rotate(&self) -> Self {
Self {
cells: (0..self.cells[0].len())
.map(|i| self.cells.iter().map(|row| row[i]).collect())
.collect(),
}
}
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let grids = input
.split("\n\n")
.map(|g| Grid::new(g).unwrap())
.collect_vec();
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let answer: usize = grids
.iter()
.map(|grid| {
let mut vertical_mirror_at = None;
for (idx, (top, bot)) in grid.all_vertical_splits().iter().enumerate() {
if Grid::is_vertical_mirror(top, bot) {
vertical_mirror_at = Some(idx);
break;
}
}
let mut horizontal_mirror_at = None;
if vertical_mirror_at.is_none() {
let rotated = grid.clone_and_rotate();
for (idx, (top, bot)) in rotated.all_vertical_splits().iter().enumerate() {
if Grid::is_vertical_mirror(top, bot) {
horizontal_mirror_at = Some(idx);
break;
}
}
}
// index + 1 = number of rows to the left or above the mirror index
let value = horizontal_mirror_at
.map(|h| h + 1)
.or(vertical_mirror_at.map(|v| (v + 1) * 100))
.unwrap_or(0);
// println!( "Grid: vertical mirror at: {vertical_mirror_at:?}\thorizontal at:
// {horizontal_mirror_at:?} == {value}" );
value
})
.sum();
let algo_time = a_start.elapsed();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let grids = input
.split("\n\n")
.map(|g| Grid::new(g).unwrap())
.collect_vec();
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let answer: usize = grids
.iter()
.map(|grid| {
// println!("GRID: {grid:?}");
let mut vertical_mirror_at = None;
for (idx, (top, bot)) in grid.all_vertical_splits().iter().enumerate() {
if Grid::is_vertical_mirror_with_smudge(top, bot) {
// println!("GOT VERT: {idx}");
vertical_mirror_at = Some(idx);
break;
}
}
let mut horizontal_mirror_at = None;
if vertical_mirror_at.is_none() {
let rotated = grid.clone_and_rotate();
// println!("ROTATED: {grid:?}");
for (idx, (top, bot)) in rotated.all_vertical_splits().iter().enumerate() {
if Grid::is_vertical_mirror_with_smudge(top, bot) {
horizontal_mirror_at = Some(idx);
break;
}
}
}
// index + 1 = number of rows to the left or above the mirror index
let value = horizontal_mirror_at
.map(|h| h + 1)
.or(vertical_mirror_at.map(|v| (v + 1) * 100))
.unwrap_or(0);
// println!( "Grid: vertical mirror at: {vertical_mirror_at:?}\thorizontal at:
// {horizontal_mirror_at:?} == {value}" );
value
})
.sum();
let algo_time = a_start.elapsed();
// output
println!("part 2: {answer} == 31836\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
static DATA: &'static str = "#.##..##.
..#.##.#.
##......#
##......#
..#.##.#.
..##..##.
#.#.##.#.
#...##..#
#....#..#
..##..###
#####.##.
#####.##.
..##..###
#....#..#";
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(part1(DATA.to_owned())?, 405);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
assert_eq!(part2(DATA.to_owned())?, 400);
Ok(())
}
}

234
2023/src/bin/day14.rs Normal file
View file

@ -0,0 +1,234 @@
use aoc23::prelude::*;
use grid::Grid;
use itertools::Itertools;
use std::{collections::HashMap, fmt::Display, time::Instant};
static DAY: u8 = 14;
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
enum Rock {
Round,
Square,
None,
}
impl Rock {
fn from_char(char: char) -> Self {
match char {
'O' => Rock::Round,
'#' => Rock::Square,
'.' => Rock::None,
_ => panic!("unknown rock type"),
}
}
}
#[derive(Debug, Clone, Eq, PartialEq)]
struct Dish {
grid: Grid<Rock>,
}
impl std::hash::Hash for Dish {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
for r in self.grid.iter() {
r.hash(state);
}
}
}
impl Dish {
fn new(s: &str) -> Result<Self> {
let mut grid: Option<Grid<Rock>> = None;
for line in s.trim().lines() {
let rocks = line.chars().map(Rock::from_char).collect_vec();
let len = rocks.len();
match grid {
Some(ref mut grid) => {
grid.push_row(rocks);
}
None => {
grid = Some(Grid::from_vec(rocks, len));
}
}
}
let grid = grid.unwrap();
Ok(Dish { grid })
}
fn tilt_north(mut self) -> Self {
for col_idx in 0..self.grid.cols() {
let column = self.grid.iter_col(col_idx);
let column_length = column.len();
// start,end,round_count ranges for rolling zones
let mut rolling_ranges: Vec<(usize, usize, usize)> = vec![];
let mut in_range: Option<(usize, usize)> = None;
for (row_idx, rock) in column
.enumerate()
// Add one at the end so we close out our range, it should be square so it is
// treated as a wall
.chain(std::iter::once((column_length, &Rock::Square)))
{
if let Rock::Square = rock {
if let Some((start, round_count)) = in_range {
// rolling range it only including round or none, not this wall.
rolling_ranges.push((start, row_idx - 1, round_count));
in_range = None;
}
} else {
let is_round = matches!(rock, Rock::Round);
if let Some((_, ref mut round_count)) = in_range {
if is_round {
*round_count += 1;
}
} else {
in_range = Some((row_idx, if is_round { 1 } else { 0 }));
}
}
}
// Go through ranges and set them to tilt north.
rolling_ranges.iter().for_each(|(start, end, round_count)| {
let mut round_remaining = *round_count;
for i in *start..=*end {
if let Some(rock) = self.grid.get_mut(i, col_idx) {
if round_remaining > 0 {
*rock = Rock::Round;
round_remaining -= 1;
} else {
*rock = Rock::None;
}
} else {
panic!("no rock");
}
}
});
}
self
}
fn calculate_north_load(&self) -> usize {
let len = self.grid.rows();
self.grid
.iter_rows()
.enumerate()
.map(|(row_idx, row)| {
let multiplier = len - row_idx;
multiplier * row.filter(|rock| matches!(rock, Rock::Round)).count()
})
.sum()
}
}
impl Display for Dish {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
for row in self.grid.iter_rows() {
for rock in row {
match rock {
Rock::Round => f.write_str("O"),
Rock::Square => f.write_str("#"),
Rock::None => f.write_str("."),
}?;
}
f.write_str("\n")?;
}
Ok(())
}
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let mut dish = Dish::new(&input)?;
dish = dish.tilt_north();
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let answer = dish.calculate_north_load();
let algo_time = a_start.elapsed();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let mut dish = Dish::new(&input)?;
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let cycles = 1000000000;
let mut seen = HashMap::new();
let mut scores = vec![];
let mut answer = 0;
for i in 0..cycles {
for _ in 0..4 {
dish = dish.tilt_north();
dish.grid.rotate_right();
}
scores.push(dish.calculate_north_load());
if let Some(repeated_index) = seen.get(&dish) {
// Figure out final score based on sliding window of known scores within the
// repeated pattern:
//
// (cycles - repeated index) gives us the remaining times we need to run through.
// We then get the remainder of that divided by the difference of the current
// index minus all seen (total repeating count).
answer = scores
[repeated_index - 1 + (cycles - repeated_index) % (seen.len() - repeated_index)];
break;
}
seen.insert(dish.clone(), i);
}
let algo_time = a_start.elapsed();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
static DATA: &'static str = "O....#....
O.OO#....#
.....##...
OO.#O....O
.O.....O#.
O.#..O.#.#
..O..#O..O
.......O..
#....###..
#OO..#....";
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(part1(DATA.to_owned())?, 136);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
assert_eq!(part2(DATA.to_owned())?, 64);
Ok(())
}
}

190
2023/src/bin/day15.rs Normal file
View file

@ -0,0 +1,190 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use itertools::Itertools;
use rayon::prelude::*;
use std::{str::FromStr, time::Instant};
static DAY: u8 = 15;
#[derive(Debug, Clone, Default, Eq, PartialEq)]
struct Seq {
chars: Vec<char>,
}
impl Seq {
fn new(s: &str) -> Result<Self> {
Ok(Self {
chars: s.trim().chars().filter(|c| !c.is_whitespace()).collect(),
})
}
fn hash(&self) -> usize {
self.chars.iter().fold(0, |acc, char| {
let mut value = acc;
value += *char as usize;
value *= 17;
value = value % 256;
value
})
}
}
#[derive(Debug, Clone)]
enum Operation {
Remove,
// focal length
Insert(usize),
}
#[derive(Debug, Clone)]
struct LensOp {
label: Seq,
box_index: usize,
operation: Operation,
}
impl LensOp {
fn new(value: &Seq) -> Self {
let label = Seq {
chars: value
.chars
.iter()
.take_while(|c| c != &&'=' && c != &&'-')
.map(|c| *c)
.collect(),
};
let box_index = label.hash();
let mut op = value.chars.iter().skip(label.chars.len());
Self {
label,
box_index,
operation: match op.next().unwrap() {
'-' => Operation::Remove,
'=' => Operation::Insert(op.next().unwrap().to_digit(10).unwrap() as usize),
o => panic!("Unknown op {o}"),
},
}
}
}
#[derive(Debug, Clone, Default)]
struct LensBox {
lenses: Vec<LensOp>,
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let sequences: Vec<Seq> = input.split(',').map(|seq| Seq::new(seq)).try_collect()?;
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let answer = sequences.par_iter().map(Seq::hash).sum();
let algo_time = a_start.elapsed();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let lens_ops: Vec<LensOp> = input
.split(',')
.map(|seq| Seq::new(seq).unwrap())
.map(|s| LensOp::new(&s))
.collect();
let mut lens_boxes: Vec<LensBox> = std::iter::repeat_with(|| LensBox::default())
.take(256)
.collect();
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
for lens_op in lens_ops {
if let Some(lens_box) = lens_boxes.get_mut(lens_op.box_index) {
match lens_op.operation {
Operation::Remove => lens_box.lenses.retain(|lop| lop.label != lens_op.label),
Operation::Insert(_) => {
if let Some(existing) = lens_box
.lenses
.iter_mut()
.find(|lop| lop.label == lens_op.label)
{
*existing = lens_op;
} else {
lens_box.lenses.push(lens_op);
}
}
}
}
}
let answer = lens_boxes
.iter()
.enumerate()
.map(|(box_idx, lens_box)| {
lens_box
.lenses
.iter()
.enumerate()
.map(|(lens_idx, lens)| {
if let Operation::Insert(focal_length) = lens.operation {
(box_idx + 1) * (lens_idx + 1) * focal_length
} else {
panic!("How did a removal lens get in there?");
}
})
.sum::<usize>()
})
.sum();
let algo_time = a_start.elapsed();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_1_a() -> Result<()> {
assert_eq!(part1("HASH".to_owned())?, 52);
Ok(())
}
#[test]
fn test_part_1_b() -> Result<()> {
assert_eq!(
part1("rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7".to_owned())?,
1320
);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
assert_eq!(
part2("rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7".to_owned())?,
145
);
Ok(())
}
}

256
2023/src/bin/day16.rs Normal file
View file

@ -0,0 +1,256 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use grid::Grid;
use itertools::Itertools;
use rayon::prelude::*;
use std::{collections::HashSet, ops::Add, str::FromStr, time::Instant};
static DAY: u8 = 16;
#[derive(Debug, Clone, Default)]
enum Tile {
#[default]
Empty,
VerticalSplit,
HorizontalSplit,
RMirror,
LMirror,
}
impl Tile {
fn new_tile_grid(input: &str) -> Grid<Self> {
let mut grid = Grid::new(0, 0);
for line in input.lines() {
let tiles = line
.trim()
.chars()
.map(|c| match c {
'.' => Self::Empty,
'|' => Self::VerticalSplit,
'-' => Self::HorizontalSplit,
'/' => Self::RMirror,
'\\' => Self::LMirror,
unknown => panic!("unknown tile: {unknown}"),
})
.collect_vec();
grid.push_row(tiles);
}
grid
}
fn direction_to(&self, direction: &Dir) -> Vec<Dir> {
match self {
Tile::Empty => vec![direction.clone()],
Tile::VerticalSplit => match direction {
Dir::Up | Dir::Down => vec![direction.clone()],
Dir::Right | Dir::Left => vec![Dir::Up, Dir::Down],
},
Tile::HorizontalSplit => match direction {
Dir::Right | Dir::Left => vec![direction.clone()],
Dir::Up | Dir::Down => vec![Dir::Right, Dir::Left],
},
Tile::RMirror => vec![match direction {
Dir::Up => Dir::Right,
Dir::Right => Dir::Up,
Dir::Down => Dir::Left,
Dir::Left => Dir::Down,
}],
Tile::LMirror => vec![match direction {
Dir::Up => Dir::Left,
Dir::Right => Dir::Down,
Dir::Down => Dir::Right,
Dir::Left => Dir::Up,
}],
}
}
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
enum Dir {
Up,
Right,
Down,
Left,
}
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
struct Beam(usize, usize, Dir);
impl Beam {
fn add_dir(&self, dir: &Dir) -> Self {
Self(
match dir {
Dir::Up => self.0.saturating_sub(1),
Dir::Down => self.0.saturating_add(1),
_ => self.0,
},
match dir {
Dir::Left => self.1.saturating_sub(1),
Dir::Right => self.1.saturating_add(1),
_ => self.1,
},
dir.clone(),
)
}
fn next_path(&self, tiles: &Grid<Tile>) -> Vec<Beam> {
tiles
.get(self.0, self.1)
.map(|tile| tile.direction_to(&self.2))
.map(|dirs| {
dirs.iter()
.map(|dir| self.add_dir(dir))
.filter(|beam| tiles.get(beam.0, beam.1).is_some())
.collect_vec()
})
.unwrap_or(vec![])
}
fn part2_starts(grid: &Grid<Tile>) -> Vec<Self> {
let mut starts = vec![];
let rows = grid.rows();
let cols = grid.cols();
starts.push(Beam(0, 0, Dir::Right));
starts.push(Beam(0, 0, Dir::Down));
starts.push(Beam(0, cols - 1, Dir::Down));
starts.push(Beam(0, cols - 1, Dir::Left));
starts.push(Beam(rows - 1, cols - 1, Dir::Left));
starts.push(Beam(rows - 1, cols - 1, Dir::Up));
starts.push(Beam(rows - 1, 0, Dir::Up));
starts.push(Beam(rows - 1, 0, Dir::Right));
for row in 1..rows - 2 {
starts.push(Beam(row, 0, Dir::Right));
starts.push(Beam(row, cols - 1, Dir::Left));
}
for col in 1..cols - 2 {
starts.push(Beam(0, col, Dir::Down));
starts.push(Beam(rows - 1, col, Dir::Up));
}
starts
}
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let grid = Tile::new_tile_grid(&input);
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let mut energized = HashSet::new();
let mut full_beam = HashSet::new();
let mut beam_path = vec![Beam(0, 0, Dir::Right)];
while let Some(beam) = beam_path.pop() {
energized.insert((beam.0, beam.1));
full_beam.insert(beam.clone());
beam.next_path(&grid)
.into_iter()
.filter(|b| !full_beam.contains(b))
.for_each(|new_beam| {
beam_path.push(new_beam);
});
}
let answer = energized.len();
let algo_time = a_start.elapsed();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let grid = Tile::new_tile_grid(&input);
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let answer = Beam::part2_starts(&grid)
.into_iter()
.map(|start| {
let mut energized = HashSet::new();
let mut full_beam = HashSet::new();
let mut beam_path = vec![start];
while let Some(beam) = beam_path.pop() {
energized.insert((beam.0, beam.1));
full_beam.insert(beam.clone());
beam.next_path(&grid)
.into_iter()
.filter(|b| !full_beam.contains(b))
.for_each(|new_beam| {
beam_path.push(new_beam);
});
}
energized.len()
})
.max()
.unwrap();
let algo_time = a_start.elapsed();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(
part1(
r#".|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|...."#
.to_owned(),
)?,
46
);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
assert_eq!(
part2(
r#".|...\....
|.-.\.....
.....|-...
........|.
..........
.........\
..../.\\..
.-.-/..|..
.|....-|.\
..//.|...."#
.to_owned(),
)?,
51
);
Ok(())
}
}

259
2023/src/bin/day17.rs Normal file
View file

@ -0,0 +1,259 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use grid::Grid;
use itertools::Itertools;
use pathfinding::prelude::dijkstra;
use rayon::prelude::*;
use std::{
collections::{HashMap, HashSet},
str::FromStr,
time::Instant,
};
static DAY: u8 = 17;
type Pos = (usize, usize);
fn delta_pos(from: &Pos, to: &Pos) -> (isize, isize) {
return (
to.0 as isize - from.0 as isize,
to.1 as isize - from.1 as isize,
);
}
fn grid(input: &str) -> Grid<usize> {
let mut grid = Grid::new(0, 0);
for line in input.lines() {
let weights = line
.trim()
.chars()
.map(|c| c.to_digit(10).expect("invalid weight") as usize)
.collect_vec();
grid.push_row(weights);
}
grid
}
struct Graph {
edges: HashMap<Pos, HashMap<Pos, usize>>,
}
impl Graph {
fn new_from_weighted_grid(weights: &Grid<usize>) -> Self {
let mut edges = HashMap::new();
for r in 0..weights.rows() {
for c in 0..weights.cols() {
let pos = (r, c);
for (n_pos, n_weight) in weights.neighbors_orthogonal(pos) {
edges
.entry(pos)
.or_insert_with(|| HashMap::new())
.insert(n_pos, *n_weight);
}
}
}
Self { edges }
}
fn shortest_path_with_movement_limit(
&self,
start: Pos,
end: Pos,
move_limit_min: usize,
move_limit_max: usize,
) -> usize {
// TODO min move limit?
let valid_move_in_limit =
|delta: (isize, isize), since: &Pos, predecessors: &HashMap<Pos, Option<Pos>>| {
let mut current = since;
let mut previous = vec![];
for i in 0..move_limit_max {
if let Some(Some(prev)) = predecessors.get(current) {
let previous_movement = delta_pos(prev, current);
if previous_movement != delta {
// movement is different we are okay
break;
} else if i == (move_limit_max - 1) {
// movement is the same and we are not at the movement limit, break out of this
// path, not allowed
previous.push(*current);
return (false, previous);
} else {
// check the prior element
previous.push(*current);
current = prev;
}
} else {
// no path we are good
break;
}
}
(true, previous)
};
// based on https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
let mut queue: HashMap<Pos, usize> = HashMap::new();
let mut distances: HashMap<Pos, usize> = HashMap::new();
let mut predecessors: HashMap<Pos, Option<Pos>> = HashMap::new();
self.edges.iter().for_each(|(pos, _)| {
distances.insert(*pos, usize::MAX);
predecessors.insert(*pos, None);
queue.insert(*pos, 0);
});
distances.insert(start, 0);
// go from start node and check all other nodes
while queue.len() > 0 {
let ((current, backtrack), distance) = queue
.iter()
.map(|item| (item, distances.get(item.0).unwrap()))
.sorted_by(|(_, distance_a), (_, distance_b)| distance_a.cmp(distance_b))
.next()
.unwrap();
let current = *current;
let distance = *distance;
queue.remove(&current);
// Can terminate dijkstra early if we hit our end value.
if current == end {
break;
}
self.edges
.get(&current)
.unwrap()
.iter()
.filter(|(neighbor, n_dist)| {
let movement = delta_pos(&current, neighbor);
let in_queue = queue.contains_key(neighbor);
let is_not_backwards = {
let pred = predecessors.get(&current).unwrap().unwrap();
let pred_movement = delta_pos(&pred, &current);
// not 180 degree turn
!(pred_movement.0 * -1 == movement.0 && pred_movement.1 * -1 == movement.1)
};
let (valid_movement, _) =
valid_move_in_limit(movement, &current, &predecessors);
if in_queue && is_not_backwards && !valid_movement {
// if not valid movement in limits then backtrack and try those again ... todo
// TODO Do this thing?
}
return in_queue && valid_movement;
})
.for_each(|(neighbor, n_dist)| {
let current_n_dist = *distances.get(neighbor).unwrap();
let alt = distance + n_dist;
if alt < current_n_dist {
distances.insert(*neighbor, alt);
predecessors.insert(*neighbor, Some(current.clone()));
}
});
}
*distances.get(&end).unwrap()
}
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let weights = grid(&input);
let graph = Graph::new_from_weighted_grid(&weights);
let root = (0, 0);
let goal = (weights.rows() - 1, weights.cols() - 1);
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let answer = graph.shortest_path_with_movement_limit(root, goal, 1, 3);
let algo_time = a_start.elapsed();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let weights = grid(&input);
let graph = Graph::new_from_weighted_grid(&weights);
let root = (0, 0);
let goal = (weights.rows() - 1, weights.cols() - 1);
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let mut answer = 0;
let algo_time = a_start.elapsed();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(
part1(
"2413432311323
3215453535623
3255245654254
3446585845452
4546657867536
1438598798454
4457876987766
3637877979653
4654967986887
4564679986453
1224686865563
2546548887735
4322674655533"
.to_owned(),
)?,
102
);
Ok(())
}
#[test]
#[ignore]
fn test_part_2() -> Result<()> {
assert_eq!(
part2(
"2413432311323
3215453535623
3255245654254
3446585845452
4546657867536
1438598798454
4457876987766
3637877979653
4654967986887
4564679986453
1224686865563
2546548887735
4322674655533"
.to_owned(),
)?,
0
);
Ok(())
}
}

180
2023/src/bin/day18.rs Normal file
View file

@ -0,0 +1,180 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use geo::{Area, Coord, Coordinate, LineString, Polygon};
use itertools::Itertools;
use pathfinding::num_traits::{Float, Signed};
use rayon::prelude::*;
use std::{collections::HashSet, str::FromStr, time::Instant};
static DAY: u8 = 18;
#[derive(Debug, Clone)]
struct DigCommand {
direction: char,
distance: i32,
color: String,
}
#[derive(Debug, Clone)]
struct DigPlan {
commands: Vec<DigCommand>,
}
impl DigPlan {
fn new(s: &str) -> Result<Self> {
let commands = s
.lines()
.map(|line| {
let parts: Vec<&str> = line.split_whitespace().collect();
if parts.len() != 3 {
return Err("Invalid command format".into());
}
Ok(DigCommand {
direction: parts[0].chars().next().ok_or("Invalid direction")?,
distance: parts[1].parse()?,
color: parts[2].to_string(),
})
})
.collect::<Result<Vec<DigCommand>>>()?;
Ok(Self { commands })
}
fn calculate_poly(&self) -> geo::Polygon {
let mut position = (0, 0);
let mut visited: Vec<(i32, i32)> = vec![position];
for command in &self.commands {
let (dx, dy) = match command.direction {
'U' => (0, -1),
'D' => (0, 1),
'L' => (-1, 0),
'R' => (1, 0),
_ => unreachable!(),
};
for _ in 0..command.distance {
position.0 += dx;
position.1 += dy;
visited.push(position);
}
}
if *visited.last().unwrap() != *visited.first().unwrap() {
panic!("expected a closed loop")
}
if visited.iter().sorted_unstable().dedup().count() != visited.len() - 1 {
panic!("Loop intersected with itself more than the 1 allowed time for the start node");
}
println!("visited {}: {visited:?}", visited.len());
let coordinates: Vec<Coordinate<f64>> = visited
.into_iter()
.map(|(x, y)| Coordinate {
x: x as f64,
y: y as f64,
})
.collect_vec();
Polygon::new(LineString::from(coordinates), vec![])
// visited.len()
}
}
fn part1(input: String) -> Result<usize> {
println!("Input\n====\n{input}\n\n");
// parse
let start = Instant::now();
let dig_plan = DigPlan::new(&input)?;
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let polygon = dig_plan.calculate_poly();
let answer = polygon.signed_area().abs();
let algo_time = a_start.elapsed();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer as usize)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let dig_plan = DigPlan::new(&input)?;
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let mut answer = 0;
let algo_time = a_start.elapsed();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(
part1(
"R 6 (#70c710)
D 5 (#0dc571)
L 2 (#5713f0)
D 2 (#d2c081)
R 2 (#59c680)
D 2 (#411b91)
L 5 (#8ceee2)
U 2 (#caa173)
L 1 (#1b58a2)
U 2 (#caa171)
R 2 (#7807d2)
U 3 (#a77fa3)
L 2 (#015232)
U 2 (#7a21e3)"
.to_owned(),
)?,
62
);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
assert_eq!(
part2(
"R 6 (#70c710)
D 5 (#0dc571)
L 2 (#5713f0)
D 2 (#d2c081)
R 2 (#59c680)
D 2 (#411b91)
L 5 (#8ceee2)
U 2 (#caa173)
L 1 (#1b58a2)
U 2 (#caa171)
R 2 (#7807d2)
U 3 (#a77fa3)
L 2 (#015232)
U 2 (#7a21e3)"
.to_owned(),
)?,
0
);
Ok(())
}
}

425
2023/src/bin/day19.rs Normal file
View file

@ -0,0 +1,425 @@
use aoc23::prelude::*;
use itertools::Itertools;
use regex::Regex;
use static_init::dynamic;
use std::{collections::HashMap, time::Instant};
static DAY: u8 = 19;
#[dynamic]
static RE_PARSE_PART: Regex = Regex::new(r"x=(?<x>\d+).*m=(?<m>\w+).*a=(?<a>\d+).*s=(?<s>\d+)")
.expect("re_parse_part invalid");
#[dynamic]
static RE_PARSE_WORKFLOW: Regex =
Regex::new(r"^(?<name>\w+)\{(?<ops>.*)}").expect("re_parse_workflow invalid");
#[derive(Debug, Clone)]
struct Part {
x: usize,
m: usize,
a: usize,
s: usize,
}
impl Part {
fn new_from_line(line: &str) -> Self {
let re = RE_PARSE_PART.captures(line).expect("part does not match");
Self {
x: re.name("x").unwrap().as_str().parse().unwrap(),
m: re.name("m").unwrap().as_str().parse().unwrap(),
a: re.name("a").unwrap().as_str().parse().unwrap(),
s: re.name("s").unwrap().as_str().parse().unwrap(),
}
}
}
#[derive(Debug, Clone)]
enum PartCategory {
X,
M,
A,
S,
}
impl PartCategory {
fn new_from_char(c: &char) -> Self {
match c {
'x' => Self::X,
'm' => Self::M,
'a' => Self::A,
's' => Self::S,
_ => panic!("wee woo"),
}
}
fn value_of(&self, part: &Part) -> usize {
match self {
PartCategory::X => part.x,
PartCategory::M => part.m,
PartCategory::A => part.a,
PartCategory::S => part.s,
}
}
}
#[derive(Debug, Clone)]
enum BasicFlowOp {
Accept,
Reject,
Route(String),
}
impl BasicFlowOp {
fn new_from_line(line: &str) -> Self {
match line {
"A" => Self::Accept,
"R" => Self::Reject,
route => Self::Route(route.to_owned()),
}
}
fn as_flow_op(&self) -> FlowOp {
match self {
BasicFlowOp::Accept => FlowOp::Accept,
BasicFlowOp::Reject => FlowOp::Reject,
BasicFlowOp::Route(to) => FlowOp::Route(to.to_owned()),
}
}
fn part2_to(&self) -> String {
match self {
BasicFlowOp::Accept => "A".to_owned(),
BasicFlowOp::Reject => "R".to_owned(),
BasicFlowOp::Route(to) => to.to_owned(),
}
}
}
#[derive(Debug, Clone)]
enum FlowOp {
LessThan(PartCategory, usize, BasicFlowOp),
GreaterThan(PartCategory, usize, BasicFlowOp),
Accept,
Reject,
Route(String),
}
impl FlowOp {
fn new_from_line(line: &str) -> Self {
let split = line.split([':', ',', '>', '<']).collect_vec();
if split.len() == 1 {
BasicFlowOp::new_from_line(split.get(0).unwrap()).as_flow_op()
} else {
if line.contains('>') {
Self::GreaterThan(
PartCategory::new_from_char(&split.get(0).unwrap().chars().next().unwrap()),
split.get(1).unwrap().parse().unwrap(),
BasicFlowOp::new_from_line(split.get(2).unwrap()),
)
} else {
Self::LessThan(
PartCategory::new_from_char(&split.get(0).unwrap().chars().next().unwrap()),
split.get(1).unwrap().parse().unwrap(),
BasicFlowOp::new_from_line(split.get(2).unwrap()),
)
}
}
}
}
#[derive(Debug, Clone)]
struct Workflow {
name: String,
flow: Vec<FlowOp>,
}
impl Workflow {
fn new_from_line(line: &str) -> Self {
let re = RE_PARSE_WORKFLOW
.captures(line)
.expect("workflow does not match");
Self {
name: re.name("name").unwrap().as_str().to_owned(),
flow: re
.name("ops")
.unwrap()
.as_str()
.split(',')
.map(FlowOp::new_from_line)
.collect(),
}
}
}
fn parse_system(input: &str) -> (HashMap<String, Workflow>, Vec<Part>) {
let split = input.split("\n\n").collect_vec();
(
split
.get(0)
.unwrap()
.lines()
.map(Workflow::new_from_line)
.map(|w| (w.name.clone(), w))
.collect(),
split
.get(1)
.unwrap()
.lines()
.map(Part::new_from_line)
.collect(),
)
}
fn check_part_accepted(part: &Part, workflows: &HashMap<String, Workflow>) -> bool {
let mut current_workflow = workflows.get("in");
'flows: while let Some(workflow) = current_workflow {
current_workflow = None;
for flow_op in workflow.flow.iter() {
let basic_op = match flow_op {
FlowOp::LessThan(cat, num, bop) => {
if cat.value_of(part) < *num {
bop.as_flow_op()
} else {
continue;
}
}
FlowOp::GreaterThan(cat, num, bop) => {
if cat.value_of(part) > *num {
bop.as_flow_op()
} else {
continue;
}
}
op => op.clone(),
};
match basic_op {
FlowOp::Accept => return true,
FlowOp::Reject => return false,
FlowOp::Route(to) => {
current_workflow = workflows.get(&to);
continue 'flows;
}
_ => panic!("not basic"),
}
}
}
panic!("why are we here?")
}
fn part1(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let (workflows, parts) = parse_system(&input);
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let answer = parts
.iter()
.filter_map(|p| check_part_accepted(p, &workflows).then(|| p.x + p.m + p.a + p.s))
.sum();
let algo_time = a_start.elapsed();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let (workflows, _) = parse_system(&input);
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
// LOL yeah right... no no no to brute force on this one
//
// ```
// let bar = ProgressBar::new(4000 * 4000 * 4000 * 4000);
// let answer = iproduct!(1..=4000usize, 1..=4000usize, 1..=4000usize, 1..=4000usize)
// .par_bridge()
// .map(|(x, m, a, s)| {
// bar.inc(1);
// Part { x, m, a, s }
// })
// .filter(|part| check_part_accepted(part, &workflows))
// .count();
// bar.finish();
// ```
//
// Honestly copied someone else's approach for this one...
// https://github.com/klimesf/advent-of-code/blob/master/src/y2023/day19.rs
let mut stack: Vec<(
(usize, usize),
(usize, usize),
(usize, usize),
(usize, usize),
String,
usize,
)> = vec![(
(1, 4000),
(1, 4000),
(1, 4000),
(1, 4000),
"in".to_owned(),
0,
)];
let mut accepted: Vec<(
(usize, usize),
(usize, usize),
(usize, usize),
(usize, usize),
)> = vec![];
while let Some(range) = stack.pop() {
let (x, m, a, s, wf_key, rule_key) = range;
if wf_key == "A" {
accepted.push((x, m, a, s));
continue;
} else if wf_key == "R" {
continue;
}
// Invalid bounds check
if x.0 > x.1 || m.0 > m.1 || a.0 > a.1 || s.0 > s.1 {
continue;
}
let workflow = workflows.get(&wf_key).unwrap();
let flow_op = &workflow.flow[rule_key];
match flow_op {
FlowOp::Accept => {
accepted.push((x, m, a, s));
continue;
}
FlowOp::Reject => {
continue;
}
FlowOp::Route(new_wf_key) => {
stack.push((x, m, a, s, new_wf_key.to_owned(), 0));
continue;
}
FlowOp::GreaterThan(category, number, flow_op) => match category {
PartCategory::X => {
stack.push(((number + 1, x.1), m, a, s, flow_op.part2_to(), 0));
stack.push(((x.0, *number), m, a, s, wf_key, rule_key + 1));
}
PartCategory::M => {
stack.push((x, (number + 1, m.1), a, s, flow_op.part2_to(), 0));
stack.push((x, (m.0, *number), a, s, wf_key, rule_key + 1));
}
PartCategory::A => {
stack.push((x, m, (number + 1, a.1), s, flow_op.part2_to(), 0));
stack.push((x, m, (a.0, *number), s, wf_key, rule_key + 1));
}
PartCategory::S => {
stack.push((x, m, a, (number + 1, s.1), flow_op.part2_to(), 0));
stack.push((x, m, a, (s.0, *number), wf_key, rule_key + 1));
}
},
FlowOp::LessThan(category, number, flow_op) => match category {
PartCategory::X => {
stack.push(((x.0, number - 1), m, a, s, flow_op.part2_to(), 0));
stack.push(((*number, x.1), m, a, s, wf_key, rule_key + 1));
}
PartCategory::M => {
stack.push((x, (m.0, number - 1), a, s, flow_op.part2_to(), 0));
stack.push((x, (*number, m.1), a, s, wf_key, rule_key + 1));
}
PartCategory::A => {
stack.push((x, m, (a.0, number - 1), s, flow_op.part2_to(), 0));
stack.push((x, m, (*number, a.1), s, wf_key, rule_key + 1));
}
PartCategory::S => {
stack.push((x, m, a, (s.0, number - 1), flow_op.part2_to(), 0));
stack.push((x, m, a, (*number, s.1), wf_key, rule_key + 1));
}
},
}
}
let answer = accepted
.iter()
.map(|(x, m, a, s)| (x.1 - x.0 + 1) * (m.1 - m.0 + 1) * (a.1 - a.0 + 1) * (s.1 - s.0 + 1))
.sum();
let algo_time = a_start.elapsed();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(
part1(
"px{a<2006:qkq,m>2090:A,rfg}
pv{a>1716:R,A}
lnx{m>1548:A,A}
rfg{s<537:gd,x>2440:R,A}
qs{s>3448:A,lnx}
qkq{x<1416:A,crn}
crn{x>2662:A,R}
in{s<1351:px,qqz}
qqz{s>2770:qs,m<1801:hdj,R}
gd{a>3333:R,R}
hdj{m>838:A,pv}
{x=787,m=2655,a=1222,s=2876}
{x=1679,m=44,a=2067,s=496}
{x=2036,m=264,a=79,s=2244}
{x=2461,m=1339,a=466,s=291}
{x=2127,m=1623,a=2188,s=1013}
"
.to_owned(),
)?,
19114
);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
assert_eq!(
part2(
"px{a<2006:qkq,m>2090:A,rfg}
pv{a>1716:R,A}
lnx{m>1548:A,A}
rfg{s<537:gd,x>2440:R,A}
qs{s>3448:A,lnx}
qkq{x<1416:A,crn}
crn{x>2662:A,R}
in{s<1351:px,qqz}
qqz{s>2770:qs,m<1801:hdj,R}
gd{a>3333:R,R}
hdj{m>838:A,pv}
{x=787,m=2655,a=1222,s=2876}
{x=1679,m=44,a=2067,s=496}
{x=2036,m=264,a=79,s=2244}
{x=2461,m=1339,a=466,s=291}
{x=2127,m=1623,a=2188,s=1013}
"
.to_owned(),
)?,
167409079868000
);
Ok(())
}
}

81
2023/src/bin/template.rs Normal file
View file

@ -0,0 +1,81 @@
use aoc23::prelude::*;
use derive_builder::Builder;
use itertools::Itertools;
use rayon::prelude::*;
use std::{str::FromStr, time::Instant};
static DAY: u8 = TODO;
#[derive(Debug, Clone)]
struct Todo {}
impl Todo {
fn new(s: &str) -> Result<Self> {
Ok(Self {})
}
}
fn part1(input: String) -> Result<usize> {
println!("Input\n====\n{input}\n\n");
// parse
let start = Instant::now();
let todo = Todo::new(&input)?;
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let mut answer = 0;
let algo_time = a_start.elapsed();
// output
println!("part 1: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
fn part2(input: String) -> Result<usize> {
// parse
let start = Instant::now();
let todo = Todo::new(&input)?;
let parsed_time = start.elapsed();
// algo
let a_start = Instant::now();
let mut answer = 0;
let algo_time = a_start.elapsed();
// output
println!("part 2: {answer}\t[total: {:?}]", start.elapsed());
println!("\tparse: {parsed_time:?}");
println!("\talgo: {algo_time:?}");
Ok(answer)
}
#[tokio::main]
async fn main() -> Result<()> {
println!("Day {DAY}");
println!("=====");
let input = utils::aoc::get_puzzle_input(DAY).await?;
part1(input.clone())?;
part2(input.clone())?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_part_1() -> Result<()> {
assert_eq!(part1("REPLACE".to_owned())?, 0);
Ok(())
}
#[test]
fn test_part_2() -> Result<()> {
assert_eq!(part2("REPLACE".to_owned())?, 0);
Ok(())
}
}

66
2023/src/bin/test.rs Normal file
View file

@ -0,0 +1,66 @@
use std::io::{self, Write};
use std::thread;
use std::time::Duration;
fn main() {
let mut food = (0, 0);
let mut snake = vec![(1, 2), (1, 3)];
let mut direction = (0, 1);
print_board(&snake, &food);
loop {
let command: String = io::stdin().lock().read_line().unwrap();
match command.as_str() {
"\n" | "" => {}
"w" | "W" => direction = (0, -1),
"a" | "A" => direction = (-1, 0),
"s" | "S" => direction = (0, 1),
"d" | "D" => direction = (1, 0),
_ => println!("Invalid command!"),
}
let new_head = get_new_position(&snake.last().unwrap(), &direction);
if snake.contains(&new_head)
|| new_head.0 < 0
|| new_head.0 >= 20
|| new_head.1 < 0
|| new_head.1 >= 20
{
println!("Game over!");
break;
}
snake.push(new_head);
if new_head == food {
food = get_new_food();
} else {
snake.remove(0);
}
print_board(&snake, &food);
thread::sleep(Duration::from_millis(50));
}
}
fn get_new_position(head: &(i32, i32), direction: &(i32, i32)) -> (i32, i32) {
let x = head.0 + direction.0;
let y = head.1 + direction.1;
(x, y)
}
fn get_new_food() -> (i32, i32) {
(rand::random::<i32>() % 20, rand::random::<i32>() % 20)
}
fn print_board(snake: &Vec<(i32, i32)>, food: &(i32, i32)) {
// Clear screen
print!("\x1b[H\x1b[J");
for y in 0..20 {
for x in 0..20 {
if snake.contains(&(x, y)) {
print!("");
} else if (x, y) == *food {
print!("*");
} else {
print!(".");
}
}
println!();
}
}

12
2023/src/lib.rs Normal file
View file

@ -0,0 +1,12 @@
#[cfg(all(feature = "part1", feature = "part2"))]
compile_error!("Part 1 and Part 2 are mutually exclusive and cannot be enabled together");
pub mod utils;
pub mod prelude {
pub use super::utils::{
self,
common::{BoxE, Result, SError, SResult},
config::get_config,
grid::GridExtras,
};
}

61
2023/src/utils/aoc.rs Normal file
View file

@ -0,0 +1,61 @@
use crate::prelude::*;
use reqwest::{
header::{self, COOKIE},
Client,
};
use reqwest_middleware::{ClientBuilder as MiddlewareClientBuilder, ClientWithMiddleware};
use reqwest_retry::{policies::ExponentialBackoff, RetryTransientMiddleware};
use std::fs::{self, File};
use std::io::{Read, Write};
use std::path::PathBuf;
static AOC_PUZZLE_INPUT_CACHE: &str = "aoc_puzzle_cache";
pub async fn get_puzzle_input(day: u8) -> Result<String> {
let file_name = format!("day_{:02}", day);
let cache_path = PathBuf::from(AOC_PUZZLE_INPUT_CACHE).join(file_name);
if cache_path.exists() {
// Read from the cache file
let mut cache_file = File::open(cache_path)?;
let mut contents = String::new();
cache_file.read_to_string(&mut contents)?;
Ok(contents)
} else {
// Fetch the content from the URL
let response = aoc_client()
.await?
.get(format!("https://adventofcode.com/2023/day/{}/input", day))
.send()
.await?
.text()
.await?;
// Cache the content to a file Ensure the cache directory exists
fs::create_dir_all(AOC_PUZZLE_INPUT_CACHE)?;
let mut cache_file = File::create(cache_path)?;
cache_file.write_all(response.as_bytes())?;
Ok(response)
}
}
pub async fn aoc_client() -> Result<ClientWithMiddleware> {
let session = &get_config().aoc_session;
let mut session_cookie = header::HeaderValue::from_str(&format!("session={}", session))
.expect("failed to create header with api_key.");
session_cookie.set_sensitive(true);
let mut headers = header::HeaderMap::new();
headers.insert(COOKIE, session_cookie);
let client = Client::builder()
.default_headers(headers)
.gzip(true)
.brotli(true)
.deflate(true)
.https_only(false)
.build()?;
let client = MiddlewareClientBuilder::new(client)
.with(RetryTransientMiddleware::new_with_policy(
ExponentialBackoff::builder().build_with_max_retries(2),
))
.build();
Ok(client)
}

4
2023/src/utils/common.rs Normal file
View file

@ -0,0 +1,4 @@
pub type SResult<T, R> = std::result::Result<T, R>;
pub type SError = dyn std::error::Error;
pub type BoxE = Box<SError>;
pub type Result<T> = SResult<T, BoxE>;

20
2023/src/utils/config.rs Normal file
View file

@ -0,0 +1,20 @@
use std::{env::var, sync::OnceLock};
static CONFIG: OnceLock<Config> = OnceLock::new();
pub struct Config {
pub aoc_session: String,
}
impl Config {}
fn get_var(var_name: &str) -> String {
var(var_name).unwrap_or("".to_owned())
}
pub fn get_config() -> &'static Config {
let config = CONFIG.get_or_init(|| Config {
aoc_session: get_var("AOC_SESSION"),
});
config
}

36
2023/src/utils/grid.rs Normal file
View file

@ -0,0 +1,36 @@
use super::math::orthogonal_u_bounded;
use grid::Grid;
use std::collections::HashMap;
pub trait GridExtras<T> {
fn neighbors_all(&self, pos: (usize, usize)) -> HashMap<(usize, usize), &T>;
fn neighbors_orthogonal(&self, pos: (usize, usize)) -> HashMap<(usize, usize), &T>;
}
impl<T> GridExtras<T> for Grid<T> {
fn neighbors_all(&self, pos: (usize, usize)) -> HashMap<(usize, usize), &T> {
let mut n = HashMap::new();
for r in -1..=1 {
for c in -1..=1 {
// skip self
if r == 0 && c == 0 {
continue;
}
if let Some(neighbor) = pos.0.checked_add_signed(r).zip(pos.1.checked_add_signed(c))
{
if let Some(t) = self.get(neighbor.0, neighbor.1) {
n.insert(neighbor, t);
}
}
}
}
n
}
fn neighbors_orthogonal(&self, pos: (usize, usize)) -> HashMap<(usize, usize), &T> {
orthogonal_u_bounded(pos)
.into_iter()
.filter_map(|(pos, _delta)| self.get(pos.0, pos.1).map(|t| (pos, t)))
.collect()
}
}

27
2023/src/utils/math.rs Normal file
View file

@ -0,0 +1,27 @@
fn gcd(a: u64, b: u64) -> u64 {
if b == 0 {
a
} else {
gcd(b, a % b)
}
}
fn lcm(a: u64, b: u64) -> u64 {
a / gcd(a, b) * b
}
pub fn find_lcm(numbers: &[u64]) -> u64 {
numbers.iter().cloned().fold(1, |acc, num| lcm(acc, num))
}
pub fn orthogonal_u_bounded(root: (usize, usize)) -> Vec<((usize, usize), (isize, isize))> {
[(0, 1), (0, -1), (1, 0), (-1, 0)]
.into_iter()
.filter_map(|delta| {
root.0
.checked_add_signed(delta.0)
.zip(root.1.checked_add_signed(delta.1))
.map(|new_pos| (new_pos, delta))
})
.collect()
}

5
2023/src/utils/mod.rs Normal file
View file

@ -0,0 +1,5 @@
pub mod aoc;
pub mod common;
pub mod config;
pub mod grid;
pub mod math;