Compare commits
	
		
			25 Commits
		
	
	
		
			64cb7fb370
			...
			main
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| c2d5545139 | |||
| 466d79e81a | |||
| 911a60ab6c | |||
| 985b88f0aa | |||
| cd42646864 | |||
| 5ce4e2b51b | |||
| a83cef34f0 | |||
| 78df584c4d | |||
| 4cb23761b2 | |||
| 5296af36dd | |||
| b410fa49ca | |||
| 27a236f958 | |||
| e55dcd47a3 | |||
| ff241d76cb | |||
| 6e3d6625ee | |||
| b20aa6fbdc | |||
| 312460ffa5 | |||
| 86c52a1a59 | |||
| f56780d1cf | |||
| fa842890ce | |||
| 548f1b3d73 | |||
| 2299375c7c | |||
| 93ce6d0719 | |||
| c46843cf5a | |||
| dd6e9dbe90 | 
							
								
								
									
										51
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										51
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @@ -11,6 +11,31 @@ dependencies = [ | ||||
|  "memchr", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "crossbeam-deque" | ||||
| version = "0.8.6" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" | ||||
| dependencies = [ | ||||
|  "crossbeam-epoch", | ||||
|  "crossbeam-utils", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "crossbeam-epoch" | ||||
| version = "0.9.18" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" | ||||
| dependencies = [ | ||||
|  "crossbeam-utils", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "crossbeam-utils" | ||||
| version = "0.8.21" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" | ||||
|  | ||||
| [[package]] | ||||
| name = "either" | ||||
| version = "1.13.0" | ||||
| @@ -42,6 +67,26 @@ version = "2.7.4" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" | ||||
|  | ||||
| [[package]] | ||||
| name = "rayon" | ||||
| version = "1.10.0" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" | ||||
| dependencies = [ | ||||
|  "either", | ||||
|  "rayon-core", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "rayon-core" | ||||
| version = "1.12.1" | ||||
| source = "registry+https://github.com/rust-lang/crates.io-index" | ||||
| checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" | ||||
| dependencies = [ | ||||
|  "crossbeam-deque", | ||||
|  "crossbeam-utils", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "regex" | ||||
| version = "1.11.1" | ||||
| @@ -88,7 +133,9 @@ dependencies = [ | ||||
| name = "y2016" | ||||
| version = "0.1.0" | ||||
| dependencies = [ | ||||
|  "itertools", | ||||
|  "md5", | ||||
|  "utils", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| @@ -114,6 +161,9 @@ version = "0.1.0" | ||||
| [[package]] | ||||
| name = "y2022" | ||||
| version = "0.1.0" | ||||
| dependencies = [ | ||||
|  "utils", | ||||
| ] | ||||
|  | ||||
| [[package]] | ||||
| name = "y2023" | ||||
| @@ -124,6 +174,7 @@ name = "y2024" | ||||
| version = "0.1.0" | ||||
| dependencies = [ | ||||
|  "itertools", | ||||
|  "rayon", | ||||
|  "regex", | ||||
|  "utils", | ||||
| ] | ||||
|   | ||||
| @@ -23,3 +23,4 @@ utils = { path = "../utils" } | ||||
| itertools = "0.13.0" | ||||
| regex = "1.11.1" | ||||
| md5 = "0.7.0" | ||||
| rayon = "1.10" | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y{{YEAR}}::days::d{{DAY}}; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,20 +1,27 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d1; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/1_input.txt")).unwrap(); | ||||
|     println!("{}", d1::process_part1(&content)); | ||||
|     println!("Answer: {}", d1::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/1_input.txt")).unwrap(); | ||||
|     println!("{}", d1::process_part2(&content)); | ||||
|     println!("Answer: {}", d1::process_part2(&content)); | ||||
| } | ||||
|   | ||||
| @@ -1,8 +1,17 @@ | ||||
| use std::time::Instant; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d10; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,8 +1,17 @@ | ||||
| use std::time::Instant; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d11; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d12; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d13; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d14; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d15; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d16; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d17; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d18; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d19; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d2; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,8 +1,17 @@ | ||||
| use std::time::Instant; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d20; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d21; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d22; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d23; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d24; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,7 +1,13 @@ | ||||
| use std::time::Instant; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d25; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d3; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::time::Instant; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d4; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d5; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d6; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d7; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d8; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2015::days::d9; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -5,3 +5,5 @@ edition = "2021" | ||||
|  | ||||
| [dependencies] | ||||
| md5 = { workspace = true } | ||||
| utils = { workspace = true } | ||||
| itertools = { workspace = true } | ||||
|   | ||||
							
								
								
									
										2000
									
								
								y2016/resources/7_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2000
									
								
								y2016/resources/7_input.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										162
									
								
								y2016/resources/8_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										162
									
								
								y2016/resources/8_input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,162 @@ | ||||
| rect 1x1 | ||||
| rotate row y=0 by 6 | ||||
| rect 1x1 | ||||
| rotate row y=0 by 3 | ||||
| rect 1x1 | ||||
| rotate row y=0 by 5 | ||||
| rect 1x1 | ||||
| rotate row y=0 by 4 | ||||
| rect 2x1 | ||||
| rotate row y=0 by 5 | ||||
| rect 2x1 | ||||
| rotate row y=0 by 2 | ||||
| rect 1x1 | ||||
| rotate row y=0 by 5 | ||||
| rect 4x1 | ||||
| rotate row y=0 by 2 | ||||
| rect 1x1 | ||||
| rotate row y=0 by 3 | ||||
| rect 1x1 | ||||
| rotate row y=0 by 3 | ||||
| rect 1x1 | ||||
| rotate row y=0 by 2 | ||||
| rect 1x1 | ||||
| rotate row y=0 by 6 | ||||
| rect 4x1 | ||||
| rotate row y=0 by 4 | ||||
| rotate column x=0 by 1 | ||||
| rect 3x1 | ||||
| rotate row y=0 by 6 | ||||
| rotate column x=0 by 1 | ||||
| rect 4x1 | ||||
| rotate column x=10 by 1 | ||||
| rotate row y=2 by 16 | ||||
| rotate row y=0 by 8 | ||||
| rotate column x=5 by 1 | ||||
| rotate column x=0 by 1 | ||||
| rect 7x1 | ||||
| rotate column x=37 by 1 | ||||
| rotate column x=21 by 2 | ||||
| rotate column x=15 by 1 | ||||
| rotate column x=11 by 2 | ||||
| rotate row y=2 by 39 | ||||
| rotate row y=0 by 36 | ||||
| rotate column x=33 by 2 | ||||
| rotate column x=32 by 1 | ||||
| rotate column x=28 by 2 | ||||
| rotate column x=27 by 1 | ||||
| rotate column x=25 by 1 | ||||
| rotate column x=22 by 1 | ||||
| rotate column x=21 by 2 | ||||
| rotate column x=20 by 3 | ||||
| rotate column x=18 by 1 | ||||
| rotate column x=15 by 2 | ||||
| rotate column x=12 by 1 | ||||
| rotate column x=10 by 1 | ||||
| rotate column x=6 by 2 | ||||
| rotate column x=5 by 1 | ||||
| rotate column x=2 by 1 | ||||
| rotate column x=0 by 1 | ||||
| rect 35x1 | ||||
| rotate column x=45 by 1 | ||||
| rotate row y=1 by 28 | ||||
| rotate column x=38 by 2 | ||||
| rotate column x=33 by 1 | ||||
| rotate column x=28 by 1 | ||||
| rotate column x=23 by 1 | ||||
| rotate column x=18 by 1 | ||||
| rotate column x=13 by 2 | ||||
| rotate column x=8 by 1 | ||||
| rotate column x=3 by 1 | ||||
| rotate row y=3 by 2 | ||||
| rotate row y=2 by 2 | ||||
| rotate row y=1 by 5 | ||||
| rotate row y=0 by 1 | ||||
| rect 1x5 | ||||
| rotate column x=43 by 1 | ||||
| rotate column x=31 by 1 | ||||
| rotate row y=4 by 35 | ||||
| rotate row y=3 by 20 | ||||
| rotate row y=1 by 27 | ||||
| rotate row y=0 by 20 | ||||
| rotate column x=17 by 1 | ||||
| rotate column x=15 by 1 | ||||
| rotate column x=12 by 1 | ||||
| rotate column x=11 by 2 | ||||
| rotate column x=10 by 1 | ||||
| rotate column x=8 by 1 | ||||
| rotate column x=7 by 1 | ||||
| rotate column x=5 by 1 | ||||
| rotate column x=3 by 2 | ||||
| rotate column x=2 by 1 | ||||
| rotate column x=0 by 1 | ||||
| rect 19x1 | ||||
| rotate column x=20 by 3 | ||||
| rotate column x=14 by 1 | ||||
| rotate column x=9 by 1 | ||||
| rotate row y=4 by 15 | ||||
| rotate row y=3 by 13 | ||||
| rotate row y=2 by 15 | ||||
| rotate row y=1 by 18 | ||||
| rotate row y=0 by 15 | ||||
| rotate column x=13 by 1 | ||||
| rotate column x=12 by 1 | ||||
| rotate column x=11 by 3 | ||||
| rotate column x=10 by 1 | ||||
| rotate column x=8 by 1 | ||||
| rotate column x=7 by 1 | ||||
| rotate column x=6 by 1 | ||||
| rotate column x=5 by 1 | ||||
| rotate column x=3 by 2 | ||||
| rotate column x=2 by 1 | ||||
| rotate column x=1 by 1 | ||||
| rotate column x=0 by 1 | ||||
| rect 14x1 | ||||
| rotate row y=3 by 47 | ||||
| rotate column x=19 by 3 | ||||
| rotate column x=9 by 3 | ||||
| rotate column x=4 by 3 | ||||
| rotate row y=5 by 5 | ||||
| rotate row y=4 by 5 | ||||
| rotate row y=3 by 8 | ||||
| rotate row y=1 by 5 | ||||
| rotate column x=3 by 2 | ||||
| rotate column x=2 by 3 | ||||
| rotate column x=1 by 2 | ||||
| rotate column x=0 by 2 | ||||
| rect 4x2 | ||||
| rotate column x=35 by 5 | ||||
| rotate column x=20 by 3 | ||||
| rotate column x=10 by 5 | ||||
| rotate column x=3 by 2 | ||||
| rotate row y=5 by 20 | ||||
| rotate row y=3 by 30 | ||||
| rotate row y=2 by 45 | ||||
| rotate row y=1 by 30 | ||||
| rotate column x=48 by 5 | ||||
| rotate column x=47 by 5 | ||||
| rotate column x=46 by 3 | ||||
| rotate column x=45 by 4 | ||||
| rotate column x=43 by 5 | ||||
| rotate column x=42 by 5 | ||||
| rotate column x=41 by 5 | ||||
| rotate column x=38 by 1 | ||||
| rotate column x=37 by 5 | ||||
| rotate column x=36 by 5 | ||||
| rotate column x=35 by 1 | ||||
| rotate column x=33 by 1 | ||||
| rotate column x=32 by 5 | ||||
| rotate column x=31 by 5 | ||||
| rotate column x=28 by 5 | ||||
| rotate column x=27 by 5 | ||||
| rotate column x=26 by 5 | ||||
| rotate column x=17 by 5 | ||||
| rotate column x=16 by 5 | ||||
| rotate column x=15 by 4 | ||||
| rotate column x=13 by 1 | ||||
| rotate column x=12 by 5 | ||||
| rotate column x=11 by 5 | ||||
| rotate column x=10 by 1 | ||||
| rotate column x=8 by 1 | ||||
| rotate column x=2 by 5 | ||||
| rotate column x=1 by 5 | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2016::days::d1; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2016::days::d2; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2016::days::d3; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2016::days::d4; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,8 +1,17 @@ | ||||
| use std::time::Instant; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2016::days::d5; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2016::days::d6; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
							
								
								
									
										27
									
								
								y2016/src/bin/d7.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2016/src/bin/d7.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2016::days::d7; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/7_input.txt")).unwrap(); | ||||
|     println!("{}", d7::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/7_input.txt")).unwrap(); | ||||
|     println!("{}", d7::process_part2(&content)); | ||||
| } | ||||
							
								
								
									
										27
									
								
								y2016/src/bin/d8.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2016/src/bin/d8.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2016::days::d8; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/8_input.txt")).unwrap(); | ||||
|     println!("{}", d8::process_part1(&content, (50, 6))); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/8_input.txt")).unwrap(); | ||||
|     println!("{}", d8::process_part2(&content)); | ||||
| } | ||||
							
								
								
									
										163
									
								
								y2016/src/days/d7.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										163
									
								
								y2016/src/days/d7.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,163 @@ | ||||
| pub fn process_part1(input: &str) -> u32 { | ||||
|     input | ||||
|         .lines() | ||||
|         .map(|line| if is_tls(line) { 1 } else { 0 }) | ||||
|         .sum() | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) -> u32 { | ||||
|     input | ||||
|         .lines() | ||||
|         .map(|line| if is_ssl(line) { 1 } else { 0 }) | ||||
|         .sum() | ||||
| } | ||||
|  | ||||
| fn is_tls(ipv7: &str) -> bool { | ||||
|     let mut abba = false; | ||||
|     let mut part = String::new(); | ||||
|     for chara in ipv7.chars() { | ||||
|         if chara == '[' { | ||||
|             if contains_abba(&part) { | ||||
|                 abba = true; | ||||
|             } | ||||
|             part.clear(); | ||||
|         } else if chara == ']' { | ||||
|             if contains_abba(&part) { | ||||
|                 return false; | ||||
|             } | ||||
|             part.clear(); | ||||
|         } else { | ||||
|             part.push(chara); | ||||
|         } | ||||
|     } | ||||
|     if contains_abba(&part) { | ||||
|         abba = true; | ||||
|     } | ||||
|     abba | ||||
| } | ||||
|  | ||||
| fn contains_abba(part: &str) -> bool { | ||||
|     if part.len() < 4 { | ||||
|         return false; | ||||
|     } | ||||
|     for window in part.chars().collect::<Vec<char>>().windows(4) { | ||||
|         if window[0] == window[3] && window[1] == window[2] && window[0] != window[1] { | ||||
|             return true; | ||||
|         } | ||||
|     } | ||||
|     false | ||||
| } | ||||
|  | ||||
| fn is_ssl(ipv7: &str) -> bool { | ||||
|     let mut abas = Vec::new(); | ||||
|     let mut babs = Vec::new(); | ||||
|     let mut part = String::new(); | ||||
|     for chara in ipv7.chars() { | ||||
|         if chara == '[' { | ||||
|             if let Some(additional_aba) = get_aba_or_bab(&part) { | ||||
|                 abas.extend_from_slice(&additional_aba); | ||||
|             } | ||||
|             part.clear(); | ||||
|         } else if chara == ']' { | ||||
|             if let Some(additional_bab) = get_aba_or_bab(&part) { | ||||
|                 babs.extend_from_slice(&additional_bab); | ||||
|             } | ||||
|             part.clear(); | ||||
|         } else { | ||||
|             part.push(chara); | ||||
|         } | ||||
|     } | ||||
|     if let Some(additional_aba) = get_aba_or_bab(&part) { | ||||
|         abas.extend_from_slice(&additional_aba); | ||||
|     } | ||||
|     for aba in abas { | ||||
|         for bab in babs.iter() { | ||||
|             let aba = aba.chars().collect::<Vec<char>>(); | ||||
|             let bab = bab.chars().collect::<Vec<char>>(); | ||||
|             if aba[0] == bab[1] && aba[1] == bab[0] { | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     false | ||||
| } | ||||
|  | ||||
| fn get_aba_or_bab(part: &str) -> Option<Vec<String>> { | ||||
|     if part.len() < 3 { | ||||
|         return None; | ||||
|     } | ||||
|     let mut aba_bab: Vec<String> = Vec::new(); | ||||
|     for window in part.chars().collect::<Vec<char>>().windows(3) { | ||||
|         if window[0] == window[2] { | ||||
|             aba_bab.push(window.iter().collect()); | ||||
|         } | ||||
|     } | ||||
|     if aba_bab.is_empty() { | ||||
|         None | ||||
|     } else { | ||||
|         Some(aba_bab) | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT_1: &str = "abba[mnop]qrst"; | ||||
|     const INPUT_2: &str = "abcd[bddb]xyyx"; | ||||
|     const INPUT_3: &str = "aaaa[qwer]tyui"; | ||||
|     const INPUT_4: &str = "ioxxoj[asdfgh]zxcvbn"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_1() { | ||||
|         let result = is_tls(INPUT_1); | ||||
|         assert!(result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_2() { | ||||
|         let result = is_tls(INPUT_2); | ||||
|         assert!(!result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_3() { | ||||
|         let result = is_tls(INPUT_3); | ||||
|         assert!(!result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_4() { | ||||
|         let result = is_tls(INPUT_4); | ||||
|         assert!(result); | ||||
|     } | ||||
|  | ||||
|     const INPUT_5: &str = "aba[bab]xyz"; | ||||
|     const INPUT_6: &str = "xyx[xyx]xyx"; | ||||
|     const INPUT_7: &str = "aaa[kek]eke"; | ||||
|     const INPUT_8: &str = "zazbz[bzb]cdb"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_1() { | ||||
|         let result = is_ssl(INPUT_5); | ||||
|         assert!(result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_2() { | ||||
|         let result = is_ssl(INPUT_6); | ||||
|         assert!(!result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_3() { | ||||
|         let result = is_ssl(INPUT_7); | ||||
|         assert!(result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_4() { | ||||
|         let result = is_ssl(INPUT_8); | ||||
|         assert!(result); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										100
									
								
								y2016/src/days/d8.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								y2016/src/days/d8.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| use itertools::Itertools; | ||||
|  | ||||
| enum Instruction { | ||||
|     Rect(u32, u32), | ||||
|     ShiftRight(u32, u32), | ||||
|     ShiftDown(u32, u32), | ||||
| } | ||||
|  | ||||
| pub fn process_part1(input: &str, grid_size: (usize, usize)) -> i32 { | ||||
|     let instructions = input | ||||
|         .lines() | ||||
|         .map(parse_instruction) | ||||
|         .map(|option| option.unwrap()) | ||||
|         .collect_vec(); | ||||
|     let mut grid = vec![vec!['.'; grid_size.0]; grid_size.1]; | ||||
|     for instrution in instructions { | ||||
|         match instrution { | ||||
|             Instruction::Rect(width, height) => { | ||||
|                 for row in 0..=height { | ||||
|                     for col in 0..=width { | ||||
|                         grid[row as usize][col as usize] = '#'; | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             Instruction::ShiftRight(row, by) => grid[row as usize].rotate_right(by as usize), | ||||
|             Instruction::ShiftDown(col, by) => { | ||||
|                 let mut col_items = grid.iter().map(|row| row[col as usize]).collect_vec(); | ||||
|                 col_items.rotate_right(by as usize); | ||||
|                 for (row, pixel) in col_items.iter().enumerate() { | ||||
|                     grid[row][col as usize] = *pixel; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         for row in grid.clone() { | ||||
|             println!("{}", row.iter().join("")); | ||||
|         } | ||||
|         println!(); | ||||
|     } | ||||
|     grid.iter() | ||||
|         .map(|row| { | ||||
|             row.iter() | ||||
|                 .map(|pixel| if *pixel == '#' { 1 } else { 0 }) | ||||
|                 .sum::<i32>() | ||||
|         }) | ||||
|         .sum() | ||||
| } | ||||
|  | ||||
| pub fn process_part2(_input: &str) -> i32 { | ||||
|     0 | ||||
| } | ||||
|  | ||||
| fn parse_instruction(inst: &str) -> Option<Instruction> { | ||||
|     if inst.contains("rect") { | ||||
|         let (_, axb) = inst.split_once(" ").unwrap(); | ||||
|         let (a, b) = axb.split_once("x").unwrap(); | ||||
|         return Some(Instruction::Rect( | ||||
|             a.parse::<u32>().unwrap() - 1, | ||||
|             b.parse::<u32>().unwrap() - 1, | ||||
|         )); | ||||
|     } | ||||
|     if inst.contains("rotate row y") { | ||||
|         let (_, abyb) = inst.split_once("=").unwrap(); | ||||
|         let (a, b) = abyb.split_once(" by ").unwrap(); | ||||
|         return Some(Instruction::ShiftRight( | ||||
|             a.parse().unwrap(), | ||||
|             b.parse().unwrap(), | ||||
|         )); | ||||
|     } | ||||
|     if inst.contains("rotate column x") { | ||||
|         let (_, abyb) = inst.split_once("=").unwrap(); | ||||
|         let (a, b) = abyb.split_once(" by ").unwrap(); | ||||
|         return Some(Instruction::ShiftDown( | ||||
|             a.parse().unwrap(), | ||||
|             b.parse().unwrap(), | ||||
|         )); | ||||
|     } | ||||
|     None | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT: &str = "rect 3x2 | ||||
| rotate column x=1 by 1 | ||||
| rotate row y=0 by 4 | ||||
| rotate column x=1 by 1"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1() { | ||||
|         let result = process_part1(INPUT, (7, 3)); | ||||
|         assert_eq!(result, 6); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2() { | ||||
|         let result = process_part2(INPUT); | ||||
|         assert_eq!(result, 0); | ||||
|     } | ||||
| } | ||||
| @@ -9,3 +9,7 @@ pub mod d4; | ||||
| pub mod d5; | ||||
|  | ||||
| pub mod d6; | ||||
|  | ||||
| pub mod d7; | ||||
|  | ||||
| pub mod d8; | ||||
|   | ||||
| @@ -4,3 +4,4 @@ version = "0.1.0" | ||||
| edition = "2021" | ||||
|  | ||||
| [dependencies] | ||||
| utils = { workspace = true } | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2022::days::d1; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2022::days::d2::{process_part1, process_part2}; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2022::days::d3; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2022::days::d4; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2022::days::d5; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2022::days::d6; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2022::days::d7; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2022::days::d8; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2022::days::d9; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -7,3 +7,4 @@ edition = "2021" | ||||
| regex = "1.11.1" | ||||
| utils = { workspace = true } | ||||
| itertools = { workspace = true } | ||||
| rayon = { workspace = true } | ||||
|   | ||||
							
								
								
									
										1
									
								
								y2024/resources/11_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								y2024/resources/11_input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| 5 62914 65 972 0 805922 6521 1639064 | ||||
							
								
								
									
										140
									
								
								y2024/resources/12_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								y2024/resources/12_input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,140 @@ | ||||
| CCCCCCCCCBBBMMGGGGGGGGGGGGGYWWWWWWWWWWWWOOOOOOOOOOOOOOOOHLLHHHHHHHHHHTHUUUULBBBBBBBBBBBBPPPPPPPPPPPKKWWWWCCCWWWWWWWWWWWWWWWWWWWWEEEEYNNNYYLL | ||||
| CCCCCCCCCBBBBBBGGGGGGGGGGGGGWWWWWWWWWWWWOOOOOOOOOOOOOOOOHHHHHHHHHHHHHHHHUUULBBBBBBBBBBBPPPPPPPPPPPPPPPWWWCCCWWWWWWWWWWWWWWWWWWWBEEEYYYNYYLLL | ||||
| CCCCCCCBBBBBBBBGGGGGGGGGGGGWWWWWWWWWWWWWOAOOOOOOOOOOOOOOHHHHHHHHHHHHHHHHUUULLLLLBBBBBBBBPSPPPPPPPPPPPMMWWCCCCCCCWWWWWWWWWWWBWWWBBBBYYYYYYYLL | ||||
| CCCCCCCCBBBBBBBGGGGGGGGAAGWWWWWWWWWWWWWWWWOOOOOOOOOOOIOOHHHHHHHHHHHHHHHHUUULLLLLLLBBBJBJSSPPPPPPPPPPMMMMMCCCCCCCWWWWWWWWWBBBBBWBBBBYYYYYYYYY | ||||
| CCCCCCCCCBBBBBBGGGGGGGGGAAWPPWWWWWWWWWWWWWOOOOOOOOOIIIOHHHHHHHHHHHHHHHHUULLLLLLLLBBBBJJJSSPPPPPGGGGPEEMCCCCCCCCCCCCCCCBBWWBBBBBBBBBBYYYYYYYY | ||||
| CCCCCCCCCBBBBBBBGGGGGGGGAAASSWWWWWWWWWWWWWOOOUOOOIIIIIIIYHHHHHHHHHHHHHHHHHNLLLLLLLBBBBJJJJVPPPPGGGGPEEMCCCCCCCCCCCCCCCBBBBBBBBBBBBBYYYYYYYYY | ||||
| CCCNNNCCBBBBBBBBGEGGGGGAAAAASWWWWWWWWWWWWWXOOOOIIIIIIIYYYHHHHHHHHHHHHHHHGGLLLLLLLLLBBJJJJJJPPPPGGGGPMEMCCCCCCCCCCCCCCCBBBBBBBBBBBBBYYYYYYYYY | ||||
| CCNNNNNBBBBBBBBBBEBSGGGGGGSSSWWWWWWWWUWXXXXXXOOIVVVIIIIIYHHHYYHHHYYYYHHHGLLLLLLLLLLLLJJJJJPPPPPGGGGPMMMMMMMCCCCCCCCCCBBBBBBBBBBBBYYYYYYYYYYM | ||||
| NNNNNNNVVVBBBBBBBBBSGGSSSSSSSSWWWWWWWUWWXXXXXXOVVVIIIIIIYYYYYYYYHYYYYYHHGGLLLLLLLLLLLJJJJJJJPPPGGGGPMMMMMMMCCCCCCCCCCBBBBBBBBBBBBBBYYYYYYMMM | ||||
| NNNNNNNVVVBBBBBBBBBSGGSSSSSSSDDWWWWWWWWXXXXXXXOOIIIIISIIYYYYYYYYYYYYDYYGGGLLLLLLLLLLLJJJJJJJPGGGGGGPPPMMMMMCCCCCCCCCCBBBBBBBBBBBBBBYYYYYYMMM | ||||
| NNNNFNNNNBNBBBBBBBSSSSSSSSSSSSSSWDWWUUNXXXXXXXXXIIIIISSSSYYYYYYYYYYYYYYGGGLLLLLLLLJJJJJJJJJJGGGGGGGPDMMMMMMCCCCCXWWWWWBBBBBBBBBBBBBYYYYYMMMM | ||||
| NNNNNNNNBBBBBBBBBBSSSSSSSSSSSSSSSDDDNUNNNXXXXXXXIIXIISSSYYYYYYYYYYYYYYYGGGGGLLLLLLLJJJJJJJJJGGGGGGGPDDMDMMMXXXXXXXXXWWWWWWBBBBBBBBBYYYYMMMMM | ||||
| NNNNNNNBBBBBBBBBBBSSSSSSSSSSSSSSSSNNNNNNNNXXXXXXXXXXXXSSSQQNYYYYYYYYYYGGGGGGLLLLLLLLJJJJJJJDGGGGGGGDDDDDMMDXXXXXXWWWWWWWWBBBBBBBBBHYYYMMMMMM | ||||
| NNNNNNAAXXXBBBBXXBBBSSSSSSSSSSSSSENNNNNNNNNNXXXXXXXQXXQQQQQNYYYYYYYYYYYGGGGGGLLLLLLLJJJJJJJDGGGGGGGDDDDDDDDXXXXXWWWWWWWWWWWBBBBBBHHYYYMMMMMM | ||||
| NNNNNNNNXXXXXXXXBBBSSSYSSSSSSSSSSNNNNNNNNNNZXXXXXXEQQQQQQQQYYYYYYYYYYYYGGGGGLLLLLLLGJJJJJJJJGGGGGGGDDDDDDXXXXXXXXWWWWWWWWWWBBBBBBHHHYYMMMMMM | ||||
| NNNXXNNNXXXXXXXXXXXYYYYYSSSSSSSSIIINNNNNNNNXXCXXXXEQQQQQQQQQYYYYYYYYYYYGGGGGGGGLGLGGJJJJJJJDGGGGGGGDGDDDGGXXXXXXCWWWWWWWWWWWWABOOHHHYMMMMMMM | ||||
| SNNSXNNNRXXXXXXXXXXXYYYYYSSSSSSIIIINNNNNNNNXXCCXEEEQQQQQQQQYYYYYYYYYYYYGGGGGGGGGGGGJJJJJJJJUGGGGGGGGGGGGGGGGGGXCCCWCCWWWWWAAAAAOOHHHHMMMMMMM | ||||
| SSSSXSNNRXXXXXXXYYYYYEYNYSSSMHSIIIIINNNNNNNNCCCCTTEQYYQQQQQQYYYYYUYYYYYGGGGGGGGGGGJJJJJJJJJJGGGGGGGGGGGGGGGGGGXGCCCCCWWWWWAAAAAHOHHHHMMMMMMM | ||||
| SSSSSSNNSJJJXXXYYYYYYYYYMSMMMMGMIMIINNNNNNNCCCCCTTEYYYQYQQQQQQMYUUYUYYGGGGGGGGIIIJJJJJJJJJJUGGGGGGGGGGGGGGGGGGDGCCCCWWWWWWAAAAAHHHHNMMMMMMMM | ||||
| SSSSSSSSSSSJXXXYYYYYYYYYMSMMMMMMMMIIINNNNNNCCCCCTTEYYYYYYQQQQBBBUUYYYYYOOOOGGGIIIPJJJJJJJJUUGGGGGGUGGGGGGGGGGGGGCCCCCCAAAAAAAAAHHHHNMMMMMMMM | ||||
| SSSSSSSSSSSJJJJYYYYYYYYYYMMMMMMMMMIIIINNNCCCCCCTTTTCYYYYQQQBBBBBBUUYYYYOGOOOOGIIIIIIIJJJJUUUGGGGGGGGGGGGGGGGGGGGCCCHHHAAAAAAAAAHHHHNNMMMMMMM | ||||
| SSSSSSSSSSSSSJJJYYYYYYYMMMMMMMMMMMIIIINNNCSCCTTTTTYYYYYYPPQBBBBBBUUUYGYGGOGGGGIIIIIIIJJIIUUUGGGGGGGGGGGGGGGGGGCGGCCCCCAAAAAAAAAHHHNNAAAMMQMM | ||||
| SSSSSSSSSSSJJJJJYYYYYYYYMMMMMMMMMIIISISSSSSCCTTTTTYYYYYYPPPPBBBBUUUUUGGGGGGGGGIIIIIIIIJIIUUUGGGGGGGGGGGGGGGGGGCCGCCCCCAAAAAAAAAKKKAKAHAMMQMY | ||||
| SSSSSSSSSSSSJJDJJJYYYYYMMMMMMMMMMOOSSSSSSSSSCTETTTTYYYPYPPPPPPBBBBUGUGGGGGGGYYIIIIIIIIIIIUUUGGGGGGGGGMMMGGGGGGCCCCCCCAAAAAAAAAAKKKKKHHAAMQMY | ||||
| SSSSSSSSSSSSJJDJJJYYOOMMMMMMMMMOQOFFFFSSSSSCCCCOOYYYYYPSPPPPBPBBBBGGGGGGGYGGYYIIIIIIIIIIUUUUUUUUUUUUUUMMGGGGGCCCCCCCBAAAAAAAAAAAAKKKHHHHHHYY | ||||
| SWSSSSSSSSSSJJDJDDYYMOOMMMMMOMOOOOOOSSSSSSSSCCYYYYYYYYPPPPPBBBBBBBIIIIGGGYYYYYYIIIIIIIIIIIIUUUUUUUUUUMMMMMMGKCCKKCCCCAAAAAAAAAAAAKKKHHHHHHYY | ||||
| SSSSSSSSSSSSJDDDDDDYMMMMMMMMOOOOMOOOOOSSSSSNCCZZZZYYYYPPPPPBBBBBBBBBBBWYGAAAAAAAIIIIIIIIIIUUUUUUUUUUUMMMMMKKKKCKKCCCBAAAAAAAAAAAAKKHHHHHHYYY | ||||
| SSSSSSSJSSSSJDDDDDDMMMMMMMMMMGGOOLOCSSSSSSSSCCZZZZZYYYEEPPPBBBBBBBBBBBBYWAAAAAAAIIIIIIIIIIUUUUUUUUUUUMMMMKKKKKKKCCBBBAAAAAAAAAAAAKHHHHHHPHHY | ||||
| SSSSSSSSSYYSDDDDDDDDDDMMMMMMMMMMLLSCCSSSSSSZZZZZZZZZYSPPPPPPBBBBBBBBBBBYYAAAAAAAIIIIIIIIIIUUUUUUUUUUUUUKKKKKKKKKKCCBBAAAAAAAAAAAAHHHHHHHHHHY | ||||
| YYSYSSYYYYYDJDDDDDDDDDMMMMMMMMLLLLSSSSSSSSSZZZZZZZZVSSPPPMPBBBBBBBBBBBBYYAAAAAAAIIIIIIIIIIUUUUUUUUUUUKKKKKKKKKKKKBBBBAAAAAAAAAAAAHHHHHHHHHHH | ||||
| YYYYSSYYYYYDDDDDDDDDDMMMMMMMMLLLLLSSSSSSSSSSZZZZZVVVSSPPPPBBBBBBBBBBBBYYYAAAAAAABIIIIJJIIIUUUUUURVKKKKKKKKKKKKKKKBBBBAAAAAAAAAAAAHHHHHHHHHHF | ||||
| YYYYYYYYYYYDDDDDDDDDMMLMMMMLLLGGLLLLSSSSSSSSZZZZZVVVVSVBPBBBBBBBBAAAAAAAAAAAAAAABIIIIJJJIRRRRRRRRRRRKKKKKKKKKKEKKBBBBAAAAAAAAAAAAHHHHHHHHHHF | ||||
| YYSSSYYYYYYDDDDDDDDDDMLLLLLLLLGGGGLLSSLLSSSZZZZZZVVVVVVBBBBBBAAAAAAAAAAAAAAAAAAABBIIRRRRRRRRRLRRRRRRKKKKKKKKKKKKWWWBBAAAAAAAAAAAAHHHHHHHHFFF | ||||
| SSSSSSYAAYYYYDDDDDDDDDDLLLLLGGGGGGGLLLLLLSSZZZZZZVVVVVBBBBBBBAAAAAAAAAAAAAABBYYBBRIIRRRRRRRRRRRRRRRKKKKKKKKKKKKKWWWWWAAAABBBBBBBCHHHHHHAAFFF | ||||
| SSSSSAAAAYAYYYYDDDDDDDDDDZZZGGGGGGGGGGLLLSSZZZZZZVVVFVBBBBBBBAAAAAAAAAAAAAABBBBBBRRRRRRRRRRRRRRRRRRKKKKKKKKKKKKKWWWWAAAAABAABIBHHHHHHHHAAAFF | ||||
| SSSSSAAAAAAAYYYYDDDDDDDDZZZZGGGGGGGGGGGLLSZZZZZZVVVVVBBBBBBBBAAAAAAAAAAAAAABBBBBBBNRRRRRRRRRRRVRRRRRKKKKKKKKKKKWWWWWAAAAAAABBIIIHHHHHAAAAAAA | ||||
| SSSAAAAAAAAAAAAZDDDDDDDDZZZZGGGGGGGGGGGLLZZZZZZZZVVVVVBBBBBBBAAAAAAAAAAAAAABBBBBBBBRRRRRRRRRRRVRRRRRRKKRKKKRKKWWWWWWWAAAAAAAIIIIHHHHHMAAAAAA | ||||
| SSSAAAAAAAAAAADZKKKDDDDZZZZZGGGGGGGGGGGGLZYKKZKUVVVVVVBBBBBBBAAAAAAAAAAAAAABBBBBBRRRRRRRRRRRRVVVRRRRRRRRRRRRRWWWWWWWAAAAAAAAAIIIIISSAAAAAAAA | ||||
| SSSAAAAAAAAAAKKKKKKKDDZZZZZZZGGGGGGGGGGGGGKKKKKUUVVOODOOBBBBBBBBBJJJJJJBBBBBBBBBBBRRRRRRRRRRRVVVRRRRRRRRRRRRWWWWWWWAAAAAAAAAAIIIISSSSAAAAAAA | ||||
| SSSAAAAAAAAAAKKKKKKKZZZZZZZZZVGGGGGGGGGGXKKKKKKUVVOOOOOOBBBBBBBJJJJJJJJJJBBBBBBBBBCCRRRRRRRRRVVRRRRRRRRRRRRRWWWWWWWAAAAAAAAAAIIIIIIAAAAAAAAA | ||||
| SSSAAAAAHHHHHHHHHHHHHHHHHHZZZVGGGGGGGGGKKKKKKKKUVVOOOOOOCBBBBBBBJJJJJJJJJBBBBBBBBCCRRRRRRRRIRRRRRRRRRRRRRRWWWWWWWWWAAAAAAAAAAIIIIIIAAAAAAAAA | ||||
| SSSSAAAAHHHHHHHHHHHHHHHHHHZZZZQQGQQGGGQKKKKKKKKVVVOOOOOOCCBBBBBBJJJJJJJJJJJJJJBCCCCRRRCCCCCIIIRRRRRRRRRRRRWWWWWWWWAAAAAAAAVVIIIIIIIOAAAAAAAA | ||||
| SSSSSSAAHHHHHHHHHHHHHHHHHHZZZZZQQQQQQQQQQKKKKKKKOOOOOOOOCCBBBBBJJJJJJJJJJJJJJJBCCCCCCCCCCCIIKKKRRRYRRRRWWWWWWKWWWKKAAAAAAAAIIIIIIIIIHAAAAAAA | ||||
| SSSSSSSAABBBBKKKHHHHHHHHHHZZZZZQQQQQQQQQQQKKKKKKOOOOOOOOCCCBBBBJJJJJJJJJJJJJJCBCCCCCCCCCCCCCKKKKKRKRRRRWWWWWWKKKKKKWAAAAAAAIIIIIIIIIHAAAAAAA | ||||
| SSSSSSSSABBBBBZZHHHHHHHHHHZCCEECCCCQQQQQQQKKKKKKOOOOOOOOOCBBBBBJJJJJJJJJJJJSCCCCCCCCCCCCCCCCKKKKKKKKKKKKWWWGGKKKKKKWWWAATTIIIIIIIYHHHHAAAAAA | ||||
| SSSSSSSSSSSBBBBHHHHHHHHHHHZZCCCCCCCQQCQQQQNKKNOOOOOOOOOOOBBBBBBBBJJJJJJJJJJSSCCCCCCCCCCCCCCCCKKKKKKKKKKMMMGGYYKKKKKWWWWATTIIIINIIYYHYYAAAAAA | ||||
| SSSSSSSSSSSSBBBHHHHHHHHHHHKKKCCCCCCCCCQQQNNKKNNOOOOOOOOFFBBBBBBBBJJJJJJJJJJJCCCCCCCCCCCCCKCCKKKKKKKKMMMMMMMGGKKKKKKWWWWTTTTITIIIKYYYYYAAAAJA | ||||
| SSSSSSSSSSSSSSBHHHHHHHHHHHHHKCCCCCCCCCNNNNNNNNNNOOOOOOOFFFFBUBHHHHHJJJJAJQQJQCCCDCCCJCKKCKKKKKKKKKKMMMMMMMGGGKKKKKKTTTTTTTTTTTTIKYYYYYAYAAAU | ||||
| SSSSSSSSSFFFFBBHHHHHHHHHHHHHHCCCCCCCYCYNNNNNNNNNNNNOOOORRRRRRTZHZZZJJJJJJQQQQCBCCCCCCCKKKKKKKKKKKKKKMMMMKMGGGKKKKKKTTTTTTTTTTTTTTTYYYYYYYAAU | ||||
| SSSSSSSSFFFFFBBHHHHHHHHHHHHHHCCCCCYCYYYYYNNNNNNNNNNOONARRRRRZZZZZZZJJJJQQQQQQQCCCCCCCDKKKKKKKMMKKKKKKMMMKMGGGKKKKKKTTTTTTTTTTTTTXTYYYYYYYYYY | ||||
| SMSSSSSSJFFFFFBHHHHHHHHHHHHHHHCCCCYYYYYYYYYNNNNNNNNNNNRRRZZZZZZZZZZZZJJQQQQQQQQQCCCCDDKBKKBKMMMKKKKKKMMKKKJGGGGGKKKTTTTTTTTTTTTTTTTTTYYYYYYY | ||||
| YJJSSSSJJFGFFFBHHHHHHHHHHHHHHHCCCYYYYYYYYYNNJNNNNNNNNNVRRRRZZZZZZZZZZQQQQQQQQQQQCCCCCGBBBBBBBMAMKKKKKKKKKCGGGGGKKKKTTTTTTTTTTTTTTTTYYYYYYYYW | ||||
| YGJJSSSJJJFFJJJHHHHHHHHHHHDLHHHCYYYYYYYYYYYYNNNNNNNNNVVVVRRRZZZZZZZZZQQQQQQQQQQQQQCCCGBBBBGBBMMMKKKKKKKKKCCGGGGKKKKKTTTTTTTTTTTTTTTTYYYYYYYY | ||||
| YGJSSJJJJJJJJJJHHHHHHHHHHHLLLLLLYYYYYYYYYYYYNNNNNNNNNNVVVRRRRRZZZZZZZQQQQQRQQQQQQQQCGGGGGBGMMMMMMMKKCKKCCCCCZGGKKKKKTTTTTTTTTTTXTTTTYMMYYYYY | ||||
| GGJJJJJJJJJJJJJJJHHHHHHHLLLLLLLLLYYYYYYYYYYYYNNNNNNNNNVVVRRRRRZZZZZZRQQRRQRRQKKQQQQCQGGGGGGMMMMMMKKCCCKCCCCCCGKKKKKKTTTXXXXXTTTXTTMTMMMMMYYY | ||||
| GGGGJJJJJJJJJJJJJHHHFHHLLLLLLLLLLYYYYYYYYYYYYNNNNNNNNNNVRRRRRZZZZZZZRRRRRRRRRKKKQQQQQQGGGGGGMMMCMCCCCCCCCCCCCCKKKKKKTTTXXXXXXXXXXXMMMMMMAYYY | ||||
| GGGGGJJJJJJJJJJJJHHHHHHLLLLLLLLLLYYYYYYWYYWYYYNNNNNNNNSSSRRRRAAZZZZRRRRRRRRRRKEKKQQQQGGGGGGOOOMCCCCCCCCCCCCCCNNNNNNNNNNNNNNNNNNMMMMMMMMMMYYA | ||||
| GGGGGJJGTTTTJJJJJLLLLLLLLLLLLLLLLLLYWYWWWWWYYNNNNNNNNNSSSSRKAAAZZZRRRRRRRRRKKKKKKQQQQQGFGGGOOOICCCCCCCCCCCCCCNNNNNNNNNNNNNNNNNNXMMMMMMMMMMYA | ||||
| GGGPPGJGTTTTJTJJJLLLLLLLLLLLLLLLLLYYWWWWWWWWYYYNSNNNNSSSSABAAAAZZRRRRRRRRRRKKKKKNNNNQQFFFFGOOOCCCCCCCCCCCCCCCNNNNNNNNNNNNNNNNNNMMMMMMMMMMMAA | ||||
| GGGGGGGGTTTTTTTLLLLHLLLLLLLLLLDLLLLWWWWWWWWWYYYSSNNSSSSSSAAAAAAAAARRRRRRRRRRKKKKKNNNNQQFFOOOOOOCCCCCCCCCCCCJGNNNNNNNNNNNNNNNNNNMMMMMMMMMMMAN | ||||
| GGGGGGGGGTTTTTTTTTTHLSLLLLLLLLDLLLXXWWWWWWWWYYYSNNNSSSSSSAAAAAAALLRRRRRRRRRRRKKRNNNNQQRFFOOOOOOCCCCCCCCCCCCJJNNNNNNNNNNNNNNNNNNMMMMMMMMMNDNN | ||||
| GGGGGWGGGTTTTTTTFFSSSSSSLLLLLLLLLBWWWWWWWWWWYYYSSSSSSSSSSAAAAAAAAARRRRRRRRRRRRRRNNSSRRRRRRROOOOOOCCCCCCCCJJJJNNNNNNNNNNNNNNNNNNXXXMMMNNNNNNN | ||||
| GGGGWWWGGTTTTTTFFSSSSSSSLLLLLLLLKBWWWWWWWWWWYYYYSSSSSSSSBJJAAAAAAARRRRRRRRRRRRNNNNNNOORRRRRROOOOOCCCCCCCJJJJJNNNNNNNNNNQQQQXXXXXXXXXXNNLNNNN | ||||
| GGGWWWWTTTTTTTTTTOSSSSSSBLSSHLLLKKJWWWWWWWWWWYYRRSRSRSBBBJJJAAAAAAARRRRRRRRRRRNNNNNNOOOORRRRRRROOOOOOJJJVJJJJJJJNNNQQQQQQQQQXXXXXXXXXNNNNNNQ | ||||
| GGGWWWTTTTTTTTKSSSSSSSSSSSSSHLLLKKKWMWWWWWWWWWYRRRRRRBBBBBAAAAEEEAARRRRRRRRRRNNNOOOOOOORRRRRRROOOOOGJJJJJJJJJJJJNNNQQQQQQQQQXXXXXXXNNNNNNNNN | ||||
| WWWWWWTTTTTTTTTJSSSSSSSSSSSSSKKKKKKWMWWWWWWWWWYRRRRRBBBBBBAAAAEEEEEEERRRRRRRRRRROOOOORRRRRRRRRROOOGGJHJJJJJJJJJJNNNQQQQQQQQQXXXXXXXNXNNNNNNN | ||||
| WWWWWTTTTTTTTTTTSSSSSSSSSSHKKKKKKKUKMWWWWWWWWKKKKRRBBBBBEEEEEEEEEEEEETRRDDRRRRROOOOOORRRRRRRRRROOGGGGJJJJJJJJJJJJJQQQQQQQQQQQQQQXXXXXNNNNNNN | ||||
| WWWWWWWTTTTTTTTSSSSSSSSSSSKKKKKKKKKKKWWWWWWWKKKKKRRBBBBBBBBEEEEEEEEETTRRDDRRRRRROOOLOORRRRRRROOOGGGGGJJJJJJJJJJJJCQQQQQQQQQQQQQXXXXNNNNNNNNN | ||||
| WWWIWWWTTTTTTTSSSSSSSSSSSSKKKKKKKKKYYWWWWWWWWKKKKLRBEBEEEEEEEEEEEEETFTTTDDDTTTRBLLLLLLRRRRRRROOHGGGGGGJJJJJJJJJJJJWQQQQQQQQQQQQQXXXNNNRNNNNN | ||||
| WWIIIWWWTTLTTTSSSSSSSSSSKKKKKKKKKPPYYWWWWWWWWKKKKLLEEEEEEEEVVVVVEEETTTTDDTTTTTTLLLLLLLLRRRRRRHHHGGGGMJJJJJJJJJJJQQQQQQQQQQQQQQQQQQNNNRRNNNNN | ||||
| WWIIWWWTTKGTTTSSSSSSSSSKKKKKKKKKPPPPMMMMWWWKKKKLLLLEEEEEEVVVVVVEEEETTTTTTTTTTTTLLLLLLLLRRRIRHHHHGGGGGJJJJJJJJJJQQQQQQQQQQQQQQQQQQQQRRRDDDNNN | ||||
| IIIIIWWWWGGGVVSSSSSSSSSSKKKKKKKKPPPPMMMMWWKKKKKKLLLLELEEEVVVVVVEEEEEETTTTTTTXLLLLLLLLLLLLLLHHHHHGGGGGGJJJJJJJJQQQQQLLLQQQQQQQQQQQQQQRRDDMMDD | ||||
| IIIIIIWWGGGGGVVVSSSSSSSSKKKKKKKFEPPMMMMMMMKKKKKLLLLLLLEVVVVVVVVEEEEETTTTTTTTLLLLLLLLLLLLLLLHHHHHHHGGGGJJJJJJJJNQQQQQLLQQLLQQQQQQQQQQDDDDDDDD | ||||
| IIIIIIGGGGGGGGGVSSSSSSSSSSKKKKKFFPPMMMMMMMKKKSSLLLLLLVVVVVVVVVEEEETETTTTTTTTTLLLLLLLLLLLLLLHHHHHHHGGGGGAJJJJJDQQQQQLLLQLLLLQQQQQQQQQDDDDDDDD | ||||
| IIIIIGGGGGGGGZZZGSSSSSSSSSKKKFFFFHPMMMMMMMKSSSSLLLLLLVVTVVVVVVEEEETTTTTTTTTLLLFFFFFFFFFFLLHHHHHHHHGEEGDDDJDDDDQQQQQLLLQQLQQQQQQQQQQQDDDDDDDD | ||||
| IIIIIGGGGGGGGZZZTTSSSSSSSSKKKKFFFFPMMMMMMMKKSSSLLLLLLLVVVVVVVEEEEEETTTTTTTTLLLFFFFFFFFFFHHHHHHHHHHGEDDDDDDDDDDQQIQQQQLLLLQQQQQQQQDQQDDDDDDDD | ||||
| IIIIIICGGGGGGZZZTTNSSSKKKKKKKFFFFFFMMMMMMMKSSSSSLZLLLLVVVVVVVEEEEEETTTTTTTTLLLFFFFFFFFFFHHHHHIIIHHEEDDDDDDDDDDDTDDQLLLLLTTQQQQQQDDDQDDDDDDDD | ||||
| IIIIIIGGGGGGGZZZNNNNKKKKKKKKKKFFFFFMMMMMMMKSSSSSFZLLLLLVVVVPVLLEETTTTTTTTTTQLLFFFFFFFFFFHHHIIIHHHHEEDDDDDDDDDDDDDDLLLLLTTTTTQQQQQDDDDDDDDDDD | ||||
| ZZIIIIUGWGGGGZZZNNNNNKKKKKKKKKFFFFBKKKKKKKKSKSSSFZLLLLLLVZVPPLLLETTTTTTTTTTTOOLLLLLLLILIHIIITTTHHHEEDDDDDDDDDDDDDLLLLLLLTTTTTTDQDDDDDDDDDDDX | ||||
| ZZIIIUUGWWZZZZZZNNNNNKKKKKKFFFFFFFFKKKKKKKKKKKKZZZZLLLLLVVLLLLLLEETTTTTTTTTOOONNNNNLIIIIIIIIIIIHHEEEEEDDDKKDDDDDDDLLLIIIIIIIIIIQDDDDDDDDDDDD | ||||
| ZIIIIUZGGGZZZZZZNNNNKKLKLFFFFFFFFFFKKKKKKKKKKKKKZZZLLLLLLLLLLLLLEETTTSTTTTSSFNNNNNNNIIIIIIIIIIIHEEEEEEEDDKKDDDDDDLLLLIIIIIIIIIIDDDDDHHHHHHNN | ||||
| ZIIIZZZZZNZZZZZZNNNNNNLLLLFFFFFFFFFKKKKKKKKKKKKKZZLLLLLLLLLLLLLEEEEETSSTTSSLFNNNNNNNIIIIIIIIIIIHHEEEEEEKKKKDDDDDDLLLLIIIIIIIIIIDDDDDHHHHHHNN | ||||
| ZZIZZZZZZNZZZZZZNNNNNNLLLLFFFFFFFFFKKKKKKKKKKHKKGGSLLSLLLLLLLLLLEEESSSSSSSLLFFNNNNNNNPIIIIIIIIIIIEEEEEEEKKLLDLLLDLLLLIIIIIIIIIIDDDDDHHHHHHHN | ||||
| ZZZZZZZZNNZZZZZZNNNNNLLLLLLFDFFFFQQKKKKUKKKKKKKKSGSLLSLSSSSLLLLEEEESSSSSLSLLFFFNNNNKQQQIIIIIIIIJIEEEEELLLLLLLLLLLLLKKIIIIIIIIIIDDDDDHHHHHHHH | ||||
| ZZZZZZZZZZZZZZZNNNNNNNLLLLLQQQQQQQGKAKKEKKKKEEESSGSSSSSSSSSTLLLJJJESSSSLLLLLLQQQQNNNQQQIIIIIIIIIIEEEEELLLLLLLLLLKKKKKIIIIIIIIIIDDDHHHHHHHHHH | ||||
| ZZZZCZZZNNZZZZZNNNNNNNLLLLLQQQQQQQQKAAKEEEEEEEESSSSSSSSSSGZTTTLJJJJSSSSSLLLLLQQQQQNNQQQIIIIIIIIIEEEEEELYLLLLLLLLKKKKIIIIIIIIIIIDHHHHHHHHHHHH | ||||
| CCCCCCZZNNZZZZZNNNNNUNNLLLLQOQQQQQQQQAKEEEEEEEEESSSSSSSSEZZTTTJJJJJFSJNNLLLLLQQQQQQQQQQIIIIIIIEEEEEEEELYYLLFFLLLLPPKIIIIIIIIIIIHHHHHHHHHHHHH | ||||
| CCCCCCZZNNNNNNNNNNNNLLLLLLLOOOOQQQQQQQKEEEEEEEEESSSSSSSSEZZTTTJJJJJJJJLLLLLLLQQQQQQQQQQIIIIIIIEEEEEEEEYYYLYLLLLLLLLKIIIIIIIIKKHHHHHHHHHHHHHH | ||||
| LCCCZZZZZZNNNNNNNNNNNLJRRLLLOOOOOQQQQTTEETEEEEEEESSSSSSEEEZZTTJJJJJJJJJJLLLQQQQQQQQQQQQQIIIHIEEEEEEEEEEEYYYYLLLLLKMKIIIIIIIIKKHHHHHHHHHHHHHH | ||||
| LCLLLZLZLNNNNNNNNNRNNRRROOLOOOOOOQQQQTEEETTTTTEEEESSSEEEEZZTTTTJJJJJJJJJLLLLQQQQQQQQQQQQIIIHHHEEEEEEEYYYYYYYYLLZLKKKIIIIIIIISSHHHHHHHHHHHHHH | ||||
| LLLLLLLZLNNNNNNNRRRFRRRROOLOOOOQQQQQQTTTTTTTTTEEEEEEEEEEEZZTTTZZJJJJJJJJLLQQQQQQQQQQQQQQQQIHHHHEEYYYYYYYYYJJJJJJJKKKIIIIIIIISSSSHHHHHHHHHHHH | ||||
| LLLLLLLLLNLLLLLLRRFFRRRROOLOOOOQQQQDQRTTTTTTTTEEEEEEEZZZZZZTZZZJJJJJJJJLLLQQQQQQQQQQQQQQQQHHHHHNNYYNNNNNNNCJJJJJFKKKIIIIIIIISSSGHHHHHHHHHHHH | ||||
| LLLLLLLLNNLLLLLRRFFFFFRRROOOOOOYFQQQQTTTTTTTTEEEEEEEZZZZZZZZZZZZZJJJJJLLKLQQQQQQQMQQQQQQQNHHHHNNNYYYNNNNNNCJJJJJFKKKIIIIIIIISSSGGHHHHHHHHHHM | ||||
| LLLLLLLLLLLLLLLFFFFFFFFFFFOOOOOYYAAAATTTTTTTTTEEEEZZOZZZZZZZZZZUZJJJJLLLQQQQQQQQMMQQQNNNNNNNNNNNNYNNNNNNNNCCOCCCFFKKIIIIIIIISSSSSSSSSPXXHMHH | ||||
| LLLLLLLLLLLLLLLFFFFFFFOFOOOOOOYYYYYAAATTQTTTQTTQEEZZZZZZZZZZZZZZZJJJJJICCCCCCQQQOMQQQDDNNNNNNNNNNNNNNANNNNCCCCCCFFFFKKKKKKSSSSSSSSSSSPGGHHXX | ||||
| LLLLLLLLLLLLLLLFFFFFFFOOOOOOOOOYYYYAAATTQQTTQQQQEEEEEZZZZZZZZZZZZJJJJJJCCCCCCYQQOMDDDDDNNNNNNNNNNNNNNNNNNCCCCCCFFFFFKKKKKKSSSSSSSSRSPPGGXXXX | ||||
| SSSLLLLLLLLLLLLFFFFFFFFYOOYYYYYYYYYYAATTQQQQQQQQEEEEEZZZZZZZZZZZZJJJJJCCCCCCCCCCODDBDDDDDNNNNNNNNNNNNNNNNCCCCCCCFFFFFFKKKKKSSSSSSSPPPPGGGNNX | ||||
| SSLLLLLLLLLLXXLFXFFFXXXYYYYYYYYYYYYAAAQQQQQQQOQQQEEEEZZZZZZZZZZZYJJYGGCCCCCCCCCCOODDVDDDDINNNNNNNNNNNNNNCCCCZQFFFFFSSFFFFKSSSSSSSSAPPPPGPNNN | ||||
| LLLLLLLLLLLLXXLXXXXXXXXYYYYYYYYYYYYYYQQQQQQQQQQQQQEEEEZZZZZZZZBYYYYYGGCCCCCCCCCDDDDDDDDDDNNNNNNNNNNNNNNNNCCCZQFFFFFSSFFFFKSSSSSSSSSPPPPPPNNN | ||||
| LLLLLLLLLLLLLXXXXXXXXXXYYYYYYYYYYYYQQQQQQQQQQQQPQQEEEEEFZZLZZZBYYYYYYGCCCCCCCCDDDDDDDDDDDNDNNNNNNNNNNNNNNNCCZQFFFFFSSFFFFSSSSSSSSSSSPPNNPPNN | ||||
| QQQYLYYYYLLLJXXXXJXXXXYYYYYYYYYYYYYYQQQQQQQQQQQPPPPPPFFFFFLZZZZYYYYYYYCCCCCCCCCAADADDDDDDDDDNNNNNLNNJJJJCCCCZQQFFFSSSFFFSSSSSSSSSSLLPNNNNNNN | ||||
| QQYYYYYWWLLLJJJJJJJXXXYYYXXXXXXXXXYYQQQQQQQQQQQPPPPNFFFFFFLLZZZYYYYYYYCCCCCCCCZAAAADDDDDDDDDDNNNLLLLJJJJJCCCQQQFQSSSSFKFSSSSSSSSSSSPPPNNNNNN | ||||
| QQQQYYYYWLLLJJJJJJJJJJSNBXXXNXXXUYYYYIIJJJQQBBBPPPPPFFFFFFFZZDYYYYYYYYZCCZCCZZZAAAADDDDLLLDDDDNLLLLJJJJJJQQQQQQQQSSSSKKKKSSSSSSSHSSHHHNDDNNN | ||||
| QQQQYYYYWLLLJJJJJJJJJZNNNNNNNJXXUUUYYYJJJJQQQBPPPPPFFFFFFFFKKYYYYYYKYYZZZZTTTTZZAAAAALLLKLLDLDLLLLJJJJJJJQQQQQQQQSSSSKKKKSSSSSSSHHHHHDDDDNNN | ||||
| QQQYYYYYYYJJJJJJJJZZZZNNNNNNNNUUUUUUYJJJJJJJJBBPPPFFFFFFFFFKKKKKYYYKKZZZZZZZZZZZZAAAAALLLLLLLLLLLLLLLJJJQQQQQQQQQSSSSSKKKKKSSSSSSHHHHDDDDNNN | ||||
| YYYYYYYYYYYJJJJJJJJZZNNNNNNNNUUJJJJJJJJJJJJJJJJBFFFFFFFFFFFFKKKKKKKKKZZZZZZZZZZZAAAAAAAGLLLLLLLLLLLJJJJJJQQQQQQQQSSSSSSKKKKKSSSSTTTTTTTDNNNN | ||||
| SYYYYYYYYYYJJJJJJJJZNNNNNNNNNUUUJJJJJJJJJJJJJBBBBBFFFFFGFFFKKKKKKKKKKZZZZZZZZZAAAGGGAGGGLLLLLLLLLLLLJJJQQTQQQQQQQQQSSSKKKKKKKESTTTTTTNNDNNNN | ||||
| SCYYYYYYYYYJJJJJJUZZZNNNNNNNNNUUUUJJJJJJJJJJJJBBBBFFFFGGFKKKKKKKKKKZZZZZZZZZZZAAAGYGAGGGGLLLLLLLLLLJJJJQQQQQQQQQQQQSSSSSKKKTTTTTTTTTTNNNNNNN | ||||
| SCCYYYYYYJYJJJJJJUUUZNNNNNNNNUUJUUJJJJJJJJJJJLBBBBBGGGGGGKKKKKKKKKKZZZZZZZZZZZAAAGGGAGGGGLLLLLLLLLLLLLJQQQQQQQQQQQQSSSSSKKKTTTTTTTTTTTNNNNNN | ||||
| CCCYYYYYJJJJJJJJUUUNZNNNNNNNNNUJJJJJJJJJJJLJJLLLBBBGGGGGGKKKKKKKKKKZZZZZZZZZZAABAGGGGGGGGGGLLLLLLLLLLLQQQQQQQQQQQQQQSSSSKKTTTTTTTTTTTTNNNMNN | ||||
| CCCYYYYJJJJJJJUUUUUNNNNNNNNJJJJJJJJJJJJJJJLLLLLLLLBBGGGGGKGKKKKKKKKZZZZZZZZZZZABBBBGGGGGGGGLLLLLLLLLLLQQQQQQQQQQQQQQSSSSKKTTTTTTTTTTTTTMMMNN | ||||
| CCCCCYYCJJJJJUUUUUUUNUUNNNNJJJJJJJJJJJJJJLLLLLLLLLLLGGGGGGGKKKKKKKKZZZZZZZZZZZBBBBGGGGGGGGGGGOOLLLLGGGGQQQQQQQQQQQQQSSSKKTTTTTTTTTMMTTTMMMMM | ||||
| CCCCZZCCJJJJJUUUUUUUUUUUUUUJJJJJJJJJJJJJZZLLLLLLLLLLFGGGGGGGGGKKKKKZZZZZZZZZZZBBBGGGGGGGGGGGGGLLLGGGGEEEQQQQQQQQQQSQSSSSSTTTTTTTTMMMTTMMMMMM | ||||
| CCCCZZZCCCJJUUUUUUUUUUUUUUUJJJJUUJJJJDDJJZZLLLLLLLZZGGGGGGGGGGKKKKKZZZZZZZZZZZBBBBGGGGGGGGGGGGLLGGGGETEEEEQQQQSSSSSSSSSXTTTTTTTMTMMMTTTMMMMM | ||||
| CCCCCCCCCCJUUUUUUUUUUUUUUUUUJJJUUUDDDDDJJZZFFLLLFLZZZGGGGGGGGGGKKKKZZZZZZZZZBBBBBBGGGGGGGGGGGGLLLGGEEEEEEEQQJQSSSSUSSSSMMTMMMTTMMMMMTTTMMMMM | ||||
| CCCCCCCCCCCUUUUUUUUUUUUUUUUUUJJUUUDDDDDZZZZFFLLLLLLZGGGGGGGGGGGKKKKZZKKKKZZZZBBBBBJBGGGCGGGGGGGLLGGGEEEEEEQQQSSUUUUSSSMMMMMMMMMMMMMMTTMMMMMM | ||||
| CCCCCCCCCCCUUUUUUUUUUUUUUUUUUUUUUDDDDDDDZZFFFFLPWWLEGGGGGGGGGGKKKKKKKKKLZZZZZZBBBBJBGCCCCGGGGGGGLGGGEBBEEEEQSSUUUUUSUSSMMMMMMMMMMMMMMMMMMMMM | ||||
| CCCCCCCCCCCCUUUUUUUUUUUUUUUUUUUUUUDDDDDZZFFFFPLPWWWEGGGGGGESSSSSSSSSSSLLLLZZBBBBBBBBGGGCCCGGGGGGGGGGGGEEEEEESSUUUUUUUMMMMMNNNNNNNMMMMMMMMMMM | ||||
| CCCCCCCCCCCCUUUUUUUUUUUUUUUUUUUUUUDZDDDDZZZZZPPPWWPEEEEEEEESSSSSSSSSSSLLLLLZBBBBBBBBGGCCCXGGGGNNKNGGGAAEEEEEEBBUUUUUMMUMNNNNNNNNNNMMMMMMMMMM | ||||
| CCCCCCCCCLLUUUUUUUUUUUUUUUUUUUUUUUUZZZZZZZZPPPPPPPPPEEEEEEESSSSSSSSSSSLLLLLLBBBBBIBBGGCCXXGGNNNNNNGGAAAEAAAENBBUUBUUUUUMMNUNNNNNNMMNMMMBMBBS | ||||
| CCYYCCCCCLLLUUUUUUUUUUUUUUUUUUUUUUUZZZZZZZZPPPPPEPPPPEEEEEESSSSSSSSSSSLLLLLBBBBBBBBIIGCCXCCWWWNNZNVGAAAAAAABBBBCBBBUUUUUUNUNNKNNNNNNNMMBBBBB | ||||
| YCYYYYYCCLLLUUULUUUUUUUUUUUUUUUUUUUUZZZZZZZPPPPPPPPPPEEEEEKKKSSSSSSSSSLLLLLLBBBBBBIIIIICCCCWWNNNNVVVFAFAAAABBBBBBBBBBBBUUUUUNNNNNNNNNMBBBBBB | ||||
| YYYYYYYCLLLLLLLLLUWUUUUUUUUUUUUUUUUUZZZZZZZZPPPPPPPPPEEEEEKKKSSSSSSSSSLLLLLLBBBBBIIIIIIUCFCWWNNNVVVVFFFFAAAABBBBBBBBBBUUUUUUNNNNNNNNABBBBBBB | ||||
| YYYYYYCCLLLLLLLCLCCRUUUUUUUUUUXXUUUUZZZZZZPPPPPPPPPPPEEEKKKKKSSSSSSSSSLLLLLLLBBBBBYIIIIIIFFNNNNNVVVFFFFFFFFABBBBBBBBBBBUUUUUNUUNNNNNANNNBBBN | ||||
| YYYYYYYYYYPPLLCCCCCCCCUUUUUUUUXXNDNZZZZZZZPPPPPPPPPRREEEEEERASSSSSSSSSLLLLLLLBYBBYYYYYYYIFFNNNNNNVVFFFFFFFFABBBBBBBBBBBBUUUUUUUNNNNNNNNNNNNN | ||||
| QYYYYYYYYYPLLLLCCCCCCCCCTTUUUUNNNNNZZZZZZZZPPPPPPPPRNNEEEEEESAAAABBBLLLLLLLLLLYBYYYYYYYYFFKKKKKKKKZFFFFFFFFFBBBBBBBBBBBBUUUUUUUUNNNNNNNNNNNN | ||||
| YYYYYYYYPPPPPLLCCCCCCCCCCCAAUUNNNNNZZNNNZPPPPPPPPPPRRREREMESSQAAALLLLLLLLLALAYYYYYYYYYYYFFKKKKKKKKZZFFFFFFFRRRRBBBBBBBBUUUUUUUUUNNNNNNNNNNNN | ||||
| EEYYYYYYPPPPPPPCCCCCCCCCCAAAUUNNNNNZZNNNZPPPPPPPPRRRRRRRORRSSQQAAALALLLLLLAAAAYYYYYYYYYNNNKKKKKKKKZZFFFFFFFFRRRBBBBBBBUUUUUUUUUUNNNNNNNNNNNN | ||||
| EEYMMPPPPPPPPPPCCCCCCCCCCCCNNNNNNNNNNNNXPPPPPPPPPRRRRRRRRRRRQQQAAAAAALLLLLAAAAYYYYYYYYNNNNKKKKKKKKZZFFFFFFFFRRBBBBBBBBUUUUUUUUUUNNNNNNNNNNNN | ||||
| EEYYPPPPPPPPPPGCCCCCCCCCCCDNNNNNNNNNNNNNPPPPPPPPRRRRRRRRRRRYQQQQQQQQALLLAAAAAAAYYYYYNNNNNNKKKKKKKKFFFFFFFFFFFRRRBBBBBRRRUUUUUUUUNNNNNNNNNNNN | ||||
| EEENNPPPPPPPPGGCMCCCCCCNNNNNNNNNNNNNNNNNPPPPPPPPRVRVRRRRRRYYYFQQQQQEQQQVAAAAAAAYYYYYYNNNNNKKKKKKKKKKKKFFFFFFFFFBBBCCBRRRRRUUUUUUNNNNNNNNNNNN | ||||
| EEEPPPPPPPPPPPPCMCCCCCCNNNNNNNNNNNNNNNNNKPPPPPPPPVRVRRRRRYYYYFQQQQQQQQQQQAAAAAAYYYYYYNNNNNKKKKKKKKKKKKFFFFFFFFFFFFFCRRORRRRUUUUUNANNNNNNNNNN | ||||
| EEEPPPPPPPPPPPMMMMCCCICMMNNNNNNNNNNNZNNNTTPTTPPPVVVVRRRRRYYYYQQQQQQQQQQQQQAAAAAYYYYYNNNNNNNNNKKKKKKKKKFFFFFFTCCCCCCCRRRRRRRUUIUNINNNNNNNNNNN | ||||
| EEELPPPWWPPPMMMMMMCCCCCCMMMNNNNNNNNNZNNZTTTTTPPTVVVVVRRRYYYYQQQQQQQQQQQQAAAAAAYYYNNNNNNNNNNNNKKKKKKKKKCCCTTTTTCTTRRRRRRRRRTIIIINNNNNNNNNNNNN | ||||
| UUEEEPPWMPPPPMMMMMCCCCCMMMMNNNNNNNZZZNNZTTTTTYTTVVPPVVRRRYYYYQQQQQQQQQQASAAYYAYNNNNNNNNNNNNNNNYCKKKKKKCSSTTTTTCTTTTRRRRRRTTTIITTNNNNNNNNNNNN | ||||
| UUUUMMMMMPPPMMMMMMCMMMMMMMMNNNNNNNZZZZZZCTTTTTTTPPPPVVVRRRRYYQQQQQQQQQQAAAYYYYYYNNNNNNNNNNNNCYYCCCCCCCCCCTTTTTTTTTTERRRRRRRTTITTNNNNNNNNNNNN | ||||
| UUUMMMMMPPMMMMMMMMMMMUUMMNNNNNNNNNZZZZZCTTTTTTTQPPPPVPPPYYYYYYQQQQQQQQQQEAAYYYYYYNNNNNNNNNNCCCCCCCCCCCCCTTTTTTTTTTTRRRRRRRRTTTTTNTNNNNNNNNNN | ||||
| UUMMMMMMMMMMMMMUMMMMMMUUMMMNNNNNNNZZZZOTTFTTTTTQPPPPPPPPBYYYYQQQQQQQQQQQQYYYYYYYYYNNNNNNNANCCJCCCCCCCCCCTSTTTTTTTTTTTTRRRTTTTTTTNTNTTNNNNNNN | ||||
| UMMMMMMMMMMMMMMUUUUUMUUUMMMNBNNNNZZZZZZZFFFFTTTTPPPPFPPPBYYYQQQQQQQQQQQQCQYYYYYYYYYNNNNNNCCCCCCCCCCCCCCCCCTTTTTTTTTTTTRRTTTTTTTTTTTTTNNNNNNN | ||||
| UUMMMMMMMMMMMMMUUUUUUUUUUMMMBNNNZZZZZZZZFFFFUUTPPPPPPPPBBYYYQWQQQQQQQQQQQQQYYYYYYYYNNNNNNCCCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTNNNNNNNNN | ||||
							
								
								
									
										1279
									
								
								y2024/resources/13_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1279
									
								
								y2024/resources/13_input.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										500
									
								
								y2024/resources/14_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										500
									
								
								y2024/resources/14_input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,500 @@ | ||||
| p=44,70 v=-47,36 | ||||
| p=56,4 v=69,91 | ||||
| p=6,30 v=-52,-60 | ||||
| p=64,4 v=35,44 | ||||
| p=57,22 v=-56,48 | ||||
| p=5,22 v=18,37 | ||||
| p=2,48 v=88,-65 | ||||
| p=80,54 v=28,-40 | ||||
| p=76,0 v=98,4 | ||||
| p=7,89 v=33,-33 | ||||
| p=25,30 v=-15,70 | ||||
| p=92,41 v=35,80 | ||||
| p=39,6 v=-47,-20 | ||||
| p=30,82 v=97,8 | ||||
| p=8,67 v=-44,-59 | ||||
| p=87,24 v=-51,83 | ||||
| p=83,33 v=43,73 | ||||
| p=95,59 v=50,90 | ||||
| p=10,69 v=-47,-44 | ||||
| p=15,15 v=91,98 | ||||
| p=73,21 v=-24,77 | ||||
| p=11,22 v=2,-82 | ||||
| p=87,95 v=65,-42 | ||||
| p=26,47 v=33,-20 | ||||
| p=50,58 v=69,-62 | ||||
| p=88,60 v=12,68 | ||||
| p=82,15 v=-97,10 | ||||
| p=47,83 v=81,-93 | ||||
| p=96,92 v=47,-61 | ||||
| p=1,30 v=18,84 | ||||
| p=21,51 v=49,50 | ||||
| p=49,18 v=-70,-88 | ||||
| p=52,0 v=54,39 | ||||
| p=46,30 v=61,97 | ||||
| p=13,17 v=10,-51 | ||||
| p=72,85 v=21,-45 | ||||
| p=99,57 v=42,49 | ||||
| p=96,26 v=74,8 | ||||
| p=79,31 v=-66,55 | ||||
| p=0,80 v=-3,29 | ||||
| p=19,89 v=56,-45 | ||||
| p=13,85 v=-58,-59 | ||||
| p=34,51 v=-84,-38 | ||||
| p=67,96 v=-10,-42 | ||||
| p=75,1 v=-11,23 | ||||
| p=30,54 v=85,25 | ||||
| p=95,66 v=81,79 | ||||
| p=19,77 v=87,82 | ||||
| p=32,29 v=-85,-22 | ||||
| p=52,73 v=14,52 | ||||
| p=82,84 v=43,93 | ||||
| p=74,88 v=66,-99 | ||||
| p=47,18 v=-71,-31 | ||||
| p=98,71 v=2,36 | ||||
| p=28,70 v=24,-83 | ||||
| p=91,42 v=-90,46 | ||||
| p=54,101 v=69,-53 | ||||
| p=33,77 v=-34,70 | ||||
| p=0,64 v=95,98 | ||||
| p=56,63 v=-17,-37 | ||||
| p=43,88 v=-94,47 | ||||
| p=31,67 v=43,72 | ||||
| p=72,26 v=-96,-14 | ||||
| p=52,6 v=-56,-96 | ||||
| p=41,67 v=39,6 | ||||
| p=15,18 v=-14,-63 | ||||
| p=73,60 v=23,-79 | ||||
| p=20,54 v=95,97 | ||||
| p=66,41 v=96,-36 | ||||
| p=80,0 v=56,-71 | ||||
| p=83,41 v=-11,43 | ||||
| p=59,0 v=44,-64 | ||||
| p=92,20 v=-35,-6 | ||||
| p=85,102 v=44,-73 | ||||
| p=24,20 v=-87,-6 | ||||
| p=99,52 v=24,-66 | ||||
| p=40,54 v=-32,84 | ||||
| p=86,53 v=-10,-5 | ||||
| p=69,43 v=-80,32 | ||||
| p=81,95 v=98,15 | ||||
| p=55,76 v=-76,36 | ||||
| p=93,68 v=28,85 | ||||
| p=52,6 v=38,-96 | ||||
| p=76,22 v=-74,-17 | ||||
| p=7,93 v=63,67 | ||||
| p=83,12 v=18,51 | ||||
| p=42,100 v=-38,37 | ||||
| p=47,22 v=-39,10 | ||||
| p=85,7 v=-19,-12 | ||||
| p=39,5 v=26,-67 | ||||
| p=26,38 v=-38,-63 | ||||
| p=95,34 v=35,-33 | ||||
| p=67,78 v=-96,-17 | ||||
| p=51,52 v=92,-19 | ||||
| p=14,91 v=-6,-83 | ||||
| p=22,83 v=17,-42 | ||||
| p=26,38 v=-55,-73 | ||||
| p=84,76 v=-50,-48 | ||||
| p=15,42 v=72,3 | ||||
| p=68,32 v=-19,-63 | ||||
| p=40,39 v=32,49 | ||||
| p=35,87 v=48,17 | ||||
| p=32,81 v=43,5 | ||||
| p=66,71 v=93,40 | ||||
| p=1,59 v=80,68 | ||||
| p=99,60 v=38,71 | ||||
| p=66,29 v=44,32 | ||||
| p=13,18 v=-29,59 | ||||
| p=27,39 v=-84,5 | ||||
| p=21,96 v=-53,-64 | ||||
| p=49,30 v=-55,-79 | ||||
| p=36,51 v=-81,53 | ||||
| p=38,6 v=-31,-4 | ||||
| p=4,79 v=-84,-34 | ||||
| p=1,1 v=25,-85 | ||||
| p=28,46 v=-89,62 | ||||
| p=79,38 v=-8,-8 | ||||
| p=24,84 v=-45,-75 | ||||
| p=55,23 v=-71,-69 | ||||
| p=55,7 v=90,69 | ||||
| p=37,34 v=39,16 | ||||
| p=62,70 v=83,-32 | ||||
| p=99,84 v=-84,45 | ||||
| p=75,83 v=28,9 | ||||
| p=15,41 v=55,92 | ||||
| p=73,99 v=-64,56 | ||||
| p=65,3 v=4,16 | ||||
| p=17,30 v=-15,-9 | ||||
| p=4,73 v=81,-51 | ||||
| p=13,41 v=-91,54 | ||||
| p=49,47 v=-32,38 | ||||
| p=92,82 v=98,63 | ||||
| p=67,27 v=40,-39 | ||||
| p=49,52 v=-1,19 | ||||
| p=73,83 v=-62,-56 | ||||
| p=8,89 v=92,9 | ||||
| p=97,43 v=18,-81 | ||||
| p=59,30 v=60,78 | ||||
| p=4,43 v=-99,-81 | ||||
| p=36,78 v=47,-14 | ||||
| p=9,79 v=-52,-15 | ||||
| p=36,97 v=39,-83 | ||||
| p=62,15 v=-41,-47 | ||||
| p=50,2 v=-93,-4 | ||||
| p=95,10 v=-65,-87 | ||||
| p=63,69 v=68,71 | ||||
| p=0,96 v=65,80 | ||||
| p=44,74 v=29,46 | ||||
| p=100,77 v=-63,44 | ||||
| p=29,0 v=-46,53 | ||||
| p=58,63 v=-18,93 | ||||
| p=48,7 v=-55,-85 | ||||
| p=2,71 v=-45,-29 | ||||
| p=67,26 v=97,73 | ||||
| p=76,50 v=84,-31 | ||||
| p=68,0 v=-18,-58 | ||||
| p=4,45 v=57,38 | ||||
| p=23,94 v=-30,31 | ||||
| p=41,26 v=-68,5 | ||||
| p=36,52 v=-55,-3 | ||||
| p=33,96 v=7,96 | ||||
| p=61,25 v=99,-1 | ||||
| p=86,52 v=-68,23 | ||||
| p=7,43 v=59,-71 | ||||
| p=52,17 v=53,75 | ||||
| p=27,84 v=-75,-16 | ||||
| p=12,54 v=64,89 | ||||
| p=5,37 v=88,89 | ||||
| p=8,51 v=84,-82 | ||||
| p=97,30 v=-4,84 | ||||
| p=68,8 v=-81,78 | ||||
| p=93,79 v=-36,88 | ||||
| p=55,14 v=-17,58 | ||||
| p=9,65 v=-29,22 | ||||
| p=4,81 v=97,-21 | ||||
| p=99,81 v=89,55 | ||||
| p=18,30 v=-61,-60 | ||||
| p=34,102 v=-15,-88 | ||||
| p=96,42 v=-20,-76 | ||||
| p=25,46 v=-79,41 | ||||
| p=56,44 v=-96,56 | ||||
| p=66,8 v=-57,72 | ||||
| p=36,87 v=79,82 | ||||
| p=64,9 v=59,-23 | ||||
| p=1,49 v=21,6 | ||||
| p=38,59 v=-40,-73 | ||||
| p=41,102 v=5,94 | ||||
| p=19,87 v=57,-83 | ||||
| p=30,75 v=24,85 | ||||
| p=67,83 v=-18,58 | ||||
| p=68,3 v=61,-7 | ||||
| p=43,49 v=48,-16 | ||||
| p=8,99 v=-67,-46 | ||||
| p=42,58 v=68,-62 | ||||
| p=70,35 v=-10,24 | ||||
| p=34,32 v=39,29 | ||||
| p=19,9 v=46,78 | ||||
| p=1,52 v=4,-49 | ||||
| p=41,57 v=77,82 | ||||
| p=32,97 v=-70,-26 | ||||
| p=57,19 v=61,75 | ||||
| p=83,15 v=97,5 | ||||
| p=1,9 v=87,65 | ||||
| p=18,31 v=-61,51 | ||||
| p=76,27 v=85,-29 | ||||
| p=68,29 v=21,21 | ||||
| p=93,29 v=89,-30 | ||||
| p=37,10 v=70,34 | ||||
| p=75,1 v=-96,47 | ||||
| p=92,40 v=-42,-35 | ||||
| p=21,20 v=-61,2 | ||||
| p=84,13 v=16,42 | ||||
| p=60,16 v=68,78 | ||||
| p=33,87 v=94,34 | ||||
| p=53,51 v=45,27 | ||||
| p=24,90 v=71,91 | ||||
| p=30,36 v=68,-46 | ||||
| p=59,32 v=68,-79 | ||||
| p=95,54 v=-90,25 | ||||
| p=51,71 v=-40,14 | ||||
| p=57,100 v=-40,-82 | ||||
| p=31,4 v=-69,80 | ||||
| p=84,38 v=8,41 | ||||
| p=76,5 v=-49,15 | ||||
| p=29,95 v=-7,23 | ||||
| p=31,48 v=46,41 | ||||
| p=71,46 v=-41,27 | ||||
| p=8,54 v=-25,-37 | ||||
| p=12,65 v=-22,-65 | ||||
| p=28,54 v=29,-27 | ||||
| p=81,26 v=-76,-75 | ||||
| p=62,4 v=-17,15 | ||||
| p=54,12 v=-96,56 | ||||
| p=80,42 v=-96,17 | ||||
| p=3,44 v=-13,11 | ||||
| p=35,95 v=69,26 | ||||
| p=30,32 v=-8,29 | ||||
| p=76,85 v=49,-84 | ||||
| p=77,102 v=67,-88 | ||||
| p=1,37 v=-28,-32 | ||||
| p=25,88 v=-77,39 | ||||
| p=83,3 v=-58,-20 | ||||
| p=96,10 v=-20,45 | ||||
| p=61,7 v=94,6 | ||||
| p=84,100 v=-58,-23 | ||||
| p=26,76 v=55,-33 | ||||
| p=20,91 v=-37,20 | ||||
| p=51,22 v=14,-93 | ||||
| p=53,84 v=23,90 | ||||
| p=75,68 v=-25,82 | ||||
| p=45,57 v=-25,46 | ||||
| p=20,97 v=-43,26 | ||||
| p=11,70 v=58,-57 | ||||
| p=11,5 v=-27,57 | ||||
| p=25,81 v=9,-56 | ||||
| p=94,87 v=42,34 | ||||
| p=18,3 v=-45,18 | ||||
| p=59,87 v=84,12 | ||||
| p=88,64 v=75,11 | ||||
| p=12,83 v=-9,-68 | ||||
| p=33,52 v=72,-71 | ||||
| p=29,17 v=-38,53 | ||||
| p=95,5 v=19,-64 | ||||
| p=32,32 v=-11,-9 | ||||
| p=87,96 v=-62,59 | ||||
| p=57,3 v=-78,-91 | ||||
| p=60,88 v=29,39 | ||||
| p=98,27 v=43,-66 | ||||
| p=74,8 v=-77,-14 | ||||
| p=72,98 v=91,-72 | ||||
| p=63,64 v=26,1 | ||||
| p=11,49 v=-90,11 | ||||
| p=24,72 v=-22,44 | ||||
| p=69,72 v=-51,-25 | ||||
| p=61,12 v=52,26 | ||||
| p=24,82 v=-70,71 | ||||
| p=42,16 v=-93,27 | ||||
| p=63,95 v=45,93 | ||||
| p=10,88 v=64,20 | ||||
| p=90,32 v=-89,13 | ||||
| p=69,81 v=44,-57 | ||||
| p=33,37 v=-94,-52 | ||||
| p=27,50 v=49,53 | ||||
| p=80,32 v=28,13 | ||||
| p=76,68 v=5,-86 | ||||
| p=23,51 v=-21,-19 | ||||
| p=22,41 v=-14,73 | ||||
| p=73,54 v=91,68 | ||||
| p=22,46 v=94,89 | ||||
| p=7,73 v=95,71 | ||||
| p=12,63 v=-37,14 | ||||
| p=33,12 v=-56,-13 | ||||
| p=88,67 v=89,79 | ||||
| p=29,44 v=-85,-27 | ||||
| p=63,16 v=91,18 | ||||
| p=25,49 v=-24,33 | ||||
| p=70,76 v=-93,45 | ||||
| p=66,47 v=-96,-49 | ||||
| p=52,33 v=-73,7 | ||||
| p=5,39 v=10,84 | ||||
| p=89,65 v=58,-16 | ||||
| p=5,16 v=-91,34 | ||||
| p=27,95 v=16,12 | ||||
| p=27,0 v=-12,23 | ||||
| p=4,20 v=-6,-3 | ||||
| p=91,25 v=20,17 | ||||
| p=51,99 v=46,12 | ||||
| p=34,73 v=-15,55 | ||||
| p=100,23 v=-82,-49 | ||||
| p=19,80 v=-53,96 | ||||
| p=80,5 v=-19,64 | ||||
| p=50,100 v=-16,-80 | ||||
| p=69,44 v=22,51 | ||||
| p=26,76 v=91,93 | ||||
| p=48,88 v=-24,55 | ||||
| p=68,26 v=86,-23 | ||||
| p=49,95 v=31,-64 | ||||
| p=53,16 v=93,24 | ||||
| p=0,45 v=-36,-8 | ||||
| p=19,71 v=-78,-8 | ||||
| p=62,98 v=42,7 | ||||
| p=22,85 v=-99,6 | ||||
| p=48,48 v=-54,57 | ||||
| p=81,34 v=81,32 | ||||
| p=23,73 v=71,-89 | ||||
| p=57,64 v=-4,-47 | ||||
| p=89,17 v=26,-60 | ||||
| p=49,60 v=-45,47 | ||||
| p=25,16 v=13,-46 | ||||
| p=16,62 v=17,49 | ||||
| p=70,83 v=44,47 | ||||
| p=52,3 v=69,56 | ||||
| p=53,3 v=7,-58 | ||||
| p=59,28 v=-24,-4 | ||||
| p=39,67 v=15,14 | ||||
| p=59,71 v=-79,52 | ||||
| p=81,90 v=-58,47 | ||||
| p=87,6 v=51,50 | ||||
| p=32,58 v=16,-5 | ||||
| p=99,3 v=12,53 | ||||
| p=71,13 v=-49,86 | ||||
| p=93,25 v=4,59 | ||||
| p=54,95 v=25,12 | ||||
| p=66,76 v=45,-2 | ||||
| p=78,102 v=-42,61 | ||||
| p=47,54 v=37,-35 | ||||
| p=91,76 v=74,-2 | ||||
| p=98,87 v=73,-72 | ||||
| p=62,99 v=-3,-58 | ||||
| p=44,85 v=-24,-45 | ||||
| p=2,57 v=-13,-16 | ||||
| p=10,19 v=10,-1 | ||||
| p=87,40 v=51,73 | ||||
| p=77,27 v=67,81 | ||||
| p=35,96 v=-32,61 | ||||
| p=84,83 v=52,-2 | ||||
| p=10,63 v=18,14 | ||||
| p=57,101 v=-17,26 | ||||
| p=100,54 v=-59,-24 | ||||
| p=96,44 v=-20,54 | ||||
| p=11,83 v=2,17 | ||||
| p=17,87 v=9,-35 | ||||
| p=35,54 v=-93,76 | ||||
| p=66,2 v=36,23 | ||||
| p=37,59 v=-31,-81 | ||||
| p=67,36 v=-2,27 | ||||
| p=100,34 v=40,-86 | ||||
| p=52,81 v=-94,-2 | ||||
| p=30,10 v=39,45 | ||||
| p=7,74 v=80,90 | ||||
| p=77,79 v=59,28 | ||||
| p=40,33 v=96,98 | ||||
| p=60,70 v=99,-59 | ||||
| p=25,66 v=48,33 | ||||
| p=87,50 v=97,-19 | ||||
| p=86,6 v=35,99 | ||||
| p=16,51 v=95,60 | ||||
| p=72,31 v=84,27 | ||||
| p=99,18 v=-28,-55 | ||||
| p=95,38 v=-51,84 | ||||
| p=71,40 v=-19,-25 | ||||
| p=63,2 v=-2,37 | ||||
| p=65,80 v=68,-48 | ||||
| p=58,82 v=-40,3 | ||||
| p=79,27 v=59,-36 | ||||
| p=8,60 v=44,-30 | ||||
| p=53,49 v=-40,27 | ||||
| p=64,81 v=38,-91 | ||||
| p=62,55 v=-87,-8 | ||||
| p=46,43 v=7,-11 | ||||
| p=69,37 v=-65,-79 | ||||
| p=31,58 v=46,30 | ||||
| p=61,17 v=-87,37 | ||||
| p=56,98 v=-8,-15 | ||||
| p=62,102 v=-24,-9 | ||||
| p=46,28 v=54,59 | ||||
| p=21,29 v=-69,-71 | ||||
| p=83,65 v=67,38 | ||||
| p=94,52 v=59,65 | ||||
| p=32,47 v=31,5 | ||||
| p=95,34 v=-80,-3 | ||||
| p=32,37 v=-54,-76 | ||||
| p=89,18 v=82,-66 | ||||
| p=28,88 v=-47,9 | ||||
| p=62,20 v=98,-90 | ||||
| p=83,83 v=51,36 | ||||
| p=21,89 v=-83,-7 | ||||
| p=58,31 v=84,-79 | ||||
| p=75,49 v=-11,92 | ||||
| p=44,91 v=-39,12 | ||||
| p=17,82 v=-93,-80 | ||||
| p=94,56 v=-54,-82 | ||||
| p=56,43 v=69,-42 | ||||
| p=9,27 v=50,-41 | ||||
| p=6,49 v=-29,76 | ||||
| p=64,39 v=3,52 | ||||
| p=8,73 v=26,6 | ||||
| p=58,83 v=-64,-64 | ||||
| p=26,94 v=-8,-15 | ||||
| p=20,69 v=88,9 | ||||
| p=7,82 v=-12,96 | ||||
| p=33,25 v=-89,68 | ||||
| p=61,40 v=-34,78 | ||||
| p=25,39 v=56,49 | ||||
| p=60,18 v=-20,-42 | ||||
| p=91,30 v=-65,56 | ||||
| p=80,21 v=44,-77 | ||||
| p=74,102 v=67,-31 | ||||
| p=98,76 v=-53,76 | ||||
| p=21,23 v=87,29 | ||||
| p=75,57 v=-25,-78 | ||||
| p=13,11 v=-6,86 | ||||
| p=84,1 v=-19,-61 | ||||
| p=80,23 v=28,-93 | ||||
| p=24,17 v=-92,-85 | ||||
| p=4,55 v=70,61 | ||||
| p=33,84 v=-29,-69 | ||||
| p=30,82 v=24,-61 | ||||
| p=58,30 v=6,-52 | ||||
| p=1,71 v=3,-51 | ||||
| p=53,69 v=-64,-24 | ||||
| p=68,11 v=61,2 | ||||
| p=22,8 v=-69,-12 | ||||
| p=82,93 v=75,1 | ||||
| p=45,21 v=44,-89 | ||||
| p=11,81 v=-75,-29 | ||||
| p=59,77 v=42,44 | ||||
| p=11,34 v=10,-3 | ||||
| p=25,98 v=-69,58 | ||||
| p=37,55 v=30,-51 | ||||
| p=0,69 v=55,-90 | ||||
| p=89,12 v=35,82 | ||||
| p=58,65 v=-25,-24 | ||||
| p=29,102 v=-69,64 | ||||
| p=36,0 v=12,17 | ||||
| p=94,54 v=70,-56 | ||||
| p=48,95 v=90,-68 | ||||
| p=39,59 v=-94,34 | ||||
| p=23,18 v=-21,21 | ||||
| p=84,91 v=-81,-34 | ||||
| p=70,44 v=21,-95 | ||||
| p=87,73 v=4,-16 | ||||
| p=66,40 v=86,35 | ||||
| p=97,30 v=-82,-90 | ||||
| p=86,46 v=-61,33 | ||||
| p=90,73 v=-65,82 | ||||
| p=49,24 v=7,-44 | ||||
| p=76,77 v=-74,17 | ||||
| p=89,3 v=-56,-59 | ||||
| p=57,99 v=-25,42 | ||||
| p=72,101 v=-65,94 | ||||
| p=77,27 v=-81,-14 | ||||
| p=18,57 v=-84,-70 | ||||
| p=18,68 v=95,95 | ||||
| p=47,4 v=-70,-23 | ||||
| p=52,66 v=91,9 | ||||
| p=40,89 v=-23,-21 | ||||
| p=80,19 v=85,49 | ||||
| p=75,8 v=5,56 | ||||
| p=35,20 v=-32,-58 | ||||
| p=47,100 v=35,-63 | ||||
| p=66,60 v=60,25 | ||||
| p=36,81 v=-7,-86 | ||||
| p=17,55 v=-22,-84 | ||||
| p=47,94 v=54,4 | ||||
| p=75,22 v=-59,-96 | ||||
| p=0,48 v=-51,73 | ||||
| p=22,2 v=-22,64 | ||||
| p=100,29 v=53,59 | ||||
| p=68,5 v=-10,-31 | ||||
| p=42,3 v=-54,-17 | ||||
| p=97,31 v=58,-1 | ||||
| p=79,34 v=99,-30 | ||||
| p=95,66 v=-19,57 | ||||
| p=40,52 v=47,46 | ||||
| p=36,102 v=-67,-58 | ||||
| p=75,98 v=-4,39 | ||||
| p=89,90 v=-52,50 | ||||
| p=54,50 v=30,57 | ||||
| p=20,72 v=-84,-32 | ||||
							
								
								
									
										71
									
								
								y2024/resources/15_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								y2024/resources/15_input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| ################################################## | ||||
| #OOO#..O.O#O#...#.O.OO...............OO.....O....# | ||||
| #O#O...#...#...O............OO.#...OO..O..OO...O.# | ||||
| #..O....O#.O..O.O..O#O##.OO..O..........#O....OO.# | ||||
| #...O#.OOO.O.O.O......O.OO.O..#.O.OO#O.#OO.O.O#..# | ||||
| #OO..O....O....#....OO#OO..O..OO..O.....#O.O..O.O# | ||||
| #O.....#.O.O...#..OO.......OO....O.#O.O..#..O..O.# | ||||
| #..OO.O.#O.O.O..##O..O#OO....#.O..O...O.OO..#OOO## | ||||
| #....OO...OO..O..O.#.OOO..O..#O....OO#O..O..#.O..# | ||||
| #....OO.#...O#..O...#.....O......#.....#.....#.O.# | ||||
| #..O.....O.O.O..O....OO#.O.#.O......#..#O.O..OO..# | ||||
| #.#..OO....O........O.#....OO...#.O.OO...O.......# | ||||
| #OO...OO.OO...#.OOO........O#...O.#.OO....OO...OO# | ||||
| #.O..O..OO.OOOO....#..O.#OO.O..O#.......O.#....### | ||||
| #O...O.......OO....#......OO.O.#O.O..O.O.O.#..O.O# | ||||
| #OO#OO....#O...O#....#...OOO.O.O..O..#...O.O#O..O# | ||||
| #....OOO#OO.......#.OO....#...O..#.O...#.O.......# | ||||
| #OOOO....O...O.OOOO.....OO.......O#..O.OO.....O.O# | ||||
| #..#..O.#.O..OO.OOOO...OO#...OOO...O.##.O#.O..OOO# | ||||
| #O......O..O#...#....O...O.OO....O.O....OO..#....# | ||||
| #.....OOO..O.O......O...#...O...........#.OO..#O.# | ||||
| #...#.....O.O..#O#....O.#O#..O#....O..O....#OOO### | ||||
| ####O.....O...O.#.......O.O.O...O.....O.O...O...O# | ||||
| #O...O...O.OO.O.....O.O......O.##.#O#.O.....O..OO# | ||||
| #...#..#...#...OO..#OO.O@.O......O............OO.# | ||||
| #O........OOO.O.O.O..#..#O...O.O..#.OO...#.OO..#.# | ||||
| #.O.#..O...O...OO...#..OOO......OO.#O#......O.OO.# | ||||
| #.O...OO#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#....OOO.#..#.OO..O..OO.OOO...# | ||||
| #.#OO..O...O.....O.O#.....##..O.O#.O.O....O....#.# | ||||
| #....#..#.....#O.#..O..#......O..O.....OO#..O#.OO# | ||||
| #....O.O...#OO...#O.O..O..........OO..#O....O..O## | ||||
| #O...#..#.....O.......O.O.O....O.O.O..O.O.#...#### | ||||
| #.OO........#.#..........#..O....OO#..#O.O.....O.# | ||||
| #.#..O.O....OO....#O.......#.O..O.#O.O..OO#......# | ||||
| #O...O.....O.OO#...#O.O.O.....O..OOO..O##.O...O..# | ||||
| #O...OO.#O#.O..O..O...O.O......O..##............## | ||||
| #O.O.#...........OO.....OO...O.O......#O.OO....OO# | ||||
| #...OO...OO#.O..O.O...O..OO......O.......O.O.OO..# | ||||
| #.#....O..O..O...O.......#...O.#O..O..O.O.O......# | ||||
| #O....O......O#.O......##.....#.....O.O.O#O......# | ||||
| #.OO.OO..O......OOOO..O#.O...O.O......#.....OO..O# | ||||
| #.O......O.O.OO.O..#..O....O.....#....O.#.OO#...O# | ||||
| #.O..#....#...O......#.O.....OO.O.....O.....O....# | ||||
| #.#..OO.....#.....#O.O.#O......O......OO....OOO.O# | ||||
| #..OO.O....O...O.O......O.O.OO...#.....O.......O.# | ||||
| #..O..O...#.O.O#........OO....O...O.OO...#.......# | ||||
| ################################################## | ||||
|  | ||||
| ^>v<v><>^<>v^<vvv<v>v<><>^^v>^^<<^<v^v>v<>v^<^<^v^v^>>v<><>^<^^^^<v^><v<^^>v>vv>v^><<vv>>^><v<^<^v^v>v>>^><>^^vv^<<<>v>v>>vvvv^<^><v>^^><>v>^v^^<>>^<^<v<v^^<v><v><<>>>v^<<>>^^^<^>><v>>v>^>>v^^v^^^>>^v<vv^>>vvv<<>vv<^>>>^^^v<<<^^<v^^<><v>v<v<vvv^>><><>>>^v>^vv>^><^>>vv^^<^<v^<>>v^^vv^v^^v<v^<v^<><>>>>v><<vv<><^vv^vv><^^^vv><v^<^>><<<v^v<>v><>>v^^<^^>><>^vvv<<><<^v<<^>^v^^v><^<^vvv>v<^^vv^<><vvv<><>>>>v<^^v^<vv<v>^v>vv^v>><<v^><<><<>^v>>><^<^<vv>^^^v><^>vv>>v<^<<v>vv<<>>^>v<>^^<^<><^<>vvv><>><<v^^>>>v^>^<<^^>v^>>>vv<^v><>v<<^>>><<><v^><<<<>^>^^v^<>^>v>v><<<>><<>>vv>v><<^><<><vv>vv<v^v^>vv<<v>v^v^v^v<<^v^v><>v>v<^v^>><>><^<>v^^^^v>^^<^v><v<>^<<>^><^^^><>vvv>>>><<vv^v^<v^>vvv^<^^v>><<<v^v^<vv>v^^^^>v<<^<>v<^>^^>^<<v<^^^^>v>>^^<>v>v<<^<><v^^v<v>v>^<^>><<>v>>v>v>^v<<^<<^<vv<>>>vv>^<>v<v^^v<<vv^v>>^v^v>^>^>^>vv><^<<^<><<^v<v<v<v^^vv<<v^>v>v<^>v<vvv^<>^><vv>^v<^>>vvv>v><v>^<>^<^^>><<^><v^>>^v>>><v<^v^<<<<vvvv>^<<<>^>>>v<><><v<v^v>><<^>><v>v^<vv^^<>>^>><<<<^^>v>^^<<v^^>vvv^><v>v^<<>^<<<^<>>^<>< | ||||
| <<^^^v<v^>^v^>v<^>vv^v<>^<v^<<>>^vv>v><^>^>^<<vv><>v>>v^<^<v<^vvv>>v^><>>>v<>>v<><v>><^^<^^v<<<<v<^^<v^>^^^vv>^v<v<>v<^><v<^^>>v^>v^><^><<>>^vvv>>v<>v<^<^>>v<^<^^<>^v^<^>^^>^v<><^><<>^>v>v>v^vv^^<^v^^<>><<v>v<^>>>>v^v<^>><v<vvv>v>v<<^vvv>>^>>^^>><^>vvv>><^v>>v<<<>v<>v>^<^>vv^^<<<<<<<vv^^^<><^<<vv<<^v><vv>>>><>v<>^>>^^v><^v>v<<vv<^>v>^><^>^v<v>^<v<v^<^^v<^<>>^v^<^<<<^^<<<vv><<<v<^><vv>^>v^<^<>^^^vv><>^^<^v<>vv^>^^^^^<vv<vvv>^^v>^><><v^<^<<><<^v^vvvv>>^v>>^<vv^v^<>^<v<>v<^v>vvvvv>>>vvv<v<<<>v<<><<^^^^v<<vv><<^^>><>>>vv>v<^<v>>v^><v<>^<<<v<<^<^<<^>>^<><^v^v^>^^^^v>v>^v<>^>><^>v><><^<^v>^><<>^^v^v>><><v<^^^>v^vv^v>^^^<>^v<<<^>v^^v>^vv<<vv^^<>vvv<>v><^v>^<><^^>v<<^<>v^^<<>>^v<^>vv^<v<>^v<^v><v>>v^<^v><v^vv>><<v<<vv>><<v^v^^<^>^>>>>>>^<vv><>vvv<<<^>>v<>vv<><>^><<v<v>^<<>^>>^<<><>v<^<^<vv>><vv<^^>^><<v>>^<>><^<^v><<><vv>^><vvvv<v<v<v>>^<v^<<>>^v<><>v^>^^>^>v>vv<^^^>v>^>^vv<^vv^v<<>>>^v^>>>vv^^v<^v^<>v<^<>>v^<^v^^<vv<^<^>>><><<>v<^<<<>>>>><<<>^v<<^^^^^^^>v^^^^^^<^>^>^<>^<>^^v^^<<>>^<><^<^<>^^< | ||||
| vv^>^><<<<^v^^<>>><^v^vv^^>^<^<v<^>>^><vv><^<><<v>v^>v<v<>>^>v^<><^vv<><>>^^v^<^v<<^>>^^^>v>v>><>>v><<^>v^^v<v^>>v<v><>v<vv<v^^^v^>>>^^<^^<^v<^v>^><^<v^^v>v^^<<<^>^^<v<<^^><v>>^>^<^^^<>^v<v<>^<>>^>vvvv^^^^v>^v<>^<<<<>^>>^^^^>^^v><v>>>v^v>>><^v^vvvv^v>>^^v^^<vv<<^^<^v<<>^<<vv<v^<>^vv>^><<<>v<v>v^<v<>v>^<><v<<^v<^<>v^<v^^^v<<^<<vv<>vv^<v<>^^^<^<>^vv>^v><^<<^^^vvvv^v<^>vv>>^v^vvvv>><^>>^^<v<<^^<vv<v^<>^<><<v>>vv^v<^v<^<v^><>v<<^v<v>v^>>v<v^^<>>>v^vv^<><>vvvv<>v^<^v^>>vv^v^>v<<^vv>^v^^v<<<v><<^vv><<^>>^^v<v>v<>v>^^>>^^><v>>v^<>vvv^>v<^<>v^><><<^<v^^<v^^^^v<v><<v>v>>>v^^<><v^<>^<>>^<>vv>><^><v^^^<v^^>v<^<v<^<v^vv>^<v^v^>>>v<^vvv>><<>^^>^<^v^^>><>v^^>><^><<vv>>v<^>vv>>v>><v<^><vvv^<^^^v>^^<^v><>^v<^vv^^>v><^v>^>><<<<>^v>><><^v^v>><>v>>><>^^^^<^^v^<<v<>v>v<^^^v<^<<>v<><><vv><v><^^>>^>^v>^^><><^v>^<>>^<<v<^v^v^><^^>^><<v^^v<<><^^>vv>vv^<v^<<<vv^<<>^vv<^<<<><vv><<^v^v<<v>>v^v>^<^^>>>>v^^^<>><v^<v^><><<>^v<^<v<^<<<v^v<v<v^v<^<^<v<><^<>^<<>v<<^<v^vvv>><^^^^><<<^^<<vv><^v<^v^^<^>^^<>>>^>><^^>^^>>< | ||||
| <<<<<>v^>^<^vv>^v^>^>^v<v<<<^v^v>vv><>>>><^><>>>^<vvv>v^<>^v^<<v^>>v^v^vvv>^<>v<>>v^<v<^vv><^>>^>v<<v^<^><>^<^>>v<^^vvv^<<<<^vv^vv^>>^><^>v^>><v><v^^>>><v<^<^v^<v^>v>><v>v^<^>vv<<^^^^^<<>vv><^<^<><^<>^<^>^v^^<v<<>vv<^v>vv<<<vvv^<^>vv><v>>><v<>>v>^^v^^<>>^v<>><>v<>^v^>>>>^^^v^^^><v^v>^^<<<^<<^>^><^><<^vv^^v>v><>^<><^>^<<>>^<v^vv^^vv<^<^^>v>v>^vv<^v>>^>>v>><vv><^<<<<vv>vv>>^^^><<v<<<>v<<<>>v^<<^vv>>>^>><<>^^<<<v^<<><<><<<v^^^>><^v<<<v>v^v^<<v<<v<v^vv<<^vv<v><^>^<v<<v^<v<>^^<^^v><>^v<v<^^v^<><^<v<v^<^v>>v<vv<^^^<^^>v>v^^vv<<<^<vv>^<<^<<^<^^v^v>^v^>v<>>>^v^v<<v<^vv>>^^^>>^<<><^^><v^^^<vv^^^v<<<v<^v<>^^>v<^v<^vv<v<>^vv>^^^>^v^^<>v>^^>v^vv^v><<<^<>v>vvvvvv>vv<>^>^^>>^>^<<>^v>v^<^vvv>^^^^^v<>><v><vv<<<^v>>^v<>>>v><>v>^>v<>^>>vvvv<><><v<^>>vv^^<>>><v>^^v<v<<^^^^v<<><v^<^<vv<<<^<v>><<<>v<v<<<<<>^<>><v>^^><v>^>^^^><>v^v<^v^vvvvv<^^<v>v^v>>>>v^^^<>v<>><<><^<^v^v^<v^v<>v>>v>>^vvv>>>^^>>><^v<<<^>^vv>>v>>>^><v<^>>^<<v>>v<<<^vv>^v<>^v<^><^vv>v^v^vv><vv>v<^^>v>v><><><^><v^v^<v<>>^^><<^<v>v^>v^>^v<^v<> | ||||
| >v>>><>^<^v<<<>^v>v^^v>>^<<^v>><^<v^^^<<<<>^^v<v^>><^^<<<<<v^vv^v<v^^>^>vv^v^<<<^<>v^>^<<<vv^<<<<vv><^v^<^<><v<v^v^<^vv><>^>v<>v>v<<vv<^>^>>v^v<^>v>^^v>v<^^v<<<<^^^<<^<v^<>^>v<vv>><vv<^^<>^>v>v^vv<>^<v^^>vv^>>v^^<>>>><v<>vv^>vv><^^>vv^v^^>^^^^v^v^<v<><^v>v<^^<><>vvvv>>v<v><<<v<<<>^v<^v^v^^>vv^^<v><<^<^vv^^<<<<><^<<>>vv<v>^<^^^<<v^^v^^>><>v^>^>>><<<v>>>>^vv>v>vv>^<<^v^^^^>>^>v<^^>>^v>>^v<>>v<v<>>>v^><>^v<<v>>>^v<>>v>>><<>vvvv^>><><^v>^>>vv<vv^>>^<><^v><^^v><<<<>vv<<^^v<^>vv<^^v<<^><<vv^^<^vv>v<<^v^<^v<<vvv>v<><><^<<>>v^><>^^^vv^>><<vv>^v^^<>v<<vv<^^^^><vv^v>>^^v<v<^<^<v>v<<<v<v<v>>vv^>>>^>v<<vv>>>v^v^v^^v^v>vv>><>vv<<^<^<>vvvv>^^>^<v^<<v<<v^^<^>v<<^^^><^v<^<>^>><^<>vv^>^<<^>>v^<<>v<>^v^v^^<^<>>^><>>^>>^><>v>vv^><^<<^>>><vvv^<^>^^><^^vv^<v<<>v^<^>>v>^<v>v^<v^^<<<v^>>^<<>>>^>v<vv<^vvv>><<><>^v><<^^>^>v^v>vv^vv^<>vvv^<^>^<v^><>v>^>>>v^><<v^>>vv^<v^v<<v<v>v^>^>^v^v^^vv>^v^<v^><<^>v^>v<><vv^^>v<^>^v>^v<><<>^>v^<^vvv><^^>v><^><^>>v>><<v><^^><<<<^^^<^>vv^v>v^<<<>>^v^v<>^<^<v^^^<^>><v^<<v^<^^^< | ||||
| v>v><>^^^><<^v^>v<<>^<<<<v>><<^>^vvv^><v<^<^<<v^v^vv^v^><>v>^^v^<^<^<v>v^><<>^>><^vvvv^^^^v^vvv^^>>^<vv^<^<v^<>^^<^<<^v>>>>v<vv^>^^>v<^><^v^^><^^^v>><>><vvv>v^<<v^vv>v<^><vv>v>v^<><>>v<^>^^v>v<v>><>v<v^^<>v>v>^v>^>^<<<^^vv<<<v^v<vv<><v>>>>v>v<>v<>>v><<><>^^>v<^v>v<^v<^^^^>^^^^v<>v^v^vv<^^^^>^^<^<<v<v>>>><^^>v<<^^^v^^^v^v>^><vv>^><<<v>^<<>v>v>v<^<>>^<<<v><^^<^^v><>^v>v^>v<v>v<v^><><<^v^v<<>^>v^v^<^v^v>v^v>>^v<^vv<^<v<v>>^vv^^^>^<^^^v^>^>>^vvv^^<vvv>vv^>^v<<<<v<v<v>v^^^vvv>^>^^^>v><vv<<<>>><><v>^>^vv>vv>^<v^>>^^<>v>v<<>^>^^v>><><>^>vv>>v>>v^<<>>^v<>vv<><><<>^v>>>^v><^<^>vv>^>><<>v>^^v>v>^>v>>v<<<^^><^v>v>><<^<<^v^>^>>v>^v>v<<><<^^v>><v<<^>v^^<v^^^^^>>>^v^<v^vvv^<<<>>>v<vv^v<^v^<^v^vvv^^<v>><<vv><<^>v<^<^vv<^>v>^v^^<<>v<<>v^<>v<^>>>vv>^vv>vv><<>^>>v<>v<v<>v<^>^<^^^v>>^>v<v^>^^>^^<>><^>^<v^><v>v<>>v^^^^>>v^v^v>v<vv^v><>v<v<^^^<^<v^^v^>vvvv>v^<>^v<v>v<v<v^>>v>v><>^><vvv>v>^^v><<>v^<<^>v><<<><<^>>v^>v>^>^v^<<<>>v^<<><^^vv>v>v^>v<^^v^<v^v>^>>>><<>v>^<>^vv^^>^>v<^v><>v<>>^v><v<>^<><v^>><>><><< | ||||
| ^^v^<v^><><<vv^v^>><^v<<<><>>^vv><v<^^<>><^>^^<^>>^v^>v><<v<^>>vv>>>^>^^^vv><>><^<>v>><>>^^^>><v^v<><v^^>^v><<^vv>>^v<^v>>^vvv^^<>v>>><>>^^<^vv><<<<^v<^v^<<>^<<<<><vvvv^v<<^v^<><^>>v^>>>v<^v^<>^<<v>>v<^<>v><>>v>vv^^<^<<^>>^vvv><<<^<^^v<>>v><<<<>>>v>v<<>>>>^^v>><>^^v>vvvv<><<vv^<^^^v<vv<<v^^^v<v>^<vv^<vv<<<v>><^vv>>><>^<<v>^^^^^v><vvv<<<v^vvv>^<><^v^>>>>^v<^v><><^<<<v<<vvv<^v^^<v^><v^><^>^^^<vv>>>^<>>>><<^<v>v>^>>><^<<>v<^<>>^<^v<v^><v>vvv^^v^vv><vv<>v^>^>vv>^<<^^><v>^vv>v<<>^>v<^v<^v<>^v>v>^>^<^^<v<>vvvv^<<^<<>vv^^>>><^v^v<^v<v>^v<<v<vv^<^vv>v<^>>>>><<<<<<^>><>^^^^^^<>v>v<^<^<<vv>v^^^<^v<>^v<>><^><>^<v<^<<<>><>v><>>v<><^><^^v<>^>>v>^<><vv^><vv><><^<>>^<^^^><^<^v<^<v<>vv<vv<>^v><^vv^<^><>vvv^<v>>^>vvv<^v<^v<^<^v<>^v><vv^<<>><><<>>v>^v<v>v<^>vv><v^>>v>>>^^^^v<vv<>vv^^>^^<>>^<^<^><>^v<<>^v^^v<v<^<<vvv<vvv>v<vv<<<^<<v^<>><><>^^><v<>^>>^^<><v>>^<<>vv<^v^^<<>^>v^><v^>^^>v>v<^^v<^^v><>^v<vv^>^><v<<<v<>^v>>^^v^^<>vvv^v^>^v^<><>vv^<^>^v>>^^<<^<>v>v<^^v<>v^^^<v<<^^>^>>>v<>^v><v>>vv^vv^v<v<v><^<< | ||||
| ^^<>vvv>v<vvv^<^<><vv<vv^>>^<v>>^>>v<^<v^<^>>v^vv^<^>^^>^vv>v>^^<><<<^^<>>><<<<><v^v><^>v>v^v>v<v^vv>^>vvv>>^>v>><<vv<v^<><v>^v<><^<vv<<>>>v<^<^<v^<v><<<v<<<vvv<<v>^<^>vv<^v<<^>><>v>v^>><v<vvv>>^<^v^>><>v^>v>vvv^>>>vv^v><<v<>><v<<^v>>^vv^<><<<<>^><^v<>^v^<^>^vv^vv<^><^<<^^>v<v^><>^>><^^<<^>>>v<>><>^<^^>vv^>^>vvv>v<<>>^v<vv>vv<<<^>v^^vv>>^<>vv^vv<<v^^<<<^<<<<>^>v<<v>>>v<>^<>>>^>v^^<<v^v<^^v^><<<<^vv<^<^<^>^>^>>v<^v^<<>>>^<vv<^>^v^><v^<<>><<><v^<^^<<vvvv>v^v^>>^vvv<<<><<<^<<^<^v^<v<v<>v><<vv^<v<v<<<><>>^^v>^<<^<>v<^<v>>^>v><><^<<<>vvv<v^v><<^<<^^>^<>^>v<<^v<v>v<<^^v<v><v^v>>vv>vv<>>>^v>^v<^^>v^><^<v^<<^<>>^v>>^<v<<>>><<^<>v<^^^>^^^v^^^vv>^<><^v<<<vvv<^>v^v^v^^>v^<>vvv<^<<vv<v<^vv^v<<<vvv^>><>^v<<>>>><<^>vv^v^<><^>><>^>>v<>v>^>>v>><vv^v><^<^>>v<<><>v>^<<>>vvvv>><<^^v<vv>v^<^<>v^v<>^><><<<^vv><v>v>^^><<^<^^>>^vv<^>>v^>>vv<>>>^>>^<<<>v<>v^<>^vv><<^>^^>><<^^v^v^>v>>>>><^v>v^^<vvv^><^>>>>^v>^>^<<^^v^<v<>^^<^v>^vvv<^^<<>^><^<^^^<>v^>^<^^<v><v>^><<v<^>^>>v<<v>>^v^>^<<vv><>^>^vv><<v><<>^<>vvv^>^ | ||||
| vv^^<v><<v>>v<>>^v^v>^^><<<<><>>><>>v^>>>>v^^<<<v>>^v>v^v<>><^v<>^^><>^<<^v>>>^^<^><^<<<<v^^>^<^vv<v<v>v^>>v<v<>v^^vvv<^>>>>vv>^vv>^v>>^^^^v^>^><^^v>v^>v<<<^^><^>v^<^v>>^<^vvv^<><^^v>><v<^<v^<<^vvv^^<>^<>>v^>v^<v^><<<>^^>vv^>>v^v^>^^v^<^^>>v>v><><><<v<^^v<^^<^^^>v<v^v><^><^v<v><^v^^<>^^v<vv^vv<<^>^^^>vvvvvv>^^><v>^v>>>>>v<v^>>vv>^^^<<<<>^><<<v^vv><^>v<^>><<v><>vv>^<v<^<<<><><v^<^<>^<<^>^^^v^vv<v>^^><><>vv>>v<<><>vv^^^>>>^>>>v>>vvv^<^^^<v^>vv>>^>>v^>v<v<>^vv^v>>^<v><vv^>>^<v>^><>><><<v<^v<v^<v><v>^<><><v^v>^<>v^><^^<^vv<v^v^^v><>vv<>v<^^v<<^<v^>^<^<>v^>vvv<<^v<>v^><^<>v^<>^<v<<<<v^>vvv>^v^<^^^^>^v<v^>^v>v>><v^v<><><<<v^<<<v^<>^>><><vv<>v>^vv<vv<^>>><v^vv>^vvv>^^<^v^<>v><vv<v^^v<>v>^v>>^v><vv^v<>><<<<>>v>^<vv>v^<<>><<^><><^v>><<^>v<v<^^vv<<>>v^<^>vv^^<^^>^><^><<v>v>^>>><v>^<>^<v>v^>^^<><v<^<^^^^><>><vv<>^><<<>>v<<v<<v^^v<<<^>vv><<>>>^<<v<<v^<v^<v<^<^^>>v<<<<>vv>^^^><<vv<^^v>^<^v^vv>>^^v>^>^>^^>^v><^><>^v^<<^<v<>vv<<v>v<>^<<^^^<<<v<>>^>^v><>v<^<<<<^>>^<<v<<>^^^^v<vvvvv<<^<<^>>v^<^v^><<^^> | ||||
| <^v^^<<>vvv^<^v<<><v<v^^^v^^>>v^^^^<v<>vv<^^vv>^^<v><<v^^^v^^v^<<>>v^^<<^v^<<^<<>><^>>^^>><^><^>vvvv<^>>>>v<v^^<v<<<vv^><v^^v><<>>vvvvv^v><>>^<^<^vv><v<^vvvv<<v<v^<<^v<^<v^v^><<>vvvv<^>^<^><^v^vv^v<^^>>vvv^v><>^>v^<v<^^<<v<<><^><^>^v^v^<^>>vv<^vv^><v>v>>><v<<>^<^^>^>>^<>^v<>^^v^^>>^^^^><>>^>>vv>^<^^<v<v<^<^^<<<^<^^><v^<>^><v>^v^<<>^^vv<v^^>v^v^^v<<<<<>^>v<<^<<vvv>>v>>v<vvvvvvv<>>v^>>>>v<v>^v^<^^><>v><vv<>v^>v^^<>vvv<v>^>^^^^<^<>^vv><^v<^>v^<v>^v^<<<^v><vv^>><^^>^><<v>>>vvvvvv>vv<>><^<^>^v><<>>v>>v><^>><<<^<v<<<<<v^v>><><^vv^vv<<<vv<<>>v>><^vvv^v>^>^v^^^vv><><^><^<<v<<^<>><>^<><vvv><^^><<<><^vv<<<>v<<^vv>^v^v<<^^^^>>^^>>>v<v>^>v<>^^<^>^>^v^v<^<v><^<v^<<<v<<^^^>>^<>v><^v>><v^>>^<v<vv<v><><<<v><^><v<v<<<<vv^<^><^^^v><v^v>v>^vv>^^v^>v<><vv^>v<v<<v>^<vvv<v^v<<<>v<>^>^>v<<v>v^vv^^^>v^<<v>>^<vv^^<^<^^v><^^vv><vv<<^>>v><><^v^vv<v^>vv><<vv<^>>v>^vv^^<>vv>v<<>v<v>^v^v^v><v><>><<^^<>>^^<v<>v<v<<v<><<><v^>v<^><v<<vv^^v>><v^<>v>>^>>>vv^><><<v<>^v><>^><^>vv^^>>v<v<<^^<<><<><>>><^>>><><v^v>v<vvv<v>v^ | ||||
| v>^<^<>^>>^^>^^v<^>^vv^v>v>v<^v>^<v<v^<v^v>>>^^><vv^<^<>vv<>><v^<<>>^<^^v>>>v^<<<^v^<v^<v><<^^^v>^v^<v^v<^v<vvvvv>^<^v^<<<^>^<<v>^<>><<^^<^vvv>v>^^^>><v<><<<<v^>v^^<<^^<<><>^^>^<vv>^^>^>><<vv^v^<><>^>v><^<^<^^v<>^>v><^^v<v>^<vv^<vv^>^<<<><^<>vv^<^<<v>v<<<<>><<^^^v><>v>^>^<<vv^<<><^>v<<<<vv<v>v><<v<<<>^^v>>><<<vv<<<<v>>vv>><v<>><^<>>v^>^v^v<>v<^<>v><<^<^^v>>><>^^^vvvvvv>v<>><<^v<v>><^v><>v<^v><<>v<^^<<v^^>vv^<v<^>>^^^v><<<^<^^vvv^<><<^v^v^<>^^<<<>v<^vv^^^<vv^v>^^<<v>^v^^^^^vvv<<<v^^<<<v^>>v^><^^^v<v>v^>v<vv><vvvv<>v>^vv^v<<v>v>>^v>^vvv^>>>>^>v>>^^vv>>v^v>v^^<<^<^^><^^v^<<>^vvv<^<><^<v>v^><>>vv><v<<>v^^<>vv^<><<<v<<>vv<><<<><<v<>><^>^<^<>>v<<v>vv<>vvv>>^v^v<<>^<^>^v<<^>>>^^>v^<v^v^v>^^<<v^>v<>^v^vvv<<>>>^vv<v><^<><^<<^<><<^vvv>>><v^v>><>>^<<><^<v>><vv<<^<^>v<>>^><>v<<v^><>^>^^>v<^<vv>^v<<<^<^>v^<<v<>^vv^<^^^v^<v<vv<vv<^>^v<^v>><^>vvv^^<<<^^<<<><>^vv^>^<^^^>v^v<>^>^><v>v^>>>><<>^>>>^<><vv<<^<>v>v^v<<<<<^v<^<<^v<v<>>vvvv<<<<<v<<v^^vv^>^<>v>^v^>^^>^><<v<^^><>><<^^^>vv<<^<^^<<>^<>^v>^v<v^v<< | ||||
| <vv>^<v>>>>><v^^>><<v>v^><^v^><<>^^><vv^^^><^^<^<>>^<v>vvv<>v<<><<^>vv^v^^vvv>v>>v<<<><>>v<<>v^^^<v>v>>v^<^^<>vv^<>v><v><^><><<v<^^<<>v<v^<vv<^v^>^^><^>^<v^^vv><<v<<<^^>^>^v<<v>><>^v>v><<<v>^>v^<><<<>^^><><v^v^v^v<v<^vv<<v<<>^<<v>vv<^<<^>>>v<v^>^^<^<v><^v><^v<<^^>>vvvv^v>>><^>>v^^^<>>>^^>>>>>^<>v>^v>vv><^><^v<<<v^^<<^>v^^v>><v<v^><>>^>^>^^>^vv<<>>>^^^v^^v^<vv^>>vv<vv^<><>v<>^^vv>^<vv^><<><<<<><>v>v>>>>^><>>>>vv><<^^>v^><^>v^^>>v><v^>v<>^<<^>>v<^<>^<><>><<>><vv>^<<^^^>v>^>>v<^v>^vv<<><v<>v><v<vvvv>vv<v>>v>^^>>v<v<v^<v<v>><>^v^<v><>>>^<^<^><v<>v>^<^<^<^^<<^^<^^^^^v>v^>^>^<^><^vv>vv><^<><<<<><><^^^^^><^><<>v><vv^>vv<^^<^vv>><^^v<<v^>^^<v<v<<<v^^v<^^v^v<^vv<v>^^<vv<<vv<vv<v>^<>^<v^v><vv<vvvv>^<<<<<><v>v>^v^v<^^v>v>v<<>>>>v<v<<><<^<>v>><^<^^>>><^v^^v^>>^vv>>^v^v^^<>^><v<><<<^>^>^><>^>>^v^^vv^^^^^<^vv^^^^v>>^<<^^<<^<v<>^v^^vv^^v<v<^<>v^<v<^<><<>>v>vv<><^>^v<<^^^^<<^vv^v^><>^v>v><v><v<<><^<<^<<v>v><>^v>>^><vvv<>vv><<>^>^^<>vv<>vv<><v<^<<^^>vv>vv^^<^v^v><<<<v^>v^>v^^<v^^>^>^>>>^><v^^><<<>^>vv< | ||||
| >><>><<^^v>v<v^><<<<^v><^^vv>^<>v^>>vvv^<^>vv<<^v<v^>v^<>^<v<v^v^<^<>>vvv<<<>v^vv^^><v><^^>^^vv^^^><v^>^>v<<vvvv>v^<<vv^><^v^^<<>^<v^<>>^vv^v^^<^^vv<v>v>^<^>>^^^v<>v^v>>^>^^^^><<<<^>>v<<><><>><^^<vv^v<>^<v<><v^<^^^v<<vvv<^^>>v>v<<v<<<<<v^>v<vv><<<vv><v^^<^<><>v^vv<^<<<^<^>>^>^<^<^vvv^v<<v<^<<<vv^>^^v^^<^^v>>v<^<>>v^^^v^>^<^v>>v^>><>vv^^<<v>>v>>v^vv^<>>^<^>^vv<^v^>v><^^^>^v<>^>>v<^<<>^vv>>>><>^<>>>^^vv>v^^^^<v<v>v^^^>>v^<>^><>v^^<v^>^>>>>^^<v>^^>v^><^>^v<v>^>>>>>v<^><v<^v^>>v<<<^^^>^>^>>^>>v^^>v<><<v<>><<><>v^><v^vv<><^v^><^v<>v^^<>^>>><v>>^><<v>^vv><<^v^vv>^<><^^vv^>><v>>v<v>^<>^v><><<^>v<^<>><^vv<v><v<>>><>v<<<^>>>^v<>><>^><>>^^<>^>^<^><v^<^^<^><>>v>>><<<^^<^<^><^>v>><^<v>><v>^>vvv>^^<>v<<v^>v>^^>v>^vv><<<^^^v^vv<v>>><<>>^v^v^^><>>>>v<v^v><v<v<<v<>>^v^^v^^^v^v^^^^>>^>v^^v>>>>>><<>v^v^>^>>^<^><^<^<>v><<<>^vv^^>^<v^<v^<><v<^<v<<<^v<>v<>^v^<v^><^>>vvv^<^<^v<^>>^>v<^^>>v^^vv>v<<v<>vv^<<<<v>><<>^><<^v<>><>v>v^<v<<<^^v<>><><^^<^v^^^<<^^^>v^>>vv<^^v<<<<<^><^v^<v^>^^vv>v<^v<vv>v>v><^<^^v>>><^ | ||||
| <v^v^v<v^<>>>^v>><><>^><^v>vv<^^^>^vv<v<<>^v>^>>^>>v>^>^^^^^v<<vv>^^^<^<>^>>v^>>^>v<<>^v>^<<v^v<^^v<v>>^v<v^v>v>>^>><><vvv<^^v>^<v>>><<><v^^>^>^>^^^^^><<<>>>vv>v<^v^v^^>v>^><<vvv<^<^><^^v^^^^>^^v<^^>>^v^v^^v<><<^v<^^v^><v>>v<<^^v<<>>^v<>^<>v^>^>^>v>>^v>v^v^<><vvv<>v>v<><>v^^v>>>v<^<<v<<v^^<v>>v><^<<<<<^<<v<^<^>v^v<^^>^v>>^v>vvv>>>>^^v<v^v<>><<>vv>^<><^vv^^>>>v^<v^>^v^^v<<v^<v^<v>^v^<<^vvvv<^v^<^>^<>vv>^^>vvvvvv^>><v><^v^^<v<<^<vvv<><^>^^<^<^<vvvv<^^vv>vv^>v^><<vv<<v^v^>v<v<<v>v>v^vv^v^<^^>v^<<<>v^>^><><<^v<<>v>>^<><^<^v^^>v^^^v^<<^<>>^^>^<<<^>v<>^^^vv>^>^vv^>^vv^><<^>^v^^v^>>^v<^v<>v<>^>v^<^<v><<<v>>v>^^v<^v<^^v^>v^>v<<^^<<^^vv^>>^<^v>^>>v^^v^v^^<<v>^vvv>^<vvv^^^>><v^>>>>v^^>v<v>vv^^v<v^^><^>>v<<<v^v>^v><^>>v^^^vvvv^<^><<^^<>^>>v<vv><^vv>>><v>^<>^v^^v<^>>v<><><>>v>v<^^<vv<<v^>>vv^<<^v>^v>^^v<>>><<vv><^<v<<vv<<>><><<>vvvvvv^<^v<vv<<<v><>vv<<<>^v<^<v<v^^>>vv>^<<v^<^vv<^>v^^^>^vv><<<v^^>^<>^vv^>^<v<<^>>^>^><^>v^v<<^<v<^v>>^<<>v<^^^^>^>^^>v>v<<v>^vv<vv<^^>^<>v<v<<<^<<<v>^><>><<<>>v>^v^v>v> | ||||
| >>>^vv<<^^>^>v>>>v>v>>^^><>v^><<>^<v^<^>^<><^vv^<>^<^^v>^<>^^^<><v^<^v^v>>v^v^<<<v<v<vvv^<>>^^^vv>>><<^<><<<^^^^<><v<<>>>^>^v^^^<>^>>^^>v>v>^<>><^^^<^^>v^v<^<>>><<v^vv^>^<>v^^<v^v^^^^><vv^<v<^<>v^><>vv<v>v<>^^><v>^^v^v^v><>>v>v<^>^><v<>^>>^v>>>>>v^^v>^>>v<<^vvv<^v>^^v<^>v>^v><<vv><v<<<^>^<>^v<v^<vvvv^^^^^^v>v<>>^v^^^^^^<^v^>^^^><><<<<v^^>v^^^<>>vvv<<<>v<>^^v<^<<>^^>^^v^<><^^<<v<>vv^>>^>>^>v^>>><v^vv<^^><>v>><<^<<v<>>^v^><^>v>>v^v<>>><v^>>v<><^>^^v><^^<>>>v<v<><>^^<>^><^>><v<<v<<v>^v<>^vv^>^<<><>>^v<>v<v^<>>v^v><^^<>^>v<>>><^>vv<^>vv<v^^<<^v^<v^v>^><v^^v><^v^<<<>^>v>><>v^v<^<>v<^^><>v><v>vv<v<<v<v^>v^<vv^>v^vv<><>^>^v^^<v<v<^v^<^<<^v^<><vv><>v>v^^<<>vv>><v><<vv<<^^>^<^^<>^^><>>v>>v<v<^>^<<<v<^<vv^<<vv^v<>v^><^><v^<vvv><vvvv<>>><v>>><<^v<^vv>v^<v>^<<<<^^>^>vv>^>>^<vv><>>^<v<vv^><<<<<^v<<^v^^v<^<^vv>^><^<<^><^^>><<>v<>v>^>v>>^<v^>v<<<>v<>>v<v<^><^^^^v<v><>v^v<<v>><^<><^<>^>^^>>>><>^<<>>^<v><>><^^<^^<<vvv^<<<<v>>^^v<<>^v>^<^^>v^vv>vv>><^<^>^^<<>>>v<<<>^>>^v<>^>v><vv^^v^<^>^<v>v><>^v^><<v^< | ||||
| ^>v>>>>>vv^^>^^^v>^^v<>v>v><^^v><><v<>v>><<v>>^>^>^^>><^>^>v><v>>v^>^>>>>v>^v>>^<<^<<>>><>><^^^>^v<v>>^>>>>vv>^><>>vv^<<<>^>^^><v><>^><<<<^v>>><v>v^<v^^>>vv<>>^v^<v^vv>v^<vv<>^>^<><>^<^<>v>>vv^v<^v^>v<>>v>><v^>^^>^^^v<><^>><vv^<<^>^^^^^>>^<<^v^^<>><^>^v<<^^>v<>^<^vvv<^^vv^v>vv>v>v<>v>^<v>>^vv<^>>^<><^^<>v^><^v<^^<^v>vv^v^>^^v><v^^v<^<v<^^^<>v^<><v<<<><^vv><^vvvv>v>>>^v>^<>^^^v^^>v^>v>>vv<<v<^v^v<vv><^^>><^v^>^>^<^><v^v>^^>^v^v<>>vv<vvv>><>^v>vvv><v<<>>vv<>>v>^<>vv>^v^^>>>>>><<v^^><><v^>><^>v>^^vv<<v<^<><>^v^>^<v>^vv^<^v^^>v^<vv^<v><>^>><>><vv^<v>>v^<>^>^v^v<>v>v<v^<^vv><<^v>>><>>^<^>>v^v^v^<^^<<^v<^<>^^>>^^vv<<<>^vvv<v^^<<v<>^^^<vvv<vv>vv>v<v><v^<<<vvv^<v^><>>v^>vv><<>>v^vv><^^>v^>v>v<^vvv<^v^>>>>>^>>>><v>><vv><v>^>>^v><^v^>><v><<^>>><>>vv<^>>^v^<>>^<<^<<v^<^<vv>vv<<vvvvv><^^<^>>v>vvv>^v>^<<v<^>^>>^>v<<vv<^<^>vv>>vvv^>v>><^>v^v>^vvv^v>><<<v^^^>^><>^><<^<^<><v^<v^>v^^<v^v>v>v^v<>><v<vv>^^<<><>v>v<<^>><v^<vvvvv<^>><v><vv><<<>^v^vv<>^<><<^^v<>><>>^<<>v<<<v^<>>v^>v<><^^v^<^v<v^v^<><<>^v>v> | ||||
| ^<vv><>^>vv^>vv^><^<<>^v<<v^v>v^^^v<>>v>>>><<<<v^<<v<^>^>v>v^>><<<v<<>^><v^<<<vv^<^^><><^^>^^><v<^v>^^v^>^<>vv<<<>>>^v^v>>v<^^>v^vv><^v>v><v^v<><^><^^v><^^>^>>^^>>^<<^^>v^<<<^<vvv^^vvv<>v^v^v>>>^><v>^<v^>^v>^v>v<><v^^<<^v^^<v<<<>>^<>^^^>>^^>vvv><>>^<><<<<v>v^^<^<<>v^v<^^><<^^<>^>v^<<<v>>>^>>^^>^<<<>vv^>^v<vv^<vv^<>vv<^>v^v^v>>^^^v<^>>v<>><>v><v<v>^v>^v<>^^<>>vvv><<<^^<>>v<<^v^<>^^v^^>^vv>^v^<<vvv^<<<>>^vv^^^v<<^^vv>^^v><^^^<v><<^^v>^<^<^^>v^v<^>v>><v>><>><v>>><^><vvv<v^v>v<v>^^v^^^v^^v>vv>^<><>^^<<^<vv><><v^<^<vvv^^<vv>^>vvv<v>>>>>>^>>>>><><<v^^^<^^^>><v^^>>^<^^<>vvvv><>^vv<><>><<>>v^<><>v^>>^<^>v<^><v^<>^>>v><<>><>>^^vvv><>vv>>^>^>>>v^^<<<>>v^v>^^v<>^v^<vvv><<<^^v<>>>>^v<v>^>^^v^v<>v>^v<><>v<v<>>vv<>^^^>^<v<vvv>^v<>^v^<<>v<<^v^^v><^>v>>>>v>^<<vvv><<^<v<<v^v^vv^v<<>><^v^v>>>v>^^^^v^^>^v^<<<^vv^<v<^v^>><^>v<<v><><>><vvvv<<vv^^<v<^v>^<>><v><v^>v<^v^v^^v^>^vvv^^<v<>>v^^vv<v^>><^<^>^<><<^<>>vv><>^><^v<<<<^^^v>><^>>^>><>v<>^v<vv^^><<><<v>v>^><vvv><vv><^>v>><vv>v<<<>>>>v<>vv><v<^<v<>>vvv^<vv | ||||
| <<^<<<^>^>>^^^>><^<^^<>v^>^<^vv<^<>vv<><><v^<>^>vvv^<<<v>^<><^<>><v<>^>^v^>v^^<<<<>^<<^v^<>vv^^v<>>v^<>^v^^^<^v^vvvv>vvvvv<^^^^v><>>^>^v^vv>>>^^<><^<>^v<<<>v<^v^v>><>><><>vv^>v^^^<v<v>^<^v^<>^<v<>vv>^^<^v><v<^<v>v<^^^>^><vv^<<v><<^>>v^^>><>v^vv><^<<><^><<^v><><v^<><v<>v>v>^>v<vvv>>>v<<><^^>^v<v>^<><>^>vv<<^>v>v^>v><^<v<<<<^^v>^v>^>>v^<v^<<<^<<^^^>^v<<v<^vv>>^><<>>><<<v>>>vv>>v><v>v>^^>>^>><>v>>^v<>>><><<<<>^>^>v<^<v>>v<v>v^<^<><<^<>>^^<^^v^vvv>>^v>v<^^>^v><<^v>^^^^^<v<>>v<v^^><^vvv^<>v>>^^>v^^v>v^^<<>vv^v>^^v<vvvv<>vvv>>vv>v>>^>>^^>v<>v^<<^>v^^><>v<><^>>^^v>^<^<>^<<v><>^^^^^v^>^<^^vv^v>>>>vvv^>v>vv^^^vv><v>vv<^^>v<>^v>>^^^v>^^^<>>v<^>^<<^>^>><>><^<>^^^vv^<^<^<<^>^<>><^vv<^<<><<<><^<>><^v^>>^v<^^><>v<^^^v^^>>^^vv>^<<vv>>>v>>>v^vvv>^^v^^>^>^^<>>>^<><>^^>^^v>^><^><v<>^>>^>>^<^>^<^<^vv>^>v><v^^>^>v<>>vv><<>><<><<>v<>>v><v>^v<^<<><^v<^^^><>v>>vv<^<<<^v^<vvvv^v<^<>^^^^vvv^<^^<>v<^^^>><^<v^><v^v<<^^><>^^^>^>^vv^^>>v>>^vv<<<v^v<vv><>vv^><<^v<v>^<v<>^^^<v<v^v<^>v^vv>v^vv><vv^v>>^^vvvvv>^<^vv><^ | ||||
| >^<v^v>v>>vv^^>v>^^^^<>v><<vv><<^^v<><<v^^^^>vv>>^>v^v<<^>vvv<<^v<>v><>^v<^vv>>^^>>v<>v>^^^<v<^>>><<^v^^<v^vv<<<^^>>>vv<vv<v>><>^>^<v<<><<vv<vv>vvv><v>^<vv<><^v><>v>^^v>v<vv><v^^v^<^<v<>vv>><<<><<^v><>^>^v>v^^>vv>vv<>v<<^<v^^^>^>>^^v<^^^><v><<v^<>><><vvvv^v^^v^^<^v^>><^>v^><^^<>v<^v<<>>><^<<<^^<^v>v^^<><v<^^<>vvv^><v^v<<><v><v>^<^<^<v<^><<<>>vv<^<vv<<v>vv^^<v^^<<>v^vvv><>v>>^<^v<v><<v<<v<^^vvv>>^<^<^>>^vv>^<>^^<^>v<v>^>v^><><>vv<<>v<^^<>^^><^^^v^vv><v^^^^><^>vv<^><^^v^>>>vv^^>>v>^vv<<<<v^<v^>>>vv^v>^><><>>>^^vv^v^>v<^v>^<<^>>vvvv<<v<^v<^<>^<^>><>>^>^>^>^<<v>v^>>v>^<v>^vv<^><^^v^<<><^v^^^>v^<<>v<vv<vv>v>><>v<^<v^>v<^v>^<<vv^>vvv<><<<^<>>v>^vv<^v>^v><>^<v^v<vvvv^<<^v^v<<^^v^^^>^<v^><^^<>^^<vvv^^^^>><^>>v<>^>v>^v^v^<^^^v<vv<v<><vv<<<vv>v>^><<>vv<<>v>^vv<><^<^^^>^>v^v>^v^<v>^v>^^<^^<>>^<>>><><<<^<<<vvv>^<^<<<^vvv^v<<>><v^v<>^>>^v<^v^v^vvv<v<><v>^<^v<<<^<>>^^>^>>^^>^>v^^<<vv<vv>><^vvv^<<<v>^<><v><<v><<^^<<>><<v^vvv>vv><>><<^<v><<^>>^^vv<vvvv>^>>>>vv<^<<<>v<<<>>>>vv>^^^>^<>>^^<v>v><><^><^>>> | ||||
| v><vv^><>>v<v^>^^vv<vv^^<vvvv^^^v^^^vv^><>>^^vv^>v^<>vvv>vv<>^v>>v<^<>>^v><^<<v<v>>v>v^<<>^<v>v>^^><^^>>vv<v>^v^<><^<>v<^><^v>vv<^vv^<<vv<<<<v<>v<>v^v^>>^>^<^>>^v<^v<v^<<<<>vv>><>vv>^<vvvv<<<<<^<^v<>v<^v<^><^^^>v^^>>><<<>><<v<<>>^vv^<>^<><v<^<v>^^v^^<<>^<^><v>v^^>v<v^vvv>v<<><<^<<<v<<^^><<v<>v<^v^<>v<>vvv<^^vv><<>><>v><>>^>>v<^vv^v<<^v^^>v>v><v^v>vv^^v>><<<^vvvv>^^^<v<<<<>^<<<><^<^>^v^<^v<<vv<<v<<>^<v^^>v^^><^<<^<v>^>v^vv<><^>^vv^v<<<>^vvv<<>>^vv^vvv<vv<^<^v>^^>><>v^^<^v^^^>^>v^<><><>>><v>^v>v^<>>>vv<><^>v>^v<<<^>v^<>><^v<>^><^^v><v^<vv><^^><>^^>vv^vv<<^<v^v<<v<>^v<^<v>^><>v^>v^<^^<^v>^^^>v^vv>^>v^<^^><^<<<>v>^><^>>vvv^^>>>>^>^<^><>^^v<<><v>v^>^<v^>^^<><vv>><>vv^^^v>>v^^v<v<v^<<><^v<<^^<<>v>v>>v<><>^>^^<v>^>vvv<><<>><<v<<<^>^<^v<<<^<>^^>>v^><v<<<<><<>>^^^^^^vvv<><<v<vvv>^^>^v>>>^^>>>^<<<>^vv<^><<<<>^v^>>>v<>>v>><<^<vv><^^<><><v><>^^<vv^<<vvvvvv>vv^^v^v<>>^v<<^v^^>^vv^v>vv<><vv^<v^^>v^^<<<>>vvv^><>v^<v>^<^><><>>v>^><v><^<^^>v>vv<^v^^>^>^v^^>v<vv>v><v^v>>>>vvv^^v^>v>>^^<<<v><<v>v>v<<>^^v | ||||
							
								
								
									
										141
									
								
								y2024/resources/16_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								y2024/resources/16_input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| ############################################################################################################################################# | ||||
| #.#...................#.........#...............#...#...........#...........#.....#.............#...............................#.#........E# | ||||
| #.#.#.###############.###.#####.###.###.#######.#.#.#####.#####.#######.#.#.#.###.#############.#.#####.#.#####.#####.#.#######.#.#.#.####### | ||||
| #...#.........#...#...#...#...#...#.#...#...#...#.#.....#.#...#...#.......#.#...#...#.........#.....#.#...#.....#...#.#...#.#...#...#...#...# | ||||
| #.###########.###.#.###.###.#####.###.###.#.#.###.###.#.#.#.#####.#.###.###.###.###.#.#######.#####.#.#####.#######.#.###.#.#.#########.#.#.# | ||||
| #...#.#.....#...#...#...#.#...........#...#.#.#...#.......#.....#.#.#.......#...#.....#.#...#...#.#...#...#.......#.#...#.#...#...#...#.#.#.# | ||||
| ###.#.#.#.#####.#.#####.#.#.#########.#.###.#.###.#.#.#####.#.###.#.#######.#.#########.#.#.###.#.###.#.#.#######.#.###.#.#.###.#.#.#.#.#.#.# | ||||
| #.#.#.#.#.......................#.....#...#.#.#...#.#...#.#.#.....#.#.....#...#...#.......#.....#.....#.#...............#.#...#.#.#.#...#.#.# | ||||
| #.#.#.#.#.#.#.#.###.#.###.###.#.###.#.###.#.#.#.###.#.#.#.#.#######.#.###.#####.#.#####.###########.#####.#.#####.###.#.#.###.#.#.#.#####.#.# | ||||
| #.#.#...#...#.#...#...#...#...#...#.#.....#.#.#...#.#...............#.#.#.......#.....#.#.#.......#.......#.#.....#...#.#...#...#.#.......#.# | ||||
| #.#.#########.###.#####.###.#####.###.#####.#.###.#.#.#.#####.#.###.#.#.#############.#.#.#.###.#.###########.#####.#.#.#.#.#####.#######.#.# | ||||
| #.#.......#.....#...#...#...#...#.....#.#...#...#.#.#.#.....#.#...#.#...#...#.......#.#.#...#...#.............#.....#.#.#.#.#...#...#...#.#.# | ||||
| #.#######.#.###.###.###.#.#####.#####.#.#.#####.#.###.#####.#.###.#####.#.#.#.#####.#.#.#####.#.#####.#########.#######.###.#.#.###.#.#.###.# | ||||
| #.....#.#...#.#...#...#.#.#.......#.....#.#.#...#...............................#...............#...#.#...#.....#.......#...#.#.....#.#.....# | ||||
| #.#.#.#.#####.###.###.###.###.###.#.#.###.#.#.#######.###.#.###.#.#.#.###.#.#####.###.#####.#.###.#.###.#.#.#.###.###.###.#######.###.#####.# | ||||
| #.#.#...........#...#.....#...#.....#.....#...#.............#.#.#...#.#.....#...#.#...#.......#...#.....#.#.#.#...#...#...#.....#.....#...#.# | ||||
| ###.#############.#.#######.#.#####.#.#######.#.#############.#.#.###.#.#####.#.#.#.###########.#########.#.###.###.#.###.#.###.#######.###.# | ||||
| #...#.......#.....#.#.......#.#...#.#.......#.#.#.......#.....#...#...#.......#.#.#.#.....#.....#.........#.#...#...#...#.....#...#.....#...# | ||||
| #.###.#####.#.#.###.#.###.#####.#.#########.#.#.###.#.###.#.#.###.#############.#.#.#.#.#.#.#####.#########.#.#####.###.#.#######.#.#####.### | ||||
| #...#...#.#...#.......#...#.....#.#...#.....#.#...#.#.#...#.......#...........#.#.#...#...#.....#.#.........#...#...#.#.#.#.....#.#.........# | ||||
| #.#.###.#.###############.#.#####.#.#.#.#####.###.###.#.###########.###.#####.#.#.#####.#.#####.#.#######.#.###.#.###.#.#.#.###.#.#.###.#.#.# | ||||
| #.#...#...........#.....#.#.#...#.#.#...#...#...#...#.#.#.....#...#.#.#.#.....#.....#...#.#.#...#...#...#.....#...#.#...#.#.#.#...#.#...#.#.# | ||||
| #.#.#.#.#######.###.###.###.#.#.#.#.#####.#####.#.#.#.#.#.###.###.#.#.#.#####.#####.#.###.#.#.#####.#.#.#####.#####.#.#####.#.#####.#.###.#.# | ||||
| #.#.#.........#.#...#.#.....#.....#...#.#.......#.#.#.#.#...#...#.#...#.....#.#.....#.#...#.#.#...#.....#.......#...#.#.....#...#...#.....#.# | ||||
| #.#.#.#########.#.###.#######.#######.#.#.#.#######.#.#.#.#.###.#.#.#.#####.###.#####.#.###.#.#.#.#####.#.#####.###.#.#.#######.#.#########.# | ||||
| #.#...#.........#.#...#.....#.........#.#...#.......#.#...#...#.#...#.#...#.....#...#.#.#...#.#.#...#...#.#.........#...#.......#...#.....#.# | ||||
| #.###.#.###.#####.#.#.#.#.#####.#.#####.###.#.#######.#####.#.#.#.###.#.#########.#.#.#.###.#.#.#####.###.#########.#######.#######.###.#.#.# | ||||
| #...#...#...#...#.#.#.#.#...#...#.#.#.....#.#.#...........#.#...#.#...#.....#...#.#.#.#.....#.#...#.....#...#.....#.#.......#.....#...#.#...# | ||||
| ###.#.###.#.#.#.#.###.#.###.#.###.#.#.#.###.#.###.#.#####.#.#####.#.###.#.#.#.#.#.###.#####.#.###.#.###.#.#.#.###.#.###.###.#.###.###.#.###.# | ||||
| #...#.....#...#.#...#.......#.....#...#.#.....#...#.#...#.#.#...#.#...#.#.#...#.#...#.....#.#.#.....#.....#...#...#...#.#...#.............#.# | ||||
| #.###.#####.###.###.#.#.###.#.#######.#.#.#####.#.###.#.#.#.#.#.#.###.#.#.#####.###.#####.#.#.#.###.#.#.#######.#####.#.#.#####.#.#.###.#.#.# | ||||
| #...#.....#...#.#...#...#...#.#.......#...#...#.#.#...#.#.#...#.....#.#.#.#.#...#...#...#.#.#.#...#.#.........#.#...#...#.#.#...#...#...#...# | ||||
| ###.#.###.#.#.###.#######.###.#.#####.#####.#.#.###.###.###.#.#####.#.###.#.#.#.#.#.#.#.#.#.#.#.#.#.#########.#.#.#.#####.#.#.#######.#.###.# | ||||
| #.#.......#.#.....#.....#.#...#.....#.......#.#...#.#.#.......#.....#.....#.#...#.#...#.#.#.#.#.#.#...#.#...#.#...#.........#.....#...#.....# | ||||
| #.###.#.###.#####.#.###.#.#.###.###.#########.#.#.#.#.#########.###########.###.#.#####.#.#.#.#.#.#.#.#.#.#.#.#######.#####.#####.###.#.#.#.# | ||||
| #.......#...#...#.#.#.#.#.#.#.#...#.....#.....#.#.#.#.......#.......#...........#.....#.#.#.#.#.#.#...#.#.#...#...#...#...#.....#...#.......# | ||||
| #.#.#.#.#.#.#.#.###.#.#.#.#.#.###.#.###.#.#######.#.#.#.###.#########.#########.#####.###.#.#.###.#.###.#.#######.#.###.#.#####.###.###.###.# | ||||
| #...#.#.#.....#.#...#.#.#.....#...#.#...#.#.#.........#.#.#.......#...#.......#.....#.#...#.#.....#...#...#.......#...#.#.........#.........# | ||||
| #.###.#.###.#.#.#.###.#.#.###.#.#####.#.#.#.#.#.#####.#.#.#.#.###.#.###.#####.#####.#.#.#######.#####.#.#.###.###.###.#.#####.###.#####.###.# | ||||
| #.#...#.#.....#...#...#.#.....#.#.....#.#.#...#.#.....#...#...#.#...#.#...#.#...#.....#.#.....#.......#.......#.....#.......#.#.......#.....# | ||||
| #.#.###.###.#.#####.#.#.#####.#.#.#####.#.###.#.#.#######.#####.#####.###.#.###.#####.#.#.###.#.#.###########.#####.#######.#.#########.###.# | ||||
| #.#...#.....#.....#.#.#.........#.#...#.#...#.#.#.......#.#.....#...........#.#.....#.#...#.#...#.......#...#.#.......#.....#...............# | ||||
| #####.###.#.#.###.###.#####.#.###.#.#.#.###.###.###.#####.#.###.#####.#.###.#.#####.#.#####.#.#######.#.#.#.###.#####.#################.##### | ||||
| #.......#...#.....#.....#.#.#...#.#.#.#...#...#.....#.....#...........#...#.#.....#.#...#...#.......#.#...#.#.......#.......#.......#.......# | ||||
| #.#######.#.#.#####.###.#.#.###.#.#.#####.###.#.#####.#####.#############.#.#.###.#.###.###.#.#####.#######.#.#########.#.#.#.#####.#.#.###.# | ||||
| #.........#...#.....#...#.#...#...#.....#.#.#.#...#.#.#.......#.....#.....#.#...#...........#...#...#.......#...#.......#.#.#...#.#.......#.# | ||||
| #.#######.###.#.#####.###.###.#######.###.#.#.###.#.#.###.###.#.###.###.#.#.###.#.#.#.#######.###.###.###.#####.#.#.#####.#.###.#.#########.# | ||||
| #.......#.#.....#...#.....#.#.........#...#.#...#...#...#...#.#...#...#...#.#...#.#.#.#.....#.#...#...#...#.....#.#.#.....#...#.#.....#...#.# | ||||
| #.###.#.#.#.#.#.#.#.#.###.#.#####.#.###.###.###.#######.#.#.#.#.#####.#####.###.#.#.###.###.#.#.#####.###.#.#####.###.#####.###.#.###.#.#.#.# | ||||
| #.....#.#.#.#.#.#.#.....#.#...#...#.#...#.....#...........#...#.#...#.#...#...#.#.......#.#...#.#...#...#...#...#.....#...#.......#...#.#...# | ||||
| #######.#.#.#.#.#.#####.#.#.#.#.#####.###.#.#############.#####.#.#.#.#.#.###.#.#.#######.#####.#.#.###.###.#.#.#########.#############.###.# | ||||
| #.#.....#.....#.#.#...#.#...#.#.......#...#.#.......#...........#.#...#.#.....................#...#...#...#...#.......#.....#...#...#...#.#.# | ||||
| #.#.#####.#####.#.###.#.#####.#########.#####.#####.#.###########.###.#.#########.#############.#####.###.###########.#.#.#.#.###.#.#.###.#.# | ||||
| #...#...........#.#...#.#.....#.#.....#.......#...#...#...#.....#.#.#.#...#...#...#...........#...#...#.....#.......#.#.#...#.#...#...#.....# | ||||
| #.###.###########.#.#.#.#.#####.#.#.###.#.#.###.#.#####.#.#.###.#.#.#.###.#.#.#.###.#########.#####.###.#####.#.#####.#.#.###.#.############# | ||||
| #.....#.......#.....#.#.#...#...#.#...#.#.......#.#.....#.#.....#.#...#...#.#.#...#.#.#.....#.....#.#.........#...#.....#...#.#.....#.......# | ||||
| #######.#######.#####.#.###.#.#.#.###.#.#######.#.#.#####.#.#.#.#.#####.###.#.###.#.#.#.###.#####.#.#.#.#########.#.#.#.###.#.#####.#.#####.# | ||||
| #.......#...#...#...#.#...#.#.#.#...#.....#.....#.#...#.#.#.#.#...#.....#.#.#...#.#.#...#...#.....#.#.........#...#.#...#.........#.....#...# | ||||
| ###.#.#.#.#.#.###.#.###.#.#.###.#.#########.#####.###.#.#.###.#.###.#####.#.###.#.#.#.###.#.#.#####.#########.#.###.#.###.###.#####.#####.### | ||||
| #...#.#...#.....#.#.....#.#...#...#...#.....#...#.#...#.......#.#...#.....#.#.#.#.#.#.#...#.#.#.......#...#...#...#...#.#.#...#...#...#...#.# | ||||
| #.###.#########.#.#######.###.#####.#.#.#####.#.#.#.#############.###.#.#.#.#.#.###.###.###.#.#.#####.#.###.#####.#####.#.###.#.#.###.#.###.# | ||||
| #.....#.#...#...#.....#.....#.......#...#.....#.....#.............#.....#.#.#...#...#...#...#.#...#.#.#.....#...#.#...#...#...#.#...#.#...#.# | ||||
| #.#####.#.#.#####.###.#.###.#############.#.###.###.#.#############.#.#.###.#.###.###.#####.#.###.#.#.#.#####.###.#.#.#.###.#.#.###.#.#.#.#.# | ||||
| #.......#.#.....#...#.#.....#.....#.....#.#.#...#...#...#...............#...#.....#.........#.#.....#.#.......#...#.#...#...#.#.#.#.#...#.#.# | ||||
| #########.#####.###.#.###.#####.#.###.#.#.#.#.###.#.###.###.###.#######.#.#########.#######.#.###.###.#######.#.###.#####.###.#.#.#.#.###.#.# | ||||
| #.....#...#.....#...#...#...#...#.....#.#.#.#...#.....#.....#.#.....#...#...#.#.......#.....#.......#.....#...........#...#...#.#.#.#.#...#.# | ||||
| #.###.#.#.#####.#.#.###.###.#.#.#####.###.#.#.#.#####.#######.#####.#.#####.#.#.#####.#.###########.#####.###########.###.#.###.#.#.###.###.# | ||||
| #.#.....#.#...#...#...#.......#.#.....#...#.#.#.....#.#.......#.....#.#...#.#.........#...........#.....#...........#.#...#...#.#.......#...# | ||||
| #.#######.#.#.#######.#.#####.###.#.###.###.###.#.###.###.###.#.#####.#.#.#.###.#####.#####.###########.#######.###.#.#.#.###.#.#########.#.# | ||||
| #...#.#...#.#.#.....#.#...#...#...#...#...#.....#.........#...#.#.....#.#...#...#.....#.....#.........#.....#...#...#.#.#.#...#.....#...#.#.# | ||||
| ###.#.#.###.#.#.###.#.###.###.#.#####.#.#.#.#######.#####.#####.#.#.###.###.#.#.#######.#####.#####.#######.#.#.#.###.#.#.#.#######.###.#.#.# | ||||
| #...#...#...#.#...#.#...#...#.#.....#.#...#...#...#.#...#.#.....#.#...#.#.#...#.......#...#...#...#.......#...#...#.#...#...#...#...#...#.#.# | ||||
| #.###.###.###.###.#.###.###.#.#####.#.#.###.###.#.###.#.###.#########.###.#.#.#######.###.#.###.#####.#.#.#########.#.#######.#.#.###.###.#.# | ||||
| #...#.#...#.#...#.#...#.#...#.#.#...#.#.#...#...#...........#.........#.....#...#.........#.#.......#...#.........#.#.#.......#.............# | ||||
| ###.#.#.###.###.###.###.#.###.#.#.###.#.###.#.###############.###.#####.#######.#.#####.#.#.#####.#.#.#.#.#######.#.#.#.###########.###.###.# | ||||
| #...#.#...........#.....#.#.....#...#...#...#.....#.....#...........#...#...#...#.....#.#.#.....#.#.#.#.#.#...#...#...#...........#...#...#.# | ||||
| #.#####.#.###.###.#.#####.#####.###.#####.#.#.#.#.###.#.#####.#####.#.###.#.#.#######.#.#######.#.#.#.#.###.#.###.###.###.#######.#.#.###.#.# | ||||
| #...#...#...#.#...#.#...........#.#.#.....#.#...#.#...#.....#.#...#...#...#.#.#.....#.#.......#.#.#.#.#.....#...#...#.....................#.# | ||||
| ###.#.###.###.#.###.#####.###.#.#.#.#####.#####.#.#.#######.###.#.#.###.###.#.#####.#.#######.#.#.#.#.#########.###.#######.#.#.###.#######.# | ||||
| #...#.#.#.#.......#.....#.........#.....#.......#...#.....#.....#.#.#...#.#...#.....#.#.....#...#.#.........#...#...#.....#.#.#...#.....#...# | ||||
| #.###.#.#.#.#####.#####.#.#######.#####.#.#.###.#####.#.#.#######.###.###.#####.###.#.#.#.#.###.#.#####.#####.###.###.###.#.#.###.#.#.###.### | ||||
| #.#...#...#.#...#.#.....#.#.#.........#.#.#.#...#.....#.#...#...#.....#.......#...#.#...#.#...#...#.....#...#.#.......#.#.#...#...#.#...#...# | ||||
| #.#.#######.#.#.#.#####.#.#.#.#########.#.#.#####.#####.#####.#.#######.#####.#.#.#######.###.###.#######.#.#.#.#######.#.#####.#####.#.#.#.# | ||||
| #...#.......#.#.#.#...#...#.....#.......#.#.........#.#.....#.#.......#.#...#...#.#.........#.#...#.....#.#...#.........#.......#.....#.....# | ||||
| #.###.#.#####.#.#.#.#.###.#####.#.#.#.###.#########.#.#.#.#.#.#.#####.#.#.#.###.#.#.#######.#.#####.###.#.#####.#.###############.###.#.#.### | ||||
| #.#...#.#...#.#.#...#.#...#...#...#.......#.......#...#...#.#.#.#...#...#.#.....#.......#.#.#...#...#.#.#.#.#...#.............#.......#.#...# | ||||
| #.#.#.#.#.#.#.#.#.###.#.###.#.#.#########.#.#####.#######.#.#.#.#.#.#######.#.#########.#.#.###.#.###.#.#.#.#.#########.#######.#####.#.#.#.# | ||||
| #.#.#.#.#.#.#.#...#...#.#.#.#...#.......#.#.#...#.#.....#.#.#.#.#.#.........#.......#.....#...#...#...#...#...#.......#...........#...#.#.#.# | ||||
| #.###.#.#.#.#.###.#.###.#.#.#####.#.###.#.#.#.###.#.###.###.#.#.#.#####.#.###.#####.#.#####.#.#####.#.#########.#####.###.#########.#.###.#.# | ||||
| #.....#.#.#...#.....#.#.#.#.#...#.#.#...#.#.#.....#.#.....#...#.#.....#.#.#.........#.#...#.#.........#.....#...#...#...#.#.#...#...#.....#.# | ||||
| #######.#.###########.#.#.#.#.###.#.#.#####.#.#####.#####.#####.#######.#.#.###########.#.#####.#####.###.#.#.#####.###.#.#.#.#.#.###.#.#.#.# | ||||
| #...#...#.......#.....#...#.#.....#.#.#.....#.....#...#.....#...#.......#.#.#...#.......#.......#...#.#...#...#.....#.#.#.#.#.#...#.....#...# | ||||
| #.#.#.#########.###.#.###.#.#####.#.#.###.#######.#.#.###.#.#.###.#########.#.###.#.#.#############.#.#.#.#######.#.#.#.#.#.#.#####.#.#.#.#.# | ||||
| #.#.#.....#...#...#.#...#.#.....#.#.#.....#.......#.#.....#...#.#.......#...#.....#.#.....#.#.......#...#...#.....#.#.#.#...#.....#.#.#...#.# | ||||
| #.#.#####.###.###.#.#.###.#####.###.#########.###########.#####.#.#####.#.#####.###.#.###.#.#.###.#########.#.#.###.#.#.###.#####.#.#.#.#.#.# | ||||
| #.#.....#.........#.#...#.....#...#.........#.#...........#.....#.#.#...#.#...#.#.#.#.#.....#...#...........#.#.#.#...#.#.#.#...#.....#...#.# | ||||
| #.#####.#####.#.#######.#####.###.#.#######.#.#.###.###########.#.#.#.###.#.#.#.#.#.#.#####.###.#####.#######.#.#.#.###.#.#.#.#.###.#.#.#.#.# | ||||
| #.#...#.....#.#.#.......#.....#...#.....#.#.#.#.#...#.#.......#.....#...#...#.....#.#...#.#.#.#.#...#...#.....#.#...#...#...#.#.#...#.....#.# | ||||
| #.#.#.#####.#.#.###.#####.#####.#######.#.#.#.###.###.#.###.#.#####.###.#####.#####.#.#.#.#.#.#.#.#.###.#.#####.#####.###.###.#.#.#.#.#.###.# | ||||
| #.#.#.....#.#.#...#.......#...#...#.....#.#.#.....#...#...#.#.......#.......#...#...#.#.#.....#...#...#.#...#...#...#.#.........#.#.........# | ||||
| #.#####.#.#.#.###.#########.#.###.#.#.###.#.#######.#.###.#.#######.#.###.#.###.#.###.#.#########.#####.#.###.###.#.#.###########.#.#.#.#.### | ||||
| #...#...#.#.#.#.#...#.....#.#...#...#.....#.#.......#.#...#...#.......#...#...#.#...#.#.#...#.....#.....#.#...#...#.#...........#.#...#.....# | ||||
| ###.#.#####.#.#.###.#.###.#.###.###.#####.#.###.###.###.#####.#########.#####.#.###.#.#.#.#.#.#####.###.#.#.###.###.###########.#.#########.# | ||||
| #...#.......#.....#...#.#...#.#...#.#.....#...#...#.....#...#.#.......#.#.....#.......#.....#.#...#.#...#.#...#.#.#.....#.....#.#...........# | ||||
| #.#####.#########.#####.#####.###.#.#########.###.#.#####.###.#.#####.#.#.#.#.#########.#.#.#.#.###.###.#.###.#.#.#####.#.#.###.#.#.###.#.### | ||||
| #.....#.....#...#...#.........#...#...........#.#.....#.....#...#.....#.#.#.............#.#...#...#...#.#.#.#.#.......#.#.#.....#...#...#.#.# | ||||
| #.###.#.#.###.#.###.#.#.###.#.#.###.#.#########.#####.#.###.#####.#####.#.#.#############.#######.###.#.#.#.#.###.#####.#.#########.#.###.#.# | ||||
| #.#...#...#...#.....#.#...#...#.#...#...#.........#...#...#.....#.......#.#.#.....#.....#...#.....#.#.....#.#...#.#.....#.........#...#.#.#.# | ||||
| #.#.###.###.#############.#.#.#.#.#####.#.#.#####.#.###########.###.#####.###.###.#.###.###.###.#.#.#.###.#.###.#.#.###.#########.###.#.#.#.# | ||||
| #.#.......#...#...........#...#.#.......#.#...#...#.#.........#.........#...#...#.#...#.....#...#...#.#...#...#...#.#.......#.....#...#.....# | ||||
| #.#####.#.###.#.#######.###.#.#.#######.#.###.###.#.#.#######.#.#######.#.#.#.#.#.###.#######.#####.#.#.###.#.#####.#######.#.#####.###.###.# | ||||
| #.#.....#...#.......#...#...#.#.....#...#.........#.#.#.....#.#.......#.#...#...#.#...#...#.......#.#.#.#.......#.........#.#...#...#.....#.# | ||||
| #.#.###.###.#####.#.#.###.#.#.#####.#.#.###.###.###.#.#.###.#.#.#####.#.#.#####.#.#.#####.#.#####.#.#.#.###.###.#.#######.#.###.#.###.#.#.### | ||||
| #.#.#.#...#.......#.#.#...#.#.......#.#...#.#.#.....#.#...#...#.....#.#.#...#...#.#.#...#.....#.#.#.#.#.....#.#.#.......#.#.#.#.#.#.....#...# | ||||
| #.#.#.#.#.###.###.###.#.###.###.#.#.#.###.#.#.###.###.###.###.#####.#.#####.#.###.#.#.#.#####.#.#.#.#.#######.#.#####.#.#.#.#.#.#.#.###.#.#.# | ||||
| #.#...#.....#.#...#...#.#.#.#.#.#.#.#.#.#...#.....#...#.#.....#.....#.....#...#.#...#.#.....#...#.#...........#.......#.#.#...#.#.#.#.#.....# | ||||
| #.#####.#.###.#####.#.#.#.#.#.#.#.#.#.#.#####.###.#.###.#####.#####.#####.#####.#####.#####.#####.#.###########.#######.#.###.#.#.#.#.#.#.#.# | ||||
| #.#.....#.#...#...#...#.#.#.#...#.#.#...#.....#...#.#.....#.#.....#.....#...#.........#...#...#...#.......#.........#...#.#...#.#.....#.#.#.# | ||||
| #.#.#####.#.###.#.#.#.#.#.#.###.#.#####.###.###.###.###.#.#.###.#.#.#####.#.#.#.#####.#.#.###.#.#.#######.#.#.#.#####.###.###.#.#######.#.#.# | ||||
| #...#.....#.....#...#...#.....#.#.#...#.....#.#.....#...#.#.#.....#.#...#.#...#.........#...#.#.#...#...#...#.#.#...#...#...#.#.#.......#...# | ||||
| #######.###########.#.#######.###.#.#.#######.#######.###.#.#.#######.#.#.#.###.#.###########.#.###.#.#.#####.###.#.###.###.#.#.#.#####.#.### | ||||
| #.....#.......#...#.#...#...#.....#.#...........#.....#.....#.........#...#.....#.........#...#...#.#.#.....#.....#.........#.#.#.#...#.....# | ||||
| #.###.#####.#.#.#.#.###.#.#.#####.#.#.#######.#.#.###.#.###.#############.###############.#.###.#.#.#####.#.#############.#.###.#.#.#.#.#.#.# | ||||
| #...#.#.....#.#.#.#...#...#.#.....#.#...............#.#.............#.....................#...#.#.....#...#.........#...#.#.#...#...#...#.#.# | ||||
| #.#.#.#.#.#.#.#.#.#######.#.#######.###############.#.#.###########.#######.#.###########.###.#.#.###.#.#.#####.###.###.#.###.###.#####.#.#.# | ||||
| #.#.#.#.#.....#.#...........#.......#.#.....#.....#.#.#.......#...........#.#.#.....#.......#.#.#.#...#.#...#...#.......#.#...#...........#.# | ||||
| ###.#.#.###.###.###.#.#######.#######.#.###.#.###.###.#.#.#.#.###.#######.#.#.#.###.#######.#.#.#.#.###.###.#.#.#.#######.#.###.#####.#####.# | ||||
| #...#.#.#.......#...#.........#.......#.#...#...#...#...#.#.#...#.#...#...#.#.#...#.......#...................#.#.#.......#...#.#...#.#...#.# | ||||
| #.###.###.#.###.#####.###########.#.###.#.###.#.###.###.#.#.###.###.#.#.###.#####.#######.###.###.#.#####.#####.#.#.#####.#.#.###.#.###.#.#.# | ||||
| #...#...#.....#.#.....#.........#.#.#...#.#...#...#.......#...#.....#.#...#.....#.....#.#...#...#.#...#...........#.....#.#.#...#.#.....#.#.# | ||||
| #.#.###.#.#.#.###.###.#.#######.#.###.###.#.#####.#####.#####.#######.###.###.#.#####.#.###.###.#.#.#.#############.###.#.#.###.#.#######.#.# | ||||
| #.#...#.#...#...#.#.#.........#.#.#...#...#.#.....#...#.#.....#...#...#...#...#...#...#...#.#...#...#.#...........#.#...#.....#.#.#.........# | ||||
| #.###.#.###.###.#.#.#.#####.#.#.#.#.###.#####.#####.#.###.#####.#.#.###.###.###.#.#.###.#.#.#.#####.#.#.#########.###.###.#.###.#.########### | ||||
| #...#.#.#.......#.#.#...#...#.#.#.#...#.......#...#.#...#.......#.#.#.......#...#.....................#...#.....#.#...#...#.....#...........# | ||||
| ###.#.#.#.#.#####.#.#.#.#.###.#.#.###.###.#####.#.#.###.#####.#####.#.#######.#.#.###.#.#.#.#.###.#.#.###.#####.#.#.#######.###########.###.# | ||||
| #.#.#.#...#.......#.....#.#...#.#...#...#.#.....#.#.#...#.....#.....#...#.......#.#...#.#.#.#...#.#...#.#.#...#.....#.....#...#.......#.#...# | ||||
| #.#.#.#####.#########.###.#.#.#.#.#####.###.#####.#.#.###.#####.#########.#####.#.#.###.#.#.###.#.#.###.#.#.#.#######.###.#.#.#.#####.###.### | ||||
| #...#.#.....#...#...#.#.....................#...#.#.#.#...#.......................................#.#...#...#.#...#...#.#.....#.#...#...#...# | ||||
| #.###.#.#####.#.#.#.#.#.###.#######.#.###.#.#.#.#.#.#.#.###.#####.#####.#.#.#.#.###.#.###.#######.#.#.#.#####.#.#.#.###.#####.#.#.#####.###.# | ||||
| #S..#.........#...#.....#...........#...#.....#.#...#.....#...........#.....#.#.......#...........#...#.....#...#...............#...........# | ||||
| ############################################################################################################################################# | ||||
							
								
								
									
										5
									
								
								y2024/resources/17_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								y2024/resources/17_input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| Register A: 55593699 | ||||
| Register B: 0 | ||||
| Register C: 0 | ||||
|  | ||||
| Program: 2,4,1,3,7,5,0,3,1,5,4,4,5,5,3,0 | ||||
							
								
								
									
										3450
									
								
								y2024/resources/18_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3450
									
								
								y2024/resources/18_input.txt
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										402
									
								
								y2024/resources/19_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										402
									
								
								y2024/resources/19_input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,402 @@ | ||||
| rbrr, gbgrgrg, rgurwgb, grb, ggg, grbugw, brwggrw, rbbrub, grguuu, uuub, uw, urug, bru, wwrrb, rbwbb, urw, uwuw, ubg, uugug, wbub, guubr, rru, gwb, wggrg, gubbwww, wrr, wbw, grug, brrr, rgw, urg, gugg, rugwuwb, rwu, rgu, bbu, ubb, gr, wwwggw, ub, uggrb, bbwrru, wuwrww, gbrbwru, uubu, bub, uguub, b, uwgu, brggrr, rruuggrr, buuu, brbgw, wbugb, rbwru, wrgu, bbg, uwbg, ruwg, bgugub, urwrrb, bggugw, bg, rgrrb, guwwu, gbbr, rwb, urrgu, brw, gbrwg, gbgwwrb, grgb, ggug, ugw, wbwwbug, wrbru, uwww, wwuw, wubg, burubw, gwr, wwubu, ubggrr, uru, www, wwr, uwbw, ww, rbbrwbr, rrwgru, gwuwgug, wubwww, gwbbwwb, bwu, ubr, rrguwr, bu, g, wrwbr, ggwb, wbr, uubwbrrg, gubrurwu, ugbg, wrurwbwr, buu, wuwbgrbw, ruw, wwgrw, bbbr, wbg, grrrrbu, wguuggwb, wrrwr, rbrru, bur, wurgwbgw, wgr, burggw, grugug, uugbrg, bgurgrr, urbw, gurur, wggb, rrub, uwgwg, grrug, uuu, gurg, ugugg, rurb, bbb, rrggwwb, brwbb, rrbub, ugb, wwbgg, gbguw, wgwgbb, wgw, brrw, ugbwrg, wgub, uub, bwgrugwb, guwgg, gurw, rrruwr, wgg, bgw, wrub, bubrw, uwrbb, uubugbwg, bwr, ugg, gwrbg, gbg, rbuwr, gububbu, bbw, wggw, rwrww, bbggbr, urgburg, rwbgr, rgr, wbugu, uug, uwg, ubgruurb, r, uu, rrw, uuwgu, gbu, urb, ugwg, bgrgrrg, rub, wubgwbg, brgubr, uuuburb, rbrwgr, wgwur, wbu, buurrgw, uwu, wbgb, rgru, wgggg, gubbr, uubwwg, uurbbggg, bgrwg, wggburr, ubwrg, wu, urbu, wbwrur, urgu, bggub, gbuwbb, uruu, gwwggwu, wugubrbr, bgrb, rgrbrb, guw, brr, rbguu, bgb, rug, gbur, gbb, rbrwbbb, ruuw, wrug, bbrwbgu, wwuwwbr, bgugur, rgg, brbw, wru, burrg, gu, ggwuww, wuw, uurg, wuwwbrwr, bbgbr, wb, ug, rrru, gwbg, ubwrug, rgur, rwg, ggrr, rgbub, uwubub, rwugg, wgbw, wburr, rgbu, ugr, ggwwb, gg, bbrbwgrw, gwu, brgwrwb, bguw, bbwwurr, ruu, ggbbu, ggr, bgwbgr, gru, gguuw, rbg, urbb, grw, wrwubbg, wbuu, ubwuw, gug, rbbr, wwb, buw, gw, buuw, wurgbuu, u, uuw, rwbw, wbbguw, bww, urguuwr, buwb, rugguggb, wwub, wrgubb, wrbr, gubbrw, guugr, ubbu, rwwbrb, bw, uwur, uugugw, bb, grr, wwuu, grrggg, rur, burugrr, ggb, rr, grg, brgw, wbwgu, uruwb, wuu, bwwgwrb, urgg, rrwuru, wurbur, uwb, bwrb, wur, ruwbwug, gb, bbr, uuwguu, ggwgwggw, bgurbb, wrw, rrbu, ubu, wbrgr, ruug, rbrg, rbr, bubwb, wbwgbwb, urugww, wrgbw, wgb, grub, gwrbuu, rbb, rrb, wbb, gguw, ggurrwg, bgwg, uuurw, wrwuww, brg, gbuub, uuur, rwrwu, wgu, rrrw, rbw, bwrbr, gwrgwu, ubbruu, rurrbrg, wwbwb, ubrg, wbbb, brb, rgwgr, gwg, brrgb, rwub, guwburb, buwgbru, ugbug, bwb, wgbwuu, wrbg, rrwugb, guuub, burw, brgwbwb, ubrub, ggbb, wggww, buwwwwuw, gur, ugu, guu, gwrbbrug, wbggu, gbgbuu, gbr, ggub, bbwg, ugwuur, grgr, ubguu, urgw, ru, bgg, wwu, buggg, gbuu, uuwu, rrww, ugrw, urr, rbu, bbugb, rgb, uwrbbu, wrwguu, rw, wwwu, gbbbuguw, wbrwwg, gbbrwrwr, wugw, rrbb, wurg, wgbubg, wug, wwwwg, br, rwbg, ur, rrrggg, gbw, ggu, bwrwb, rrr, rguuww, wuwbgww, bug, wgwru, wgbggw, uww, bwg, ggw, ubw, rrg, wg, uur, uwr, wrb, bwurbg, ugur, rb, gww, ubuu, burr, ggwg, rwr, gwuww, bgbwu, gub, bgu, wwgr, wwgb, bbrug | ||||
|  | ||||
| wwugguwgrwwbrwubrwrwburubgrwubbbrugbggwrbwrwwrgggg | ||||
| brwwgggrrubuwubbgbgruwgwguguwgwwugrgbwbgrbbwwuwwruug | ||||
| gruurgurbugwgwbwuwubrggrgbgguurgrugbuubwgwrguwggwburrrgu | ||||
| ugbrrgrwgbuggrrwuwwwbwugwwgbbrbuugbwbwbrrggwgruurrguuguw | ||||
| grgggbwuuggwbbugrburbbbbbbbgwubbruuggubbgrggurg | ||||
| wrggrurwbubuwwbrbrrurgrrrbuggwgbbgbbwgbwbbrgugruug | ||||
| ugrrrrwggbbuuubrbggrgurggruurgrburbrgubrwrwgbwwwuugbwwuw | ||||
| ggwrrwwrbbrrbwrgrwuurrbbwubgugruurbrggrrbr | ||||
| rrurruguurburuwubwugurrrwgwgubbbwuurbggrwruuwg | ||||
| gwbgrrggwbgbwrgwurbubgrwubwrgbugurbrbbrbrb | ||||
| rwburrrbrwggbgwbruuwrwrrurwwuwwbugguwwrurwbwrrbu | ||||
| uwruuuuwrwrwrrgurrubuwgwgrwbwuubgrwrbugubbbbuwbr | ||||
| rwwggwwurwwrrrbwrwwwugbrggruwgruggwbwwgguuuuwurbrgbu | ||||
| rwgbgwbgburuwubrbgrwrwubrrbrgubbwrgwbrbrugbbubbwurgu | ||||
| ugbbbubgbbuwbwrwgbgbggurbggrwbgubbwuwbbrwgrubbg | ||||
| wwbwbrggbrburubwgrwgbgrgwuruwrwwrgubwgurrbwrrwurwuurgggwgg | ||||
| wuwgbwrbbgguwgwurgwbrgbwguwrbwuugubuubuuwgbwrr | ||||
| ruuwuugwuuggbbwbuurguuwwgbwbgbgwbwwgwwuugugbbwwwruwuubrrgw | ||||
| wwbgrburbbwurgruwugbrgggrgwwggbbgwgurbbgubugbgwubwg | ||||
| wrggbbruuwrrbgrbwbuuubrruwgrwrrrgrwgwbbw | ||||
| rgbugwrgwwurbgwubwruwwbrwggbwruubwbbrrwubrgwurrrrugbgg | ||||
| buurwgrwgwbbugwgbuwbwurbwbggrugbbbwwbwrbwgrwurwubrgbrbbgu | ||||
| rwwururugbgubrwubrrggbwwbgbrgrrbbuurbugwbgwuurgbuubrgu | ||||
| bwgwruwwrbwgrgggrgwbruguwrubbrrgugbrbruwbug | ||||
| bwwrurburbbwbuubrrwwuwubwrburrwuggrbbuwwggb | ||||
| gbwuuuruuwguuwwbuwguuuuwgwuuugubbggrbuuuwb | ||||
| uuwrwrwwbrubgbrrwbrbuuuwrrggbrrgwuugbuurrbbu | ||||
| wubggwugrugbubgrbwwgbburbuuuwwbbwuuguggruugbuwwwbwrwbww | ||||
| gggwbuwrugwruurgubrugrrrubbwwguwurbwbrgbwgwwgug | ||||
| wrgguwwbbgbggubbuugbgrrbrurwuguwguuggwbwwrggww | ||||
| ubrruwrbuuggwuuwbrwgbguurbwbbgrrwurbbbgrwbubgwubgbrwgbbrb | ||||
| ugrgrwbrgwgwrrwbrwwugrruwrgrgwrurbbgurrbwwrruruwbbbrbrugu | ||||
| wbrgrubuugggruwwrwbuwgwgurugurbbgwwuggbwgrugwubr | ||||
| uugwugbububwrrgwwrrguruwwgwgbgugwgbrrwgrubbrwrrrbgwr | ||||
| rgwuugbwbwurggurrbrbuwggwwbbgwrbbrugwbggwggwuurg | ||||
| wgrrrurwgrgbwuwrggrbbgwgurugruwwugbuuruurub | ||||
| buwgubbgbwwgbwwrrggwwrrbwgwwgrugbbguwwwwgbwuwuuuururgur | ||||
| rburrbgwwwwgrrurbruwwbwbbwrwgubguwbbubwbgguruggruuugubbwu | ||||
| grbgurbbgguubrrwbrwwgrwrwwubbubbbugwwgurwgwgrbwww | ||||
| wrgbggrgrwggwuuwbrgwurgurrbwbbwrbgwuurwgrgw | ||||
| gbwwubwgrwuguwggbgrgrwwgugbuuwbuuwruwwgbbb | ||||
| ugrwwrrgwrguwgbbrbguugbbgbgbbbggbrubbbbrbguwwgu | ||||
| guggrgugguuubwwgruwwuggbugwbwwwururgbwwwrggrgbugubgubg | ||||
| rrgwrbggggbgwgggubrugrrbgrwwwuggbwwrgurwwuubgwrww | ||||
| bgbuuwgwgrgwwggrggrbwurguuururwrbbwuuwbwgugbbgwr | ||||
| bgbbrbgbrugrggrbwgurbgwwbbrurguwrbrwwwwwbbggrwbgrwwwbw | ||||
| ruwbbgburgrbrbwrrbwwwuwggguruubbbrugbgbbrurbugrubgwgur | ||||
| ubrgguggrwgrbrgrrbwrrrgrgbrruwgwrurugbgubb | ||||
| wuggrwwgrgwwwbgwwuubrggwuuwbubgbrgbuwurubbwbuwwbw | ||||
| grwbwruuggubgurrbrrwguggbwrubwwuuubbbgggwururw | ||||
| guurbugubbwbgrruggubbgrurgggwugugrrubgbruububgubgubu | ||||
| uubwwbgrurgrrurwbgwgwurguuuwguuwbwbuurbrgrgbuubgwbwbbgbbw | ||||
| wrggguwwwwrgbbgrwrbwbgbbuguurrgbbubwbbwrbgwuwwruubrwrrgbgu | ||||
| wgwugwwrrurbgwwrgbggbgbwgbbgrgrbuwgwrwrrurw | ||||
| bbbwbbgwgurrgbuugwbbrubrgrrggurwgguwruwruggrwwrgrrgbugrub | ||||
| bbwbrbrwrwbgurgrrwrrwbbrwrwgruugwbwrwurbwbwug | ||||
| wwgwrrrgbbgguwguuggwbrruubgwrwuuuwrgbrburbu | ||||
| urgwwgwbwbgrguwguubggwuwrbuugggbwuburubbuburrgbuwb | ||||
| wrgbbwuruubwuuguubwuguwwgbuurgrgwguwbrbwwrgrggugbbbb | ||||
| uuuubuuguubugbruwwwbrbrbgrrwwurwrruwwbuuwwrbbgrurbubbubrb | ||||
| bgwurgbwrbwurgwbgwburgubuuubbbwbwwwuuwrgwugg | ||||
| wrggwubugrugugubbguwgwbrwruurrggwuwwrbbgbbbrgbb | ||||
| wruwwgbbrrgwrgrggbrugrwwwbrbwubuggugwbwuggbrwgburbwbbwubbg | ||||
| ugwuuugbwwwrurrgubbbwguurbwgwbrgrwbwugugubbug | ||||
| wrgrubuuwrgrbwbuuubgrbubbrbgrurbuuwggbgrwwgwwbwr | ||||
| uururwwbrgwwrwggwbwrrrrgbbbuugbguwuwwggrgug | ||||
| ugrwbwwrgbrbwwuuwuuurbgruwgrugbrrrbguuwubbub | ||||
| wwwbrruggbuwwgbubwggrrgugruuurrurrwgwrguwwwrrgubugww | ||||
| wrgrrgbrbggbwbubrwbrwrwbbgbwuwgbbwggwrrubgurbugguwuwuw | ||||
| grrwbggrwbuugrggwubrbguuwrurbuuwbggbgugburbrrbuwwrrggggwwu | ||||
| uubrruwgwuwbggbbuurwubwgburbuuwugbwuwurrwbrbgrbbr | ||||
| rubuubuwuuburbbbwgbrrguwgrbbrwwgbugrubbruwgrgbgrbw | ||||
| rwwwbwwguwrurbubwrurrbuurbwrubuwruggbguubgwrbugguuubrgrg | ||||
| buwuwruubbrrrwbbuwbbugrwbguuwrubwrbwwrrgugwuur | ||||
| wrrbuwuwwgwrgwgrruwrwbbwbwwruuwwuugbgrggubbbwwgb | ||||
| guwbwrwuruwrgwuguguwbuwurruwbuggwuwrwwubugb | ||||
| bgbuwwgrrwwuwrbgrgbwbrggubwwbggwwbbwwurgbuubrrwwrburwgrbb | ||||
| wwwgbrbwrwrurrgrbgwbbgrbuwwbbugwwwuwwrurbu | ||||
| wrgbrurguwgrruuggrrugurwuurrubuuguwgugurwgbrruburuu | ||||
| wuwurubwugubrbrbwgrwbuugwbbbrwggrbwwguwwrbrbr | ||||
| wrgwrggbwbwbwubrbgruurbbgggububbbgbburgurrgruwb | ||||
| bggwbbrwbgugbgrwwgbbrruuguuuruuuwgrrrrgwbr | ||||
| wrgwwrgrgbwugbgwgbgbbgrgbuwwwwuwwbubbbwg | ||||
| gggbrrgwbwbuwbrbbbrbbwuubrrwuuggurwggwrwbwbu | ||||
| rbugwwuwrbwbguwbgbgrwbwbbggwruwbuwrwwubrgbbrwurwwwb | ||||
| bwwwbuggbuurbbuwrwwrbgubwbuurbrbubwgwgugrwuwgburwbbwwbrg | ||||
| wrggrgwgbgrwubgbwgrugwbuggggurrrwbrgwwwgwwggwgu | ||||
| ggburrrgubrrgwgwgbrwugwgwgrwbbbuguwbgbrwbuuurwrbr | ||||
| urrgbwwuubwwubuurrbwwgubuuggrguwwwgbwwuguwgbugb | ||||
| buugbwgwrurbbugbrugggwrbrwwruurgurwrburgrguur | ||||
| bwugruuggubrbuuwurbbwbbruggrwwbrruugrwrguw | ||||
| wrgwubgubbuwubwruuruuuwwrurrbgrrbruuurgrbrwugbbuggww | ||||
| ugubburbrggubgrwgwguburwwburbubbrubrwrbuwb | ||||
| wrgguwubbrrwbrwuwwbrwruubwgwwwrwwgbrrwguubbwwwugugwr | ||||
| wgwuwwgrwrubrgwrgubrggggwuwrgrwwbwwbggrgbuwu | ||||
| grwbwgubgwrggwrbgrwbuugrgrburbuubbgrwwwbwgb | ||||
| bwwwbbrbwwurruuwwggrwbggrgguwrubbwbgbbgugubwbbuug | ||||
| bbggwubbgwwrbburwwwgwrbwrbgrbubbwrrrgbgbruu | ||||
| wrgwurrubgguggwgrrbugbbwbrbuurgbbrwrwrwgugwubbbubu | ||||
| wrggggwrbbrugbrubguwuggubwggugrbuurwubgbuwubwgwgugugwubwbrwu | ||||
| bwwugbwbgrrbgrrbbrbgggbwwwwggbbrbwwbbbuwgguugubrububgwwu | ||||
| ugurgbgruurwbwgrruuwwbgbrrbbbggggurruruwrubbbuu | ||||
| uwrugrrgrwbrgubrwwuwwgwgrbbgrbgbrwwuwubuwr | ||||
| ggbgwbrwuwgruwrwgrrrrwugwgbrbbuwuwwbuubwgw | ||||
| wrrrgguurbgubbgbguwruugwrbrgwbgwrrbbuwugbbrwgrbbugrgbbgwuu | ||||
| urguruuggubbwurrubuurgbgbrbgugwwrrggwwwugugg | ||||
| gugbggubuwubrgubwuwrwbgbrgbguggwrbrrgwguugu | ||||
| buwurubbbwurgrubgwgggrruwrrbbrbugggggwbwwgwwb | ||||
| wrwbbuburwrrwwururbrwgbbrbgwbbrrrbubbgrgbuggwrw | ||||
| ugubruguuwrgwububrbgrbwgbwburwgurwbuwwubuwu | ||||
| gwrgugrbgbubbwubgbrwbuwggugwurrburgwrwrugubwggwuu | ||||
| rgbrgrbggwbwuubburrurggwggguurwuwwwrwuwurbrggrgbuwrgbgwbgb | ||||
| wrggrwwbrrurbbuuwburubgruurbrgwrwgrrgrbguguuubwug | ||||
| rguwwuuwgwwubwbggbugwgrrwgbrgbgurbwgrgugurrgguggrrbuuu | ||||
| ruwubrwugurgrbruruggwbugbgrurwuuwbwrwugwgrr | ||||
| wrgbrrbgubgbgwrbwgwubuggurguburgwrruruur | ||||
| uburbrrbgbrrruwruwgwrrgrgurgrruugrruwuuugbuwburwubbrbbgw | ||||
| wrbwuggbuuwwwuuwbwuuwgwbuubuwgrggrrbgbuwgubrruuggrrruuuwub | ||||
| rwwgbrrurubuwrgwgrbgbrrbbbwbbbwrugwbubugwuwgwugwwurwgrbr | ||||
| wrrgwrggrbuuruggggwrguwbwgrubgwbguuggbgrwrgubrurwuggrwgwrb | ||||
| wwrggguurbuwbwurwwbbwwbrggwggbrbbrgugurbrbwwwrbrrggbbb | ||||
| ubbrrbbwwrugugwrggwuwwuruwuwbwguwgggwwbwrbgbwuugruw | ||||
| rggbrwgbbgwrwwrrbgwbuwwbrbrbururwgbugwwbrguuruwrbbbbwrwgu | ||||
| rguwbuwgwrrbgwbwwwuwrrbrwwwburrbbwbruwggugubbu | ||||
| rgwbgwwbugbgwruugwwrugwrrbuwgrbbwbuwubguubwbugugrwu | ||||
| ubwwgrurugbrbrgwrbgrbwruwrbwwbugrwgwrwubrgbwwrurb | ||||
| rurugbugrwuwbgrbwgbbrguwgbgugwgurbbrbuuurbwuuwwgbgg | ||||
| rruubwwwuwrrwgwugwrbgwbuugbrbwugrwwuwurguw | ||||
| wrgwwrgugrbrruurwuwgbwguwurrubwbbwurwwrgruwbgbwwrwu | ||||
| bgruuwgwrgwugrrguwugwbrbgbbbgguurwrbubgwrr | ||||
| gwrgrwurbruwgburrruuggbuwbgbwggwgurubwgurrbwuwb | ||||
| bwbugugubgubrwubrbgruwrubbrurggbgrrgubrrbuurwrrubbwurbbb | ||||
| bggwwgrbburbbubbuuburuguwubrubgbrubrrrgwwbgrrggrgggwrrgrg | ||||
| rrrgbgwbgrwuwgubbwbwgubbrgwwbwburbwguuruwwwrbrb | ||||
| wrgwbbugggruwgbwrggbbburbrgbwuuwurbugggbuggrwrbw | ||||
| wgurbubuuwrwubrrgrrbrbwrwurwbrbgrggguggwubgrgbr | ||||
| rubgwgbwbrubrbbrwwbbrrugrbbrrwuugggggwrwugbbbrb | ||||
| wrwwubrbguubrggurwrburgggruwubggwgwbrgrggrggwuubwggubgggww | ||||
| wrgwbgbrgugggburuguuwgrrrbrgrwbgubruwrwugbggubuwbbbbwwwbw | ||||
| wrgrwggbwwrgbwubrubbwbbuuggrbbugrrrbguwbrub | ||||
| grbrwgbugbgwgwbwubbuurgrgbbggwgbgbwwwrurguuubgbrwugb | ||||
| urwbbbuggwugrgggurbuwgrrwwbuubwubugbgburgwgbubwuurwuwbuw | ||||
| wwgubbuwubrgrgwguwbgrurbgwwuwbgwwgbuuuwwwwggwgrrwwwwrbrbuw | ||||
| wurwrbgrubrrbguwwwgrggwwgrgbbbbuburgruwugwrbr | ||||
| gbwgbrbrrrggrurrbrrwwrrbwwgubgwwuruwurgrrbbrwb | ||||
| gubuwgggwgwwwwuwgggwgwwugrwbggbbwbwrrwugrwuurggwbgbgrwruug | ||||
| uwrugrgbburwwbugrbwwwbbgurruwbburgrwwwgrwrwrggg | ||||
| brbgrggwububuugrwgubwubbbwwgggrgurrwwggbburgbuugw | ||||
| ggwwbgugwwggrrububbgrrrrwwbwwuuurbuuubbgwbwu | ||||
| bgruubgwurbuwrrggugwwbwrbwbgwrwugugbrwwwbburugbbguur | ||||
| bbbrggbgrrbrubugbrguwrrrruwbuwbgugwubgrugrwruugwgbuw | ||||
| wuurgrrwurwggwwguguwwurwwugguuguubbuuruwubg | ||||
| bbuuwrbwwwgggrgrrrrbgwwbwurrurubgubwburgbggrwrubgwbrw | ||||
| rwuwwbrguggwuwrruwurubguubgwburrwgugrwubwwbwgwwbbbrgrbb | ||||
| gguuggrrggbwbubgrbrrwbbubuwbrwrwgbuggbbbuuuuuwrgrrgw | ||||
| bubbrwwgbwrwwggubgwwwubgbrwubuuruuwuwgwwgruggbw | ||||
| wubburwgbbgruuubwggwurwrubwuwbrgbuuwbbguwwgrwbugbwrrgubrg | ||||
| rbwrruguuuwwbrwwwbwrwrbubwuggwurrbugwubuggrbubwrubwbwu | ||||
| uggubuwbuurrbgrugwwubwubrrburubbbgbugubrwwbuwrbu | ||||
| ubbgbbgrbuguwwbgrwwwgwubuguubruugbguuuwbrrg | ||||
| rugbbrguuruuruwgbuwrwbbubgrrbrwwbwugrwugbwuuwbwwbbwuwrg | ||||
| gbubbuubburgrbbrgubggrbbwwuwwbbrurguubgwubbubbbuu | ||||
| uggwrwuubrrwrrwurbrwrguurrugwwgruwrgwrrrbbuubgrruruwr | ||||
| wrgrwburgbugwgruburwguurbgggbgubrurwurguwwurwwrbrubbwbwr | ||||
| bbrubwwbubwuwgwgbrbwuurwrrbgguwbwbgbwuwurbbwbrgrrgwbbgw | ||||
| bwurwgwgguubrgwbguugrubbrgwrugubbgwwubruguwbrbwb | ||||
| wrgrwggurrrgwwggbgwrgrrubuubwbwrrrwggbbgbgrbwgwbgb | ||||
| wubrrwbbugrrrrbbgrbwuwwggggrrbbbwurrbuurwbuwrwgrbggu | ||||
| gwgurwruwwbbgbrurrrbrurrrgrrggbgubwbggugrwrrbuw | ||||
| wrgwwwurubgbrgwbuguubwuwurbuurwrruuggrwrrburuuur | ||||
| gubwbwuggbbguwwbgbgrgggbwggbrrrrwubwrrrruuwbgrrwguww | ||||
| wrgguwubgwwwrwwbrbgrruwbrurrrugwrrbbrgbgbw | ||||
| guwwwgrrurrwuwbwrgububgwurrbrrbgbrrwguwrrggguuugbrbbwrgw | ||||
| rwwbggrrugburbbrbguwbgwwrubwrrwwbbgurruurbggruubrgggg | ||||
| uwbgbugwrguuwurgrrgrbrwwubrrbuuwggwwwurgurgwrgrwbr | ||||
| wwgrggwgwbgrugwrggbbruurbgbbwrgruuwbbrurwb | ||||
| urbwbgwbbugbuwwrgwwwwgbbwbruwbwgwwrrrrbubrbbgurbgwuru | ||||
| wgrgrrwububgruwubgwuuwbubbgurruruwrubgrgwg | ||||
| wbbbgbbbguuuubruurugwbruwbbrbwubrgrburrrrwrrb | ||||
| wrggrugrubgrwrwgugugrrgguuwrubwwugrrbuwbw | ||||
| uwbbggrrburubbgwwrwgggwgwggwgbuwbwgburbgrrwr | ||||
| wubbgrggwrrbrbrgwrbubbruugbrwbbbugbrgguubgrgwggu | ||||
| ruuuuurgrrrrrugbbrgburubbwuugwwgbgubgubwubguuururgrwb | ||||
| bwgrugbbwbbrrwuuuruwubgwuwbrwurrrbwgurwbur | ||||
| ubgwubrburgrgrwwrrurrgguwbbwbrbwbuuuuwwwugbrwgrwguubwbrrrg | ||||
| wbrbwruwbbubbgbbgurbuurbwrggbwbgrugugwwgwwwbrburbgbbwr | ||||
| ubgbbbbgwrwgrgrguubrrgugbgugubrwbruguwbwrugwuburwwbb | ||||
| ubrwbuubwuubrrbbrurgbwubuwwbrbrruwwrgrguwrrbwgrugwbubw | ||||
| gwwruuuwurbwrwrubrwwrrbwrrggrburbgwgruwubrrwgubbbuw | ||||
| rwggugubbwgwrwbwrwrwrgwgugugguruwgwbbrwbwrggwurb | ||||
| ugubuwurgrrgugbugrrwrguwwrrurubrbrbrurbrbbwbbuuwugrg | ||||
| uuurwubugubbggwwwurbwgrgruubrwbwgguwrwwrbubbgrgrbbgubb | ||||
| wggruwbwbrwgrwrwbrbuwbrbbwrwwrbubwggrbuwuggbbrgwrgbggwwb | ||||
| wrgbgrbrgwbggbgbrwgrbbwgrgbgrubbwgbrwrwwgbbbwurgwbgwbwbrug | ||||
| urgwwbwbbrwugruuruuubgbwubgwbuwbbggwrbrggwurgrrrgbububwg | ||||
| wguubbbbgwuuuwrrguurgugrrubrguurwggburbgrwbgwuu | ||||
| uurrbwuwwuwugbgrbgwbggwbwgwbwugbbwgurubwgrrbb | ||||
| wrwrbuggbbrrwrgugrububuwggbwrbrrbbruuuggwb | ||||
| wgwwurrwuuuubuuggrgwwuurrugruwbuwgwrrrwrwbwrubugrwwuwurbgw | ||||
| wrgruubububrbwggggbbrrgrbuuuuwrgwggruwurgggwgwggwuwwwgrwgb | ||||
| ruuggwgbrwwbubuggwwugrrubuwurbgrugrwgwubgbggrbbgbwgrurwggg | ||||
| bggbrgwrwruuuuuwbbrgbrgwubbubugbguugggwwrrugrbu | ||||
| wuuwguubwwguubbwggwwwurbgbugbwwwugwwguuugrwgrwrbwbrbubbgbg | ||||
| ggrgwbwrubrwugwrgbrwurwggrguurgurwrwrrgubbbwrwg | ||||
| wrgguwwrbubgrurgwbbuwguwuwgwbwugruruwwuuuwrbrubwrgr | ||||
| bgwrrbwugrbuggrwbuwrrbrrggggruuugbrrguwubur | ||||
| wrgwbgwruwggbwuubrugbgrrwubrgbburwwrbrwrwwrbguwgur | ||||
| buwbrgrbubgubgugwrrbwbgguuwbbwuubrgrrwwgubbbgwgggugbru | ||||
| gurbrrwbbwgubrrwbwuubbuuruubbruwrwwwrrbrwrwwbrbrubb | ||||
| wrgbbwbrrwwrrwggbbwrrurgurbgwgguggubwbbbruurwrwuggg | ||||
| wrggrugrrwwbgwwwwbugbbbbrwwgggrgggwbuguurgu | ||||
| wwugrwwbbggrgwurgrrbbuwgwgurrrbgruwrwugwrr | ||||
| bwrwubrgugguububbuggubbgggugrwuburuwrwrrrgbrwbrgr | ||||
| grgggugwbuburgbggguubwbrrgrguuwwbrgggwwwrgbgugw | ||||
| ubgbbugugbrugrwuguugwbggugbbwrgrbuurwbgrbrbgubbgwuwuwgbgw | ||||
| gurbubbwgwuwwgwbrbuwugguggbgrwgggrwuwwbgbgwbg | ||||
| rbuuugbburuuubgrubrbbrwgggwbbuugrugrrbbwggwr | ||||
| wrgrwrwbwggwrwuguwrurbugwbruwbggbggrrwurruwuuruwru | ||||
| uwguwwgbgggrubggwugwbwrbrbbwbgguuwrbgggwugrbwuwrwwgrur | ||||
| rgrwrgwuwbbbrgwrrwuubgrgbwwrrgburbgbbubbgubwrburbbwuuur | ||||
| wgruurgwubgubgbwbwbgggurbgbrggrbbgwgrrwggrwwgg | ||||
| wgwbwuwwwgwrbubwbuuuwwuuuuubuwbuurrgbgbubbbuuguburwbgru | ||||
| wrgbuurwbwbwguwrrugbrrwuuububbrgwbgugubbwgugrwgwwggwuwgrgrr | ||||
| guggbbgugbwgurrwbuwruggbbubbwguuuruuwwggwrbbgruburgrrbug | ||||
| wrgwuggurgbwgrgrggwwwgbbrwwgguwgguggbbgbbugwbrruwubrrrbrwuu | ||||
| bwgbuubgrwbugwbrwuugurwgbrggbgrwrggwbrgguwbr | ||||
| rbwwgrbgwwuwbrwgurbguwwgwrgwburwbbbwgrrgubugwurrggrwuww | ||||
| ggrwruugwguuwrbgbrgbrggrwugwggbrgwgurbwgbbrbgwubuggbbrgugw | ||||
| uuwwrwrrurgbrwrgbbuguruwwuwrwrugwrgrrbburgu | ||||
| grbbgurubwbwbgrwwgruurwbbuubrwwrrbwubwuwbbbrwu | ||||
| brrwwbbuwbwrbbgrbgbbuwwbbwrwwgubuwruwbgbwrwwwggug | ||||
| wrwbgbgggruurugwbrwwgbuguuwguurbgrgrguuwwwrgu | ||||
| wbwgbubrgbuwwwwbwbuuggugggggrwbwrwgrgguwrggrbwrgrburwbubb | ||||
| ubgwwrbbwbuwrguwrrwrrwggruwbgbrwuwbubububuggbggbrwbu | ||||
| urrbwuwwwrugbugwwgwbbubgrgbburuuwgbgguguugb | ||||
| uwbugbgubgrwgbruubbrrbrwgwuubuwbwbbuwrgbwugbr | ||||
| wrgwrrrbugbgwuwbwrubwgbbbuguwrrgrrwgbbgurwwbrbbggggrrbrruwu | ||||
| rwrrwbwwggubbguuubrwrurgrbwurguuuruuwgubwgbwbrbbgbgb | ||||
| grrbrgwrwbwbbgguwgguugrwurrbwwgwgbuubgrbuwbbbgbbbuw | ||||
| rgwubwwubrrgbrwwubuguugwbbwuwgbgubgruuruubgurrgwguuggwrw | ||||
| ruwuwuwbuwrgggwgrruguwwbrbuwwgugbuuwruwbwrbgwubwu | ||||
| ubgrgrguguwwbwrwwbgwurwurrrbggrrggubgrrbuuggbgg | ||||
| wrggwgrbugwwgruwwubrubgrgggwgubbbwwwwrwurubrwrggrwwbrgwgw | ||||
| gwbggrggwbgwgbrwwuuuwbbwrwgbguwruguuugwrbgrbbrrwrurrggbb | ||||
| brrbuwguwgrbbburrubrbwburbrwbgwbbwgrrgwugrg | ||||
| wgruguruwwgbrurbugrrrwrgwbrwuuruurrwrrgwuuwgwg | ||||
| buuwrbwbubggrwugwwbuwgubbbrbbgbubrrwrbbwwrrrrrwgugurrrbbb | ||||
| rbrrburuubrwurwgguggggubgbbruwwggburwwbwrb | ||||
| ubgruruwbrgbrbugrbburuwugrurugrwbwwguwuuwuwgubgbrgwrbbggbg | ||||
| gguuuwwrgggwgurrrubggubruubbugbbuuwgrruuwguguu | ||||
| uwbwggbrbrrbuggbwwwubwwuuggwrwwrurrwbgbwuwgw | ||||
| rwwwbuurburrrwubguwgrguguubrbgwbggbwurgwug | ||||
| gbgugwbuuwuwguwugwruwwbwurguubuurbbgggbgggrrwgwbgu | ||||
| gbrrbwwbuugurwbgrrwwwwgruurgbbgwwwgrguuuwgbgbgwwrbgwr | ||||
| gbwubwugbgwwugwgguruwubwggwuruwrbbwwbggggrgurwg | ||||
| wrgwbggbrgbuwrgrggwrwbbwwuwruuwuwrgrwwuwg | ||||
| wbrwgrgbrrrwuuuuuugwwrwbrbwbuubgggrrrbwuwruggwbwwubwbrgbwb | ||||
| uurbbgrrwrbwubwwwgbrrrrugbrbrbgbubrgrwbruuwggbbwbrg | ||||
| wrgbrrugrwrugbbrbwgrwbubruuguggwuwugrgbruurbbuubwbwur | ||||
| ggrwgwgwugbggwrbwbrwwrrrbgwrbwuwgwbuuurbwwuwbgubuurwb | ||||
| wrgrrbuwgurbgubwwwwguuwggwbrbwbwwwwuuwggb | ||||
| bbrurwwuwbgggrbgwrbrbgwurrrbbggrguwuwgggbbuuwggruwwgbw | ||||
| ugggggbwgrwubrrwurwgrwwurwrrgbrurbuguwbgwwrrbgwwwwrgwrrw | ||||
| rurbgbbwgrrgwuuwugwgbubwrwruugubgruwbwwrrg | ||||
| wrgrrwggbwruuugrwurbuwwgrgururgugwuwubbgbbgrwururwrgr | ||||
| wgrrbwrwrrbgwgwwrwubgrrurbgrwruguurrruwbwbrwugwr | ||||
| gbrwwbbbuwbwwuwubwggwrrbubuwrrwbrrrbuwbbbbugwbgu | ||||
| gurwruwurbgrurgbuwwgrrrwrbrrgwrbggwwrwruggurg | ||||
| bgururwbrguubbwbwbubbbrrbrbwrbgrubgwbruwbbwwruurruurrgurru | ||||
| bgugrwbbbgrbwuwrbubwbwubggwrwrwgrrbrubggwgwruwwuwwgrbwwb | ||||
| rbguwuwrrbwbbgrrururugbwwruwwrrwbugwguggubruuuuburrguugbu | ||||
| gurbggwbggwwurggbrgbgugrbgubrgrwrrgwguubwrurrrgrbwwbugwrw | ||||
| wrgbuwbugrgwrugguggbrrrgurruuuwgbguwgburb | ||||
| gurburbuuubuwrbwrubwuugwgwbuurrbwuurbrruuburwggw | ||||
| wgguwuuwguubuwrbwwwbbguwuugwrbubwugugrwwgwwwwggurwrbru | ||||
| wggbwgwwrggruuwbrubrrgbggrgwrwrgubbwuugwwuwrggrg | ||||
| bbwbgggubbwwuwrbggwbrgguugbuuwubguuwwrgbwuruwgruwr | ||||
| wuububrwurrgwubbgrbrrgubbbubgwbrbwrwrbwurwgg | ||||
| bgbbrbwwgubwbwbgggrwbrgbbuurgwbrrwgwgruwwrguuggubrbrurwr | ||||
| rbuuwrwbuubwrwrgrggurgwrurrgubbuwuugwbgwrrw | ||||
| wrggbwurgrrubgbgwrrgbruuuuwrruruubbbgrgubbggrwbbuugg | ||||
| buggwggrgbwbgwwbguwuwrbgwrbbwwrguwwuwggurbwgurbggubrrwgg | ||||
| guuggrbbuwbrwgrurrwwwuugwbwugbuwrbgrwguuwbgubgrbbg | ||||
| uuwwwbgugguuwuggrburwwubgurwwbuugrrwgugwuu | ||||
| buurwugwrrrgggubgwwwggwwgwugurbgrgwwuuubwuggurwrrbggbguwgr | ||||
| uuwwbgggubuubgurgwurbwguwrrwgwugubruuugwuguuuwwwgwgb | ||||
| rwbgrbwrwugbbwgwrwrgubbbbwwrrguwwubbugrbbwgbg | ||||
| ugrurggwgbgwgwrruugrwugwrgggbuurwbbubuugrbgbru | ||||
| uuugugurgbwwwwrbrgbrbggrbrurrgbbbrubburbbbbrrrbbbgww | ||||
| brbburruuwuwwbgwugrrrrggbwgrbrgwugrwbwggrr | ||||
| rbbbgburbwbwgbubbrugbgwgugwgrbubggwgwwuwbuurbuurgwrugrrg | ||||
| wuuuubrgwrwwwwugugrgwbrubbbbbgwbbgbubrrbbwgwwrgg | ||||
| ubrwubuurrrwugruubggwuwbbbuuwgbuubwrrrwbrwwwwbubwgwbrwwu | ||||
| brrurgrwwrruwrrubbwuwguuuggurbwgruuurbggggguwurrg | ||||
| uuggbrwgbugguwbgrrwgwwuuwuururwwbgbgrbgbuu | ||||
| grbbbrrgwrurugbwugbwgrgbgbgubugbrurruubgrugguubrwwugwuu | ||||
| ruwbwbugbbbgggbrugrgbbwbbgrguwrwuurrrbugbugbwwgbbugb | ||||
| ruwwrrwugwwbubggrubwbbgwrbgwggbwgguuubgbgubg | ||||
| uuwwugrbbwbbbbwwwwgrbbggurubwrrbbuuubrrggbgb | ||||
| wrgrgwuruwwugubrbrruggwrbbgrrubbggrbrwbruwubgbbrrwwgrgbgubgg | ||||
| urwuuwgugwwubuwrgwbwbgbbrwrwrrrrrbuburwbrurwuuruuugbrbb | ||||
| ggrurrwubwuwbugguuruuwggwwrgrgwwbbrwubgrbggbbur | ||||
| rwuggbgubrwuuwrwrbbbgbrgwwuwrbbuwrubguuugbbgwww | ||||
| wbrwgbrubgrrwbrwrwrwwrgrrbbrwggwbrguwwbrbbwggubbrruuwgrb | ||||
| bruwgrwrrgwrbugruuubwbruuurgbwgguwwruuurwbgr | ||||
| wubrurubrubrrwbuurgrgubgwbgrrurugguggbrguurbugr | ||||
| gbrggggugguugrrrwrgrrurggwwrgubuubwurugrbbrrrgg | ||||
| gwrbugwubbuuwrggubrrubbgggggbgbggwrbrgrwgwruwbwggubug | ||||
| gwrrgubggrurrgbbugruwgbwbrrbwuwuwbggwgrrrwgrggubbgurbg | ||||
| wrggwgwgwuwbrwwbwwgrurubugubgrgubuubbgwgbggwwwg | ||||
| wwrwbbrwwrwubwwwgbwrgguwuwrguwwggurgwgbburuuwwgwrggg | ||||
| wwrbwwbbgbgbuwbwuggrbrggurbugbrwuwugrrurwbruw | ||||
| wrbgrrggbwwgwwwgbwgbbrurwugwgugurguwbrgubr | ||||
| gwrbgbgugubgbgrugbrbgrgguwggwgubugwurwbwrgwbrugwwwb | ||||
| wbgugubwwwrurggwuwuwrrwwrwgbbbuwbbbrgrrgwurw | ||||
| uuuguubwbbwwgbbwwggguubgububgrguguubwwuugwwrwbr | ||||
| rwbgrwwgwrrruwugruuubbwrbrgubgrgwgbbbwwgburbubgrg | ||||
| wgbuugbgwbgwuwwgbwgwwguwrbuwurbuwrbwwrbbrwrrrubwrgbbug | ||||
| ubuwggbwubbgrwbbbwwrrbuwwuwwwwbbubbwrwbubwgrr | ||||
| uurwrurwrbbbgwrbggbwwruguwbwgwururgugrugruggggbgwwrrurggg | ||||
| wrggurbbwgrurggubgbggbrbgbgrwbgwrwbububgrwrwgrwwubuububu | ||||
| wrbwrgggggbuwubugurguuuugbwuwuuruburgwrwuwr | ||||
| bggbgwgrrrbwbwurgwwrggbwrwgbwuwwugwbwgbrrrbgrwwgwrwgbr | ||||
| ubuguruwbrrrgbwwgrgggrruwgggrgrbgrgwubggbrbuubw | ||||
| grurrbguuubuggbbguurbwwbrrurguwurubrbgwggrguwbrrgburruugb | ||||
| wrgbgrugrwwgwbgubbwbbrwubruggruuguuwubwgwurubggrbgwurrrrr | ||||
| wrgrwuguggwwurbwubgwrbrugbruruwuurgurbbgrgr | ||||
| wbbrguggbrbgwgwrugbuwrgbrgbuurrggggbrwgwwwuubbub | ||||
| grrgwbwwbruugggburwbwgrbrggwgwwwwuwwbrwrbwr | ||||
| guuwuuuwrgwwgbruugwwwrwuggrrgwbwwruuuuubububrwrbgurbw | ||||
| rrwrrurggwurggguurrrrurwugwwrruwrruubwrbbguubww | ||||
| grrwgrrrwbubggrrwbbgggbgwbbwubrbwwugugggwbg | ||||
| wrgrrggwurbwbrguwrurwbwrbrbrggggrguwbwgwgwrbggbgrbgrb | ||||
| bwrbwbwurbrugggwbgbrguwrugugrruubrggbwuurrubub | ||||
| wbgwwubuurwwubbwwgurgugbbbgrgwuwbbwrbgwbwguugurubr | ||||
| bbbbruwuwgwbuuugrrbgugrwgrrwwggugrggugbbgrrbw | ||||
| wrggrwwubwruwbugubgurrwrbrrwbgrgbgrruguuubgbbwuwbub | ||||
| wgurrgubgrgbgggurgubbugbbbruruggrbggrgrwwrw | ||||
| rurbwwuuugurguwgwguwurrruubuguwwrbbburrbrwwugrruuw | ||||
| wwubwbggrurbwubbrwbuuruwbgugbwgwgrugubbwbub | ||||
| ruwbrbuguwuuuwwbrbwguuwgrwuruugbrgbbwugubrrrgrgb | ||||
| rwrbrwrbwuwbuubrugwrubwbuuwbubrwbrgurgwgbgrurwrruuwu | ||||
| rugwbruruguuuwgrbwruggggwbgruwrwuggubgruurbubwug | ||||
| wgruguuruwbrrbwubuwgbrwugrgubgrwgggbwwuggbwbb | ||||
| gubuwrgurwrbrbrugrruuwgbbwubwwbgbgguwuuwwgrbrwuwr | ||||
| grrrgwguwrgbrbbwbbrwbgugwbrgggggbbrrurbbgbggwbuugwugb | ||||
| gbrbggrbgrrbbggggubbbwuugubgggbgbrurburugwwwurwwuuw | ||||
| wrgguubrrwbrrugwuuruurwbuuwgwbuugubgbrbbrrbgrbgwrrrwrgguww | ||||
| uwwburbrrururbrwgrwrgrbuwubgugwwwgwgwrrurggu | ||||
| rgubgrwgruwwwgrrruwrububgrrwuubbwrguuwwrrubururguwgbrg | ||||
| gguwbrrrrgwbbgrrbubugrgwwbbgwrgrguwuwwrwbwwgubbgubbuwuwgw | ||||
| rwgrwrbuwbwrrwrrbrrbbbuubgrgbrgugbuuuwbuuw | ||||
| rgguwggrbrurwrrgbruwbguwwwrubwurbrbrwwbwwggrrrwbwg | ||||
| rwruubwuwguwrurrubwuubbburwubbwwguguurggbbwuwb | ||||
| wgwubbbrrbgbwrgubrgguurrrbuurwubbbguubguuuurguwwr | ||||
| grwwbgggrbbrbwgrwbuuuruwwgbbuguurgburbrgugurwb | ||||
| rgugwuuubgubwwwwbbuurwwwburrrgurbwbgbuwwruuugu | ||||
| gurrwwgrgwrbrbbgurbwrrbubrbuwbuurrrguugggrrbwugbb | ||||
| wgwburbwwbubrgurgbbugwrbbrwggwgbwbrbgwburbbugbrrbggbwwwwg | ||||
| uwubgbbubwrbbbubgbbgwbuguububruubbbwuwrububbg | ||||
| ubgbbuwgwrbrggrbrwrgubbubrbbuurrgwbrggbuuwwwrgwubwrbbwb | ||||
| wgrbrwwwgrbgruwbbwgbggwuugggwggbrwrwbburgubgburrwrrwrwbw | ||||
| wrgrbgrbugubrwwwwuubbrbrbrwgwuwbbrgwrbwwrbwbrrubbrr | ||||
| wrgbburuubwbrrggwurbwwbrwuwwugrwrbwwbwgrwwwrbrurubrgrbw | ||||
| rwwbwgwbgggwuuwwbrwgwgrubwwwrrbgruubwrgguwrwr | ||||
| rurbrwwruuuuugwgbbwgwrgrbbwbrwwruuuwwgrbgwbbbuurururwww | ||||
| uwguwbuggubwuubururgbgurrbbugbwuwrgwwrbwwuuwruwuubgb | ||||
| rwubrrrubgwubbgbubrrrrwbbbgbgrbbbuuwrwuggwgugr | ||||
| buwrgbggrburwwrrwrrgbrwbwurwgwubgwbwgrrgwbwrrbrbrgrbgububb | ||||
| wuuurwgbuwwwwuwbbugbrwurrgguwbbbbuuggwbrrwbgrbrgwrgrubug | ||||
| bbuwbrubrwbgurwbwbguugwwgwrwbgbwruurwuwbuuruuggr | ||||
| rbbrwwbbwuuwwuuurburrrgwgrwbbrrbuggwrwrgruugbu | ||||
| gbrgubuurgbgguwwwwubbgrbwrrurburugbwgbubbwruuuuruuwbbgwguw | ||||
| wurwggrggwwrwugbwgrwuuwrugbuuggbgrwrgwggrgugrgrwrrwbb | ||||
| rgwrwuwuwrgubuwbgurwrgurwuuuwgwwrgwgrgruwuwwggwurwrbbuw | ||||
| wrwwrgwbwgbugggrguuurwwuwrbrwrrruwwbrrrgrruubg | ||||
| wbwrrruuurgrrrwrbuwbggbguwugrbwbggbuburgruwgbbruubrwbrgrur | ||||
| uuubuguurruuwwurbuwbgwrrrbrbwrwbuwubugrrruwuggrrwb | ||||
| rrbggbubgrruubbgubuwubbgwuubgbrruwuugggbrbuubgugg | ||||
| buwugbwbbrugbwbgwurguwbwwbbgbbbuguwgrwburrgggbgbguruww | ||||
| wrgbgwurgrbrggrburguuubugbwgugrwbwwwwbbuubw | ||||
| gwruuubuubbbwurbgurrrbwwbburguugbwbrrgbubrwwrrwwgbbgbu | ||||
| wgubuugggrugrwrrggugguwgbwwwruuuwwurwbwgwbbwgr | ||||
| buwwwgrruuuwrwgggbbggbguuwwugwwguuuuuruubrruubbuwubggbgwrg | ||||
| gwrgbgubrwuruwuruguubbuwrbggwwrguugrrgwwbbwgwrbbwbgguuw | ||||
| wrgrbwuburwgwggggrrbrgrbbguuwuwbgrbwbubbbbb | ||||
| wuuurbguuwrurgggrwbgwrbgggrgrggrwuwguwrrugugrugwbuwbrug | ||||
| ugbubbugwbwgugbwuurwbuugbgwbgwgbrurgruuruubgugbwugwubu | ||||
| rgguwubwruubugbrrguruugrrwbrgggurrgbugwbrggu | ||||
| ggwrgrrrrwrggbbwwuwgbrrrugrrubwwwrgrruugurwgrbgwbg | ||||
| gugwrgwbugugrruubbbgugrwuurbruubwrrbbuuubbb | ||||
| gbuuggruguburwbrrbrggrguwguubugbwggbgwuwrwgrgub | ||||
| urbwrguguuwrugrbwgrrgbwrwrwwuuwgbgwbururggwurgrw | ||||
| wuwurrubrwubugbgwgwwuguugbgbuwrwbuwrgbggrurgruwuwuuu | ||||
| grrugwbrrbbwbrgguuwbubbgrugrwbwrurwggbwwwr | ||||
| rwbggurbrwubrbgwuwruwbrgwwgrubuuuurbbggbwrrrwur | ||||
| wwbugrgrgruwrgbugrwrgwgrbruuuuubbubrwbwrgrb | ||||
| wbbbrgwwrrrwwbrrwwwuwugwbrwgrbwuwuggbuwruuugubgbg | ||||
| wrgbuggbbrbrubgubbbuwrubbuwwgbggbbwgrwrruwgguwguwruubw | ||||
| guggwbwbgrrubbrwrrwgugguuuwrgbwgbbguwbbubw | ||||
							
								
								
									
										141
									
								
								y2024/resources/20_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								y2024/resources/20_input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,141 @@ | ||||
| ############################################################################################################################################# | ||||
| #...###.....#...#...#...#...#...#...###...#.....#.........#...#.......#...#.....#...#.........###...#.....#.............#...#...#.......#...# | ||||
| #.#.###.###.#.#.#.#.#.#.#.#.#.#.#.#.###.#.#.###.#.#######.#.#.#.#####.#.#.#.###.#.#.#.#######.###.#.#.###.#.###########.#.#.#.#.#.#####.#.#.# | ||||
| #.#.#...#...#.#...#...#...#...#...#...#.#...#...#.#.......#.#.#.#.....#.#.#...#...#.#.#.......#...#...#...#.#.....#.....#.#.#.#.#.#.....#.#.# | ||||
| #.#.#.###.###.#######################.#.#####.###.#.#######.#.#.#.#####.#.###.#####.#.#.#######.#######.###.#.###.#.#####.#.#.#.#.#.#####.#.# | ||||
| #.#.#...#.###.....#.............#...#.#.#...#.#...#.#...###.#...#.......#.#...#...#.#.#.###.....#.....#.....#.###...#.....#.#.#...#.......#.# | ||||
| #.#.###.#.#######.#.###########.#.#.#.#.#.#.#.#.###.#.#.###.#############.#.###.#.#.#.#.###.#####.###.#######.#######.#####.#.#############.# | ||||
| #.#.....#.#...#...#...#.....###...#.#.#.#.#...#...#...#...#.#...#.........#.....#.#...#...#.......#...#...#...#...###.....#.#.#.............# | ||||
| #.#######.#.#.#.#####.#.###.#######.#.#.#.#######.#######.#.#.#.#.###############.#######.#########.###.#.#.###.#.#######.#.#.#.############# | ||||
| #.......#.#.#.#.......#...#...#.....#.#.#.#...###.#.......#...#.#.#.......#...#...#.......#.....###.#...#...###.#...#.....#...#...#.........# | ||||
| #######.#.#.#.###########.###.#.#####.#.#.#.#.###.#.###########.#.#.#####.#.#.#.###.#######.###.###.#.#########.###.#.###########.#.#######.# | ||||
| #...#...#.#.#.#...###...#...#.#.....#.#.#...#.#...#.#...###.....#...#.....#.#.#.#...###...#...#.#...#.#...#...#...#...#...........#.#.......# | ||||
| #.#.#.###.#.#.#.#.###.#.###.#.#####.#.#.#####.#.###.#.#.###.#########.#####.#.#.#.#####.#.###.#.#.###.#.#.#.#.###.#####.###########.#.####### | ||||
| #.#.#...#.#.#.#.#...#.#...#.#.#...#.#.#.#.....#.#...#.#...#.....#.....###...#...#.#...#.#.#...#.#...#.#.#...#...#...#...#...#.....#.#.......# | ||||
| #.#.###.#.#.#.#.###.#.###.#.#.#.#.#.#.#.#.#####.#.###.###.#####.#.#######.#######.#.#.#.#.#.###.###.#.#.#######.###.#.###.#.#.###.#.#######.# | ||||
| #.#.....#.#.#.#.#...#...#...#...#...#...#.......#.....#...#...#.#.......#.....#...#.#.#.#.#...#.###.#.#.....#...#...#.....#...#...#.#.......# | ||||
| #.#######.#.#.#.#.#####.###############################.###.#.#.#######.#####.#.###.#.#.#.###.#.###.#.#####.#.###.#############.###.#.####### | ||||
| #.......#...#.#.#...###...#...#.....#...#.............#.#...#.#.#.......#.....#.....#.#.#.#...#...#.#.###...#.###.#.............#...#.......# | ||||
| #######.#####.#.###.#####.#.#.#.###.#.#.#.###########.#.#.###.#.#.#######.###########.#.#.#.#####.#.#.###.###.###.#.#############.#########.# | ||||
| #.....#.....#.#.#...#...#...#.#.#...#.#.#.#.....#...#...#...#...#.....#...#...........#.#.#.....#...#.#...#...#...#.......###...#.#.........# | ||||
| #.###.#####.#.#.#.###.#.#####.#.#.###.#.#.#.###.#.#.#######.#########.#.###.###########.#.#####.#####.#.###.###.#########.###.#.#.#.######### | ||||
| #...#.......#...#...#.#.#...#...#.....#.#.#.#...#.#...###...#.........#...#...#.....#...#.#.....#...#.#...#.#...#...#.....#...#.#.#.#.......# | ||||
| ###.###############.#.#.#.#.###########.#.#.#.###.###.###.###.###########.###.#.###.#.###.#.#####.#.#.###.#.#.###.#.#.#####.###.#.#.#.#####.# | ||||
| ###.#.....#.......#...#.#.#.....#.......#...#.....#...#...#...#.....#...#.#...#...#.#.#...#...#...#...#...#...#...#.#...###...#...#...#...#.# | ||||
| ###.#.###.#.#####.#####.#.#####.#.#################.###.###.###.###.#.#.#.#.#####.#.#.#.#####.#.#######.#######.###.###.#####.#########.#.#.# | ||||
| #...#.###...###...#...#...#.....#.........#...#.....###...#...#.#...#.#.#.#.###...#.#.#...#...#.#...###.....#...###...#...###.#.....#...#.#.# | ||||
| #.###.#########.###.#.#####.#############.#.#.#.#########.###.#.#.###.#.#.#.###.###.#.###.#.###.#.#.#######.#.#######.###.###.#.###.#.###.#.# | ||||
| #...#.#...#.....#...#.....#.#...###.......#.#...###...#...#...#.#.#...#.#.#...#...#.#.#...#.#...#.#...#...#.#.....###...#.....#...#...###...# | ||||
| ###.#.#.#.#.#####.#######.#.#.#.###.#######.#######.#.#.###.###.#.#.###.#.###.###.#.#.#.###.#.###.###.#.#.#.#####.#####.#########.########### | ||||
| ###...#.#.#...#...#.......#...#...#.......#...#...#.#...#...###.#.#...#.#...#.#...#.#.#...#.#.###.#...#.#.#.#.....#...#.#...#...#...#...#...# | ||||
| #######.#.###.#.###.#############.#######.###.#.#.#.#####.#####.#.###.#.###.#.#.###.#.###.#.#.###.#.###.#.#.#.#####.#.#.#.#.#.#.###.#.#.#.#.# | ||||
| #.......#.....#...#.........#...#.#...#...#...#.#.#.....#.#...#.#.#...#.#...#.#.#...#.#...#.#...#.#...#.#.#.#.....#.#.#...#...#.....#.#...#.# | ||||
| #.###############.#########.#.#.#.#.#.#.###.###.#.#####.#.#.#.#.#.#.###.#.###.#.#.###.#.###.###.#.###.#.#.#.#####.#.#.###############.#####.# | ||||
| #.......#...#.....#...#...#...#.#...#.#.#...###.#.#...#.#.#.#.#.#.#...#.#.#...#.#.###.#.###.#...#...#.#.#...#...#...#...###...#...#...#...#.# | ||||
| #######.#.#.#.#####.#.#.#.#####.#####.#.#.#####.#.#.#.#.#.#.#.#.#.###.#.#.#.###.#.###.#.###.#.#####.#.#.#####.#.#######.###.#.#.#.#.###.#.#.# | ||||
| #...###...#...#.....#...#.....#.....#...#.#...#.#.#.#...#...#.#.#...#.#.#.#.#...#...#.#...#.#...#...#.#.#.....#.........#...#...#...#...#...# | ||||
| #.#.###########.#############.#####.#####.#.#.#.#.#.#########.#.###.#.#.#.#.#.#####.#.###.#.###.#.###.#.#.###############.###########.####### | ||||
| #.#.#...###...#.............#.#...#.....#...#.#.#.#...#.......#...#...#.#.#.#.#.....#...#.#.#...#...#.#.#.............###.#.......#...#...### | ||||
| #.#.#.#.###.#.#############.#.#.#.#####.#####.#.#.###.#.#########.#####.#.#.#.#.#######.#.#.#.#####.#.#.#############.###.#.#####.#.###.#.### | ||||
| #.#...#.....#.#...#...#.....#...#.......#.....#.#.#...#.....#...#...#...#.#.#.#.#...#...#...#.#...#.#.#.#.......#...#.....#.....#.#.....#...# | ||||
| #.###########.#.#.#.#.#.#################.#####.#.#.#######.#.#.###.#.###.#.#.#.#.#.#.#######.#.#.#.#.#.#.#####.#.#.###########.#.#########.# | ||||
| #.#.....#...#...#...#...#...#...#...#...#.....#.#.#.......#...#.#...#...#.#...#...#.#.....#...#.#...#...#.....#...#...#...#.....#...........# | ||||
| #.#.###.#.#.#############.#.#.#.#.#.#.#.#####.#.#.#######.#####.#.#####.#.#########.#####.#.###.#############.#######.#.#.#.################# | ||||
| #.#.#...#.#.........#...#.#.#.#.#.#...#.....#...#.#.....#.#.....#...###.#.#.........#...#.#.....#...........#.......#.#.#.#...#...#...#...### | ||||
| #.#.#.###.#########.#.#.#.#.#.#.#.#########.#####.#.###.#.#.#######.###.#.#.#########.#.#.#######.#########.#######.#.#.#.###.#.#.#.#.#.#.### | ||||
| #.#.#.....#.......#.#.#...#.#.#.#.#.......#.#.....#.###.#.#...#...#...#...#.....#...#.#...###...#.........#.#...#...#...#...#...#...#.#.#...# | ||||
| #.#.#######.#####.#.#.#####.#.#.#.#.#####.#.#.#####.###.#.###.#.#.###.#########.#.#.#.#######.#.#########.#.#.#.#.#########.#########.#.###.# | ||||
| #...###...#.....#.#...#.....#.#...#.....#.#.#.....#...#.#...#...#...#...#.......#.#.#...###...#...........#...#...#...#####...........#...#.# | ||||
| #######.#.#####.#.#####.#####.#########.#.#.#####.###.#.###.#######.###.#.#######.#.###.###.#######################.#.###################.#.# | ||||
| #...#...#.#.....#.#...#.......#.........#...###...#...#.#...#.......#...#.#.....#.#...#...#.#...#...#.....#...#...#.#...###...#...#...#...#.# | ||||
| #.#.#.###.#.#####.#.#.#########.###############.###.###.#.###.#######.###.#.###.#.###.###.#.#.#.#.#.#.###.#.#.#.#.#.###.###.#.#.#.#.#.#.###.# | ||||
| #.#.#...#.#.....#.#.#.#...###...#.............#.#...###.#.#...#...#...###.#.#...#...#.#...#...#...#.#.#...#.#.#.#...#...#...#...#...#...#...# | ||||
| #.#.###.#.#####.#.#.#.#.#.###.###.###########.#.#.#####.#.#.###.#.#.#####.#.#.#####.#.#.###########.#.#.###.#.#.#####.###.###############.### | ||||
| #.#.....#.......#...#...#...#...#.#...#.......#...#...#...#...#.#.#.....#...#.#...#.#.#.#...........#.#.....#...#.....#...#...#.....#...#...# | ||||
| #.#########################.###.#.#.#.#.###########.#.#######.#.#.#####.#####.#.#.#.#.#.#.###########.###########.#####.###.#.#.###.#.#.###.# | ||||
| #.....#...#.............#...###...#.#...#...#####...#.......#...#.#.....###...#.#.#.#...#...........#.###.....#...###...#...#...###...#.....# | ||||
| #####.#.#.#.###########.#.#########.#####.#.#####.#########.#####.#.#######.###.#.#.###############.#.###.###.#.#####.###.################### | ||||
| #...#...#.#.#...........#...#.......#...#.#...#...#.........###...#.......#...#.#.#.#.............#.#.#...#...#.......#...#...#...#.........# | ||||
| #.#.#####.#.#.#############.#.#######.#.#.###.#.###.###########.#########.###.#.#.#.#.###########.#.#.#.###.###########.###.#.#.#.#.#######.# | ||||
| #.#.....#...#.............#.#...#.....#...#...#...#.#...###...#...#.......###.#.#...#...........#.#...#...#...........#...#.#.#.#.#.....#...# | ||||
| #.#####.#################.#.###.#.#########.#####.#.#.#.###.#.###.#.#########.#.###############.#.#######.###########.###.#.#.#.#.#####.#.### | ||||
| #.#...#...###...#.........#...#...#...#...#.......#...#.#...#...#.#.....#.....#.....#.....#.....#.#...###...........#.....#.#...#.###...#...# | ||||
| #.#.#.###.###.#.#.###########.#####.#.#.#.#############.#.#####.#.#####.#.#########.#.###.#.#####.#.#.#############.#######.#####.###.#####.# | ||||
| #.#.#...#.....#...#.....#...#...#...#...#.#...#...#...#...#...#.#.#.....#.......#...#...#.#.....#.#.#...............#.......#.....#...#.....# | ||||
| #.#.###.###########.###.#.#.###.#.#######.#.#.#.#.#.#.#####.#.#.#.#.###########.#.#####.#.#####.#.#.#################.#######.#####.###.##### | ||||
| #.#.###.....#...#...###...#...#.#...#...#...#...#...#.#.....#.#.#.#.....#.......#.#.....#.#.....#...#...............#...#.....#...#...#.#...# | ||||
| #.#.#######.#.#.#.###########.#.###.#.#.#############.#.#####.#.#.#####.#.#######.#.#####.#.#########.#############.###.#.#####.#.###.#.#.#.# | ||||
| #.#.#.......#.#.#.#.......###.#.###...#.#...#.......#.#.....#...#.#...#.#...#...#.#.....#.#...........#.........#...###.#.......#.....#...#.# | ||||
| #.#.#.#######.#.#.#.#####.###.#.#######.#.#.#.#####.#.#####.#####.#.#.#.###.#.#.#.#####.#.#############.#######.#.#####.###################.# | ||||
| #...#.#...#...#...#.....#.....#.......#...#...#...#.#...#...#.....#.#.#.###.#.#...#.....#.....#.......#.......#.#.#.....#.........#...#...#.# | ||||
| #####.#.#.#.###########.#############.#########.#.#.###.#.###.#####.#.#.###.#.#####.#########.#.#####.#######.#.#.#.#####.#######.#.#.#.#.#.# | ||||
| #...#...#...#.......###...#.........#.#.....#...#...#...#...#.......#.#.#...#...###...#.....#...#...#.........#...#.#.....#.....#.#.#.#.#...# | ||||
| #.#.#########.#####.#####.#.#######.#.#.###.#.#######.#####.#########.#.#.#####.#####.#.###.#####.#.###############.#.#####.###.#.#.#.#.##### | ||||
| #.#...........#...#.......#...#.....#...###.#.....###.......#...#.....#.#...#...#.....#.###.......#.......#...#...#.#.......#...#...#...#...# | ||||
| #.#############.#.###########.#.###########.#####.###########.#.#.#####.###.#.###.#####.#################.#.#.#.#.#.#########.###########.#.# | ||||
| #.#.............#.........#...#...........#.#...#.............#.#.#.....###.#...#.#.....#...........#...#...#.#.#.#.#.....#...#...........#.# | ||||
| #.#.#####################.#.#############.#.#.#.###############.#.#.#######.###.#.#.#####.#########.#.#.#####.#.#.#.#.###.#.###.###########.# | ||||
| #...#...#.................#.###...#...#...#...#.#.......#.......#...#.......#...#...#.....#.......#...#.......#.#...#...#...###.#.......#...# | ||||
| #####.#.#.#################.###.#.#.#.#.#######.#.#####.#.###########.#######.#######.#####.#####.#############.#######.#######.#.#####.#.### | ||||
| #.....#...#...#.....#.....#.#...#...#...#...###.#.....#.#.....###...#.........#.......#...#.#...#.....#...#.....#.....#.........#.....#...### | ||||
| #.#########.#.#.###.#.###.#.#.###########.#.###.#####.#.#####.###.#.###########.#######.#.#.#.#.#####.#.#.#.#####.###.###############.####### | ||||
| #.#.....#...#...###...###...#.............#...#...#...#.......#...#...#...#...#.........#...#.#.#...#...#...#.....###.#.......#.......#...### | ||||
| #.#.###.#.###################################.###.#.###########.#####.#.#.#.#.###############.#.#.#.#########.#######.#.#####.#.#######.#.### | ||||
| #...###...#.......###...#...#.........#.......###...###...###...#.....#.#.#.#.#############...#...#.#...#...#.......#.#.....#...#.......#...# | ||||
| ###########.#####.###.#.#.#.#.#######.#.###############.#.###.###.#####.#.#.#.#############.#######.#.#.#.#.#######.#.#####.#####.#########.# | ||||
| #...........#...#.#...#...#...#.....#.#...#...#...#...#.#.#...#...#...#.#.#.#S#############.......#...#...#...#...#.#.#...#...###.#.........# | ||||
| #.###########.#.#.#.###########.###.#.###.#.#.#.#.#.#.#.#.#.###.###.#.#.#.#.#####################.###########.#.#.#.#.#.#.###.###.#.######### | ||||
| #.....#.......#.#...#...#.......#...#.#...#.#.#.#...#.#.#.#...#.#...#.#.#.#.........#########...#.#.........#...#...#...#...#.....#.........# | ||||
| #####.#.#######.#####.#.#.#######.###.#.###.#.#.#####.#.#.###.#.#.###.#.#.#########.#########.#.#.#.#######.###############.###############.# | ||||
| #.....#.#.......#.....#...#...###...#...###.#.#.....#...#...#.#.#.#...#.#.#...#...#.#########.#...#.#.......#.............#...#.............# | ||||
| #.#####.#.#######.#########.#.#####.#######.#.#####.#######.#.#.#.#.###.#.#.#.#.#.#.#########.#####.#.#######.###########.###.#.############# | ||||
| #.#...#.#.........#.........#.......#.......#.....#...#.....#.#...#.....#.#.#.#.#.#.#########.....#.#.....#...#.......#...###.#.........#...# | ||||
| #.#.#.#.###########.#################.###########.###.#.#####.###########.#.#.#.#.#.#############.#.#####.#.###.#####.#.#####.#########.#.#.# | ||||
| #...#...#...........#...#...#.........#...........###.#.....#.........#...#.#.#.#...#############...#...#...#...#...#.#.#...#.#...#.....#.#.# | ||||
| #########.###########.#.#.#.#.#########.#############.#####.#########.#.###.#.#.#####################.#.#####.###.#.#.#.#.#.#.#.#.#.#####.#.# | ||||
| #.......#...#...#.....#...#.#.#.......#...........#...#.....#...#...#.#.#...#.#.....#####......E#.....#.......###.#.#...#.#.#.#.#.#.......#.# | ||||
| #.#####.###.#.#.#.#########.#.#.#####.###########.#.###.#####.#.#.#.#.#.#.###.#####.#####.#######.###############.#.#####.#.#.#.#.#########.# | ||||
| #.....#.###...#...#...###...#.#.#...#...#...#...#.#...#.#...#.#...#...#.#...#.#...#.#.....#.....#.................#.....#.#.#.#.#.#.....#...# | ||||
| #####.#.###########.#.###.###.#.#.#.###.#.#.#.#.#.###.#.#.#.#.#########.###.#.#.#.#.#.#####.###.#######################.#.#.#.#.#.#.###.#.### | ||||
| ###...#...#.........#.....#...#...#...#...#...#...#...#...#.#.....#.....#...#.#.#...#.......#...#...#...#...#.....#.....#.#.#...#.#.#...#.### | ||||
| ###.#####.#.###############.#########.#############.#######.#####.#.#####.###.#.#############.###.#.#.#.#.#.#.###.#.#####.#.#####.#.#.###.### | ||||
| #...#.....#.......#.........#.........#.....#.....#.....#...###...#.#...#...#.#.#.............#...#.#.#.#.#...###...#.....#.#...#...#...#...# | ||||
| #.###.###########.#.#########.#########.###.#.###.#####.#.#####.###.#.#.###.#.#.#.#############.###.#.#.#.###########.#####.#.#.#######.###.# | ||||
| #...#...#.........#.###...###.......###.#...#.#...#...#.#.#...#.#...#.#.###.#.#.#.###...###...#.#...#.#.#...#...#...#.#.....#.#.#.....#.#...# | ||||
| ###.###.#.#########.###.#.#########.###.#.###.#.###.#.#.#.#.#.#.#.###.#.###.#.#.#.###.#.###.#.#.#.###.#.###.#.#.#.#.#.#.#####.#.#.###.#.#.### | ||||
| ###...#.#.........#.#...#...#.......#...#.#...#.#...#...#.#.#.#.#...#.#.....#.#.#.....#.#...#.#.#.#...#...#...#...#...#.......#...#...#.#...# | ||||
| #####.#.#########.#.#.#####.#.#######.###.#.###.#.#######.#.#.#.###.#.#######.#.#######.#.###.#.#.#.#####.#########################.###.###.# | ||||
| #.....#.........#...#.....#...#...#...#...#.#...#...#.....#.#.#...#...###.....#.....#...#.###...#.#.###...#...#...#...#.............###...#.# | ||||
| #.#############.#########.#####.#.#.###.###.#.#####.#.#####.#.###.#######.#########.#.###.#######.#.###.###.#.#.#.#.#.#.#################.#.# | ||||
| #.....#...#...#.......###.#.....#.#.###...#.#...#...#.....#.#.#...#.......#...#...#.#...#.....###.#.#...#...#...#.#.#.#.............#.....#.# | ||||
| #####.#.#.#.#.#######.###.#.#####.#.#####.#.###.#.#######.#.#.#.###.#######.#.#.#.#.###.#####.###.#.#.###.#######.#.#.#############.#.#####.# | ||||
| #.....#.#...#.......#.....#.#.....#...###...#...#.......#...#.#.###.#.....#.#.#.#.#.#...#...#...#...#...#.###...#.#.#.#...#...#.....#.#...#.# | ||||
| #.#####.###########.#######.#.#######.#######.#########.#####.#.###.#.###.#.#.#.#.#.#.###.#.###.#######.#.###.#.#.#.#.#.#.#.#.#.#####.#.#.#.# | ||||
| #.....#.#...........#...#...#.....#...#.......#...#.....#.....#...#...#...#.#.#.#.#.#.#...#.#...#.......#.....#.#...#...#...#.#.....#...#.#.# | ||||
| #####.#.#.###########.#.#.#######.#.###.#######.#.#.#####.#######.#####.###.#.#.#.#.#.#.###.#.###.#############.#############.#####.#####.#.# | ||||
| #.....#.#...........#.#.#...###...#...#...#...#.#.#.....#...#...#.###...#...#.#.#.#.#.#.#...#.#...#.....#.....#.............#.#...#.....#.#.# | ||||
| #.#####.###########.#.#.###.###.#####.###.#.#.#.#.#####.###.#.#.#.###.###.###.#.#.#.#.#.#.###.#.###.###.#.###.#############.#.#.#.#####.#.#.# | ||||
| #...#...#...........#.#...#.#...#...#...#...#...#.#.....###.#.#.#.#...#...###.#.#...#...#...#.#.#...###.#...#.#...#.....#...#...#.......#...# | ||||
| ###.#.###.###########.###.#.#.###.#.###.#########.#.#######.#.#.#.#.###.#####.#.###########.#.#.#.#####.###.#.#.#.#.###.#.################### | ||||
| ###.#...#...........#.#...#.#...#.#...#.#.........#.###.....#.#.#.#...#.....#.#...#.......#.#.#.#...#...#...#.#.#.#...#.#...###.............# | ||||
| ###.###.###########.#.#.###.###.#.###.#.#.#########.###.#####.#.#.###.#####.#.###.#.#####.#.#.#.###.#.###.###.#.#.###.#.###.###.###########.# | ||||
| #...#...###.........#.#.....#...#...#...#.........#...#.#.....#.#.###...#...#.....#.....#...#.#.#...#...#...#.#.#.#...#...#.....#...#...#...# | ||||
| #.###.#####.#########.#######.#####.#############.###.#.#.#####.#.#####.#.#############.#####.#.#.#####.###.#.#.#.#.#####.#######.#.#.#.#.### | ||||
| #.....#.....#.....#...#.......#.....#...#.........#...#.#...###.#.#.....#.#...###.......#...#.#.#.#.....#...#...#.#.....#.#.......#.#.#.#...# | ||||
| #######.#####.###.#.###.#######.#####.#.#.#########.###.###.###.#.#.#####.#.#.###.#######.#.#.#.#.#.#####.#######.#####.#.#.#######.#.#.###.# | ||||
| #.......#...#.#...#.###...#...#.....#.#.#.......#...###...#.#...#.#.....#...#...#...#...#.#.#.#.#.#.....#.....#...#.....#.#.......#...#...#.# | ||||
| #.#######.#.#.#.###.#####.#.#.#####.#.#.#######.#.#######.#.#.###.#####.#######.###.#.#.#.#.#.#.#.#####.#####.#.###.#####.#######.#######.#.# | ||||
| #...#...#.#.#.#...#...#...#.#.....#...#.#.......#.....#...#.#.#...#.....#.......###.#.#.#.#...#.#.#...#.#.....#...#.....#...#.....#.....#.#.# | ||||
| ###.#.#.#.#.#.###.###.#.###.#####.#####.#.###########.#.###.#.#.###.#####.#########.#.#.#.#####.#.#.#.#.#.#######.#####.###.#.#####.###.#.#.# | ||||
| #...#.#.#.#.#.#...#...#.....#.....#.....#.#.....#.....#.#...#.#...#.#...#.......#...#.#.#.....#.#.#.#...#...#...#.#.....#...#.......#...#...# | ||||
| #.###.#.#.#.#.#.###.#########.#####.#####.#.###.#.#####.#.###.###.#.#.#.#######.#.###.#.#####.#.#.#.#######.#.#.#.#.#####.###########.####### | ||||
| #...#.#.#.#.#.#...#.#.......#.....#.....#.#.#...#.....#.#.###...#.#.#.#.#.....#.#.#...#...#...#.#.#...#.....#.#...#.....#.#...#.......#...### | ||||
| ###.#.#.#.#.#.###.#.#.#####.#####.#####.#.#.#.#######.#.#.#####.#.#.#.#.#.###.#.#.#.#####.#.###.#.###.#.#####.#########.#.#.#.#.#######.#.### | ||||
| #...#.#.#.#.#.#...#.#.#...#.......#...#.#.#.#...#...#.#.#.#...#...#...#.#.###.#.#.#.....#.#.#...#...#.#.....#.#...#...#.#.#.#.#...#.....#...# | ||||
| #.###.#.#.#.#.#.###.#.#.#.#########.#.#.#.#.###.#.#.#.#.#.#.#.#########.#.###.#.#.#####.#.#.#.#####.#.#####.#.#.#.#.#.#.#.#.#.###.#.#######.# | ||||
| #.#...#...#.#.#.#...#...#...#...#...#.#.#.#...#.#.#.#.#.#...#...#.......#...#.#.#...#...#.#.#.#.....#.#.....#.#.#...#.#.#.#.#...#...#...#...# | ||||
| #.#.#######.#.#.#.#########.#.#.#.###.#.#.###.#.#.#.#.#.#######.#.#########.#.#.###.#.###.#.#.#.#####.#.#####.#.#####.#.#.#.###.#####.#.#.### | ||||
| #.#...#.....#.#.#.#.........#.#.#...#.#.#.#...#.#.#.#.#.#...#...#...#...#...#.#.#...#.#...#.#.#.#.....#.....#.#.....#.#.#.#...#...#...#.#...# | ||||
| #.###.#.#####.#.#.#.#########.#.###.#.#.#.#.###.#.#.#.#.#.#.#.#####.#.#.#.###.#.#.###.#.###.#.#.#.#########.#.#####.#.#.#.###.###.#.###.###.# | ||||
| #.....#.......#...#...........#.....#...#...###...#...#...#...#####...#...###...#.....#.....#...#...........#.......#...#.....###...###.....# | ||||
| ############################################################################################################################################# | ||||
							
								
								
									
										5
									
								
								y2024/resources/21_input.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								y2024/resources/21_input.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,5 @@ | ||||
| 340A | ||||
| 149A | ||||
| 582A | ||||
| 780A | ||||
| 463A | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d1; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d10; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d11.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d11.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d11; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/11_input.txt")).unwrap(); | ||||
|     println!("{}", d11::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/11_input.txt")).unwrap(); | ||||
|     println!("{}", d11::process_part2(&content, 75)); | ||||
| } | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d12.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d12.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d12; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/12_input.txt")).unwrap(); | ||||
|     println!("{}", d12::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/12_input.txt")).unwrap(); | ||||
|     println!("{}", d12::process_part2(&content)); | ||||
| } | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d13.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d13.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d13; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/13_input.txt")).unwrap(); | ||||
|     println!("{}", d13::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/13_input.txt")).unwrap(); | ||||
|     println!("{}", d13::process_part2(&content)); | ||||
| } | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d14.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d14.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d14; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/14_input.txt")).unwrap(); | ||||
|     println!("{}", d14::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/14_input.txt")).unwrap(); | ||||
|     d14::process_part2(&content); | ||||
| } | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d15.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d15.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d15; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/15_input.txt")).unwrap(); | ||||
|     println!("{}", d15::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/15_input.txt")).unwrap(); | ||||
|     println!("{}", d15::process_part2(&content)); | ||||
| } | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d16.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d16.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d16; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/16_input.txt")).unwrap(); | ||||
|     println!("{}", d16::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/16_input.txt")).unwrap(); | ||||
|     println!("{}", d16::process_part2(&content)); | ||||
| } | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d17.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d17.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d17; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/17_input.txt")).unwrap(); | ||||
|     println!("{}", d17::process_part1(&content).0); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/17_input.txt")).unwrap(); | ||||
|     println!("{}", d17::process_part2(&content)); | ||||
| } | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d18.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d18.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d18; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/18_input.txt")).unwrap(); | ||||
|     println!("{}", d18::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/18_input.txt")).unwrap(); | ||||
|     println!("{}", d18::process_part2(&content)); | ||||
| } | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d19.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d19.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d19; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/19_input.txt")).unwrap(); | ||||
|     println!("{}", d19::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/19_input.txt")).unwrap(); | ||||
|     println!("{}", d19::process_part2(&content)); | ||||
| } | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d2; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d20.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d20.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d20; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/20_input.txt")).unwrap(); | ||||
|     println!("{}", d20::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/20_input.txt")).unwrap(); | ||||
|     println!("{}", d20::process_part2(&content)); | ||||
| } | ||||
							
								
								
									
										27
									
								
								y2024/src/bin/d21.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								y2024/src/bin/d21.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d21; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/21_input.txt")).unwrap(); | ||||
|     println!("{}", d21::process_part1(&content)); | ||||
| } | ||||
|  | ||||
| fn part2() { | ||||
|     let root = env!("CARGO_MANIFEST_DIR"); | ||||
|     let content = fs::read_to_string(format!("{root}/resources/21_input.txt")).unwrap(); | ||||
|     println!("{}", d21::process_part2(&content)); | ||||
| } | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d3; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d4; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d5; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d6; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d7; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d8; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
| @@ -1,10 +1,17 @@ | ||||
| use std::fs; | ||||
| use std::{fs, time::Instant}; | ||||
|  | ||||
| use utils::time::get_elapsed_string; | ||||
| use y2024::days::d9; | ||||
|  | ||||
| fn main() { | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 1:"); | ||||
|     part1(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|     let now = Instant::now(); | ||||
|     println!("Part 2:"); | ||||
|     part2(); | ||||
|     println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
| } | ||||
|  | ||||
| fn part1() { | ||||
|   | ||||
							
								
								
									
										155
									
								
								y2024/src/days/d11.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								y2024/src/days/d11.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,155 @@ | ||||
| use std::collections::HashMap; | ||||
|  | ||||
| use itertools::Itertools; | ||||
|  | ||||
| pub fn process_part1(input: &str) -> u64 { | ||||
|     let stones = input | ||||
|         .split_whitespace() | ||||
|         .map(|stone| stone.parse::<u64>().unwrap()) | ||||
|         .collect_vec(); | ||||
|     let mut result = stones; | ||||
|     for _ in 0..25 { | ||||
|         result = blink(result); | ||||
|     } | ||||
|     let mut test = HashMap::new(); | ||||
|     for stone in result.iter() { | ||||
|         test.entry(stone) | ||||
|             .and_modify(|count| *count += 1) | ||||
|             .or_insert(1); | ||||
|     } | ||||
|     result.len() as u64 | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str, blinks: u64) -> u64 { | ||||
|     let mut stones: HashMap<u64, u64> = HashMap::new(); | ||||
|     input.split_whitespace().for_each(|stone| { | ||||
|         let stone = stone.parse::<u64>().unwrap(); | ||||
|         stones | ||||
|             .entry(stone) | ||||
|             .and_modify(|count| *count += 1) | ||||
|             .or_insert(1); | ||||
|     }); | ||||
|     let mut stones_after: HashMap<u64, u64> = HashMap::new(); | ||||
|     for _idx in 0..blinks { | ||||
|         for (stone, count) in stones.iter() { | ||||
|             if *stone == 0 { | ||||
|                 stones_after | ||||
|                     .entry(1) | ||||
|                     .and_modify(|inner_count| *inner_count += count) | ||||
|                     .or_insert(*count); | ||||
|             } else if (((*stone as f64).log10() + 1.0).floor() as u64) % 2 == 0 { | ||||
|                 let num_digits = ((*stone as f64).log10() + 1.0).floor() as u64; | ||||
|                 let digits_per_side = num_digits / 2; | ||||
|                 let left = stone / 10_u64.pow(digits_per_side as u32); | ||||
|                 let right = stone % 10_u64.pow(digits_per_side as u32); | ||||
|                 stones_after | ||||
|                     .entry(left) | ||||
|                     .and_modify(|inner_count| *inner_count += count) | ||||
|                     .or_insert(*count); | ||||
|                 stones_after | ||||
|                     .entry(right) | ||||
|                     .and_modify(|inner_count| *inner_count += count) | ||||
|                     .or_insert(*count); | ||||
|                 //stones_after.push(left); | ||||
|                 //stones_after.push(right); | ||||
|             } else { | ||||
|                 let new_stone = stone * 2024; | ||||
|                 stones_after | ||||
|                     .entry(new_stone) | ||||
|                     .and_modify(|inner_count| *inner_count += count) | ||||
|                     .or_insert(*count); | ||||
|                 //stones_after.push(stone * 2024); | ||||
|             } | ||||
|         } | ||||
|         stones = stones_after.clone(); | ||||
|         stones_after.clear(); | ||||
|     } | ||||
|     stones | ||||
|         .into_values() | ||||
|         .reduce(|acc, count| acc + count) | ||||
|         .unwrap() | ||||
| } | ||||
|  | ||||
| fn blink(stones: Vec<u64>) -> Vec<u64> { | ||||
|     let mut stones_after = Vec::new(); | ||||
|     for stone in stones { | ||||
|         if stone == 0 { | ||||
|             stones_after.push(1); | ||||
|             continue; | ||||
|         } | ||||
|         let num_digits = ((stone as f64).log10() + 1.0).floor() as u64; | ||||
|         if num_digits % 2 == 0 { | ||||
|             let digits_per_side = num_digits / 2; | ||||
|             let left = stone / 10_u64.pow(digits_per_side as u32); | ||||
|             let right = stone % 10_u64.pow(digits_per_side as u32); | ||||
|             stones_after.push(left); | ||||
|             stones_after.push(right); | ||||
|         } else { | ||||
|             stones_after.push(stone * 2024); | ||||
|         } | ||||
|     } | ||||
|     stones_after | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use itertools::Itertools; | ||||
|  | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT_1: &str = "0 1 10 99 999"; | ||||
|     const INPUT_2: &str = "125 17"; | ||||
|  | ||||
|     #[test] | ||||
|     fn test_blink_1() { | ||||
|         let stones = INPUT_1 | ||||
|             .split_whitespace() | ||||
|             .map(|stone| stone.parse::<u64>().unwrap()) | ||||
|             .collect_vec(); | ||||
|         let stones = blink(stones); | ||||
|         assert_eq!(stones, vec![1, 2024, 1, 0, 9, 9, 2021976]); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn test_blink_2() { | ||||
|         let stones = INPUT_2 | ||||
|             .split_whitespace() | ||||
|             .map(|stone| stone.parse::<u64>().unwrap()) | ||||
|             .collect_vec(); | ||||
|         let mut result = stones; | ||||
|         for _ in 0..6 { | ||||
|             result = blink(result); | ||||
|         } | ||||
|         assert_eq!( | ||||
|             result, | ||||
|             vec![ | ||||
|                 2097446912, 14168, 4048, 2, 0, 2, 4, 40, 48, 2024, 40, 48, 80, 96, 2, 8, 6, 7, 6, | ||||
|                 0, 3, 2 | ||||
|             ] | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1() { | ||||
|         let result = process_part1(INPUT_2); | ||||
|         assert_eq!(result, 55312); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_1() { | ||||
|         let result = process_part2(INPUT_1, 1); | ||||
|         assert_eq!(result, 7); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_2() { | ||||
|         let result = process_part2(INPUT_2, 6); | ||||
|         assert_eq!(result, 22); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_3() { | ||||
|         let result = process_part2(INPUT_2, 25); | ||||
|         assert_eq!(result, 55312); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										348
									
								
								y2024/src/days/d12.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										348
									
								
								y2024/src/days/d12.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,348 @@ | ||||
| use std::{collections::HashMap, fmt::Display}; | ||||
|  | ||||
| use itertools::Itertools; | ||||
|  | ||||
| #[derive(Debug)] | ||||
| enum Reason { | ||||
|     WrongPlotType, | ||||
|     AlreadyInRegion, | ||||
|     PlotNotNeighbor, | ||||
|     WrongRegionType, | ||||
|     MergeImpossible, | ||||
| } | ||||
|  | ||||
| impl Display for Reason { | ||||
|     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||||
|         let reason_str = match self { | ||||
|             Reason::WrongPlotType => "Could not add plot. Wrong plant type!", | ||||
|             Reason::AlreadyInRegion => "Could not add plot. Already in region!", | ||||
|             Reason::PlotNotNeighbor => "Could not add plot. Not a Neighbor!", | ||||
|             Reason::WrongRegionType => "Could not merge regions. Incompatible plant types!", | ||||
|             Reason::MergeImpossible => "Could not merge Regions!", | ||||
|         }; | ||||
|         write!(f, "{reason_str}") | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone)] | ||||
| struct Region { | ||||
|     plant: char, | ||||
|     plots: Vec<(u32, u32)>, | ||||
| } | ||||
|  | ||||
| impl Region { | ||||
|     fn add(&mut self, new_plot: (char, (u32, u32))) -> Result<(), Reason> { | ||||
|         if new_plot.0 != self.plant { | ||||
|             return Err(Reason::WrongPlotType); | ||||
|         } | ||||
|         let new_plot = new_plot.1; | ||||
|         for plot in self.plots.iter() { | ||||
|             if (plot.0.abs_diff(new_plot.0) == 1 && plot.1 == new_plot.1) | ||||
|                 || (plot.1.abs_diff(new_plot.1) == 1 && plot.0 == new_plot.0) | ||||
|             { | ||||
|                 self.plots.push(new_plot); | ||||
|                 return Ok(()); | ||||
|             } else if *plot == new_plot { | ||||
|                 return Err(Reason::AlreadyInRegion); | ||||
|             } | ||||
|         } | ||||
|         Err(Reason::PlotNotNeighbor) | ||||
|     } | ||||
|  | ||||
|     fn merge(mut self, other: Self) -> Result<Self, Reason> { | ||||
|         if self.plant != other.plant { | ||||
|             return Err(Reason::WrongRegionType); | ||||
|         } | ||||
|         for plot in self.plots.clone() { | ||||
|             for other_plot in other.plots.clone().into_iter() { | ||||
|                 if (plot.0.abs_diff(other_plot.0) == 1 && plot.1 == other_plot.1) | ||||
|                     || (plot.1.abs_diff(other_plot.1) == 1 && plot.0 == other_plot.0) | ||||
|                 { | ||||
|                     self.plots = [self.plots, other.plots] | ||||
|                         .concat() | ||||
|                         .into_iter() | ||||
|                         .unique() | ||||
|                         .collect_vec(); | ||||
|                     return Ok(self); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         Err(Reason::MergeImpossible) | ||||
|     } | ||||
|  | ||||
|     fn merge_multiple(regions: Vec<Region>) -> Region { | ||||
|         let mut merged_regions = regions[0].clone(); | ||||
|         for region in regions[1..].iter() { | ||||
|             merged_regions = merged_regions.merge(region.clone()).unwrap(); | ||||
|         } | ||||
|         merged_regions | ||||
|     } | ||||
|  | ||||
|     fn area(&self) -> u32 { | ||||
|         self.plots.len() as u32 | ||||
|     } | ||||
|  | ||||
|     fn perimeter(&self) -> u32 { | ||||
|         let mut num_fence_elements = 0; | ||||
|         for plot in self.plots.iter() { | ||||
|             if plot.0 == 0 || !self.plots.contains(&(plot.0 - 1, plot.1)) { | ||||
|                 num_fence_elements += 1; | ||||
|             } | ||||
|             if plot.1 == 0 || !self.plots.contains(&(plot.0, plot.1 - 1)) { | ||||
|                 num_fence_elements += 1; | ||||
|             } | ||||
|             if !self.plots.contains(&(plot.0 + 1, plot.1)) { | ||||
|                 num_fence_elements += 1; | ||||
|             } | ||||
|             if !self.plots.contains(&(plot.0, plot.1 + 1)) { | ||||
|                 num_fence_elements += 1; | ||||
|             } | ||||
|         } | ||||
|         num_fence_elements | ||||
|     } | ||||
|  | ||||
|     fn sides(&self) -> u32 { | ||||
|         let mut top_sides = HashMap::new(); | ||||
|         let mut bottom_sides = HashMap::new(); | ||||
|         let mut left_sides = HashMap::new(); | ||||
|         let mut right_sides = HashMap::new(); | ||||
|         for plot in self.plots.iter() { | ||||
|             if plot.0 == 0 || !self.plots.contains(&(plot.0 - 1, plot.1)) { | ||||
|                 left_sides | ||||
|                     .entry(plot.0) | ||||
|                     .and_modify(|ys: &mut Vec<u32>| ys.push(plot.1)) | ||||
|                     .or_insert(vec![plot.1]); | ||||
|             } | ||||
|             if plot.1 == 0 || !self.plots.contains(&(plot.0, plot.1 - 1)) { | ||||
|                 top_sides | ||||
|                     .entry(plot.1) | ||||
|                     .and_modify(|xs: &mut Vec<u32>| xs.push(plot.0)) | ||||
|                     .or_insert(vec![plot.0]); | ||||
|             } | ||||
|             if !self.plots.contains(&(plot.0, plot.1 + 1)) { | ||||
|                 bottom_sides | ||||
|                     .entry(plot.1) | ||||
|                     .and_modify(|xs: &mut Vec<u32>| xs.push(plot.0)) | ||||
|                     .or_insert(vec![plot.0]); | ||||
|             } | ||||
|             if !self.plots.contains(&(plot.0 + 1, plot.1)) { | ||||
|                 right_sides | ||||
|                     .entry(plot.0) | ||||
|                     .and_modify(|ys: &mut Vec<u32>| ys.push(plot.1)) | ||||
|                     .or_insert(vec![plot.1]); | ||||
|             } | ||||
|         } | ||||
|         let mut num_top_sides = top_sides.len() as u32; | ||||
|         for (_x, ys) in top_sides.iter_mut() { | ||||
|             ys.sort(); | ||||
|             ys.windows(2).for_each(|window| { | ||||
|                 if window[0].abs_diff(window[1]) != 1 { | ||||
|                     num_top_sides += 1; | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|         let mut num_bottom_sides = bottom_sides.len() as u32; | ||||
|         for (_x, ys) in bottom_sides.iter_mut() { | ||||
|             ys.sort(); | ||||
|             ys.windows(2).for_each(|window| { | ||||
|                 if window[0].abs_diff(window[1]) != 1 { | ||||
|                     num_bottom_sides += 1; | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|         let mut num_left_sides = left_sides.len() as u32; | ||||
|         for (_y, xs) in left_sides.iter_mut() { | ||||
|             xs.sort(); | ||||
|             xs.windows(2).for_each(|window| { | ||||
|                 if window[0].abs_diff(window[1]) != 1 { | ||||
|                     num_left_sides += 1; | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|         let mut num_right_sides = right_sides.len() as u32; | ||||
|         for (_y, xs) in right_sides.iter_mut() { | ||||
|             xs.sort(); | ||||
|             xs.windows(2).for_each(|window| { | ||||
|                 if window[0].abs_diff(window[1]) != 1 { | ||||
|                     num_right_sides += 1; | ||||
|                 } | ||||
|             }); | ||||
|         } | ||||
|         num_top_sides + num_bottom_sides + num_left_sides + num_right_sides | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub fn process_part1(input: &str) -> u32 { | ||||
|     let mut regions: Vec<Region> = Vec::new(); | ||||
|  | ||||
|     input.lines().enumerate().for_each(|(y, line)| { | ||||
|         line.chars().enumerate().for_each(|(x, plant)| { | ||||
|             let mut added_regions_idx = Vec::new(); | ||||
|             for (idx, region) in regions.iter_mut().enumerate() { | ||||
|                 match region.add((plant, (x as u32, y as u32))) { | ||||
|                     Ok(_) => added_regions_idx.push(idx), | ||||
|                     Err(_) => continue, | ||||
|                 } | ||||
|             } | ||||
|             if added_regions_idx.is_empty() { | ||||
|                 regions.push(Region { | ||||
|                     plant, | ||||
|                     plots: vec![(x as u32, y as u32)], | ||||
|                 }); | ||||
|             } else if added_regions_idx.len() > 1 { | ||||
|                 let regions_to_merge = regions | ||||
|                     .iter() | ||||
|                     .enumerate() | ||||
|                     .filter(|&(idx, _region)| added_regions_idx.contains(&idx)) | ||||
|                     .map(|(_, region)| region) | ||||
|                     .cloned() | ||||
|                     .collect_vec(); | ||||
|                 let merged_region = Region::merge_multiple(regions_to_merge); | ||||
|                 for idx in added_regions_idx.iter().rev() { | ||||
|                     regions.remove(*idx); | ||||
|                 } | ||||
|                 regions.push(merged_region); | ||||
|             } | ||||
|         }) | ||||
|     }); | ||||
|     regions | ||||
|         .iter() | ||||
|         .map(|region| region.perimeter() * region.area()) | ||||
|         .sum() | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) -> u32 { | ||||
|     let mut regions: Vec<Region> = Vec::new(); | ||||
|  | ||||
|     input.lines().enumerate().for_each(|(y, line)| { | ||||
|         line.chars().enumerate().for_each(|(x, plant)| { | ||||
|             let mut added_regions_idx = Vec::new(); | ||||
|             for (idx, region) in regions.iter_mut().enumerate() { | ||||
|                 match region.add((plant, (x as u32, y as u32))) { | ||||
|                     Ok(_) => added_regions_idx.push(idx), | ||||
|                     Err(_) => continue, | ||||
|                 } | ||||
|             } | ||||
|             if added_regions_idx.is_empty() { | ||||
|                 regions.push(Region { | ||||
|                     plant, | ||||
|                     plots: vec![(x as u32, y as u32)], | ||||
|                 }); | ||||
|             } else if added_regions_idx.len() > 1 { | ||||
|                 let regions_to_merge = regions | ||||
|                     .iter() | ||||
|                     .enumerate() | ||||
|                     .filter(|&(idx, _region)| added_regions_idx.contains(&idx)) | ||||
|                     .map(|(_, region)| region) | ||||
|                     .cloned() | ||||
|                     .collect_vec(); | ||||
|                 let merged_region = Region::merge_multiple(regions_to_merge); | ||||
|                 for idx in added_regions_idx.iter().rev() { | ||||
|                     regions.remove(*idx); | ||||
|                 } | ||||
|                 regions.push(merged_region); | ||||
|             } | ||||
|         }) | ||||
|     }); | ||||
|     regions | ||||
|         .iter() | ||||
|         .map(|region| region.sides() * region.area()) | ||||
|         .sum() | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT_1: &str = "AAAA | ||||
| BBCD | ||||
| BBCC | ||||
| EEEC"; | ||||
|  | ||||
|     const INPUT_2: &str = "OOOOO | ||||
| OXOXO | ||||
| OOOOO | ||||
| OXOXO | ||||
| OOOOO"; | ||||
|  | ||||
|     const INPUT_3: &str = "RRRRIICCFF | ||||
| RRRRIICCCF | ||||
| VVRRRCCFFF | ||||
| VVRCCCJFFF | ||||
| VVVVCJJCFE | ||||
| VVIVCCJJEE | ||||
| VVIIICJJEE | ||||
| MIIIIIJJEE | ||||
| MIIISIJEEE | ||||
| MMMISSJEEE"; | ||||
|  | ||||
|     const INPUT_CUSTOM: &str = "XOX | ||||
| OOO"; | ||||
|  | ||||
|     const INPUT_4: &str = "EEEEE | ||||
| EXXXX | ||||
| EEEEE | ||||
| EXXXX | ||||
| EEEEE"; | ||||
|  | ||||
|     const INPUT_5: &str = "AAAAAA | ||||
| AAABBA | ||||
| AAABBA | ||||
| ABBAAA | ||||
| ABBAAA | ||||
| AAAAAA"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_1() { | ||||
|         let result = process_part1(INPUT_1); | ||||
|         assert_eq!(result, 140); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_2() { | ||||
|         let result = process_part1(INPUT_2); | ||||
|         assert_eq!(result, 772); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_3() { | ||||
|         let result = process_part1(INPUT_3); | ||||
|         assert_eq!(result, 1930); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_custom() { | ||||
|         let result = process_part1(INPUT_CUSTOM); | ||||
|         assert_eq!(result, 48); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_1() { | ||||
|         let result = process_part2(INPUT_1); | ||||
|         assert_eq!(result, 80); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_2() { | ||||
|         let result = process_part2(INPUT_2); | ||||
|         assert_eq!(result, 436); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_3() { | ||||
|         let result = process_part2(INPUT_3); | ||||
|         assert_eq!(result, 1206); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_4() { | ||||
|         let result = process_part2(INPUT_4); | ||||
|         assert_eq!(result, 236); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_5() { | ||||
|         let result = process_part2(INPUT_5); | ||||
|         assert_eq!(result, 368); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										151
									
								
								y2024/src/days/d13.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								y2024/src/days/d13.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,151 @@ | ||||
| use core::panic; | ||||
|  | ||||
| #[derive(Debug, Clone, Copy)] | ||||
| struct ClawMachine { | ||||
|     button_a: (i64, i64), | ||||
|     button_b: (i64, i64), | ||||
|     prize: (i64, i64), | ||||
| } | ||||
|  | ||||
| impl ClawMachine { | ||||
|     fn parse(s: &str) -> Self { | ||||
|         let mut button_a = (0, 0); | ||||
|         let mut button_b = (0, 0); | ||||
|         let mut prize = (0, 0); | ||||
|         s.lines().for_each(|line| { | ||||
|             let (field, coords) = line.split_once(": ").unwrap(); | ||||
|             if field == "Button A" { | ||||
|                 let (x, y) = coords.split_once(", ").unwrap(); | ||||
|                 let x: i64 = x.split_once("+").unwrap().1.parse().unwrap(); | ||||
|                 let y: i64 = y.split_once("+").unwrap().1.parse().unwrap(); | ||||
|                 button_a = (x, y); | ||||
|             } else if field == "Button B" { | ||||
|                 let (x, y) = coords.split_once(", ").unwrap(); | ||||
|                 let x: i64 = x.split_once("+").unwrap().1.parse().unwrap(); | ||||
|                 let y: i64 = y.split_once("+").unwrap().1.parse().unwrap(); | ||||
|                 button_b = (x, y); | ||||
|             } else if field == "Prize" { | ||||
|                 let (x, y) = coords.split_once(", ").unwrap(); | ||||
|                 let x: i64 = x.split_once("=").unwrap().1.parse().unwrap(); | ||||
|                 let y: i64 = y.split_once("=").unwrap().1.parse().unwrap(); | ||||
|                 prize = (x, y); | ||||
|             } else { | ||||
|                 panic!("Unknown machine information {line}"); | ||||
|             } | ||||
|         }); | ||||
|         Self { | ||||
|             button_a, | ||||
|             button_b, | ||||
|             prize, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn correct(&mut self) { | ||||
|         self.prize.0 += 10000000000000; | ||||
|         self.prize.1 += 10000000000000; | ||||
|     } | ||||
|  | ||||
|     fn parse_all(input: &str) -> Vec<Self> { | ||||
|         input.split("\n\n").map(Self::parse).collect() | ||||
|     } | ||||
|  | ||||
|     //fn get_moves(&self) -> Option<(i64, i64)> { | ||||
|     //    if self.prize.0 % self.button_b.0 == 0 | ||||
|     //        && self.prize.1 % self.button_b.1 == 0 | ||||
|     //        && self.prize.0 / self.button_b.0 == self.prize.1 / self.button_b.1 | ||||
|     //    { | ||||
|     //        let b_moves = self.prize.0 / self.button_b.0; | ||||
|     //        return Some((0, b_moves)); | ||||
|     //    } | ||||
|  | ||||
|     //    for b_presses in (1..=100).rev() { | ||||
|     //        let after_b_moves = (self.button_b.0 * b_presses, self.button_b.1 * b_presses); | ||||
|     //        if after_b_moves.0 < self.prize.0 && after_b_moves.1 < self.prize.1 { | ||||
|     //            for a_presses in 1..=100 { | ||||
|     //                let after_a_moves = ( | ||||
|     //                    after_b_moves.0 + a_presses * self.button_a.0, | ||||
|     //                    after_b_moves.1 + a_presses * self.button_a.1, | ||||
|     //                ); | ||||
|     //                if after_a_moves == self.prize { | ||||
|     //                    return Some((a_presses, b_presses)); | ||||
|     //                } | ||||
|     //            } | ||||
|     //        } | ||||
|     //    } | ||||
|     //    None | ||||
|     //} | ||||
| } | ||||
|  | ||||
| pub fn process_part1(input: &str) -> i64 { | ||||
|     let machines = ClawMachine::parse_all(input); | ||||
|     machines | ||||
|         .iter() | ||||
|         .map(|machine| { | ||||
|             let p = machine.prize; | ||||
|             let a = machine.button_a; | ||||
|             let b = machine.button_b; | ||||
|             let bm = (p.1 * a.0 - p.0 * a.1) / (b.1 * a.0 - b.0 * a.1); | ||||
|             let am = (p.0 - bm * b.0) / a.0; | ||||
|             if p.0 != am * a.0 + bm * b.0 || p.1 != am * a.1 + bm * b.1 { | ||||
|                 0 | ||||
|             } else { | ||||
|                 am * 3 + bm | ||||
|             } | ||||
|         }) | ||||
|         .sum() | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) -> i64 { | ||||
|     let mut machines = ClawMachine::parse_all(input); | ||||
|     for machine in machines.iter_mut() { | ||||
|         machine.correct(); | ||||
|     } | ||||
|     machines | ||||
|         .iter() | ||||
|         .map(|machine| { | ||||
|             let p = machine.prize; | ||||
|             let a = machine.button_a; | ||||
|             let b = machine.button_b; | ||||
|             let bm = (p.1 * a.0 - p.0 * a.1) / (b.1 * a.0 - b.0 * a.1); | ||||
|             let am = (p.0 - bm * b.0) / a.0; | ||||
|             if p.0 != am * a.0 + bm * b.0 || p.1 != am * a.1 + bm * b.1 { | ||||
|                 0 | ||||
|             } else { | ||||
|                 am * 3 + bm | ||||
|             } | ||||
|         }) | ||||
|         .sum() | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT: &str = "Button A: X+94, Y+34 | ||||
| Button B: X+22, Y+67 | ||||
| Prize: X=8400, Y=5400 | ||||
|  | ||||
| Button A: X+26, Y+66 | ||||
| Button B: X+67, Y+21 | ||||
| Prize: X=12748, Y=12176 | ||||
|  | ||||
| Button A: X+17, Y+86 | ||||
| Button B: X+84, Y+37 | ||||
| Prize: X=7870, Y=6450 | ||||
|  | ||||
| Button A: X+69, Y+23 | ||||
| Button B: X+27, Y+71 | ||||
| Prize: X=18641, Y=10279"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1() { | ||||
|         let result = process_part1(INPUT); | ||||
|         assert_eq!(result, 480); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2() { | ||||
|         let result = process_part2(INPUT); | ||||
|         assert_eq!(result, 0); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										331
									
								
								y2024/src/days/d14.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										331
									
								
								y2024/src/days/d14.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,331 @@ | ||||
| use std::{collections::HashMap, thread, time::Duration}; | ||||
|  | ||||
| use itertools::Itertools; | ||||
|  | ||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq)] | ||||
| struct Robot { | ||||
|     position: (i32, i32), | ||||
|     velocity: (i32, i32), | ||||
| } | ||||
|  | ||||
| impl Robot { | ||||
|     fn parse(s: &str) -> Self { | ||||
|         let (p, v) = s.split_once(" ").unwrap(); | ||||
|         let (_, p_x_y) = p.split_once("=").unwrap(); | ||||
|         let (px, py) = p_x_y.split_once(",").unwrap(); | ||||
|         let position: (i32, i32) = (px.parse().unwrap(), py.parse().unwrap()); | ||||
|         let (_, v_x_y) = v.split_once("=").unwrap(); | ||||
|         let (vx, vy) = v_x_y.split_once(",").unwrap(); | ||||
|         let velocity: (i32, i32) = (vx.parse().unwrap(), vy.parse().unwrap()); | ||||
|         Robot { position, velocity } | ||||
|     } | ||||
|  | ||||
|     fn walk(&mut self, seconds: i32, grid_size: (i32, i32)) { | ||||
|         let movement = ( | ||||
|             self.velocity.0 * seconds + self.position.0, | ||||
|             self.velocity.1 * seconds + self.position.1, | ||||
|         ); | ||||
|         let mut position = (movement.0 % (grid_size.0), movement.1 % (grid_size.1)); | ||||
|         if position.0 < 0 { | ||||
|             position.0 += grid_size.0; | ||||
|         } | ||||
|         if position.1 < 0 { | ||||
|             position.1 += grid_size.1; | ||||
|         } | ||||
|         self.position = position; | ||||
|     } | ||||
|  | ||||
|     fn get_quadrant(&self, grid_size: (i32, i32)) -> i32 { | ||||
|         if self.position.0 == (grid_size.0 / 2) || self.position.1 == (grid_size.1 / 2) { | ||||
|             return 0; | ||||
|         } | ||||
|         let top = self.position.1 < grid_size.1 / 2; | ||||
|         let left = self.position.0 < grid_size.0 / 2; | ||||
|         match (top, left) { | ||||
|             (true, true) => 1, | ||||
|             (true, false) => 2, | ||||
|             (false, true) => 3, | ||||
|             (false, false) => 4, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn print_robots(robots: &Vec<Self>, grid_size: (i32, i32)) { | ||||
|         let mut grid = vec![vec![0; grid_size.0 as usize]; grid_size.1 as usize]; | ||||
|         for robot in robots { | ||||
|             let value = grid[robot.position.1 as usize][robot.position.0 as usize]; | ||||
|             grid[robot.position.1 as usize][robot.position.0 as usize] = value + 1; | ||||
|         } | ||||
|         for row in grid { | ||||
|             for tile in row { | ||||
|                 if tile == 0 { | ||||
|                     print!("."); | ||||
|                 } else { | ||||
|                     print!("{tile}"); | ||||
|                 } | ||||
|             } | ||||
|             println!(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub fn process_part1(input: &str) -> i32 { | ||||
|     let robots = input | ||||
|         .lines() | ||||
|         .map(|line| { | ||||
|             let mut robot = Robot::parse(line); | ||||
|             robot.walk(100, (101, 103)); | ||||
|             robot | ||||
|         }) | ||||
|         .collect_vec(); | ||||
|     Robot::print_robots(&robots, (101, 103)); | ||||
|     let mut quadrants = HashMap::new(); | ||||
|     for robot in robots { | ||||
|         let quadrant = robot.get_quadrant((101, 103)); | ||||
|         quadrants | ||||
|             .entry(quadrant) | ||||
|             .and_modify(|count| *count += 1) | ||||
|             .or_insert(1); | ||||
|     } | ||||
|     quadrants | ||||
|         .iter() | ||||
|         .filter(|(quadrant, _)| **quadrant != 0) | ||||
|         .map(|(_, count)| count) | ||||
|         .product() | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) { | ||||
|     let mut robots = input.lines().map(Robot::parse).collect_vec(); | ||||
|     for seconds in 1..=10000 { | ||||
|         for robot in robots.iter_mut() { | ||||
|             robot.walk(1, (101, 103)); | ||||
|         } | ||||
|         let mut quadrants = HashMap::new(); | ||||
|         for robot in robots.iter() { | ||||
|             let quadrant = robot.get_quadrant((101, 103)); | ||||
|             quadrants | ||||
|                 .entry(quadrant) | ||||
|                 .and_modify(|count| *count += 1) | ||||
|                 .or_insert(1); | ||||
|         } | ||||
|         if quadrants.iter().any(|(_, count)| *count > robots.len() / 3) { | ||||
|             Robot::print_robots(&robots, (101, 103)); | ||||
|             println!("{seconds} secs"); | ||||
|             let half_sec = Duration::from_millis(1000); | ||||
|             thread::sleep(half_sec); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT: &str = "p=0,4 v=3,-3 | ||||
| p=6,3 v=-1,-3 | ||||
| p=10,3 v=-1,2 | ||||
| p=2,0 v=2,-1 | ||||
| p=0,0 v=1,3 | ||||
| p=3,0 v=-2,-2 | ||||
| p=7,6 v=-1,-3 | ||||
| p=3,0 v=-1,-2 | ||||
| p=9,3 v=2,3 | ||||
| p=7,3 v=-1,2 | ||||
| p=2,4 v=2,-3 | ||||
| p=9,5 v=-3,-3"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_1() { | ||||
|         let mut robot = Robot { | ||||
|             position: (0, 4), | ||||
|             velocity: (3, -3), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (3, 5), | ||||
|             velocity: (3, -3), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_2() { | ||||
|         let mut robot = Robot { | ||||
|             position: (6, 3), | ||||
|             velocity: (-1, -3), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (5, 4), | ||||
|             velocity: (-1, -3), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_3() { | ||||
|         let mut robot = Robot { | ||||
|             position: (10, 3), | ||||
|             velocity: (-1, 2), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (9, 0), | ||||
|             velocity: (-1, 2), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_4() { | ||||
|         let mut robot = Robot { | ||||
|             position: (2, 0), | ||||
|             velocity: (2, -1), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (4, 5), | ||||
|             velocity: (2, -1), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_5() { | ||||
|         let mut robot = Robot { | ||||
|             position: (0, 0), | ||||
|             velocity: (1, 3), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (1, 6), | ||||
|             velocity: (1, 3), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_6() { | ||||
|         let mut robot = Robot { | ||||
|             position: (3, 0), | ||||
|             velocity: (-2, -2), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (1, 3), | ||||
|             velocity: (-2, -2), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_7() { | ||||
|         let mut robot = Robot { | ||||
|             position: (7, 6), | ||||
|             velocity: (-1, -3), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (6, 0), | ||||
|             velocity: (-1, -3), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_8() { | ||||
|         let mut robot = Robot { | ||||
|             position: (3, 0), | ||||
|             velocity: (-1, -2), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (2, 3), | ||||
|             velocity: (-1, -2), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_9() { | ||||
|         let mut robot = Robot { | ||||
|             position: (9, 3), | ||||
|             velocity: (2, 3), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (0, 2), | ||||
|             velocity: (2, 3), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_10() { | ||||
|         let mut robot = Robot { | ||||
|             position: (7, 3), | ||||
|             velocity: (-1, 2), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (6, 0), | ||||
|             velocity: (-1, 2), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_11() { | ||||
|         let mut robot = Robot { | ||||
|             position: (2, 4), | ||||
|             velocity: (2, -3), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (4, 5), | ||||
|             velocity: (2, -3), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_12() { | ||||
|         let mut robot = Robot { | ||||
|             position: (9, 5), | ||||
|             velocity: (-3, -3), | ||||
|         }; | ||||
|         robot.walk(100, (11, 7)); | ||||
|         let result = Robot { | ||||
|             position: (6, 6), | ||||
|             velocity: (-3, -3), | ||||
|         }; | ||||
|         assert_eq!(robot, result); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1() { | ||||
|         let robots = INPUT | ||||
|             .lines() | ||||
|             .map(|line| { | ||||
|                 let mut robot = Robot::parse(line); | ||||
|                 robot.walk(100, (11, 7)); | ||||
|                 robot | ||||
|             }) | ||||
|             .collect_vec(); | ||||
|         Robot::print_robots(&robots, (11, 7)); | ||||
|         let mut quadrants = HashMap::new(); | ||||
|         for robot in robots { | ||||
|             let quadrant = robot.get_quadrant((11, 7)); | ||||
|             quadrants | ||||
|                 .entry(quadrant) | ||||
|                 .and_modify(|count| *count += 1) | ||||
|                 .or_insert(1); | ||||
|         } | ||||
|         println!("{quadrants:?}"); | ||||
|         let result: i32 = quadrants | ||||
|             .iter() | ||||
|             .filter(|(quadrant, _)| **quadrant != 0) | ||||
|             .map(|(_, count)| count) | ||||
|             .product(); | ||||
|         assert_eq!(result, 12); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										569
									
								
								y2024/src/days/d15.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										569
									
								
								y2024/src/days/d15.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,569 @@ | ||||
| use std::error::Error; | ||||
|  | ||||
| use itertools::Itertools; | ||||
|  | ||||
| pub fn process_part1(input: &str) -> u32 { | ||||
|     let (grid, movements) = input.split_once("\n\n").unwrap(); | ||||
|     let (mut grid, mut robot) = parse_grid(grid); | ||||
|     let movements = parse_movements(movements); | ||||
|     for movement in movements { | ||||
|         match movement { | ||||
|             Movement::Up => move_up(&mut robot, &mut grid), | ||||
|             Movement::Down => move_down(&mut robot, &mut grid), | ||||
|             Movement::Left => move_left(&mut robot, &mut grid), | ||||
|             Movement::Right => move_right(&mut robot, &mut grid), | ||||
|         } | ||||
|     } | ||||
|     log_grid(grid.clone()); | ||||
|     grid.concat().iter().map(|tile| tile.get_gps()).sum() | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) -> u32 { | ||||
|     let (grid, movements) = input.split_once("\n\n").unwrap(); | ||||
|     let (mut grid, mut robot) = parse_large_grid(grid); | ||||
|     let movements = parse_movements(movements); | ||||
|     for movement in movements { | ||||
|         match movement { | ||||
|             Movement::Up => move_up_large(&mut robot, &mut grid), | ||||
|             Movement::Down => move_down_large(&mut robot, &mut grid), | ||||
|             Movement::Left => move_left_large(&mut robot, &mut grid), | ||||
|             Movement::Right => move_right_large(&mut robot, &mut grid), | ||||
|         } | ||||
|     } | ||||
|     log_grid(grid.clone()); | ||||
|     grid.concat().iter().map(|tile| tile.get_gps()).sum() | ||||
| } | ||||
|  | ||||
| fn log_grid(grid: Vec<Vec<GridTile>>) { | ||||
|     for row in grid { | ||||
|         for tile in row { | ||||
|             match tile.entity { | ||||
|                 GridTileType::Robot => print!("@"), | ||||
|                 GridTileType::Crate => print!("O"), | ||||
|                 GridTileType::Wall => print!("#"), | ||||
|                 GridTileType::Nothing => print!("."), | ||||
|                 GridTileType::BigCrateLeft => print!("["), | ||||
|                 GridTileType::BigCrateRight => print!("]"), | ||||
|             } | ||||
|         } | ||||
|         println!(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| fn parse_large_grid(input: &str) -> (Vec<Vec<GridTile>>, GridTile) { | ||||
|     let mut grid_entities = Vec::new(); | ||||
|     let mut robot = GridTile { | ||||
|         entity: GridTileType::Robot, | ||||
|         ..Default::default() | ||||
|     }; | ||||
|     input.lines().enumerate().for_each(|(yidx, line)| { | ||||
|         let mut row_entities = Vec::new(); | ||||
|         line.chars().enumerate().for_each(|(xidx, chara)| { | ||||
|             if let Ok(entity) = GridTileType::from_character(chara) { | ||||
|                 match entity { | ||||
|                     GridTileType::Robot => { | ||||
|                         robot.coords = (xidx as u32 * 2, yidx as u32); | ||||
|                         row_entities.push(robot); | ||||
|                         row_entities.push(GridTile::default()); | ||||
|                     } | ||||
|                     GridTileType::Crate => { | ||||
|                         let entity = GridTile { | ||||
|                             entity: GridTileType::BigCrateLeft, | ||||
|                             coords: (xidx as u32 * 2, yidx as u32), | ||||
|                         }; | ||||
|                         row_entities.push(entity); | ||||
|                         let entity = GridTile { | ||||
|                             entity: GridTileType::BigCrateRight, | ||||
|                             coords: (xidx as u32 * 2 + 1, yidx as u32), | ||||
|                         }; | ||||
|                         row_entities.push(entity); | ||||
|                     } | ||||
|                     GridTileType::Wall => { | ||||
|                         let entity = GridTile { | ||||
|                             entity, | ||||
|                             coords: (xidx as u32 * 2, yidx as u32), | ||||
|                         }; | ||||
|                         row_entities.push(entity); | ||||
|                         let entity = GridTile { | ||||
|                             entity: GridTileType::Wall, | ||||
|                             coords: (xidx as u32 * 2 + 1, yidx as u32), | ||||
|                         }; | ||||
|                         row_entities.push(entity); | ||||
|                     } | ||||
|                     GridTileType::Nothing => { | ||||
|                         row_entities.push(GridTile::default()); | ||||
|                         row_entities.push(GridTile::default()); | ||||
|                     } | ||||
|                     GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (), | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|         grid_entities.push(row_entities); | ||||
|     }); | ||||
|     (grid_entities, robot) | ||||
| } | ||||
|  | ||||
| fn parse_grid(input: &str) -> (Vec<Vec<GridTile>>, GridTile) { | ||||
|     let mut grid_entities = Vec::new(); | ||||
|     let mut robot = GridTile { | ||||
|         entity: GridTileType::Robot, | ||||
|         ..Default::default() | ||||
|     }; | ||||
|     input.lines().enumerate().for_each(|(yidx, line)| { | ||||
|         let mut row_entities = Vec::new(); | ||||
|         line.chars().enumerate().for_each(|(xidx, chara)| { | ||||
|             if let Ok(entity) = GridTileType::from_character(chara) { | ||||
|                 match entity { | ||||
|                     GridTileType::Robot => { | ||||
|                         robot.coords = (xidx as u32, yidx as u32); | ||||
|                         row_entities.push(robot); | ||||
|                     } | ||||
|                     GridTileType::Crate | GridTileType::Wall => { | ||||
|                         let entity = GridTile { | ||||
|                             entity, | ||||
|                             coords: (xidx as u32, yidx as u32), | ||||
|                         }; | ||||
|                         row_entities.push(entity); | ||||
|                     } | ||||
|                     GridTileType::Nothing => row_entities.push(GridTile::default()), | ||||
|                     GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (), | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|         grid_entities.push(row_entities); | ||||
|     }); | ||||
|     (grid_entities, robot) | ||||
| } | ||||
|  | ||||
| fn parse_movements(input: &str) -> Vec<Movement> { | ||||
|     input | ||||
|         .lines() | ||||
|         .map(|line| { | ||||
|             line.chars() | ||||
|                 .map(|chara| Movement::try_from(chara).unwrap()) | ||||
|                 .collect_vec() | ||||
|         }) | ||||
|         .concat() | ||||
| } | ||||
|  | ||||
| fn move_up(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) { | ||||
|     let (robot_x, robot_y) = robot.coords; | ||||
|     let mut moving_tiles = Vec::new(); | ||||
|     for above in (0..robot_y).rev() { | ||||
|         let tile = grid[above as usize][robot_x as usize]; | ||||
|         match tile.entity { | ||||
|             GridTileType::Robot => (), | ||||
|             GridTileType::Crate => moving_tiles.push(tile), | ||||
|             GridTileType::Wall => return, | ||||
|             GridTileType::Nothing => break, | ||||
|             GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (), | ||||
|         } | ||||
|     } | ||||
|     for tile in moving_tiles.iter_mut() { | ||||
|         tile.coords.1 -= 1; | ||||
|         grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile; | ||||
|     } | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default(); | ||||
|     robot.coords.1 -= 1; | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot; | ||||
| } | ||||
|  | ||||
| fn move_down(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) { | ||||
|     let (robot_x, robot_y) = robot.coords; | ||||
|     let height = grid.len(); | ||||
|     let mut moving_tiles = Vec::new(); | ||||
|     for below in robot_y..height as u32 { | ||||
|         let tile = grid[below as usize][robot_x as usize]; | ||||
|         match tile.entity { | ||||
|             GridTileType::Robot => (), | ||||
|             GridTileType::Crate => moving_tiles.push(tile), | ||||
|             GridTileType::Wall => return, | ||||
|             GridTileType::Nothing => break, | ||||
|             GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (), | ||||
|         } | ||||
|     } | ||||
|     for tile in moving_tiles.iter_mut() { | ||||
|         tile.coords.1 += 1; | ||||
|         grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile; | ||||
|     } | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default(); | ||||
|     robot.coords.1 += 1; | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot; | ||||
| } | ||||
|  | ||||
| fn move_left(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) { | ||||
|     let (robot_x, robot_y) = robot.coords; | ||||
|     let mut moving_tiles = Vec::new(); | ||||
|     for left in (0..robot_x).rev() { | ||||
|         let tile = grid[robot_y as usize][left as usize]; | ||||
|         match tile.entity { | ||||
|             GridTileType::Robot => (), | ||||
|             GridTileType::Crate => moving_tiles.push(tile), | ||||
|             GridTileType::Wall => return, | ||||
|             GridTileType::Nothing => break, | ||||
|             GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (), | ||||
|         } | ||||
|     } | ||||
|     for tile in moving_tiles.iter_mut() { | ||||
|         tile.coords.0 -= 1; | ||||
|         grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile; | ||||
|     } | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default(); | ||||
|     robot.coords.0 -= 1; | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot; | ||||
| } | ||||
|  | ||||
| fn move_right(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) { | ||||
|     let (robot_x, robot_y) = robot.coords; | ||||
|     let mut moving_tiles = Vec::new(); | ||||
|     let width = grid[0].len(); | ||||
|     for right in robot_x..width as u32 { | ||||
|         let tile = grid[robot_y as usize][right as usize]; | ||||
|         match tile.entity { | ||||
|             GridTileType::Robot => (), | ||||
|             GridTileType::Crate => moving_tiles.push(tile), | ||||
|             GridTileType::Wall => return, | ||||
|             GridTileType::Nothing => break, | ||||
|             GridTileType::BigCrateLeft | GridTileType::BigCrateRight => (), | ||||
|         } | ||||
|     } | ||||
|     for tile in moving_tiles.iter_mut() { | ||||
|         tile.coords.0 += 1; | ||||
|         grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile; | ||||
|     } | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default(); | ||||
|     robot.coords.0 += 1; | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot; | ||||
| } | ||||
|  | ||||
| fn get_above(tile: &GridTile, grid: &[Vec<GridTile>]) -> Vec<GridTile> { | ||||
|     let (tile_x, tile_y) = tile.coords; | ||||
|     let mut above_tiles = Vec::new(); | ||||
|     let above = grid[tile_y as usize - 1][tile_x as usize]; | ||||
|     match above.entity { | ||||
|         GridTileType::Robot => (), | ||||
|         GridTileType::Crate => { | ||||
|             above_tiles.push(above); | ||||
|             above_tiles.extend_from_slice(&get_above(&above, grid)); | ||||
|         } | ||||
|         GridTileType::BigCrateLeft => { | ||||
|             above_tiles.push(above); | ||||
|             let right = grid[above.coords.1 as usize][above.coords.0 as usize + 1]; | ||||
|             above_tiles.push(above); | ||||
|             above_tiles.push(right); | ||||
|             above_tiles.extend_from_slice(&get_above(&above, grid)); | ||||
|             above_tiles.extend_from_slice(&get_above(&right, grid)); | ||||
|         } | ||||
|         GridTileType::BigCrateRight => { | ||||
|             above_tiles.push(above); | ||||
|             let left = grid[above.coords.1 as usize][above.coords.0 as usize - 1]; | ||||
|             above_tiles.push(above); | ||||
|             above_tiles.push(left); | ||||
|             above_tiles.extend_from_slice(&get_above(&above, grid)); | ||||
|             above_tiles.extend_from_slice(&get_above(&left, grid)); | ||||
|         } | ||||
|         GridTileType::Wall => above_tiles.push(above), | ||||
|         GridTileType::Nothing => (), | ||||
|     } | ||||
|     above_tiles | ||||
| } | ||||
|  | ||||
| fn get_below(tile: &GridTile, grid: &[Vec<GridTile>]) -> Vec<GridTile> { | ||||
|     let (tile_x, tile_y) = tile.coords; | ||||
|     let mut below_tiles = Vec::new(); | ||||
|     let below = grid[tile_y as usize + 1][tile_x as usize]; | ||||
|     match below.entity { | ||||
|         GridTileType::Robot => (), | ||||
|         GridTileType::Crate => { | ||||
|             below_tiles.push(below); | ||||
|             below_tiles.extend_from_slice(&get_below(&below, grid)); | ||||
|         } | ||||
|         GridTileType::BigCrateLeft => { | ||||
|             below_tiles.push(below); | ||||
|             let right = grid[below.coords.1 as usize][below.coords.0 as usize + 1]; | ||||
|             below_tiles.push(below); | ||||
|             below_tiles.push(right); | ||||
|             below_tiles.extend_from_slice(&get_below(&below, grid)); | ||||
|             below_tiles.extend_from_slice(&get_below(&right, grid)); | ||||
|         } | ||||
|         GridTileType::BigCrateRight => { | ||||
|             below_tiles.push(below); | ||||
|             let left = grid[below.coords.1 as usize][below.coords.0 as usize - 1]; | ||||
|             below_tiles.push(below); | ||||
|             below_tiles.push(left); | ||||
|             below_tiles.extend_from_slice(&get_below(&below, grid)); | ||||
|             below_tiles.extend_from_slice(&get_below(&left, grid)); | ||||
|         } | ||||
|  | ||||
|         GridTileType::Wall => below_tiles.push(below), | ||||
|         GridTileType::Nothing => (), | ||||
|     } | ||||
|     below_tiles | ||||
| } | ||||
|  | ||||
| fn get_left(tile: &GridTile, grid: &[Vec<GridTile>]) -> Vec<GridTile> { | ||||
|     let (tile_x, tile_y) = tile.coords; | ||||
|     let mut left_tiles = Vec::new(); | ||||
|     let left = grid[tile_y as usize][tile_x as usize - 1]; | ||||
|     match left.entity { | ||||
|         GridTileType::Robot => (), | ||||
|         GridTileType::Crate | GridTileType::BigCrateLeft | GridTileType::BigCrateRight => { | ||||
|             left_tiles.push(left); | ||||
|             left_tiles.extend_from_slice(&get_left(&left, grid)); | ||||
|         } | ||||
|  | ||||
|         GridTileType::Wall => left_tiles.push(left), | ||||
|         GridTileType::Nothing => (), | ||||
|     } | ||||
|     left_tiles | ||||
| } | ||||
|  | ||||
| fn get_right(tile: &GridTile, grid: &[Vec<GridTile>]) -> Vec<GridTile> { | ||||
|     let (tile_x, tile_y) = tile.coords; | ||||
|     let mut right_tiles = Vec::new(); | ||||
|     let right = grid[tile_y as usize][tile_x as usize + 1]; | ||||
|     match right.entity { | ||||
|         GridTileType::Robot => (), | ||||
|         GridTileType::Crate | GridTileType::BigCrateLeft | GridTileType::BigCrateRight => { | ||||
|             right_tiles.push(right); | ||||
|             right_tiles.extend_from_slice(&get_right(&right, grid)); | ||||
|         } | ||||
|  | ||||
|         GridTileType::Wall => right_tiles.push(right), | ||||
|         GridTileType::Nothing => (), | ||||
|     } | ||||
|     right_tiles | ||||
| } | ||||
|  | ||||
| fn move_up_large(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) { | ||||
|     let mut moving_tiles = get_above(robot, grid); | ||||
|     if moving_tiles | ||||
|         .iter() | ||||
|         .map(|tile| tile.entity) | ||||
|         .contains(&GridTileType::Wall) | ||||
|     { | ||||
|         return; | ||||
|     } | ||||
|     moving_tiles.sort_by(|tile_a, tile_b| tile_a.coords.1.cmp(&tile_b.coords.1)); | ||||
|     for tile in moving_tiles.iter_mut() { | ||||
|         grid[tile.coords.1 as usize][tile.coords.0 as usize] = GridTile::default(); | ||||
|         tile.coords.1 -= 1; | ||||
|         grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile; | ||||
|     } | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default(); | ||||
|     robot.coords.1 -= 1; | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot; | ||||
| } | ||||
|  | ||||
| fn move_down_large(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) { | ||||
|     let mut moving_tiles = get_below(robot, grid); | ||||
|     if moving_tiles | ||||
|         .iter() | ||||
|         .map(|tile| tile.entity) | ||||
|         .contains(&GridTileType::Wall) | ||||
|     { | ||||
|         return; | ||||
|     } | ||||
|     moving_tiles.sort_by(|tile_a, tile_b| tile_b.coords.1.cmp(&tile_a.coords.1)); | ||||
|     for tile in moving_tiles.iter_mut() { | ||||
|         grid[tile.coords.1 as usize][tile.coords.0 as usize] = GridTile::default(); | ||||
|         tile.coords.1 += 1; | ||||
|         grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile; | ||||
|     } | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default(); | ||||
|     robot.coords.1 += 1; | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot; | ||||
| } | ||||
|  | ||||
| fn move_left_large(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) { | ||||
|     let mut moving_tiles = get_left(robot, grid); | ||||
|     if moving_tiles | ||||
|         .iter() | ||||
|         .map(|tile| tile.entity) | ||||
|         .contains(&GridTileType::Wall) | ||||
|     { | ||||
|         return; | ||||
|     } | ||||
|     for tile in moving_tiles.iter_mut() { | ||||
|         tile.coords.0 -= 1; | ||||
|         grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile; | ||||
|     } | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default(); | ||||
|     robot.coords.0 -= 1; | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot; | ||||
| } | ||||
|  | ||||
| fn move_right_large(robot: &mut GridTile, grid: &mut [Vec<GridTile>]) { | ||||
|     let mut moving_tiles = get_right(robot, grid); | ||||
|     if moving_tiles | ||||
|         .iter() | ||||
|         .map(|tile| tile.entity) | ||||
|         .contains(&GridTileType::Wall) | ||||
|     { | ||||
|         return; | ||||
|     } | ||||
|     for tile in moving_tiles.iter_mut() { | ||||
|         tile.coords.0 += 1; | ||||
|         grid[tile.coords.1 as usize][tile.coords.0 as usize] = *tile; | ||||
|     } | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = GridTile::default(); | ||||
|     robot.coords.0 += 1; | ||||
|     grid[robot.coords.1 as usize][robot.coords.0 as usize] = *robot; | ||||
| } | ||||
|  | ||||
| #[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||||
| enum GridTileType { | ||||
|     Robot, | ||||
|     Crate, | ||||
|     BigCrateLeft, | ||||
|     BigCrateRight, | ||||
|     Wall, | ||||
|     #[default] | ||||
|     Nothing, | ||||
| } | ||||
|  | ||||
| impl GridTileType { | ||||
|     fn from_character(value: char) -> Result<GridTileType, Box<dyn Error>> { | ||||
|         match value { | ||||
|             '#' => Ok(Self::Wall), | ||||
|             'O' => Ok(Self::Crate), | ||||
|             '@' => Ok(Self::Robot), | ||||
|             '.' => Ok(Self::Nothing), | ||||
|             _ => Err(Box::from(format!("{value} is not a valid entity"))), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||||
| struct GridTile { | ||||
|     entity: GridTileType, | ||||
|     coords: (u32, u32), | ||||
| } | ||||
|  | ||||
| impl GridTile { | ||||
|     fn get_gps(&self) -> u32 { | ||||
|         if self.entity == GridTileType::Crate || self.entity == GridTileType::BigCrateLeft { | ||||
|             self.coords.0 + self.coords.1 * 100 | ||||
|         } else { | ||||
|             0 | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||||
| enum Movement { | ||||
|     Up, | ||||
|     Down, | ||||
|     Left, | ||||
|     Right, | ||||
| } | ||||
|  | ||||
| impl TryFrom<char> for Movement { | ||||
|     type Error = Box<dyn Error>; | ||||
|  | ||||
|     fn try_from(value: char) -> std::result::Result<Movement, Box<dyn Error>> { | ||||
|         match value { | ||||
|             '^' => Ok(Self::Up), | ||||
|             'v' => Ok(Self::Down), | ||||
|             '<' => Ok(Self::Left), | ||||
|             '>' => Ok(Self::Right), | ||||
|             _ => Err(Box::from(format!("{value} is not a valid direction"))), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT_SMALL: &str = "####### | ||||
| #...O.. | ||||
| #......"; | ||||
|  | ||||
|     const INPUT_MEDIUM: &str = "######## | ||||
| #..O.O.# | ||||
| ##@.O..# | ||||
| #...O..# | ||||
| #.#.O..# | ||||
| #...O..# | ||||
| #......# | ||||
| ######## | ||||
|  | ||||
| <^^>>>vv<v>>v<<"; | ||||
|  | ||||
|     const INPUT_LARGE: &str = "########## | ||||
| #..O..O.O# | ||||
| #......O.# | ||||
| #.OO..O.O# | ||||
| #..O@..O.# | ||||
| #O#..O...# | ||||
| #O..O..O.# | ||||
| #.OO.O.OO# | ||||
| #....O...# | ||||
| ########## | ||||
|  | ||||
| <vv>^<v^>v>^vv^v>v<>v^v<v<^vv<<<^><<><>>v<vvv<>^v^>^<<<><<v<<<v^vv^v>^ | ||||
| vvv<<^>^v^^><<>>><>^<<><^vv^^<>vvv<>><^^v>^>vv<>v<<<<v<^v>^<^^>>>^<v<v | ||||
| ><>vv>v^v^<>><>>>><^^>vv>v<^^^>>v^v^<^^>v^^>v^<^v>v<>>v^v^<v>v^^<^^vv< | ||||
| <<v<^>>^^^^>>>v^<>vvv^><v<<<>^^^vv^<vvv>^>v<^^^^v<>^>vvvv><>>v^<<^^^^^ | ||||
| ^><^><>>><>^^<<^^v>>><^<v>^<vv>>v>>>^v><>^v><<<<v>>v<v<v>vvv>^<><<>^>< | ||||
| ^>><>^v<><^vvv<^^<><v<<<<<><^v<<<><<<^^<v<^^^><^>>^<v^><<<^>>^v<v^v<v^ | ||||
| >^>>^v>vv>^<<^v<>><<><<v<<v><>v<^vv<<<>^^v^>^^>>><<^v>>v^v><^^>>^<>vv^ | ||||
| <><^^>^^^<><vvvvv^v<v<<>^v<v>v<<^><<><<><<<^^<<<^<<>><<><^^^>^^<>^>v<> | ||||
| ^^>vv<^v^v<vv>^<><v<^v>^^^>>>^^vvv^>vvv<>>>^<^>>>>>^<<^v>^vvv<>^<><<v> | ||||
| v^^>>><<^^<>>^v^<v^vv<>v^<<>^<^v^v><^<<<><<^<v><v<>vv>>v><v^<vv<>v^<<^"; | ||||
|  | ||||
|     const INPUT_LARGE_BOX_SIMPLE: &str = "##### | ||||
| #..O. | ||||
| #...."; | ||||
|  | ||||
|     const INPUT_LARGE_BOX_FULL: &str = "####### | ||||
| #...#.# | ||||
| #.....# | ||||
| #..OO@# | ||||
| #..O..# | ||||
| #.....# | ||||
| ####### | ||||
|  | ||||
| <vv<<^^<<^^"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_small() { | ||||
|         let (grid, _) = parse_grid(INPUT_SMALL); | ||||
|         let flat_grid = grid.concat(); | ||||
|         let result: u32 = flat_grid.iter().map(|tile| tile.get_gps()).sum(); | ||||
|         assert_eq!(result, 104); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_medium() { | ||||
|         let result = process_part1(INPUT_MEDIUM); | ||||
|         assert_eq!(result, 2028); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_large() { | ||||
|         let result = process_part1(INPUT_LARGE); | ||||
|         assert_eq!(result, 10092); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_simple() { | ||||
|         let (grid, _) = parse_large_grid(INPUT_LARGE_BOX_SIMPLE); | ||||
|         let flat_grid = grid.concat(); | ||||
|         let result: u32 = flat_grid.iter().map(|tile| tile.get_gps()).sum(); | ||||
|         assert_eq!(result, 106); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_full() { | ||||
|         let result = process_part2(INPUT_LARGE_BOX_FULL); | ||||
|         assert_eq!(result, 618); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_large() { | ||||
|         let result = process_part2(INPUT_LARGE); | ||||
|         assert_eq!(result, 9021); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										448
									
								
								y2024/src/days/d16.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										448
									
								
								y2024/src/days/d16.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,448 @@ | ||||
| use std::{collections::HashMap, error::Error}; | ||||
|  | ||||
| use itertools::Itertools; | ||||
|  | ||||
| pub fn process_part1(input: &str) -> usize { | ||||
|     let mut start = (0, 0); | ||||
|     let mut end = (0, 0); | ||||
|     let grid = input | ||||
|         .lines() | ||||
|         .enumerate() | ||||
|         .map(|(yidx, row)| { | ||||
|             row.chars() | ||||
|                 .enumerate() | ||||
|                 .map(|(xidx, chara)| { | ||||
|                     let tile = GridTile::try_from(chara).unwrap(); | ||||
|                     match tile { | ||||
|                         GridTile::Wall | GridTile::Path => tile, | ||||
|                         GridTile::Start => { | ||||
|                             start = (xidx, yidx); | ||||
|                             tile | ||||
|                         } | ||||
|                         GridTile::End => { | ||||
|                             end = (xidx, yidx); | ||||
|                             tile | ||||
|                         } | ||||
|                     } | ||||
|                 }) | ||||
|                 .collect_vec() | ||||
|         }) | ||||
|         .collect_vec(); | ||||
|     let mut next_paths = vec![Reindeer { | ||||
|         coords: start, | ||||
|         ..Default::default() | ||||
|     }]; | ||||
|     let mut arrived: Vec<Reindeer> = Vec::new(); | ||||
|     let mut visited = HashMap::new(); | ||||
|     let mut iter = 0; | ||||
|     while !next_paths.is_empty() { | ||||
|         next_paths = next_paths | ||||
|             .iter() | ||||
|             .map(|reindeer| reindeer.get_all_next_paths(&grid)) | ||||
|             .collect_vec() | ||||
|             .concat(); | ||||
|         for (idx, reindeer) in next_paths.clone().iter().enumerate().rev() { | ||||
|             if let Some(score) = visited.get_mut(&reindeer.coords) { | ||||
|                 if *score <= reindeer.score { | ||||
|                     next_paths.remove(idx); | ||||
|                     continue; | ||||
|                 } else { | ||||
|                     *score = reindeer.score; | ||||
|                 } | ||||
|             } else { | ||||
|                 visited.insert(reindeer.coords, reindeer.score); | ||||
|             } | ||||
|             if reindeer.state == ReindeerState::Arrived { | ||||
|                 let arrived_reindeer = next_paths.remove(idx); | ||||
|                 arrived.push(arrived_reindeer); | ||||
|             } | ||||
|         } | ||||
|         iter += 1; | ||||
|     } | ||||
|     println!("Iterations to goal {iter}"); | ||||
|     arrived.iter().map(|reindeer| reindeer.score).min().unwrap() | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) -> usize { | ||||
|     let mut start = (0, 0); | ||||
|     let mut end = (0, 0); | ||||
|     let grid = input | ||||
|         .lines() | ||||
|         .enumerate() | ||||
|         .map(|(yidx, row)| { | ||||
|             row.chars() | ||||
|                 .enumerate() | ||||
|                 .map(|(xidx, chara)| { | ||||
|                     let tile = GridTile::try_from(chara).unwrap(); | ||||
|                     match tile { | ||||
|                         GridTile::Wall | GridTile::Path => tile, | ||||
|                         GridTile::Start => { | ||||
|                             start = (xidx, yidx); | ||||
|                             tile | ||||
|                         } | ||||
|                         GridTile::End => { | ||||
|                             end = (xidx, yidx); | ||||
|                             tile | ||||
|                         } | ||||
|                     } | ||||
|                 }) | ||||
|                 .collect_vec() | ||||
|         }) | ||||
|         .collect_vec(); | ||||
|     let mut smallest_score = usize::MAX; | ||||
|     let mut visited = HashMap::new(); | ||||
|     visited.insert((start, Orientation::East), 0); | ||||
|     let mut next_paths = vec![Reindeer { | ||||
|         coords: start, | ||||
|         visited: visited.clone(), | ||||
|         ..Default::default() | ||||
|     }]; | ||||
|     let mut arrived: Vec<Reindeer> = Vec::new(); | ||||
|     while !next_paths.is_empty() { | ||||
|         next_paths = next_paths | ||||
|             .iter() | ||||
|             .map(|reindeer| reindeer.get_all_next_paths(&grid)) | ||||
|             .collect_vec() | ||||
|             .concat(); | ||||
|         for (idx, reindeer) in next_paths.clone().iter().enumerate().rev() { | ||||
|             if reindeer.score > smallest_score | ||||
|                 || reindeer | ||||
|                     .visited | ||||
|                     .contains_key(&(reindeer.coords, reindeer.orientation)) | ||||
|             { | ||||
|                 next_paths.remove(idx); | ||||
|                 continue; | ||||
|             } | ||||
|             next_paths[idx] | ||||
|                 .visited | ||||
|                 .insert((reindeer.coords, reindeer.orientation), reindeer.score); | ||||
|             if let Some(score) = visited.get_mut(&(reindeer.coords, reindeer.orientation)) { | ||||
|                 if *score < reindeer.score { | ||||
|                     next_paths.remove(idx); | ||||
|                     continue; | ||||
|                 } else { | ||||
|                     *score = reindeer.score; | ||||
|                 } | ||||
|             } else { | ||||
|                 visited.insert((reindeer.coords, reindeer.orientation), reindeer.score); | ||||
|             } | ||||
|             if reindeer.state == ReindeerState::Arrived && reindeer.score <= smallest_score { | ||||
|                 smallest_score = reindeer.score; | ||||
|                 let arrived_reindeer = next_paths.remove(idx); | ||||
|                 arrived.push(arrived_reindeer); | ||||
|             } | ||||
|         } | ||||
|         arrived.retain(|reindeer| reindeer.score == smallest_score); | ||||
|     } | ||||
|     let visited = arrived | ||||
|         .iter() | ||||
|         .map(|reindeer| { | ||||
|             reindeer | ||||
|                 .visited | ||||
|                 .keys() | ||||
|                 .map(|(coords, _)| coords) | ||||
|                 .collect_vec() | ||||
|         }) | ||||
|         .collect_vec() | ||||
|         .concat(); | ||||
|     log_maze(&grid, &arrived); | ||||
|     visited.iter().unique().count() | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)] | ||||
| enum Orientation { | ||||
|     #[default] | ||||
|     East, | ||||
|     West, | ||||
|     North, | ||||
|     South, | ||||
| } | ||||
|  | ||||
| impl Orientation { | ||||
|     fn turn_clockwise(&self) -> Self { | ||||
|         match self { | ||||
|             Orientation::East => Self::South, | ||||
|             Orientation::West => Self::North, | ||||
|             Orientation::North => Self::East, | ||||
|             Orientation::South => Self::West, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn turn_counterclockwise(&self) -> Self { | ||||
|         match self { | ||||
|             Orientation::East => Self::North, | ||||
|             Orientation::West => Self::South, | ||||
|             Orientation::North => Self::West, | ||||
|             Orientation::South => Self::East, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)] | ||||
| enum ReindeerState { | ||||
|     #[default] | ||||
|     Going, | ||||
|     Arrived, | ||||
|     Stuck, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Default, Clone, PartialEq, Eq)] | ||||
| struct Reindeer { | ||||
|     orientation: Orientation, | ||||
|     coords: (usize, usize), | ||||
|     score: usize, | ||||
|     visited: HashMap<((usize, usize), Orientation), usize>, | ||||
|     state: ReindeerState, | ||||
| } | ||||
|  | ||||
| impl Reindeer { | ||||
|     fn get_next(&self, grid: &[Vec<GridTile>]) -> Reindeer { | ||||
|         let tile = match self.orientation { | ||||
|             Orientation::East => grid[self.coords.1][self.coords.0 + 1], | ||||
|             Orientation::West => grid[self.coords.1][self.coords.0 - 1], | ||||
|             Orientation::North => grid[self.coords.1 - 1][self.coords.0], | ||||
|             Orientation::South => grid[self.coords.1 + 1][self.coords.0], | ||||
|         }; | ||||
|         let coords = match self.orientation { | ||||
|             Orientation::East => (self.coords.0 + 1, self.coords.1), | ||||
|             Orientation::West => (self.coords.0 - 1, self.coords.1), | ||||
|             Orientation::South => (self.coords.0, self.coords.1 + 1), | ||||
|             Orientation::North => (self.coords.0, self.coords.1 - 1), | ||||
|         }; | ||||
|         if tile == GridTile::Wall { | ||||
|             Reindeer { | ||||
|                 state: ReindeerState::Stuck, | ||||
|                 ..self.clone() | ||||
|             } | ||||
|         } else if tile == GridTile::End { | ||||
|             Reindeer { | ||||
|                 score: self.score + 1, | ||||
|                 state: ReindeerState::Arrived, | ||||
|                 coords, | ||||
|                 ..self.clone() | ||||
|             } | ||||
|         } else { | ||||
|             Reindeer { | ||||
|                 score: self.score + 1, | ||||
|                 coords, | ||||
|                 ..self.clone() | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn get_right(&self, grid: &[Vec<GridTile>]) -> Reindeer { | ||||
|         let tile = match self.orientation { | ||||
|             Orientation::East => grid[self.coords.1 + 1][self.coords.0], | ||||
|             Orientation::West => grid[self.coords.1 - 1][self.coords.0], | ||||
|             Orientation::North => grid[self.coords.1][self.coords.0 + 1], | ||||
|             Orientation::South => grid[self.coords.1][self.coords.0 - 1], | ||||
|         }; | ||||
|         let coords = match self.orientation { | ||||
|             Orientation::East => (self.coords.0, self.coords.1 + 1), | ||||
|             Orientation::West => (self.coords.0, self.coords.1 - 1), | ||||
|             Orientation::South => (self.coords.0 - 1, self.coords.1), | ||||
|             Orientation::North => (self.coords.0 + 1, self.coords.1), | ||||
|         }; | ||||
|         if tile == GridTile::Wall { | ||||
|             Reindeer { | ||||
|                 state: ReindeerState::Stuck, | ||||
|                 ..self.clone() | ||||
|             } | ||||
|         } else if tile == GridTile::End { | ||||
|             Reindeer { | ||||
|                 score: self.score + 1001, | ||||
|                 state: ReindeerState::Arrived, | ||||
|                 coords, | ||||
|                 orientation: self.orientation.turn_clockwise(), | ||||
|                 ..self.clone() | ||||
|             } | ||||
|         } else { | ||||
|             Reindeer { | ||||
|                 score: self.score + 1001, | ||||
|                 orientation: self.orientation.turn_clockwise(), | ||||
|                 coords, | ||||
|                 ..self.clone() | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn get_left(&self, grid: &[Vec<GridTile>]) -> Reindeer { | ||||
|         let tile = match self.orientation { | ||||
|             Orientation::East => grid[self.coords.1 - 1][self.coords.0], | ||||
|             Orientation::West => grid[self.coords.1 + 1][self.coords.0], | ||||
|             Orientation::North => grid[self.coords.1][self.coords.0 - 1], | ||||
|             Orientation::South => grid[self.coords.1][self.coords.0 + 1], | ||||
|         }; | ||||
|         let coords = match self.orientation { | ||||
|             Orientation::East => (self.coords.0, self.coords.1 - 1), | ||||
|             Orientation::West => (self.coords.0, self.coords.1 + 1), | ||||
|             Orientation::South => (self.coords.0 + 1, self.coords.1), | ||||
|             Orientation::North => (self.coords.0 - 1, self.coords.1), | ||||
|         }; | ||||
|         if tile == GridTile::Wall { | ||||
|             Reindeer { | ||||
|                 state: ReindeerState::Stuck, | ||||
|                 ..self.clone() | ||||
|             } | ||||
|         } else if tile == GridTile::End { | ||||
|             Reindeer { | ||||
|                 score: self.score + 1001, | ||||
|                 state: ReindeerState::Arrived, | ||||
|                 coords, | ||||
|                 orientation: self.orientation.turn_counterclockwise(), | ||||
|                 ..self.clone() | ||||
|             } | ||||
|         } else { | ||||
|             Reindeer { | ||||
|                 score: self.score + 1001, | ||||
|                 orientation: self.orientation.turn_counterclockwise(), | ||||
|                 coords, | ||||
|                 ..self.clone() | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn get_all_next_paths(&self, grid: &[Vec<GridTile>]) -> Vec<Reindeer> { | ||||
|         let next = self.get_next(grid); | ||||
|         let right = self.get_right(grid); | ||||
|         let left = self.get_left(grid); | ||||
|         let mut paths = Vec::new(); | ||||
|         if next.state != ReindeerState::Stuck { | ||||
|             paths.push(next); | ||||
|         } | ||||
|         if right.state != ReindeerState::Stuck { | ||||
|             paths.push(right); | ||||
|         } | ||||
|         if left.state != ReindeerState::Stuck { | ||||
|             paths.push(left); | ||||
|         } | ||||
|         paths | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)] | ||||
| enum GridTile { | ||||
|     Wall, | ||||
|     #[default] | ||||
|     Path, | ||||
|     Start, | ||||
|     End, | ||||
| } | ||||
|  | ||||
| impl TryFrom<char> for GridTile { | ||||
|     type Error = Box<dyn Error>; | ||||
|  | ||||
|     fn try_from(value: char) -> std::result::Result<GridTile, Box<dyn Error>> { | ||||
|         match value { | ||||
|             '#' => Ok(Self::Wall), | ||||
|             '.' => Ok(Self::Path), | ||||
|             'S' => Ok(Self::Start), | ||||
|             'E' => Ok(Self::End), | ||||
|             _ => Err(Box::from(format!("{value} is not a valid tile"))), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| fn log_maze(grid: &[Vec<GridTile>], visited: &Vec<Reindeer>) { | ||||
|     for (yidx, row) in grid.iter().enumerate() { | ||||
|         for (xidx, tile) in row.iter().enumerate() { | ||||
|             let contains = { | ||||
|                 let mut contains = false; | ||||
|                 for reindeer in visited { | ||||
|                     if reindeer | ||||
|                         .visited | ||||
|                         .contains_key(&((xidx, yidx), Orientation::East)) | ||||
|                         || reindeer | ||||
|                             .visited | ||||
|                             .contains_key(&((xidx, yidx), Orientation::West)) | ||||
|                         || reindeer | ||||
|                             .visited | ||||
|                             .contains_key(&((xidx, yidx), Orientation::North)) | ||||
|                         || reindeer | ||||
|                             .visited | ||||
|                             .contains_key(&((xidx, yidx), Orientation::South)) | ||||
|                     { | ||||
|                         contains = true; | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
|                 contains | ||||
|             }; | ||||
|             if contains && !(*tile == GridTile::Start || *tile == GridTile::End) { | ||||
|                 print!("O"); | ||||
|             } else if *tile == GridTile::Wall { | ||||
|                 print!("#"); | ||||
|             } else if *tile == GridTile::Path { | ||||
|                 print!("."); | ||||
|             } else if *tile == GridTile::Start { | ||||
|                 print!("S"); | ||||
|             } else if *tile == GridTile::End { | ||||
|                 print!("E"); | ||||
|             } | ||||
|         } | ||||
|         println!(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT_1: &str = "############### | ||||
| #.......#....E# | ||||
| #.#.###.#.###.# | ||||
| #.....#.#...#.# | ||||
| #.###.#####.#.# | ||||
| #.#.#.......#.# | ||||
| #.#.#####.###.# | ||||
| #...........#.# | ||||
| ###.#.#####.#.# | ||||
| #...#.....#.#.# | ||||
| #.#.#.###.#.#.# | ||||
| #.....#...#.#.# | ||||
| #.###.#.#.#.#.# | ||||
| #S..#.....#...# | ||||
| ###############"; | ||||
|  | ||||
|     const INPUT_2: &str = "################# | ||||
| #...#...#...#..E# | ||||
| #.#.#.#.#.#.#.#.# | ||||
| #.#.#.#...#...#.# | ||||
| #.#.#.#.###.#.#.# | ||||
| #...#.#.#.....#.# | ||||
| #.#.#.#.#.#####.# | ||||
| #.#...#.#.#.....# | ||||
| #.#.#####.#.###.# | ||||
| #.#.#.......#...# | ||||
| #.#.###.#####.### | ||||
| #.#.#...#.....#.# | ||||
| #.#.#.#####.###.# | ||||
| #.#.#.........#.# | ||||
| #.#.#.#########.# | ||||
| #S#.............# | ||||
| #################"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_1() { | ||||
|         let result = process_part1(INPUT_1); | ||||
|         assert_eq!(result, 7036); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_2() { | ||||
|         let result = process_part1(INPUT_2); | ||||
|         assert_eq!(result, 11048); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_1() { | ||||
|         let result = process_part2(INPUT_1); | ||||
|         assert_eq!(result, 45); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2_2() { | ||||
|         let result = process_part2(INPUT_2); | ||||
|         assert_eq!(result, 64); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										308
									
								
								y2024/src/days/d17.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										308
									
								
								y2024/src/days/d17.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,308 @@ | ||||
| use std::{collections::HashMap, error::Error}; | ||||
|  | ||||
| use itertools::Itertools; | ||||
|  | ||||
| pub fn process_part1(input: &str) -> (String, HashMap<&str, u64>) { | ||||
|     let (registers, program) = input.split_once("\n\n").unwrap(); | ||||
|     let mut registers = parse_registers(registers); | ||||
|     let (_, instructions) = program.split_once(": ").unwrap(); | ||||
|     let mut out = Vec::new(); | ||||
|     let instructions = instructions | ||||
|         .lines() | ||||
|         .map(|line| { | ||||
|             line.split(",") | ||||
|                 .collect_vec() | ||||
|                 .chunks(2) | ||||
|                 .map(|chunk| (chunk[0], chunk[1])) | ||||
|                 .collect_vec() | ||||
|         }) | ||||
|         .collect_vec() | ||||
|         .concat(); | ||||
|  | ||||
|     let mut instruction_pointer: u64 = 0; | ||||
|  | ||||
|     while let Some((opcode, operand)) = instructions.get(instruction_pointer as usize) { | ||||
|         let opcode = OpCodes::try_from(*opcode).unwrap(); | ||||
|         if let Some((output, skip)) = opcode.exec(operand, &mut registers) { | ||||
|             if skip { | ||||
|                 instruction_pointer = 0; | ||||
|             } else { | ||||
|                 out.push(output); | ||||
|                 instruction_pointer += 1; | ||||
|             } | ||||
|         } else { | ||||
|             instruction_pointer += 1; | ||||
|         } | ||||
|     } | ||||
|     (out.into_iter().join(","), registers) | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) -> u64 { | ||||
|     let (registers, program) = input.split_once("\n\n").unwrap(); | ||||
|     let mut registers = parse_registers(registers); | ||||
|     let (_, instructions) = program.split_once(": ").unwrap(); | ||||
|     let instructions = instructions | ||||
|         .lines() | ||||
|         .map(|line| { | ||||
|             line.split(",") | ||||
|                 .collect_vec() | ||||
|                 .chunks(2) | ||||
|                 .map(|chunk| (chunk[0], chunk[1])) | ||||
|                 .collect_vec() | ||||
|         }) | ||||
|         .collect_vec() | ||||
|         .concat(); | ||||
|     let orig = instructions | ||||
|         .iter() | ||||
|         .map(|(opcode, operand)| { | ||||
|             [ | ||||
|                 opcode.parse::<u64>().unwrap(), | ||||
|                 operand.parse::<u64>().unwrap(), | ||||
|             ] | ||||
|         }) | ||||
|         .collect_vec() | ||||
|         .concat(); | ||||
|     let mut a = 0; | ||||
|     for idx in 1..=orig.len() { | ||||
|         let target = orig[orig.len() - idx..].to_vec(); | ||||
|  | ||||
|         let mut new_a = a << 3; | ||||
|         loop { | ||||
|             registers.insert("A", new_a); | ||||
|             let out = exec_program(instructions.clone(), &mut registers); | ||||
|             //println!("target {target:?}"); | ||||
|             //println!("output {out:?}"); | ||||
|             if out == target { | ||||
|                 a = new_a; | ||||
|                 break; | ||||
|             } | ||||
|             new_a += 1; | ||||
|         } | ||||
|     } | ||||
|     a | ||||
| } | ||||
|  | ||||
| fn exec_program(instructions: Vec<(&str, &str)>, registers: &mut HashMap<&str, u64>) -> Vec<u64> { | ||||
|     let mut out = Vec::new(); | ||||
|     let mut instruction_pointer: u64 = 0; | ||||
|  | ||||
|     while let Some((opcode, operand)) = instructions.get(instruction_pointer as usize) { | ||||
|         let opcode = OpCodes::try_from(*opcode).unwrap(); | ||||
|         if let Some((output, skip)) = opcode.exec(operand, registers) { | ||||
|             if skip { | ||||
|                 instruction_pointer = 0; | ||||
|             } else { | ||||
|                 out.push(output); | ||||
|                 instruction_pointer += 1; | ||||
|             } | ||||
|         } else { | ||||
|             instruction_pointer += 1; | ||||
|         } | ||||
|     } | ||||
|     out | ||||
| } | ||||
|  | ||||
| fn parse_registers(input: &str) -> HashMap<&str, u64> { | ||||
|     let mut registers = HashMap::new(); | ||||
|     input.lines().for_each(|line| { | ||||
|         let (register, value) = line.split_once(": ").unwrap(); | ||||
|         let (_, register) = register.split_once(" ").unwrap(); | ||||
|         let value = value.parse().unwrap(); | ||||
|         registers.insert(register, value); | ||||
|     }); | ||||
|     registers | ||||
| } | ||||
|  | ||||
| #[derive(Debug)] | ||||
| enum OpCodes { | ||||
|     Adv, | ||||
|     Bxl, | ||||
|     Bst, | ||||
|     Jnz, | ||||
|     Bxc, | ||||
|     Out, | ||||
|     Bdv, | ||||
|     Cdv, | ||||
| } | ||||
|  | ||||
| impl OpCodes { | ||||
|     fn exec(&self, operand: &str, registers: &mut HashMap<&str, u64>) -> Option<(u64, bool)> { | ||||
|         let a = *registers.get("A").unwrap(); | ||||
|         let b = *registers.get("B").unwrap(); | ||||
|         let c = *registers.get("C").unwrap(); | ||||
|         let operand: u64 = operand.parse().unwrap(); | ||||
|         let combo = if operand <= 3 { | ||||
|             operand | ||||
|         } else if operand == 4 { | ||||
|             a | ||||
|         } else if operand == 5 { | ||||
|             b | ||||
|         } else if operand == 6 { | ||||
|             c | ||||
|         } else { | ||||
|             0 | ||||
|         }; | ||||
|         match self { | ||||
|             OpCodes::Adv => { | ||||
|                 //println!( | ||||
|                 //    "a = a / 2 ** combo = {a} / 2 ** {combo} = {}", | ||||
|                 //    a / 2_u64.pow(combo) | ||||
|                 //); | ||||
|                 registers.insert("A", a / 2_u64.pow(combo as u32)); | ||||
|                 None | ||||
|             } | ||||
|             OpCodes::Bxl => { | ||||
|                 //println!("b = b xor operand = {b} xor {operand} = {}", b ^ operand); | ||||
|                 registers.insert("B", b ^ operand); | ||||
|                 None | ||||
|             } | ||||
|             OpCodes::Bst => { | ||||
|                 //println!("b = combo mod 8 = {combo} mod 8 = {}", combo % 8); | ||||
|                 registers.insert("B", combo % 8); | ||||
|                 None | ||||
|             } | ||||
|             OpCodes::Jnz => { | ||||
|                 if a != 0 { | ||||
|                     //println!("jump {operand}"); | ||||
|                     Some((operand, true)) | ||||
|                 } else { | ||||
|                     //println!("don't jump"); | ||||
|                     None | ||||
|                 } | ||||
|             } | ||||
|             OpCodes::Bxc => { | ||||
|                 //println!("b = b xor c = {b} xor {c} = {}", b ^ c); | ||||
|                 registers.insert("B", b ^ c); | ||||
|                 None | ||||
|             } | ||||
|             OpCodes::Out => { | ||||
|                 //println!("out {combo} % 8 = {}", combo % 8); | ||||
|                 Some((combo % 8, false)) | ||||
|             } | ||||
|             OpCodes::Bdv => { | ||||
|                 //println!( | ||||
|                 //    "b = a / 2 ** combo = {a} / 2 ** {combo} = {}", | ||||
|                 //    a / 2_u64.pow(combo) | ||||
|                 //); | ||||
|                 registers.insert("B", a / 2_u64.pow(combo as u32)); | ||||
|                 None | ||||
|             } | ||||
|             OpCodes::Cdv => { | ||||
|                 //println!( | ||||
|                 //    "c = a / 2 ** combo = {a} / 2 ** {combo} = {}", | ||||
|                 //    a / 2_u64.pow(combo) | ||||
|                 //); | ||||
|                 registers.insert("C", a / 2_u64.pow(combo as u32)); | ||||
|                 None | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl TryFrom<&str> for OpCodes { | ||||
|     type Error = Box<dyn Error>; | ||||
|  | ||||
|     fn try_from(value: &str) -> std::result::Result<OpCodes, Box<dyn Error>> { | ||||
|         match value { | ||||
|             "0" => Ok(Self::Adv), | ||||
|             "1" => Ok(Self::Bxl), | ||||
|             "2" => Ok(Self::Bst), | ||||
|             "3" => Ok(Self::Jnz), | ||||
|             "4" => Ok(Self::Bxc), | ||||
|             "5" => Ok(Self::Out), | ||||
|             "6" => Ok(Self::Bdv), | ||||
|             "7" => Ok(Self::Cdv), | ||||
|             _ => Err(Box::from(format!("{value} is not a valid OpCode"))), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT_MAIN: &str = "Register A: 729 | ||||
| Register B: 0 | ||||
| Register C: 0 | ||||
|  | ||||
| Program: 0,1,5,4,3,0"; | ||||
|  | ||||
|     const INPUT_SMALL_1: &str = "Register A: 0 | ||||
| Register B: 0 | ||||
| Register C: 9 | ||||
|  | ||||
| Program: 2,6"; | ||||
|  | ||||
|     const INPUT_SMALL_2: &str = "Register A: 10 | ||||
| Register B: 0 | ||||
| Register C: 0 | ||||
|  | ||||
| Program: 5,0,5,1,5,4"; | ||||
|  | ||||
|     const INPUT_SMALL_3: &str = "Register A: 2024 | ||||
| Register B: 0 | ||||
| Register C: 0 | ||||
|  | ||||
| Program: 0,1,5,4,3,0"; | ||||
|  | ||||
|     const INPUT_SMALL_4: &str = "Register A: 0 | ||||
| Register B: 29 | ||||
| Register C: 0 | ||||
|  | ||||
| Program: 1,7"; | ||||
|  | ||||
|     const INPUT_SMALL_5: &str = "Register A: 0 | ||||
| Register B: 2024 | ||||
| Register C: 43690 | ||||
|  | ||||
| Program: 4,0"; | ||||
|  | ||||
|     const INPUT_COPY: &str = "Register A: 2024 | ||||
| Register B: 0 | ||||
| Register C: 0 | ||||
|  | ||||
| Program: 0,3,5,4,3,0"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_main() { | ||||
|         let result = process_part1(INPUT_MAIN); | ||||
|         assert_eq!(result.0, "4,6,3,5,6,3,5,2,1,0".to_string()); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_small_1() { | ||||
|         let result = process_part1(INPUT_SMALL_1); | ||||
|         assert_eq!(result.1.get("B").unwrap(), &1); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_small_2() { | ||||
|         let result = process_part1(INPUT_SMALL_2); | ||||
|         assert_eq!(result.0, "0,1,2".to_string()); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_small_3() { | ||||
|         let result = process_part1(INPUT_SMALL_3); | ||||
|         assert_eq!(result.1.get("A").unwrap(), &0); | ||||
|         assert_eq!(result.0, "4,2,5,6,7,7,7,7,3,1,0".to_string()); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_small_4() { | ||||
|         let result = process_part1(INPUT_SMALL_4); | ||||
|         assert_eq!(result.1.get("B").unwrap(), &26); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_small_5() { | ||||
|         let result = process_part1(INPUT_SMALL_5); | ||||
|         assert_eq!(result.1.get("B").unwrap(), &44354); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2() { | ||||
|         let result = process_part2(INPUT_COPY); | ||||
|         assert_eq!(result, 117440); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										294
									
								
								y2024/src/days/d18.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								y2024/src/days/d18.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,294 @@ | ||||
| use std::{collections::HashSet, error::Error}; | ||||
|  | ||||
| use itertools::Itertools; | ||||
|  | ||||
| pub fn process_part1(input: &str) -> u32 { | ||||
|     let falling_bytes = &input | ||||
|         .lines() | ||||
|         .map(|line| { | ||||
|             let (x, y) = line.split_once(",").unwrap(); | ||||
|             (x.parse().unwrap(), y.parse().unwrap()) | ||||
|         }) | ||||
|         .collect_vec()[..1024]; | ||||
|     let y_walls = vec![GridTile::Wall; 73]; | ||||
|     let mut inner_rows = vec![GridTile::Path; 71]; | ||||
|     inner_rows.insert(0, GridTile::Wall); | ||||
|     inner_rows.push(GridTile::Wall); | ||||
|     let mut grid = vec![inner_rows; 71]; | ||||
|     grid.insert(0, y_walls.clone()); | ||||
|     grid.push(y_walls); | ||||
|     simulate(grid, falling_bytes).unwrap() | ||||
| } | ||||
|  | ||||
| fn simulate(mut grid: Vec<Vec<GridTile>>, falling_bytes: &[(usize, usize)]) -> Option<u32> { | ||||
|     grid[1][1] = GridTile::Start; | ||||
|     let height = grid.len(); | ||||
|     let width = grid[0].len(); | ||||
|     grid[height - 2][width - 2] = GridTile::End; | ||||
|     falling_bytes.iter().for_each(|(x, y)| { | ||||
|         grid[*y + 1][*x + 1] = GridTile::Wall; | ||||
|     }); | ||||
|     let mut visited = HashSet::new(); | ||||
|     visited.insert((1, 1)); | ||||
|     let mut next_paths = vec![MazeRunner { | ||||
|         coords: (1, 1), | ||||
|         visited: visited.clone(), | ||||
|         ..Default::default() | ||||
|     }]; | ||||
|     let mut arrived: Vec<MazeRunner> = Vec::new(); | ||||
|     while !next_paths.is_empty() { | ||||
|         next_paths = next_paths | ||||
|             .iter() | ||||
|             .map(|maze_runner| { | ||||
|                 let mut paths = Vec::new(); | ||||
|                 if let Some(path) = maze_runner.get_next(&grid, Direction::Up) { | ||||
|                     paths.push(path); | ||||
|                 } | ||||
|                 if let Some(path) = maze_runner.get_next(&grid, Direction::Down) { | ||||
|                     paths.push(path); | ||||
|                 } | ||||
|                 if let Some(path) = maze_runner.get_next(&grid, Direction::Left) { | ||||
|                     paths.push(path); | ||||
|                 } | ||||
|                 if let Some(path) = maze_runner.get_next(&grid, Direction::Right) { | ||||
|                     paths.push(path); | ||||
|                 } | ||||
|                 paths | ||||
|             }) | ||||
|             .collect_vec() | ||||
|             .concat(); | ||||
|         for (idx, maze_runner) in next_paths.clone().iter().enumerate().rev() { | ||||
|             if maze_runner.visited.contains(&maze_runner.coords) | ||||
|                 || visited.contains(&maze_runner.coords) | ||||
|             { | ||||
|                 next_paths.remove(idx); | ||||
|                 continue; | ||||
|             } | ||||
|             visited.insert(maze_runner.coords); | ||||
|             next_paths[idx].visited.insert(maze_runner.coords); | ||||
|             if maze_runner.state == State::Arrived { | ||||
|                 let arrived_reindeer = next_paths.remove(idx); | ||||
|                 arrived.push(arrived_reindeer); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     //let visited = arrived | ||||
|     //    .iter() | ||||
|     //    .map(|reindeer| { | ||||
|     //        reindeer | ||||
|     //            .visited | ||||
|     //            .iter() | ||||
|     //            .map(|(coords, _)| coords) | ||||
|     //            .collect_vec() | ||||
|     //    }) | ||||
|     //    .collect_vec() | ||||
|     //    .concat(); | ||||
|     //visited.iter().unique().count() | ||||
|     arrived.sort_by(|a_runner, b_runner| a_runner.visited.len().cmp(&b_runner.visited.len())); | ||||
|     if let Some(arrived) = arrived.first() { | ||||
|         log_maze(&grid, arrived); | ||||
|         Some(arrived.visited.len() as u32 - 1) | ||||
|     } else { | ||||
|         None | ||||
|     } | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) -> String { | ||||
|     let falling_bytes = &input | ||||
|         .lines() | ||||
|         .map(|line| { | ||||
|             let (x, y) = line.split_once(",").unwrap(); | ||||
|             (x.parse::<usize>().unwrap(), y.parse::<usize>().unwrap()) | ||||
|         }) | ||||
|         .collect_vec(); | ||||
|     let y_walls = vec![GridTile::Wall; 73]; | ||||
|     let mut inner_rows = vec![GridTile::Path; 71]; | ||||
|     inner_rows.insert(0, GridTile::Wall); | ||||
|     inner_rows.push(GridTile::Wall); | ||||
|     let mut grid = vec![inner_rows; 71]; | ||||
|     grid.insert(0, y_walls.clone()); | ||||
|     grid.push(y_walls); | ||||
|     let mut num_bytes = 1025; | ||||
|     while simulate(grid.clone(), &falling_bytes[..num_bytes]).is_some() { | ||||
|         num_bytes += 1; | ||||
|     } | ||||
|     let (x, y) = falling_bytes[num_bytes - 1]; | ||||
|     format!("{x},{y}") | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, PartialEq, Eq)] | ||||
| enum Direction { | ||||
|     Up, | ||||
|     Down, | ||||
|     Left, | ||||
|     Right, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Default, Clone, PartialEq, Eq)] | ||||
| enum State { | ||||
|     #[default] | ||||
|     Going, | ||||
|     Arrived, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Default, Clone, PartialEq, Eq)] | ||||
| struct MazeRunner { | ||||
|     coords: (usize, usize), | ||||
|     visited: HashSet<(usize, usize)>, | ||||
|     state: State, | ||||
| } | ||||
|  | ||||
| impl MazeRunner { | ||||
|     fn get_next(&self, grid: &[Vec<GridTile>], direction: Direction) -> Option<MazeRunner> { | ||||
|         let tile = match direction { | ||||
|             Direction::Up => grid[self.coords.1 - 1][self.coords.0], | ||||
|             Direction::Down => grid[self.coords.1 + 1][self.coords.0], | ||||
|             Direction::Right => grid[self.coords.1][self.coords.0 + 1], | ||||
|             Direction::Left => grid[self.coords.1][self.coords.0 - 1], | ||||
|         }; | ||||
|         let coords = match direction { | ||||
|             Direction::Up => (self.coords.0, self.coords.1 - 1), | ||||
|             Direction::Down => (self.coords.0, self.coords.1 + 1), | ||||
|             Direction::Left => (self.coords.0 - 1, self.coords.1), | ||||
|             Direction::Right => (self.coords.0 + 1, self.coords.1), | ||||
|         }; | ||||
|         if tile == GridTile::Wall { | ||||
|             None | ||||
|         } else if tile == GridTile::End { | ||||
|             Some(MazeRunner { | ||||
|                 state: State::Arrived, | ||||
|                 coords, | ||||
|                 ..self.clone() | ||||
|             }) | ||||
|         } else { | ||||
|             Some(MazeRunner { | ||||
|                 coords, | ||||
|                 ..self.clone() | ||||
|             }) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)] | ||||
| enum GridTile { | ||||
|     Wall, | ||||
|     #[default] | ||||
|     Path, | ||||
|     Start, | ||||
|     End, | ||||
| } | ||||
|  | ||||
| impl TryFrom<char> for GridTile { | ||||
|     type Error = Box<dyn Error>; | ||||
|  | ||||
|     fn try_from(value: char) -> std::result::Result<GridTile, Box<dyn Error>> { | ||||
|         match value { | ||||
|             '#' => Ok(Self::Wall), | ||||
|             '.' => Ok(Self::Path), | ||||
|             'S' => Ok(Self::Start), | ||||
|             'E' => Ok(Self::End), | ||||
|             _ => Err(Box::from(format!("{value} is not a valid tile"))), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| fn log_maze(grid: &[Vec<GridTile>], maze_runner: &MazeRunner) { | ||||
|     for (yidx, row) in grid.iter().enumerate() { | ||||
|         for (xidx, tile) in row.iter().enumerate() { | ||||
|             let contains = { | ||||
|                 maze_runner.visited.contains(&(xidx, yidx)) | ||||
|                     || maze_runner.visited.contains(&(xidx, yidx)) | ||||
|                     || maze_runner.visited.contains(&(xidx, yidx)) | ||||
|                     || maze_runner.visited.contains(&(xidx, yidx)) | ||||
|             }; | ||||
|             if contains && !(*tile == GridTile::Start || *tile == GridTile::End) { | ||||
|                 print!("O"); | ||||
|             } else if *tile == GridTile::Wall { | ||||
|                 print!("#"); | ||||
|             } else if *tile == GridTile::Path { | ||||
|                 print!("."); | ||||
|             } else if *tile == GridTile::Start { | ||||
|                 print!("S"); | ||||
|             } else if *tile == GridTile::End { | ||||
|                 print!("E"); | ||||
|             } | ||||
|         } | ||||
|         println!(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT: &str = "5,4 | ||||
| 4,2 | ||||
| 4,5 | ||||
| 3,0 | ||||
| 2,1 | ||||
| 6,3 | ||||
| 2,4 | ||||
| 1,5 | ||||
| 0,6 | ||||
| 3,3 | ||||
| 2,6 | ||||
| 5,1 | ||||
| 1,2 | ||||
| 5,5 | ||||
| 2,5 | ||||
| 6,5 | ||||
| 1,4 | ||||
| 0,4 | ||||
| 6,4 | ||||
| 1,1 | ||||
| 6,1 | ||||
| 1,0 | ||||
| 0,5 | ||||
| 1,6 | ||||
| 2,0"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1() { | ||||
|         let falling_bytes = &INPUT | ||||
|             .lines() | ||||
|             .map(|line| { | ||||
|                 let (x, y) = line.split_once(",").unwrap(); | ||||
|                 (x.parse().unwrap(), y.parse().unwrap()) | ||||
|             }) | ||||
|             .collect_vec()[..12]; | ||||
|         let y_walls = vec![GridTile::Wall; 9]; | ||||
|         let mut inner_rows = vec![GridTile::Path; 7]; | ||||
|         inner_rows.insert(0, GridTile::Wall); | ||||
|         inner_rows.push(GridTile::Wall); | ||||
|         let mut grid = vec![inner_rows; 7]; | ||||
|         grid.insert(0, y_walls.clone()); | ||||
|         grid.push(y_walls); | ||||
|         let result = simulate(grid, falling_bytes); | ||||
|         assert_eq!(result, Some(22)); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2() { | ||||
|         let falling_bytes = INPUT | ||||
|             .lines() | ||||
|             .map(|line| { | ||||
|                 let (x, y) = line.split_once(",").unwrap(); | ||||
|                 (x.parse::<usize>().unwrap(), y.parse::<usize>().unwrap()) | ||||
|             }) | ||||
|             .collect_vec(); | ||||
|         let y_walls = vec![GridTile::Wall; 9]; | ||||
|         let mut inner_rows = vec![GridTile::Path; 7]; | ||||
|         inner_rows.insert(0, GridTile::Wall); | ||||
|         inner_rows.push(GridTile::Wall); | ||||
|         let mut grid = vec![inner_rows; 7]; | ||||
|         grid.insert(0, y_walls.clone()); | ||||
|         grid.push(y_walls); | ||||
|         let mut num_bytes = 12; | ||||
|         while simulate(grid.clone(), &falling_bytes[..num_bytes]).is_some() { | ||||
|             num_bytes += 1; | ||||
|         } | ||||
|         let (x, y) = falling_bytes[num_bytes - 1]; | ||||
|         let result = format!("{x},{y}"); | ||||
|         assert_eq!(result, "6,1".to_string()); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										96
									
								
								y2024/src/days/d19.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								y2024/src/days/d19.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,96 @@ | ||||
| use std::collections::HashMap; | ||||
|  | ||||
| use itertools::Itertools; | ||||
|  | ||||
| pub fn process_part1(input: &str) -> u64 { | ||||
|     let (patterns, designs) = input.split_once("\n\n").unwrap(); | ||||
|     let patterns = patterns.split(", ").collect_vec(); | ||||
|     designs | ||||
|         .lines() | ||||
|         .map(|design| { | ||||
|             if possible_design(design, &patterns) { | ||||
|                 1 | ||||
|             } else { | ||||
|                 0 | ||||
|             } | ||||
|         }) | ||||
|         .sum() | ||||
| } | ||||
|  | ||||
| fn possible_design(design: &str, patterns: &[&str]) -> bool { | ||||
|     for pattern in patterns { | ||||
|         if design.starts_with(pattern) && design.len() == pattern.len() { | ||||
|             return true; | ||||
|         } else if design.starts_with(pattern) { | ||||
|             if let Some(stripped) = design.strip_prefix(pattern) { | ||||
|                 if possible_design(stripped, patterns) { | ||||
|                     return true; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     false | ||||
| } | ||||
|  | ||||
| fn possible_designs(design: &str, patterns: &[&str], memo: &mut HashMap<String, u64>) -> u64 { | ||||
|     if design.is_empty() { | ||||
|         return 0; | ||||
|     } | ||||
|     let mut num_possible_designs = 0; | ||||
|     if let Some(count) = memo.get(design) { | ||||
|         return *count; | ||||
|     } | ||||
|     for pattern in patterns { | ||||
|         if design == *pattern { | ||||
|             memo.insert(design.to_string(), 1); | ||||
|             num_possible_designs += 1; | ||||
|         } | ||||
|         if design.starts_with(pattern) { | ||||
|             if let Some(stripped) = design.strip_prefix(pattern) { | ||||
|                 let for_stripped = possible_designs(stripped, patterns, memo); | ||||
|                 memo.entry(stripped.to_string()).or_insert(for_stripped); | ||||
|                 num_possible_designs += for_stripped; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     memo.insert(design.to_string(), num_possible_designs); | ||||
|     num_possible_designs | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) -> u64 { | ||||
|     let (patterns, designs) = input.split_once("\n\n").unwrap(); | ||||
|     let patterns = patterns.split(", ").collect_vec(); | ||||
|     let mut memo = HashMap::new(); | ||||
|     designs | ||||
|         .lines() | ||||
|         .map(|design| possible_designs(design, &patterns, &mut memo)) | ||||
|         .sum() | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT: &str = "r, wr, b, g, bwu, rb, gb, br | ||||
|  | ||||
| brwrr | ||||
| bggr | ||||
| gbbr | ||||
| rrbgbr | ||||
| ubwu | ||||
| bwurrg | ||||
| brgr | ||||
| bbrgwb"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1() { | ||||
|         let result = process_part1(INPUT); | ||||
|         assert_eq!(result, 6); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2() { | ||||
|         let result = process_part2(INPUT); | ||||
|         assert_eq!(result, 16); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										232
									
								
								y2024/src/days/d20.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										232
									
								
								y2024/src/days/d20.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,232 @@ | ||||
| use std::{ | ||||
|     collections::{HashMap, HashSet}, | ||||
|     error::Error, | ||||
| }; | ||||
|  | ||||
| use itertools::Itertools; | ||||
|  | ||||
| pub fn process_part1(input: &str) -> u32 { | ||||
|     simulate_all(input, 100, 2).values().copied().sum() | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) -> u32 { | ||||
|     simulate_all(input, 100, 20).values().copied().sum() | ||||
| } | ||||
|  | ||||
| fn simulate_all(input: &str, time_to_save: usize, max_cheat_time: usize) -> HashMap<u32, u32> { | ||||
|     let mut start = (0, 0); | ||||
|     let grid = input | ||||
|         .lines() | ||||
|         .enumerate() | ||||
|         .map(|(yidx, row)| { | ||||
|             row.chars() | ||||
|                 .enumerate() | ||||
|                 .map(|(xidx, chara)| { | ||||
|                     let tile = GridTile::try_from(chara).unwrap(); | ||||
|                     if tile == GridTile::Start { | ||||
|                         start = (xidx, yidx); | ||||
|                     } | ||||
|                     tile | ||||
|                 }) | ||||
|                 .collect_vec() | ||||
|         }) | ||||
|         .collect_vec(); | ||||
|     let no_cheat = simulate(&grid, start); | ||||
|     let mut saved = HashMap::new(); | ||||
|     for (tile_idx, tile) in no_cheat[..no_cheat.len() - time_to_save].iter().enumerate() { | ||||
|         for (cheat_idx, cheat) in no_cheat[tile_idx..].iter().enumerate() { | ||||
|             let manhattan = tile.0.abs_diff(cheat.0) + tile.1.abs_diff(cheat.1); | ||||
|             if manhattan <= max_cheat_time { | ||||
|                 let time_saved = cheat_idx - manhattan; | ||||
|                 if time_saved >= time_to_save { | ||||
|                     saved | ||||
|                         .entry(time_saved as u32) | ||||
|                         .and_modify(|count| *count += 1) | ||||
|                         .or_insert(1); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     saved | ||||
| } | ||||
|  | ||||
| fn simulate(grid: &[Vec<GridTile>], start: (usize, usize)) -> Vec<(usize, usize)> { | ||||
|     let mut visited = HashSet::new(); | ||||
|     visited.insert(start); | ||||
|     let mut next_paths = vec![MazeRunner { | ||||
|         coords: start, | ||||
|         visited: visited.clone(), | ||||
|         ..Default::default() | ||||
|     }]; | ||||
|     let mut visited = Vec::new(); | ||||
|     visited.push(start); | ||||
|     let mut arrived: Vec<MazeRunner> = Vec::new(); | ||||
|     while !next_paths.is_empty() { | ||||
|         next_paths = next_paths | ||||
|             .iter() | ||||
|             .map(|maze_runner| { | ||||
|                 let mut paths = Vec::new(); | ||||
|                 if let Some(path) = maze_runner.get_next(grid, Direction::Up) { | ||||
|                     paths.push(path); | ||||
|                 } | ||||
|                 if let Some(path) = maze_runner.get_next(grid, Direction::Down) { | ||||
|                     paths.push(path); | ||||
|                 } | ||||
|                 if let Some(path) = maze_runner.get_next(grid, Direction::Left) { | ||||
|                     paths.push(path); | ||||
|                 } | ||||
|                 if let Some(path) = maze_runner.get_next(grid, Direction::Right) { | ||||
|                     paths.push(path); | ||||
|                 } | ||||
|                 paths | ||||
|             }) | ||||
|             .collect_vec() | ||||
|             .concat(); | ||||
|         for (idx, maze_runner) in next_paths.clone().iter().enumerate().rev() { | ||||
|             if maze_runner.visited.contains(&maze_runner.coords) | ||||
|                 || visited.contains(&maze_runner.coords) | ||||
|             { | ||||
|                 next_paths.remove(idx); | ||||
|                 continue; | ||||
|             } | ||||
|             visited.push(maze_runner.coords); | ||||
|             next_paths[idx].visited.insert(maze_runner.coords); | ||||
|             if maze_runner.state == State::Arrived { | ||||
|                 let arrived_reindeer = next_paths.remove(idx); | ||||
|                 arrived.push(arrived_reindeer); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|     visited | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, PartialEq, Eq)] | ||||
| enum Direction { | ||||
|     Up, | ||||
|     Down, | ||||
|     Left, | ||||
|     Right, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Default, Clone, PartialEq, Eq)] | ||||
| enum State { | ||||
|     #[default] | ||||
|     Going, | ||||
|     Arrived, | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Default, Clone, PartialEq, Eq)] | ||||
| struct MazeRunner { | ||||
|     coords: (usize, usize), | ||||
|     visited: HashSet<(usize, usize)>, | ||||
|     state: State, | ||||
| } | ||||
|  | ||||
| impl MazeRunner { | ||||
|     fn get_next(&self, grid: &[Vec<GridTile>], direction: Direction) -> Option<MazeRunner> { | ||||
|         let tile = match direction { | ||||
|             Direction::Up => grid[self.coords.1 - 1][self.coords.0], | ||||
|             Direction::Down => grid[self.coords.1 + 1][self.coords.0], | ||||
|             Direction::Right => grid[self.coords.1][self.coords.0 + 1], | ||||
|             Direction::Left => grid[self.coords.1][self.coords.0 - 1], | ||||
|         }; | ||||
|         let coords = match direction { | ||||
|             Direction::Up => (self.coords.0, self.coords.1 - 1), | ||||
|             Direction::Down => (self.coords.0, self.coords.1 + 1), | ||||
|             Direction::Left => (self.coords.0 - 1, self.coords.1), | ||||
|             Direction::Right => (self.coords.0 + 1, self.coords.1), | ||||
|         }; | ||||
|         if tile == GridTile::Wall { | ||||
|             None | ||||
|         } else if tile == GridTile::End { | ||||
|             Some(MazeRunner { | ||||
|                 state: State::Arrived, | ||||
|                 coords, | ||||
|                 ..self.clone() | ||||
|             }) | ||||
|         } else { | ||||
|             Some(MazeRunner { | ||||
|                 coords, | ||||
|                 ..self.clone() | ||||
|             }) | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Default, Clone, Copy, Hash, PartialEq, Eq)] | ||||
| enum GridTile { | ||||
|     Wall, | ||||
|     #[default] | ||||
|     Path, | ||||
|     Start, | ||||
|     End, | ||||
| } | ||||
|  | ||||
| impl TryFrom<char> for GridTile { | ||||
|     type Error = Box<dyn Error>; | ||||
|  | ||||
|     fn try_from(value: char) -> std::result::Result<GridTile, Box<dyn Error>> { | ||||
|         match value { | ||||
|             '#' => Ok(Self::Wall), | ||||
|             '.' => Ok(Self::Path), | ||||
|             'S' => Ok(Self::Start), | ||||
|             'E' => Ok(Self::End), | ||||
|             _ => Err(Box::from(format!("{value} is not a valid tile"))), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use std::time::Instant; | ||||
|  | ||||
|     use utils::time::get_elapsed_string; | ||||
|  | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT: &str = "############### | ||||
| #...#...#.....# | ||||
| #.#.#.#.#.###.# | ||||
| #S#...#.#.#...# | ||||
| #######.#.#.### | ||||
| #######.#.#...# | ||||
| #######.#.###.# | ||||
| ###..E#...#...# | ||||
| ###.#######.### | ||||
| #...###...#...# | ||||
| #.#####.#.###.# | ||||
| #.#...#.#.#...# | ||||
| #.#.#.#.#.#.### | ||||
| #...#...#...### | ||||
| ###############"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1() { | ||||
|         let now = Instant::now(); | ||||
|         println!("Test 2:"); | ||||
|         let result = simulate_all(INPUT, 2, 2); | ||||
|         result | ||||
|             .iter() | ||||
|             .sorted_by(|a, b| a.0.cmp(b.0)) | ||||
|             .for_each(|(saved, count)| { | ||||
|                 println!("There are {count} cheats that saved {saved} picoseconds"); | ||||
|             }); | ||||
|         println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|         assert_eq!(result.values().copied().sum::<u32>(), 44); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2() { | ||||
|         let now = Instant::now(); | ||||
|         println!("Test 2:"); | ||||
|         let result = simulate_all(INPUT, 50, 20); | ||||
|         result | ||||
|             .iter() | ||||
|             .sorted_by(|a, b| a.0.cmp(b.0)) | ||||
|             .for_each(|(saved, count)| { | ||||
|                 println!("There are {count} cheats that saved {saved} picoseconds"); | ||||
|             }); | ||||
|         println!("Ran in {}", get_elapsed_string(now.elapsed())); | ||||
|         assert_eq!(result.values().copied().sum::<u32>(), 285); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										344
									
								
								y2024/src/days/d21.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										344
									
								
								y2024/src/days/d21.rs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,344 @@ | ||||
| use std::{char, collections::HashMap, error::Error, sync::mpsc}; | ||||
|  | ||||
| use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; | ||||
|  | ||||
| pub fn process_part1(input: &str) -> usize { | ||||
|     let mut memo = HashMap::new(); | ||||
|     input | ||||
|         .lines() | ||||
|         .map(|line| { | ||||
|             let numpad = Numpad::from(line); | ||||
|             println!("first robot {}", numpad.sequence); | ||||
|             let _ = Numpad::revert_from(&numpad.sequence); | ||||
|             let keypad_1 = Keypad::from(numpad.sequence.as_str()); | ||||
|             println!("second robot {}", keypad_1.sequence); | ||||
|             let _ = Keypad::revert_from(&keypad_1.sequence); | ||||
|             let keypad_2 = Keypad::from(keypad_1.sequence.as_str()); | ||||
|             println!("me {}", keypad_2.sequence); | ||||
|             let _ = Keypad::revert_from(&keypad_2.sequence); | ||||
|             keypad_2.sequence.len() * numeric_part(line) | ||||
|         }) | ||||
|         .sum() | ||||
| } | ||||
|  | ||||
| fn extend_sequence( | ||||
|     sequence_parts: &[Vec<String>], | ||||
|     memo: &mut HashMap<(char, char), Vec<String>>, | ||||
| ) -> Vec<Vec<String>> { | ||||
|     sequence_parts.iter().map(|possible_parts| { | ||||
|         let (tx, rx) = mpsc::channel(); | ||||
|         let mut new_possible_parts = Vec::new(); | ||||
|         possible_parts.par_iter().for_each(|part| { | ||||
|             let _ = tx.send(); | ||||
|         }); | ||||
|         drop(tx); | ||||
|         while let Ok(part) = rx.recv() { | ||||
|             new_possible_parts.extend_from_slice(part); | ||||
|         } | ||||
|         new_possible_parts | ||||
|     }) | ||||
| } | ||||
|  | ||||
| pub fn process_part2(input: &str) -> usize { | ||||
|     0 | ||||
| } | ||||
|  | ||||
| fn numeric_part(code: &str) -> usize { | ||||
|     let code = &code[..code.len() - 1]; | ||||
|     code.parse().unwrap() | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, Copy)] | ||||
| enum NumpadState { | ||||
|     Seven, | ||||
|     Eight, | ||||
|     Nine, | ||||
|     Four, | ||||
|     Five, | ||||
|     Six, | ||||
|     One, | ||||
|     Two, | ||||
|     Three, | ||||
|     Zero, | ||||
|     A, | ||||
| } | ||||
|  | ||||
| impl NumpadState { | ||||
|     fn get_col(&self) -> i32 { | ||||
|         match self { | ||||
|             NumpadState::Seven | NumpadState::Four | NumpadState::One => 0, | ||||
|             NumpadState::Eight | NumpadState::Five | NumpadState::Two | NumpadState::Zero => 1, | ||||
|             NumpadState::Nine | NumpadState::Six | NumpadState::Three | NumpadState::A => 2, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn get_row(&self) -> i32 { | ||||
|         match self { | ||||
|             NumpadState::Seven | NumpadState::Eight | NumpadState::Nine => 0, | ||||
|             NumpadState::Four | NumpadState::Five | NumpadState::Six => 1, | ||||
|             NumpadState::One | NumpadState::Two | NumpadState::Three => 2, | ||||
|             NumpadState::Zero | NumpadState::A => 3, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn get_sequences(&self, goto: NumpadState) -> Vec<String> { | ||||
|         let row = self.get_row(); | ||||
|         let col = self.get_col(); | ||||
|         let goto_row = goto.get_row(); | ||||
|         let goto_col = goto.get_col(); | ||||
|         if row == goto_row && col == goto_col { | ||||
|             return vec!["A".to_string()]; | ||||
|         } | ||||
|         let row_diff = row.abs_diff(goto_row); | ||||
|         let col_diff = col.abs_diff(goto_col); | ||||
|         let mut sequence = String::new(); | ||||
|         let row_seq = match goto_row.cmp(&row) { | ||||
|             std::cmp::Ordering::Less => vec!["^"; row_diff as usize].join(""), | ||||
|             std::cmp::Ordering::Equal => "".to_string(), | ||||
|             std::cmp::Ordering::Greater => vec!["v"; row_diff as usize].join(""), | ||||
|         }; | ||||
|         let col_seq = match goto_col.cmp(&col) { | ||||
|             std::cmp::Ordering::Less => vec!["<"; col_diff as usize].join(""), | ||||
|             std::cmp::Ordering::Equal => "".to_string(), | ||||
|             std::cmp::Ordering::Greater => vec![">"; col_diff as usize].join(""), | ||||
|         }; | ||||
|         if (goto_col < col && row < 3) || col == 0 { | ||||
|             sequence.push_str(&col_seq); | ||||
|             sequence.push_str(&row_seq); | ||||
|         } else { | ||||
|             sequence.push_str(&row_seq); | ||||
|             sequence.push_str(&col_seq); | ||||
|         } | ||||
|         sequence.push('A'); | ||||
|         sequence | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl TryFrom<char> for NumpadState { | ||||
|     type Error = Box<dyn Error>; | ||||
|  | ||||
|     fn try_from(value: char) -> Result<Self, Self::Error> { | ||||
|         match value { | ||||
|             'A' => Ok(NumpadState::A), | ||||
|             '0' => Ok(NumpadState::Zero), | ||||
|             '1' => Ok(NumpadState::One), | ||||
|             '2' => Ok(NumpadState::Two), | ||||
|             '3' => Ok(NumpadState::Three), | ||||
|             '4' => Ok(NumpadState::Four), | ||||
|             '5' => Ok(NumpadState::Five), | ||||
|             '6' => Ok(NumpadState::Six), | ||||
|             '7' => Ok(NumpadState::Seven), | ||||
|             '8' => Ok(NumpadState::Eight), | ||||
|             '9' => Ok(NumpadState::Nine), | ||||
|             _ => Err(Box::from("Unrecognised keystate")), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl TryFrom<(usize, usize)> for NumpadState { | ||||
|     type Error = Box<dyn Error>; | ||||
|  | ||||
|     fn try_from(value: (usize, usize)) -> Result<Self, Self::Error> { | ||||
|         match value { | ||||
|             (2, 3) => Ok(NumpadState::A), | ||||
|             (1, 3) => Ok(NumpadState::Zero), | ||||
|             (0, 2) => Ok(NumpadState::One), | ||||
|             (1, 2) => Ok(NumpadState::Two), | ||||
|             (2, 2) => Ok(NumpadState::Three), | ||||
|             (0, 1) => Ok(NumpadState::Four), | ||||
|             (1, 1) => Ok(NumpadState::Five), | ||||
|             (2, 1) => Ok(NumpadState::Six), | ||||
|             (0, 0) => Ok(NumpadState::Seven), | ||||
|             (1, 0) => Ok(NumpadState::Eight), | ||||
|             (2, 0) => Ok(NumpadState::Nine), | ||||
|             (0, 3) => Err(Box::from("Robot arm hovering over numpad gap")), | ||||
|             (x, y) => { | ||||
|                 let err = format!("Unrecognised numpad key coord ({x}, {y})"); | ||||
|                 Err(err.into()) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<NumpadState> for char { | ||||
|     fn from(value: NumpadState) -> Self { | ||||
|         match value { | ||||
|             NumpadState::Seven => '7', | ||||
|             NumpadState::Eight => '8', | ||||
|             NumpadState::Nine => '9', | ||||
|             NumpadState::Four => '4', | ||||
|             NumpadState::Five => '5', | ||||
|             NumpadState::Six => '6', | ||||
|             NumpadState::One => '1', | ||||
|             NumpadState::Two => '2', | ||||
|             NumpadState::Three => '3', | ||||
|             NumpadState::Zero => '0', | ||||
|             NumpadState::A => 'A', | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Debug, Clone, Copy)] | ||||
| enum KeypadState { | ||||
|     Up, | ||||
|     A, | ||||
|     Left, | ||||
|     Down, | ||||
|     Right, | ||||
| } | ||||
|  | ||||
| impl KeypadState { | ||||
|     fn get_col(&self) -> i32 { | ||||
|         match self { | ||||
|             KeypadState::Left => 0, | ||||
|             KeypadState::Up | KeypadState::Down => 1, | ||||
|             KeypadState::A | KeypadState::Right => 2, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn get_row(&self) -> i32 { | ||||
|         match self { | ||||
|             KeypadState::Up | KeypadState::A => 0, | ||||
|             KeypadState::Left | KeypadState::Down | KeypadState::Right => 1, | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     fn get_sequence(&self, goto: KeypadState) -> Vec<String> { | ||||
|         let row = self.get_row(); | ||||
|         let col = self.get_col(); | ||||
|         let goto_row = goto.get_row(); | ||||
|         let goto_col = goto.get_col(); | ||||
|         if row == goto_row && col == goto_col { | ||||
|             return vec!["A".to_string()]; | ||||
|         } | ||||
|         let row_diff = row.abs_diff(goto_row); | ||||
|         let col_diff = col.abs_diff(goto_col); | ||||
|         let mut sequence = String::new(); | ||||
|         let row_seq = match goto_row.cmp(&row) { | ||||
|             std::cmp::Ordering::Less => vec!["^"; row_diff as usize].join(""), | ||||
|             std::cmp::Ordering::Equal => "".to_string(), | ||||
|             std::cmp::Ordering::Greater => vec!["v"; row_diff as usize].join(""), | ||||
|         }; | ||||
|         let col_seq = match goto_col.cmp(&col) { | ||||
|             std::cmp::Ordering::Less => vec!["<"; col_diff as usize].join(""), | ||||
|             std::cmp::Ordering::Equal => "".to_string(), | ||||
|             std::cmp::Ordering::Greater => vec![">"; col_diff as usize].join(""), | ||||
|         }; | ||||
|         if (goto_col < col && row == 1) || col == 0 { | ||||
|             sequence.push_str(&col_seq); | ||||
|             sequence.push_str(&row_seq); | ||||
|         } else { | ||||
|             sequence.push_str(&row_seq); | ||||
|             sequence.push_str(&col_seq); | ||||
|         } | ||||
|         sequence.push('A'); | ||||
|         sequence | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl TryFrom<char> for KeypadState { | ||||
|     type Error = Box<dyn Error>; | ||||
|  | ||||
|     fn try_from(value: char) -> Result<Self, Self::Error> { | ||||
|         match value { | ||||
|             'A' => Ok(KeypadState::A), | ||||
|             '<' => Ok(KeypadState::Left), | ||||
|             '>' => Ok(KeypadState::Right), | ||||
|             'v' => Ok(KeypadState::Down), | ||||
|             '^' => Ok(KeypadState::Up), | ||||
|             _ => Err(Box::from("Unrecognised keystate")), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl TryFrom<(usize, usize)> for KeypadState { | ||||
|     type Error = Box<dyn Error>; | ||||
|  | ||||
|     fn try_from(value: (usize, usize)) -> Result<Self, Self::Error> { | ||||
|         match value { | ||||
|             (2, 0) => Ok(KeypadState::A), | ||||
|             (0, 1) => Ok(KeypadState::Left), | ||||
|             (2, 1) => Ok(KeypadState::Right), | ||||
|             (1, 1) => Ok(KeypadState::Down), | ||||
|             (1, 0) => Ok(KeypadState::Up), | ||||
|             (0, 0) => Err(Box::from("Robot arm hovering over keypad gap")), | ||||
|             (x, y) => { | ||||
|                 let err = format!("Unrecognised key coord ({x}, {y})"); | ||||
|                 Err(err.into()) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| impl From<KeypadState> for char { | ||||
|     fn from(value: KeypadState) -> Self { | ||||
|         match value { | ||||
|             KeypadState::A => 'A', | ||||
|             KeypadState::Up => '^', | ||||
|             KeypadState::Left => '<', | ||||
|             KeypadState::Down => 'v', | ||||
|             KeypadState::Right => '>', | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[cfg(test)] | ||||
| mod tests { | ||||
|     use super::*; | ||||
|  | ||||
|     const INPUT_1: &str = "029A"; | ||||
|     const INPUT_2: &str = "980A"; | ||||
|     const INPUT_3: &str = "179A"; | ||||
|     const INPUT_4: &str = "456A"; | ||||
|     const INPUT_5: &str = "379A"; | ||||
|  | ||||
|     const INPUT_1_BACK: &str = | ||||
|         "<vA<AA>>^AvAA<^A>A<v<A>>^AvA^A<vA>^A<v<A>^A>AAvA^A<v<A>A>^AAAvA<^A>A"; | ||||
|     const INPUT_2_BACK: &str = "<v<A>>^AAAvA^A<vA<AA>>^AvAA<^A>A<v<A>A>^AAAvA<^A>A<vA>^A<A>A"; | ||||
|     const INPUT_3_BACK: &str = | ||||
|         "<v<A>>^A<vA<A>>^AAvAA<^A>A<v<A>>^AAvA^A<vA>^AA<A>A<v<A>A>^AAAvA<^A>A"; | ||||
|     const INPUT_4_BACK: &str = "<v<A>>^AA<vA<A>>^AAvAA<^A>A<vA>^A<A>A<vA>^A<A>A<v<A>A>^AAvA<^A>A"; | ||||
|     const INPUT_5_BACK: &str = "<v<A>>^AvA^A<vA<AA>>^AAvA<^A>AAvA^A<vA>^AA<A>A<v<A>A>^AAAvA<^A>A"; | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_full() { | ||||
|         let result = process_part1(&[INPUT_1, INPUT_2, INPUT_3, INPUT_4, INPUT_5].join("\n")); | ||||
|         assert_eq!(result, 126384); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_1() { | ||||
|         let result = process_part1(INPUT_1); | ||||
|         assert_eq!(result, 29 * 68); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_2() { | ||||
|         let result = process_part1(INPUT_2); | ||||
|         assert_eq!(result, 60 * 980); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_3() { | ||||
|         let result = process_part1(INPUT_3); | ||||
|         assert_eq!(result, 68 * 179); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_4() { | ||||
|         let result = process_part1(INPUT_4); | ||||
|         assert_eq!(result, 64 * 456); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part1_5() { | ||||
|         let result = process_part1(INPUT_5); | ||||
|         assert_eq!(result, 64 * 379); | ||||
|     } | ||||
|  | ||||
|     #[test] | ||||
|     fn part2() { | ||||
|         let result = process_part2(INPUT_1); | ||||
|         assert_eq!(result, 0); | ||||
|     } | ||||
| } | ||||
| @@ -9,3 +9,25 @@ pub mod d8; | ||||
| pub mod d9; | ||||
|  | ||||
| pub mod d10; | ||||
|  | ||||
| pub mod d11; | ||||
|  | ||||
| pub mod d12; | ||||
|  | ||||
| pub mod d13; | ||||
|  | ||||
| pub mod d14; | ||||
|  | ||||
| pub mod d15; | ||||
|  | ||||
| pub mod d16; | ||||
|  | ||||
| pub mod d17; | ||||
|  | ||||
| pub mod d18; | ||||
|  | ||||
| pub mod d19; | ||||
|  | ||||
| pub mod d20; | ||||
|  | ||||
| pub mod d21; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user