├── .editorconfig ├── .gitattributes ├── .github └── FUNDING.yml ├── .gitignore ├── LICENSE ├── README.md ├── day01a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day01b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day02a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day02b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day03a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day03b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day04a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day04b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day05a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day05b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day06a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day06b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day07a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day07b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day08a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day08b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ ├── main.rs │ └── main_raw.rs ├── day09a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ ├── main.rs │ └── main_whole.rs ├── day09b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ ├── main.rs │ └── main_tailcheck.rs ├── day10a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day10b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day11a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day11b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day12a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day12b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day13a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day13b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day14a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day14b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day15a ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs ├── day15b ├── Cargo.lock ├── Cargo.toml ├── input.txt └── src │ └── main.rs └── runner ├── Cargo.lock ├── Cargo.toml └── src ├── bin ├── bench.rs ├── runner-par.rs └── runner.rs └── lib.rs /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [day*/input.txt] 4 | end_of_line = lf 5 | insert_final_newline = false 6 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Always use LF line ending on our input files 2 | *.txt text eol=lf 3 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # Funding links 2 | github: 3 | - timvisee 4 | custom: 5 | - "https://timvisee.com/donate" 6 | patreon: timvisee 7 | ko_fi: timvisee 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .*.sw[po] 2 | target/ 3 | **/*.rs.bk 4 | .idea/ 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Advent of Code 2022 in Rust 2 | 3 | My [Advent of Code 2022][aoc-2022] solutions in the Rust programming language. 4 | This repository holds a separate Rust project for each day and part. 5 | 6 | I attempt to develop a standalone, elegant, compact and fast solution for each 7 | problem (two each day). 8 | 9 | Previous year I did the same, solving everything in under a second: 10 | 11 | - https://timvisee.com/blog/solving-aoc-2020-in-under-a-second/ 12 | - https://github.com/timvisee/advent-of-code-2021 13 | - https://github.com/timvisee/advent-of-code-2020 14 | 15 | ## Timings 16 | 17 | Here is how long each solution runs. All solutions are measured (non 18 | scientifically) in [`bench.rs`](./runner/src/bin/bench.rs) on an 19 | `AMD Ryzen 9 5900X (24) @ 3.7GHz` machine running Linux. 20 | 21 | | | part A | part B | 22 | |:-----------------------------------------------|:------------------------------------|:------------------------------------| 23 | | [day 1](https://adventofcode.com/2022/day/1) | [` 0.027 ms`](./day01a/src/main.rs) | [` 0.031 ms`](./day01b/src/main.rs) | 24 | | [day 2](https://adventofcode.com/2022/day/2) | [` 0.006 ms`](./day02a/src/main.rs) | [` 0.006 ms`](./day02b/src/main.rs) | 25 | | [day 3](https://adventofcode.com/2022/day/3) | [` 0.015 ms`](./day03a/src/main.rs) | [` 0.016 ms`](./day03b/src/main.rs) | 26 | | [day 4](https://adventofcode.com/2022/day/4) | [` 0.040 ms`](./day04a/src/main.rs) | [` 0.039 ms`](./day04b/src/main.rs) | 27 | | [day 5](https://adventofcode.com/2022/day/5) | [` 0.020 ms`](./day05a/src/main.rs) | [` 0.019 ms`](./day05b/src/main.rs) | 28 | | [day 6](https://adventofcode.com/2022/day/6) | [` 0.001 ms`](./day06a/src/main.rs) | [` 550 ns`](./day06b/src/main.rs) | 29 | | [day 7](https://adventofcode.com/2022/day/7) | [` 0.008 ms`](./day07a/src/main.rs) | [` 0.011 ms`](./day07b/src/main.rs) | 30 | | [day 8](https://adventofcode.com/2022/day/8) | [` 0.045 ms`](./day08a/src/main.rs) | [` 0.177 ms`](./day08b/src/main.rs) | 31 | | [day 9](https://adventofcode.com/2022/day/9) | [` 0.120 ms`](./day09a/src/main.rs) | [` 0.290 ms`](./day09b/src/main.rs) | 32 | | [day 10](https://adventofcode.com/2022/day/10) | [` 0.001 ms`](./day10a/src/main.rs) | [` 0.003 ms`](./day10b/src/main.rs) | 33 | | [day 11](https://adventofcode.com/2022/day/11) | [` 0.019 ms`](./day11a/src/main.rs) | [` 5.72 ms`](./day11b/src/main.rs) | 34 | | [day 12](https://adventofcode.com/2022/day/12) | [` 0.294 ms`](./day12a/src/main.rs) | [`51.22 ms`](./day12b/src/main.rs) | 35 | | [day 13](https://adventofcode.com/2022/day/13) | [` 0.238 ms`](./day13a/src/main.rs) | [` 0.277 ms`](./day13b/src/main.rs) | 36 | | [day 14](https://adventofcode.com/2022/day/14) | [` 0.226 ms`](./day14a/src/main.rs) | [` 6.14 ms`](./day14b/src/main.rs) | 37 | | [day 15](https://adventofcode.com/2022/day/15) | [` 0.003 ms`](./day15a/src/main.rs) | [`16.19 ms`](./day15b/src/main.rs) | 38 | 39 | | | one-by-one (1 CPU core) | parallel | 40 | |:-------------|:-----------------------------------------|:---------------------------------------------| 41 | | _everything_ | [`81.32 ms`](./runner/src/bin/runner.rs) | [`51.86 ms`](./runner/src/bin/runner-par.rs) | 42 | 43 | ## Run solutions 44 | 45 | Each Rust project contains a `input.txt` file, holding the puzzle input. Simply 46 | run the project to see the solution appear. 47 | 48 | ```bash 49 | # Switch to day 1a, and run it 50 | cd day01a 51 | cargo +nightly run --release 52 | 53 | # or run everything in parallel 54 | cd ../runner 55 | cargo +nightly run --release --bin runner-par 56 | 57 | # or benchmark every day 58 | cd ../runner 59 | cargo +nightly run --release --bin bench 60 | ``` 61 | 62 | Some solutions require Rust Nightly, that's why `+nightly` is included. 63 | 64 | ## Other years 65 | 66 | - [2024](https://github.com/timvisee/advent-of-code-2024) 67 | - [2023](https://github.com/timvisee/advent-of-code-2023) 68 | - [2022](https://github.com/timvisee/advent-of-code-2022) _(current)_ 69 | - [2021](https://github.com/timvisee/advent-of-code-2021) 70 | - [2020](https://github.com/timvisee/advent-of-code-2020) 71 | - [2019](https://github.com/timvisee/advent-of-code-2019) 72 | - [2018](https://github.com/timvisee/advent-of-code-2018) 73 | - [2017](https://github.com/timvisee/advent-of-code-2017) 74 | 75 | ## License 76 | 77 | This project is released under the GNU GPL-3.0 license. 78 | Check out the [LICENSE](LICENSE) file for more information. 79 | 80 | [aoc-2022]: https://adventofcode.com/2022 81 | -------------------------------------------------------------------------------- /day01a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day01a" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day01a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day01a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | -------------------------------------------------------------------------------- /day01a/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | println!( 3 | "{}", 4 | include_str!("../input.txt") 5 | .split("\n\n") 6 | .map(|e| e.lines().map(|c| c.parse::().unwrap()).sum::()) 7 | .max() 8 | .unwrap(), 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /day01b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day01b" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day01b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day01b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | -------------------------------------------------------------------------------- /day01b/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | let mut cals = include_str!("../input.txt") 3 | .split("\n\n") 4 | .map(|e| e.lines().map(|c| c.parse::().unwrap()).sum()) 5 | .collect::>(); 6 | cals.sort_unstable(); 7 | println!("{}", cals.into_iter().rev().take(3).sum::()); 8 | } 9 | -------------------------------------------------------------------------------- /day02a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day02a" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day02a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day02a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | -------------------------------------------------------------------------------- /day02a/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | println!( 3 | "{}", 4 | include_bytes!("../input.txt") 5 | .split(|b| *b == b'\n') 6 | .map(|l| ((l[0] - b'A') as i16, (l[2] - b'X') as i16,)) 7 | .map(|(a, b)| 1 + b + 3 * (1 + b - a).rem_euclid(3)) 8 | .sum::(), 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /day02b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day02b" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day02b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day02b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | -------------------------------------------------------------------------------- /day02b/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | println!( 3 | "{}", 4 | include_bytes!("../input.txt") 5 | .split(|b| *b == b'\n') 6 | .map(|l| ((l[0] - b'A') as i16, (l[2] - b'X') as i16,)) 7 | .map(|(a, b)| 1 + b * 3 + (2 + a + b) % 3) 8 | .sum::(), 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /day03a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day03a" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day03a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day03a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | -------------------------------------------------------------------------------- /day03a/input.txt: -------------------------------------------------------------------------------- 1 | RCMRQjLLWGTjnlnZwwnZJRZH 2 | qnvfhpSbvSppNddNdSqbbmmdPrwttJVrVPDVrJtHtwPZhrPJ 3 | BFpFzSSqSFFSvQsnWgCMjTLzng 4 | DbWVcVRRdlLffvtqjTWNgQ 5 | mJJMpsmrMrJSHJpsHrFHvBvgHvqfNvzffgTvfj 6 | mMhPjmjmFPJhMSGGcDRlwRdcLGPc 7 | qFcbmWFJqqWpRJcQWpqsQQQwSPCPrHRHCPdNZtSrSHwrNZ 8 | jGMjGLhhhgTvghgtGVjnNCrPVwZSZffSNSwHZZdH 9 | DvzDlvvhnjlMlglglGGhDLpqqcJWWtsmszpWbBBBmQmb 10 | SPLPHQbJSbPsvTLmfDvVDctvWhcDlD 11 | jdRRzzGgJqwrpMRMgdjlcVcWqfWWlfDlmmlWhB 12 | rwgRGdpGprNNLQLsbZJPsn 13 | GZhTVLztHrSzrRBz 14 | MJWjMvsfSCLSnrJn 15 | MjglcgWMdccvZGFtTDchLLLh 16 | rgDHBgBjRgRTgwzwthBnQwmBtB 17 | MsMpSfMsTGTFFLdFFFMFsnNmthNnzhthtwmWnznz 18 | pZMpJdvJMGRHVJJTVHjb 19 | TQVqZVBcBBdBfbpN 20 | zvzrtCshrntCHslPMMMFpZHbNSpb 21 | hLWhGLttsvLvrrWvhzVmQgwJZTRcggTjGcgT 22 | SqRGLHtSbtNTbhjFTjDDpF 23 | WwgJgmdmMdwPDVQQBBhSBFwV 24 | JMPlmlSldWZmRqtLsRGRtvls 25 | mZvmvPNmlNJPJzzmgNvNgdqqdBSpfHBqSsHqHfwpsffq 26 | nhDQDrwLrVVnqfGnsBGBGGsH 27 | VjCDMhbDjLjtFhtLhLhQjNZcZPwWWcczmvglgJJN 28 | wwqnwZGGZqqMpMprpZqwGlLDtNDffdBdNVBmNGBN 29 | TSTchTFbRLfLmVhNDm 30 | SCLRvJQvRFTSRjqMqPZrZnrzZzjp 31 | cJfqGjgGJcsgsPnghgBm 32 | FHHbQQHLWLbPQThqQQRnZs 33 | lLLMSCvrlFMwlSlFcNwqDVVpJcfjzVDf 34 | cRdRDhsDFzPztwJdGP 35 | CVqpCqCgSNfCSQBpjtBwtlBBHLlmGjGG 36 | qfQfCVQfgQnVNpQCMqfcrFrwWDhrDnsvcRDsbc 37 | nFWWzqWZQSqnJzNJzslJVsdV 38 | vBBvsLvbBmBmRlGTNJJvRRTD 39 | tBbpmmPwCmHpMHHMrPCCcSnZSgcFcZgWFscSfgth 40 | LLssTJrqrpvrvvpJvdjggMlgzVgVggPlFPqz 41 | HwZwCZfHNtbMzjgVnFPC 42 | RSttfRwZDtBcZwQMQdrQsdTBQQmW 43 | lJnNhMJqljlNhSrdWlGGGQHwwH 44 | vbTpbCsTFCTmbSmcRfVCfRpwcPdwWQQrdwHwBHrPdwrLLB 45 | sVTmDfmCTVmJjgSzzntDtt 46 | DQtMjZHZHvMbwwTSpqLtpJ 47 | FzVFlsNdVczWPzWcslVfSLqLsqJpSwwsJswLrf 48 | dNFFWcmzWFGLWcdcFgvZvvRHQvjMHDMBGD 49 | MVPTmPvbMgrTmmmmMRMvPvBwFGhhDCdFFwLCLdJhDGFRhG 50 | fqqWfpZWzWsDwhwdhwqGLD 51 | ZWSSftStnnplcQLSbVMBvTbrMlbrBvvl 52 | FSsHDmtFLbbFbLGg 53 | vrvzTzWzzzvppzSzTMnfTggjVgbgjbLjgPPnbGbVGL 54 | pdMwrBpfwfSMTTWdMTpBDCBtmsmltslcBDCshDHs 55 | RgbmfGtmRVgLLSVSnSrWWSHhnh 56 | ccTvlvNppsFnbFnhnWnPHJ 57 | pqNjDBjNNjvpZfmtjbCLbCmb 58 | qsSVpSVfWqgNrVtWptpmSfqbPQljbHPHlDnljRSlwSnwQn 59 | dcGBrMFMdLTGGdlwDwMRHwwMbjHP 60 | CFBvhFhTLFCGvFchChBdBTJtsNpWqfVgtszprmVWNqNgvV 61 | sjsTgNSNqSjgMmVPmmmrpH 62 | RftCcWddRCZfPtCfcQZdcZDcrBllBFpVHprHWlHHpHJJmlFp 63 | thPZRtLcDRdDCTTsqbnwjhvNjq 64 | TQPtgfgdPcdSQhjwHhHBLS 65 | RrqCqVVbJmVRJmsrzmJpWljlSHLSBwSSRWllWv 66 | CVrDNbHrJHVMCbrDJsdFdFcPFZngMfFdTPfP 67 | NNlZgndqmGVGGVZNWQmWmbhbbhpbbhtCbhtgCpCtMF 68 | THfLPTzwJTJrvHRwwsbFbhfbMCpphVtBbB 69 | RjrvzHLzPDvLzPHrTJVrwPndZQNlDZGndZWDdNNcmlQq 70 | tjDsjDGtTjVVbQVCggvrbg 71 | qrWWRBllRFrdlSMCdbSJCP 72 | cZcncRnhphpZWRNtrmsrGpHffmwH 73 | qpRjdcqTcMbbMRTwtnplnwnhPzhBhw 74 | FSFLvNrsPNrsGSLsrFSGfnwBQwZnZwhQQLwwQhnn 75 | sWNVmVmCFNWGsCrrjRTmMjRjPRqgJqJg 76 | sVCnzVpmFpVSnNFCmnmzwRFDWDdMllDccMdwDMjWjWlWjg 77 | BJbPJGGGHPZqZQbpMlWWMWlBljjjgDjh 78 | tGQPpZtfTPpqrHsVLSzmRNLtSFsN 79 | WCDlBWWlvMFWlQWpmSZdZnNmGfJZFZ 80 | LqjTjgtjPcHTTJgLThztcLTLnHnmdSpZdpdffnmZSppfGpSn 81 | PtzqzjtqJgggzhqqccqhrQMsMvMwrCwMlBvMwvvsvs 82 | NMsJfsHTMVbjnLnVsC 83 | htWllhmZcWDWBwhZPcmpVRjnVMRLCCjLFpCwRb 84 | PmZMrBtcPmZWhzDWBtMmJQdddHfQGNSqHqQGGTgr 85 | NmfnnsPlHnGqnlsNNmRPltRLvrhvrSGJSJjvFFFSSFJLhb 86 | PzQZccVPVwgPjrJSJjhFFpQr 87 | TdwBgdTVwzdwzlmNfRqPmqqTql 88 | BVLLBPmPmWBlMlLJnJlBlFQVgdRDdRZRZHpZjQzdRdZQdzQZ 89 | trGTsfbTTgHZptzSZW 90 | fsfTNcCqqNhhVhVFVhVBWLLB 91 | LJwgJNfbCvwCJCwBCCNhhHmGHWWSMWmWmbMmTmmGdS 92 | lzRnnltsstZzzRTfHtHWHGWftfHW 93 | ZFFzVFqzqlFcZscZpRZsNphjhjvjfgJhQgQvwvhC 94 | HHzcFNcHFjhjZjlrghLL 95 | pMZJptpZWCmpttRMCWnnDnBGGDLhlLQrhl 96 | MJsMCTZTTpTJRmMCJzfNsNcfNHqzvvfcww 97 | ZDtllsDlVsrQBqQqRfWl 98 | wvJgpPhhscgvpJFNrRjRrWRjqrRjdjRv 99 | zpsNzCsNCJCCPPHSLzznMnDSLGLM 100 | rfrJjFWrwjpnJjjjfrjJJnFVTgTggRWRRRPPLQgCgQcPPT 101 | sSNbSvqmsSZDZZBtNTTPGgMLMRVcgPCMRb 102 | zZDZzNNSmrfpjFCjzj 103 | dbbNJPBbbrFqNqttqrGbqDcmDQRmFmwcwSnQSDcpwS 104 | ZMMTsHjzLlLcnSVwpRRQ 105 | hZTWjWvTZzTTWhszfwbJhrgJqtBbJGdqNPqt 106 | rrqgHrgtcHJRRjWZlRvnnWBn 107 | QbhVmdFppwbdjnMvlnBwMWZP 108 | TpFDdVTFTDfhHfJcSJSzGZGf 109 | sqNTNZHsHjjFBBwJMMNMcCJD 110 | WGLQPjfWfQWPWmtLSRRRLwBJDbtCCJJCbbwCMBbMBc 111 | RnPdLQfPLRdndGGRvfjlgdrTTgTsrgTrZFzF 112 | BfHbjVVqSBFfMSlCLCDrGSQssvlr 113 | tTpnnzpcPnwzhcnJTDtTPRprGlRGGGCWlQsWvrlvrQGQrC 114 | DPwhghDTpPVHqqdgZbZq 115 | ZzPqfGPtRtqfqPbqfGgGZbrhMjmjBCpHpHNCmHtHjmBHnj 116 | QJwllvFWwDvnwCBBzjwwpC 117 | ccJLVQzWFJvVJlVbgrZZLZLRRPSgdr 118 | rBGbLbnTfnZrQbTnHldqsMmHsqlsWfMd 119 | JcJjCCPzPtjCNHdlGGMlll 120 | jjgpRRvcGbwpThVppT 121 | ttDfjtqfjtpTWWwfTbtlWccNGRSZNGPGhZGhGhcwRh 122 | LbCrHdvzLSSHmSRNmc 123 | JCsBvrvBLzFQbbvlVVnpQpDtWlDqfq 124 | vvdvJBfvdTvRBflBJPNmmffmgPCMwDgsss 125 | rFjqLnMcnqrrtMLtjNgCPCsNzzgsPCGFNs 126 | VqLqnLVZqjMZqWnrVtWlZJJSvHvBdRSvBdRvvJ 127 | zZBDzgQQZLlcglzjrCrCMFjGZbMsHm 128 | PnnJVRfttTtwVnnVFGHVsjCFCjrsMM 129 | wPRpRpRnNTpPNlBdQQDdgDNMhN 130 | bNQpFpnwgtDHpbnhWtffmfmhvhhfsZ 131 | LcdLdwCLPPSVSqqwZGhWdJhGJZhlGlsm 132 | TBwSLPSPVRSVqSVqVrcnpMDDngMgnQpbRQFDNH 133 | vPSvBJZSSdJgpJJZBDGDGrdqGdllGrGDrh 134 | HMtsltFlRVVFtlscRjjMcsWwWChWmrnwDWGwChmjGCWq 135 | MQHNlTVHNVHpbbpbTvvBvf 136 | VsbPMwhbWhzdpzNNggnBcTBWNngQ 137 | RmtZZFZqSjqVHmGQNcBHNLGLGHQH 138 | JjRClqCjZlDZmqSqljFZZqRCvsvPfshhMdwsDwbVwzMzhffb 139 | bfGtRgfDtVmsMzTbmz 140 | LjGZwQLLdjFdHLNMhmzBzMNHNmzN 141 | wjQLCFvnnQGdZLGWSjdqWDfPlrRpqRDDRqrpPr 142 | pqnBZqjCNCqQqmllpHGMGdTfML 143 | PsFgrRvSPsWTwWWQwGHLHW 144 | SrvgsFbrrPJJFsrFPtFSCChBDQjqCqtNhDqhCqNC 145 | RJZRWZWMWZPZffRCPWMdRdfQQQjJzHQsssjrSQFVschVHr 146 | NgpnDgvGTNTVFHFFjVFF 147 | jntvgljpGvlnbLtLbBvnLRPlCCwwCfRqMCCqqqddqw 148 | PFBMVDSVPHMTThtMtSBMMVNbQprHbNRgNRRgLnvpnjnN 149 | scGcrcwlswdGlcqvbQgnnpQnqLjnpp 150 | ffwswWzcmlcWWsmcZhrDFrZMFZBMFzhM 151 | LMdZGqdRSSZmCZMRfQjnggvlvggRcznz 152 | tjjFhBrtpthpslcvvlcQzFnFvQ 153 | jrhbjtpJtbZqCLdWLq 154 | HBGBfBttZzbGbljPdpFddFqRmqRzRN 155 | JDWghDDSDqmmDDpc 156 | CLvgMvChCvLphCTSShhMhQsBbfTfsGsrBfjfrljrZZff 157 | RgHgDqDzqQqgcdHqcZGTNlGffGBDGZBTGZ 158 | LFLPWsmvrbwhwwswrTlTTCBNGFfGlNJZNS 159 | vhrLnvhNmWvMsrvwqMdRcptQtztcjptz 160 | sLMLsThhjgqLlsnsLgTLtMFcRbcPcJSwJbbSbtSWScSt 161 | fvrjjDjvNprdPwwJCCSrWPFP 162 | vfZdGzVzfvGGVGpBjnnMglTsgZlqsMlM 163 | TCVMfCfBnHHfLLPFWb 164 | GgQlGJzNzbzHcHHLlcPLHL 165 | tQbNQGgRZZCVtVMZ 166 | QFFMzwjwngsvsBjGGJWbBbBWbB 167 | QdmVDmVDWRPWVPVV 168 | QHtHSdDpLQCCSHrtqrdrttDfLgvnFvFghNszzwgngFwsNF 169 | RzzTNpSRBzSBVpSRlHNSHBSSGPcLNGtjhPPcbcGhPPhcrnct 170 | CCmmCwwdfFJqDmdwsddhsmvdcMbLfcftttbPnjMPbcjPMPbP 171 | mdZQmvssFdqsFZvsZQmvDvmWzgQBWTRzTzHlppWRglHBQh 172 | VWmnfQWzWWnHWMfmmMVNMfWjtBtBNSNSrlStlpjJBBlgBS 173 | cZZvbwsZsbbZvvscCRdFTTTQrBStdBJgSdhjgBjBjJjpJJ 174 | wCFTCbZbFwwCTvFTwsPGccMzMDWVWfzLGmqHnnDHGLQL 175 | sNQQHbbhdlpdrQllqpsqSpGjZDZGgDnVcnjjnnDZ 176 | WWRLGFvJBJPvzzWjnTncDVZTTPgDff 177 | FLRLGRFRJLBWJmJzMRLCvldrMrbbltdhQQlNqtMbsb 178 | HZllwlZSlSZwhvmQjcZhTqcT 179 | sPzzdgpszpzsBdvvMccvcqPThjhM 180 | JDdsDspLzsdzBgVdBGBzCLlwbbwWSnlnnWffHwJcNlHw 181 | nzCTCnpqJqfCnvvjZjWjPcZrmcmZfW 182 | GNdwgVjwRdRglMrPWLPWZWcNWW 183 | dVblgtRwQgSGVBldbQBbBRJnQJTsJHTqnzzJFpjvHnnn 184 | dqpQQrdqQpLfqcGSdggQdgRMmwHBMMBVNRNDFFBDBgNt 185 | vTzsnZCnlCnshbPlvZJbBzVmmVRDNwtHFBwMDVBR 186 | lJCshjTJbVqfVdjjjG 187 | WlLCJlHLcZcJWcWZJnLHnPqlFtSthTnFNThVtNhVhvNVzVtF 188 | QfbgRsspfDRsgfjqqRRpDbSNSTFzBbTbhttVBhVNBzzT 189 | fwgfRdpdfQDqgPHHZJZCcdGddH 190 | sbrbmVmfddzJntZZtwtMMf 191 | PvhwPRlvvWhFvSRhpFMMJGMFppnBTBGJ 192 | RPlCCLDPDClwHbrdzsdNLzgs 193 | HZgqtgbqRZvzwzCh 194 | BFqmGfrNLQfhzJWBhRJwJR 195 | LFqFQjrcrcqFNMmMdHggntDPMnsDbn 196 | NmWmPblGnnTTNlFGPmNWfwdchdlHdBdwcfCfZppZ 197 | rzqzRjgVrJrzzcFdqdCBFBhZhH 198 | VDRsRMjRJJrQsJPTGFNvsbnsnLGm 199 | nrbrBLTffjNRzGQSJHJQGT 200 | tcZqMcppCmHRQPGGCG 201 | pMDcZhpgcpFDfrwNDDrLVjGj 202 | LWlmlmWqvrBMWWBlmjLThBrfPJZfZZCwPCJJwPCTcggCsd 203 | pSbRHbzpHDVFRQRfPdfnZswgcJcppp 204 | SzRNGbzSWNPLWqLv 205 | vqslblpspsvqBFSqcrrZZDdTfFPHccrf 206 | GWRhWmjwhRcQdCDrPjDP 207 | mcWLVnnWJgGRzVSsVSpSSptNpMvb 208 | wHTPfdTvHlPHGpdvvTddGfcJLLWWwWWcCWrqrVMWCVLL 209 | zhsSNZhnshNSnvZmvsCWWSLrVMcrSCLWJcrq 210 | snDnshmNsjnTdHPfDGvdDT 211 | CfrnFFMnnsRNrNCwFCrdssgqgqvVZvZqlTWBNWZqlJBW 212 | htDhDLhwPWWBqTghgB 213 | DPLPzHDtSPStjLGLtzSMwbdMdnCHrRdCFsmfnR 214 | nBNWCvJmVPNnCPNDJWbtmSwqTttcQsSqtqTjQQ 215 | pMflzLlffRRMRdFlflpLddGdsTjwHqzcvwTqtsStQQjtwwsQ 216 | ZhGlphlpvvLLfFGvMLhfrfWNJNNPVPbnPhnDgDbDDNbJ 217 | ZCpCmVlZvlpBBwvvMCrJhrfhMfjjWMSG 218 | qhstFzFFqzHGzNfSMJSGzM 219 | QnHRPRgRQPtPhtnDsqsbDQPBlTcpBwmVmTvbwdwBTVZVpl 220 | PHmqHdddqBWMmTvMvTGMBWPdwhssnnHlhgsNwhwNHQzwrswh 221 | cSbVcDLtbfLSFzhlhJswgtrsww 222 | bSLlFLFFLDZVLpZVjFLdPMdBBqGGPmmqWGdGjM 223 | FQCnQwFRbnrSfgQgwFRCnswmPLpMppPdMMllpLMptMLldPSZ 224 | cJhhJcJVBJjhfHDvJqThvVDcpdGGqdZGdlltpqWdMqpdGWtG 225 | HhzTjJBzJTvNJHvzvvNBzBFnFCNCbCwrbnRbgRwfwQsg 226 | jRzDgbDDQDgVqqDGsjttNdwqNJZNwNdTWrpB 227 | MHvvvlSHFllMhhMrpWBJtlWdpJrTwZ 228 | mFcFFHmCmtcvfvFFHHLDGnRVzjDgnmgmnzGgGg 229 | JJhDpDdmsJJdgmhrpPjGjFLPPSNpjL 230 | WbznbRGnPfrfRSrN 231 | WqGnnVGVMGHtWTCgJvZHggBggZCg 232 | wlrPQtZQvwrzlvNfZLMZBjbbqjqLbSBjTg 233 | PGJDVdsdhsPVPjbTcLcGLgjqbM 234 | VPDRHWRdsRQvpfmmlw 235 | pvTZTSpTZvGGphNvvbDpdrMqrjlWdPqqjWdldNrd 236 | gmmJmsQfJgcRQJQJJncVQjMWllSnqljqBlPPjPHHHH 237 | QVJQRVcwmJcchwpSZLwGbSZZ 238 | zjrDMWcjDzQjDlWrnqqRBRNhBJRBhBJqnf 239 | TTGPPdgGLwdHGwGPTgLbbvhHtRRNRRSfchqRvSqHRJ 240 | TZTccPpdZwPQjllsspjVzD 241 | jHLHhHFRjhcblDRRWbWTdtppLTntTnMmGLMvTp 242 | BBQBgBBCrrgqJqTtMZMpngdtpvpG 243 | QJJJQrsVsQQfQVPCNqsNSjHdhhdRHDNHFHFclh 244 | RbCLnvdtnLRLRbmLPpHdQCvmNJpJSZSJlgDzglGlzcclcDGD 245 | qBBwMjfsFMjsMbfWbwjlzDZlcWclJczgNDGNDl 246 | wqjhrwwhhCvbQPrRnC 247 | vpWDDDWZQQNGllwHlwWVGj 248 | LCPdqdcdtsvdsCtsddvmVrVjjrBwHlmswmBnmw 249 | fLfvSgvMfdCPqzZNThfNNpTJJQ 250 | CVVVLbNVmGNQbGbGHHbHbvdwgQlwJDTFgJQdDZDJFD 251 | ssWBsBWrjSzWrPtBjnSCTwvFZlDjwZDdgwTDwggv 252 | nntPBqBrPsBfnCRCBWzCVcGVHMLNcbHLNmHqGphp 253 | sbbwwzdsbqQQbQnnNbPNGbznHHRdLTggMVHFVvRZTRVRHMZF 254 | mWffDWfflBpfmcWjWrrJVvgRLlMZVVhMFFTlHhMM 255 | rJJCctmjcfvzsqsqbtbqPP 256 | HGWjHWzVctQVcJVtjvRsvLTddqDDDsjRLg 257 | bbMnlNChZQLZhdDs 258 | SMMMMMMNmMllSlrmCczGcVzBcGWFBQGcrt 259 | VwQlqcLfdLGqdqDjjgZrjZBdttjd 260 | zSPPPJzJGjJjZrCBDt 261 | WMTMsTWsccsvGGwH 262 | hZvbQrjTTZjZcjWNrjnQrcTRpGMqcRfRRGzHfHfpfRMqRz 263 | mDJlFmwCVVwbCVbPBRLMMLpRLwRLHqpR 264 | gsCmgJsPDCtCVlvbhgQjhgQbnQbd 265 | fSgbhhGPGJGhRDmlhhHcHDBH 266 | LsMwQWFswsQMsQMvjslcBcDldBTWfDcHRRdl 267 | ZpVFwLQwVLQvCVsMjrJbbCNPbzSJtPbPPf 268 | VDzWMCpfCcCRDzqDzqNnvLZnfntHQnPPLQlt 269 | sJmdbTBdmmGhFhhbJNNQlJnQlQLHPZNn 270 | sdwmwsdrmMRpDRMLcw 271 | JpWmSWpCnCbJBZHZVldbdfZf 272 | rgdrgNdrjgNPrMjwTssrPdfDZqsVfQHDFlQDDHQVsZfB 273 | TRPdNNLgjNwrRTrJpppzCmzmCLSnvS 274 | QbtQJHQmbmfmBRvbQRzBvldqcFljsGcFdGdvsqqGls 275 | ChCPWhDhWZWJVnZpCNChhVDcMcDdcdgGscjgFjGFlsjjGq 276 | WZNTWNhNZfJJbTJTmR 277 | CHGCHFcZvCrchrZrhsVtsBQjMstfZMMBgg 278 | NNqwDLmDjJgQBmVQ 279 | wdWLLTgWRTWcCcbrHCHhGW 280 | bTZZvNjNjLgTCHcWhccfhWJdhvnc 281 | mnFFmPGSwRPShzVPPWPdhhzr 282 | FRtBFGBMFQFttRwtZgTjCTnQNbNLjTCH 283 | bJSqrSpDJbSNbFjSFCfPWGcwGWPrcTCfwr 284 | tRtLhDsvhQZlHRhRtQQnCnCcdwCPwTwdGcGP 285 | HsHvsmBZvmvsmBhHvLssVqDSNgFMDzgbbDVJzbpMVq 286 | nSSDHRRRQRBCLCQC 287 | qGmfPzGmGlrrrpfrqlzrJtLvBlhQbSCvbtCtlFhLFC 288 | zzpmqqJJVVfJfPfMpfdHNndsNwDSMSDDNcsc 289 | CscQsVMhCsMsMHhhVthtwmgZNRqzWLBRLRLmBWmZWBND 290 | JQJdddrjrLqBgDBq 291 | QbFlTffpMbMnsPCh 292 | gDdbVbVDddDfVfWQfBRLQZsZLRQQ 293 | FCCTrGCMStwGHTtTWLQhLZrlRssRhRhp 294 | FSHqtFTmFwmCsSwGTHtMTSdjjcdnVddgzmbVmjmndbbD 295 | JtBBMcLWLdfFLhMttcWWhfWLrTRGFsbwTmRGwmwbbCTGGsbD 296 | PzQpSQQQvzVvpzHqjvNvQSvGRmmTDVRDmsGsRGsrcDcDGC 297 | cQPHSPvPvZHqcZjzpZjnZNtWlLdtldJWfnfhlJJtLdMg 298 | nPPssTBnMJPdtHPVHtRhpv 299 | bSSgGFWDgWwDFFlmWlcShqdpRqpVcHvvnqpvpRHd 300 | bGFnGljgSsjBCTBszz -------------------------------------------------------------------------------- /day03a/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | println!( 3 | "{}", 4 | include_bytes!("../input.txt") 5 | .split(|b| *b == b'\n') 6 | .map(|l| l.split_at(l.len() / 2)) 7 | .map(|(a, b)| b 8 | .iter() 9 | .filter(|b| a.contains(b)) 10 | .map(|b| if *b >= b'a' { 11 | (b - b'a') as i16 + 1 12 | } else { 13 | (b - b'A') as i16 + 27 14 | }) 15 | .next() 16 | .unwrap()) 17 | .sum::(), 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /day03b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day03b" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day03b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day03b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | -------------------------------------------------------------------------------- /day03b/input.txt: -------------------------------------------------------------------------------- 1 | RCMRQjLLWGTjnlnZwwnZJRZH 2 | qnvfhpSbvSppNddNdSqbbmmdPrwttJVrVPDVrJtHtwPZhrPJ 3 | BFpFzSSqSFFSvQsnWgCMjTLzng 4 | DbWVcVRRdlLffvtqjTWNgQ 5 | mJJMpsmrMrJSHJpsHrFHvBvgHvqfNvzffgTvfj 6 | mMhPjmjmFPJhMSGGcDRlwRdcLGPc 7 | qFcbmWFJqqWpRJcQWpqsQQQwSPCPrHRHCPdNZtSrSHwrNZ 8 | jGMjGLhhhgTvghgtGVjnNCrPVwZSZffSNSwHZZdH 9 | DvzDlvvhnjlMlglglGGhDLpqqcJWWtsmszpWbBBBmQmb 10 | SPLPHQbJSbPsvTLmfDvVDctvWhcDlD 11 | jdRRzzGgJqwrpMRMgdjlcVcWqfWWlfDlmmlWhB 12 | rwgRGdpGprNNLQLsbZJPsn 13 | GZhTVLztHrSzrRBz 14 | MJWjMvsfSCLSnrJn 15 | MjglcgWMdccvZGFtTDchLLLh 16 | rgDHBgBjRgRTgwzwthBnQwmBtB 17 | MsMpSfMsTGTFFLdFFFMFsnNmthNnzhthtwmWnznz 18 | pZMpJdvJMGRHVJJTVHjb 19 | TQVqZVBcBBdBfbpN 20 | zvzrtCshrntCHslPMMMFpZHbNSpb 21 | hLWhGLttsvLvrrWvhzVmQgwJZTRcggTjGcgT 22 | SqRGLHtSbtNTbhjFTjDDpF 23 | WwgJgmdmMdwPDVQQBBhSBFwV 24 | JMPlmlSldWZmRqtLsRGRtvls 25 | mZvmvPNmlNJPJzzmgNvNgdqqdBSpfHBqSsHqHfwpsffq 26 | nhDQDrwLrVVnqfGnsBGBGGsH 27 | VjCDMhbDjLjtFhtLhLhQjNZcZPwWWcczmvglgJJN 28 | wwqnwZGGZqqMpMprpZqwGlLDtNDffdBdNVBmNGBN 29 | TSTchTFbRLfLmVhNDm 30 | SCLRvJQvRFTSRjqMqPZrZnrzZzjp 31 | cJfqGjgGJcsgsPnghgBm 32 | FHHbQQHLWLbPQThqQQRnZs 33 | lLLMSCvrlFMwlSlFcNwqDVVpJcfjzVDf 34 | cRdRDhsDFzPztwJdGP 35 | CVqpCqCgSNfCSQBpjtBwtlBBHLlmGjGG 36 | qfQfCVQfgQnVNpQCMqfcrFrwWDhrDnsvcRDsbc 37 | nFWWzqWZQSqnJzNJzslJVsdV 38 | vBBvsLvbBmBmRlGTNJJvRRTD 39 | tBbpmmPwCmHpMHHMrPCCcSnZSgcFcZgWFscSfgth 40 | LLssTJrqrpvrvvpJvdjggMlgzVgVggPlFPqz 41 | HwZwCZfHNtbMzjgVnFPC 42 | RSttfRwZDtBcZwQMQdrQsdTBQQmW 43 | lJnNhMJqljlNhSrdWlGGGQHwwH 44 | vbTpbCsTFCTmbSmcRfVCfRpwcPdwWQQrdwHwBHrPdwrLLB 45 | sVTmDfmCTVmJjgSzzntDtt 46 | DQtMjZHZHvMbwwTSpqLtpJ 47 | FzVFlsNdVczWPzWcslVfSLqLsqJpSwwsJswLrf 48 | dNFFWcmzWFGLWcdcFgvZvvRHQvjMHDMBGD 49 | MVPTmPvbMgrTmmmmMRMvPvBwFGhhDCdFFwLCLdJhDGFRhG 50 | fqqWfpZWzWsDwhwdhwqGLD 51 | ZWSSftStnnplcQLSbVMBvTbrMlbrBvvl 52 | FSsHDmtFLbbFbLGg 53 | vrvzTzWzzzvppzSzTMnfTggjVgbgjbLjgPPnbGbVGL 54 | pdMwrBpfwfSMTTWdMTpBDCBtmsmltslcBDCshDHs 55 | RgbmfGtmRVgLLSVSnSrWWSHhnh 56 | ccTvlvNppsFnbFnhnWnPHJ 57 | pqNjDBjNNjvpZfmtjbCLbCmb 58 | qsSVpSVfWqgNrVtWptpmSfqbPQljbHPHlDnljRSlwSnwQn 59 | dcGBrMFMdLTGGdlwDwMRHwwMbjHP 60 | CFBvhFhTLFCGvFchChBdBTJtsNpWqfVgtszprmVWNqNgvV 61 | sjsTgNSNqSjgMmVPmmmrpH 62 | RftCcWddRCZfPtCfcQZdcZDcrBllBFpVHprHWlHHpHJJmlFp 63 | thPZRtLcDRdDCTTsqbnwjhvNjq 64 | TQPtgfgdPcdSQhjwHhHBLS 65 | RrqCqVVbJmVRJmsrzmJpWljlSHLSBwSSRWllWv 66 | CVrDNbHrJHVMCbrDJsdFdFcPFZngMfFdTPfP 67 | NNlZgndqmGVGGVZNWQmWmbhbbhpbbhtCbhtgCpCtMF 68 | THfLPTzwJTJrvHRwwsbFbhfbMCpphVtBbB 69 | RjrvzHLzPDvLzPHrTJVrwPndZQNlDZGndZWDdNNcmlQq 70 | tjDsjDGtTjVVbQVCggvrbg 71 | qrWWRBllRFrdlSMCdbSJCP 72 | cZcncRnhphpZWRNtrmsrGpHffmwH 73 | qpRjdcqTcMbbMRTwtnplnwnhPzhBhw 74 | FSFLvNrsPNrsGSLsrFSGfnwBQwZnZwhQQLwwQhnn 75 | sWNVmVmCFNWGsCrrjRTmMjRjPRqgJqJg 76 | sVCnzVpmFpVSnNFCmnmzwRFDWDdMllDccMdwDMjWjWlWjg 77 | BJbPJGGGHPZqZQbpMlWWMWlBljjjgDjh 78 | tGQPpZtfTPpqrHsVLSzmRNLtSFsN 79 | WCDlBWWlvMFWlQWpmSZdZnNmGfJZFZ 80 | LqjTjgtjPcHTTJgLThztcLTLnHnmdSpZdpdffnmZSppfGpSn 81 | PtzqzjtqJgggzhqqccqhrQMsMvMwrCwMlBvMwvvsvs 82 | NMsJfsHTMVbjnLnVsC 83 | htWllhmZcWDWBwhZPcmpVRjnVMRLCCjLFpCwRb 84 | PmZMrBtcPmZWhzDWBtMmJQdddHfQGNSqHqQGGTgr 85 | NmfnnsPlHnGqnlsNNmRPltRLvrhvrSGJSJjvFFFSSFJLhb 86 | PzQZccVPVwgPjrJSJjhFFpQr 87 | TdwBgdTVwzdwzlmNfRqPmqqTql 88 | BVLLBPmPmWBlMlLJnJlBlFQVgdRDdRZRZHpZjQzdRdZQdzQZ 89 | trGTsfbTTgHZptzSZW 90 | fsfTNcCqqNhhVhVFVhVBWLLB 91 | LJwgJNfbCvwCJCwBCCNhhHmGHWWSMWmWmbMmTmmGdS 92 | lzRnnltsstZzzRTfHtHWHGWftfHW 93 | ZFFzVFqzqlFcZscZpRZsNphjhjvjfgJhQgQvwvhC 94 | HHzcFNcHFjhjZjlrghLL 95 | pMZJptpZWCmpttRMCWnnDnBGGDLhlLQrhl 96 | MJsMCTZTTpTJRmMCJzfNsNcfNHqzvvfcww 97 | ZDtllsDlVsrQBqQqRfWl 98 | wvJgpPhhscgvpJFNrRjRrWRjqrRjdjRv 99 | zpsNzCsNCJCCPPHSLzznMnDSLGLM 100 | rfrJjFWrwjpnJjjjfrjJJnFVTgTggRWRRRPPLQgCgQcPPT 101 | sSNbSvqmsSZDZZBtNTTPGgMLMRVcgPCMRb 102 | zZDZzNNSmrfpjFCjzj 103 | dbbNJPBbbrFqNqttqrGbqDcmDQRmFmwcwSnQSDcpwS 104 | ZMMTsHjzLlLcnSVwpRRQ 105 | hZTWjWvTZzTTWhszfwbJhrgJqtBbJGdqNPqt 106 | rrqgHrgtcHJRRjWZlRvnnWBn 107 | QbhVmdFppwbdjnMvlnBwMWZP 108 | TpFDdVTFTDfhHfJcSJSzGZGf 109 | sqNTNZHsHjjFBBwJMMNMcCJD 110 | WGLQPjfWfQWPWmtLSRRRLwBJDbtCCJJCbbwCMBbMBc 111 | RnPdLQfPLRdndGGRvfjlgdrTTgTsrgTrZFzF 112 | BfHbjVVqSBFfMSlCLCDrGSQssvlr 113 | tTpnnzpcPnwzhcnJTDtTPRprGlRGGGCWlQsWvrlvrQGQrC 114 | DPwhghDTpPVHqqdgZbZq 115 | ZzPqfGPtRtqfqPbqfGgGZbrhMjmjBCpHpHNCmHtHjmBHnj 116 | QJwllvFWwDvnwCBBzjwwpC 117 | ccJLVQzWFJvVJlVbgrZZLZLRRPSgdr 118 | rBGbLbnTfnZrQbTnHldqsMmHsqlsWfMd 119 | JcJjCCPzPtjCNHdlGGMlll 120 | jjgpRRvcGbwpThVppT 121 | ttDfjtqfjtpTWWwfTbtlWccNGRSZNGPGhZGhGhcwRh 122 | LbCrHdvzLSSHmSRNmc 123 | JCsBvrvBLzFQbbvlVVnpQpDtWlDqfq 124 | vvdvJBfvdTvRBflBJPNmmffmgPCMwDgsss 125 | rFjqLnMcnqrrtMLtjNgCPCsNzzgsPCGFNs 126 | VqLqnLVZqjMZqWnrVtWlZJJSvHvBdRSvBdRvvJ 127 | zZBDzgQQZLlcglzjrCrCMFjGZbMsHm 128 | PnnJVRfttTtwVnnVFGHVsjCFCjrsMM 129 | wPRpRpRnNTpPNlBdQQDdgDNMhN 130 | bNQpFpnwgtDHpbnhWtffmfmhvhhfsZ 131 | LcdLdwCLPPSVSqqwZGhWdJhGJZhlGlsm 132 | TBwSLPSPVRSVqSVqVrcnpMDDngMgnQpbRQFDNH 133 | vPSvBJZSSdJgpJJZBDGDGrdqGdllGrGDrh 134 | HMtsltFlRVVFtlscRjjMcsWwWChWmrnwDWGwChmjGCWq 135 | MQHNlTVHNVHpbbpbTvvBvf 136 | VsbPMwhbWhzdpzNNggnBcTBWNngQ 137 | RmtZZFZqSjqVHmGQNcBHNLGLGHQH 138 | JjRClqCjZlDZmqSqljFZZqRCvsvPfshhMdwsDwbVwzMzhffb 139 | bfGtRgfDtVmsMzTbmz 140 | LjGZwQLLdjFdHLNMhmzBzMNHNmzN 141 | wjQLCFvnnQGdZLGWSjdqWDfPlrRpqRDDRqrpPr 142 | pqnBZqjCNCqQqmllpHGMGdTfML 143 | PsFgrRvSPsWTwWWQwGHLHW 144 | SrvgsFbrrPJJFsrFPtFSCChBDQjqCqtNhDqhCqNC 145 | RJZRWZWMWZPZffRCPWMdRdfQQQjJzHQsssjrSQFVschVHr 146 | NgpnDgvGTNTVFHFFjVFF 147 | jntvgljpGvlnbLtLbBvnLRPlCCwwCfRqMCCqqqddqw 148 | PFBMVDSVPHMTThtMtSBMMVNbQprHbNRgNRRgLnvpnjnN 149 | scGcrcwlswdGlcqvbQgnnpQnqLjnpp 150 | ffwswWzcmlcWWsmcZhrDFrZMFZBMFzhM 151 | LMdZGqdRSSZmCZMRfQjnggvlvggRcznz 152 | tjjFhBrtpthpslcvvlcQzFnFvQ 153 | jrhbjtpJtbZqCLdWLq 154 | HBGBfBttZzbGbljPdpFddFqRmqRzRN 155 | JDWghDDSDqmmDDpc 156 | CLvgMvChCvLphCTSShhMhQsBbfTfsGsrBfjfrljrZZff 157 | RgHgDqDzqQqgcdHqcZGTNlGffGBDGZBTGZ 158 | LFLPWsmvrbwhwwswrTlTTCBNGFfGlNJZNS 159 | vhrLnvhNmWvMsrvwqMdRcptQtztcjptz 160 | sLMLsThhjgqLlsnsLgTLtMFcRbcPcJSwJbbSbtSWScSt 161 | fvrjjDjvNprdPwwJCCSrWPFP 162 | vfZdGzVzfvGGVGpBjnnMglTsgZlqsMlM 163 | TCVMfCfBnHHfLLPFWb 164 | GgQlGJzNzbzHcHHLlcPLHL 165 | tQbNQGgRZZCVtVMZ 166 | QFFMzwjwngsvsBjGGJWbBbBWbB 167 | QdmVDmVDWRPWVPVV 168 | QHtHSdDpLQCCSHrtqrdrttDfLgvnFvFghNszzwgngFwsNF 169 | RzzTNpSRBzSBVpSRlHNSHBSSGPcLNGtjhPPcbcGhPPhcrnct 170 | CCmmCwwdfFJqDmdwsddhsmvdcMbLfcftttbPnjMPbcjPMPbP 171 | mdZQmvssFdqsFZvsZQmvDvmWzgQBWTRzTzHlppWRglHBQh 172 | VWmnfQWzWWnHWMfmmMVNMfWjtBtBNSNSrlStlpjJBBlgBS 173 | cZZvbwsZsbbZvvscCRdFTTTQrBStdBJgSdhjgBjBjJjpJJ 174 | wCFTCbZbFwwCTvFTwsPGccMzMDWVWfzLGmqHnnDHGLQL 175 | sNQQHbbhdlpdrQllqpsqSpGjZDZGgDnVcnjjnnDZ 176 | WWRLGFvJBJPvzzWjnTncDVZTTPgDff 177 | FLRLGRFRJLBWJmJzMRLCvldrMrbbltdhQQlNqtMbsb 178 | HZllwlZSlSZwhvmQjcZhTqcT 179 | sPzzdgpszpzsBdvvMccvcqPThjhM 180 | JDdsDspLzsdzBgVdBGBzCLlwbbwWSnlnnWffHwJcNlHw 181 | nzCTCnpqJqfCnvvjZjWjPcZrmcmZfW 182 | GNdwgVjwRdRglMrPWLPWZWcNWW 183 | dVblgtRwQgSGVBldbQBbBRJnQJTsJHTqnzzJFpjvHnnn 184 | dqpQQrdqQpLfqcGSdggQdgRMmwHBMMBVNRNDFFBDBgNt 185 | vTzsnZCnlCnshbPlvZJbBzVmmVRDNwtHFBwMDVBR 186 | lJCshjTJbVqfVdjjjG 187 | WlLCJlHLcZcJWcWZJnLHnPqlFtSthTnFNThVtNhVhvNVzVtF 188 | QfbgRsspfDRsgfjqqRRpDbSNSTFzBbTbhttVBhVNBzzT 189 | fwgfRdpdfQDqgPHHZJZCcdGddH 190 | sbrbmVmfddzJntZZtwtMMf 191 | PvhwPRlvvWhFvSRhpFMMJGMFppnBTBGJ 192 | RPlCCLDPDClwHbrdzsdNLzgs 193 | HZgqtgbqRZvzwzCh 194 | BFqmGfrNLQfhzJWBhRJwJR 195 | LFqFQjrcrcqFNMmMdHggntDPMnsDbn 196 | NmWmPblGnnTTNlFGPmNWfwdchdlHdBdwcfCfZppZ 197 | rzqzRjgVrJrzzcFdqdCBFBhZhH 198 | VDRsRMjRJJrQsJPTGFNvsbnsnLGm 199 | nrbrBLTffjNRzGQSJHJQGT 200 | tcZqMcppCmHRQPGGCG 201 | pMDcZhpgcpFDfrwNDDrLVjGj 202 | LWlmlmWqvrBMWWBlmjLThBrfPJZfZZCwPCJJwPCTcggCsd 203 | pSbRHbzpHDVFRQRfPdfnZswgcJcppp 204 | SzRNGbzSWNPLWqLv 205 | vqslblpspsvqBFSqcrrZZDdTfFPHccrf 206 | GWRhWmjwhRcQdCDrPjDP 207 | mcWLVnnWJgGRzVSsVSpSSptNpMvb 208 | wHTPfdTvHlPHGpdvvTddGfcJLLWWwWWcCWrqrVMWCVLL 209 | zhsSNZhnshNSnvZmvsCWWSLrVMcrSCLWJcrq 210 | snDnshmNsjnTdHPfDGvdDT 211 | CfrnFFMnnsRNrNCwFCrdssgqgqvVZvZqlTWBNWZqlJBW 212 | htDhDLhwPWWBqTghgB 213 | DPLPzHDtSPStjLGLtzSMwbdMdnCHrRdCFsmfnR 214 | nBNWCvJmVPNnCPNDJWbtmSwqTttcQsSqtqTjQQ 215 | pMflzLlffRRMRdFlflpLddGdsTjwHqzcvwTqtsStQQjtwwsQ 216 | ZhGlphlpvvLLfFGvMLhfrfWNJNNPVPbnPhnDgDbDDNbJ 217 | ZCpCmVlZvlpBBwvvMCrJhrfhMfjjWMSG 218 | qhstFzFFqzHGzNfSMJSGzM 219 | QnHRPRgRQPtPhtnDsqsbDQPBlTcpBwmVmTvbwdwBTVZVpl 220 | PHmqHdddqBWMmTvMvTGMBWPdwhssnnHlhgsNwhwNHQzwrswh 221 | cSbVcDLtbfLSFzhlhJswgtrsww 222 | bSLlFLFFLDZVLpZVjFLdPMdBBqGGPmmqWGdGjM 223 | FQCnQwFRbnrSfgQgwFRCnswmPLpMppPdMMllpLMptMLldPSZ 224 | cJhhJcJVBJjhfHDvJqThvVDcpdGGqdZGdlltpqWdMqpdGWtG 225 | HhzTjJBzJTvNJHvzvvNBzBFnFCNCbCwrbnRbgRwfwQsg 226 | jRzDgbDDQDgVqqDGsjttNdwqNJZNwNdTWrpB 227 | MHvvvlSHFllMhhMrpWBJtlWdpJrTwZ 228 | mFcFFHmCmtcvfvFFHHLDGnRVzjDgnmgmnzGgGg 229 | JJhDpDdmsJJdgmhrpPjGjFLPPSNpjL 230 | WbznbRGnPfrfRSrN 231 | WqGnnVGVMGHtWTCgJvZHggBggZCg 232 | wlrPQtZQvwrzlvNfZLMZBjbbqjqLbSBjTg 233 | PGJDVdsdhsPVPjbTcLcGLgjqbM 234 | VPDRHWRdsRQvpfmmlw 235 | pvTZTSpTZvGGphNvvbDpdrMqrjlWdPqqjWdldNrd 236 | gmmJmsQfJgcRQJQJJncVQjMWllSnqljqBlPPjPHHHH 237 | QVJQRVcwmJcchwpSZLwGbSZZ 238 | zjrDMWcjDzQjDlWrnqqRBRNhBJRBhBJqnf 239 | TTGPPdgGLwdHGwGPTgLbbvhHtRRNRRSfchqRvSqHRJ 240 | TZTccPpdZwPQjllsspjVzD 241 | jHLHhHFRjhcblDRRWbWTdtppLTntTnMmGLMvTp 242 | BBQBgBBCrrgqJqTtMZMpngdtpvpG 243 | QJJJQrsVsQQfQVPCNqsNSjHdhhdRHDNHFHFclh 244 | RbCLnvdtnLRLRbmLPpHdQCvmNJpJSZSJlgDzglGlzcclcDGD 245 | qBBwMjfsFMjsMbfWbwjlzDZlcWclJczgNDGNDl 246 | wqjhrwwhhCvbQPrRnC 247 | vpWDDDWZQQNGllwHlwWVGj 248 | LCPdqdcdtsvdsCtsddvmVrVjjrBwHlmswmBnmw 249 | fLfvSgvMfdCPqzZNThfNNpTJJQ 250 | CVVVLbNVmGNQbGbGHHbHbvdwgQlwJDTFgJQdDZDJFD 251 | ssWBsBWrjSzWrPtBjnSCTwvFZlDjwZDdgwTDwggv 252 | nntPBqBrPsBfnCRCBWzCVcGVHMLNcbHLNmHqGphp 253 | sbbwwzdsbqQQbQnnNbPNGbznHHRdLTggMVHFVvRZTRVRHMZF 254 | mWffDWfflBpfmcWjWrrJVvgRLlMZVVhMFFTlHhMM 255 | rJJCctmjcfvzsqsqbtbqPP 256 | HGWjHWzVctQVcJVtjvRsvLTddqDDDsjRLg 257 | bbMnlNChZQLZhdDs 258 | SMMMMMMNmMllSlrmCczGcVzBcGWFBQGcrt 259 | VwQlqcLfdLGqdqDjjgZrjZBdttjd 260 | zSPPPJzJGjJjZrCBDt 261 | WMTMsTWsccsvGGwH 262 | hZvbQrjTTZjZcjWNrjnQrcTRpGMqcRfRRGzHfHfpfRMqRz 263 | mDJlFmwCVVwbCVbPBRLMMLpRLwRLHqpR 264 | gsCmgJsPDCtCVlvbhgQjhgQbnQbd 265 | fSgbhhGPGJGhRDmlhhHcHDBH 266 | LsMwQWFswsQMsQMvjslcBcDldBTWfDcHRRdl 267 | ZpVFwLQwVLQvCVsMjrJbbCNPbzSJtPbPPf 268 | VDzWMCpfCcCRDzqDzqNnvLZnfntHQnPPLQlt 269 | sJmdbTBdmmGhFhhbJNNQlJnQlQLHPZNn 270 | sdwmwsdrmMRpDRMLcw 271 | JpWmSWpCnCbJBZHZVldbdfZf 272 | rgdrgNdrjgNPrMjwTssrPdfDZqsVfQHDFlQDDHQVsZfB 273 | TRPdNNLgjNwrRTrJpppzCmzmCLSnvS 274 | QbtQJHQmbmfmBRvbQRzBvldqcFljsGcFdGdvsqqGls 275 | ChCPWhDhWZWJVnZpCNChhVDcMcDdcdgGscjgFjGFlsjjGq 276 | WZNTWNhNZfJJbTJTmR 277 | CHGCHFcZvCrchrZrhsVtsBQjMstfZMMBgg 278 | NNqwDLmDjJgQBmVQ 279 | wdWLLTgWRTWcCcbrHCHhGW 280 | bTZZvNjNjLgTCHcWhccfhWJdhvnc 281 | mnFFmPGSwRPShzVPPWPdhhzr 282 | FRtBFGBMFQFttRwtZgTjCTnQNbNLjTCH 283 | bJSqrSpDJbSNbFjSFCfPWGcwGWPrcTCfwr 284 | tRtLhDsvhQZlHRhRtQQnCnCcdwCPwTwdGcGP 285 | HsHvsmBZvmvsmBhHvLssVqDSNgFMDzgbbDVJzbpMVq 286 | nSSDHRRRQRBCLCQC 287 | qGmfPzGmGlrrrpfrqlzrJtLvBlhQbSCvbtCtlFhLFC 288 | zzpmqqJJVVfJfPfMpfdHNndsNwDSMSDDNcsc 289 | CscQsVMhCsMsMHhhVthtwmgZNRqzWLBRLRLmBWmZWBND 290 | JQJdddrjrLqBgDBq 291 | QbFlTffpMbMnsPCh 292 | gDdbVbVDddDfVfWQfBRLQZsZLRQQ 293 | FCCTrGCMStwGHTtTWLQhLZrlRssRhRhp 294 | FSHqtFTmFwmCsSwGTHtMTSdjjcdnVddgzmbVmjmndbbD 295 | JtBBMcLWLdfFLhMttcWWhfWLrTRGFsbwTmRGwmwbbCTGGsbD 296 | PzQpSQQQvzVvpzHqjvNvQSvGRmmTDVRDmsGsRGsrcDcDGC 297 | cQPHSPvPvZHqcZjzpZjnZNtWlLdtldJWfnfhlJJtLdMg 298 | nPPssTBnMJPdtHPVHtRhpv 299 | bSSgGFWDgWwDFFlmWlcShqdpRqpVcHvvnqpvpRHd 300 | bGFnGljgSsjBCTBszz -------------------------------------------------------------------------------- /day03b/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | println!( 3 | "{}", 4 | include_bytes!("../input.txt") 5 | .split(|b| *b == b'\n') 6 | .collect::>() 7 | .chunks(3) 8 | .map(|set| set[0] 9 | .iter() 10 | .find(|b| set[1].contains(b) && set[2].contains(b)) 11 | .unwrap()) 12 | .map(|b| if *b >= b'a' { 13 | (b - b'a') as i16 + 1 14 | } else { 15 | (b - b'A') as i16 + 27 16 | }) 17 | .sum::(), 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /day04a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day04a" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day04a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day04a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | -------------------------------------------------------------------------------- /day04a/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | println!( 3 | "{}", 4 | include_str!("../input.txt") 5 | .lines() 6 | .map(|l| { 7 | let (l, r) = l.split_once(',').unwrap(); 8 | let ((a, b), (c, d)) = (l.split_once('-').unwrap(), r.split_once('-').unwrap()); 9 | ( 10 | a.parse::().unwrap(), 11 | b.parse::().unwrap(), 12 | c.parse::().unwrap(), 13 | d.parse::().unwrap(), 14 | ) 15 | }) 16 | .filter(|(a, b, c, d)| (a >= c && b <= d) || (a <= c && b >= d)) 17 | .count() 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /day04b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day04b" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day04b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day04b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | -------------------------------------------------------------------------------- /day04b/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | println!( 3 | "{}", 4 | include_str!("../input.txt") 5 | .lines() 6 | .map(|l| { 7 | let (l, r) = l.split_once(',').unwrap(); 8 | let ((a, b), (c, d)) = (l.split_once('-').unwrap(), r.split_once('-').unwrap()); 9 | ( 10 | a.parse::().unwrap(), 11 | b.parse::().unwrap(), 12 | c.parse::().unwrap(), 13 | d.parse::().unwrap(), 14 | ) 15 | }) 16 | .filter(|(a, b, c, d)| a <= d && c <= b) 17 | .count() 18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /day05a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "atoi" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 10 | dependencies = [ 11 | "num-traits", 12 | ] 13 | 14 | [[package]] 15 | name = "autocfg" 16 | version = "1.1.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 19 | 20 | [[package]] 21 | name = "day05a" 22 | version = "0.1.0" 23 | dependencies = [ 24 | "atoi", 25 | "itertools", 26 | ] 27 | 28 | [[package]] 29 | name = "either" 30 | version = "1.8.0" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 33 | 34 | [[package]] 35 | name = "itertools" 36 | version = "0.10.5" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 39 | dependencies = [ 40 | "either", 41 | ] 42 | 43 | [[package]] 44 | name = "num-traits" 45 | version = "0.2.15" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 48 | dependencies = [ 49 | "autocfg", 50 | ] 51 | -------------------------------------------------------------------------------- /day05a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day05a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | itertools = "0.10" 13 | -------------------------------------------------------------------------------- /day05a/input.txt: -------------------------------------------------------------------------------- 1 | [B] [L] [J] 2 | [B] [Q] [R] [D] [T] 3 | [G] [H] [H] [M] [N] [F] 4 | [J] [N] [D] [F] [J] [H] [B] 5 | [Q] [F] [W] [S] [V] [N] [F] [N] 6 | [W] [N] [H] [M] [L] [B] [R] [T] [Q] 7 | [L] [T] [C] [R] [R] [J] [W] [Z] [L] 8 | [S] [J] [S] [T] [T] [M] [D] [B] [H] 9 | 1 2 3 4 5 6 7 8 9 10 | 11 | move 5 from 4 to 5 12 | move 2 from 5 to 8 13 | move 2 from 9 to 1 14 | move 2 from 9 to 1 15 | move 1 from 5 to 3 16 | move 10 from 5 to 8 17 | move 1 from 4 to 7 18 | move 1 from 1 to 2 19 | move 5 from 3 to 7 20 | move 1 from 2 to 8 21 | move 21 from 8 to 5 22 | move 13 from 5 to 7 23 | move 2 from 9 to 4 24 | move 1 from 7 to 4 25 | move 5 from 1 to 4 26 | move 1 from 5 to 7 27 | move 2 from 2 to 7 28 | move 1 from 3 to 2 29 | move 1 from 1 to 6 30 | move 7 from 5 to 9 31 | move 16 from 7 to 4 32 | move 7 from 9 to 3 33 | move 1 from 7 to 5 34 | move 1 from 3 to 8 35 | move 3 from 2 to 7 36 | move 1 from 8 to 9 37 | move 3 from 3 to 6 38 | move 21 from 4 to 9 39 | move 1 from 5 to 7 40 | move 4 from 4 to 9 41 | move 8 from 6 to 3 42 | move 6 from 7 to 1 43 | move 12 from 9 to 8 44 | move 6 from 7 to 2 45 | move 3 from 6 to 5 46 | move 1 from 6 to 9 47 | move 4 from 8 to 6 48 | move 3 from 8 to 5 49 | move 4 from 1 to 8 50 | move 4 from 6 to 1 51 | move 2 from 1 to 3 52 | move 1 from 5 to 8 53 | move 2 from 2 to 8 54 | move 5 from 8 to 3 55 | move 4 from 2 to 7 56 | move 5 from 8 to 1 57 | move 2 from 1 to 7 58 | move 1 from 8 to 2 59 | move 2 from 1 to 7 60 | move 11 from 9 to 2 61 | move 1 from 8 to 5 62 | move 2 from 9 to 4 63 | move 3 from 9 to 5 64 | move 2 from 5 to 1 65 | move 6 from 5 to 8 66 | move 2 from 4 to 2 67 | move 1 from 5 to 6 68 | move 7 from 1 to 8 69 | move 2 from 2 to 7 70 | move 13 from 8 to 1 71 | move 16 from 3 to 1 72 | move 3 from 2 to 1 73 | move 12 from 7 to 6 74 | move 15 from 1 to 8 75 | move 2 from 3 to 8 76 | move 16 from 1 to 2 77 | move 24 from 2 to 8 78 | move 1 from 1 to 5 79 | move 1 from 5 to 8 80 | move 3 from 6 to 7 81 | move 26 from 8 to 3 82 | move 20 from 3 to 9 83 | move 1 from 2 to 9 84 | move 16 from 9 to 3 85 | move 14 from 3 to 1 86 | move 13 from 1 to 6 87 | move 3 from 3 to 4 88 | move 3 from 9 to 4 89 | move 1 from 7 to 8 90 | move 5 from 8 to 2 91 | move 8 from 8 to 5 92 | move 18 from 6 to 1 93 | move 4 from 8 to 5 94 | move 6 from 4 to 1 95 | move 2 from 2 to 5 96 | move 5 from 3 to 8 97 | move 5 from 8 to 7 98 | move 2 from 5 to 8 99 | move 5 from 5 to 4 100 | move 3 from 2 to 8 101 | move 22 from 1 to 2 102 | move 1 from 1 to 2 103 | move 5 from 8 to 2 104 | move 2 from 5 to 2 105 | move 1 from 1 to 6 106 | move 5 from 5 to 2 107 | move 1 from 9 to 8 108 | move 5 from 4 to 1 109 | move 6 from 6 to 9 110 | move 3 from 1 to 9 111 | move 1 from 1 to 7 112 | move 8 from 9 to 6 113 | move 6 from 7 to 1 114 | move 5 from 6 to 5 115 | move 27 from 2 to 1 116 | move 4 from 5 to 7 117 | move 9 from 1 to 5 118 | move 1 from 9 to 1 119 | move 3 from 6 to 2 120 | move 9 from 2 to 1 121 | move 2 from 7 to 2 122 | move 1 from 8 to 7 123 | move 10 from 5 to 9 124 | move 1 from 9 to 7 125 | move 25 from 1 to 8 126 | move 6 from 7 to 4 127 | move 11 from 1 to 7 128 | move 3 from 8 to 1 129 | move 3 from 2 to 6 130 | move 3 from 8 to 9 131 | move 11 from 8 to 6 132 | move 1 from 2 to 6 133 | move 12 from 6 to 4 134 | move 13 from 4 to 5 135 | move 1 from 6 to 1 136 | move 3 from 7 to 5 137 | move 5 from 8 to 7 138 | move 1 from 7 to 1 139 | move 5 from 1 to 6 140 | move 3 from 6 to 4 141 | move 3 from 8 to 6 142 | move 2 from 5 to 2 143 | move 12 from 5 to 9 144 | move 5 from 6 to 2 145 | move 2 from 5 to 9 146 | move 6 from 4 to 9 147 | move 11 from 7 to 3 148 | move 1 from 2 to 5 149 | move 1 from 7 to 8 150 | move 1 from 5 to 7 151 | move 1 from 7 to 1 152 | move 1 from 8 to 1 153 | move 2 from 4 to 7 154 | move 2 from 6 to 8 155 | move 5 from 3 to 6 156 | move 2 from 7 to 2 157 | move 2 from 2 to 9 158 | move 1 from 2 to 9 159 | move 1 from 1 to 6 160 | move 35 from 9 to 7 161 | move 2 from 8 to 7 162 | move 3 from 3 to 8 163 | move 5 from 2 to 4 164 | move 3 from 3 to 7 165 | move 2 from 4 to 7 166 | move 4 from 6 to 5 167 | move 4 from 5 to 9 168 | move 3 from 4 to 5 169 | move 1 from 8 to 3 170 | move 4 from 9 to 8 171 | move 1 from 9 to 6 172 | move 38 from 7 to 2 173 | move 1 from 3 to 5 174 | move 1 from 1 to 7 175 | move 4 from 7 to 3 176 | move 3 from 6 to 1 177 | move 22 from 2 to 7 178 | move 1 from 5 to 8 179 | move 7 from 8 to 4 180 | move 8 from 2 to 8 181 | move 3 from 5 to 1 182 | move 4 from 3 to 9 183 | move 1 from 8 to 3 184 | move 1 from 3 to 7 185 | move 2 from 2 to 3 186 | move 5 from 8 to 9 187 | move 3 from 9 to 1 188 | move 2 from 1 to 7 189 | move 6 from 2 to 3 190 | move 6 from 3 to 1 191 | move 2 from 3 to 6 192 | move 1 from 6 to 1 193 | move 14 from 7 to 2 194 | move 4 from 1 to 6 195 | move 8 from 1 to 3 196 | move 4 from 3 to 6 197 | move 3 from 9 to 5 198 | move 1 from 8 to 6 199 | move 1 from 8 to 4 200 | move 9 from 7 to 1 201 | move 8 from 2 to 4 202 | move 4 from 2 to 9 203 | move 2 from 2 to 1 204 | move 3 from 5 to 8 205 | move 1 from 8 to 6 206 | move 1 from 7 to 8 207 | move 1 from 6 to 5 208 | move 3 from 9 to 5 209 | move 2 from 9 to 5 210 | move 4 from 3 to 9 211 | move 3 from 6 to 3 212 | move 3 from 6 to 9 213 | move 9 from 4 to 1 214 | move 1 from 9 to 8 215 | move 3 from 3 to 6 216 | move 2 from 7 to 4 217 | move 4 from 8 to 5 218 | move 7 from 5 to 6 219 | move 19 from 1 to 9 220 | move 5 from 9 to 3 221 | move 2 from 1 to 6 222 | move 1 from 4 to 6 223 | move 4 from 3 to 2 224 | move 21 from 9 to 7 225 | move 1 from 1 to 2 226 | move 1 from 9 to 1 227 | move 1 from 1 to 8 228 | move 16 from 7 to 6 229 | move 24 from 6 to 5 230 | move 7 from 4 to 5 231 | move 1 from 8 to 3 232 | move 2 from 2 to 8 233 | move 31 from 5 to 8 234 | move 1 from 4 to 6 235 | move 2 from 6 to 9 236 | move 1 from 7 to 4 237 | move 3 from 7 to 9 238 | move 1 from 4 to 8 239 | move 2 from 3 to 5 240 | move 1 from 2 to 3 241 | move 1 from 3 to 7 242 | move 1 from 7 to 9 243 | move 24 from 8 to 6 244 | move 1 from 8 to 1 245 | move 30 from 6 to 1 246 | move 2 from 5 to 2 247 | move 1 from 6 to 9 248 | move 6 from 9 to 7 249 | move 1 from 6 to 4 250 | move 1 from 4 to 6 251 | move 23 from 1 to 3 252 | move 21 from 3 to 4 253 | move 4 from 2 to 6 254 | move 3 from 6 to 1 255 | move 1 from 5 to 1 256 | move 4 from 1 to 9 257 | move 3 from 9 to 6 258 | move 8 from 1 to 6 259 | move 4 from 8 to 5 260 | move 2 from 7 to 5 261 | move 7 from 4 to 3 262 | move 3 from 4 to 9 263 | move 9 from 3 to 9 264 | move 1 from 7 to 6 265 | move 6 from 5 to 8 266 | move 14 from 6 to 2 267 | move 4 from 8 to 4 268 | move 7 from 4 to 5 269 | move 1 from 7 to 9 270 | move 6 from 4 to 3 271 | move 13 from 2 to 6 272 | move 5 from 3 to 7 273 | move 1 from 3 to 8 274 | move 1 from 8 to 2 275 | move 4 from 8 to 3 276 | move 6 from 6 to 4 277 | move 2 from 2 to 8 278 | move 5 from 4 to 7 279 | move 3 from 7 to 5 280 | move 1 from 7 to 9 281 | move 2 from 3 to 9 282 | move 3 from 7 to 3 283 | move 1 from 7 to 9 284 | move 1 from 7 to 9 285 | move 3 from 4 to 1 286 | move 6 from 6 to 1 287 | move 2 from 7 to 5 288 | move 1 from 3 to 5 289 | move 11 from 9 to 4 290 | move 9 from 4 to 5 291 | move 3 from 3 to 4 292 | move 1 from 3 to 9 293 | move 2 from 8 to 1 294 | move 9 from 1 to 8 295 | move 22 from 5 to 8 296 | move 2 from 1 to 3 297 | move 3 from 4 to 6 298 | move 14 from 8 to 9 299 | move 1 from 3 to 9 300 | move 19 from 9 to 3 301 | move 3 from 9 to 4 302 | move 2 from 7 to 2 303 | move 1 from 4 to 6 304 | move 1 from 3 to 8 305 | move 8 from 3 to 1 306 | move 2 from 9 to 6 307 | move 1 from 2 to 5 308 | move 3 from 4 to 9 309 | move 1 from 2 to 3 310 | move 20 from 8 to 3 311 | move 4 from 9 to 5 312 | move 1 from 4 to 2 313 | move 26 from 3 to 5 314 | move 1 from 8 to 3 315 | move 8 from 1 to 4 316 | move 1 from 3 to 7 317 | move 1 from 2 to 1 318 | move 1 from 1 to 6 319 | move 1 from 6 to 7 320 | move 4 from 5 to 3 321 | move 3 from 4 to 2 322 | move 5 from 5 to 3 323 | move 2 from 2 to 6 324 | move 3 from 3 to 5 325 | move 2 from 4 to 8 326 | move 5 from 3 to 9 327 | move 5 from 9 to 8 328 | move 19 from 5 to 9 329 | move 1 from 5 to 2 330 | move 2 from 7 to 1 331 | move 1 from 1 to 7 332 | move 1 from 7 to 4 333 | move 13 from 9 to 3 334 | move 8 from 6 to 2 335 | move 10 from 3 to 5 336 | move 14 from 5 to 4 337 | move 7 from 8 to 4 338 | move 1 from 6 to 2 339 | move 6 from 3 to 8 340 | move 4 from 9 to 7 341 | move 2 from 9 to 8 342 | move 1 from 7 to 1 343 | move 3 from 2 to 7 344 | move 1 from 5 to 3 345 | move 7 from 8 to 6 346 | move 5 from 6 to 2 347 | move 8 from 4 to 5 348 | move 3 from 5 to 8 349 | move 3 from 8 to 6 350 | move 5 from 7 to 9 351 | move 5 from 3 to 6 352 | move 1 from 9 to 4 353 | move 17 from 4 to 7 354 | move 1 from 8 to 1 355 | move 12 from 7 to 8 356 | move 3 from 1 to 4 357 | move 2 from 4 to 6 358 | move 8 from 6 to 1 359 | move 4 from 6 to 3 360 | move 1 from 7 to 8 361 | move 5 from 5 to 8 362 | move 4 from 7 to 1 363 | move 3 from 2 to 6 364 | move 2 from 5 to 1 365 | move 6 from 1 to 6 366 | move 4 from 3 to 5 367 | move 4 from 5 to 3 368 | move 1 from 4 to 8 369 | move 3 from 3 to 2 370 | move 17 from 8 to 4 371 | move 6 from 6 to 3 372 | move 14 from 4 to 9 373 | move 1 from 3 to 8 374 | move 1 from 7 to 4 375 | move 3 from 8 to 3 376 | move 5 from 2 to 5 377 | move 6 from 1 to 7 378 | move 2 from 6 to 4 379 | move 4 from 5 to 7 380 | move 1 from 1 to 5 381 | move 1 from 6 to 3 382 | move 10 from 7 to 4 383 | move 1 from 5 to 4 384 | move 1 from 2 to 3 385 | move 15 from 4 to 5 386 | move 3 from 3 to 1 387 | move 6 from 2 to 6 388 | move 1 from 2 to 3 389 | move 2 from 4 to 7 390 | move 2 from 7 to 8 391 | move 1 from 4 to 2 392 | move 2 from 1 to 7 393 | move 1 from 7 to 2 394 | move 12 from 9 to 1 395 | move 4 from 9 to 5 396 | move 4 from 6 to 2 397 | move 1 from 7 to 3 398 | move 6 from 2 to 4 399 | move 1 from 8 to 5 400 | move 2 from 4 to 2 401 | move 11 from 1 to 7 402 | move 3 from 1 to 4 403 | move 17 from 5 to 6 404 | move 15 from 6 to 4 405 | move 1 from 8 to 9 406 | move 10 from 4 to 1 407 | move 1 from 3 to 9 408 | move 2 from 6 to 5 409 | move 1 from 2 to 6 410 | move 4 from 5 to 6 411 | move 4 from 1 to 2 412 | move 6 from 6 to 7 413 | move 2 from 2 to 6 414 | move 9 from 4 to 9 415 | move 6 from 1 to 2 416 | move 3 from 4 to 1 417 | move 10 from 9 to 8 418 | move 4 from 2 to 1 419 | move 1 from 1 to 2 420 | move 5 from 8 to 6 421 | move 1 from 2 to 7 422 | move 1 from 9 to 4 423 | move 2 from 6 to 9 424 | move 13 from 7 to 2 425 | move 5 from 7 to 5 426 | move 2 from 5 to 2 427 | move 1 from 4 to 5 428 | move 4 from 8 to 4 429 | move 17 from 2 to 6 430 | move 3 from 4 to 6 431 | move 2 from 9 to 1 432 | move 7 from 6 to 8 433 | move 1 from 5 to 2 434 | move 1 from 4 to 1 435 | move 2 from 9 to 4 436 | move 1 from 3 to 9 437 | move 4 from 3 to 7 438 | move 2 from 8 to 5 439 | move 3 from 7 to 5 440 | move 10 from 5 to 8 441 | move 2 from 2 to 4 442 | move 6 from 1 to 2 443 | move 4 from 6 to 3 444 | move 8 from 2 to 6 445 | move 1 from 7 to 4 446 | move 5 from 4 to 5 447 | move 7 from 6 to 7 448 | move 5 from 3 to 5 449 | move 5 from 5 to 2 450 | move 4 from 8 to 1 451 | move 6 from 1 to 6 452 | move 3 from 3 to 2 453 | move 22 from 6 to 2 454 | move 1 from 9 to 7 455 | move 8 from 8 to 6 456 | move 1 from 7 to 6 457 | move 2 from 5 to 7 458 | move 4 from 8 to 5 459 | move 7 from 6 to 7 460 | move 2 from 6 to 4 461 | move 14 from 2 to 1 462 | move 7 from 1 to 3 463 | move 12 from 7 to 3 464 | move 1 from 4 to 3 465 | move 2 from 5 to 8 466 | move 2 from 8 to 1 467 | move 1 from 4 to 3 468 | move 6 from 2 to 9 469 | move 6 from 9 to 2 470 | move 2 from 2 to 7 471 | move 6 from 7 to 5 472 | move 13 from 3 to 5 473 | move 5 from 2 to 6 474 | move 5 from 6 to 1 475 | move 2 from 3 to 6 476 | move 1 from 6 to 5 477 | move 1 from 6 to 1 478 | move 3 from 1 to 9 479 | move 6 from 2 to 7 480 | move 1 from 2 to 3 481 | move 24 from 5 to 2 482 | move 7 from 3 to 7 483 | move 13 from 7 to 9 484 | move 4 from 1 to 9 485 | move 4 from 1 to 6 486 | move 1 from 5 to 6 487 | move 16 from 9 to 5 488 | move 1 from 6 to 4 489 | move 1 from 5 to 2 490 | move 5 from 1 to 3 491 | move 11 from 2 to 1 492 | move 4 from 9 to 6 493 | move 1 from 4 to 7 494 | move 2 from 3 to 4 495 | move 6 from 6 to 9 496 | move 1 from 1 to 3 497 | move 2 from 9 to 4 498 | move 1 from 7 to 9 499 | move 4 from 2 to 9 500 | move 8 from 9 to 2 501 | move 3 from 3 to 2 502 | move 1 from 9 to 4 503 | move 5 from 1 to 7 504 | move 1 from 4 to 8 505 | move 2 from 1 to 9 506 | move 1 from 8 to 7 507 | move 6 from 5 to 3 508 | move 1 from 5 to 1 509 | move 5 from 2 to 3 510 | move 4 from 1 to 5 511 | move 4 from 7 to 1 512 | move 8 from 5 to 8 -------------------------------------------------------------------------------- /day05a/src/main.rs: -------------------------------------------------------------------------------- 1 | use itertools::Itertools; 2 | 3 | const STACKS: usize = 9; 4 | 5 | pub fn main() { 6 | let d = include_bytes!("../input.txt"); 7 | let (b, m) = d.split_at(d.windows(2).position(|b| b == b"\n\n").unwrap() + 2); 8 | let mut s: [Vec; STACKS] = Default::default(); 9 | 10 | b.split(|b| b == &b'\n').rev().skip(1).for_each(|l| { 11 | l.iter() 12 | .skip(1) 13 | .step_by(4) 14 | .enumerate() 15 | .filter(|(_, c)| c != &&b' ') 16 | .for_each(|(i, c)| s[i].push(*c)) 17 | }); 18 | 19 | m.split(|b| b == &b'\n').for_each(|m| { 20 | let (n, a, b): (usize, _, _) = m 21 | .split(|b| b == &b' ') 22 | .skip(1) 23 | .step_by(2) 24 | .map(|n| atoi::atoi(n).unwrap()) 25 | .collect_tuple() 26 | .unwrap(); 27 | for _ in 0..n { 28 | let tmp = s[a - 1].pop().unwrap(); 29 | s[b - 1].push(tmp); 30 | } 31 | }); 32 | 33 | s.iter() 34 | .for_each(|s| print!("{}", *s.last().unwrap() as char)); 35 | println!(); 36 | } 37 | -------------------------------------------------------------------------------- /day05b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "atoi" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 10 | dependencies = [ 11 | "num-traits", 12 | ] 13 | 14 | [[package]] 15 | name = "autocfg" 16 | version = "1.1.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 19 | 20 | [[package]] 21 | name = "day05b" 22 | version = "0.1.0" 23 | dependencies = [ 24 | "atoi", 25 | "itertools", 26 | ] 27 | 28 | [[package]] 29 | name = "either" 30 | version = "1.8.0" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 33 | 34 | [[package]] 35 | name = "itertools" 36 | version = "0.10.5" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 39 | dependencies = [ 40 | "either", 41 | ] 42 | 43 | [[package]] 44 | name = "num-traits" 45 | version = "0.2.15" 46 | source = "registry+https://github.com/rust-lang/crates.io-index" 47 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 48 | dependencies = [ 49 | "autocfg", 50 | ] 51 | -------------------------------------------------------------------------------- /day05b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day05b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | itertools = "0.10" 13 | -------------------------------------------------------------------------------- /day05b/input.txt: -------------------------------------------------------------------------------- 1 | [B] [L] [J] 2 | [B] [Q] [R] [D] [T] 3 | [G] [H] [H] [M] [N] [F] 4 | [J] [N] [D] [F] [J] [H] [B] 5 | [Q] [F] [W] [S] [V] [N] [F] [N] 6 | [W] [N] [H] [M] [L] [B] [R] [T] [Q] 7 | [L] [T] [C] [R] [R] [J] [W] [Z] [L] 8 | [S] [J] [S] [T] [T] [M] [D] [B] [H] 9 | 1 2 3 4 5 6 7 8 9 10 | 11 | move 5 from 4 to 5 12 | move 2 from 5 to 8 13 | move 2 from 9 to 1 14 | move 2 from 9 to 1 15 | move 1 from 5 to 3 16 | move 10 from 5 to 8 17 | move 1 from 4 to 7 18 | move 1 from 1 to 2 19 | move 5 from 3 to 7 20 | move 1 from 2 to 8 21 | move 21 from 8 to 5 22 | move 13 from 5 to 7 23 | move 2 from 9 to 4 24 | move 1 from 7 to 4 25 | move 5 from 1 to 4 26 | move 1 from 5 to 7 27 | move 2 from 2 to 7 28 | move 1 from 3 to 2 29 | move 1 from 1 to 6 30 | move 7 from 5 to 9 31 | move 16 from 7 to 4 32 | move 7 from 9 to 3 33 | move 1 from 7 to 5 34 | move 1 from 3 to 8 35 | move 3 from 2 to 7 36 | move 1 from 8 to 9 37 | move 3 from 3 to 6 38 | move 21 from 4 to 9 39 | move 1 from 5 to 7 40 | move 4 from 4 to 9 41 | move 8 from 6 to 3 42 | move 6 from 7 to 1 43 | move 12 from 9 to 8 44 | move 6 from 7 to 2 45 | move 3 from 6 to 5 46 | move 1 from 6 to 9 47 | move 4 from 8 to 6 48 | move 3 from 8 to 5 49 | move 4 from 1 to 8 50 | move 4 from 6 to 1 51 | move 2 from 1 to 3 52 | move 1 from 5 to 8 53 | move 2 from 2 to 8 54 | move 5 from 8 to 3 55 | move 4 from 2 to 7 56 | move 5 from 8 to 1 57 | move 2 from 1 to 7 58 | move 1 from 8 to 2 59 | move 2 from 1 to 7 60 | move 11 from 9 to 2 61 | move 1 from 8 to 5 62 | move 2 from 9 to 4 63 | move 3 from 9 to 5 64 | move 2 from 5 to 1 65 | move 6 from 5 to 8 66 | move 2 from 4 to 2 67 | move 1 from 5 to 6 68 | move 7 from 1 to 8 69 | move 2 from 2 to 7 70 | move 13 from 8 to 1 71 | move 16 from 3 to 1 72 | move 3 from 2 to 1 73 | move 12 from 7 to 6 74 | move 15 from 1 to 8 75 | move 2 from 3 to 8 76 | move 16 from 1 to 2 77 | move 24 from 2 to 8 78 | move 1 from 1 to 5 79 | move 1 from 5 to 8 80 | move 3 from 6 to 7 81 | move 26 from 8 to 3 82 | move 20 from 3 to 9 83 | move 1 from 2 to 9 84 | move 16 from 9 to 3 85 | move 14 from 3 to 1 86 | move 13 from 1 to 6 87 | move 3 from 3 to 4 88 | move 3 from 9 to 4 89 | move 1 from 7 to 8 90 | move 5 from 8 to 2 91 | move 8 from 8 to 5 92 | move 18 from 6 to 1 93 | move 4 from 8 to 5 94 | move 6 from 4 to 1 95 | move 2 from 2 to 5 96 | move 5 from 3 to 8 97 | move 5 from 8 to 7 98 | move 2 from 5 to 8 99 | move 5 from 5 to 4 100 | move 3 from 2 to 8 101 | move 22 from 1 to 2 102 | move 1 from 1 to 2 103 | move 5 from 8 to 2 104 | move 2 from 5 to 2 105 | move 1 from 1 to 6 106 | move 5 from 5 to 2 107 | move 1 from 9 to 8 108 | move 5 from 4 to 1 109 | move 6 from 6 to 9 110 | move 3 from 1 to 9 111 | move 1 from 1 to 7 112 | move 8 from 9 to 6 113 | move 6 from 7 to 1 114 | move 5 from 6 to 5 115 | move 27 from 2 to 1 116 | move 4 from 5 to 7 117 | move 9 from 1 to 5 118 | move 1 from 9 to 1 119 | move 3 from 6 to 2 120 | move 9 from 2 to 1 121 | move 2 from 7 to 2 122 | move 1 from 8 to 7 123 | move 10 from 5 to 9 124 | move 1 from 9 to 7 125 | move 25 from 1 to 8 126 | move 6 from 7 to 4 127 | move 11 from 1 to 7 128 | move 3 from 8 to 1 129 | move 3 from 2 to 6 130 | move 3 from 8 to 9 131 | move 11 from 8 to 6 132 | move 1 from 2 to 6 133 | move 12 from 6 to 4 134 | move 13 from 4 to 5 135 | move 1 from 6 to 1 136 | move 3 from 7 to 5 137 | move 5 from 8 to 7 138 | move 1 from 7 to 1 139 | move 5 from 1 to 6 140 | move 3 from 6 to 4 141 | move 3 from 8 to 6 142 | move 2 from 5 to 2 143 | move 12 from 5 to 9 144 | move 5 from 6 to 2 145 | move 2 from 5 to 9 146 | move 6 from 4 to 9 147 | move 11 from 7 to 3 148 | move 1 from 2 to 5 149 | move 1 from 7 to 8 150 | move 1 from 5 to 7 151 | move 1 from 7 to 1 152 | move 1 from 8 to 1 153 | move 2 from 4 to 7 154 | move 2 from 6 to 8 155 | move 5 from 3 to 6 156 | move 2 from 7 to 2 157 | move 2 from 2 to 9 158 | move 1 from 2 to 9 159 | move 1 from 1 to 6 160 | move 35 from 9 to 7 161 | move 2 from 8 to 7 162 | move 3 from 3 to 8 163 | move 5 from 2 to 4 164 | move 3 from 3 to 7 165 | move 2 from 4 to 7 166 | move 4 from 6 to 5 167 | move 4 from 5 to 9 168 | move 3 from 4 to 5 169 | move 1 from 8 to 3 170 | move 4 from 9 to 8 171 | move 1 from 9 to 6 172 | move 38 from 7 to 2 173 | move 1 from 3 to 5 174 | move 1 from 1 to 7 175 | move 4 from 7 to 3 176 | move 3 from 6 to 1 177 | move 22 from 2 to 7 178 | move 1 from 5 to 8 179 | move 7 from 8 to 4 180 | move 8 from 2 to 8 181 | move 3 from 5 to 1 182 | move 4 from 3 to 9 183 | move 1 from 8 to 3 184 | move 1 from 3 to 7 185 | move 2 from 2 to 3 186 | move 5 from 8 to 9 187 | move 3 from 9 to 1 188 | move 2 from 1 to 7 189 | move 6 from 2 to 3 190 | move 6 from 3 to 1 191 | move 2 from 3 to 6 192 | move 1 from 6 to 1 193 | move 14 from 7 to 2 194 | move 4 from 1 to 6 195 | move 8 from 1 to 3 196 | move 4 from 3 to 6 197 | move 3 from 9 to 5 198 | move 1 from 8 to 6 199 | move 1 from 8 to 4 200 | move 9 from 7 to 1 201 | move 8 from 2 to 4 202 | move 4 from 2 to 9 203 | move 2 from 2 to 1 204 | move 3 from 5 to 8 205 | move 1 from 8 to 6 206 | move 1 from 7 to 8 207 | move 1 from 6 to 5 208 | move 3 from 9 to 5 209 | move 2 from 9 to 5 210 | move 4 from 3 to 9 211 | move 3 from 6 to 3 212 | move 3 from 6 to 9 213 | move 9 from 4 to 1 214 | move 1 from 9 to 8 215 | move 3 from 3 to 6 216 | move 2 from 7 to 4 217 | move 4 from 8 to 5 218 | move 7 from 5 to 6 219 | move 19 from 1 to 9 220 | move 5 from 9 to 3 221 | move 2 from 1 to 6 222 | move 1 from 4 to 6 223 | move 4 from 3 to 2 224 | move 21 from 9 to 7 225 | move 1 from 1 to 2 226 | move 1 from 9 to 1 227 | move 1 from 1 to 8 228 | move 16 from 7 to 6 229 | move 24 from 6 to 5 230 | move 7 from 4 to 5 231 | move 1 from 8 to 3 232 | move 2 from 2 to 8 233 | move 31 from 5 to 8 234 | move 1 from 4 to 6 235 | move 2 from 6 to 9 236 | move 1 from 7 to 4 237 | move 3 from 7 to 9 238 | move 1 from 4 to 8 239 | move 2 from 3 to 5 240 | move 1 from 2 to 3 241 | move 1 from 3 to 7 242 | move 1 from 7 to 9 243 | move 24 from 8 to 6 244 | move 1 from 8 to 1 245 | move 30 from 6 to 1 246 | move 2 from 5 to 2 247 | move 1 from 6 to 9 248 | move 6 from 9 to 7 249 | move 1 from 6 to 4 250 | move 1 from 4 to 6 251 | move 23 from 1 to 3 252 | move 21 from 3 to 4 253 | move 4 from 2 to 6 254 | move 3 from 6 to 1 255 | move 1 from 5 to 1 256 | move 4 from 1 to 9 257 | move 3 from 9 to 6 258 | move 8 from 1 to 6 259 | move 4 from 8 to 5 260 | move 2 from 7 to 5 261 | move 7 from 4 to 3 262 | move 3 from 4 to 9 263 | move 9 from 3 to 9 264 | move 1 from 7 to 6 265 | move 6 from 5 to 8 266 | move 14 from 6 to 2 267 | move 4 from 8 to 4 268 | move 7 from 4 to 5 269 | move 1 from 7 to 9 270 | move 6 from 4 to 3 271 | move 13 from 2 to 6 272 | move 5 from 3 to 7 273 | move 1 from 3 to 8 274 | move 1 from 8 to 2 275 | move 4 from 8 to 3 276 | move 6 from 6 to 4 277 | move 2 from 2 to 8 278 | move 5 from 4 to 7 279 | move 3 from 7 to 5 280 | move 1 from 7 to 9 281 | move 2 from 3 to 9 282 | move 3 from 7 to 3 283 | move 1 from 7 to 9 284 | move 1 from 7 to 9 285 | move 3 from 4 to 1 286 | move 6 from 6 to 1 287 | move 2 from 7 to 5 288 | move 1 from 3 to 5 289 | move 11 from 9 to 4 290 | move 9 from 4 to 5 291 | move 3 from 3 to 4 292 | move 1 from 3 to 9 293 | move 2 from 8 to 1 294 | move 9 from 1 to 8 295 | move 22 from 5 to 8 296 | move 2 from 1 to 3 297 | move 3 from 4 to 6 298 | move 14 from 8 to 9 299 | move 1 from 3 to 9 300 | move 19 from 9 to 3 301 | move 3 from 9 to 4 302 | move 2 from 7 to 2 303 | move 1 from 4 to 6 304 | move 1 from 3 to 8 305 | move 8 from 3 to 1 306 | move 2 from 9 to 6 307 | move 1 from 2 to 5 308 | move 3 from 4 to 9 309 | move 1 from 2 to 3 310 | move 20 from 8 to 3 311 | move 4 from 9 to 5 312 | move 1 from 4 to 2 313 | move 26 from 3 to 5 314 | move 1 from 8 to 3 315 | move 8 from 1 to 4 316 | move 1 from 3 to 7 317 | move 1 from 2 to 1 318 | move 1 from 1 to 6 319 | move 1 from 6 to 7 320 | move 4 from 5 to 3 321 | move 3 from 4 to 2 322 | move 5 from 5 to 3 323 | move 2 from 2 to 6 324 | move 3 from 3 to 5 325 | move 2 from 4 to 8 326 | move 5 from 3 to 9 327 | move 5 from 9 to 8 328 | move 19 from 5 to 9 329 | move 1 from 5 to 2 330 | move 2 from 7 to 1 331 | move 1 from 1 to 7 332 | move 1 from 7 to 4 333 | move 13 from 9 to 3 334 | move 8 from 6 to 2 335 | move 10 from 3 to 5 336 | move 14 from 5 to 4 337 | move 7 from 8 to 4 338 | move 1 from 6 to 2 339 | move 6 from 3 to 8 340 | move 4 from 9 to 7 341 | move 2 from 9 to 8 342 | move 1 from 7 to 1 343 | move 3 from 2 to 7 344 | move 1 from 5 to 3 345 | move 7 from 8 to 6 346 | move 5 from 6 to 2 347 | move 8 from 4 to 5 348 | move 3 from 5 to 8 349 | move 3 from 8 to 6 350 | move 5 from 7 to 9 351 | move 5 from 3 to 6 352 | move 1 from 9 to 4 353 | move 17 from 4 to 7 354 | move 1 from 8 to 1 355 | move 12 from 7 to 8 356 | move 3 from 1 to 4 357 | move 2 from 4 to 6 358 | move 8 from 6 to 1 359 | move 4 from 6 to 3 360 | move 1 from 7 to 8 361 | move 5 from 5 to 8 362 | move 4 from 7 to 1 363 | move 3 from 2 to 6 364 | move 2 from 5 to 1 365 | move 6 from 1 to 6 366 | move 4 from 3 to 5 367 | move 4 from 5 to 3 368 | move 1 from 4 to 8 369 | move 3 from 3 to 2 370 | move 17 from 8 to 4 371 | move 6 from 6 to 3 372 | move 14 from 4 to 9 373 | move 1 from 3 to 8 374 | move 1 from 7 to 4 375 | move 3 from 8 to 3 376 | move 5 from 2 to 5 377 | move 6 from 1 to 7 378 | move 2 from 6 to 4 379 | move 4 from 5 to 7 380 | move 1 from 1 to 5 381 | move 1 from 6 to 3 382 | move 10 from 7 to 4 383 | move 1 from 5 to 4 384 | move 1 from 2 to 3 385 | move 15 from 4 to 5 386 | move 3 from 3 to 1 387 | move 6 from 2 to 6 388 | move 1 from 2 to 3 389 | move 2 from 4 to 7 390 | move 2 from 7 to 8 391 | move 1 from 4 to 2 392 | move 2 from 1 to 7 393 | move 1 from 7 to 2 394 | move 12 from 9 to 1 395 | move 4 from 9 to 5 396 | move 4 from 6 to 2 397 | move 1 from 7 to 3 398 | move 6 from 2 to 4 399 | move 1 from 8 to 5 400 | move 2 from 4 to 2 401 | move 11 from 1 to 7 402 | move 3 from 1 to 4 403 | move 17 from 5 to 6 404 | move 15 from 6 to 4 405 | move 1 from 8 to 9 406 | move 10 from 4 to 1 407 | move 1 from 3 to 9 408 | move 2 from 6 to 5 409 | move 1 from 2 to 6 410 | move 4 from 5 to 6 411 | move 4 from 1 to 2 412 | move 6 from 6 to 7 413 | move 2 from 2 to 6 414 | move 9 from 4 to 9 415 | move 6 from 1 to 2 416 | move 3 from 4 to 1 417 | move 10 from 9 to 8 418 | move 4 from 2 to 1 419 | move 1 from 1 to 2 420 | move 5 from 8 to 6 421 | move 1 from 2 to 7 422 | move 1 from 9 to 4 423 | move 2 from 6 to 9 424 | move 13 from 7 to 2 425 | move 5 from 7 to 5 426 | move 2 from 5 to 2 427 | move 1 from 4 to 5 428 | move 4 from 8 to 4 429 | move 17 from 2 to 6 430 | move 3 from 4 to 6 431 | move 2 from 9 to 1 432 | move 7 from 6 to 8 433 | move 1 from 5 to 2 434 | move 1 from 4 to 1 435 | move 2 from 9 to 4 436 | move 1 from 3 to 9 437 | move 4 from 3 to 7 438 | move 2 from 8 to 5 439 | move 3 from 7 to 5 440 | move 10 from 5 to 8 441 | move 2 from 2 to 4 442 | move 6 from 1 to 2 443 | move 4 from 6 to 3 444 | move 8 from 2 to 6 445 | move 1 from 7 to 4 446 | move 5 from 4 to 5 447 | move 7 from 6 to 7 448 | move 5 from 3 to 5 449 | move 5 from 5 to 2 450 | move 4 from 8 to 1 451 | move 6 from 1 to 6 452 | move 3 from 3 to 2 453 | move 22 from 6 to 2 454 | move 1 from 9 to 7 455 | move 8 from 8 to 6 456 | move 1 from 7 to 6 457 | move 2 from 5 to 7 458 | move 4 from 8 to 5 459 | move 7 from 6 to 7 460 | move 2 from 6 to 4 461 | move 14 from 2 to 1 462 | move 7 from 1 to 3 463 | move 12 from 7 to 3 464 | move 1 from 4 to 3 465 | move 2 from 5 to 8 466 | move 2 from 8 to 1 467 | move 1 from 4 to 3 468 | move 6 from 2 to 9 469 | move 6 from 9 to 2 470 | move 2 from 2 to 7 471 | move 6 from 7 to 5 472 | move 13 from 3 to 5 473 | move 5 from 2 to 6 474 | move 5 from 6 to 1 475 | move 2 from 3 to 6 476 | move 1 from 6 to 5 477 | move 1 from 6 to 1 478 | move 3 from 1 to 9 479 | move 6 from 2 to 7 480 | move 1 from 2 to 3 481 | move 24 from 5 to 2 482 | move 7 from 3 to 7 483 | move 13 from 7 to 9 484 | move 4 from 1 to 9 485 | move 4 from 1 to 6 486 | move 1 from 5 to 6 487 | move 16 from 9 to 5 488 | move 1 from 6 to 4 489 | move 1 from 5 to 2 490 | move 5 from 1 to 3 491 | move 11 from 2 to 1 492 | move 4 from 9 to 6 493 | move 1 from 4 to 7 494 | move 2 from 3 to 4 495 | move 6 from 6 to 9 496 | move 1 from 1 to 3 497 | move 2 from 9 to 4 498 | move 1 from 7 to 9 499 | move 4 from 2 to 9 500 | move 8 from 9 to 2 501 | move 3 from 3 to 2 502 | move 1 from 9 to 4 503 | move 5 from 1 to 7 504 | move 1 from 4 to 8 505 | move 2 from 1 to 9 506 | move 1 from 8 to 7 507 | move 6 from 5 to 3 508 | move 1 from 5 to 1 509 | move 5 from 2 to 3 510 | move 4 from 1 to 5 511 | move 4 from 7 to 1 512 | move 8 from 5 to 8 -------------------------------------------------------------------------------- /day05b/src/main.rs: -------------------------------------------------------------------------------- 1 | use itertools::Itertools; 2 | 3 | const STACKS: usize = 9; 4 | const SWP: usize = 64; 5 | 6 | pub fn main() { 7 | let d = include_bytes!("../input.txt"); 8 | let (b, m) = d.split_at(d.windows(2).position(|b| b == b"\n\n").unwrap() + 2); 9 | let (mut s, mut swp): ([Vec; STACKS], _) = (Default::default(), [0; SWP]); 10 | 11 | b.split(|b| b == &b'\n').rev().skip(1).for_each(|l| { 12 | l.iter() 13 | .skip(1) 14 | .step_by(4) 15 | .enumerate() 16 | .filter(|(_, c)| c != &&b' ') 17 | .for_each(|(i, c)| s[i].push(*c)) 18 | }); 19 | 20 | m.split(|b| b == &b'\n').for_each(|m| { 21 | let (n, a, b): (usize, _, _) = m 22 | .split(|b| b == &b' ') 23 | .skip(1) 24 | .step_by(2) 25 | .map(|n| atoi::atoi(n).unwrap()) 26 | .collect_tuple() 27 | .unwrap(); 28 | let len = s[a - 1].len(); 29 | let swp = &mut swp[..n]; 30 | 31 | swp.copy_from_slice(&s[a - 1][len - n..len]); 32 | s[a - 1].truncate(len - n); 33 | s[b - 1].extend(swp.iter()); 34 | }); 35 | 36 | s.iter() 37 | .for_each(|s| print!("{}", *s.last().unwrap() as char)); 38 | println!(); 39 | } 40 | -------------------------------------------------------------------------------- /day06a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day06a" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day06a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day06a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | -------------------------------------------------------------------------------- /day06a/input.txt: -------------------------------------------------------------------------------- 1 | qnjjqgjqgglqqwrrvvcwwtjjzpjjfwwtwzwmzmrmttrvrpppbtbllhrrwtwzwjwzznfzfvvvngnrrhzrhhsmsrrsrrtqrrpzpnpfphfhllwlclfcfrrqffhvhsvswvswwngnzzcmmnrnzrnnwhwgwvggpcggnrntrrgmgdgmmgzmzssprrmddjndnsnrsrddnmdmqddrzznwznndfnndjjmgjmjmmnpmnmrmzmfzmmwhwzwrwqqqhshhncnvvhfvhfhzzvttrnrdnnwddptphpthhbgbgmbbvppnhphmmncnwcwqwppgddsqqjqppcrcncvnccjsjzztczttjzzwwhshnsnttrctchthnnswnnfzfhhsfhhdccgwcggbrblrlwlrlnntsscffpnnwffqgqdqhqhphhvtvmvhmmnssqbqfqfwwbfwbfwwzwgwgpgwwchcshslhssqsppqdqhhnssrzzvbbhjjqdjdgjgttvzzmvzvvnmvvfbbncbcqcpqpbbcjcncjnccjfjpjdjvdddbzzfrfwfpwpfwppvjvfjjhfhvvqttfhffscsvvbqbzqqjssbmsbshsrshsphhwhvwhwcwwnjjlzzfgfrgrwggfddpqpqqcmmtwtcwttgjjnfnnjvvmfmccvhchjcjmccmmwgghccnffjccqczqqbdbrdrsdsffmzzndnncbnbgbsshbhvbvsbvsbbvjbvbdvvqpqnpngpnggbbndbbdzdhzdhhjcjjmbbqgqbbfrrvzvcvffhggcbcjbbqtbbszbbvvcnvnccldddlrrtqrttpjpnjpnpznnqmnnrrmmsdmdbbffcwwllnffssspvvrjjwhwmmqhmmhjjtnjtjgttnrtnnsgsbssffstssjvjwwwwnjngjnnnlndndqdqqwdwcdcsccsgssgrrqwqqqhgqgfgffmnffzjjssqsfqqgddgcgtgrrvgrrdhdcdgdbdsswgwwpwggdfggnjnnvffzhhcqclqclcdlldbldlffdrrzttnhthdthhrthhgcgllzqlzzfhhmshssdvvtnnpngpprqrrrbnbssnhnnqdndsnshhzjjrnjnmjjwfffpbpnbbwddpwptwwpbpffvggmjmgghrrnqqhnhsnhsnnnlddmjddrdrhrchhgmgfmfdfcfpprsrzzzmhzhmhrmmrwmmpdmpmcclmlvvlffhlhhczccsvvptvpvwvdvqqdvqdddvnvsnswwspwpqqpddpvvsqsjjwnwrrjbjtttdhhhwbhbzzqrqfrrzlrzrqrbqrqzzfczfzrrqffnrnhrrcrtrvrffvflfsllcjcvvmqmlqqwjwgglhlvldltlqqdcddtssltsllsnndvdnddfqdffprrbssgccqmqrrnsrnnlzlhhqrhqhcqcjqcqpcqqmvqqgbgpbggnfggdpgpvpgvvsrrhqhshmsmwsmwssvnvtnttphpdpdspsvslshhlplmplmmljjvnnsrslrrvttqqprrptrptpnnmmflltntrrnjjcljcllwcllddbgbjbrrtwrtrftfctftsslsggggzqqhhrvvdqqwqbqtthdhrrpwpqpmmqcmqmllsmllhvfwbfvgzqgbhlfhqrqtzfpplgjtgngzrdfltnqlwsbhmwdfvrdjlgwftjvmdsgdgnswhrtmzgfqfsfnczjnmgqcfzvwlbgzsrpcbwwtrmbqtqhdmhmscqgjgpqdqcrvdvwplpdzsjqbvgpqcvfspqrcsjlhrqpjmdszjpqhmdwtddwqhbwsrlcjpzwsjjvbzcllqfwbhfvjqbqfbsrbgvgchdmgqjnvdrzlmrnlpzrljgjvtrdtqnzbnhpgpgjvwttmnfbpvrtmpstbmtwdwfzvznrwmspftgvrmdfwqltzzmlgrvvwjgdblnnbjzjfqpldsqbhrstnhrjqfcmzcrtqcpqmmfqzndgjwtcgnwrgdznzdgzbvmrlvrjvjgmfcrmrjbpjwqvhprbphnqsbpcpnflpgnpgggqpgrwghfpfvdljjqnvqgbvcpjbjlqghjppfhzfzczmcwnhrjzzrwlfqhvdwqrcbvprclnmqmqwdrhgtswwqhqtcjhndrmcrzdjnvwsstzplhcdzwzqbjjthsmjrmpfbqljlmnvmfddqflnhrfhchzgnlbcpvppnspsdtnqmfhrztznhltmqlrwzgczqmjggvnphwpvrwcnqhsdfglblvvdlqfnghtzgngtjnrzsjgwcglsrczlfqpmmzsrqwcclslzjpvpfgcwzwsfmwwswdsvnvtmwzmhwzvnnnldnjljbwlglpjvrggbmvhctsggtjgrmjrglnhtjzwhrvtmfmphgmpdmvlhzrhrtjcwswlnnjphsschrdvstmflzqsbqmqggjjdsdtjhcvjlzclbpvnbjgngnzvtdgszdtrwpnjmgwpcjpbsvrsmdjdjdbhqqvplbmfhmbgmtggvtltqjphlggscdbzncqhqqlmflmjbpnhbnqjcbfmggnftjjbzbrqwcgvfhsddrqgrvnztzzqzwjrjprmqctlttmgltdgrcvnbrbzrsbbqnsrslrswvmrqlctvsdfmcrdddcdwvfmwwcbqsdhmmgplzhnsfvhtctmvrzntvptpnbhhvjlphmtcctlhdvtvvqbmbczjqfvnqwzbgjzlgnqhvbjjnvrgfprvllltqdwvvmchrdqfczmmbmcjwtwgqbfjzgpcfzhhnwcghqltrlhlntjcrthpsbmcdzzqljdrdhfctwrzlvhdjvgmpscssmhdggrnhfbtfpqtsbqnqjfjwlbdfcpzfjtspnrjzshjcrrzwclddqqbplwghrcjhfqgblfrlrdhmdqmrzdnqthvvzlcjmqzqtgbcwcprpnjtbhsqmzlprhmssltfvvgqzzpnjtsmplhfpsnznjwrrgvmbbvjzzwctmwcwcwjwvmlpcmlmrfqbdjpclsqjnsnndzqfcghqsmhqcjwjjbbwmsttwnththhhgrlhrtrcjppvmjlqtqhpbhpsdhzcqpmqqbvwrlvjrnmlfvtntwghtphwzqmbmmpgvfrqsjwffdbcjjbwrrntrhnjwjfprzjcpnwvtwjcdhppspbdbwnzdbhvpqljbrfnpnbqdtqzdjlbvgbvvhcjrqwlqmhnhjfppllrsnsvnmttvrsdrqjfrdvhplwbhhnvglvgcvtzblfswzrrbwpjnslthjmgsdgwqrfjfplmbgsdcltzmdhrbpqggnjrcddltvdbrlhtzwfghbpnlmghwqdtpctmqbggfzflfzjgcbvfqtztsmgdvdlrrdrtmmjbtdtjvvjvlwwlwnzhlfqtrmdgvlflmbffnzlvtccnmcddrqfhgzlhngrfmsqdrnshshfhhtnwmnqmjtzggdfmpgcsrhjzhhvlppfnqmjsvtcwwjdvdrgrldbdnrqtvjjnddgmfdtqrncdlfznfpbqldztzzgpvwhvnqrrzdwsrdvcnslmwcdztvqzgbshpqrdbnmlfltpbsfrnbbcwvwvjnrdspwrwzpljqwwvqhbhhqqjnlrgwqvvsjrscbfqvhbwtjvwzmwzvftlwmtbmglvqvlnwrzvwclvzjcvgfstjpwdbtbhmnqzfgpqmthpchrrqfpqfflwhwrhmdzvgbzlmfgzvhrldprlgrvjcvjhslghqddfvqzgplmtfqjzhpctvtgrzjhwrjzbsqqrcztrstbvdjbtszrbvvzvwzfclsnrftcqtqdghdrnhglzptzwtqtgnfsqhmvnqqwtnwszgtvpnndbzcwgwhpcdlsdpptvlcqtmfhfjzbvfsvnjvqrrjqbggnjqfrrrvqmzscvlltfwzdlzqstlrrmqqmbmbtgbqjsvbncblddgzvlstmrpmrlfcqpvwthgbhlvfcfcwvslcjnztfwgdgwjfrwrzbbszmtvzchvstcfrgqllfrdccrjmtspshgqbzcldddqgjnpdsctmjphcwqvjtvmqlvvpzdgjdlpwdrjbshhrgjtglwnzlzsqngspbzgbwpgmfcv -------------------------------------------------------------------------------- /day06a/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | println!( 3 | "{}", 4 | include_bytes!("../input.txt") 5 | .windows(4) 6 | .position(|b| !(0..3).any(|i| (i + 1..4).any(|j| b[i] == b[j]))) 7 | .unwrap() 8 | + 4, 9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /day06b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day06b" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day06b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day06b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [profile.release] 11 | codegen-units = 1 12 | lto = true 13 | strip = true 14 | panic = "abort" 15 | -------------------------------------------------------------------------------- /day06b/input.txt: -------------------------------------------------------------------------------- 1 | qnjjqgjqgglqqwrrvvcwwtjjzpjjfwwtwzwmzmrmttrvrpppbtbllhrrwtwzwjwzznfzfvvvngnrrhzrhhsmsrrsrrtqrrpzpnpfphfhllwlclfcfrrqffhvhsvswvswwngnzzcmmnrnzrnnwhwgwvggpcggnrntrrgmgdgmmgzmzssprrmddjndnsnrsrddnmdmqddrzznwznndfnndjjmgjmjmmnpmnmrmzmfzmmwhwzwrwqqqhshhncnvvhfvhfhzzvttrnrdnnwddptphpthhbgbgmbbvppnhphmmncnwcwqwppgddsqqjqppcrcncvnccjsjzztczttjzzwwhshnsnttrctchthnnswnnfzfhhsfhhdccgwcggbrblrlwlrlnntsscffpnnwffqgqdqhqhphhvtvmvhmmnssqbqfqfwwbfwbfwwzwgwgpgwwchcshslhssqsppqdqhhnssrzzvbbhjjqdjdgjgttvzzmvzvvnmvvfbbncbcqcpqpbbcjcncjnccjfjpjdjvdddbzzfrfwfpwpfwppvjvfjjhfhvvqttfhffscsvvbqbzqqjssbmsbshsrshsphhwhvwhwcwwnjjlzzfgfrgrwggfddpqpqqcmmtwtcwttgjjnfnnjvvmfmccvhchjcjmccmmwgghccnffjccqczqqbdbrdrsdsffmzzndnncbnbgbsshbhvbvsbvsbbvjbvbdvvqpqnpngpnggbbndbbdzdhzdhhjcjjmbbqgqbbfrrvzvcvffhggcbcjbbqtbbszbbvvcnvnccldddlrrtqrttpjpnjpnpznnqmnnrrmmsdmdbbffcwwllnffssspvvrjjwhwmmqhmmhjjtnjtjgttnrtnnsgsbssffstssjvjwwwwnjngjnnnlndndqdqqwdwcdcsccsgssgrrqwqqqhgqgfgffmnffzjjssqsfqqgddgcgtgrrvgrrdhdcdgdbdsswgwwpwggdfggnjnnvffzhhcqclqclcdlldbldlffdrrzttnhthdthhrthhgcgllzqlzzfhhmshssdvvtnnpngpprqrrrbnbssnhnnqdndsnshhzjjrnjnmjjwfffpbpnbbwddpwptwwpbpffvggmjmgghrrnqqhnhsnhsnnnlddmjddrdrhrchhgmgfmfdfcfpprsrzzzmhzhmhrmmrwmmpdmpmcclmlvvlffhlhhczccsvvptvpvwvdvqqdvqdddvnvsnswwspwpqqpddpvvsqsjjwnwrrjbjtttdhhhwbhbzzqrqfrrzlrzrqrbqrqzzfczfzrrqffnrnhrrcrtrvrffvflfsllcjcvvmqmlqqwjwgglhlvldltlqqdcddtssltsllsnndvdnddfqdffprrbssgccqmqrrnsrnnlzlhhqrhqhcqcjqcqpcqqmvqqgbgpbggnfggdpgpvpgvvsrrhqhshmsmwsmwssvnvtnttphpdpdspsvslshhlplmplmmljjvnnsrslrrvttqqprrptrptpnnmmflltntrrnjjcljcllwcllddbgbjbrrtwrtrftfctftsslsggggzqqhhrvvdqqwqbqtthdhrrpwpqpmmqcmqmllsmllhvfwbfvgzqgbhlfhqrqtzfpplgjtgngzrdfltnqlwsbhmwdfvrdjlgwftjvmdsgdgnswhrtmzgfqfsfnczjnmgqcfzvwlbgzsrpcbwwtrmbqtqhdmhmscqgjgpqdqcrvdvwplpdzsjqbvgpqcvfspqrcsjlhrqpjmdszjpqhmdwtddwqhbwsrlcjpzwsjjvbzcllqfwbhfvjqbqfbsrbgvgchdmgqjnvdrzlmrnlpzrljgjvtrdtqnzbnhpgpgjvwttmnfbpvrtmpstbmtwdwfzvznrwmspftgvrmdfwqltzzmlgrvvwjgdblnnbjzjfqpldsqbhrstnhrjqfcmzcrtqcpqmmfqzndgjwtcgnwrgdznzdgzbvmrlvrjvjgmfcrmrjbpjwqvhprbphnqsbpcpnflpgnpgggqpgrwghfpfvdljjqnvqgbvcpjbjlqghjppfhzfzczmcwnhrjzzrwlfqhvdwqrcbvprclnmqmqwdrhgtswwqhqtcjhndrmcrzdjnvwsstzplhcdzwzqbjjthsmjrmpfbqljlmnvmfddqflnhrfhchzgnlbcpvppnspsdtnqmfhrztznhltmqlrwzgczqmjggvnphwpvrwcnqhsdfglblvvdlqfnghtzgngtjnrzsjgwcglsrczlfqpmmzsrqwcclslzjpvpfgcwzwsfmwwswdsvnvtmwzmhwzvnnnldnjljbwlglpjvrggbmvhctsggtjgrmjrglnhtjzwhrvtmfmphgmpdmvlhzrhrtjcwswlnnjphsschrdvstmflzqsbqmqggjjdsdtjhcvjlzclbpvnbjgngnzvtdgszdtrwpnjmgwpcjpbsvrsmdjdjdbhqqvplbmfhmbgmtggvtltqjphlggscdbzncqhqqlmflmjbpnhbnqjcbfmggnftjjbzbrqwcgvfhsddrqgrvnztzzqzwjrjprmqctlttmgltdgrcvnbrbzrsbbqnsrslrswvmrqlctvsdfmcrdddcdwvfmwwcbqsdhmmgplzhnsfvhtctmvrzntvptpnbhhvjlphmtcctlhdvtvvqbmbczjqfvnqwzbgjzlgnqhvbjjnvrgfprvllltqdwvvmchrdqfczmmbmcjwtwgqbfjzgpcfzhhnwcghqltrlhlntjcrthpsbmcdzzqljdrdhfctwrzlvhdjvgmpscssmhdggrnhfbtfpqtsbqnqjfjwlbdfcpzfjtspnrjzshjcrrzwclddqqbplwghrcjhfqgblfrlrdhmdqmrzdnqthvvzlcjmqzqtgbcwcprpnjtbhsqmzlprhmssltfvvgqzzpnjtsmplhfpsnznjwrrgvmbbvjzzwctmwcwcwjwvmlpcmlmrfqbdjpclsqjnsnndzqfcghqsmhqcjwjjbbwmsttwnththhhgrlhrtrcjppvmjlqtqhpbhpsdhzcqpmqqbvwrlvjrnmlfvtntwghtphwzqmbmmpgvfrqsjwffdbcjjbwrrntrhnjwjfprzjcpnwvtwjcdhppspbdbwnzdbhvpqljbrfnpnbqdtqzdjlbvgbvvhcjrqwlqmhnhjfppllrsnsvnmttvrsdrqjfrdvhplwbhhnvglvgcvtzblfswzrrbwpjnslthjmgsdgwqrfjfplmbgsdcltzmdhrbpqggnjrcddltvdbrlhtzwfghbpnlmghwqdtpctmqbggfzflfzjgcbvfqtztsmgdvdlrrdrtmmjbtdtjvvjvlwwlwnzhlfqtrmdgvlflmbffnzlvtccnmcddrqfhgzlhngrfmsqdrnshshfhhtnwmnqmjtzggdfmpgcsrhjzhhvlppfnqmjsvtcwwjdvdrgrldbdnrqtvjjnddgmfdtqrncdlfznfpbqldztzzgpvwhvnqrrzdwsrdvcnslmwcdztvqzgbshpqrdbnmlfltpbsfrnbbcwvwvjnrdspwrwzpljqwwvqhbhhqqjnlrgwqvvsjrscbfqvhbwtjvwzmwzvftlwmtbmglvqvlnwrzvwclvzjcvgfstjpwdbtbhmnqzfgpqmthpchrrqfpqfflwhwrhmdzvgbzlmfgzvhrldprlgrvjcvjhslghqddfvqzgplmtfqjzhpctvtgrzjhwrjzbsqqrcztrstbvdjbtszrbvvzvwzfclsnrftcqtqdghdrnhglzptzwtqtgnfsqhmvnqqwtnwszgtvpnndbzcwgwhpcdlsdpptvlcqtmfhfjzbvfsvnjvqrrjqbggnjqfrrrvqmzscvlltfwzdlzqstlrrmqqmbmbtgbqjsvbncblddgzvlstmrpmrlfcqpvwthgbhlvfcfcwvslcjnztfwgdgwjfrwrzbbszmtvzchvstcfrgqllfrdccrjmtspshgqbzcldddqgjnpdsctmjphcwqvjtvmqlvvpzdgjdlpwdrjbshhrgjtglwnzlzsqngspbzgbwpgmfcv -------------------------------------------------------------------------------- /day06b/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | let mut i = 0; 3 | while let Some(win) = include_bytes!("../input.txt").get(i..i + 14) { 4 | let mut seen = 0u32; 5 | if let Some(pos) = win.iter().rposition(|b| { 6 | let bit = 1 << (b % 32); 7 | let duplicate = seen & bit != 0; 8 | seen |= bit; 9 | duplicate 10 | }) { 11 | i += pos + 1; 12 | } else { 13 | break; 14 | } 15 | } 16 | 17 | println!("{}", i); 18 | } 19 | -------------------------------------------------------------------------------- /day07a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "atoi" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 10 | dependencies = [ 11 | "num-traits", 12 | ] 13 | 14 | [[package]] 15 | name = "autocfg" 16 | version = "1.1.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 19 | 20 | [[package]] 21 | name = "day07a" 22 | version = "0.1.0" 23 | dependencies = [ 24 | "atoi", 25 | ] 26 | 27 | [[package]] 28 | name = "num-traits" 29 | version = "0.2.15" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 32 | dependencies = [ 33 | "autocfg", 34 | ] 35 | -------------------------------------------------------------------------------- /day07a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day07a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | -------------------------------------------------------------------------------- /day07a/src/main.rs: -------------------------------------------------------------------------------- 1 | use std::iter::Peekable; 2 | 3 | pub fn main() { 4 | let (d, mut s) = (include_bytes!("../input.txt"), 0); 5 | sh(&mut d.split(|b| b == &b'\n').peekable(), &mut s); 6 | println!("{}", s); 7 | } 8 | 9 | fn sh(lines: &mut Peekable>, sum: &mut u64) -> u64 { 10 | let mut size = 0; 11 | while let Some(i) = lines.next() { 12 | match i { 13 | b"$ cd .." => break, 14 | _ if &i[0..3] == b"$ l" => { 15 | size = std::iter::from_fn(|| lines.next_if(|i| i[0] != b'$')) 16 | .filter(|i| i[0] != b'd') 17 | .filter_map(|i| atoi::atoi::(i.split(|b| b == &b' ').next().unwrap())) 18 | .sum() 19 | } 20 | _ => size += sh(lines, sum), 21 | } 22 | } 23 | if size <= 100_000 { 24 | *sum += size; 25 | } 26 | size 27 | } 28 | -------------------------------------------------------------------------------- /day07b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "atoi" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 10 | dependencies = [ 11 | "num-traits", 12 | ] 13 | 14 | [[package]] 15 | name = "autocfg" 16 | version = "1.1.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 19 | 20 | [[package]] 21 | name = "day07b" 22 | version = "0.1.0" 23 | dependencies = [ 24 | "atoi", 25 | ] 26 | 27 | [[package]] 28 | name = "num-traits" 29 | version = "0.2.15" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 32 | dependencies = [ 33 | "autocfg", 34 | ] 35 | -------------------------------------------------------------------------------- /day07b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day07b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | -------------------------------------------------------------------------------- /day07b/src/main.rs: -------------------------------------------------------------------------------- 1 | use std::iter::Peekable; 2 | 3 | struct Dir(Vec, u64); 4 | 5 | pub fn main() { 6 | let root = sh(&mut include_bytes!("../input.txt") 7 | .split(|b| b == &b'\n') 8 | .peekable()); 9 | println!("{}", search(&root, root.1 - 40_000_000).unwrap()); 10 | } 11 | 12 | fn sh(lines: &mut Peekable>) -> Dir { 13 | let (mut dirs, mut size) = (vec![], 0); 14 | while let Some(i) = lines.next() { 15 | match i { 16 | b"$ cd .." => break, 17 | _ if &i[0..3] == b"$ l" => { 18 | size = std::iter::from_fn(|| lines.next_if(|i| i[0] != b'$')) 19 | .filter(|i| i[0] != b'd') 20 | .filter_map(|i| atoi::atoi::(i.split(|b| b == &b' ').next().unwrap())) 21 | .sum() 22 | } 23 | _ => dirs.push(sh(lines)), 24 | } 25 | } 26 | size += dirs.iter().map(|d| d.1).sum::(); 27 | Dir(dirs, size) 28 | } 29 | 30 | fn search(d: &Dir, min: u64) -> Option { 31 | d.0.iter() 32 | .filter(|d| d.1 >= min) 33 | .flat_map(|d| [Some(d.1), search(d, min)]) 34 | .flatten() 35 | .min() 36 | } 37 | -------------------------------------------------------------------------------- /day08a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day08a" 7 | version = "0.1.0" 8 | dependencies = [ 9 | "rustc-hash", 10 | ] 11 | 12 | [[package]] 13 | name = "rustc-hash" 14 | version = "1.1.0" 15 | source = "registry+https://github.com/rust-lang/crates.io-index" 16 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 17 | -------------------------------------------------------------------------------- /day08a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day08a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | rustc-hash = "1.1" 12 | -------------------------------------------------------------------------------- /day08a/input.txt: -------------------------------------------------------------------------------- 1 | 300030213213113240234210203330153124541151003015456312312442524531405533542450111443312103110220211 2 | 133000004421300341005340432514034555543556261543410250030436135103304323425502113341331442032311030 3 | 213121312230422241205230130541010120012561656126511652636160154566425231221254515542342023142010133 4 | 210020103232311410025023513110540633654032560666266266442224400244155120504322112255323444432301210 5 | 300221311013444150512444105105055122104524660253365233115442634642236455351502043504233200041232000 6 | 000000011130235121555143014441555205423003555504400645452656322632050035240315440035451003103431431 7 | 012142333141321404105321351332544222551046221101044054031533500165110422142125530252401331243211232 8 | 020213033022012453014033014405001564353352011316633456214232621532251606161624054400501054130430422 9 | 042314012030233125141141244243333123002627374716422264424361631360462131201236611502353523210122300 10 | 211224020402441314100154352420322456122364263545772174674761655261311042611615130513350241030243433 11 | 314424032332214322125462603406635133652272743472434161773175755665106156425610245350415311352303020 12 | 430442043211531134103213404455524724321332213636522224572442553173311265220261503235505013340341232 13 | 001001325232413003110430361654232165433226632435251776357256175725724566400520111500101504331132114 14 | 334412500412200403511523220032572737752127755542727442166375451622531763242464326501020110104340144 15 | 121243523444032105062316052754715461676111661333423221122752355145371142754413605365235134243015313 16 | 242330445052105423412660066474767425155231852584272588286671442475372464535465114141632114402431330 17 | 122050043214212560234014261446673143437367834853285853825877263146536255554162263165412530555001012 18 | 310254352155555362305652565245733333847537568334443567664745527772362543753627625001150411055105112 19 | 025031121433111201225651315747477674878824738825265832254676344282526441156537710545602456542112210 20 | 105541425514161020436715372516214235452255778656548556525666534284848751622646711602335633004210430 21 | 120403544243300210571653423576358224736356674473762873838666826244548367625153434754030101342121403 22 | 432020535536321653451132344347283847864642562823856582222257783373625252524642355422611066341041555 23 | 105515504230051446254242173357243344432244287653558393463636636527332375861462227252610460111541451 24 | 424315140455252444231317616735826624757676779939449898765575452676252735247362276562636111623005500 25 | 021423534431553132473112715725478325366953865554356694548876447733778524336511267122410032353204044 26 | 445423066641156261422146768782747848378447486547353679545953363787428372464325267535533614266344140 27 | 152411666100126757726562222726546749954446865366696449877979478486373233467373175176717065434502141 28 | 140202601300054474441768586442348397689388764774948539945648798559996563788746555346275261454103223 29 | 544203021060377313252177225245274373949438556349734495443338667684563463227487637566451205231151234 30 | 225400103300571274173335762334287864949875576664869759876374397685438976626326425644665160321405114 31 | 230314645445261324544678872478778643594945995976689844475579675835534645236636838337776723535345500 32 | 150534014520772265552634657365463588877484555578696496798458453663473396824266754637171242001256124 33 | 501401625205514213726356888877344586367477569695884664945598775858874867554835685452612772106263532 34 | 003545414654644264168635752867577699868859699658765954768468556893987864886348334776371465025135140 35 | 251042560617345355567763755683459686855588797756945758776799955744646686687652842535676751665034401 36 | 302210131663435613688532374877833645976757884777578755957476749797784636464388672831672655516160250 37 | 111065246313516415337376337787538574959786899487589688777994584659853384389926247746333354700561235 38 | 110414613452245538424336745356686988599756856889899665657755876955474687659467286778227144340035665 39 | 412353204671232672374342364957877787589988865788855789958795889895469566379993753537827253655122163 40 | 220455060636641757662657656485887468555667756998687885558888697575769544353438542486665473665353031 41 | 061302402574166188357244985755358964658897589996959669756655586556668978665737857647731571412663614 42 | 451215265723364666667225569887469777655996787798658577588667964644965767693668287254634774752440436 43 | 301215542714677435434258733978685986666878695679857768798658676786669569956767732852857361576404432 44 | 154623106155526744253836847466987985777579987895579899887867686679478588489549787628542237217621402 45 | 016326557476722738858767965394776546697557589788987986685897875855497888993584977357781252535652100 46 | 516434443771523825524465875344974794885887577968879977777596685889766469448884476765464722367346613 47 | 663333275643147748552476447559494596988869978768877866788776955886649886647734953675545514515635060 48 | 564446265661363787884698458539864897955876879789888686667667695889588654946548558665552464445515100 49 | 444635271445544486468235896595657574556796676868879879878987585894795697656985562654886247765264633 50 | 462165473462113357828755539386966448779857797769787979697957598754959785656563752733766632117233453 51 | 324114033531125766355764993645548777979758996876999867877675777569547846779389355565826361114230641 52 | 224200317716278667488649555774497597689687678896896677969958769969794969974689727365357612457234644 53 | 402622076242363764226695388365948877677669866868687967866668896555954488854868827247567131532732161 54 | 351431525533425423868437845597564857555568597698676776879667799897879746844566636356646565257121003 55 | 225616611661632445584357877765956764697568598699686698997669677996868665573893357436745717575725454 56 | 464505117521646733487884876599599666866788675666888876875979598579854747435497874323277332541546013 57 | 052114137625735662285578885579794999468569858977677679667685665987955489696478687578266127111546664 58 | 316613323223637567683247984347647849968985558977789767985598956679896995585799768687622276617221641 59 | 150200045167123286782287837679577787677797988695867797789687586558667574856533357756471257515363540 60 | 252244417323233175887456579833456748749996686798597998557665769755856789834546748233733443273254100 61 | 356160635747716144466869844679547594648877886665966889699566759455979998476485752287252722716164416 62 | 425166022644275152644747799869954648746958878589556668589768447767896344585634858425817452170565306 63 | 345366062117166733576545864397534485854779888658678987596689784695568398698547735888734716543316365 64 | 533535636242332164847587898599999846566885656697676699688759667965889473655654364846464567176441222 65 | 145156433556112342733574868953399368585597766648768658747699944777476969449428537232155673534436334 66 | 054406066337214353545756523343684448899669455797588778689784798466937584849358665356646637313111401 67 | 254230005511427461268747424696354657897679767675549867458844878496487636435757334231367213603232112 68 | 555355424332316775464478853457754765559478879676449464477968898464959946683563372221445526535034024 69 | 414023123606577152476576548378794456898548667574545479875668799757679333543655778735436732625602102 70 | 103425425660432324255388475439558538899897884857688985496679573943943844375486647275716474356544432 71 | 452130224302617716756636522262934655383939784956995477695867446373399748438345254577364313526363420 72 | 000042112640363475341785644528248693738497465445788948789539367488865954668672787612122734016622455 73 | 023111166642052271313457755228576545698943896555698897675589438943493564742233477111247522056555041 74 | 204431055441351336464513762857847353357853376696786639733989764484974246522527515321225331245432343 75 | 411113064641332752327456644465236399895559367589866764738365755795443834767856231524273551544613205 76 | 002003415151314635554646457575673343677789786935595493666738344866563385573637543752334431304230033 77 | 232000241320312557743676572825328454583544756367648459896978649838474485587354722365706253422641104 78 | 140032334604361016614454563867878852473268539588353455546354984764388862653617247612502644151343100 79 | 230313534421421354553535613177284354853423658747835975969372246355755687417111117262662010635050245 80 | 455442045443411622436616447216784738377874843272575735853775463446344736154635424345111430260111355 81 | 015553515233634200652274644243776752756254628443363283782332853857876372453144557606024162435425502 82 | 414231425344640401425671247313254225752325627774572863823427628435276621555353276003524346445135344 83 | 444014215230466136522431711445473522537227372726657772534226483275376766662531115626523414452105414 84 | 433450111244440640533563144151113117278453728882746574687858827886235133216737041020563315330400051 85 | 043413224423155241164263423653444422516645633847447523577743865447652437564632624466116150042552500 86 | 034343233153545155011601574561726663612576786744276243622471222711311674626123164654601253202230221 87 | 334424544214152026360221522751357747561434577416644336551153665531545226246342213505320031201441042 88 | 444213310102503010334251632366652423612713524641262137252252513732611325223401240210534434334020134 89 | 113234310313013130034263432336443446455536236436221526156612252522132633100613031453230501112202424 90 | 142402332004051013660101510101263126711727662153761423762243333777317301206400030653210431512111444 91 | 411034340051512350022551420314334411275415543216224154457677376654154362121625361111251523342230021 92 | 401212212311255150514520514410354360022337233263271545513775531712533425164554033545254524043033243 93 | 040034023233143153232242654250224010246422671266544421771125320425056106225340103411544104041430023 94 | 202210233034441525003330614323226104160433060432454154126634040116105426512145204401511210203422322 95 | 011431432013322542545215145526600364414641235513425454443064214552663664101101323545031512031302333 96 | 020023210301103025401200032420642652143243335333016204055261530250106466135400230513140242434444003 97 | 310203111441432251152455421244135150164323516554016042002411655305545265404525521215102013341240121 98 | 012320311100031143153052200224256541012135453345356532252242115324133425054343145333123421144111230 99 | 311310344433212432240252542030050542510636225454204032233645040015025321421052152330422440232330022 -------------------------------------------------------------------------------- /day08a/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | let d = include_bytes!("../input.txt"); 3 | let s = d.iter().position(|b| b == &b'\n').unwrap(); 4 | let g: Vec<&[u8]> = d.split(|b| b == &b'\n').filter(|l| !l.is_empty()).collect(); 5 | let mut seen = rustc_hash::FxHashSet::default(); 6 | 7 | for i in 1..s - 1 { 8 | seen.extend( 9 | (1..s - 1) 10 | .scan(g[0][i], |max, y| match (*max, g[y][i]) { 11 | (m, n) if n > m => { 12 | *max = n; 13 | Some(Some(i + y * s)) 14 | } 15 | (m, _) if m >= b'9' => None, 16 | _ => Some(None), 17 | }) 18 | .flatten(), 19 | ); 20 | seen.extend( 21 | (1..s - 1) 22 | .scan(g[s - 1][i], |max, y| match (*max, g[s - y - 1][i]) { 23 | (m, n) if n > m => { 24 | *max = n; 25 | Some(Some(i + (s - y - 1) * s)) 26 | } 27 | (m, _) if m >= b'9' => None, 28 | _ => Some(None), 29 | }) 30 | .flatten(), 31 | ); 32 | seen.extend( 33 | (1..s - 1) 34 | .scan(g[i][0], |max, x| match (*max, g[i][x]) { 35 | (m, n) if n > m => { 36 | *max = n; 37 | Some(Some(x + i * s)) 38 | } 39 | (m, _) if m >= b'9' => None, 40 | _ => Some(None), 41 | }) 42 | .flatten(), 43 | ); 44 | seen.extend( 45 | (1..s - 1) 46 | .scan(g[i][s - 1], |max, x| match (*max, g[i][s - x]) { 47 | (m, n) if n > m => { 48 | *max = n; 49 | Some(Some(s - x + i * s)) 50 | } 51 | (m, _) if m >= b'9' => None, 52 | _ => Some(None), 53 | }) 54 | .flatten(), 55 | ); 56 | } 57 | 58 | println!("{}", seen.len() + ((s - 1) * 4)); 59 | } 60 | -------------------------------------------------------------------------------- /day08b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day08b" 7 | version = "0.1.0" 8 | -------------------------------------------------------------------------------- /day08b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day08b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | -------------------------------------------------------------------------------- /day08b/input.txt: -------------------------------------------------------------------------------- 1 | 300030213213113240234210203330153124541151003015456312312442524531405533542450111443312103110220211 2 | 133000004421300341005340432514034555543556261543410250030436135103304323425502113341331442032311030 3 | 213121312230422241205230130541010120012561656126511652636160154566425231221254515542342023142010133 4 | 210020103232311410025023513110540633654032560666266266442224400244155120504322112255323444432301210 5 | 300221311013444150512444105105055122104524660253365233115442634642236455351502043504233200041232000 6 | 000000011130235121555143014441555205423003555504400645452656322632050035240315440035451003103431431 7 | 012142333141321404105321351332544222551046221101044054031533500165110422142125530252401331243211232 8 | 020213033022012453014033014405001564353352011316633456214232621532251606161624054400501054130430422 9 | 042314012030233125141141244243333123002627374716422264424361631360462131201236611502353523210122300 10 | 211224020402441314100154352420322456122364263545772174674761655261311042611615130513350241030243433 11 | 314424032332214322125462603406635133652272743472434161773175755665106156425610245350415311352303020 12 | 430442043211531134103213404455524724321332213636522224572442553173311265220261503235505013340341232 13 | 001001325232413003110430361654232165433226632435251776357256175725724566400520111500101504331132114 14 | 334412500412200403511523220032572737752127755542727442166375451622531763242464326501020110104340144 15 | 121243523444032105062316052754715461676111661333423221122752355145371142754413605365235134243015313 16 | 242330445052105423412660066474767425155231852584272588286671442475372464535465114141632114402431330 17 | 122050043214212560234014261446673143437367834853285853825877263146536255554162263165412530555001012 18 | 310254352155555362305652565245733333847537568334443567664745527772362543753627625001150411055105112 19 | 025031121433111201225651315747477674878824738825265832254676344282526441156537710545602456542112210 20 | 105541425514161020436715372516214235452255778656548556525666534284848751622646711602335633004210430 21 | 120403544243300210571653423576358224736356674473762873838666826244548367625153434754030101342121403 22 | 432020535536321653451132344347283847864642562823856582222257783373625252524642355422611066341041555 23 | 105515504230051446254242173357243344432244287653558393463636636527332375861462227252610460111541451 24 | 424315140455252444231317616735826624757676779939449898765575452676252735247362276562636111623005500 25 | 021423534431553132473112715725478325366953865554356694548876447733778524336511267122410032353204044 26 | 445423066641156261422146768782747848378447486547353679545953363787428372464325267535533614266344140 27 | 152411666100126757726562222726546749954446865366696449877979478486373233467373175176717065434502141 28 | 140202601300054474441768586442348397689388764774948539945648798559996563788746555346275261454103223 29 | 544203021060377313252177225245274373949438556349734495443338667684563463227487637566451205231151234 30 | 225400103300571274173335762334287864949875576664869759876374397685438976626326425644665160321405114 31 | 230314645445261324544678872478778643594945995976689844475579675835534645236636838337776723535345500 32 | 150534014520772265552634657365463588877484555578696496798458453663473396824266754637171242001256124 33 | 501401625205514213726356888877344586367477569695884664945598775858874867554835685452612772106263532 34 | 003545414654644264168635752867577699868859699658765954768468556893987864886348334776371465025135140 35 | 251042560617345355567763755683459686855588797756945758776799955744646686687652842535676751665034401 36 | 302210131663435613688532374877833645976757884777578755957476749797784636464388672831672655516160250 37 | 111065246313516415337376337787538574959786899487589688777994584659853384389926247746333354700561235 38 | 110414613452245538424336745356686988599756856889899665657755876955474687659467286778227144340035665 39 | 412353204671232672374342364957877787589988865788855789958795889895469566379993753537827253655122163 40 | 220455060636641757662657656485887468555667756998687885558888697575769544353438542486665473665353031 41 | 061302402574166188357244985755358964658897589996959669756655586556668978665737857647731571412663614 42 | 451215265723364666667225569887469777655996787798658577588667964644965767693668287254634774752440436 43 | 301215542714677435434258733978685986666878695679857768798658676786669569956767732852857361576404432 44 | 154623106155526744253836847466987985777579987895579899887867686679478588489549787628542237217621402 45 | 016326557476722738858767965394776546697557589788987986685897875855497888993584977357781252535652100 46 | 516434443771523825524465875344974794885887577968879977777596685889766469448884476765464722367346613 47 | 663333275643147748552476447559494596988869978768877866788776955886649886647734953675545514515635060 48 | 564446265661363787884698458539864897955876879789888686667667695889588654946548558665552464445515100 49 | 444635271445544486468235896595657574556796676868879879878987585894795697656985562654886247765264633 50 | 462165473462113357828755539386966448779857797769787979697957598754959785656563752733766632117233453 51 | 324114033531125766355764993645548777979758996876999867877675777569547846779389355565826361114230641 52 | 224200317716278667488649555774497597689687678896896677969958769969794969974689727365357612457234644 53 | 402622076242363764226695388365948877677669866868687967866668896555954488854868827247567131532732161 54 | 351431525533425423868437845597564857555568597698676776879667799897879746844566636356646565257121003 55 | 225616611661632445584357877765956764697568598699686698997669677996868665573893357436745717575725454 56 | 464505117521646733487884876599599666866788675666888876875979598579854747435497874323277332541546013 57 | 052114137625735662285578885579794999468569858977677679667685665987955489696478687578266127111546664 58 | 316613323223637567683247984347647849968985558977789767985598956679896995585799768687622276617221641 59 | 150200045167123286782287837679577787677797988695867797789687586558667574856533357756471257515363540 60 | 252244417323233175887456579833456748749996686798597998557665769755856789834546748233733443273254100 61 | 356160635747716144466869844679547594648877886665966889699566759455979998476485752287252722716164416 62 | 425166022644275152644747799869954648746958878589556668589768447767896344585634858425817452170565306 63 | 345366062117166733576545864397534485854779888658678987596689784695568398698547735888734716543316365 64 | 533535636242332164847587898599999846566885656697676699688759667965889473655654364846464567176441222 65 | 145156433556112342733574868953399368585597766648768658747699944777476969449428537232155673534436334 66 | 054406066337214353545756523343684448899669455797588778689784798466937584849358665356646637313111401 67 | 254230005511427461268747424696354657897679767675549867458844878496487636435757334231367213603232112 68 | 555355424332316775464478853457754765559478879676449464477968898464959946683563372221445526535034024 69 | 414023123606577152476576548378794456898548667574545479875668799757679333543655778735436732625602102 70 | 103425425660432324255388475439558538899897884857688985496679573943943844375486647275716474356544432 71 | 452130224302617716756636522262934655383939784956995477695867446373399748438345254577364313526363420 72 | 000042112640363475341785644528248693738497465445788948789539367488865954668672787612122734016622455 73 | 023111166642052271313457755228576545698943896555698897675589438943493564742233477111247522056555041 74 | 204431055441351336464513762857847353357853376696786639733989764484974246522527515321225331245432343 75 | 411113064641332752327456644465236399895559367589866764738365755795443834767856231524273551544613205 76 | 002003415151314635554646457575673343677789786935595493666738344866563385573637543752334431304230033 77 | 232000241320312557743676572825328454583544756367648459896978649838474485587354722365706253422641104 78 | 140032334604361016614454563867878852473268539588353455546354984764388862653617247612502644151343100 79 | 230313534421421354553535613177284354853423658747835975969372246355755687417111117262662010635050245 80 | 455442045443411622436616447216784738377874843272575735853775463446344736154635424345111430260111355 81 | 015553515233634200652274644243776752756254628443363283782332853857876372453144557606024162435425502 82 | 414231425344640401425671247313254225752325627774572863823427628435276621555353276003524346445135344 83 | 444014215230466136522431711445473522537227372726657772534226483275376766662531115626523414452105414 84 | 433450111244440640533563144151113117278453728882746574687858827886235133216737041020563315330400051 85 | 043413224423155241164263423653444422516645633847447523577743865447652437564632624466116150042552500 86 | 034343233153545155011601574561726663612576786744276243622471222711311674626123164654601253202230221 87 | 334424544214152026360221522751357747561434577416644336551153665531545226246342213505320031201441042 88 | 444213310102503010334251632366652423612713524641262137252252513732611325223401240210534434334020134 89 | 113234310313013130034263432336443446455536236436221526156612252522132633100613031453230501112202424 90 | 142402332004051013660101510101263126711727662153761423762243333777317301206400030653210431512111444 91 | 411034340051512350022551420314334411275415543216224154457677376654154362121625361111251523342230021 92 | 401212212311255150514520514410354360022337233263271545513775531712533425164554033545254524043033243 93 | 040034023233143153232242654250224010246422671266544421771125320425056106225340103411544104041430023 94 | 202210233034441525003330614323226104160433060432454154126634040116105426512145204401511210203422322 95 | 011431432013322542545215145526600364414641235513425454443064214552663664101101323545031512031302333 96 | 020023210301103025401200032420642652143243335333016204055261530250106466135400230513140242434444003 97 | 310203111441432251152455421244135150164323516554016042002411655305545265404525521215102013341240121 98 | 012320311100031143153052200224256541012135453345356532252242115324133425054343145333123421144111230 99 | 311310344433212432240252542030050542510636225454204032233645040015025321421052152330422440232330022 -------------------------------------------------------------------------------- /day08b/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | let d = include_bytes!("../input.txt"); 3 | let s = d.iter().position(|b| b == &b'\n').unwrap(); 4 | let g: Vec<&[u8]> = d.split(|b| b == &b'\n').filter(|l| !l.is_empty()).collect(); 5 | 6 | let mut max = 0; 7 | for x in 0..s { 8 | for y in 0..s { 9 | let cur = g[y][x]; 10 | if cur <= 1 { 11 | continue; 12 | } 13 | max = max.max( 14 | ((1..y) 15 | .map(|yy| g[y - yy][x]) 16 | .position(|h| h >= cur) 17 | .unwrap_or_else(|| y.wrapping_sub(1)) 18 | .wrapping_add(1)) 19 | * ((y + 1..s) 20 | .map(|y| g[y][x]) 21 | .position(|h| h >= cur) 22 | .unwrap_or_else(|| (s - y).wrapping_sub(2)) 23 | .wrapping_add(1)) 24 | * ((1..x) 25 | .map(|xx| g[y][x - xx]) 26 | .position(|h| h >= cur) 27 | .unwrap_or_else(|| x.wrapping_sub(1)) 28 | .wrapping_add(1)) 29 | * ((x + 1..s) 30 | .map(|x| g[y][x]) 31 | .position(|h| h >= cur) 32 | .unwrap_or_else(|| (s - x).wrapping_sub(2)) 33 | .wrapping_add(1)), 34 | ); 35 | } 36 | } 37 | 38 | println!("{}", max); 39 | } 40 | -------------------------------------------------------------------------------- /day08b/src/main_raw.rs: -------------------------------------------------------------------------------- 1 | // Implementation querying raw input, doesn't seem to be faster. 2 | 3 | pub fn main() { 4 | let d = include_bytes!("../input.txt"); 5 | let s = d.iter().position(|b| b == &b'\n').unwrap(); 6 | println!( 7 | "{}", 8 | (0..s * s) 9 | .map(|i| { 10 | let icur = i + i / s; 11 | let c = d[icur]; 12 | if c <= b'1' { 13 | return 0; 14 | } 15 | 16 | ((1..(i / s)) 17 | .map(|ii| d[icur - ii * (s + 1)]) 18 | .position(|h| h >= c) 19 | .unwrap_or_else(|| (i / s).wrapping_sub(1)) 20 | .wrapping_add(1)) 21 | * ((1..s - (i / s)) 22 | .map(|ii| d[icur + ii * (s + 1)]) 23 | .position(|h| h >= c) 24 | .unwrap_or_else(|| (s - (i / s)).wrapping_sub(2)) 25 | .wrapping_add(1)) 26 | * ((1..(i % s)) 27 | .map(|ii| d[icur - ii]) 28 | .position(|h| h >= c) 29 | .unwrap_or_else(|| (i % s).wrapping_sub(1)) 30 | .wrapping_add(1)) 31 | * ((1..s - (i % s)) 32 | .map(|ii| d[icur + ii]) 33 | .position(|h| h >= c) 34 | .unwrap_or_else(|| (s - (i % s)).wrapping_sub(2)) 35 | .wrapping_add(1)) 36 | }) 37 | .max() 38 | .unwrap() 39 | ); 40 | } 41 | -------------------------------------------------------------------------------- /day09a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "atoi" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 10 | dependencies = [ 11 | "num-traits", 12 | ] 13 | 14 | [[package]] 15 | name = "autocfg" 16 | version = "1.1.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 19 | 20 | [[package]] 21 | name = "day09a" 22 | version = "0.1.0" 23 | dependencies = [ 24 | "atoi", 25 | "rustc-hash", 26 | ] 27 | 28 | [[package]] 29 | name = "num-traits" 30 | version = "0.2.15" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 33 | dependencies = [ 34 | "autocfg", 35 | ] 36 | 37 | [[package]] 38 | name = "rustc-hash" 39 | version = "1.1.0" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 42 | -------------------------------------------------------------------------------- /day09a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day09a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | rustc-hash = "1.1" 13 | -------------------------------------------------------------------------------- /day09a/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | let cmds = include_bytes!("../input.txt") 3 | .split(|b| b == &b'\n') 4 | .map(|l| match (l[0], atoi::atoi(&l[2..]).unwrap()) { 5 | (b'U', l) => ((0, -1), l), 6 | (b'D', l) => ((0, 1), l), 7 | (b'L', l) => ((-1, 0), l), 8 | (_, l) => ((1, 0), l), 9 | }); 10 | let (mut h, mut t, mut s): ((i32, i32), (_, _), rustc_hash::FxHashSet<_>) = Default::default(); 11 | s.insert((0, 0)); 12 | 13 | for (d, l) in cmds { 14 | for _ in 0..l { 15 | h = (h.0 + d.0, h.1 + d.1); 16 | if h.0.abs_diff(t.0) > 1 || h.1.abs_diff(t.1) > 1 { 17 | t = (h.0 - d.0, h.1 - d.1); 18 | s.insert(t); 19 | } 20 | } 21 | } 22 | 23 | println!("{}", s.len()); 24 | } 25 | -------------------------------------------------------------------------------- /day09a/src/main_whole.rs: -------------------------------------------------------------------------------- 1 | // An implementation that attempts to process a full move in a single iteration. 2 | // Sadly, this doesn't seem to be any faster. 3 | 4 | use std::collections::HashSet; 5 | 6 | pub fn main() { 7 | let cmds = include_bytes!("../input.txt") 8 | .split(|b| b == &b'\n') 9 | .map(|l| match (l[0], atoi::atoi::(&l[2..]).unwrap()) { 10 | (b'U', l) => ((0, -1), l), 11 | (b'D', l) => ((0, 1), l), 12 | (b'L', l) => ((-1, 0), l), 13 | (_, l) => ((1, 0), l), 14 | }); 15 | let (mut h, mut t, mut seen): ((i32, i32), (i32, i32), HashSet<_>) = Default::default(); 16 | seen.insert((0, 0)); 17 | 18 | for (d, l) in cmds { 19 | h = (h.0 + d.0 * l, h.1 + d.1 * l); 20 | if h.0.abs_diff(t.0) > 1 || h.1.abs_diff(t.1) > 1 { 21 | let to = (h.0 - d.0, h.1 - d.1); 22 | while t != to { 23 | t.0 += (to.0 - t.0).signum(); 24 | t.1 += (to.1 - t.1).signum(); 25 | seen.insert(t); 26 | } 27 | } 28 | } 29 | 30 | println!("{}", seen.len()); 31 | } 32 | -------------------------------------------------------------------------------- /day09b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "atoi" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 10 | dependencies = [ 11 | "num-traits", 12 | ] 13 | 14 | [[package]] 15 | name = "autocfg" 16 | version = "1.1.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 19 | 20 | [[package]] 21 | name = "day09b" 22 | version = "0.1.0" 23 | dependencies = [ 24 | "atoi", 25 | "rustc-hash", 26 | ] 27 | 28 | [[package]] 29 | name = "num-traits" 30 | version = "0.2.15" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 33 | dependencies = [ 34 | "autocfg", 35 | ] 36 | 37 | [[package]] 38 | name = "rustc-hash" 39 | version = "1.1.0" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 42 | -------------------------------------------------------------------------------- /day09b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day09b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | rustc-hash = "1.1" 13 | -------------------------------------------------------------------------------- /day09b/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | let cmds = include_bytes!("../input.txt") 3 | .split(|b| b == &b'\n') 4 | .map(|l| match (l[0], atoi::atoi(&l[2..]).unwrap()) { 5 | (b'U', l) => ((0, -1), l), 6 | (b'D', l) => ((0, 1), l), 7 | (b'L', l) => ((-1, 0), l), 8 | (_, l) => ((1, 0), l), 9 | }); 10 | let (mut knots, mut s): ([(i32, i32); 10], rustc_hash::FxHashSet<_>) = Default::default(); 11 | s.insert((0, 0)); 12 | 13 | for (d, l) in cmds { 14 | for _ in 0..l { 15 | knots[0].0 += d.0; 16 | knots[0].1 += d.1; 17 | 18 | for i in 1..10 { 19 | let (h, t) = knots.split_at_mut(i); 20 | let (h, t) = (h[i - 1], &mut t[0]); 21 | if h.0.abs_diff(t.0) > 1 || h.1.abs_diff(t.1) > 1 { 22 | let d = (t.0 - h.0, t.1 - h.1); 23 | let l = d.0.abs().max(d.1.abs()); 24 | let m = (d.0 / l, d.1 / l); 25 | *t = (h.0 + m.0, h.1 + m.1); 26 | (i == 9).then(|| s.insert(*t)); 27 | } else { 28 | break; 29 | } 30 | } 31 | } 32 | } 33 | 34 | println!("{}", s.len()); 35 | } 36 | -------------------------------------------------------------------------------- /day09b/src/main_tailcheck.rs: -------------------------------------------------------------------------------- 1 | // An implementation that attempts to process a full move in a single iteration, switching to 2 | // step-by-step when the tail moves. Sadly, this doesn't seem to be any faster. 3 | 4 | use std::collections::HashSet; 5 | 6 | pub fn main() { 7 | let cmds = include_bytes!("../input.txt") 8 | .split(|b| b == &b'\n') 9 | .map(|l| (l[0], atoi::atoi(&l[2..]).unwrap())); 10 | 11 | let mut knots: [(isize, isize); 10] = Default::default(); 12 | let mut seen = HashSet::new(); 13 | seen.insert((0, 0)); 14 | 15 | for (d, l) in cmds { 16 | let d = match d { 17 | b'U' => (0, -1), 18 | b'D' => (0, 1), 19 | b'L' => (-1, 0), 20 | b'R' => (1, 0), 21 | _ => unreachable!(), 22 | }; 23 | 24 | let mut tail_moves = false; 25 | let mut knots_check = knots; 26 | let h = &mut knots_check[0]; 27 | *h = (h.0 + d.0 * l, h.1 + d.1 * l); 28 | for i in 1..10 { 29 | let (h, t) = knots_check.split_at_mut(i); 30 | let h = &mut h[i - 1]; 31 | let t = &mut t[0]; 32 | 33 | if !adjacent(*h, *t) { 34 | if i == 5 { 35 | tail_moves = true; 36 | break; 37 | } 38 | 39 | let d = (t.0 - h.0, t.1 - h.1); 40 | let l = d.0.abs().max(d.1.abs()); 41 | let m = (d.0 / l, d.1 / l); 42 | *t = (h.0 + m.0, h.1 + m.1); 43 | } else { 44 | break; 45 | } 46 | } 47 | 48 | if tail_moves { 49 | for _ in 0..l { 50 | let h = &mut knots[0]; 51 | *h = (h.0 + d.0, h.1 + d.1); 52 | 53 | for i in 1..10 { 54 | let (h, t) = knots.split_at_mut(i); 55 | let h = &mut h[i - 1]; 56 | let t = &mut t[0]; 57 | 58 | if !adjacent(*h, *t) { 59 | let d = (t.0 - h.0, t.1 - h.1); 60 | let l = d.0.abs().max(d.1.abs()); 61 | let m = (d.0 / l, d.1 / l); 62 | *t = (h.0 + m.0, h.1 + m.1); 63 | if i == 9 { 64 | seen.insert(*t); 65 | } 66 | } else { 67 | break; 68 | } 69 | } 70 | } 71 | } else { 72 | knots = knots_check; 73 | } 74 | } 75 | 76 | println!("{}", seen.len()); 77 | } 78 | 79 | #[inline(always)] 80 | fn adjacent(h: (isize, isize), t: (isize, isize)) -> bool { 81 | h.0.abs_diff(t.0) <= 1 && h.1.abs_diff(t.1) <= 1 82 | } 83 | -------------------------------------------------------------------------------- /day10a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "atoi" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 10 | dependencies = [ 11 | "num-traits", 12 | ] 13 | 14 | [[package]] 15 | name = "autocfg" 16 | version = "1.1.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 19 | 20 | [[package]] 21 | name = "day10a" 22 | version = "0.1.0" 23 | dependencies = [ 24 | "atoi", 25 | ] 26 | 27 | [[package]] 28 | name = "num-traits" 29 | version = "0.2.15" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 32 | dependencies = [ 33 | "autocfg", 34 | ] 35 | -------------------------------------------------------------------------------- /day10a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day10a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | -------------------------------------------------------------------------------- /day10a/input.txt: -------------------------------------------------------------------------------- 1 | noop 2 | addx 26 3 | addx -21 4 | addx 2 5 | addx 3 6 | noop 7 | noop 8 | addx 23 9 | addx -17 10 | addx -1 11 | noop 12 | noop 13 | addx 7 14 | noop 15 | addx 3 16 | addx 1 17 | noop 18 | noop 19 | addx 2 20 | noop 21 | addx 7 22 | noop 23 | addx -12 24 | addx 13 25 | addx -38 26 | addx 5 27 | addx 34 28 | addx -2 29 | addx -29 30 | addx 2 31 | addx 5 32 | addx 2 33 | addx 3 34 | addx -2 35 | addx -1 36 | addx 8 37 | addx 2 38 | addx 6 39 | addx -26 40 | addx 23 41 | addx -26 42 | addx 33 43 | addx 2 44 | addx -37 45 | addx -1 46 | addx 1 47 | noop 48 | noop 49 | noop 50 | addx 5 51 | addx 5 52 | addx 3 53 | addx -2 54 | addx 2 55 | addx 5 56 | addx 5 57 | noop 58 | noop 59 | addx -2 60 | addx 4 61 | noop 62 | noop 63 | noop 64 | addx 3 65 | noop 66 | noop 67 | addx 7 68 | addx -1 69 | addx -35 70 | addx -1 71 | addx 5 72 | addx 3 73 | noop 74 | addx 4 75 | noop 76 | noop 77 | noop 78 | noop 79 | noop 80 | addx 5 81 | addx 1 82 | noop 83 | noop 84 | noop 85 | addx -7 86 | addx 12 87 | addx 2 88 | addx 7 89 | noop 90 | addx -2 91 | noop 92 | noop 93 | addx 7 94 | addx 2 95 | addx -39 96 | noop 97 | noop 98 | addx 5 99 | addx 2 100 | addx -4 101 | addx 25 102 | addx -18 103 | addx 7 104 | noop 105 | addx -2 106 | addx 5 107 | addx 2 108 | addx 6 109 | addx -5 110 | addx 2 111 | addx -22 112 | addx 29 113 | addx -21 114 | addx -7 115 | addx 31 116 | addx 2 117 | noop 118 | addx -36 119 | addx 1 120 | addx 5 121 | noop 122 | addx 1 123 | addx 4 124 | addx 5 125 | noop 126 | noop 127 | noop 128 | addx 3 129 | noop 130 | addx -13 131 | addx 15 132 | noop 133 | addx 5 134 | noop 135 | addx 1 136 | noop 137 | addx 3 138 | addx 2 139 | addx 4 140 | addx 3 141 | noop 142 | addx -3 143 | noop -------------------------------------------------------------------------------- /day10a/src/main.rs: -------------------------------------------------------------------------------- 1 | pub fn main() { 2 | let (mut c, mut x, mut s) = (1, 1, 0); 3 | 4 | for i in include_bytes!("../input.txt").split(|b| b == &b'\n') { 5 | s += ((c + 20) % 40 == 0) as i32 * c * x; 6 | c += 1; 7 | if &i[0..4] == b"addx" { 8 | s += ((c + 20) % 40 == 0) as i32 * c * x; 9 | c += 1; 10 | x += atoi::atoi::(&i[5..]).unwrap() as i32; 11 | } 12 | } 13 | 14 | println!("{}", s); 15 | } 16 | -------------------------------------------------------------------------------- /day10b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "atoi" 7 | version = "2.0.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 10 | dependencies = [ 11 | "num-traits", 12 | ] 13 | 14 | [[package]] 15 | name = "autocfg" 16 | version = "1.1.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 19 | 20 | [[package]] 21 | name = "day10b" 22 | version = "0.1.0" 23 | dependencies = [ 24 | "atoi", 25 | ] 26 | 27 | [[package]] 28 | name = "num-traits" 29 | version = "0.2.15" 30 | source = "registry+https://github.com/rust-lang/crates.io-index" 31 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 32 | dependencies = [ 33 | "autocfg", 34 | ] 35 | -------------------------------------------------------------------------------- /day10b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day10b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | -------------------------------------------------------------------------------- /day10b/input.txt: -------------------------------------------------------------------------------- 1 | noop 2 | addx 26 3 | addx -21 4 | addx 2 5 | addx 3 6 | noop 7 | noop 8 | addx 23 9 | addx -17 10 | addx -1 11 | noop 12 | noop 13 | addx 7 14 | noop 15 | addx 3 16 | addx 1 17 | noop 18 | noop 19 | addx 2 20 | noop 21 | addx 7 22 | noop 23 | addx -12 24 | addx 13 25 | addx -38 26 | addx 5 27 | addx 34 28 | addx -2 29 | addx -29 30 | addx 2 31 | addx 5 32 | addx 2 33 | addx 3 34 | addx -2 35 | addx -1 36 | addx 8 37 | addx 2 38 | addx 6 39 | addx -26 40 | addx 23 41 | addx -26 42 | addx 33 43 | addx 2 44 | addx -37 45 | addx -1 46 | addx 1 47 | noop 48 | noop 49 | noop 50 | addx 5 51 | addx 5 52 | addx 3 53 | addx -2 54 | addx 2 55 | addx 5 56 | addx 5 57 | noop 58 | noop 59 | addx -2 60 | addx 4 61 | noop 62 | noop 63 | noop 64 | addx 3 65 | noop 66 | noop 67 | addx 7 68 | addx -1 69 | addx -35 70 | addx -1 71 | addx 5 72 | addx 3 73 | noop 74 | addx 4 75 | noop 76 | noop 77 | noop 78 | noop 79 | noop 80 | addx 5 81 | addx 1 82 | noop 83 | noop 84 | noop 85 | addx -7 86 | addx 12 87 | addx 2 88 | addx 7 89 | noop 90 | addx -2 91 | noop 92 | noop 93 | addx 7 94 | addx 2 95 | addx -39 96 | noop 97 | noop 98 | addx 5 99 | addx 2 100 | addx -4 101 | addx 25 102 | addx -18 103 | addx 7 104 | noop 105 | addx -2 106 | addx 5 107 | addx 2 108 | addx 6 109 | addx -5 110 | addx 2 111 | addx -22 112 | addx 29 113 | addx -21 114 | addx -7 115 | addx 31 116 | addx 2 117 | noop 118 | addx -36 119 | addx 1 120 | addx 5 121 | noop 122 | addx 1 123 | addx 4 124 | addx 5 125 | noop 126 | noop 127 | noop 128 | addx 3 129 | noop 130 | addx -13 131 | addx 15 132 | noop 133 | addx 5 134 | noop 135 | addx 1 136 | noop 137 | addx 3 138 | addx 2 139 | addx 4 140 | addx 3 141 | noop 142 | addx -3 143 | noop -------------------------------------------------------------------------------- /day10b/src/main.rs: -------------------------------------------------------------------------------- 1 | use std::io::{stdout, Write}; 2 | 3 | pub fn main() { 4 | let (mut c, mut x, mut t) = (0, 1, Vec::with_capacity(40 * 60)); 5 | 6 | for i in include_bytes!("../input.txt").split(|b| b == &b'\n') { 7 | t.push((x - 1 <= c % 40 && x + 1 >= c % 40) as u8 * 3 + 32); 8 | c += 1; 9 | if &i[0..4] == b"addx" { 10 | t.push((x - 1 <= c % 40 && x + 1 >= c % 40) as u8 * 3 + 32); 11 | c += 1; 12 | x += atoi::atoi::(&i[5..]).unwrap() as i32; 13 | } 14 | } 15 | 16 | let mut stdout = stdout().lock(); 17 | t.chunks(40).for_each(|l| { 18 | stdout.write_all(l).unwrap(); 19 | stdout.write_all(b"\n").unwrap(); 20 | }); 21 | } 22 | -------------------------------------------------------------------------------- /day11a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day11a" 7 | version = "0.1.0" 8 | dependencies = [ 9 | "itertools", 10 | ] 11 | 12 | [[package]] 13 | name = "either" 14 | version = "1.8.0" 15 | source = "registry+https://github.com/rust-lang/crates.io-index" 16 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 17 | 18 | [[package]] 19 | name = "itertools" 20 | version = "0.10.5" 21 | source = "registry+https://github.com/rust-lang/crates.io-index" 22 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 23 | dependencies = [ 24 | "either", 25 | ] 26 | -------------------------------------------------------------------------------- /day11a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day11a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | itertools = "0.10" 12 | -------------------------------------------------------------------------------- /day11a/input.txt: -------------------------------------------------------------------------------- 1 | Monkey 0: 2 | Starting items: 66, 71, 94 3 | Operation: new = old * 5 4 | Test: divisible by 3 5 | If true: throw to monkey 7 6 | If false: throw to monkey 4 7 | 8 | Monkey 1: 9 | Starting items: 70 10 | Operation: new = old + 6 11 | Test: divisible by 17 12 | If true: throw to monkey 3 13 | If false: throw to monkey 0 14 | 15 | Monkey 2: 16 | Starting items: 62, 68, 56, 65, 94, 78 17 | Operation: new = old + 5 18 | Test: divisible by 2 19 | If true: throw to monkey 3 20 | If false: throw to monkey 1 21 | 22 | Monkey 3: 23 | Starting items: 89, 94, 94, 67 24 | Operation: new = old + 2 25 | Test: divisible by 19 26 | If true: throw to monkey 7 27 | If false: throw to monkey 0 28 | 29 | Monkey 4: 30 | Starting items: 71, 61, 73, 65, 98, 98, 63 31 | Operation: new = old * 7 32 | Test: divisible by 11 33 | If true: throw to monkey 5 34 | If false: throw to monkey 6 35 | 36 | Monkey 5: 37 | Starting items: 55, 62, 68, 61, 60 38 | Operation: new = old + 7 39 | Test: divisible by 5 40 | If true: throw to monkey 2 41 | If false: throw to monkey 1 42 | 43 | Monkey 6: 44 | Starting items: 93, 91, 69, 64, 72, 89, 50, 71 45 | Operation: new = old + 1 46 | Test: divisible by 13 47 | If true: throw to monkey 5 48 | If false: throw to monkey 2 49 | 50 | Monkey 7: 51 | Starting items: 76, 50 52 | Operation: new = old * old 53 | Test: divisible by 7 54 | If true: throw to monkey 4 55 | If false: throw to monkey 6 -------------------------------------------------------------------------------- /day11a/src/main.rs: -------------------------------------------------------------------------------- 1 | #![feature(box_syntax)] 2 | 3 | use itertools::Itertools; 4 | 5 | struct Monkey { 6 | bag: Vec, 7 | op: Box usize>, 8 | div: usize, 9 | yay: usize, 10 | nay: usize, 11 | ins: usize, 12 | } 13 | 14 | pub fn main() { 15 | let mut m: Vec<_> = include_str!("../input.txt") 16 | .split("\n\n") 17 | .map(|m| { 18 | let l: Vec<_> = m.lines().map(|l| l.split(": ").last().unwrap()).collect(); 19 | Monkey { 20 | bag: l[1].split(", ").map(|n| n.parse().unwrap()).collect(), 21 | op: { 22 | let op: Vec<_> = l[2].rsplit_once("= ").unwrap().1.split(' ').collect(); 23 | match op[2] { 24 | "old" => box |old| old * old, 25 | b => match (op[1], b.parse::().unwrap()) { 26 | ("+", n) => box move |old| old + n, 27 | ("*", n) => box move |old| old * n, 28 | _ => unreachable!(), 29 | }, 30 | } 31 | }, 32 | div: l[3].rsplit_once(' ').unwrap().1.parse().unwrap(), 33 | yay: l[4].rsplit_once(' ').unwrap().1.parse().unwrap(), 34 | nay: l[5].rsplit_once(' ').unwrap().1.parse().unwrap(), 35 | ins: 0, 36 | } 37 | }) 38 | .collect(); 39 | let (mo, mut bags): (usize, _) = (m.iter().map(|m| m.div).product(), vec![vec![]; m.len()]); 40 | 41 | (0..20).for_each(|_| { 42 | m.iter_mut().enumerate().for_each(|(i, m)| { 43 | m.bag.append(&mut bags[i]); 44 | m.bag.drain(0..).for_each(|mut n| { 45 | n = (m.op)(n) / 3 % mo; 46 | bags[if n % m.div == 0 { m.yay } else { m.nay }].push(n); 47 | m.ins += 1; 48 | }); 49 | }); 50 | }); 51 | 52 | println!( 53 | "{}", 54 | m.iter() 55 | .map(|m| m.ins) 56 | .sorted_unstable_by(|a, b| b.cmp(a)) 57 | .take(2) 58 | .product::() 59 | ); 60 | } 61 | -------------------------------------------------------------------------------- /day11b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "day11b" 7 | version = "0.1.0" 8 | dependencies = [ 9 | "itertools", 10 | ] 11 | 12 | [[package]] 13 | name = "either" 14 | version = "1.8.0" 15 | source = "registry+https://github.com/rust-lang/crates.io-index" 16 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 17 | 18 | [[package]] 19 | name = "itertools" 20 | version = "0.10.5" 21 | source = "registry+https://github.com/rust-lang/crates.io-index" 22 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 23 | dependencies = [ 24 | "either", 25 | ] 26 | -------------------------------------------------------------------------------- /day11b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day11b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | itertools = "0.10" 12 | -------------------------------------------------------------------------------- /day11b/input.txt: -------------------------------------------------------------------------------- 1 | Monkey 0: 2 | Starting items: 66, 71, 94 3 | Operation: new = old * 5 4 | Test: divisible by 3 5 | If true: throw to monkey 7 6 | If false: throw to monkey 4 7 | 8 | Monkey 1: 9 | Starting items: 70 10 | Operation: new = old + 6 11 | Test: divisible by 17 12 | If true: throw to monkey 3 13 | If false: throw to monkey 0 14 | 15 | Monkey 2: 16 | Starting items: 62, 68, 56, 65, 94, 78 17 | Operation: new = old + 5 18 | Test: divisible by 2 19 | If true: throw to monkey 3 20 | If false: throw to monkey 1 21 | 22 | Monkey 3: 23 | Starting items: 89, 94, 94, 67 24 | Operation: new = old + 2 25 | Test: divisible by 19 26 | If true: throw to monkey 7 27 | If false: throw to monkey 0 28 | 29 | Monkey 4: 30 | Starting items: 71, 61, 73, 65, 98, 98, 63 31 | Operation: new = old * 7 32 | Test: divisible by 11 33 | If true: throw to monkey 5 34 | If false: throw to monkey 6 35 | 36 | Monkey 5: 37 | Starting items: 55, 62, 68, 61, 60 38 | Operation: new = old + 7 39 | Test: divisible by 5 40 | If true: throw to monkey 2 41 | If false: throw to monkey 1 42 | 43 | Monkey 6: 44 | Starting items: 93, 91, 69, 64, 72, 89, 50, 71 45 | Operation: new = old + 1 46 | Test: divisible by 13 47 | If true: throw to monkey 5 48 | If false: throw to monkey 2 49 | 50 | Monkey 7: 51 | Starting items: 76, 50 52 | Operation: new = old * old 53 | Test: divisible by 7 54 | If true: throw to monkey 4 55 | If false: throw to monkey 6 -------------------------------------------------------------------------------- /day11b/src/main.rs: -------------------------------------------------------------------------------- 1 | #![feature(box_syntax)] 2 | 3 | use itertools::Itertools; 4 | 5 | struct Monkey { 6 | bag: Vec, 7 | op: Box usize>, 8 | div: usize, 9 | yay: usize, 10 | nay: usize, 11 | ins: usize, 12 | } 13 | 14 | pub fn main() { 15 | let mut m: Vec<_> = include_str!("../input.txt") 16 | .split("\n\n") 17 | .map(|m| { 18 | let l: Vec<_> = m.lines().map(|l| l.split(": ").last().unwrap()).collect(); 19 | Monkey { 20 | bag: l[1].split(", ").map(|n| n.parse().unwrap()).collect(), 21 | op: { 22 | let op: Vec<_> = l[2].rsplit_once("= ").unwrap().1.split(' ').collect(); 23 | match op[2] { 24 | "old" => box |old| old * old, 25 | b => match (op[1], b.parse::().unwrap()) { 26 | ("+", n) => box move |old| old + n, 27 | ("*", n) => box move |old| old * n, 28 | _ => unreachable!(), 29 | }, 30 | } 31 | }, 32 | div: l[3].rsplit_once(' ').unwrap().1.parse().unwrap(), 33 | yay: l[4].rsplit_once(' ').unwrap().1.parse().unwrap(), 34 | nay: l[5].rsplit_once(' ').unwrap().1.parse().unwrap(), 35 | ins: 0, 36 | } 37 | }) 38 | .collect(); 39 | let (mo, mut bags): (usize, _) = (m.iter().map(|m| m.div).product(), vec![vec![]; m.len()]); 40 | 41 | (0..10_000).for_each(|_| { 42 | m.iter_mut().enumerate().for_each(|(i, m)| { 43 | m.bag.append(&mut bags[i]); 44 | m.bag.drain(0..).for_each(|mut n| { 45 | n = (m.op)(n) % mo; 46 | bags[if n % m.div == 0 { m.yay } else { m.nay }].push(n); 47 | m.ins += 1; 48 | }); 49 | }); 50 | }); 51 | 52 | println!( 53 | "{}", 54 | m.iter() 55 | .map(|m| m.ins) 56 | .sorted_unstable_by(|a, b| b.cmp(a)) 57 | .take(2) 58 | .product::() 59 | ); 60 | } 61 | -------------------------------------------------------------------------------- /day12a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "autocfg" 7 | version = "1.1.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 10 | 11 | [[package]] 12 | name = "day12a" 13 | version = "0.1.0" 14 | dependencies = [ 15 | "pathfinding", 16 | ] 17 | 18 | [[package]] 19 | name = "either" 20 | version = "1.8.0" 21 | source = "registry+https://github.com/rust-lang/crates.io-index" 22 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 23 | 24 | [[package]] 25 | name = "fixedbitset" 26 | version = "0.4.2" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 29 | 30 | [[package]] 31 | name = "hashbrown" 32 | version = "0.12.3" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 35 | 36 | [[package]] 37 | name = "indexmap" 38 | version = "1.9.2" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 41 | dependencies = [ 42 | "autocfg", 43 | "hashbrown", 44 | ] 45 | 46 | [[package]] 47 | name = "integer-sqrt" 48 | version = "0.1.5" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" 51 | dependencies = [ 52 | "num-traits", 53 | ] 54 | 55 | [[package]] 56 | name = "itertools" 57 | version = "0.10.5" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 60 | dependencies = [ 61 | "either", 62 | ] 63 | 64 | [[package]] 65 | name = "num-traits" 66 | version = "0.2.15" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 69 | dependencies = [ 70 | "autocfg", 71 | ] 72 | 73 | [[package]] 74 | name = "pathfinding" 75 | version = "4.0.0" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "09ba65132000a419ec9b12d1850a4f73896afd0e8575d4dae41097e17600048f" 78 | dependencies = [ 79 | "fixedbitset", 80 | "indexmap", 81 | "integer-sqrt", 82 | "itertools", 83 | "num-traits", 84 | "rustc-hash", 85 | "thiserror", 86 | ] 87 | 88 | [[package]] 89 | name = "proc-macro2" 90 | version = "1.0.47" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" 93 | dependencies = [ 94 | "unicode-ident", 95 | ] 96 | 97 | [[package]] 98 | name = "quote" 99 | version = "1.0.21" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 102 | dependencies = [ 103 | "proc-macro2", 104 | ] 105 | 106 | [[package]] 107 | name = "rustc-hash" 108 | version = "1.1.0" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 111 | 112 | [[package]] 113 | name = "syn" 114 | version = "1.0.105" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" 117 | dependencies = [ 118 | "proc-macro2", 119 | "quote", 120 | "unicode-ident", 121 | ] 122 | 123 | [[package]] 124 | name = "thiserror" 125 | version = "1.0.37" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" 128 | dependencies = [ 129 | "thiserror-impl", 130 | ] 131 | 132 | [[package]] 133 | name = "thiserror-impl" 134 | version = "1.0.37" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" 137 | dependencies = [ 138 | "proc-macro2", 139 | "quote", 140 | "syn", 141 | ] 142 | 143 | [[package]] 144 | name = "unicode-ident" 145 | version = "1.0.5" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" 148 | -------------------------------------------------------------------------------- /day12a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day12a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | pathfinding = "4" 12 | -------------------------------------------------------------------------------- /day12a/input.txt: -------------------------------------------------------------------------------- 1 | abcccccccccccccccccaaccccccccccccaaaaaaaacccccccccccaaaaaccccaaaaaaccaaaaaaaaaaaaaaaaaccccccccccccccccaaacccccaaaaaaaacccaaaccccccccccccccccccccccccccccccccccccccccccccccccccaaaaa 2 | abccccccccccccccccaaacaacccccccccccaaaacccccccccccccaaaaaacccaaaaaaccaaaaaaaaaaaaaaaaaaaacccccccccaaacaaacccccaaaaaaaaaccaaaaccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa 3 | abcccccccccccccccccaaaaacccccccccccaaaaaccccccccccccaaaaaaccccaaaacccaaaacccaaaaaaaaaaaaacccccccccaaaaaaaaaacccaaaaaaaaccaaaaccccccccccccccccccccccccccccccccccaaacccccccccccaaaaaa 4 | abcccccccccccccccaaaaaacccccccccccaaacaaccaaccccccccaaaaaaccccaaaacccaaaccccaaaaaaaaaaaaaccccccccccaaaaaaaaaccaaaaaacccccaaacccccccccccccccccccccccccccccccccccaaaccccccccccccccaaa 5 | abcccccccccccccccaaaaaaaacccccccccaacccacaaacaacccccccaaccccccaccaccccccccaaaaaaaaaaaaccccccccccccccaaaaaaacccaaaaaaacccccccccccccaacccccccccccccccccccccccccccaaaccccccccccccccaaa 6 | abcccccccccccccccaacaaaaacccccccccccccccccaaaaacccccccccccccccccccccccccccaaaaaaaaaaaaccccccccccccccaaaaaaccccaaccaaacccccccccccaaaaaaccccccccccccccccccccccccccdccccccccccccccccaa 7 | abccaacccccccaaacccaaacaccccccccccaaacccaaaaaaccccccccccccccccccccccccccccaaacccaaaaaacaaaaccccccccaaaaaaaccccccccaaacccccccccccaaaaaacccccccccccccccccllllllcccdddddcccccccccccccc 8 | abaaaacccacccaaccccaacccccccccccccaaacccaaaaaaaacccccccccccccccccaaccccccccacccaaaaccccaaaaccccccccaaacaaaccccccccccccccccccccccaaaaaaccccccccccccccccllllllllldddddddddddccaaccccc 9 | abaaaaccaaaaaaaacccccccccccccccaaaaaaaacaacaaaaacccccccccccccccccaaacccccccaaacaaccccccaaaacccccccccccccaaccccccccccccccccccccccaaaaaccccccccccccccccclllllllllldddddddddeeaaaccccc 10 | abaaaccccaaaaaaaaccccccccaaacccaaaaaaaacccaaacccccccccccccccccaaaaaaaaccccccaaaaacccccccaacccccccccccccccccccccccccccccccccccccccaaaaccccaaaccccccccckllppppplllmmmmmmmdeeeeaaccccc 11 | abaaaacccaaaaaaaaacccccaaaaaaccccaaaaaccccaaccccccccccccccccccaaaaaaaaccccccaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccaaaacccccccckklpppppppplmmmmmmmmmeeeeaccccc 12 | abaaaacccaaaaaaaaacccccaaaaaacccaaaaaaccccccccaacccccccccccccccaaaaaaccccccaaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccaaaacccccccckkkppppppppqmmmmmmmmmmeeeaacccc 13 | abaaaaaccaaaaaaaaccccccaaaaaacccaaaaaaccccccacaaaacccccccccccccaaaaaaccccccaaaaaaaaccccccccaaaaccccccccaaacccccccccccccccccccccccccccccccaaacccccccckkkpppuuuppqqqqqqqqmmmeeeeacccc 14 | abacccccaaaaaaaccccccccaaaaaccccaccaaaccccccaaaaaacccccacccccccaaaaaaccccccaaaaaacaaaccccccaaaaccccccccaaaacccccccccccccccccccccccccccccccccccccccckkkpppuuuuuuqqqqqqqqqnnneeeccccc 15 | abcccccccaccaaaccccccccaaaaacccccccccccccccccaaaacccaaaacccccccaacaaacccccccccaaacaaaaaccccaaaaccccccccaaaaccccccccccccccccccccccccccccccccccccccckkkkpppuuuuuuuqvvvvqqqnnneeeccccc 16 | abcccccccccccaaacaaccccccccccccccccccccccccccaaaacccaaaaaacccccccccccccccccccccccaaaaaaccccaaacccccccccaaaccccccccccccccccccccccccccccccccccccccckkkkrrpuuuxxxuvvvvvvvqqnnneeeccccc 17 | abcccccccccccccccaacaaaccccccccccccccccccccccaacaacccaaaaacccccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccckkkkrrrruuxxxxuvvvvvvvqqnnneeeccccc 18 | abcccccccccccccccaaaaacccccccccccccccccccccccccccaccaaaaacccccaaccccccccccccccccccaaaaaccccccccccccccccaaaccccccccccccccaaacccccccccccccccccccckkkkrrrruuuxxxxyyyyyvvvqqnnneecccccc 19 | abcccccccccccccaaaaaacccccccccccaacaacccccccccccaaaaaaaaacccacaaaacaaccaaccccccccaaacaaccccccccccaaccccaaaaaacccaacaacccaaacacccccccccccccccccjjkkrrrruuuuuxxxyyyyyvvqrqnneffcccccc 20 | abcccccccccccccaaaaaaaacccaaacccaaaaaccccccaacccaaaaaaaaacccaaaaaacaaaaaaccccccccaaacaaacccccccaaaaaacaaaaaaacccaaaaacaaaaaaaaccccccccccccccccjjjrrrtttuuxxxxxyyyyyvvrrnnnfffcccccc 21 | SbccccccccccccccccaaaaacccaaaaccaaaaaaccccaaaaaacaaaaaaaaacccaaaacccaaaaaccccccccaaaaaaacccccccaaaaaaaaaaaaaaccaaaaaccaaaaaaaaccccccccccccccccjjjrrrtttxxxEzzzzyyyvvrrrnnnfffcccccc 22 | abccccccccccaaaccaaccaacccaaaaccaaaaaacccccaaaaacaaaaaaaaacccaaaaccaaaaaacccccccccaaaaaaccccccccaaaacaaaaaaacccaaaaaaccaaaaaacccccccccccccccccjjjrrrtttxxxxxyyyyyyvvrrrnnnfffcccccc 23 | abcccccccccaaaaccaacccccccaaacccaaaaaacccaaaaaaaaaaaaaaaaacccaacacaaaaaaaacccccaaaaaaaacccccccccaaaacccaaaaaaccccaaaacccaaaaacccccccccccccccccjjjrrrtttxxxxxyyyyyyywvrrnnnfffcccccc 24 | abcccccccccaaaacccccccccccccccccccaaaccccaaaaaaaaaaaaaaaaaacccccccaaaaaaaacccccaaaaaaaaaccccccccaccacccaaaaaaccccacccccaaaaaacccccccccccccccccjjjrrrrttttxxxyyyyyyywwrrroooffcccccc 25 | abccccccccccaaaccccccccccccccccccccccccccaaaaaaaaaccaaaaaaaccccccccccaaccccccccaaaaaaaaaaccccccccccccccaacccccccccccccccaaccccccccccccccccccccjjjjqqqqttttxxyywwwwwwwwrrooofffccccc 26 | abcccccccccccccccccccccccccccccccccccccccccaaacacccccaaaaccccccccccccaacccccccccccaaacaaacccccccccccccccccccccccccccccaaacccccccccccccccccccaacjjjjqqqqqttwwwwwwwwwwwrrrooofffccccc 27 | abcccccccccccccccccccccccccccccccccccccccccaaccccccccccaacccccccccccccccccccccccccaaacccccccccccccccccccccccccccccccccaaacccccccccccccccccaaaaaajjjjqqqqttwwwwwwsswwrrrrooofffccccc 28 | abcccccaaaaccccccccccccccaacaaccccccccccccccccccccccccccccccccccccccccccccccccccccaacccccccccccccccccccccccccccccccaaaaaaaaccaaaacccccccccaaaaaacjjjiqqqtttwwwwsssssrrrrooofffccccc 29 | abccccaaaaaccccccccccccccaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaaaccaaaaacccccccccaaaaacciiiiqqttswwwssssssrrroooogffccccc 30 | abccccaaaaaacccccccccccccaaaaaacccaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaccaaaaaaccccccccaaaaacccciiiqqqssssssspppooooooogggaccccc 31 | abccccaaaaaaccccccccaacccaaaaaaccccaacccccccccccccccccccccccccccccccccaaaaccccccccccccccccccccccccccccccccccccccccccaaaaaaccaaaaaaccccccccaaaaaccccciiiqqsssssspppppoooooggggaacccc 32 | abccccaaaaaccccccaaaaacccaaaaaacaacaaaaaccccccccccccccccccccaacccccccaaaaacccccccccccaaaccccccccccccccccccccccccccccaaaaaacccaaaaacccccccccacccccccciiiqqqpssspppppgggggggggaaacccc 33 | abccccccaaacccccccaaaaaccccaaaccaaaaaaaacccccccaacccccccaaccaacccccccaaaaaacccccccccaaaacccccccccccaaaaccccccccccccaaccaaacccaaacccccaaacaaaccccccccciiqqppppppphhhggggggggaaaacccc 34 | abccccccccccccccccaaaaaccccccccccaaaaaccccccccaaacaaccccaaaaaacccccccaaaaaaaccccccccaaaacccccccccccaaaacccccccccaaaaaacccccccccccccccaaaaaaaccccccccciiippppppphhhhggggggcaaacccccc 35 | abaacccccccccccccaaaaaccccccccccccaaaaaccccccccaaaaacccccaaaaaaacccccaaaaacaaacccccccaaacccccccccccaaaacccccccccaaaaacccccccccccccccccaaaaaacccccccccciiiippphhhhhhcccccccaaacccccc 36 | abaacccccccccccccccaaacccccccccccaaacaaccccccaaaaaaccccccaaaaaaacccaaccaaacaaaaccaaaccccccccccccccccaaacccccccccaaaaaaacccccccccccccccaaaaaaaacccccccciiihhhhhhhhaaaccccccccccccccc 37 | abaaccccccccccccccccccccccccccccccaacccccccccaaaaaaaacccaaaaaaccaaaaaacccccaaaacaaaaaccccccccccccccccccccccccccaaaaaaaaccccccccccccccaaaaaaaaaccccccccciihhhhhhcaaaacccccccccccccca 38 | abaaccccccccccccccccccccccccccccccccaacccccccaacaaaaacccaaaaaaccaaaaacccccccaaaaaaaacccccccccccccccccccccccccccaaaaaaaacccccccccaaacaaaaaaaaaacccccccccccchhhaccccaacccccccccccccca 39 | abaaccccccccccccccccccccccccccccccccaaaaaaccccccaaccccccccccaaccaaaaaaacccccaaaaaaaccccccccccccccccccccccccaaaccacaaacccccccccccaaaaaaacaaacaaaaaacccccccccaaacccccccccccccccaaaaaa 40 | abccccccccccccccccccccccccccccccccccaaaaaccccccaaccccccccccccccaaaaaaaacaaaaaaaaaaccccccccccccccccccccccccaaaaaaccaaaccccccccccccaaaaaacaaacaaaaaacccccccccaaaccccccccccccccccaaaaa 41 | abccccccccccccccccccccccccccccccccaaaaaaaacccccccccccccccccccccaaaaaaaacaaaaaaaaaaaaacccccccccccccccccccccaaaaaacccccccccccccccaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccaaaaa -------------------------------------------------------------------------------- /day12a/src/main.rs: -------------------------------------------------------------------------------- 1 | const NEXT: [(usize, usize); 4] = [(1, 0), (usize::MAX, 0), (0, 1), (0, usize::MAX)]; 2 | 3 | pub fn main() { 4 | let data = include_str!("../input.txt"); 5 | let mut map: Vec<_> = data 6 | .bytes() 7 | .filter(|b| b != &b'\n') 8 | .map(|b| b.to_ascii_lowercase() - b'a') 9 | .collect(); 10 | 11 | let w = data.bytes().position(|b| b == b'\n').unwrap(); 12 | let h = map.len() / w; 13 | let mut start = data.bytes().position(|b| b == b'S').unwrap(); 14 | let mut end = data.bytes().position(|b| b == b'E').unwrap(); 15 | (start, end, map[start], map[end]) = (start - start / (w + 1), end - end / (w + 1), 0, 25); 16 | 17 | println!( 18 | "{}", 19 | pathfinding::directed::bfs::bfs( 20 | &(end % w, end / w), 21 | |(x, y)| { 22 | let cur = map[y * w + x]; 23 | NEXT.iter() 24 | .map(|(xx, yy)| (x.wrapping_add(*xx), y.wrapping_add(*yy))) 25 | .filter(|(x, y)| x < &w && y < &h && map[y * w + x] >= cur.saturating_sub(1)) 26 | .collect::>() 27 | }, 28 | |&p| p == (start % w, start / w), 29 | ) 30 | .unwrap() 31 | .len() 32 | - 1 33 | ); 34 | } 35 | -------------------------------------------------------------------------------- /day12b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "autocfg" 7 | version = "1.1.0" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 10 | 11 | [[package]] 12 | name = "day12b" 13 | version = "0.1.0" 14 | dependencies = [ 15 | "pathfinding", 16 | ] 17 | 18 | [[package]] 19 | name = "either" 20 | version = "1.8.0" 21 | source = "registry+https://github.com/rust-lang/crates.io-index" 22 | checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" 23 | 24 | [[package]] 25 | name = "fixedbitset" 26 | version = "0.4.2" 27 | source = "registry+https://github.com/rust-lang/crates.io-index" 28 | checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" 29 | 30 | [[package]] 31 | name = "hashbrown" 32 | version = "0.12.3" 33 | source = "registry+https://github.com/rust-lang/crates.io-index" 34 | checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" 35 | 36 | [[package]] 37 | name = "indexmap" 38 | version = "1.9.2" 39 | source = "registry+https://github.com/rust-lang/crates.io-index" 40 | checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" 41 | dependencies = [ 42 | "autocfg", 43 | "hashbrown", 44 | ] 45 | 46 | [[package]] 47 | name = "integer-sqrt" 48 | version = "0.1.5" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "276ec31bcb4a9ee45f58bec6f9ec700ae4cf4f4f8f2fa7e06cb406bd5ffdd770" 51 | dependencies = [ 52 | "num-traits", 53 | ] 54 | 55 | [[package]] 56 | name = "itertools" 57 | version = "0.10.5" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 60 | dependencies = [ 61 | "either", 62 | ] 63 | 64 | [[package]] 65 | name = "num-traits" 66 | version = "0.2.15" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 69 | dependencies = [ 70 | "autocfg", 71 | ] 72 | 73 | [[package]] 74 | name = "pathfinding" 75 | version = "4.0.0" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "09ba65132000a419ec9b12d1850a4f73896afd0e8575d4dae41097e17600048f" 78 | dependencies = [ 79 | "fixedbitset", 80 | "indexmap", 81 | "integer-sqrt", 82 | "itertools", 83 | "num-traits", 84 | "rustc-hash", 85 | "thiserror", 86 | ] 87 | 88 | [[package]] 89 | name = "proc-macro2" 90 | version = "1.0.47" 91 | source = "registry+https://github.com/rust-lang/crates.io-index" 92 | checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725" 93 | dependencies = [ 94 | "unicode-ident", 95 | ] 96 | 97 | [[package]] 98 | name = "quote" 99 | version = "1.0.21" 100 | source = "registry+https://github.com/rust-lang/crates.io-index" 101 | checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" 102 | dependencies = [ 103 | "proc-macro2", 104 | ] 105 | 106 | [[package]] 107 | name = "rustc-hash" 108 | version = "1.1.0" 109 | source = "registry+https://github.com/rust-lang/crates.io-index" 110 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 111 | 112 | [[package]] 113 | name = "syn" 114 | version = "1.0.105" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" 117 | dependencies = [ 118 | "proc-macro2", 119 | "quote", 120 | "unicode-ident", 121 | ] 122 | 123 | [[package]] 124 | name = "thiserror" 125 | version = "1.0.37" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" 128 | dependencies = [ 129 | "thiserror-impl", 130 | ] 131 | 132 | [[package]] 133 | name = "thiserror-impl" 134 | version = "1.0.37" 135 | source = "registry+https://github.com/rust-lang/crates.io-index" 136 | checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" 137 | dependencies = [ 138 | "proc-macro2", 139 | "quote", 140 | "syn", 141 | ] 142 | 143 | [[package]] 144 | name = "unicode-ident" 145 | version = "1.0.5" 146 | source = "registry+https://github.com/rust-lang/crates.io-index" 147 | checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" 148 | -------------------------------------------------------------------------------- /day12b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day12b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | pathfinding = "4" 12 | -------------------------------------------------------------------------------- /day12b/input.txt: -------------------------------------------------------------------------------- 1 | abcccccccccccccccccaaccccccccccccaaaaaaaacccccccccccaaaaaccccaaaaaaccaaaaaaaaaaaaaaaaaccccccccccccccccaaacccccaaaaaaaacccaaaccccccccccccccccccccccccccccccccccccccccccccccccccaaaaa 2 | abccccccccccccccccaaacaacccccccccccaaaacccccccccccccaaaaaacccaaaaaaccaaaaaaaaaaaaaaaaaaaacccccccccaaacaaacccccaaaaaaaaaccaaaaccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa 3 | abcccccccccccccccccaaaaacccccccccccaaaaaccccccccccccaaaaaaccccaaaacccaaaacccaaaaaaaaaaaaacccccccccaaaaaaaaaacccaaaaaaaaccaaaaccccccccccccccccccccccccccccccccccaaacccccccccccaaaaaa 4 | abcccccccccccccccaaaaaacccccccccccaaacaaccaaccccccccaaaaaaccccaaaacccaaaccccaaaaaaaaaaaaaccccccccccaaaaaaaaaccaaaaaacccccaaacccccccccccccccccccccccccccccccccccaaaccccccccccccccaaa 5 | abcccccccccccccccaaaaaaaacccccccccaacccacaaacaacccccccaaccccccaccaccccccccaaaaaaaaaaaaccccccccccccccaaaaaaacccaaaaaaacccccccccccccaacccccccccccccccccccccccccccaaaccccccccccccccaaa 6 | abcccccccccccccccaacaaaaacccccccccccccccccaaaaacccccccccccccccccccccccccccaaaaaaaaaaaaccccccccccccccaaaaaaccccaaccaaacccccccccccaaaaaaccccccccccccccccccccccccccdccccccccccccccccaa 7 | abccaacccccccaaacccaaacaccccccccccaaacccaaaaaaccccccccccccccccccccccccccccaaacccaaaaaacaaaaccccccccaaaaaaaccccccccaaacccccccccccaaaaaacccccccccccccccccllllllcccdddddcccccccccccccc 8 | abaaaacccacccaaccccaacccccccccccccaaacccaaaaaaaacccccccccccccccccaaccccccccacccaaaaccccaaaaccccccccaaacaaaccccccccccccccccccccccaaaaaaccccccccccccccccllllllllldddddddddddccaaccccc 9 | abaaaaccaaaaaaaacccccccccccccccaaaaaaaacaacaaaaacccccccccccccccccaaacccccccaaacaaccccccaaaacccccccccccccaaccccccccccccccccccccccaaaaaccccccccccccccccclllllllllldddddddddeeaaaccccc 10 | abaaaccccaaaaaaaaccccccccaaacccaaaaaaaacccaaacccccccccccccccccaaaaaaaaccccccaaaaacccccccaacccccccccccccccccccccccccccccccccccccccaaaaccccaaaccccccccckllppppplllmmmmmmmdeeeeaaccccc 11 | abaaaacccaaaaaaaaacccccaaaaaaccccaaaaaccccaaccccccccccccccccccaaaaaaaaccccccaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccaaaacccccccckklpppppppplmmmmmmmmmeeeeaccccc 12 | abaaaacccaaaaaaaaacccccaaaaaacccaaaaaaccccccccaacccccccccccccccaaaaaaccccccaaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccaaaacccccccckkkppppppppqmmmmmmmmmmeeeaacccc 13 | abaaaaaccaaaaaaaaccccccaaaaaacccaaaaaaccccccacaaaacccccccccccccaaaaaaccccccaaaaaaaaccccccccaaaaccccccccaaacccccccccccccccccccccccccccccccaaacccccccckkkpppuuuppqqqqqqqqmmmeeeeacccc 14 | abacccccaaaaaaaccccccccaaaaaccccaccaaaccccccaaaaaacccccacccccccaaaaaaccccccaaaaaacaaaccccccaaaaccccccccaaaacccccccccccccccccccccccccccccccccccccccckkkpppuuuuuuqqqqqqqqqnnneeeccccc 15 | abcccccccaccaaaccccccccaaaaacccccccccccccccccaaaacccaaaacccccccaacaaacccccccccaaacaaaaaccccaaaaccccccccaaaaccccccccccccccccccccccccccccccccccccccckkkkpppuuuuuuuqvvvvqqqnnneeeccccc 16 | abcccccccccccaaacaaccccccccccccccccccccccccccaaaacccaaaaaacccccccccccccccccccccccaaaaaaccccaaacccccccccaaaccccccccccccccccccccccccccccccccccccccckkkkrrpuuuxxxuvvvvvvvqqnnneeeccccc 17 | abcccccccccccccccaacaaaccccccccccccccccccccccaacaacccaaaaacccccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccckkkkrrrruuxxxxuvvvvvvvqqnnneeeccccc 18 | abcccccccccccccccaaaaacccccccccccccccccccccccccccaccaaaaacccccaaccccccccccccccccccaaaaaccccccccccccccccaaaccccccccccccccaaacccccccccccccccccccckkkkrrrruuuxxxxyyyyyvvvqqnnneecccccc 19 | abcccccccccccccaaaaaacccccccccccaacaacccccccccccaaaaaaaaacccacaaaacaaccaaccccccccaaacaaccccccccccaaccccaaaaaacccaacaacccaaacacccccccccccccccccjjkkrrrruuuuuxxxyyyyyvvqrqnneffcccccc 20 | abcccccccccccccaaaaaaaacccaaacccaaaaaccccccaacccaaaaaaaaacccaaaaaacaaaaaaccccccccaaacaaacccccccaaaaaacaaaaaaacccaaaaacaaaaaaaaccccccccccccccccjjjrrrtttuuxxxxxyyyyyvvrrnnnfffcccccc 21 | SbccccccccccccccccaaaaacccaaaaccaaaaaaccccaaaaaacaaaaaaaaacccaaaacccaaaaaccccccccaaaaaaacccccccaaaaaaaaaaaaaaccaaaaaccaaaaaaaaccccccccccccccccjjjrrrtttxxxEzzzzyyyvvrrrnnnfffcccccc 22 | abccccccccccaaaccaaccaacccaaaaccaaaaaacccccaaaaacaaaaaaaaacccaaaaccaaaaaacccccccccaaaaaaccccccccaaaacaaaaaaacccaaaaaaccaaaaaacccccccccccccccccjjjrrrtttxxxxxyyyyyyvvrrrnnnfffcccccc 23 | abcccccccccaaaaccaacccccccaaacccaaaaaacccaaaaaaaaaaaaaaaaacccaacacaaaaaaaacccccaaaaaaaacccccccccaaaacccaaaaaaccccaaaacccaaaaacccccccccccccccccjjjrrrtttxxxxxyyyyyyywvrrnnnfffcccccc 24 | abcccccccccaaaacccccccccccccccccccaaaccccaaaaaaaaaaaaaaaaaacccccccaaaaaaaacccccaaaaaaaaaccccccccaccacccaaaaaaccccacccccaaaaaacccccccccccccccccjjjrrrrttttxxxyyyyyyywwrrroooffcccccc 25 | abccccccccccaaaccccccccccccccccccccccccccaaaaaaaaaccaaaaaaaccccccccccaaccccccccaaaaaaaaaaccccccccccccccaacccccccccccccccaaccccccccccccccccccccjjjjqqqqttttxxyywwwwwwwwrrooofffccccc 26 | abcccccccccccccccccccccccccccccccccccccccccaaacacccccaaaaccccccccccccaacccccccccccaaacaaacccccccccccccccccccccccccccccaaacccccccccccccccccccaacjjjjqqqqqttwwwwwwwwwwwrrrooofffccccc 27 | abcccccccccccccccccccccccccccccccccccccccccaaccccccccccaacccccccccccccccccccccccccaaacccccccccccccccccccccccccccccccccaaacccccccccccccccccaaaaaajjjjqqqqttwwwwwwsswwrrrrooofffccccc 28 | abcccccaaaaccccccccccccccaacaaccccccccccccccccccccccccccccccccccccccccccccccccccccaacccccccccccccccccccccccccccccccaaaaaaaaccaaaacccccccccaaaaaacjjjiqqqtttwwwwsssssrrrrooofffccccc 29 | abccccaaaaaccccccccccccccaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaaaccaaaaacccccccccaaaaacciiiiqqttswwwssssssrrroooogffccccc 30 | abccccaaaaaacccccccccccccaaaaaacccaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaccaaaaaaccccccccaaaaacccciiiqqqssssssspppooooooogggaccccc 31 | abccccaaaaaaccccccccaacccaaaaaaccccaacccccccccccccccccccccccccccccccccaaaaccccccccccccccccccccccccccccccccccccccccccaaaaaaccaaaaaaccccccccaaaaaccccciiiqqsssssspppppoooooggggaacccc 32 | abccccaaaaaccccccaaaaacccaaaaaacaacaaaaaccccccccccccccccccccaacccccccaaaaacccccccccccaaaccccccccccccccccccccccccccccaaaaaacccaaaaacccccccccacccccccciiiqqqpssspppppgggggggggaaacccc 33 | abccccccaaacccccccaaaaaccccaaaccaaaaaaaacccccccaacccccccaaccaacccccccaaaaaacccccccccaaaacccccccccccaaaaccccccccccccaaccaaacccaaacccccaaacaaaccccccccciiqqppppppphhhggggggggaaaacccc 34 | abccccccccccccccccaaaaaccccccccccaaaaaccccccccaaacaaccccaaaaaacccccccaaaaaaaccccccccaaaacccccccccccaaaacccccccccaaaaaacccccccccccccccaaaaaaaccccccccciiippppppphhhhggggggcaaacccccc 35 | abaacccccccccccccaaaaaccccccccccccaaaaaccccccccaaaaacccccaaaaaaacccccaaaaacaaacccccccaaacccccccccccaaaacccccccccaaaaacccccccccccccccccaaaaaacccccccccciiiippphhhhhhcccccccaaacccccc 36 | abaacccccccccccccccaaacccccccccccaaacaaccccccaaaaaaccccccaaaaaaacccaaccaaacaaaaccaaaccccccccccccccccaaacccccccccaaaaaaacccccccccccccccaaaaaaaacccccccciiihhhhhhhhaaaccccccccccccccc 37 | abaaccccccccccccccccccccccccccccccaacccccccccaaaaaaaacccaaaaaaccaaaaaacccccaaaacaaaaaccccccccccccccccccccccccccaaaaaaaaccccccccccccccaaaaaaaaaccccccccciihhhhhhcaaaacccccccccccccca 38 | abaaccccccccccccccccccccccccccccccccaacccccccaacaaaaacccaaaaaaccaaaaacccccccaaaaaaaacccccccccccccccccccccccccccaaaaaaaacccccccccaaacaaaaaaaaaacccccccccccchhhaccccaacccccccccccccca 39 | abaaccccccccccccccccccccccccccccccccaaaaaaccccccaaccccccccccaaccaaaaaaacccccaaaaaaaccccccccccccccccccccccccaaaccacaaacccccccccccaaaaaaacaaacaaaaaacccccccccaaacccccccccccccccaaaaaa 40 | abccccccccccccccccccccccccccccccccccaaaaaccccccaaccccccccccccccaaaaaaaacaaaaaaaaaaccccccccccccccccccccccccaaaaaaccaaaccccccccccccaaaaaacaaacaaaaaacccccccccaaaccccccccccccccccaaaaa 41 | abccccccccccccccccccccccccccccccccaaaaaaaacccccccccccccccccccccaaaaaaaacaaaaaaaaaaaaacccccccccccccccccccccaaaaaacccccccccccccccaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccaaaaa -------------------------------------------------------------------------------- /day12b/src/main.rs: -------------------------------------------------------------------------------- 1 | const NEXT: [(usize, usize); 4] = [(1, 0), (usize::MAX, 0), (0, 1), (0, usize::MAX)]; 2 | 3 | pub fn main() { 4 | let data = include_str!("../input.txt"); 5 | let mut map: Vec<_> = data 6 | .bytes() 7 | .filter(|b| b != &b'\n') 8 | .map(|b| b.to_ascii_lowercase() - b'a') 9 | .collect(); 10 | 11 | let w = data.bytes().position(|b| b == b'\n').unwrap(); 12 | let h = map.len() / w; 13 | let mut start = data.bytes().position(|b| b == b'S').unwrap(); 14 | let mut end = data.bytes().position(|b| b == b'E').unwrap(); 15 | (start, end, map[start], map[end]) = (start - start / (w + 1), end - end / (w + 1), 0, 25); 16 | 17 | println!( 18 | "{}", 19 | map.iter() 20 | .enumerate() 21 | .filter(|(_, b)| **b == 0) 22 | .filter_map(|(start, _)| pathfinding::directed::bfs::bfs( 23 | &(start % w, start / w), 24 | |(x, y)| { 25 | let cur = map[y * w + x]; 26 | NEXT.iter() 27 | .map(|(xx, yy)| (x.wrapping_add(*xx), y.wrapping_add(*yy))) 28 | .filter(|(x, y)| x < &w && y < &h && map[y * w + x] <= cur + 1) 29 | .collect::>() 30 | }, 31 | |&p| p == (end % w, end / w), 32 | ) 33 | .map(|r| r.len() - 1)) 34 | .min() 35 | .unwrap() 36 | ); 37 | } 38 | -------------------------------------------------------------------------------- /day13a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "arrayvec" 7 | version = "0.5.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 10 | 11 | [[package]] 12 | name = "atoi" 13 | version = "2.0.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 16 | dependencies = [ 17 | "num-traits", 18 | ] 19 | 20 | [[package]] 21 | name = "autocfg" 22 | version = "1.1.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 25 | 26 | [[package]] 27 | name = "bitflags" 28 | version = "1.3.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 31 | 32 | [[package]] 33 | name = "bitvec" 34 | version = "0.19.6" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "55f93d0ef3363c364d5976646a38f04cf67cfe1d4c8d160cdea02cab2c116b33" 37 | dependencies = [ 38 | "funty", 39 | "radium", 40 | "tap", 41 | "wyz", 42 | ] 43 | 44 | [[package]] 45 | name = "cfg-if" 46 | version = "1.0.0" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 49 | 50 | [[package]] 51 | name = "day13a" 52 | version = "0.1.0" 53 | dependencies = [ 54 | "atoi", 55 | "nom", 56 | ] 57 | 58 | [[package]] 59 | name = "funty" 60 | version = "1.1.0" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" 63 | 64 | [[package]] 65 | name = "lexical-core" 66 | version = "0.7.6" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" 69 | dependencies = [ 70 | "arrayvec", 71 | "bitflags", 72 | "cfg-if", 73 | "ryu", 74 | "static_assertions", 75 | ] 76 | 77 | [[package]] 78 | name = "memchr" 79 | version = "2.3.4" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 82 | 83 | [[package]] 84 | name = "nom" 85 | version = "6.2.1" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "9c5c51b9083a3c620fa67a2a635d1ce7d95b897e957d6b28ff9a5da960a103a6" 88 | dependencies = [ 89 | "bitvec", 90 | "funty", 91 | "lexical-core", 92 | "memchr", 93 | "version_check", 94 | ] 95 | 96 | [[package]] 97 | name = "num-traits" 98 | version = "0.2.15" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 101 | dependencies = [ 102 | "autocfg", 103 | ] 104 | 105 | [[package]] 106 | name = "radium" 107 | version = "0.5.3" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" 110 | 111 | [[package]] 112 | name = "ryu" 113 | version = "1.0.11" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 116 | 117 | [[package]] 118 | name = "static_assertions" 119 | version = "1.1.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 122 | 123 | [[package]] 124 | name = "tap" 125 | version = "1.0.1" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 128 | 129 | [[package]] 130 | name = "version_check" 131 | version = "0.9.4" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 134 | 135 | [[package]] 136 | name = "wyz" 137 | version = "0.2.0" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" 140 | -------------------------------------------------------------------------------- /day13a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day13a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | nom = "6" 13 | -------------------------------------------------------------------------------- /day13a/src/main.rs: -------------------------------------------------------------------------------- 1 | use nom::*; 2 | use std::cmp::Ordering; 3 | 4 | pub fn main() { 5 | println!( 6 | "{}", 7 | include_str!("../input.txt") 8 | .split("\n\n") 9 | .map(|p| pair(p.as_bytes()).unwrap().1) 10 | .enumerate() 11 | .filter(|(_, (a, b))| a.cmp(b) == Ordering::Less) 12 | .map(|(i, _)| i + 1) 13 | .sum::(), 14 | ); 15 | } 16 | 17 | #[derive(PartialEq, Eq)] 18 | enum Item { 19 | I(u8), 20 | L(Vec), 21 | } 22 | impl Ord for Item { 23 | fn cmp(&self, other: &Self) -> Ordering { 24 | match (self, other) { 25 | (Item::I(a), Item::I(b)) => a.cmp(b), 26 | (Item::L(a), Item::L(b)) => match a.iter().cmp(b) { 27 | r if r != Ordering::Equal => r, 28 | _ => a.len().cmp(&b.len()), 29 | }, 30 | (Item::I(_), Item::L(b)) if b.len() == 1 => self.cmp(&b[0]), 31 | (Item::I(a), Item::L(_)) => Item::L(vec![Item::I(*a)]).cmp(other), 32 | (Item::L(_), Item::I(_)) => other.cmp(self).reverse(), 33 | } 34 | } 35 | } 36 | impl PartialOrd for Item { 37 | fn partial_cmp(&self, other: &Self) -> Option { 38 | Some(self.cmp(other)) 39 | } 40 | } 41 | 42 | named!(item<&[u8], Item>, alt!(map!(list, Item::L) | map!(num, Item::I))); 43 | named!(num<&[u8], u8>, map_opt!(nom::character::complete::digit1, atoi::atoi)); 44 | named!(list<&[u8], Vec>, delimited!(char!('['), separated_list0!(char!(','), item), char!(']'))); 45 | named!(pair<&[u8], (Item, Item)>, separated_pair!(item, tag!("\n"), item)); 46 | -------------------------------------------------------------------------------- /day13b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "arrayvec" 7 | version = "0.5.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 10 | 11 | [[package]] 12 | name = "atoi" 13 | version = "2.0.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 16 | dependencies = [ 17 | "num-traits", 18 | ] 19 | 20 | [[package]] 21 | name = "autocfg" 22 | version = "1.1.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 25 | 26 | [[package]] 27 | name = "bitflags" 28 | version = "1.3.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 31 | 32 | [[package]] 33 | name = "bitvec" 34 | version = "0.19.6" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "55f93d0ef3363c364d5976646a38f04cf67cfe1d4c8d160cdea02cab2c116b33" 37 | dependencies = [ 38 | "funty", 39 | "radium", 40 | "tap", 41 | "wyz", 42 | ] 43 | 44 | [[package]] 45 | name = "cfg-if" 46 | version = "1.0.0" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 49 | 50 | [[package]] 51 | name = "day13b" 52 | version = "0.1.0" 53 | dependencies = [ 54 | "atoi", 55 | "nom", 56 | ] 57 | 58 | [[package]] 59 | name = "funty" 60 | version = "1.1.0" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" 63 | 64 | [[package]] 65 | name = "lexical-core" 66 | version = "0.7.6" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" 69 | dependencies = [ 70 | "arrayvec", 71 | "bitflags", 72 | "cfg-if", 73 | "ryu", 74 | "static_assertions", 75 | ] 76 | 77 | [[package]] 78 | name = "memchr" 79 | version = "2.3.4" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 82 | 83 | [[package]] 84 | name = "nom" 85 | version = "6.2.1" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "9c5c51b9083a3c620fa67a2a635d1ce7d95b897e957d6b28ff9a5da960a103a6" 88 | dependencies = [ 89 | "bitvec", 90 | "funty", 91 | "lexical-core", 92 | "memchr", 93 | "version_check", 94 | ] 95 | 96 | [[package]] 97 | name = "num-traits" 98 | version = "0.2.15" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 101 | dependencies = [ 102 | "autocfg", 103 | ] 104 | 105 | [[package]] 106 | name = "radium" 107 | version = "0.5.3" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" 110 | 111 | [[package]] 112 | name = "ryu" 113 | version = "1.0.11" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 116 | 117 | [[package]] 118 | name = "static_assertions" 119 | version = "1.1.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 122 | 123 | [[package]] 124 | name = "tap" 125 | version = "1.0.1" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 128 | 129 | [[package]] 130 | name = "version_check" 131 | version = "0.9.4" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 134 | 135 | [[package]] 136 | name = "wyz" 137 | version = "0.2.0" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" 140 | -------------------------------------------------------------------------------- /day13b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day13b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | nom = "6" 13 | -------------------------------------------------------------------------------- /day13b/src/main.rs: -------------------------------------------------------------------------------- 1 | use nom::*; 2 | use std::cmp::Ordering; 3 | 4 | pub fn main() { 5 | let first = Item::L(vec![Item::L(vec![Item::I(2)])]); 6 | let second = Item::L(vec![Item::L(vec![Item::I(6)])]); 7 | let packets: Vec = include_str!("../input.txt") 8 | .lines() 9 | .filter(|l| !l.is_empty()) 10 | .map(|l| item(l.as_bytes()).unwrap().1) 11 | .filter(|i| i < &second) 12 | .collect(); 13 | 14 | println!( 15 | "{}", 16 | (packets.iter().filter(|i| *i < &first).count() + 1) * (packets.len() + 2) 17 | ); 18 | } 19 | 20 | #[derive(Clone, PartialEq, Eq)] 21 | enum Item { 22 | I(u8), 23 | L(Vec), 24 | } 25 | impl Ord for Item { 26 | fn cmp(&self, other: &Self) -> Ordering { 27 | match (self, other) { 28 | (Item::I(a), Item::I(b)) => a.cmp(b), 29 | (Item::L(a), Item::L(b)) => match a.iter().cmp(b) { 30 | r if r != Ordering::Equal => r, 31 | _ => a.len().cmp(&b.len()), 32 | }, 33 | (Item::I(_), Item::L(b)) if b.len() == 1 => self.cmp(&b[0]), 34 | (Item::I(a), Item::L(_)) => Item::L(vec![Item::I(*a)]).cmp(other), 35 | (Item::L(_), Item::I(_)) => other.cmp(self).reverse(), 36 | } 37 | } 38 | } 39 | impl PartialOrd for Item { 40 | fn partial_cmp(&self, other: &Self) -> Option { 41 | Some(self.cmp(other)) 42 | } 43 | } 44 | 45 | named!(item<&[u8], Item>, alt!(map!(list, Item::L) | map!(num, Item::I))); 46 | named!(num<&[u8], u8>, map_opt!(nom::character::complete::digit1, atoi::atoi)); 47 | named!(list<&[u8], Vec>, delimited!(char!('['), separated_list0!(char!(','), item), char!(']'))); 48 | -------------------------------------------------------------------------------- /day14a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "arrayvec" 7 | version = "0.5.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 10 | 11 | [[package]] 12 | name = "atoi" 13 | version = "2.0.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 16 | dependencies = [ 17 | "num-traits", 18 | ] 19 | 20 | [[package]] 21 | name = "autocfg" 22 | version = "1.1.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 25 | 26 | [[package]] 27 | name = "bitflags" 28 | version = "1.3.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 31 | 32 | [[package]] 33 | name = "bitvec" 34 | version = "0.19.6" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "55f93d0ef3363c364d5976646a38f04cf67cfe1d4c8d160cdea02cab2c116b33" 37 | dependencies = [ 38 | "funty", 39 | "radium", 40 | "tap", 41 | "wyz", 42 | ] 43 | 44 | [[package]] 45 | name = "cfg-if" 46 | version = "1.0.0" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 49 | 50 | [[package]] 51 | name = "day14a" 52 | version = "0.1.0" 53 | dependencies = [ 54 | "atoi", 55 | "nom", 56 | ] 57 | 58 | [[package]] 59 | name = "funty" 60 | version = "1.1.0" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" 63 | 64 | [[package]] 65 | name = "lexical-core" 66 | version = "0.7.6" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" 69 | dependencies = [ 70 | "arrayvec", 71 | "bitflags", 72 | "cfg-if", 73 | "ryu", 74 | "static_assertions", 75 | ] 76 | 77 | [[package]] 78 | name = "memchr" 79 | version = "2.3.4" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 82 | 83 | [[package]] 84 | name = "nom" 85 | version = "6.2.1" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "9c5c51b9083a3c620fa67a2a635d1ce7d95b897e957d6b28ff9a5da960a103a6" 88 | dependencies = [ 89 | "bitvec", 90 | "funty", 91 | "lexical-core", 92 | "memchr", 93 | "version_check", 94 | ] 95 | 96 | [[package]] 97 | name = "num-traits" 98 | version = "0.2.15" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 101 | dependencies = [ 102 | "autocfg", 103 | ] 104 | 105 | [[package]] 106 | name = "radium" 107 | version = "0.5.3" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" 110 | 111 | [[package]] 112 | name = "ryu" 113 | version = "1.0.11" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 116 | 117 | [[package]] 118 | name = "static_assertions" 119 | version = "1.1.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 122 | 123 | [[package]] 124 | name = "tap" 125 | version = "1.0.1" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 128 | 129 | [[package]] 130 | name = "version_check" 131 | version = "0.9.4" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 134 | 135 | [[package]] 136 | name = "wyz" 137 | version = "0.2.0" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" 140 | -------------------------------------------------------------------------------- /day14a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day14a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | nom = "6" 13 | -------------------------------------------------------------------------------- /day14a/src/main.rs: -------------------------------------------------------------------------------- 1 | #![feature(array_windows)] 2 | 3 | use nom::*; 4 | 5 | const W: usize = 665; 6 | const H: usize = 165; 7 | 8 | pub fn main() { 9 | let (mut map, mut sand) = ([[false; W]; H], 0); 10 | 11 | include_bytes!("../input.txt") 12 | .split(|b| b == &b'\n') 13 | .filter(|b| !b.is_empty()) 14 | .map(|l| line(l).unwrap().1) 15 | .for_each(|coords| { 16 | coords.array_windows().for_each(|[a, b]| { 17 | if a.0 == b.0 { 18 | (a.1.min(b.1)..=a.1.max(b.1)).for_each(|y| map[y][a.0] = true); 19 | } else { 20 | (a.0.min(b.0)..=a.0.max(b.0)).for_each(|x| map[a.1][x] = true); 21 | } 22 | }); 23 | }); 24 | 25 | while let Some((x, y)) = trace(&map, (500, 0)) { 26 | map[y][x] = true; 27 | sand += 1; 28 | } 29 | 30 | println!("{}", sand); 31 | } 32 | 33 | fn trace(map: &[[bool; W]; H], (mut x, y): (usize, usize)) -> Option<(usize, usize)> { 34 | (y + 1..H - 1) 35 | .find(|y| { 36 | [x, x - 1, x + 1] 37 | .into_iter() 38 | .find(|x| !map[*y + 1][*x]) 39 | .map(|xx| x = xx) 40 | .is_none() 41 | }) 42 | .map(|y| (x, y)) 43 | } 44 | 45 | named!(usize<&[u8], usize>, map_opt!(nom::character::complete::digit1, atoi::atoi)); 46 | named!(coord<&[u8], (usize, usize)>, separated_pair!(usize, char!(','), usize)); 47 | named!(line<&[u8], Vec<(usize, usize)>>, separated_list1!(nom::bytes::complete::tag(" -> "), coord)); 48 | -------------------------------------------------------------------------------- /day14b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "arrayvec" 7 | version = "0.5.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 10 | 11 | [[package]] 12 | name = "atoi" 13 | version = "2.0.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 16 | dependencies = [ 17 | "num-traits", 18 | ] 19 | 20 | [[package]] 21 | name = "autocfg" 22 | version = "1.1.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 25 | 26 | [[package]] 27 | name = "bitflags" 28 | version = "1.3.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 31 | 32 | [[package]] 33 | name = "bitvec" 34 | version = "0.19.6" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "55f93d0ef3363c364d5976646a38f04cf67cfe1d4c8d160cdea02cab2c116b33" 37 | dependencies = [ 38 | "funty", 39 | "radium", 40 | "tap", 41 | "wyz", 42 | ] 43 | 44 | [[package]] 45 | name = "cfg-if" 46 | version = "1.0.0" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 49 | 50 | [[package]] 51 | name = "day14b" 52 | version = "0.1.0" 53 | dependencies = [ 54 | "atoi", 55 | "nom", 56 | ] 57 | 58 | [[package]] 59 | name = "funty" 60 | version = "1.1.0" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" 63 | 64 | [[package]] 65 | name = "lexical-core" 66 | version = "0.7.6" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" 69 | dependencies = [ 70 | "arrayvec", 71 | "bitflags", 72 | "cfg-if", 73 | "ryu", 74 | "static_assertions", 75 | ] 76 | 77 | [[package]] 78 | name = "memchr" 79 | version = "2.3.4" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 82 | 83 | [[package]] 84 | name = "nom" 85 | version = "6.2.1" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "9c5c51b9083a3c620fa67a2a635d1ce7d95b897e957d6b28ff9a5da960a103a6" 88 | dependencies = [ 89 | "bitvec", 90 | "funty", 91 | "lexical-core", 92 | "memchr", 93 | "version_check", 94 | ] 95 | 96 | [[package]] 97 | name = "num-traits" 98 | version = "0.2.15" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 101 | dependencies = [ 102 | "autocfg", 103 | ] 104 | 105 | [[package]] 106 | name = "radium" 107 | version = "0.5.3" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" 110 | 111 | [[package]] 112 | name = "ryu" 113 | version = "1.0.11" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" 116 | 117 | [[package]] 118 | name = "static_assertions" 119 | version = "1.1.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 122 | 123 | [[package]] 124 | name = "tap" 125 | version = "1.0.1" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 128 | 129 | [[package]] 130 | name = "version_check" 131 | version = "0.9.4" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 134 | 135 | [[package]] 136 | name = "wyz" 137 | version = "0.2.0" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" 140 | -------------------------------------------------------------------------------- /day14b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day14b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | nom = "6" 13 | -------------------------------------------------------------------------------- /day14b/src/main.rs: -------------------------------------------------------------------------------- 1 | #![feature(array_windows)] 2 | 3 | use nom::*; 4 | 5 | const W: usize = 665; 6 | const H: usize = 165; 7 | 8 | pub fn main() { 9 | let (mut map, mut sand) = ([[false; W]; H], 0); 10 | 11 | let mut lowest = 0; 12 | include_bytes!("../input.txt") 13 | .split(|b| b == &b'\n') 14 | .filter(|b| !b.is_empty()) 15 | .map(|l| line(l).unwrap().1) 16 | .for_each(|coords| { 17 | coords.array_windows().for_each(|[a, b]| { 18 | lowest = lowest.max(a.1.max(b.1)); 19 | if a.0 == b.0 { 20 | (a.1.min(b.1)..=a.1.max(b.1)).for_each(|y| map[y][a.0] = true); 21 | } else { 22 | (a.0.min(b.0)..=a.0.max(b.0)).for_each(|x| map[a.1][x] = true); 23 | } 24 | }); 25 | }); 26 | 27 | while let Some((x, y)) = trace(&map, (500, 0), lowest + 2) { 28 | if y == 0 { 29 | break; 30 | } 31 | sand += 1; 32 | map[y][x] = true; 33 | } 34 | 35 | println!("{}", sand + 1); 36 | } 37 | 38 | fn trace(map: &[[bool; W]; H], (mut x, y): (usize, usize), low: usize) -> Option<(usize, usize)> { 39 | (y..H - 1) 40 | .find(|y| { 41 | *y == low - 1 42 | || [x, x - 1, x + 1] 43 | .into_iter() 44 | .find(|x| !map[*y + 1][*x]) 45 | .map(|xx| x = xx) 46 | .is_none() 47 | }) 48 | .map(|y| (x, y)) 49 | } 50 | 51 | named!(usize<&[u8], usize>, map_opt!(nom::character::complete::digit1, atoi::atoi)); 52 | named!(coord<&[u8], (usize, usize)>, separated_pair!(usize, char!(','), usize)); 53 | named!(line<&[u8], Vec<(usize, usize)>>, separated_list1!(nom::bytes::complete::tag(" -> "), coord)); 54 | -------------------------------------------------------------------------------- /day15a/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "arrayvec" 7 | version = "0.5.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 10 | 11 | [[package]] 12 | name = "atoi" 13 | version = "2.0.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 16 | dependencies = [ 17 | "num-traits", 18 | ] 19 | 20 | [[package]] 21 | name = "autocfg" 22 | version = "1.1.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 25 | 26 | [[package]] 27 | name = "bitflags" 28 | version = "1.3.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 31 | 32 | [[package]] 33 | name = "bitvec" 34 | version = "0.19.6" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "55f93d0ef3363c364d5976646a38f04cf67cfe1d4c8d160cdea02cab2c116b33" 37 | dependencies = [ 38 | "funty", 39 | "radium", 40 | "tap", 41 | "wyz", 42 | ] 43 | 44 | [[package]] 45 | name = "cfg-if" 46 | version = "1.0.0" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 49 | 50 | [[package]] 51 | name = "day15a" 52 | version = "0.1.0" 53 | dependencies = [ 54 | "atoi", 55 | "nom", 56 | ] 57 | 58 | [[package]] 59 | name = "funty" 60 | version = "1.1.0" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" 63 | 64 | [[package]] 65 | name = "lexical-core" 66 | version = "0.7.6" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" 69 | dependencies = [ 70 | "arrayvec", 71 | "bitflags", 72 | "cfg-if", 73 | "ryu", 74 | "static_assertions", 75 | ] 76 | 77 | [[package]] 78 | name = "memchr" 79 | version = "2.3.4" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 82 | 83 | [[package]] 84 | name = "nom" 85 | version = "6.2.1" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "9c5c51b9083a3c620fa67a2a635d1ce7d95b897e957d6b28ff9a5da960a103a6" 88 | dependencies = [ 89 | "bitvec", 90 | "funty", 91 | "lexical-core", 92 | "memchr", 93 | "version_check", 94 | ] 95 | 96 | [[package]] 97 | name = "num-traits" 98 | version = "0.2.15" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 101 | dependencies = [ 102 | "autocfg", 103 | ] 104 | 105 | [[package]] 106 | name = "radium" 107 | version = "0.5.3" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" 110 | 111 | [[package]] 112 | name = "ryu" 113 | version = "1.0.12" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" 116 | 117 | [[package]] 118 | name = "static_assertions" 119 | version = "1.1.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 122 | 123 | [[package]] 124 | name = "tap" 125 | version = "1.0.1" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 128 | 129 | [[package]] 130 | name = "version_check" 131 | version = "0.9.4" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 134 | 135 | [[package]] 136 | name = "wyz" 137 | version = "0.2.0" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" 140 | -------------------------------------------------------------------------------- /day15a/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day15a" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | nom = "6" 13 | -------------------------------------------------------------------------------- /day15a/input.txt: -------------------------------------------------------------------------------- 1 | Sensor at x=3556832, y=3209801: closest beacon is at x=3520475, y=3164417 2 | Sensor at x=3068970, y=3071952: closest beacon is at x=3520475, y=3164417 3 | Sensor at x=636397, y=1899889: closest beacon is at x=338784, y=1935796 4 | Sensor at x=3856769, y=3377079: closest beacon is at x=3520475, y=3164417 5 | Sensor at x=2876227, y=2633203: closest beacon is at x=2595700, y=2684432 6 | Sensor at x=1435445, y=1194830: closest beacon is at x=925348, y=2000000 7 | Sensor at x=3764673, y=3881970: closest beacon is at x=3520475, y=3164417 8 | Sensor at x=3171272, y=1098717: closest beacon is at x=3778277, y=740547 9 | Sensor at x=3646837, y=966534: closest beacon is at x=3778277, y=740547 10 | Sensor at x=1736390, y=3309102: closest beacon is at x=1623417, y=4114070 11 | Sensor at x=1086601, y=2272573: closest beacon is at x=925348, y=2000000 12 | Sensor at x=3793954, y=2346914: closest beacon is at x=3520475, y=3164417 13 | Sensor at x=1896054, y=2706210: closest beacon is at x=2595700, y=2684432 14 | Sensor at x=2298950, y=3449308: closest beacon is at x=2205069, y=3958831 15 | Sensor at x=1911518, y=3848874: closest beacon is at x=2205069, y=3958831 16 | Sensor at x=2566355, y=1516144: closest beacon is at x=2595700, y=2684432 17 | Sensor at x=246553, y=343125: closest beacon is at x=338784, y=1935796 18 | Sensor at x=2197183, y=3975039: closest beacon is at x=2205069, y=3958831 19 | Sensor at x=552775, y=3494740: closest beacon is at x=-138318, y=2857049 20 | Sensor at x=128870, y=1935711: closest beacon is at x=338784, y=1935796 21 | Sensor at x=2197078, y=3999879: closest beacon is at x=2205069, y=3958831 22 | Sensor at x=2502533, y=3911039: closest beacon is at x=2205069, y=3958831 23 | Sensor at x=2289309, y=3024440: closest beacon is at x=2595700, y=2684432 24 | Sensor at x=3999523, y=551710: closest beacon is at x=3778277, y=740547 25 | Sensor at x=2246061, y=3999936: closest beacon is at x=2205069, y=3958831 26 | Sensor at x=3982782, y=1306639: closest beacon is at x=3778277, y=740547 27 | Sensor at x=1166660, y=2766482: closest beacon is at x=925348, y=2000000 28 | Sensor at x=3744391, y=440575: closest beacon is at x=3778277, y=740547 29 | Sensor at x=1480453, y=3997346: closest beacon is at x=1623417, y=4114070 30 | Sensor at x=9770, y=1844797: closest beacon is at x=338784, y=1935796 31 | Sensor at x=202829, y=2427690: closest beacon is at x=338784, y=1935796 32 | Sensor at x=3051096, y=3631595: closest beacon is at x=3147080, y=4258152 33 | Sensor at x=2111052, y=297293: closest beacon is at x=1552534, y=-431081 34 | Sensor at x=864326, y=2053355: closest beacon is at x=925348, y=2000000 35 | Sensor at x=2422495, y=2130146: closest beacon is at x=2595700, y=2684432 36 | Sensor at x=3655670, y=100751: closest beacon is at x=3778277, y=740547 37 | Sensor at x=535656, y=2133259: closest beacon is at x=338784, y=1935796 38 | Sensor at x=263229, y=2101270: closest beacon is at x=338784, y=1935796 -------------------------------------------------------------------------------- /day15a/src/main.rs: -------------------------------------------------------------------------------- 1 | use nom::*; 2 | 3 | const ROW: isize = 2_000_000; 4 | 5 | pub fn main() { 6 | let mut ranges = include_bytes!("../input.txt") 7 | .split(|b| b == &b'\n') 8 | .map(|l| line(l).unwrap().1) 9 | .filter(|(s, _, d)| s.1.abs_diff(ROW) <= *d) 10 | .map(|(s, _, d)| { 11 | let rd = d as isize - s.1.abs_diff(ROW) as isize; 12 | s.0 - rd..=s.0 + rd 13 | }) 14 | .collect::>(); 15 | 16 | let (mut merged, mut merging) = (vec![], ranges.pop().unwrap()); 17 | loop { 18 | merging = match ranges 19 | .iter() 20 | .position(|other| merging.contains(other.start()) || merging.contains(other.end())) 21 | { 22 | Some(pos) => { 23 | let other = ranges.remove(pos); 24 | *(merging.start().min(other.start()))..=*(merging.end().max(other.end())) 25 | } 26 | None => { 27 | merged.push(merging); 28 | match ranges.pop() { 29 | Some(cur) => cur, 30 | None => break, 31 | } 32 | } 33 | } 34 | } 35 | 36 | println!( 37 | "{}", 38 | merged 39 | .into_iter() 40 | .map(|r| *r.end() - *r.start()) 41 | .sum::() 42 | ); 43 | } 44 | 45 | named!(usize<&[u8], isize>, map_opt!(nom::character::complete::digit1, atoi::atoi)); 46 | named!(isize<&[u8], isize>, alt!(usize | preceded!(char!('-'), map!(call!(usize), |n| -n)))); 47 | named!(coord<&[u8], (isize, isize)>, preceded!(tag!("x="), separated_pair!(isize, tag!(", y="), isize))); 48 | named!(line<&[u8], ((isize, isize), (isize, isize), usize)>, do_parse!( 49 | tag!("Sensor at ") >> s: call!(coord) >> tag!(": closest beacon is at ") >> b: call!(coord) >> 50 | (s, b, s.0.abs_diff(b.0) + s.1.abs_diff(b.1)) 51 | )); 52 | -------------------------------------------------------------------------------- /day15b/Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "arrayvec" 7 | version = "0.5.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" 10 | 11 | [[package]] 12 | name = "atoi" 13 | version = "2.0.0" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 16 | dependencies = [ 17 | "num-traits", 18 | ] 19 | 20 | [[package]] 21 | name = "autocfg" 22 | version = "1.1.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 25 | 26 | [[package]] 27 | name = "bitflags" 28 | version = "1.3.2" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 31 | 32 | [[package]] 33 | name = "bitvec" 34 | version = "0.19.6" 35 | source = "registry+https://github.com/rust-lang/crates.io-index" 36 | checksum = "55f93d0ef3363c364d5976646a38f04cf67cfe1d4c8d160cdea02cab2c116b33" 37 | dependencies = [ 38 | "funty", 39 | "radium", 40 | "tap", 41 | "wyz", 42 | ] 43 | 44 | [[package]] 45 | name = "cfg-if" 46 | version = "1.0.0" 47 | source = "registry+https://github.com/rust-lang/crates.io-index" 48 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 49 | 50 | [[package]] 51 | name = "day15b" 52 | version = "0.1.0" 53 | dependencies = [ 54 | "atoi", 55 | "nom", 56 | ] 57 | 58 | [[package]] 59 | name = "funty" 60 | version = "1.1.0" 61 | source = "registry+https://github.com/rust-lang/crates.io-index" 62 | checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" 63 | 64 | [[package]] 65 | name = "lexical-core" 66 | version = "0.7.6" 67 | source = "registry+https://github.com/rust-lang/crates.io-index" 68 | checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" 69 | dependencies = [ 70 | "arrayvec", 71 | "bitflags", 72 | "cfg-if", 73 | "ryu", 74 | "static_assertions", 75 | ] 76 | 77 | [[package]] 78 | name = "memchr" 79 | version = "2.3.4" 80 | source = "registry+https://github.com/rust-lang/crates.io-index" 81 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 82 | 83 | [[package]] 84 | name = "nom" 85 | version = "6.2.1" 86 | source = "registry+https://github.com/rust-lang/crates.io-index" 87 | checksum = "9c5c51b9083a3c620fa67a2a635d1ce7d95b897e957d6b28ff9a5da960a103a6" 88 | dependencies = [ 89 | "bitvec", 90 | "funty", 91 | "lexical-core", 92 | "memchr", 93 | "version_check", 94 | ] 95 | 96 | [[package]] 97 | name = "num-traits" 98 | version = "0.2.15" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" 101 | dependencies = [ 102 | "autocfg", 103 | ] 104 | 105 | [[package]] 106 | name = "radium" 107 | version = "0.5.3" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "941ba9d78d8e2f7ce474c015eea4d9c6d25b6a3327f9832ee29a4de27f91bbb8" 110 | 111 | [[package]] 112 | name = "ryu" 113 | version = "1.0.12" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" 116 | 117 | [[package]] 118 | name = "static_assertions" 119 | version = "1.1.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 122 | 123 | [[package]] 124 | name = "tap" 125 | version = "1.0.1" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" 128 | 129 | [[package]] 130 | name = "version_check" 131 | version = "0.9.4" 132 | source = "registry+https://github.com/rust-lang/crates.io-index" 133 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 134 | 135 | [[package]] 136 | name = "wyz" 137 | version = "0.2.0" 138 | source = "registry+https://github.com/rust-lang/crates.io-index" 139 | checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" 140 | -------------------------------------------------------------------------------- /day15b/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "day15b" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [lib] 8 | path = "src/main.rs" 9 | 10 | [dependencies] 11 | atoi = "2" 12 | nom = "6" 13 | -------------------------------------------------------------------------------- /day15b/input.txt: -------------------------------------------------------------------------------- 1 | Sensor at x=3556832, y=3209801: closest beacon is at x=3520475, y=3164417 2 | Sensor at x=3068970, y=3071952: closest beacon is at x=3520475, y=3164417 3 | Sensor at x=636397, y=1899889: closest beacon is at x=338784, y=1935796 4 | Sensor at x=3856769, y=3377079: closest beacon is at x=3520475, y=3164417 5 | Sensor at x=2876227, y=2633203: closest beacon is at x=2595700, y=2684432 6 | Sensor at x=1435445, y=1194830: closest beacon is at x=925348, y=2000000 7 | Sensor at x=3764673, y=3881970: closest beacon is at x=3520475, y=3164417 8 | Sensor at x=3171272, y=1098717: closest beacon is at x=3778277, y=740547 9 | Sensor at x=3646837, y=966534: closest beacon is at x=3778277, y=740547 10 | Sensor at x=1736390, y=3309102: closest beacon is at x=1623417, y=4114070 11 | Sensor at x=1086601, y=2272573: closest beacon is at x=925348, y=2000000 12 | Sensor at x=3793954, y=2346914: closest beacon is at x=3520475, y=3164417 13 | Sensor at x=1896054, y=2706210: closest beacon is at x=2595700, y=2684432 14 | Sensor at x=2298950, y=3449308: closest beacon is at x=2205069, y=3958831 15 | Sensor at x=1911518, y=3848874: closest beacon is at x=2205069, y=3958831 16 | Sensor at x=2566355, y=1516144: closest beacon is at x=2595700, y=2684432 17 | Sensor at x=246553, y=343125: closest beacon is at x=338784, y=1935796 18 | Sensor at x=2197183, y=3975039: closest beacon is at x=2205069, y=3958831 19 | Sensor at x=552775, y=3494740: closest beacon is at x=-138318, y=2857049 20 | Sensor at x=128870, y=1935711: closest beacon is at x=338784, y=1935796 21 | Sensor at x=2197078, y=3999879: closest beacon is at x=2205069, y=3958831 22 | Sensor at x=2502533, y=3911039: closest beacon is at x=2205069, y=3958831 23 | Sensor at x=2289309, y=3024440: closest beacon is at x=2595700, y=2684432 24 | Sensor at x=3999523, y=551710: closest beacon is at x=3778277, y=740547 25 | Sensor at x=2246061, y=3999936: closest beacon is at x=2205069, y=3958831 26 | Sensor at x=3982782, y=1306639: closest beacon is at x=3778277, y=740547 27 | Sensor at x=1166660, y=2766482: closest beacon is at x=925348, y=2000000 28 | Sensor at x=3744391, y=440575: closest beacon is at x=3778277, y=740547 29 | Sensor at x=1480453, y=3997346: closest beacon is at x=1623417, y=4114070 30 | Sensor at x=9770, y=1844797: closest beacon is at x=338784, y=1935796 31 | Sensor at x=202829, y=2427690: closest beacon is at x=338784, y=1935796 32 | Sensor at x=3051096, y=3631595: closest beacon is at x=3147080, y=4258152 33 | Sensor at x=2111052, y=297293: closest beacon is at x=1552534, y=-431081 34 | Sensor at x=864326, y=2053355: closest beacon is at x=925348, y=2000000 35 | Sensor at x=2422495, y=2130146: closest beacon is at x=2595700, y=2684432 36 | Sensor at x=3655670, y=100751: closest beacon is at x=3778277, y=740547 37 | Sensor at x=535656, y=2133259: closest beacon is at x=338784, y=1935796 38 | Sensor at x=263229, y=2101270: closest beacon is at x=338784, y=1935796 -------------------------------------------------------------------------------- /day15b/src/main.rs: -------------------------------------------------------------------------------- 1 | use nom::*; 2 | 3 | const MAX: isize = 4_000_000; 4 | 5 | pub fn main() { 6 | let sens = include_bytes!("../input.txt") 7 | .split(|b| b == &b'\n') 8 | .map(|l| line(l).unwrap().1) 9 | .collect::>(); 10 | 11 | let distress = sens 12 | .iter() 13 | .flat_map(|(s, d)| { 14 | (0..=*d as isize) 15 | .map(move |i| (s.0 + i, s.1 - *d as isize - 1 + i)) 16 | .chain((0..=*d as isize).map(move |i| (s.0 - i, s.1 + *d as isize + 1 - i))) 17 | .chain((0..=*d as isize).map(move |i| (s.0 - *d as isize - 1 + i, s.1 - i))) 18 | .chain((0..=*d as isize).map(move |i| (s.0 + *d as isize + 1 - i, s.1 + i))) 19 | }) 20 | .filter(|(x, y)| (0..MAX).contains(x) && (0..MAX).contains(y)) 21 | .find(|(x, y)| { 22 | !sens 23 | .iter() 24 | .any(|(s, d)| s.0.abs_diff(*x) + s.1.abs_diff(*y) <= *d) 25 | }) 26 | .unwrap(); 27 | 28 | println!("{}", distress.0 * MAX + distress.1); 29 | } 30 | 31 | named!(usize<&[u8], isize>, map_opt!(nom::character::complete::digit1, atoi::atoi)); 32 | named!(isize<&[u8], isize>, alt!(usize | preceded!(char!('-'), map!(call!(usize), |n| -n)))); 33 | named!(coord<&[u8], (isize, isize)>, preceded!(tag!("x="), separated_pair!(isize, tag!(", y="), isize))); 34 | named!(line<&[u8], ((isize, isize), usize)>, do_parse!( 35 | tag!("Sensor at ") >> s: call!(coord) >> tag!(": closest beacon is at ") >> b: call!(coord) >> 36 | (s, s.0.abs_diff(b.0) + s.1.abs_diff(b.1)) 37 | )); 38 | -------------------------------------------------------------------------------- /runner/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "runner" 3 | version = "0.1.0" 4 | authors = ["Tim Visee <3a4fb3964f@sinenomine.email>"] 5 | edition = "2021" 6 | 7 | [dependencies] 8 | rayon = "1.5" 9 | took = "0.1" 10 | 11 | # Days 12 | day01a = { path = "../day01a" } 13 | day01b = { path = "../day01b" } 14 | day02a = { path = "../day02a" } 15 | day02b = { path = "../day02b" } 16 | day03a = { path = "../day03a" } 17 | day03b = { path = "../day03b" } 18 | day04a = { path = "../day04a" } 19 | day04b = { path = "../day04b" } 20 | day05a = { path = "../day05a" } 21 | day05b = { path = "../day05b" } 22 | day06a = { path = "../day06a" } 23 | day06b = { path = "../day06b" } 24 | day07a = { path = "../day07a" } 25 | day07b = { path = "../day07b" } 26 | day08a = { path = "../day08a" } 27 | day08b = { path = "../day08b" } 28 | day09a = { path = "../day09a" } 29 | day09b = { path = "../day09b" } 30 | day10a = { path = "../day10a" } 31 | day10b = { path = "../day10b" } 32 | day11a = { path = "../day11a" } 33 | day11b = { path = "../day11b" } 34 | day12a = { path = "../day12a" } 35 | day12b = { path = "../day12b" } 36 | day13a = { path = "../day13a" } 37 | day13b = { path = "../day13b" } 38 | day14a = { path = "../day14a" } 39 | day14b = { path = "../day14b" } 40 | day15a = { path = "../day15a" } 41 | day15b = { path = "../day15b" } 42 | # day16a = { path = "../day16a" } 43 | # day16b = { path = "../day16b" } 44 | # day17a = { path = "../day17a" } 45 | # day17b = { path = "../day17b" } 46 | # day18a = { path = "../day18a" } 47 | # day18b = { path = "../day18b" } 48 | # day19a = { path = "../day19a" } 49 | # day19b = { path = "../day19b" } 50 | # day20a = { path = "../day20a" } 51 | # day20b = { path = "../day20b" } 52 | # day21a = { path = "../day21a" } 53 | # day21b = { path = "../day21b" } 54 | # day22a = { path = "../day22a" } 55 | # day22b = { path = "../day22b" } 56 | # day23a = { path = "../day23a" } 57 | # day23b = { path = "../day23b" } 58 | # day24a = { path = "../day24a" } 59 | # day24b = { path = "../day24b" } 60 | # day25a = { path = "../day25a" } 61 | -------------------------------------------------------------------------------- /runner/src/bin/bench.rs: -------------------------------------------------------------------------------- 1 | use took::{Timer, Took}; 2 | 3 | const RUNS: usize = 100; 4 | 5 | fn main() { 6 | println!("Benchmarking all days with {} runs...", RUNS); 7 | 8 | let times: Vec<_> = runner::jobs() 9 | .iter() 10 | .map(|j| { 11 | ( 12 | j.1, 13 | (0..RUNS) 14 | .map(|_| { 15 | let took = Timer::new(); 16 | j.0(); 17 | took.took().into_std() 18 | }) 19 | .min() 20 | .unwrap(), 21 | ) 22 | }) 23 | .collect(); 24 | 25 | times.iter().for_each(|t| Took::from_std(t.1).describe(t.0)); 26 | Took::from_std(times.into_iter().map(|(_, t)| t).sum()).describe("everything"); 27 | } 28 | -------------------------------------------------------------------------------- /runner/src/bin/runner-par.rs: -------------------------------------------------------------------------------- 1 | use rayon::prelude::*; 2 | use took::Timer; 3 | 4 | fn main() { 5 | // Build threadpool with larger stack size 6 | rayon::ThreadPoolBuilder::new().build_global().unwrap(); 7 | 8 | let jobs = runner::jobs(); 9 | let timer = Timer::new(); 10 | (0..jobs.len()).into_par_iter().for_each(|i| jobs[i].0()); 11 | timer.took().describe("everything"); 12 | } 13 | -------------------------------------------------------------------------------- /runner/src/bin/runner.rs: -------------------------------------------------------------------------------- 1 | use took::Timer; 2 | 3 | fn main() { 4 | let timer = Timer::new(); 5 | runner::jobs().iter().for_each(|j| j.0()); 6 | timer.took().describe("everything"); 7 | } 8 | -------------------------------------------------------------------------------- /runner/src/lib.rs: -------------------------------------------------------------------------------- 1 | pub fn jobs() -> &'static [(fn(), &'static str)] { 2 | &[ 3 | (day01a::main, "day01a"), 4 | (day01b::main, "day01b"), 5 | (day02a::main, "day02a"), 6 | (day02b::main, "day02b"), 7 | (day03a::main, "day03a"), 8 | (day03b::main, "day03b"), 9 | (day04a::main, "day04a"), 10 | (day04b::main, "day04b"), 11 | (day05a::main, "day05a"), 12 | (day05b::main, "day05b"), 13 | (day06a::main, "day06a"), 14 | (day06b::main, "day06b"), 15 | (day07a::main, "day07a"), 16 | (day07b::main, "day07b"), 17 | (day08a::main, "day08a"), 18 | (day08b::main, "day08b"), 19 | (day09a::main, "day09a"), 20 | (day09b::main, "day09b"), 21 | (day10a::main, "day10a"), 22 | (day10b::main, "day10b"), 23 | (day11a::main, "day11a"), 24 | (day11b::main, "day11b"), 25 | (day12a::main, "day12a"), 26 | (day12b::main, "day12b"), 27 | (day13a::main, "day13a"), 28 | (day13b::main, "day13b"), 29 | (day14a::main, "day14a"), 30 | (day14b::main, "day14b"), 31 | (day15a::main, "day15a"), 32 | (day15b::main, "day15b"), 33 | // (day16a::main, "day16a"), 34 | // (day16b::main, "day16b"), 35 | // (day17a::main, "day17a"), 36 | // (day17b::main, "day17b"), 37 | // (day18a::main, "day18a"), 38 | // (day18b::main, "day18b"), 39 | // (day19a::main, "day19a"), 40 | // (day19b::main, "day19b"), 41 | // (day20a::main, "day20a"), 42 | // (day20b::main, "day20b"), 43 | // (day21a::main, "day21a"), 44 | // (day21b::main, "day21b"), 45 | // (day22a::main, "day22a"), 46 | // (day22b::main, "day22b"), 47 | // (day23a::main, "day23a"), 48 | // (day23b::main, "day23b"), 49 | // (day24a::main, "day24a"), 50 | // (day24b::main, "day24b"), 51 | // (day25a::main, "day25a"), 52 | ] 53 | } 54 | --------------------------------------------------------------------------------