Initial commit
This commit is contained in:
commit
610d0d2475
|
|
@ -0,0 +1,3 @@
|
||||||
|
/target
|
||||||
|
/.idea/
|
||||||
|
/.vscode/
|
||||||
|
|
@ -0,0 +1,194 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aho-corasick"
|
||||||
|
version = "0.7.18"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "aoc-2021"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"bitvec",
|
||||||
|
"regex",
|
||||||
|
"serde",
|
||||||
|
"serde_yaml",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "autocfg"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bitvec"
|
||||||
|
version = "0.22.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5237f00a8c86130a0cc317830e558b966dd7850d48a953d998c813f01a41b527"
|
||||||
|
dependencies = [
|
||||||
|
"funty",
|
||||||
|
"radium",
|
||||||
|
"tap",
|
||||||
|
"wyz",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "funty"
|
||||||
|
version = "1.2.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1847abb9cb65d566acd5942e94aea9c8f547ad02c98e1649326fc0e8910b8b1e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "hashbrown"
|
||||||
|
version = "0.11.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "indexmap"
|
||||||
|
version = "1.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"hashbrown",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "linked-hash-map"
|
||||||
|
version = "0.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "memchr"
|
||||||
|
version = "2.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "proc-macro2"
|
||||||
|
version = "1.0.34"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "2f84e92c0f7c9d58328b85a78557813e4bd845130db68d7184635344399423b1"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-xid",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "quote"
|
||||||
|
version = "1.0.10"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "radium"
|
||||||
|
version = "0.6.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex"
|
||||||
|
version = "1.5.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461"
|
||||||
|
dependencies = [
|
||||||
|
"aho-corasick",
|
||||||
|
"memchr",
|
||||||
|
"regex-syntax",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "regex-syntax"
|
||||||
|
version = "0.6.25"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "ryu"
|
||||||
|
version = "1.0.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde"
|
||||||
|
version = "1.0.132"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8b9875c23cf305cd1fd7eb77234cbb705f21ea6a72c637a5c6db5fe4b8e7f008"
|
||||||
|
dependencies = [
|
||||||
|
"serde_derive",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_derive"
|
||||||
|
version = "1.0.132"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ecc0db5cb2556c0e558887d9bbdcf6ac4471e83ff66cf696e5419024d1606276"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"syn",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_yaml"
|
||||||
|
version = "0.8.23"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0"
|
||||||
|
dependencies = [
|
||||||
|
"indexmap",
|
||||||
|
"ryu",
|
||||||
|
"serde",
|
||||||
|
"yaml-rust",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "1.0.82"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-xid",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tap"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-xid"
|
||||||
|
version = "0.2.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wyz"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "129e027ad65ce1453680623c3fb5163cbf7107bfe1aa32257e7d0e63f9ced188"
|
||||||
|
dependencies = [
|
||||||
|
"tap",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "yaml-rust"
|
||||||
|
version = "0.4.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
|
||||||
|
dependencies = [
|
||||||
|
"linked-hash-map",
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
[package]
|
||||||
|
name = "aoc-2021"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
bitvec = "0.22.3"
|
||||||
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
serde_yaml = "0.8"
|
||||||
|
regex = "1"
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
Copyright (c) 2022 Stanislav Nikolov <hello@snikolov.me>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
pub mod t01_sonar_sweep;
|
||||||
|
pub mod t02_dive;
|
||||||
|
pub mod t03_binary_diagnostic;
|
||||||
|
pub mod t04_giant_squid;
|
||||||
|
pub mod t05_hydrothermal_venture;
|
||||||
|
pub mod t06_lanternfish;
|
||||||
|
pub mod t07_the_treachery_of_whales;
|
||||||
|
pub mod t08_seven_segment_search;
|
||||||
|
pub mod t09_smoke_basin;
|
||||||
|
pub mod t10_syntax_scoring;
|
||||||
|
pub mod t11_dumbo_octopus;
|
||||||
|
pub mod t12_passage_passing;
|
||||||
|
pub mod t13_transparent_origami;
|
||||||
|
pub mod t14_extended_polymerisation;
|
||||||
|
pub mod t15_chiton;
|
||||||
|
pub mod t16_packet_decoder;
|
||||||
|
pub mod t17_trick_shot;
|
||||||
|
pub mod t18_snailfish;
|
||||||
|
pub mod types;
|
||||||
|
|
@ -0,0 +1,81 @@
|
||||||
|
use aoc_2021::{
|
||||||
|
t01_sonar_sweep::{sonar_sweep_1, sonar_sweep_2},
|
||||||
|
t02_dive::{dive_1, dive_2},
|
||||||
|
t03_binary_diagnostic::{binary_diagnostic_1, binary_diagnostic_2},
|
||||||
|
t04_giant_squid::{giant_squid_1, giant_squid_2},
|
||||||
|
t05_hydrothermal_venture::{hydrothermal_venture_1, hydrothermal_venture_2},
|
||||||
|
t06_lanternfish::{lanternfish_1, lanternfish_2},
|
||||||
|
t07_the_treachery_of_whales::{the_treachery_of_whales_1, the_treachery_of_whales_2},
|
||||||
|
t08_seven_segment_search::{seven_segment_search_1, seven_segment_search_2},
|
||||||
|
t09_smoke_basin::{smoke_basin_1, smoke_basin_2},
|
||||||
|
t10_syntax_scoring::{syntax_scoring_1, syntax_scoring_2},
|
||||||
|
t11_dumbo_octopus::{dumbo_octopus_1, dumbo_octopus_2},
|
||||||
|
t12_passage_passing::{passage_passing_1, passage_passing_2},
|
||||||
|
t13_transparent_origami::{transparent_origami_1, transparent_origami_2},
|
||||||
|
t14_extended_polymerisation::{extended_polymerisation_1, extended_polymerisation_2},
|
||||||
|
t15_chiton::{chiton_1, chiton_2},
|
||||||
|
t16_packet_decoder::{packet_decoder_1, packet_decoder_2},
|
||||||
|
t17_trick_shot::{trick_shot_1, trick_shot_2},
|
||||||
|
t18_snailfish::{snailfish_1, snailfish_2},
|
||||||
|
};
|
||||||
|
use std::env;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut args = env::args();
|
||||||
|
args.next();
|
||||||
|
let task = args
|
||||||
|
.next()
|
||||||
|
.unwrap_or_else(|| panic!("Task not given!"))
|
||||||
|
.parse()
|
||||||
|
.unwrap();
|
||||||
|
let subtask = args
|
||||||
|
.next()
|
||||||
|
.unwrap_or_else(|| panic!("Subtask not given!"))
|
||||||
|
.parse()
|
||||||
|
.unwrap();
|
||||||
|
let test_mode = args
|
||||||
|
.next()
|
||||||
|
.unwrap_or_else(|| panic!("Test mode not given!"))
|
||||||
|
.parse()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
match (task, subtask) {
|
||||||
|
(1, 1) => sonar_sweep_1(test_mode),
|
||||||
|
(1, 2) => sonar_sweep_2(test_mode),
|
||||||
|
(2, 1) => dive_1(test_mode),
|
||||||
|
(2, 2) => dive_2(test_mode),
|
||||||
|
(3, 1) => binary_diagnostic_1(test_mode),
|
||||||
|
(3, 2) => binary_diagnostic_2(test_mode),
|
||||||
|
(4, 1) => giant_squid_1(test_mode),
|
||||||
|
(4, 2) => giant_squid_2(test_mode),
|
||||||
|
(5, 1) => hydrothermal_venture_1(test_mode),
|
||||||
|
(5, 2) => hydrothermal_venture_2(test_mode),
|
||||||
|
(6, 1) => lanternfish_1(test_mode),
|
||||||
|
(6, 2) => lanternfish_2(test_mode),
|
||||||
|
(7, 1) => the_treachery_of_whales_1(test_mode),
|
||||||
|
(7, 2) => the_treachery_of_whales_2(test_mode),
|
||||||
|
(8, 1) => seven_segment_search_1(test_mode),
|
||||||
|
(8, 2) => seven_segment_search_2(test_mode),
|
||||||
|
(9, 1) => smoke_basin_1(test_mode),
|
||||||
|
(9, 2) => smoke_basin_2(test_mode),
|
||||||
|
(10, 1) => syntax_scoring_1(test_mode),
|
||||||
|
(10, 2) => syntax_scoring_2(test_mode),
|
||||||
|
(11, 1) => dumbo_octopus_1(test_mode),
|
||||||
|
(11, 2) => dumbo_octopus_2(test_mode),
|
||||||
|
(12, 1) => passage_passing_1(test_mode),
|
||||||
|
(12, 2) => passage_passing_2(test_mode),
|
||||||
|
(13, 1) => transparent_origami_1(test_mode),
|
||||||
|
(13, 2) => transparent_origami_2(test_mode),
|
||||||
|
(14, 1) => extended_polymerisation_1(test_mode),
|
||||||
|
(14, 2) => extended_polymerisation_2(test_mode),
|
||||||
|
(15, 1) => chiton_1(test_mode),
|
||||||
|
(15, 2) => chiton_2(test_mode),
|
||||||
|
(16, 1) => packet_decoder_1(test_mode),
|
||||||
|
(16, 2) => packet_decoder_2(test_mode),
|
||||||
|
(17, 1) => trick_shot_1(test_mode),
|
||||||
|
(17, 2) => trick_shot_2(test_mode),
|
||||||
|
(18, 1) => snailfish_1(test_mode),
|
||||||
|
(18, 2) => snailfish_2(test_mode),
|
||||||
|
_ => panic!("Unknown task combination!"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
use std::io::{BufRead, BufReader};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Vec<u64> {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
BufReader::new(f)
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.unwrap().parse().unwrap())
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sonar_sweep_1(test_mode: TestMode) {
|
||||||
|
let nums = parse_input(test_mode);
|
||||||
|
|
||||||
|
let mut count = 0;
|
||||||
|
for i in 1..nums.len() {
|
||||||
|
if nums[i] > nums[i - 1] {
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", count)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn sonar_sweep_2(test_mode: TestMode) {
|
||||||
|
let nums = parse_input(test_mode);
|
||||||
|
|
||||||
|
const WINDOW: usize = 3;
|
||||||
|
let mut count = 0u64;
|
||||||
|
for i in WINDOW..nums.len() {
|
||||||
|
if nums[i - WINDOW + 1..i + 1].iter().sum::<u64>() > nums[i - WINDOW..i].iter().sum() {
|
||||||
|
count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", count)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
199
|
||||||
|
200
|
||||||
|
208
|
||||||
|
210
|
||||||
|
200
|
||||||
|
207
|
||||||
|
240
|
||||||
|
269
|
||||||
|
260
|
||||||
|
263
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,79 @@
|
||||||
|
use std::{
|
||||||
|
io::{BufRead, BufReader},
|
||||||
|
str::FromStr,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
struct DirectionChange {
|
||||||
|
direction: Direction,
|
||||||
|
units: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Direction {
|
||||||
|
Forward,
|
||||||
|
Up,
|
||||||
|
Down,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Direction {
|
||||||
|
type Err = String;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"forward" => Ok(Direction::Forward),
|
||||||
|
"up" => Ok(Direction::Up),
|
||||||
|
"down" => Ok(Direction::Down),
|
||||||
|
_ => Err(format!("Invalid value: {:?}", s)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Vec<DirectionChange> {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
BufReader::new(f)
|
||||||
|
.lines()
|
||||||
|
.map(|line| {
|
||||||
|
let line = line.unwrap();
|
||||||
|
let mut split = line.split_ascii_whitespace();
|
||||||
|
DirectionChange {
|
||||||
|
direction: split.next().unwrap().parse().unwrap(),
|
||||||
|
units: split.next().unwrap().parse().unwrap(),
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dive_1(test_mode: TestMode) {
|
||||||
|
let directions = parse_input(test_mode);
|
||||||
|
|
||||||
|
let mut x = 0;
|
||||||
|
let mut y = 0;
|
||||||
|
for d in directions {
|
||||||
|
match d.direction {
|
||||||
|
Direction::Forward => x += d.units,
|
||||||
|
Direction::Up => y -= d.units,
|
||||||
|
Direction::Down => y += d.units,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("({},{}) -> {}", x, y, x * y)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dive_2(test_mode: TestMode) {
|
||||||
|
let directions = parse_input(test_mode);
|
||||||
|
|
||||||
|
let mut x = 0;
|
||||||
|
let mut y = 0;
|
||||||
|
let mut aim = 0;
|
||||||
|
for d in directions {
|
||||||
|
match d.direction {
|
||||||
|
Direction::Forward => {
|
||||||
|
x += d.units;
|
||||||
|
y += d.units * aim;
|
||||||
|
}
|
||||||
|
Direction::Up => aim -= d.units,
|
||||||
|
Direction::Down => aim += d.units,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("({},{}) -> {}", x, y, x * y)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
forward 5
|
||||||
|
down 5
|
||||||
|
forward 8
|
||||||
|
up 3
|
||||||
|
down 8
|
||||||
|
forward 2
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,83 @@
|
||||||
|
use std::io::{BufRead, BufReader};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Vec<String> {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
BufReader::new(f)
|
||||||
|
.lines()
|
||||||
|
.map(|line| line.unwrap())
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn num_symbols_at_pos(input: &[String], symbol: char, position: usize) -> usize {
|
||||||
|
input
|
||||||
|
.iter()
|
||||||
|
.filter(|s| s.chars().nth(position).unwrap() == symbol)
|
||||||
|
.count()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn binary_diagnostic_1(test_mode: TestMode) {
|
||||||
|
let nums = parse_input(test_mode);
|
||||||
|
|
||||||
|
let mut gamma = 0;
|
||||||
|
let mut epsilon = 0;
|
||||||
|
|
||||||
|
for b in 0..nums[0].len() {
|
||||||
|
let zero_count = num_symbols_at_pos(&nums, '0', b);
|
||||||
|
let one_count = num_symbols_at_pos(&nums, '1', b);
|
||||||
|
|
||||||
|
let most_common = if one_count >= zero_count { 1 } else { 0 };
|
||||||
|
let least_common = if one_count < zero_count { 1 } else { 0 };
|
||||||
|
|
||||||
|
gamma = (gamma << 1) | most_common;
|
||||||
|
epsilon = (epsilon << 1) | least_common;
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{}, {} -> {}", gamma, epsilon, gamma * epsilon);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn binary_diagnostic_2(test_mode: TestMode) {
|
||||||
|
let nums = parse_input(test_mode);
|
||||||
|
|
||||||
|
let mut oxygen_generator_ratings = nums.clone();
|
||||||
|
for b in 0..nums[0].len() {
|
||||||
|
if oxygen_generator_ratings.len() == 1 {
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
let zero_count = num_symbols_at_pos(&oxygen_generator_ratings, '0', b);
|
||||||
|
let one_count = num_symbols_at_pos(&oxygen_generator_ratings, '1', b);
|
||||||
|
|
||||||
|
let most_common = if one_count >= zero_count { '1' } else { '0' };
|
||||||
|
oxygen_generator_ratings = oxygen_generator_ratings
|
||||||
|
.into_iter()
|
||||||
|
.filter(|s| s.chars().nth(b).unwrap() == most_common)
|
||||||
|
.collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut co2_scrubber_ratings = nums.clone();
|
||||||
|
for b in 0..nums[0].len() {
|
||||||
|
if co2_scrubber_ratings.len() == 1 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let zero_count = num_symbols_at_pos(&co2_scrubber_ratings, '0', b);
|
||||||
|
let one_count = num_symbols_at_pos(&co2_scrubber_ratings, '1', b);
|
||||||
|
let least_common = if one_count < zero_count { '1' } else { '0' };
|
||||||
|
co2_scrubber_ratings = co2_scrubber_ratings
|
||||||
|
.into_iter()
|
||||||
|
.filter(|s| s.chars().nth(b).unwrap() == least_common)
|
||||||
|
.collect();
|
||||||
|
}
|
||||||
|
|
||||||
|
let oxy_gen_rating = usize::from_str_radix(&oxygen_generator_ratings[0], 2).unwrap();
|
||||||
|
let co2_scrub_rating = usize::from_str_radix(&co2_scrubber_ratings[0], 2).unwrap();
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"{}, {} -> {}",
|
||||||
|
oxy_gen_rating,
|
||||||
|
co2_scrub_rating,
|
||||||
|
oxy_gen_rating * co2_scrub_rating
|
||||||
|
);
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,12 @@
|
||||||
|
00100
|
||||||
|
11110
|
||||||
|
10110
|
||||||
|
10111
|
||||||
|
10101
|
||||||
|
01111
|
||||||
|
00111
|
||||||
|
11100
|
||||||
|
10000
|
||||||
|
11001
|
||||||
|
00010
|
||||||
|
01010
|
||||||
|
|
@ -0,0 +1,170 @@
|
||||||
|
use std::{
|
||||||
|
fs::File,
|
||||||
|
io::{BufRead, BufReader},
|
||||||
|
process::exit,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
numbers: Vec<u16>,
|
||||||
|
boards: Vec<Board>,
|
||||||
|
}
|
||||||
|
|
||||||
|
const BOARD_DIMENSION: usize = 5;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
struct Board {
|
||||||
|
cells: [[u16; BOARD_DIMENSION]; BOARD_DIMENSION],
|
||||||
|
marked_cell_map: [[bool; BOARD_DIMENSION]; BOARD_DIMENSION],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Board {
|
||||||
|
fn new() -> Self {
|
||||||
|
Self {
|
||||||
|
cells: [[0; BOARD_DIMENSION]; BOARD_DIMENSION],
|
||||||
|
marked_cell_map: [[false; BOARD_DIMENSION]; BOARD_DIMENSION],
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_bufreader(br: &mut BufReader<File>) -> Option<Self> {
|
||||||
|
let mut buf = String::new();
|
||||||
|
if let Ok(n) = br.read_line(&mut buf) {
|
||||||
|
if n == 0 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut ret = Self::new();
|
||||||
|
for j in 0..BOARD_DIMENSION {
|
||||||
|
buf.clear();
|
||||||
|
br.read_line(&mut buf).unwrap();
|
||||||
|
let line_nums: Vec<u16> = buf
|
||||||
|
.trim_end()
|
||||||
|
.split_ascii_whitespace()
|
||||||
|
.map(|n| n.parse().unwrap())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
ret.cells[j] = line_nums[0..BOARD_DIMENSION].try_into().unwrap();
|
||||||
|
}
|
||||||
|
Some(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn mark_number(&mut self, number: u16) {
|
||||||
|
for i in 0..BOARD_DIMENSION {
|
||||||
|
for j in 0..BOARD_DIMENSION {
|
||||||
|
if self.cells[i][j] == number {
|
||||||
|
self.marked_cell_map[i][j] = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_winning(&self) -> bool {
|
||||||
|
for col in 0..BOARD_DIMENSION {
|
||||||
|
let mut bingo = true;
|
||||||
|
for row in 0..BOARD_DIMENSION {
|
||||||
|
if !self.marked_cell_map[row][col] {
|
||||||
|
bingo = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if bingo {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for row in 0..BOARD_DIMENSION {
|
||||||
|
let mut bingo = true;
|
||||||
|
for col in 0..BOARD_DIMENSION {
|
||||||
|
if !self.marked_cell_map[row][col] {
|
||||||
|
bingo = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if bingo {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn score(&self, last_number: u16) -> u64 {
|
||||||
|
let mut score = 0u64;
|
||||||
|
for row in 0..BOARD_DIMENSION {
|
||||||
|
for col in 0..BOARD_DIMENSION {
|
||||||
|
if !self.marked_cell_map[row][col] {
|
||||||
|
score += self.cells[row][col] as u64;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
score * (last_number as u64)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
let mut buf = String::new();
|
||||||
|
let mut br = BufReader::new(f);
|
||||||
|
br.read_line(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let numbers: Vec<u16> = buf
|
||||||
|
.split_terminator(',')
|
||||||
|
.into_iter()
|
||||||
|
.map(|s| s.trim_end().parse().unwrap())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut boards = vec![];
|
||||||
|
loop {
|
||||||
|
let b = Board::from_bufreader(&mut br);
|
||||||
|
if let Some(b) = b {
|
||||||
|
boards.push(b);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Input { numbers, boards }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn giant_squid_1(test_mode: TestMode) {
|
||||||
|
let mut input = parse_input(test_mode);
|
||||||
|
|
||||||
|
for n in input.numbers {
|
||||||
|
for b in &mut input.boards {
|
||||||
|
b.mark_number(n);
|
||||||
|
if b.is_winning() {
|
||||||
|
println!("{}", b.score(n));
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn giant_squid_2(test_mode: TestMode) {
|
||||||
|
let mut input = parse_input(test_mode);
|
||||||
|
|
||||||
|
let mut last_to_win_board = None;
|
||||||
|
let mut last_to_win_number = None;
|
||||||
|
|
||||||
|
for n in input.numbers {
|
||||||
|
let mut new_boards = Vec::<Board>::new();
|
||||||
|
for b in &mut input.boards {
|
||||||
|
b.mark_number(n);
|
||||||
|
if b.is_winning() {
|
||||||
|
last_to_win_board = Some(b.clone());
|
||||||
|
last_to_win_number = Some(n);
|
||||||
|
} else {
|
||||||
|
new_boards.push(b.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
input.boards = new_boards;
|
||||||
|
}
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"{}",
|
||||||
|
last_to_win_board
|
||||||
|
.unwrap()
|
||||||
|
.score(last_to_win_number.unwrap())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,601 @@
|
||||||
|
74,79,46,2,19,27,31,90,21,83,94,77,0,29,38,72,42,23,6,62,45,95,41,55,93,69,39,17,12,1,20,53,49,71,61,13,88,25,87,26,50,58,28,51,89,64,3,80,36,65,57,92,52,86,98,78,9,33,44,63,16,34,97,60,40,66,75,4,7,84,22,43,11,85,91,32,48,14,18,76,8,47,24,81,35,30,82,67,37,70,15,5,73,59,54,68,56,96,99,10
|
||||||
|
|
||||||
|
61 96 92 39 0
|
||||||
|
35 25 50 22 60
|
||||||
|
3 88 69 48 62
|
||||||
|
75 24 97 51 67
|
||||||
|
87 74 94 77 83
|
||||||
|
|
||||||
|
1 70 59 40 55
|
||||||
|
42 88 10 17 80
|
||||||
|
27 24 82 45 23
|
||||||
|
5 19 48 51 11
|
||||||
|
75 72 97 74 7
|
||||||
|
|
||||||
|
58 40 78 83 74
|
||||||
|
4 94 17 63 62
|
||||||
|
55 61 5 27 69
|
||||||
|
99 84 89 81 59
|
||||||
|
64 28 91 49 97
|
||||||
|
|
||||||
|
92 88 51 12 22
|
||||||
|
0 5 65 32 77
|
||||||
|
80 40 3 10 90
|
||||||
|
91 47 58 57 14
|
||||||
|
86 71 94 36 75
|
||||||
|
|
||||||
|
71 24 16 66 29
|
||||||
|
8 47 93 68 36
|
||||||
|
42 67 69 55 15
|
||||||
|
75 6 34 60 70
|
||||||
|
95 92 14 0 81
|
||||||
|
|
||||||
|
52 49 37 41 67
|
||||||
|
9 8 2 13 17
|
||||||
|
92 89 38 16 53
|
||||||
|
63 46 60 4 87
|
||||||
|
57 96 77 85 39
|
||||||
|
|
||||||
|
84 98 52 95 89
|
||||||
|
81 67 99 85 50
|
||||||
|
88 11 76 49 8
|
||||||
|
4 30 51 78 20
|
||||||
|
70 64 74 40 79
|
||||||
|
|
||||||
|
45 65 87 79 14
|
||||||
|
11 26 98 70 28
|
||||||
|
46 85 54 55 48
|
||||||
|
97 59 62 57 16
|
||||||
|
30 40 95 7 18
|
||||||
|
|
||||||
|
97 25 38 1 26
|
||||||
|
20 86 7 68 39
|
||||||
|
2 55 29 33 65
|
||||||
|
46 14 72 47 18
|
||||||
|
60 48 41 9 50
|
||||||
|
|
||||||
|
71 81 15 49 50
|
||||||
|
72 28 51 11 35
|
||||||
|
20 7 36 84 65
|
||||||
|
93 33 14 47 45
|
||||||
|
89 0 75 60 16
|
||||||
|
|
||||||
|
98 90 47 94 55
|
||||||
|
69 41 81 1 43
|
||||||
|
73 95 65 15 80
|
||||||
|
85 99 60 92 0
|
||||||
|
13 33 82 51 22
|
||||||
|
|
||||||
|
47 58 82 67 30
|
||||||
|
88 23 64 4 39
|
||||||
|
94 52 61 1 75
|
||||||
|
3 8 34 87 49
|
||||||
|
13 38 60 54 35
|
||||||
|
|
||||||
|
91 62 88 29 33
|
||||||
|
84 27 6 18 11
|
||||||
|
47 87 58 42 34
|
||||||
|
69 46 75 40 43
|
||||||
|
63 97 53 49 66
|
||||||
|
|
||||||
|
80 57 73 65 44
|
||||||
|
95 55 27 46 10
|
||||||
|
82 24 90 97 75
|
||||||
|
33 41 31 84 9
|
||||||
|
5 48 18 49 12
|
||||||
|
|
||||||
|
92 63 91 14 13
|
||||||
|
32 12 66 87 79
|
||||||
|
44 60 7 96 84
|
||||||
|
58 41 42 3 27
|
||||||
|
16 59 43 77 11
|
||||||
|
|
||||||
|
80 36 53 56 62
|
||||||
|
26 8 4 79 51
|
||||||
|
22 91 69 78 2
|
||||||
|
59 13 23 81 93
|
||||||
|
30 16 49 33 65
|
||||||
|
|
||||||
|
52 88 12 67 85
|
||||||
|
74 78 75 72 79
|
||||||
|
81 26 82 5 0
|
||||||
|
23 56 41 3 32
|
||||||
|
31 69 15 66 87
|
||||||
|
|
||||||
|
22 71 80 0 63
|
||||||
|
94 31 13 60 42
|
||||||
|
41 77 90 92 91
|
||||||
|
64 95 5 23 73
|
||||||
|
85 15 3 88 10
|
||||||
|
|
||||||
|
72 75 88 52 38
|
||||||
|
17 86 54 79 87
|
||||||
|
66 61 51 3 26
|
||||||
|
68 47 89 11 41
|
||||||
|
50 33 92 7 81
|
||||||
|
|
||||||
|
82 80 9 65 34
|
||||||
|
3 49 42 36 76
|
||||||
|
95 94 61 32 43
|
||||||
|
72 67 56 45 54
|
||||||
|
77 48 14 6 25
|
||||||
|
|
||||||
|
44 75 99 62 11
|
||||||
|
43 73 2 87 83
|
||||||
|
96 63 85 14 30
|
||||||
|
32 70 18 29 55
|
||||||
|
1 88 15 27 24
|
||||||
|
|
||||||
|
2 38 46 61 7
|
||||||
|
45 19 97 31 54
|
||||||
|
88 40 14 81 87
|
||||||
|
69 39 32 16 21
|
||||||
|
22 5 0 29 92
|
||||||
|
|
||||||
|
78 57 85 4 70
|
||||||
|
82 43 12 69 79
|
||||||
|
60 34 15 63 45
|
||||||
|
90 77 93 31 47
|
||||||
|
27 49 25 71 19
|
||||||
|
|
||||||
|
49 10 40 51 45
|
||||||
|
9 44 86 26 27
|
||||||
|
93 98 22 63 95
|
||||||
|
88 66 33 74 57
|
||||||
|
81 24 28 91 72
|
||||||
|
|
||||||
|
14 83 60 54 57
|
||||||
|
18 15 41 4 47
|
||||||
|
39 98 62 33 5
|
||||||
|
30 70 6 91 90
|
||||||
|
86 21 28 84 81
|
||||||
|
|
||||||
|
91 46 49 9 32
|
||||||
|
85 33 87 83 76
|
||||||
|
17 14 37 94 6
|
||||||
|
31 13 92 89 78
|
||||||
|
15 66 47 74 63
|
||||||
|
|
||||||
|
55 6 83 19 96
|
||||||
|
71 22 88 99 50
|
||||||
|
89 84 26 45 38
|
||||||
|
57 77 87 93 25
|
||||||
|
44 49 16 64 34
|
||||||
|
|
||||||
|
79 76 46 19 51
|
||||||
|
85 90 58 29 3
|
||||||
|
34 2 81 62 99
|
||||||
|
84 60 78 91 96
|
||||||
|
4 27 43 47 98
|
||||||
|
|
||||||
|
66 2 38 39 37
|
||||||
|
35 25 51 10 82
|
||||||
|
91 62 1 12 93
|
||||||
|
83 29 47 32 56
|
||||||
|
74 19 50 95 49
|
||||||
|
|
||||||
|
59 57 35 50 51
|
||||||
|
27 38 62 76 3
|
||||||
|
52 49 83 75 4
|
||||||
|
64 16 93 7 91
|
||||||
|
40 17 65 41 97
|
||||||
|
|
||||||
|
18 37 45 44 4
|
||||||
|
72 7 28 0 75
|
||||||
|
9 2 95 90 38
|
||||||
|
24 79 93 22 88
|
||||||
|
94 70 57 6 20
|
||||||
|
|
||||||
|
11 61 65 50 23
|
||||||
|
74 51 80 91 22
|
||||||
|
5 32 27 57 14
|
||||||
|
59 86 70 17 10
|
||||||
|
21 62 20 18 67
|
||||||
|
|
||||||
|
98 9 88 79 78
|
||||||
|
99 56 91 41 67
|
||||||
|
17 39 65 16 38
|
||||||
|
75 84 11 21 61
|
||||||
|
22 81 52 55 87
|
||||||
|
|
||||||
|
45 36 74 47 19
|
||||||
|
15 22 88 85 32
|
||||||
|
38 63 54 16 13
|
||||||
|
29 7 48 90 43
|
||||||
|
68 3 24 17 30
|
||||||
|
|
||||||
|
72 77 68 75 57
|
||||||
|
43 74 32 61 34
|
||||||
|
37 2 47 25 85
|
||||||
|
56 12 95 98 0
|
||||||
|
80 36 39 22 11
|
||||||
|
|
||||||
|
77 58 24 57 99
|
||||||
|
70 16 33 41 94
|
||||||
|
54 61 20 90 30
|
||||||
|
29 17 55 0 83
|
||||||
|
13 37 42 49 38
|
||||||
|
|
||||||
|
86 58 13 11 6
|
||||||
|
73 26 25 0 67
|
||||||
|
56 44 87 5 49
|
||||||
|
4 91 51 66 22
|
||||||
|
28 8 1 15 57
|
||||||
|
|
||||||
|
61 24 50 25 66
|
||||||
|
92 42 98 55 96
|
||||||
|
46 79 22 33 91
|
||||||
|
97 0 69 90 54
|
||||||
|
17 38 34 39 52
|
||||||
|
|
||||||
|
68 28 67 45 87
|
||||||
|
8 80 52 41 54
|
||||||
|
34 47 4 78 59
|
||||||
|
10 29 32 11 26
|
||||||
|
17 33 7 93 35
|
||||||
|
|
||||||
|
10 15 33 46 14
|
||||||
|
6 56 52 16 92
|
||||||
|
47 36 17 8 69
|
||||||
|
77 45 73 84 9
|
||||||
|
55 60 80 44 64
|
||||||
|
|
||||||
|
58 18 25 11 83
|
||||||
|
75 7 53 42 68
|
||||||
|
48 52 6 0 43
|
||||||
|
80 97 16 60 1
|
||||||
|
29 67 15 5 17
|
||||||
|
|
||||||
|
77 55 54 24 66
|
||||||
|
58 2 4 39 12
|
||||||
|
57 86 69 91 8
|
||||||
|
67 84 65 13 20
|
||||||
|
87 59 40 34 27
|
||||||
|
|
||||||
|
39 7 40 77 91
|
||||||
|
13 76 32 92 56
|
||||||
|
34 17 81 27 66
|
||||||
|
37 80 83 85 15
|
||||||
|
43 36 30 26 63
|
||||||
|
|
||||||
|
11 50 72 85 34
|
||||||
|
3 92 58 53 7
|
||||||
|
98 10 49 97 12
|
||||||
|
26 42 14 24 56
|
||||||
|
28 20 59 54 4
|
||||||
|
|
||||||
|
55 56 29 80 96
|
||||||
|
63 68 44 22 12
|
||||||
|
65 4 95 6 26
|
||||||
|
21 35 14 87 8
|
||||||
|
17 92 86 30 53
|
||||||
|
|
||||||
|
9 42 20 37 19
|
||||||
|
65 46 11 54 92
|
||||||
|
52 4 56 80 99
|
||||||
|
41 55 43 90 17
|
||||||
|
60 87 13 50 3
|
||||||
|
|
||||||
|
3 29 4 41 95
|
||||||
|
14 9 11 23 10
|
||||||
|
7 63 68 58 66
|
||||||
|
13 46 67 86 51
|
||||||
|
28 36 0 73 84
|
||||||
|
|
||||||
|
45 1 19 74 36
|
||||||
|
58 64 30 86 83
|
||||||
|
99 42 70 97 54
|
||||||
|
17 75 56 80 81
|
||||||
|
93 41 90 10 88
|
||||||
|
|
||||||
|
24 25 0 94 22
|
||||||
|
70 1 50 10 14
|
||||||
|
89 77 76 63 46
|
||||||
|
33 72 81 28 60
|
||||||
|
68 40 12 31 20
|
||||||
|
|
||||||
|
79 33 30 55 71
|
||||||
|
31 91 54 0 82
|
||||||
|
10 78 9 49 14
|
||||||
|
85 72 5 3 24
|
||||||
|
86 38 97 46 61
|
||||||
|
|
||||||
|
20 84 97 52 79
|
||||||
|
45 73 11 18 58
|
||||||
|
63 86 21 9 87
|
||||||
|
48 90 13 77 49
|
||||||
|
44 85 56 71 55
|
||||||
|
|
||||||
|
16 1 54 13 83
|
||||||
|
38 32 69 28 43
|
||||||
|
5 50 57 95 47
|
||||||
|
34 76 45 74 89
|
||||||
|
46 91 71 39 17
|
||||||
|
|
||||||
|
82 45 14 28 57
|
||||||
|
27 21 17 29 51
|
||||||
|
95 32 31 80 91
|
||||||
|
89 74 67 76 79
|
||||||
|
6 0 4 43 94
|
||||||
|
|
||||||
|
52 66 44 74 95
|
||||||
|
85 51 79 76 54
|
||||||
|
89 34 59 10 27
|
||||||
|
45 6 69 98 48
|
||||||
|
88 19 3 65 94
|
||||||
|
|
||||||
|
61 9 67 72 71
|
||||||
|
93 48 64 52 11
|
||||||
|
74 85 12 13 23
|
||||||
|
41 4 94 16 57
|
||||||
|
63 88 28 89 40
|
||||||
|
|
||||||
|
68 23 54 56 44
|
||||||
|
13 77 26 2 46
|
||||||
|
28 81 15 16 62
|
||||||
|
82 51 71 86 72
|
||||||
|
99 0 52 41 32
|
||||||
|
|
||||||
|
99 38 7 87 9
|
||||||
|
69 96 22 57 24
|
||||||
|
64 81 29 67 14
|
||||||
|
48 52 6 88 92
|
||||||
|
90 44 51 40 8
|
||||||
|
|
||||||
|
41 1 23 24 73
|
||||||
|
10 4 66 60 22
|
||||||
|
17 9 69 53 63
|
||||||
|
42 34 99 86 56
|
||||||
|
75 82 81 18 79
|
||||||
|
|
||||||
|
58 64 12 59 30
|
||||||
|
21 94 28 77 53
|
||||||
|
88 90 97 62 83
|
||||||
|
35 70 27 98 26
|
||||||
|
65 34 25 73 75
|
||||||
|
|
||||||
|
81 7 90 91 74
|
||||||
|
23 34 67 31 50
|
||||||
|
60 87 5 40 77
|
||||||
|
69 93 27 49 53
|
||||||
|
39 62 68 16 89
|
||||||
|
|
||||||
|
82 13 28 65 35
|
||||||
|
5 42 90 12 51
|
||||||
|
15 85 64 86 25
|
||||||
|
87 22 88 37 98
|
||||||
|
39 10 46 56 49
|
||||||
|
|
||||||
|
62 25 93 75 34
|
||||||
|
42 89 27 36 18
|
||||||
|
32 54 59 26 6
|
||||||
|
51 19 47 85 95
|
||||||
|
33 39 73 29 79
|
||||||
|
|
||||||
|
15 27 0 79 69
|
||||||
|
13 73 25 19 43
|
||||||
|
30 8 46 34 58
|
||||||
|
4 86 66 74 18
|
||||||
|
83 33 92 11 47
|
||||||
|
|
||||||
|
45 25 22 14 4
|
||||||
|
83 3 65 17 85
|
||||||
|
91 26 5 19 87
|
||||||
|
66 89 29 49 64
|
||||||
|
52 20 58 93 53
|
||||||
|
|
||||||
|
30 64 52 14 34
|
||||||
|
63 16 97 9 15
|
||||||
|
2 72 65 45 17
|
||||||
|
47 98 77 23 0
|
||||||
|
50 20 38 60 26
|
||||||
|
|
||||||
|
46 67 84 66 55
|
||||||
|
7 32 31 75 19
|
||||||
|
71 85 37 12 52
|
||||||
|
39 27 8 81 44
|
||||||
|
89 47 42 16 58
|
||||||
|
|
||||||
|
74 99 81 86 89
|
||||||
|
92 20 7 58 30
|
||||||
|
63 96 25 45 2
|
||||||
|
97 50 94 33 87
|
||||||
|
38 6 51 21 62
|
||||||
|
|
||||||
|
52 27 20 32 19
|
||||||
|
17 80 70 92 96
|
||||||
|
49 44 62 60 94
|
||||||
|
40 28 86 4 7
|
||||||
|
38 91 3 77 29
|
||||||
|
|
||||||
|
8 28 89 99 6
|
||||||
|
46 54 34 95 3
|
||||||
|
88 60 29 91 10
|
||||||
|
42 13 62 94 76
|
||||||
|
56 52 72 85 59
|
||||||
|
|
||||||
|
85 50 42 5 91
|
||||||
|
67 7 21 6 56
|
||||||
|
14 8 70 10 78
|
||||||
|
77 80 57 29 96
|
||||||
|
17 23 73 16 38
|
||||||
|
|
||||||
|
59 61 47 43 13
|
||||||
|
7 93 11 72 83
|
||||||
|
0 96 67 27 2
|
||||||
|
42 5 41 65 94
|
||||||
|
40 34 33 50 3
|
||||||
|
|
||||||
|
25 79 52 11 94
|
||||||
|
73 14 7 99 19
|
||||||
|
92 40 2 28 45
|
||||||
|
55 34 87 24 96
|
||||||
|
36 16 66 78 35
|
||||||
|
|
||||||
|
11 27 90 50 55
|
||||||
|
68 84 63 57 89
|
||||||
|
35 14 29 77 24
|
||||||
|
92 81 7 1 85
|
||||||
|
99 64 20 2 49
|
||||||
|
|
||||||
|
20 66 85 88 57
|
||||||
|
49 17 78 1 80
|
||||||
|
18 24 11 31 65
|
||||||
|
30 34 45 99 19
|
||||||
|
69 40 94 2 58
|
||||||
|
|
||||||
|
49 2 55 54 61
|
||||||
|
48 19 34 5 83
|
||||||
|
80 52 67 24 96
|
||||||
|
51 91 20 45 68
|
||||||
|
87 79 59 9 3
|
||||||
|
|
||||||
|
47 12 71 88 74
|
||||||
|
28 5 79 58 26
|
||||||
|
93 67 62 86 23
|
||||||
|
66 13 96 46 17
|
||||||
|
94 59 19 54 15
|
||||||
|
|
||||||
|
21 89 98 54 53
|
||||||
|
49 44 79 10 93
|
||||||
|
64 24 25 9 56
|
||||||
|
57 70 55 65 23
|
||||||
|
14 36 31 13 4
|
||||||
|
|
||||||
|
62 60 30 89 94
|
||||||
|
88 19 59 41 75
|
||||||
|
25 45 74 17 47
|
||||||
|
5 16 76 33 58
|
||||||
|
53 68 65 39 67
|
||||||
|
|
||||||
|
55 2 76 32 26
|
||||||
|
37 25 5 27 24
|
||||||
|
61 88 33 45 46
|
||||||
|
20 96 51 42 49
|
||||||
|
66 3 15 11 36
|
||||||
|
|
||||||
|
60 21 80 9 96
|
||||||
|
91 39 24 28 13
|
||||||
|
52 11 34 41 82
|
||||||
|
66 85 72 38 76
|
||||||
|
69 25 67 64 81
|
||||||
|
|
||||||
|
67 75 42 79 74
|
||||||
|
36 26 85 30 25
|
||||||
|
50 19 3 33 28
|
||||||
|
12 95 54 71 91
|
||||||
|
0 17 87 92 40
|
||||||
|
|
||||||
|
51 85 12 86 40
|
||||||
|
28 36 35 50 97
|
||||||
|
55 16 20 14 73
|
||||||
|
7 5 4 68 22
|
||||||
|
47 3 67 93 2
|
||||||
|
|
||||||
|
48 33 92 35 31
|
||||||
|
73 40 71 75 62
|
||||||
|
19 54 49 20 38
|
||||||
|
23 37 9 11 10
|
||||||
|
80 63 39 52 56
|
||||||
|
|
||||||
|
59 70 61 65 62
|
||||||
|
42 73 99 39 66
|
||||||
|
67 8 93 30 97
|
||||||
|
53 37 51 55 11
|
||||||
|
48 26 94 44 63
|
||||||
|
|
||||||
|
99 5 21 8 13
|
||||||
|
0 35 25 19 6
|
||||||
|
93 83 40 98 43
|
||||||
|
84 18 66 50 62
|
||||||
|
86 94 32 52 11
|
||||||
|
|
||||||
|
55 15 85 39 4
|
||||||
|
95 83 27 46 45
|
||||||
|
19 47 61 9 66
|
||||||
|
82 32 72 77 16
|
||||||
|
50 96 14 60 35
|
||||||
|
|
||||||
|
66 13 84 74 97
|
||||||
|
85 67 20 43 34
|
||||||
|
95 0 3 58 38
|
||||||
|
48 69 93 28 7
|
||||||
|
91 98 56 94 35
|
||||||
|
|
||||||
|
11 15 73 51 77
|
||||||
|
13 7 22 53 10
|
||||||
|
2 40 98 79 50
|
||||||
|
71 83 49 45 56
|
||||||
|
0 1 68 99 24
|
||||||
|
|
||||||
|
34 84 37 31 93
|
||||||
|
55 7 18 15 65
|
||||||
|
80 40 29 44 36
|
||||||
|
51 26 99 59 2
|
||||||
|
57 45 67 1 41
|
||||||
|
|
||||||
|
79 90 56 76 58
|
||||||
|
78 70 20 26 48
|
||||||
|
87 82 46 59 98
|
||||||
|
51 81 91 52 44
|
||||||
|
21 86 68 64 7
|
||||||
|
|
||||||
|
12 26 73 30 87
|
||||||
|
99 58 45 25 38
|
||||||
|
95 97 27 22 37
|
||||||
|
98 72 10 6 79
|
||||||
|
4 61 20 85 67
|
||||||
|
|
||||||
|
9 26 5 68 2
|
||||||
|
97 4 31 11 69
|
||||||
|
75 64 0 6 17
|
||||||
|
25 95 89 59 38
|
||||||
|
16 99 27 53 10
|
||||||
|
|
||||||
|
89 71 42 70 90
|
||||||
|
12 38 8 63 23
|
||||||
|
95 77 0 29 43
|
||||||
|
81 93 56 2 34
|
||||||
|
46 44 55 13 41
|
||||||
|
|
||||||
|
72 21 50 1 81
|
||||||
|
67 44 88 90 82
|
||||||
|
98 19 30 48 85
|
||||||
|
66 20 79 13 28
|
||||||
|
29 62 38 74 89
|
||||||
|
|
||||||
|
1 62 20 28 0
|
||||||
|
59 52 11 6 74
|
||||||
|
32 16 50 34 76
|
||||||
|
79 91 31 24 56
|
||||||
|
26 37 87 53 57
|
||||||
|
|
||||||
|
47 79 55 45 9
|
||||||
|
63 2 1 60 75
|
||||||
|
18 39 97 7 44
|
||||||
|
33 29 91 31 23
|
||||||
|
50 80 32 49 71
|
||||||
|
|
||||||
|
41 52 85 2 83
|
||||||
|
28 27 49 14 44
|
||||||
|
20 1 34 19 17
|
||||||
|
62 59 68 86 82
|
||||||
|
89 31 37 95 80
|
||||||
|
|
||||||
|
67 70 59 17 91
|
||||||
|
3 60 12 6 93
|
||||||
|
99 44 34 9 21
|
||||||
|
31 26 61 20 25
|
||||||
|
23 15 43 53 42
|
||||||
|
|
||||||
|
52 19 16 91 35
|
||||||
|
65 29 4 2 48
|
||||||
|
90 44 77 38 60
|
||||||
|
49 62 53 47 74
|
||||||
|
61 15 30 28 70
|
||||||
|
|
||||||
|
14 97 34 88 55
|
||||||
|
50 28 80 36 64
|
||||||
|
93 40 60 90 22
|
||||||
|
29 77 1 26 56
|
||||||
|
33 9 4 67 68
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
7,4,9,5,11,17,23,2,0,14,21,24,10,16,13,6,15,25,12,22,18,20,8,19,3,26,1
|
||||||
|
|
||||||
|
22 13 17 11 0
|
||||||
|
8 2 23 4 24
|
||||||
|
21 9 14 16 7
|
||||||
|
6 10 3 18 5
|
||||||
|
1 12 20 15 19
|
||||||
|
|
||||||
|
3 15 0 2 22
|
||||||
|
9 18 13 17 5
|
||||||
|
19 8 7 25 23
|
||||||
|
20 11 10 24 4
|
||||||
|
14 21 16 12 6
|
||||||
|
|
||||||
|
14 21 17 24 4
|
||||||
|
10 16 15 9 19
|
||||||
|
18 8 23 26 20
|
||||||
|
22 11 13 6 5
|
||||||
|
2 0 12 3 7
|
||||||
|
|
@ -0,0 +1,143 @@
|
||||||
|
use std::{
|
||||||
|
cmp::Ordering,
|
||||||
|
collections::{HashMap, HashSet},
|
||||||
|
fmt::Display,
|
||||||
|
io::{BufRead, BufReader},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
|
||||||
|
struct Point {
|
||||||
|
x: i64,
|
||||||
|
y: i64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for Point {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
f.write_fmt(format_args!("({}, {})", self.x, self.y))
|
||||||
|
.unwrap();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq, Hash)]
|
||||||
|
struct Line {
|
||||||
|
p1: Point,
|
||||||
|
p2: Point,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for Line {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
f.write_fmt(format_args!("[{} -> {}]", self.p1, self.p2))
|
||||||
|
.unwrap();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Line {
|
||||||
|
fn points(&self) -> HashSet<Point> {
|
||||||
|
let mut res = HashSet::new();
|
||||||
|
|
||||||
|
let dx = Self::sign(self.p2.x - self.p1.x);
|
||||||
|
let dy = Self::sign(self.p2.y - self.p1.y);
|
||||||
|
|
||||||
|
let mut x = self.p1.x;
|
||||||
|
let mut y = self.p1.y;
|
||||||
|
loop {
|
||||||
|
let p = Point { x, y };
|
||||||
|
|
||||||
|
res.insert(p);
|
||||||
|
|
||||||
|
if x == self.p2.x && y == self.p2.y {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
x += dx;
|
||||||
|
y += dy;
|
||||||
|
}
|
||||||
|
|
||||||
|
res
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sign(expr: i64) -> i64 {
|
||||||
|
match expr.cmp(&0) {
|
||||||
|
Ordering::Less => -1,
|
||||||
|
Ordering::Equal => 0,
|
||||||
|
Ordering::Greater => 1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Input {
|
||||||
|
lines: Vec<Line>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
let br = BufReader::new(f);
|
||||||
|
let lines = br
|
||||||
|
.lines()
|
||||||
|
.map(|line| {
|
||||||
|
let line = line.unwrap();
|
||||||
|
let mut s = line.split_terminator(" -> ");
|
||||||
|
|
||||||
|
let mut m = s.next().unwrap().split_terminator(',');
|
||||||
|
let p1 = Point {
|
||||||
|
x: m.next().unwrap().parse().unwrap(),
|
||||||
|
y: m.next().unwrap().parse().unwrap(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut m = s.next().unwrap().split_terminator(',');
|
||||||
|
let p2 = Point {
|
||||||
|
x: m.next().unwrap().parse().unwrap(),
|
||||||
|
y: m.next().unwrap().parse().unwrap(),
|
||||||
|
};
|
||||||
|
|
||||||
|
Line { p1, p2 }
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Input { lines }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn hydrothermal_venture_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
let orthogonal_lines: Vec<_> = input
|
||||||
|
.lines
|
||||||
|
.into_iter()
|
||||||
|
.filter(|line| line.p1.x == line.p2.x || line.p1.y == line.p2.y)
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut point_count = HashMap::<Point, i64>::new();
|
||||||
|
for line in orthogonal_lines {
|
||||||
|
for point in line.points() {
|
||||||
|
*point_count.entry(point).or_insert(0) += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let num_intersections = point_count
|
||||||
|
.iter()
|
||||||
|
.filter(|point_usages| point_usages.1 > &1)
|
||||||
|
.count();
|
||||||
|
|
||||||
|
println!("{}", num_intersections);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn hydrothermal_venture_2(test_mode: TestMode) {
|
||||||
|
let lines = parse_input(test_mode).lines;
|
||||||
|
|
||||||
|
let mut point_count = HashMap::<Point, i64>::new();
|
||||||
|
|
||||||
|
for line in lines {
|
||||||
|
for point in line.points() {
|
||||||
|
*point_count.entry(point).or_insert(0) += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let num_intersections = point_count
|
||||||
|
.iter()
|
||||||
|
.filter(|point_usages| point_usages.1 > &1)
|
||||||
|
.count();
|
||||||
|
|
||||||
|
println!("{}", num_intersections);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,500 @@
|
||||||
|
541,808 -> 108,808
|
||||||
|
982,23 -> 45,960
|
||||||
|
558,21 -> 558,318
|
||||||
|
907,877 -> 43,13
|
||||||
|
532,213 -> 532,801
|
||||||
|
599,387 -> 870,387
|
||||||
|
762,208 -> 78,208
|
||||||
|
739,527 -> 739,907
|
||||||
|
64,21 -> 64,958
|
||||||
|
258,267 -> 929,938
|
||||||
|
22,75 -> 725,778
|
||||||
|
347,950 -> 347,345
|
||||||
|
705,906 -> 61,906
|
||||||
|
53,16 -> 950,913
|
||||||
|
468,474 -> 475,481
|
||||||
|
567,602 -> 914,602
|
||||||
|
570,531 -> 570,530
|
||||||
|
180,307 -> 180,823
|
||||||
|
546,374 -> 390,374
|
||||||
|
750,142 -> 861,31
|
||||||
|
586,631 -> 905,950
|
||||||
|
971,680 -> 784,680
|
||||||
|
428,174 -> 352,174
|
||||||
|
825,676 -> 228,676
|
||||||
|
630,617 -> 70,617
|
||||||
|
156,912 -> 944,124
|
||||||
|
805,203 -> 25,983
|
||||||
|
726,808 -> 726,96
|
||||||
|
986,564 -> 908,642
|
||||||
|
594,293 -> 594,458
|
||||||
|
182,126 -> 182,476
|
||||||
|
979,43 -> 35,987
|
||||||
|
642,272 -> 642,446
|
||||||
|
759,690 -> 891,690
|
||||||
|
951,518 -> 161,518
|
||||||
|
357,769 -> 336,769
|
||||||
|
904,297 -> 904,533
|
||||||
|
326,332 -> 326,316
|
||||||
|
758,356 -> 654,460
|
||||||
|
432,425 -> 432,819
|
||||||
|
31,602 -> 31,421
|
||||||
|
318,555 -> 898,555
|
||||||
|
326,220 -> 777,671
|
||||||
|
708,957 -> 708,273
|
||||||
|
26,24 -> 974,972
|
||||||
|
341,172 -> 341,394
|
||||||
|
33,926 -> 864,95
|
||||||
|
486,324 -> 486,704
|
||||||
|
850,82 -> 132,800
|
||||||
|
62,506 -> 113,506
|
||||||
|
816,429 -> 816,141
|
||||||
|
184,17 -> 184,328
|
||||||
|
40,680 -> 30,670
|
||||||
|
640,294 -> 127,807
|
||||||
|
654,512 -> 654,296
|
||||||
|
722,301 -> 629,301
|
||||||
|
255,430 -> 811,430
|
||||||
|
376,385 -> 376,379
|
||||||
|
227,207 -> 227,947
|
||||||
|
363,533 -> 757,533
|
||||||
|
150,616 -> 150,284
|
||||||
|
943,100 -> 79,964
|
||||||
|
275,963 -> 275,461
|
||||||
|
409,768 -> 409,574
|
||||||
|
516,349 -> 516,656
|
||||||
|
19,666 -> 847,666
|
||||||
|
962,358 -> 962,907
|
||||||
|
781,789 -> 781,870
|
||||||
|
778,380 -> 501,657
|
||||||
|
895,29 -> 12,912
|
||||||
|
12,677 -> 12,761
|
||||||
|
614,728 -> 690,652
|
||||||
|
415,786 -> 778,423
|
||||||
|
683,84 -> 683,574
|
||||||
|
973,909 -> 75,11
|
||||||
|
854,791 -> 260,197
|
||||||
|
965,55 -> 559,55
|
||||||
|
624,542 -> 235,153
|
||||||
|
924,57 -> 16,965
|
||||||
|
540,736 -> 540,65
|
||||||
|
293,293 -> 929,293
|
||||||
|
587,176 -> 587,432
|
||||||
|
389,126 -> 389,590
|
||||||
|
267,149 -> 92,149
|
||||||
|
424,596 -> 697,323
|
||||||
|
412,697 -> 773,697
|
||||||
|
473,579 -> 310,416
|
||||||
|
149,175 -> 837,863
|
||||||
|
848,984 -> 159,295
|
||||||
|
608,613 -> 292,613
|
||||||
|
344,970 -> 546,970
|
||||||
|
589,531 -> 589,74
|
||||||
|
220,727 -> 220,831
|
||||||
|
651,240 -> 318,240
|
||||||
|
717,609 -> 847,479
|
||||||
|
917,954 -> 327,364
|
||||||
|
780,102 -> 228,654
|
||||||
|
201,95 -> 201,921
|
||||||
|
403,88 -> 403,79
|
||||||
|
755,76 -> 755,529
|
||||||
|
654,762 -> 654,97
|
||||||
|
957,988 -> 44,75
|
||||||
|
899,43 -> 51,891
|
||||||
|
855,892 -> 175,212
|
||||||
|
295,962 -> 613,962
|
||||||
|
284,800 -> 946,800
|
||||||
|
494,771 -> 793,472
|
||||||
|
212,799 -> 212,784
|
||||||
|
25,829 -> 824,30
|
||||||
|
277,135 -> 396,135
|
||||||
|
981,986 -> 187,192
|
||||||
|
794,88 -> 308,88
|
||||||
|
425,140 -> 73,140
|
||||||
|
155,900 -> 155,500
|
||||||
|
339,768 -> 339,621
|
||||||
|
720,407 -> 824,303
|
||||||
|
746,679 -> 746,490
|
||||||
|
672,632 -> 30,632
|
||||||
|
74,628 -> 49,628
|
||||||
|
534,770 -> 249,485
|
||||||
|
59,802 -> 605,256
|
||||||
|
481,543 -> 723,301
|
||||||
|
163,425 -> 947,425
|
||||||
|
10,782 -> 779,782
|
||||||
|
185,851 -> 68,968
|
||||||
|
536,479 -> 536,217
|
||||||
|
987,472 -> 960,472
|
||||||
|
802,623 -> 202,23
|
||||||
|
548,73 -> 548,838
|
||||||
|
711,678 -> 711,655
|
||||||
|
91,578 -> 91,162
|
||||||
|
803,27 -> 31,27
|
||||||
|
198,524 -> 282,608
|
||||||
|
45,585 -> 45,973
|
||||||
|
741,157 -> 317,581
|
||||||
|
263,843 -> 819,843
|
||||||
|
240,786 -> 240,272
|
||||||
|
453,148 -> 657,148
|
||||||
|
646,74 -> 646,758
|
||||||
|
367,521 -> 367,185
|
||||||
|
355,356 -> 503,356
|
||||||
|
306,780 -> 41,780
|
||||||
|
783,779 -> 513,779
|
||||||
|
81,886 -> 81,531
|
||||||
|
403,592 -> 69,926
|
||||||
|
575,458 -> 575,709
|
||||||
|
406,695 -> 406,563
|
||||||
|
342,690 -> 269,690
|
||||||
|
712,766 -> 712,693
|
||||||
|
929,608 -> 929,355
|
||||||
|
562,750 -> 571,759
|
||||||
|
353,780 -> 424,780
|
||||||
|
296,111 -> 944,759
|
||||||
|
341,28 -> 859,28
|
||||||
|
415,28 -> 415,153
|
||||||
|
104,16 -> 966,878
|
||||||
|
554,780 -> 726,780
|
||||||
|
749,645 -> 749,466
|
||||||
|
188,724 -> 933,724
|
||||||
|
806,185 -> 614,185
|
||||||
|
244,181 -> 682,181
|
||||||
|
104,937 -> 367,937
|
||||||
|
400,116 -> 183,333
|
||||||
|
749,94 -> 301,542
|
||||||
|
638,543 -> 811,716
|
||||||
|
694,727 -> 694,44
|
||||||
|
46,259 -> 46,721
|
||||||
|
467,748 -> 620,595
|
||||||
|
739,543 -> 391,543
|
||||||
|
734,454 -> 734,101
|
||||||
|
200,954 -> 200,654
|
||||||
|
592,358 -> 592,581
|
||||||
|
758,29 -> 758,401
|
||||||
|
386,685 -> 519,685
|
||||||
|
538,294 -> 298,294
|
||||||
|
82,269 -> 766,269
|
||||||
|
840,114 -> 332,114
|
||||||
|
924,542 -> 185,542
|
||||||
|
936,311 -> 369,878
|
||||||
|
820,724 -> 590,724
|
||||||
|
277,689 -> 68,689
|
||||||
|
76,634 -> 167,634
|
||||||
|
255,503 -> 144,503
|
||||||
|
753,915 -> 753,27
|
||||||
|
288,329 -> 513,554
|
||||||
|
729,297 -> 447,297
|
||||||
|
128,533 -> 128,530
|
||||||
|
252,718 -> 856,114
|
||||||
|
947,498 -> 312,498
|
||||||
|
142,917 -> 950,109
|
||||||
|
815,845 -> 770,845
|
||||||
|
863,98 -> 332,98
|
||||||
|
927,694 -> 927,276
|
||||||
|
682,232 -> 227,687
|
||||||
|
640,474 -> 840,274
|
||||||
|
98,37 -> 98,149
|
||||||
|
203,170 -> 99,170
|
||||||
|
736,956 -> 736,539
|
||||||
|
686,384 -> 882,580
|
||||||
|
976,152 -> 380,748
|
||||||
|
80,859 -> 80,208
|
||||||
|
687,252 -> 687,748
|
||||||
|
819,978 -> 101,260
|
||||||
|
17,722 -> 17,306
|
||||||
|
99,96 -> 99,929
|
||||||
|
713,757 -> 157,201
|
||||||
|
469,986 -> 469,393
|
||||||
|
813,210 -> 789,186
|
||||||
|
360,319 -> 360,43
|
||||||
|
777,707 -> 606,707
|
||||||
|
928,413 -> 380,961
|
||||||
|
566,850 -> 828,850
|
||||||
|
380,650 -> 717,650
|
||||||
|
863,889 -> 373,399
|
||||||
|
521,97 -> 967,97
|
||||||
|
12,989 -> 975,26
|
||||||
|
965,974 -> 965,848
|
||||||
|
639,331 -> 639,948
|
||||||
|
815,731 -> 235,151
|
||||||
|
823,369 -> 610,369
|
||||||
|
22,930 -> 898,54
|
||||||
|
635,113 -> 635,495
|
||||||
|
462,123 -> 771,123
|
||||||
|
445,274 -> 304,133
|
||||||
|
743,633 -> 43,633
|
||||||
|
811,267 -> 811,936
|
||||||
|
745,549 -> 636,549
|
||||||
|
321,720 -> 511,530
|
||||||
|
949,138 -> 308,138
|
||||||
|
563,34 -> 720,191
|
||||||
|
449,313 -> 966,830
|
||||||
|
857,308 -> 392,773
|
||||||
|
244,80 -> 820,80
|
||||||
|
212,345 -> 327,460
|
||||||
|
28,941 -> 28,22
|
||||||
|
122,988 -> 122,50
|
||||||
|
51,889 -> 880,60
|
||||||
|
328,161 -> 328,820
|
||||||
|
703,639 -> 40,639
|
||||||
|
107,47 -> 839,779
|
||||||
|
338,260 -> 828,750
|
||||||
|
947,304 -> 276,975
|
||||||
|
509,281 -> 281,281
|
||||||
|
200,42 -> 820,662
|
||||||
|
728,940 -> 728,897
|
||||||
|
511,770 -> 376,635
|
||||||
|
197,99 -> 929,99
|
||||||
|
699,648 -> 352,301
|
||||||
|
915,291 -> 256,950
|
||||||
|
641,586 -> 641,346
|
||||||
|
337,722 -> 965,722
|
||||||
|
739,92 -> 739,884
|
||||||
|
656,676 -> 649,676
|
||||||
|
369,450 -> 686,450
|
||||||
|
33,672 -> 409,296
|
||||||
|
336,979 -> 336,595
|
||||||
|
95,289 -> 888,289
|
||||||
|
286,128 -> 985,827
|
||||||
|
471,300 -> 899,300
|
||||||
|
824,959 -> 66,201
|
||||||
|
884,104 -> 166,822
|
||||||
|
562,681 -> 562,948
|
||||||
|
987,974 -> 77,64
|
||||||
|
61,47 -> 61,528
|
||||||
|
359,647 -> 709,647
|
||||||
|
34,398 -> 270,398
|
||||||
|
526,66 -> 257,335
|
||||||
|
744,545 -> 502,787
|
||||||
|
805,726 -> 728,803
|
||||||
|
184,749 -> 184,839
|
||||||
|
136,148 -> 842,148
|
||||||
|
538,244 -> 306,476
|
||||||
|
202,698 -> 958,698
|
||||||
|
264,519 -> 903,519
|
||||||
|
367,310 -> 26,310
|
||||||
|
391,747 -> 307,831
|
||||||
|
580,945 -> 706,945
|
||||||
|
199,776 -> 98,776
|
||||||
|
408,242 -> 408,474
|
||||||
|
929,706 -> 929,570
|
||||||
|
351,524 -> 221,524
|
||||||
|
773,783 -> 274,783
|
||||||
|
770,790 -> 770,653
|
||||||
|
572,182 -> 572,574
|
||||||
|
979,13 -> 29,963
|
||||||
|
175,454 -> 457,736
|
||||||
|
170,399 -> 170,202
|
||||||
|
570,406 -> 97,406
|
||||||
|
813,37 -> 556,37
|
||||||
|
80,886 -> 465,501
|
||||||
|
317,799 -> 876,799
|
||||||
|
602,399 -> 362,639
|
||||||
|
891,257 -> 445,257
|
||||||
|
346,275 -> 297,275
|
||||||
|
345,136 -> 345,755
|
||||||
|
252,460 -> 252,731
|
||||||
|
17,573 -> 729,573
|
||||||
|
901,838 -> 230,167
|
||||||
|
754,582 -> 754,970
|
||||||
|
415,964 -> 415,605
|
||||||
|
857,758 -> 857,612
|
||||||
|
319,613 -> 256,613
|
||||||
|
34,614 -> 34,802
|
||||||
|
443,118 -> 443,891
|
||||||
|
335,300 -> 80,45
|
||||||
|
284,340 -> 552,608
|
||||||
|
154,31 -> 33,31
|
||||||
|
440,720 -> 20,720
|
||||||
|
331,219 -> 311,219
|
||||||
|
163,83 -> 868,788
|
||||||
|
775,733 -> 775,284
|
||||||
|
859,240 -> 859,159
|
||||||
|
144,249 -> 105,210
|
||||||
|
710,809 -> 710,910
|
||||||
|
76,481 -> 76,86
|
||||||
|
825,603 -> 916,603
|
||||||
|
404,575 -> 740,575
|
||||||
|
612,427 -> 612,571
|
||||||
|
63,765 -> 63,538
|
||||||
|
979,170 -> 183,966
|
||||||
|
781,372 -> 911,372
|
||||||
|
237,732 -> 321,648
|
||||||
|
457,474 -> 954,971
|
||||||
|
887,110 -> 551,446
|
||||||
|
894,962 -> 48,116
|
||||||
|
276,534 -> 800,534
|
||||||
|
40,42 -> 950,952
|
||||||
|
986,941 -> 123,78
|
||||||
|
348,857 -> 899,857
|
||||||
|
57,728 -> 57,802
|
||||||
|
776,536 -> 776,462
|
||||||
|
683,618 -> 683,443
|
||||||
|
468,914 -> 750,914
|
||||||
|
420,129 -> 984,693
|
||||||
|
254,913 -> 166,913
|
||||||
|
832,737 -> 832,422
|
||||||
|
472,724 -> 12,724
|
||||||
|
483,916 -> 483,226
|
||||||
|
206,751 -> 206,250
|
||||||
|
890,901 -> 20,31
|
||||||
|
156,198 -> 883,925
|
||||||
|
972,367 -> 67,367
|
||||||
|
409,196 -> 320,196
|
||||||
|
59,188 -> 815,188
|
||||||
|
856,856 -> 856,756
|
||||||
|
84,871 -> 942,13
|
||||||
|
475,91 -> 475,784
|
||||||
|
363,578 -> 363,405
|
||||||
|
219,976 -> 219,717
|
||||||
|
243,25 -> 243,173
|
||||||
|
115,194 -> 462,194
|
||||||
|
91,960 -> 889,162
|
||||||
|
20,957 -> 915,62
|
||||||
|
60,955 -> 250,765
|
||||||
|
882,707 -> 267,92
|
||||||
|
122,626 -> 122,202
|
||||||
|
705,74 -> 147,632
|
||||||
|
418,122 -> 976,680
|
||||||
|
500,522 -> 936,522
|
||||||
|
715,652 -> 82,19
|
||||||
|
118,872 -> 118,479
|
||||||
|
918,70 -> 918,811
|
||||||
|
968,968 -> 347,347
|
||||||
|
985,479 -> 587,877
|
||||||
|
749,259 -> 749,841
|
||||||
|
475,102 -> 200,102
|
||||||
|
808,976 -> 515,976
|
||||||
|
761,726 -> 761,358
|
||||||
|
778,523 -> 729,474
|
||||||
|
266,251 -> 396,251
|
||||||
|
46,921 -> 914,921
|
||||||
|
384,424 -> 804,844
|
||||||
|
442,359 -> 646,155
|
||||||
|
929,774 -> 920,783
|
||||||
|
344,958 -> 344,281
|
||||||
|
33,173 -> 607,173
|
||||||
|
40,125 -> 897,982
|
||||||
|
345,640 -> 432,640
|
||||||
|
845,170 -> 403,612
|
||||||
|
763,84 -> 763,885
|
||||||
|
855,388 -> 123,388
|
||||||
|
861,858 -> 861,940
|
||||||
|
449,736 -> 97,384
|
||||||
|
576,592 -> 906,262
|
||||||
|
868,817 -> 868,633
|
||||||
|
14,100 -> 610,696
|
||||||
|
878,412 -> 416,412
|
||||||
|
43,427 -> 118,502
|
||||||
|
250,829 -> 770,829
|
||||||
|
814,444 -> 814,769
|
||||||
|
647,857 -> 528,857
|
||||||
|
648,102 -> 514,102
|
||||||
|
956,12 -> 887,12
|
||||||
|
665,957 -> 665,891
|
||||||
|
760,367 -> 178,949
|
||||||
|
704,524 -> 815,524
|
||||||
|
269,88 -> 322,88
|
||||||
|
414,881 -> 414,788
|
||||||
|
550,696 -> 550,788
|
||||||
|
624,367 -> 391,367
|
||||||
|
133,536 -> 432,835
|
||||||
|
635,154 -> 169,154
|
||||||
|
396,149 -> 396,166
|
||||||
|
796,505 -> 886,505
|
||||||
|
348,235 -> 530,235
|
||||||
|
428,851 -> 240,851
|
||||||
|
535,441 -> 637,441
|
||||||
|
661,175 -> 782,175
|
||||||
|
589,780 -> 99,290
|
||||||
|
771,746 -> 771,239
|
||||||
|
16,567 -> 821,567
|
||||||
|
320,572 -> 320,136
|
||||||
|
200,990 -> 513,990
|
||||||
|
984,987 -> 11,14
|
||||||
|
60,712 -> 60,137
|
||||||
|
629,405 -> 738,405
|
||||||
|
541,536 -> 541,225
|
||||||
|
250,579 -> 507,579
|
||||||
|
825,264 -> 974,264
|
||||||
|
380,832 -> 262,832
|
||||||
|
598,695 -> 598,159
|
||||||
|
716,782 -> 418,782
|
||||||
|
124,698 -> 713,698
|
||||||
|
930,83 -> 212,801
|
||||||
|
389,287 -> 344,287
|
||||||
|
571,788 -> 106,788
|
||||||
|
519,498 -> 135,114
|
||||||
|
281,761 -> 221,761
|
||||||
|
295,133 -> 295,654
|
||||||
|
686,960 -> 592,960
|
||||||
|
984,495 -> 984,913
|
||||||
|
677,751 -> 677,102
|
||||||
|
252,326 -> 252,824
|
||||||
|
921,500 -> 357,500
|
||||||
|
608,908 -> 608,381
|
||||||
|
587,878 -> 587,677
|
||||||
|
392,929 -> 449,929
|
||||||
|
239,444 -> 822,444
|
||||||
|
87,897 -> 252,897
|
||||||
|
865,887 -> 368,887
|
||||||
|
368,934 -> 368,308
|
||||||
|
64,950 -> 182,950
|
||||||
|
747,429 -> 636,540
|
||||||
|
378,109 -> 378,865
|
||||||
|
187,266 -> 856,935
|
||||||
|
159,769 -> 708,769
|
||||||
|
71,119 -> 892,940
|
||||||
|
629,825 -> 87,283
|
||||||
|
900,903 -> 900,656
|
||||||
|
749,703 -> 812,703
|
||||||
|
225,421 -> 842,421
|
||||||
|
15,896 -> 837,74
|
||||||
|
800,887 -> 58,145
|
||||||
|
456,798 -> 679,798
|
||||||
|
434,963 -> 434,166
|
||||||
|
508,491 -> 976,959
|
||||||
|
809,540 -> 809,614
|
||||||
|
624,632 -> 975,983
|
||||||
|
733,102 -> 195,640
|
||||||
|
83,691 -> 623,151
|
||||||
|
140,257 -> 29,257
|
||||||
|
429,934 -> 429,482
|
||||||
|
702,91 -> 702,137
|
||||||
|
986,185 -> 986,386
|
||||||
|
84,920 -> 448,920
|
||||||
|
927,779 -> 927,679
|
||||||
|
903,345 -> 546,345
|
||||||
|
303,523 -> 303,862
|
||||||
|
360,877 -> 360,202
|
||||||
|
544,593 -> 544,802
|
||||||
|
27,192 -> 27,837
|
||||||
|
105,24 -> 574,24
|
||||||
|
955,783 -> 556,384
|
||||||
|
416,85 -> 416,322
|
||||||
|
923,139 -> 553,139
|
||||||
|
527,523 -> 828,523
|
||||||
|
788,320 -> 949,320
|
||||||
|
391,652 -> 391,166
|
||||||
|
754,378 -> 607,378
|
||||||
|
563,409 -> 563,27
|
||||||
|
285,169 -> 285,883
|
||||||
|
16,10 -> 988,982
|
||||||
|
452,563 -> 452,479
|
||||||
|
881,800 -> 881,542
|
||||||
|
564,272 -> 457,272
|
||||||
|
887,441 -> 887,298
|
||||||
|
941,837 -> 119,15
|
||||||
|
606,137 -> 606,152
|
||||||
|
135,472 -> 135,322
|
||||||
|
881,775 -> 881,132
|
||||||
|
566,263 -> 406,103
|
||||||
|
912,696 -> 912,965
|
||||||
|
123,554 -> 123,911
|
||||||
|
735,737 -> 533,939
|
||||||
|
61,197 -> 534,197
|
||||||
|
91,856 -> 91,465
|
||||||
|
624,411 -> 624,247
|
||||||
|
607,899 -> 607,786
|
||||||
|
139,408 -> 466,735
|
||||||
|
89,274 -> 545,730
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
0,9 -> 5,9
|
||||||
|
8,0 -> 0,8
|
||||||
|
9,4 -> 3,4
|
||||||
|
2,2 -> 2,1
|
||||||
|
7,0 -> 7,4
|
||||||
|
6,4 -> 2,0
|
||||||
|
0,9 -> 2,9
|
||||||
|
3,4 -> 1,4
|
||||||
|
0,0 -> 8,8
|
||||||
|
5,5 -> 8,2
|
||||||
|
|
@ -0,0 +1,95 @@
|
||||||
|
use std::{
|
||||||
|
collections::HashMap,
|
||||||
|
io::{BufRead, BufReader},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
nums: Vec<u64>,
|
||||||
|
}
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input2 {
|
||||||
|
occurances: HashMap<u8, u64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_line(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let nums = buf
|
||||||
|
.split_terminator(',')
|
||||||
|
.map(|n| n.trim_end().parse().unwrap())
|
||||||
|
.collect();
|
||||||
|
Input { nums }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input_2(test_mode: TestMode) -> Input2 {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_line(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let mut occurances = HashMap::new();
|
||||||
|
buf.split_terminator(',').for_each(|n| {
|
||||||
|
let n = n.trim_end().parse().unwrap();
|
||||||
|
let e = occurances.entry(n).or_insert(0);
|
||||||
|
*e += 1;
|
||||||
|
});
|
||||||
|
|
||||||
|
Input2 { occurances }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn lanternfish_1(test_mode: TestMode) {
|
||||||
|
const NUM_DAYS: isize = 80;
|
||||||
|
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
// println!("{:?}", input);
|
||||||
|
|
||||||
|
let mut current_gen = input.nums;
|
||||||
|
for _d in 0..NUM_DAYS {
|
||||||
|
let mut next_gen: Vec<u64> = Vec::new();
|
||||||
|
for fish in current_gen {
|
||||||
|
if fish == 0 {
|
||||||
|
next_gen.push(6);
|
||||||
|
next_gen.push(8);
|
||||||
|
} else {
|
||||||
|
next_gen.push(fish - 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// println!("day {} - {:?}", d, next_gen);
|
||||||
|
|
||||||
|
current_gen = next_gen;
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{}", current_gen.len());
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn lanternfish_2(test_mode: TestMode) {
|
||||||
|
const NUM_DAYS: isize = 256;
|
||||||
|
|
||||||
|
let input = parse_input_2(test_mode);
|
||||||
|
// println!("{:?}", input);
|
||||||
|
|
||||||
|
let mut current_gen = input.occurances;
|
||||||
|
for _d in 0..NUM_DAYS {
|
||||||
|
let mut next_gen = HashMap::new();
|
||||||
|
|
||||||
|
for fish in current_gen {
|
||||||
|
if fish.0 == 0 {
|
||||||
|
*next_gen.entry(6).or_insert(0) += fish.1;
|
||||||
|
*next_gen.entry(8).or_insert(0) += fish.1;
|
||||||
|
} else {
|
||||||
|
*next_gen.entry(fish.0 - 1).or_insert(0) += fish.1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// println!("day {} - {:?}", d, next_gen);
|
||||||
|
|
||||||
|
current_gen = next_gen;
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{}", current_gen.values().sum::<u64>());
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
5,1,5,3,2,2,3,1,1,4,2,4,1,2,1,4,1,1,5,3,5,1,5,3,1,2,4,4,1,1,3,1,1,3,1,1,5,1,5,4,5,4,5,1,3,2,4,3,5,3,5,4,3,1,4,3,1,1,1,4,5,1,1,1,2,1,2,1,1,4,1,4,1,1,3,3,2,2,4,2,1,1,5,3,1,3,1,1,4,3,3,3,1,5,2,3,1,3,1,5,2,2,1,2,1,1,1,3,4,1,1,1,5,4,1,1,1,4,4,2,1,5,4,3,1,2,5,1,1,1,1,2,1,5,5,1,1,1,1,3,1,4,1,3,1,5,1,1,1,5,5,1,4,5,4,5,4,3,3,1,3,1,1,5,5,5,5,1,2,5,4,1,1,1,2,2,1,3,1,1,2,4,2,2,2,1,1,2,2,1,5,2,1,1,2,1,3,1,3,2,2,4,3,1,2,4,5,2,1,4,5,4,2,1,1,1,5,4,1,1,4,1,4,3,1,2,5,2,4,1,1,5,1,5,4,1,1,4,1,1,5,5,1,5,4,2,5,2,5,4,1,1,4,1,2,4,1,2,2,2,1,1,1,5,5,1,2,5,1,3,4,1,1,1,1,5,3,4,1,1,2,1,1,3,5,5,2,3,5,1,1,1,5,4,3,4,2,2,1,3
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
3,4,3,1,2
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
use std::io::{BufRead, BufReader};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
nums: Vec<i64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_line(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let nums = buf
|
||||||
|
.split_terminator(',')
|
||||||
|
.map(|n| n.trim_end().parse().unwrap())
|
||||||
|
.collect();
|
||||||
|
Input { nums }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn the_treachery_of_whales_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
let min = *input.nums.iter().min().unwrap();
|
||||||
|
let max = *input.nums.iter().max().unwrap();
|
||||||
|
|
||||||
|
let mut best_sum = i64::MAX;
|
||||||
|
let mut best_pos = i64::MAX;
|
||||||
|
for p in min..=max {
|
||||||
|
let new_sum = input.nums.iter().map(|n| (n - p).abs()).sum();
|
||||||
|
if new_sum < best_sum {
|
||||||
|
best_sum = new_sum;
|
||||||
|
best_pos = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{} fuel @ pos {}", best_sum, best_pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn the_treachery_of_whales_2(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
let min = *input.nums.iter().min().unwrap();
|
||||||
|
let max = *input.nums.iter().max().unwrap();
|
||||||
|
|
||||||
|
let mut best_sum = i64::MAX;
|
||||||
|
let mut best_pos = i64::MAX;
|
||||||
|
for p in min..=max {
|
||||||
|
let new_sum = input
|
||||||
|
.nums
|
||||||
|
.iter()
|
||||||
|
.map(|n| {
|
||||||
|
let d = (n - p).abs();
|
||||||
|
d * (1 + d) / 2
|
||||||
|
})
|
||||||
|
.sum();
|
||||||
|
|
||||||
|
if new_sum < best_sum {
|
||||||
|
best_sum = new_sum;
|
||||||
|
best_pos = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{} fuel @ pos {}", best_sum, best_pos);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
1101,1,29,67,1102,0,1,65,1008,65,35,66,1005,66,28,1,67,65,20,4,0,1001,65,1,65,1106,0,8,99,35,67,101,99,105,32,110,39,101,115,116,32,112,97,115,32,117,110,101,32,105,110,116,99,111,100,101,32,112,114,111,103,114,97,109,10,51,812,37,278,203,12,1699,10,24,482,200,197,433,141,1854,148,529,748,46,1366,41,329,300,29,159,767,661,238,586,940,139,1606,273,1093,1687,694,232,1069,264,162,752,250,138,471,828,72,285,136,817,258,586,308,191,478,43,750,570,38,207,1221,434,124,1410,125,743,7,827,963,873,263,478,938,686,250,1022,7,917,717,1354,618,639,24,113,417,550,279,919,736,75,117,1173,32,172,88,1435,15,442,232,272,102,253,113,173,86,57,536,1282,111,18,197,117,738,427,910,740,861,90,706,520,8,1,129,80,79,36,788,1545,119,971,1435,945,808,821,1080,227,1257,973,39,303,818,669,7,197,819,1683,50,2,1248,1459,669,210,653,978,76,509,173,304,183,228,45,1032,672,792,12,540,839,135,153,55,29,1190,42,395,626,487,54,831,956,1,1012,1461,929,561,34,733,629,49,146,469,220,1368,89,265,128,521,402,557,1121,853,240,655,100,341,137,525,371,288,1389,430,1148,398,130,174,176,982,74,923,1438,469,572,33,261,126,456,300,174,27,60,1052,428,196,403,394,392,40,474,27,351,194,619,657,722,181,300,448,1037,525,1388,854,1459,967,211,46,1708,1175,1225,613,1315,479,973,573,324,887,2,116,752,447,3,1074,1135,72,595,601,632,511,1349,267,164,6,1300,172,412,3,298,1120,93,161,176,141,150,67,37,144,421,45,1451,781,1120,205,487,344,372,150,136,614,265,536,1740,265,1367,0,322,204,76,97,1112,717,444,418,279,943,597,309,322,205,1167,292,18,383,367,621,770,13,243,1641,500,313,785,106,184,310,615,248,664,98,221,740,450,460,7,23,1226,183,75,449,806,721,1057,266,254,1083,0,125,27,151,16,664,73,94,44,1347,73,325,958,475,862,1096,1523,114,307,1418,46,113,188,462,194,535,282,1144,26,1106,1465,39,133,445,177,481,233,696,181,72,1466,747,266,44,311,1061,505,140,956,360,716,98,844,1059,305,162,1679,817,873,969,793,1079,320,318,70,417,1170,628,1628,1515,894,482,1757,423,1024,267,1280,10,474,806,684,378,425,816,243,388,27,116,569,777,946,593,646,91,639,508,63,405,1310,639,380,323,75,860,67,42,58,198,35,58,180,75,530,25,194,1743,476,1092,795,243,121,1326,409,1300,218,1393,371,64,412,209,255,648,480,71,125,1398,45,1035,1245,1426,1765,596,187,353,0,261,774,958,1303,397,1024,1076,1225,307,69,789,307,450,143,203,259,21,2,297,963,1236,1292,595,784,100,1194,1246,1820,534,58,244,12,194,1316,211,368,192,741,1232,23,87,551,291,12,512,6,42,1513,619,62,1339,375,743,137,1486,254,53,274,299,1443,844,899,753,414,241,161,52,163,66,86,503,823,528,150,376,403,1346,125,363,412,774,374,1090,1001,177,1379,74,193,49,92,294,679,108,228,199,1203,324,64,321,89,601,32,46,1274,519,1089,1107,63,379,1062,1034,129,736,716,156,526,445,1,299,388,444,1080,1016,101,735,315,517,13,390,537,155,140,1119,975,259,254,402,277,1160,372,55,392,1022,1119,4,735,266,260,1550,389,824,1426,23,65,480,151,176,1761,0,16,139,152,383,358,1155,95,1138,310,232,71,1073,22,1,335,1168,792,136,902,33,204,59,146,1063,1012,103,1083,160,885,445,499,473,278,451,191,1940,249,37,722,325,495,615,70,85,50,107,560,597,75,206,767,990,113,530,94,1343,250,116,67,417,390,500,633,736,132,473,646,1502,249,119,228,3,64,212,19,1005,324,14,418,619,847,20,878,533,204,49,820,216,34,60,62,119,680,88,359,8,473,882,138,387,297,419,664,693,420,101,53,829,3,101,272,726,639,368,363,0,33,70,0,626,525,364,784,271,73,536,318,598,794,34,314,1248,1596,764,34,202,1383,635,158,1095,76,0,119,176,1158,301,409,796,242,1765,808,59,0,278,4,8,359,1111,818,931,220,109,292,353,532,750,333,223,725,1476,199,1,201,55,72,117,37,210,400,108,619,863,187,372,15,574,380,635,332,1,1210,64,897,501,12,822,508,250,263,1044,72,15,210,901,219,471,292,179,572,733,422,1354,1197,202,538,662,261,973,0,465,522,412,9,166,325,237,757,115,1046,273,549,174,30,96,215,113,7,1032,671,262,202,332,1078,629,555,26,8,29,349,206,123,1093,673,1356,513,1454,518,1240,337,96,115,1160,17,331,1450,114,107,782,995,168
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
16,1,2,0,4,2,7,1,2,14
|
||||||
|
|
@ -0,0 +1,128 @@
|
||||||
|
use std::{
|
||||||
|
collections::HashSet,
|
||||||
|
io::{BufRead, BufReader},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Display {
|
||||||
|
patterns: Vec<HashSet<char>>,
|
||||||
|
output_values: Vec<HashSet<char>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
displays: Vec<Display>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
|
||||||
|
let mut displays: Vec<Display> = vec![];
|
||||||
|
|
||||||
|
let mut br = BufReader::new(f);
|
||||||
|
loop {
|
||||||
|
let mut buf = String::new();
|
||||||
|
br.read_line(&mut buf).unwrap();
|
||||||
|
if buf.is_empty() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut s = buf.split_terminator(" | ");
|
||||||
|
let patterns: Vec<_> = s
|
||||||
|
.next()
|
||||||
|
.unwrap()
|
||||||
|
.split_ascii_whitespace()
|
||||||
|
.map(|s| s.to_owned())
|
||||||
|
.collect();
|
||||||
|
let output_values: Vec<_> = s
|
||||||
|
.next()
|
||||||
|
.unwrap()
|
||||||
|
.split_ascii_whitespace()
|
||||||
|
.map(|s| s.to_owned())
|
||||||
|
.collect();
|
||||||
|
displays.push(Display {
|
||||||
|
patterns: patterns.into_iter().map(|p| p.chars().collect()).collect(),
|
||||||
|
output_values: output_values
|
||||||
|
.into_iter()
|
||||||
|
.map(|p| p.chars().collect())
|
||||||
|
.collect(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
Input { displays }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn seven_segment_search_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
let mut n = 0;
|
||||||
|
for display in input.displays {
|
||||||
|
for p in display.output_values {
|
||||||
|
if [2, 4, 3, 7].contains(&p.len()) {
|
||||||
|
n += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", n);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn filter_num_segments(display: &Display, n: usize) -> Vec<HashSet<char>> {
|
||||||
|
display
|
||||||
|
.patterns
|
||||||
|
.clone()
|
||||||
|
.into_iter()
|
||||||
|
.filter(|p| p.len() == n)
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn solve_display(display: &Display) -> usize {
|
||||||
|
let one = filter_num_segments(display, 2).into_iter().next().unwrap();
|
||||||
|
let four = filter_num_segments(display, 4).into_iter().next().unwrap();
|
||||||
|
let seven = filter_num_segments(display, 3).into_iter().next().unwrap();
|
||||||
|
let eight = filter_num_segments(display, 7).into_iter().next().unwrap();
|
||||||
|
|
||||||
|
let size_6 = filter_num_segments(display, 6);
|
||||||
|
let f_char = size_6
|
||||||
|
.iter()
|
||||||
|
.find_map(|d| {
|
||||||
|
if one.is_subset(d) {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(*one.intersection(d).next().unwrap())
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.unwrap();
|
||||||
|
let c_char = *one
|
||||||
|
.difference(&[f_char].into_iter().collect())
|
||||||
|
.next()
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
let size_5 = filter_num_segments(display, 5);
|
||||||
|
let five = size_5.iter().find(|d| !d.contains(&c_char)).unwrap();
|
||||||
|
let two = size_5.iter().find(|d| !d.contains(&f_char)).unwrap();
|
||||||
|
let three = size_5.iter().find(|d| one.is_subset(d)).unwrap();
|
||||||
|
|
||||||
|
let six = size_6.iter().find(|d| !d.contains(&c_char)).unwrap();
|
||||||
|
let nine = size_6.iter().find(|d| four.is_subset(d)).unwrap();
|
||||||
|
let zero = size_6.iter().find(|d| !five.is_subset(d)).unwrap();
|
||||||
|
|
||||||
|
let digits = [
|
||||||
|
zero, &one, two, three, &four, five, six, &seven, &eight, nine,
|
||||||
|
];
|
||||||
|
|
||||||
|
let mut sum = 0;
|
||||||
|
for number in display.output_values.iter() {
|
||||||
|
let value = digits.iter().position(|p| p == &number).unwrap();
|
||||||
|
sum = 10 * sum + value;
|
||||||
|
}
|
||||||
|
sum
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn seven_segment_search_2(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
let sum: usize = input.displays.iter().map(solve_display).sum();
|
||||||
|
println!("{}", sum);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,200 @@
|
||||||
|
bgcfda gecbda abdgf aedfbg eda efcbd ae agfe bdefagc fbeda | ae egdafb ea fcdeb
|
||||||
|
gfadb fbagcd cagf agecdb adg fdbcg bdcfaeg bcgfde ga efbda | cbfdge dfcebga aedcgb dgbfa
|
||||||
|
bgdeca agdbe gfb fdbgce bf eafb dfgab efbgdca gebafd dgcaf | gfbdea gfb bacedg adcgf
|
||||||
|
fbc becgdf fcbdg adcgf edafgb bgec dcgfbea gbfed bc cbeafd | gfacd gcbdf bgedfa cbdefa
|
||||||
|
ad dcafeb adcef feagc egdbaf aed cadb bgcedf cbeafgd cdfeb | dabc gabefd ecfdb ecgfbd
|
||||||
|
badcgf gdaf gadbc ebfcg fceabd gacdbe gedfbac dbf df dfcgb | df adfg cbfgad fdb
|
||||||
|
cfdb dca bdgca efgbad bafcgd fgdba cgdfea cd abdfegc bagec | agcbe adc dabcgf adc
|
||||||
|
egdab gcefd ecbgd gdebcaf eacb cb bagcdf abgfde dcegab bdc | bc gedbc dcb fgdec
|
||||||
|
gefa gedabf cfdbea bdfea bdegcfa dgbfa gfd gdcab fg fecbdg | fgd gf dbfage afbdec
|
||||||
|
fagdb be abdfe agfebdc eab aefdcb acfed bdec fceadg afegcb | be aegcfb efbcag eb
|
||||||
|
fdce fcadeg afegdb adceg cgafdb de ebcga dae cdagf abdfgce | efcd efacgd edfc afgcd
|
||||||
|
gefc defca aefbd ec gfdceba dcabge fgcad cae fcadeg bagfdc | fgcad bdfea ebadgcf ce
|
||||||
|
cdabe dcg cgef gc beadgf fegbd gcbde edgcfb gecfabd fdgcba | dcg deacb fdegab bdafgc
|
||||||
|
aefc ebcdfa eabfgd deacb ac dac gdbce gfbadce fdeba gcfbda | adc afdbe aefc ecdafb
|
||||||
|
eabfdg fdgba fac fc ebdac bfcg fcdabg bgdface bacdf fgedca | fdagcb cedba cf fc
|
||||||
|
db dbg debag fcgdeb gfeba dagfec ceadg bdfecga deagcb acbd | gbdae afebg cfedgba ecdagb
|
||||||
|
cabegd befcd aefdcb defbcag dgfb gd edg bfgecd gfdce eagfc | dbgacfe efcdg gd bdfagce
|
||||||
|
abde fbecag gcabde cefdg bgedc bgcea bgd becgdaf gdcfba bd | baegc egbdc cedgf gdfec
|
||||||
|
gedc eagbd bgadcef aebcdg dfbag eacfdb cabde fgecab ge aeg | gcbeda gabdfec dgecba gea
|
||||||
|
afedgc deabf gbfceda fg cgdea dgf bdgfec edgaf ebacgd gafc | fgd gfac cbefgad cagde
|
||||||
|
gfcbeda bfecda dgca ebgacd gbfae ecg gc gaebc cfgebd dbeca | dfcbea cegab cg cge
|
||||||
|
adefc eabdf bcafeg bd edb fcbeadg dabegc fdbg baegf fgaebd | fcead fcdea fbgd ecdbga
|
||||||
|
ac bedgc acdb gacbed bfgeadc degcfb aec cafdeg eagfb cegab | agecb gdbec abgcde agbef
|
||||||
|
cfgbead cfgdeb gafb baecd bg cgdba bgc adcfbg agfecd dcagf | dgcefb bgaf fdbcgae agcdf
|
||||||
|
agc dabc dcbgef efadgcb ebdgc baefg ac abgce ebdcag facdeg | ecbdgf ac afdgbec decfbg
|
||||||
|
fgdcb cbdeaf eabfcg cefdb gcbeadf cdeg gc afbdg cfg ecdgbf | cg eafbcd dgec cbfdge
|
||||||
|
da dbae fdaecb cdebgf afgced bedfc adf cbfeadg bdacf bfcag | dfbec egbdfc bdfca cefbd
|
||||||
|
abgfced cf cfdbe geacfd bfac bdacfe gdebc bfedga dcf bdafe | bcfa dbfce cf egdbc
|
||||||
|
dcagb feagbc dbef edafg fagebd bf fedgac fba bfagd dbcefga | fbdga dgafe cfabge fdbe
|
||||||
|
gbfce bfc acgb fbgaec bc acfedbg gface cgefad bfacde defgb | cbgfe bgfeca gacb degacf
|
||||||
|
cfgeda bac dbafg dbcfa bdfcage ecfb acedf cb ecfadb eacbgd | gafbd faced dacfb bcef
|
||||||
|
fbgec eca cbag cfegba ac efacb bgcedf caegdbf fecgad fdbea | ca acgb ebdfa agcb
|
||||||
|
acgbf cdabegf egbfd dc dacbef dacg gecabf fdc dbgfc dfcagb | dgabecf befgd acgd abgdefc
|
||||||
|
dagbfc bc agcdf cgbd bfc ebfad dfcba befgac gaecdf becdgaf | cdgb dbcg abfcdg cfb
|
||||||
|
bdcga ebdgca da cdeafg dac acfbg daeb cdbgef egbfcda bdegc | bcgad adgcbe fedacgb cegdb
|
||||||
|
gacfeb aefbg fbaegd cedgfb dfcba gc cgae abcdegf gacbf gbc | cfabd debfgac cega egca
|
||||||
|
abcfeg fdbegc ac bdafgec ebfad fcdae dcga fcged gdceaf ace | gbcfaed ebfda ac gefcab
|
||||||
|
gefbc gdeacf cag ac acgebf ceab adebcfg bfcag cgbfed bgfad | cga cagdef gac fcgba
|
||||||
|
gcbe gacfdbe dfgaeb bfecd ecdgfb dfcgae bef fcedg bcfad be | fadcb ebgc cbfda dfcab
|
||||||
|
ebcgfd dafe adcfg gfacde cfabge bcadg dfc fd fbdaceg gefac | fceadbg fcgabe fade fbeacg
|
||||||
|
fbacg cef cagebf gacefd ef bgced cfbeg dagcbf fbea cegfdab | eabf fce cdgeabf agefcb
|
||||||
|
bca gcadbfe ca edca fbgade dcageb ecbgf egacb ebadg dgcfba | cgafbd feagdb gabecd cba
|
||||||
|
fcebdg cgefb fagbce edcbg bfed eacbgfd cegda db bcd dfgcba | becdg cdbafg bedgfc cgbeafd
|
||||||
|
fcadebg edbafc cgfda decba egab gcadb gb debgfc cgbdae gdb | bgd agbe eadcbf gdb
|
||||||
|
cedfa gad ebcfda aedgc defagb gdafceb gebca dcfg dg edgacf | cdfg fadec gedac bcgae
|
||||||
|
dafegbc dcfbae dce fcebgd egdaf ecadf dfcbag acbe ec cafbd | ced dce ce ec
|
||||||
|
fegb ef bdcefg fabdgce efd fegdac cbdaf bcdef ecbdg acbedg | debgac edf ef dfacb
|
||||||
|
afgedb caedbg egfba baecf efgdb gbcadef fagd age cfegdb ag | afbec degbafc fceab eagbdc
|
||||||
|
cebd dfb dbecgaf gefcb afbegd bd fdcgb gfcebd cgdaf gfeacb | abecfg gacbfe cgfda bfceg
|
||||||
|
acdfgb ecbga ba ecgdafb deafgc aedgc aedb aecgdb bag gfecb | cgaefd gabce cdgbae ab
|
||||||
|
be fcgdae fcbag efdbcg ceb cfebg degb cdebfa fgdec gdcabfe | eb dfegc debg bce
|
||||||
|
fdecg dafgebc fgcae fgd bcfd bcged edbgfc aecdgb fbgade df | afbdecg bgfaed fcged bgedaf
|
||||||
|
cabd egdfa fbgac bcgafd ebdafgc bd eagbfc dgb fdabg cgbdef | bd bd dbg cbad
|
||||||
|
fgecba bd dgcbea gfeda gdb geacb ecbd bfadcg efcabdg bgade | dgbae befgacd ecbag afcebg
|
||||||
|
ga abefc afg fecadbg egfcbd dgfbac edgfac adbg fcgdb gbcfa | dbag fag fgdbcea dcbfeg
|
||||||
|
geacf cadfe bfaced fg fcdgae fged ebagc cfg edbfgac bfdacg | afcbged efadc fg fcg
|
||||||
|
cbd cdefbag cfadg bd bfdac abed fdabce dbegcf egabcf ecbfa | gcebdf faegcb ecdgbf fbeadcg
|
||||||
|
fagcde cgdfa daef acgde ecgadb dbcgf fca eacgbf gcafbde fa | cdage cebfga adceg deafcgb
|
||||||
|
feadgcb efcag dbfge edba dfcabg ebgfa ba gefbad ebgdcf bfa | abdefg daeb bfa fdgaecb
|
||||||
|
dgfcea becdfg bdefg abgdfec beg cgedf eb decb bgefac fgdab | beg fedgc egfacd fcedg
|
||||||
|
fcagbd adbfeg gbeda bgfde ebfcdg dfae gaceb gda ad fdbcaeg | agd gdeba fdgeab ebcga
|
||||||
|
dbcefa bfaegd fdcb fdeca agceb fcabe cfaged beagdfc fab fb | edabgf gcabe adefbc fba
|
||||||
|
eac cfgeab agdfc cdgbe gdbefc dabe gefdbca abcged ea agecd | baegdcf bfcegd gdbfce gfcebd
|
||||||
|
cdbeaf cd dcf adcgfeb defab gbfca dgbafe cead fdcab bcefdg | dfcabe fcd dc cdfgeb
|
||||||
|
gdcfbe bag dcebg dgabce cfgdba geacb bdea ba febcagd faegc | gcfea dgbfec fecag cefbgd
|
||||||
|
ebfdgc baecdfg gabfe acbg bce dgabef cdeaf gfabce ecafb cb | eabcf gdfebc egfabc gafbed
|
||||||
|
dbgacfe adgcf cedafb ecbad bdfe bf egcdab abfgec fab cbfad | bdfe fba bcfead abedc
|
||||||
|
dca afdcb befagc gacedf dbecf cgfabd da dbag ceabfdg afbgc | da adgb gfedcba dabfcg
|
||||||
|
fgcda bcgf cgfeda bfdcga gbd badfg cebafdg gcadeb bg dfbea | fcbg geacfd abfgcd bafgcde
|
||||||
|
cf gacbfe feadcb cdgaeb fbcd fcdae efdag ecf gcabedf edacb | ecabgd gbcfaed gebcad efdac
|
||||||
|
ae abcefdg faedbg agedf dgbfce gabcfe adfcg dfbge efa bdae | dcfebg fae agfdbe egfdba
|
||||||
|
fegdcab dgcaf bfd fgdab edcgaf eadgb fbcg deacbf fb gbdcfa | acefdb gdcaf fcgda gabde
|
||||||
|
ca cefa bgcfed facdbe dgbfeca adc dbacfg cabde edabg fcbde | dcbefa bedfc dfcgab dbfacg
|
||||||
|
ce bgcedf cgdef gdabfe cabefd dec aegfdcb dgcfa gcbe fgbde | cegb dce aedbfc ce
|
||||||
|
fcgaebd ef febdac feb cafbd edcfb fabecg acbdgf dfae ebgcd | feb bfe fegacb bafdec
|
||||||
|
fgdec adcb dfbega afcgeb egcbd db bcaeg beagdc dbgfcae deb | bd egcdab fecdg bed
|
||||||
|
ad dcaeg edcbag fgbdeac acd gcdfeb afegc ebda cadbfg dgbce | bfgadc dca ad cda
|
||||||
|
bdegaf egfdb afb acbegdf fgdba af feda bcfgea fbdecg abgdc | fdegb fabecg degabf adgbef
|
||||||
|
gdfbe gcf gbcda cadfbg cfdbg gceafb dfca badegc cf cedgbfa | fc fcg egcabfd bdcag
|
||||||
|
fcbag ebdcgfa ce fgaced fbgeca gfbec cgdfba fbgde efc aecb | beac ce cgbfe bfegd
|
||||||
|
dcgaef gedfb fegdabc eabfdg dgc cefgdb bafdc cg gecb gcdbf | debgcf gbcfd gbce baefgcd
|
||||||
|
bfacdeg cedgf gfdbec eca edgcfa dbeaf ca fcdea dcebga cgfa | cefgd gcedfa bdfegc aefdc
|
||||||
|
cdfea ebgdf ab adebfgc bdcegf gbda fab dagfeb ecgabf ebfad | defba cfdea ba ab
|
||||||
|
gbefcd cbedf fcaed dgfb dacgbe ebfgca fb bfecadg cfb gcbde | eabgdc egcbdf dcgbef fb
|
||||||
|
afgedb cabdefg afcdb efdgca ef abgde edf ebfad agdbec fegb | edagcfb cdfba efdagc dcebga
|
||||||
|
dcfg afbgedc efgdb agbfe fde dgbce dabegc gdbfec df fadcbe | dbfeg gdfc efd faegb
|
||||||
|
ebgdf acfge bae gbafe efdabc ba feadbg bgda gfebdc gedacfb | fbdcge dbag ab bafedc
|
||||||
|
abedcg dcagfb cf dagbc afc fceabd fbcag dfcaebg dcgf abefg | afcdbg dcfabe fcabg adgcefb
|
||||||
|
fdbc egabc bfegc fc gbfced aefbgd gfebd gfacde bgdafec fec | fbcd fedbg daefcg cef
|
||||||
|
bgacde fegad febc gfacedb gebca gaebf bfa efbgca gfadcb fb | bf dcgfeba fdcgeab fb
|
||||||
|
cgdfe fagec fbace afecdb acg fgcbead ga abfcge bcgdfa ebga | gabcef cfgde dfgcba gcbdfa
|
||||||
|
bgae ae acegfdb dbfeg dbcgfe ebgafd dfcba cgefda adebf eda | aebfdgc bedaf feabd fbadc
|
||||||
|
dfagcb cbdgea efabdcg ecdab gceaf daecbf df cdefa fad befd | afd gefca adgfcbe fd
|
||||||
|
dcfeg acgf aec degfbc ca efbcgda fcdea gfdeac faedb cegdab | egcdaf gebdcf bdaegc aefdc
|
||||||
|
cgebaf cbdagef cadgb efda degbaf fgbea dbe bgfdce edbag de | de feda dagbe agfcdbe
|
||||||
|
eagbcfd eag efcad acefgb ag gadce fadg bdgec baefcd aefgcd | bgecd edcfab baecfg ga
|
||||||
|
adbcfge eadfb faecd ab dba aebgdc ebdgf ecbfda fcba gdfaec | efcad febdg bfdgeca dba
|
||||||
|
adgfc dfegc cdfeag edf dbecagf fdabge fbgce ed dcea cagdfb | agdfbe def efd deac
|
||||||
|
cgb bfgde bdcfa fgcbd fgeadbc fcabed befcag cg dacg bgafcd | cg acfedgb bcagfe bdfagc
|
||||||
|
fcbdge egdac acgfe efgcad fc cdaf gacefbd fcg faebg dcebag | ecdag efcgda fdac dgcbea
|
||||||
|
dgabef fdabg bcdagef dcfbg fgac adfcbg fc gdbec cbf fedcba | bdcagf dfagb fabgd cf
|
||||||
|
defc cgafed ecafbg fbdag aef cdgbae gecad facdgbe ef dgaef | fe fbecga gfdba adgebc
|
||||||
|
gbdfac gcfbd dgceb bcgdfe fedabcg gdfe fbceag eg baced gec | gacfbe cdgebf cge cge
|
||||||
|
acgdbe cfa gfba cfdab cbgadf cefdb bcfadeg fa fedgac agcbd | abfg agcbd gcfeabd dfcbe
|
||||||
|
dagebf defcb dgecaf edfbac aecbdfg deacf be aceb bfdgc fbe | ebac dcfagbe feb bcae
|
||||||
|
gbcfad fadgbce ag fdcegb gbda ceagfd agc cfdbg gfcba eabcf | dagbcf gdacfb dafcgeb eabfc
|
||||||
|
dbgcea ag acg dbag aegcd bgdefca bdgce ebgfac cgbedf acefd | agecfb abdegc dgcefb agbd
|
||||||
|
dgebfca cgdfa bgafe eda cgedfa dfage fgdbac ed ecbfda egdc | befgdac daefg acfdg acdebf
|
||||||
|
fgadce dcb abgdefc cedgf fecdb cb dgcfbe bgdeca gcfb defab | fcegbd cb gdfce gfebcd
|
||||||
|
cfbdgea ec dacgf fdeab adfec dbce dbegaf cfe deafbc ebfgca | ec decb ebagfd gcfaedb
|
||||||
|
gd bcegad afdec dgbf efcdagb cdg fgdcba fgadc abfgc cgafbe | gacfb bdcgea fabcg gd
|
||||||
|
dbega afebdg ca ecabdg deca cfgbae bca gebdfac gfcbd adgcb | cab caed abc cead
|
||||||
|
cgdbfe ab fgade gefcab afcdebg agdbe dcbeg bdca abe cgabed | ba debgc gcefba cegdab
|
||||||
|
cdfegb dbafe abdgce cbfgea bfg fg cgbed dfgc bfceagd dgbfe | gf fadgcbe aebgcf cafegb
|
||||||
|
ecafb efgcab gbdecaf fbega egabd gef dfbcge fg dcbfae cafg | dcgfeb bafdceg agfbe gf
|
||||||
|
efdcbg fgbca dcgbf dbfcag faebcd abegc afc egcdabf fadg fa | fa afc adefgbc fbcedg
|
||||||
|
dfa gcdbeaf dgbafe gacfbe dcagb adcbfe febca df dbfac cefd | adgefbc daecfbg efbca bagefdc
|
||||||
|
aec fecbgd aegdc fgcad bcedaf bdcge gbea defacgb ae acbgde | ae deacg edgcb afdecb
|
||||||
|
cdab bedgf dcbegaf gdfac bc efabgc fbc cdbgf afgcbd efdagc | cfb fgebca cgfdab faedbcg
|
||||||
|
ab eacbgf bdfa fcaedg fdebagc degba bcdeg afdgeb dgeaf gab | gfdbea afdb afdb gcebd
|
||||||
|
acbed bfeacd aedgc aeg ag gdbfae egbadc bacg fcdeg gcdbfea | gdaec aefbcd gae bdaegcf
|
||||||
|
fgadbc geafb dafbgec ecdb ce bcega deacgf egc geadbc cgdab | ecgba cdbe gacedf aecgb
|
||||||
|
gbea eb cfdbaeg cebad gbdac fcdae dgebcf fcabgd adgbce ceb | dagecb ebc dagbc ebc
|
||||||
|
fbeda ga aeg aebgd agfd bdgcfae fedgab dfeacb fbaceg begcd | ga ag afcbeg bfecad
|
||||||
|
efabcg bdc fedgc adebgcf gcabed cfdbg dfba db cafgb bfcgda | dcb bdc agfbc afbegcd
|
||||||
|
fbade bcagfe cgfea cdag dfc cfade begcfd cd gecbdaf dfceag | cgda gcda fcd dc
|
||||||
|
dbcfa bg gafcde bdceafg gaecbf cbg bgde bcgad aegdc bceagd | gcdab eacgdf bg cgb
|
||||||
|
ecfagd fbadcg fgbae bdgae gbf befc facgbe gecbfad fb eagcf | gabed fb egabfcd facbegd
|
||||||
|
abef dcabf ecfdba afbcgde bgdfce af acf cagdb gaefdc bfcde | cfadb abef bcfde cgfdbe
|
||||||
|
acedbf abcfdeg bdceag bgade acdfgb aeb bgdfe eacg ea gdabc | begda dfbge ae badcg
|
||||||
|
fcda abgef da dea dacgeb fbdae cedfab bagfced ebcgfd cdfeb | bcedf edcbfg dbaceg bdcfe
|
||||||
|
dgcfba cadeb agcdb aebfgc gdaf bcfdg gac ga fgebcad fdcebg | dgacbf ebdca egfdcb bcfdg
|
||||||
|
afbedg egbd bfcdag edgcaf gbdcfae afegb fgdae gbf fcbea gb | dgbe edbg bg efdag
|
||||||
|
acb abcfde fcgead efacd eabfc dbfa ab egfcb bedgac fdcaebg | defca acb caefd acbdge
|
||||||
|
afcde dbe fbcaed aecbfgd bfec be eadbc afgdbe dacbg gcfead | be ecfb fgdabe aedgfb
|
||||||
|
fdeacg cbgfa gefb bfc bf gbafce bdefac agefc aegcdbf agcdb | bf gceaf efbg bfcaeg
|
||||||
|
fdce gacfb agbdec cgafd df caegd gdcefa bcgadef agfbde adf | fagbc fcgdea fd bfgca
|
||||||
|
gdfacb aebcg ga dgae egfcbda cedbg dbegca acg gbedfc ecbfa | ga eagd eagd edgfbc
|
||||||
|
cgbdf eb caged aegfcd egb badecg gdbce ecba egfdba dfbaecg | cagfdbe geb dgcefa dafegc
|
||||||
|
cd gbecaf acfdb cdfg cda gbdface gfbac dgacfb bfade dgecab | dfcgaeb dc bgdacef bfacd
|
||||||
|
geab fecdb gb feabcgd ebgcda gdcae gecdb gbc afegdc gbfdac | debcga bgdaec dceagb cbaged
|
||||||
|
edgfcba agd bacd afcdg degbfc acefg efdgba bgadcf da gdfbc | gcfbd dbac cgfdb gecaf
|
||||||
|
bfca fcbged dfgab cgbadf cdfabge degcab adfeg cgfbd ab bad | abcf afbc gafdb acfb
|
||||||
|
gc fdgac fgeadb afdcb gecdfa gac gecafbd cabged gfce gaefd | ecbdgfa cag bgfeda eafgcd
|
||||||
|
eagdc efdacbg cdgbe cbfdg egadfc egb aebc be gefabd dbecag | bafcgde beg gbacde dcbge
|
||||||
|
ac afbgcd gfdba fabecgd ebdafg bac cfag adgcbe abcfd cfdeb | adbegf egacdb bac acb
|
||||||
|
cafbed gf gfd cgdba eadfbcg gfdcb gbef cfdbe fdgeac gedbcf | facbegd cbdag fg fdg
|
||||||
|
fbgcd fadb fcd fd dfcbga decabg egbcf gacdb fcgeda aecfdgb | bedcafg cgdbaf fabgdec dcbgf
|
||||||
|
gb bcgeaf aebfcd cdefbga cbaef cgafb gbf dfacg gbcfed bega | bg bfacg bdfcge geba
|
||||||
|
cadfe afbgced aedfcg cebfg aeb fdageb bfcade bfaec ab bcad | bacef bcafe bfgeda baefgd
|
||||||
|
cgbde abcg cea dbegca ac agced befdgc bgafdec efgda badefc | cae eca gdfae dcega
|
||||||
|
ab fgcbed agb cafge cegba deabfcg dbgec aedgbc gfadbe bdac | ab bdca cgfedb dgceb
|
||||||
|
bfgadce cfadg fa cagdfb bcgdf fagbec gfa fbad bgcefd degca | fa ecgad gceabf dcfgb
|
||||||
|
gfd dcabegf fg cefdg cbefgd gefb ebgdc egacbd gcafdb dcfae | ebfgdc cegdabf cbafged fdg
|
||||||
|
dfecagb fbag bdcega gecdaf fg cgbad gfdacb fbcde fgd dfcgb | gfd gfd dgbeac fg
|
||||||
|
gfaed gad feacg dfaebcg deba efgbdc gefbad ad agdfbc fbdge | dga bdae fegbcd dgfabc
|
||||||
|
agdbc egdcafb caegdb afgdec cbadfg fdgba efdba bcgf gf fga | dfabg cagfdb eadbf cdfaeg
|
||||||
|
bgefac fecdabg cebdaf de aedfb ade bcefa gcafed bcde adgbf | ebcgaf fbadg ead dea
|
||||||
|
edbgc dcba egcfbad cfdage abfegd caged ebd bd gdaecb cgbef | cdebg badc edgbc ebcdg
|
||||||
|
cgfabe dce fcdba efbcg bdcef bagfecd eabgcd ed ecgbdf dgfe | fdcgbae egfd edc bfegc
|
||||||
|
fgecad gebda ebgcd egc dbecgf ce cbef cgdfb egacdfb agdbcf | edbfgc cdgbe edgfcb bcefgad
|
||||||
|
geafcd cdage ec cdegbaf gec cgafeb abgcd gebfda gafed dcef | ce gdbfea egdabfc gec
|
||||||
|
be abdgfc daecgfb bae dbfag gfdeba dbafe gbfeac egdb dfcae | bdge eba ecfgba gcaedbf
|
||||||
|
bcge gbeadcf acg bfcdga bfcaeg cfaeg gc feabc bfaecd gedfa | bfeac begc fgdbca bgfedac
|
||||||
|
gfbed ce ced fceabd dabegf bcdgef egcf becfagd gcdbe gcadb | ce ec bdfaceg cdeafgb
|
||||||
|
gfdea db cfdgbe badc gbaec ebfagc bde dgbcae egbda cbgedfa | badegc cbeagdf bd egfbcad
|
||||||
|
deabcg egbca agfdbc edagfb abe eb afbdceg efcag becd agcdb | bced eb be bea
|
||||||
|
ebfgda bgade dbcea geaf gcbadf dgfba eg gcedabf geb cgfbed | edabg ebg cedgfb bgdcfa
|
||||||
|
fc adgbecf fbcd abgfdc cgfab aedcfg dgcab gfeab cfg cbdgae | fcg badegcf bgdac fgc
|
||||||
|
edg egbda dafbgec begc aedcb cadgeb eg eacdfg gafbd cebadf | dfgba bdegac cbge afdbec
|
||||||
|
bgfecad gdbaf afdbeg egafcb db dba fdbace egafb gdeb dcgfa | fcbade fdagbe bad cdbefa
|
||||||
|
bcgedf ecba bagcef beg cgafed eb gfedcab gfbad efgba egafc | bace fbgdec cbgefa beg
|
||||||
|
dgfecb fcd edfbag bcfade fc caegd bcgedfa defab caefd cbaf | dbeafcg fc fabed dcf
|
||||||
|
ceafg fbad cfeba edbca afebdc bf cegbad bcdfge cgdefab feb | gdbecf faebdgc dcaeb ebf
|
||||||
|
cgdfba cdabf gfedca efgcadb baegfd bcfg fc caebd gdafb caf | cgfb dgcfab befgadc debgcfa
|
||||||
|
ebfgca abcfe gca bagde bgcae dbgcfa efbadc gcef agefbcd cg | abegc cbfae acefbgd cag
|
||||||
|
dfegac gedc bcdaef abgfd egf ge fagecb agefd fecdbga ecfda | gbafd dacbef gdefac gef
|
||||||
|
feb begcdf fcab edcafb bf aefdc gbade bfead daegfc feagcbd | bcfeagd gcdbfe fbceda fb
|
||||||
|
baefgcd fedcb cfbaed dgc abdgf bdfgc bcedgf gc gcfe aegdbc | ceafgbd fbcdge bgdface efbdgc
|
||||||
|
fd gbdae bfda ebfgdc edf gfdea caegf aedgcfb fadgbe bcagde | abedg adegb efd fcaedgb
|
||||||
|
befg gecdb dbcgafe adebcf dge ecfbd bcefdg aecgdf ge bgcda | bgfe gdebc dge ge
|
||||||
|
cfdgb be aecfg gefdbc bgfec afbdgec cdabfe egbd cgabdf cbe | fbdgc eagcf eb faegc
|
||||||
|
gfdbae aedcfg gbcfed bcde dbefgac gfacb ceg bdgfe ce efcbg | efcbg ce edcb ebgadf
|
||||||
|
ba fecba dbcgfae gcab gfcade febdc adfegb fab aegfbc gcfae | adfgbce gebdaf cefba fba
|
||||||
|
eadbf acfde cfdeab bagfcde bgfcae eab gafdce cedb dbgfa eb | bea fgeacd eb fegabc
|
||||||
|
ecb baedc ec adbfgc cedf faedcb acdfb fdgaebc agbde aegcbf | fdce cbfdage bdacgf cedf
|
||||||
|
fegc cefgdb fdbge bfg badgcf eabcdf fg begad dafgceb fedcb | bgf fdbec gf ebdacf
|
||||||
|
gfecdab gbeac aebd be eacgd ebc dfegca cbagf agbdce bcdgfe | bec ecdga ecb gabec
|
||||||
|
cb bcfg cgdfa adegfc bca aegdb afcebd gcdfab dbgca becfdag | bc badcgf bca fcbg
|
||||||
|
gabdce dc fbgdc gbfec cfda fgadcb bafgd fbdeag abdcegf cdg | fcda adbfg cfgbead dgacfbe
|
||||||
|
ecgab gbdecaf bcfa cdegbf eabgdf fgeabc ba egfcb gedca gba | fcbeg gacbfe ecdbafg deacg
|
||||||
|
agc bgfca cg cgafdbe dcfg dcfagb fbdag cabef gdbace gdefab | dcfg agbfc bcfea cag
|
||||||
|
cagb ga dfcga fdaebc fdebga cbdafg gfcbdea fcgde cfbad afg | cbga cedgf cdbfa afdbcge
|
||||||
|
cafgdeb aebfd gfbeda ebcgdf agcbf egf decbaf egda abgfe ge | bgacf bdfea agfbe beadcf
|
||||||
|
be agbefdc aedfgc gabfc adgfeb egb efdag afgbe deba bgfedc | fedgacb dcafge bdae ebad
|
||||||
|
cfbae dcaegf cdbfaeg fcebga efgca cdfab ageb gcbfde ebc be | acfgde be be bcfagde
|
||||||
|
bafdgce cea gdbcfe ae agecd agcdbe ebfcad agbe bcdeg fgadc | cebgad ecbgd cbdeg gaeb
|
||||||
|
bgce agefcbd egbcfa eg fadgb bfcae dfbcae egfab gae fdcega | age gafcbe eacfbg gea
|
||||||
|
fgacde gfaedb ebacf gc gdfc dcbeafg fadge gec bdcgea cgfea | fdagcbe gfdc aefgcbd gc
|
||||||
|
gb acfdgb bga aedgf bafdg abdfecg gacfeb bgdc bfcad fcedba | fgaecbd dabcf bcdg bg
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
be cfbegad cbdgef fgaecd cgeb fdcge agebfd fecdb fabcd edb | fdgacbe cefdb cefbgd gcbe
|
||||||
|
edbfga begcd cbg gc gcadebf fbgde acbgfd abcde gfcbed gfec | fcgedb cgb dgebacf gc
|
||||||
|
fgaebd cg bdaec gdafb agbcfd gdcbef bgcad gfac gcb cdgabef | cg cg fdcagb cbg
|
||||||
|
fbegcd cbd adcefb dageb afcb bc aefdc ecdab fgdeca fcdbega | efabcd cedba gadfec cb
|
||||||
|
aecbfdg fbg gf bafeg dbefa fcge gcbea fcaegb dgceab fcbdga | gecf egdcabf bgf bfgea
|
||||||
|
fgeab ca afcebg bdacfeg cfaedg gcfdb baec bfadeg bafgc acf | gebdcfa ecba ca fadegcb
|
||||||
|
dbcfg fgd bdegcaf fgec aegbdf ecdfab fbedc dacgb gdcebf gf | cefg dcbef fcge gbcadfe
|
||||||
|
bdfegc cbegaf gecbf dfcage bdacg ed bedf ced adcbefg gebcd | ed bcgafe cdgba cbgef
|
||||||
|
egadfb cdbfeg cegd fecab cgb gbdefca cg fgcdab egfdb bfceg | gbdfcae bgc cg cgb
|
||||||
|
gcafb gcf dcaebfg ecagb gf abcdeg gaef cafbge fdbac fegbdc | fgae cfgab fg bagce
|
||||||
|
|
@ -0,0 +1,143 @@
|
||||||
|
use std::{
|
||||||
|
collections::{HashSet, VecDeque},
|
||||||
|
io::{BufReader, Read},
|
||||||
|
ops::Index,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Floor {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
|
||||||
|
let mut floor: Vec<Vec<u8>> = vec![];
|
||||||
|
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_to_string(&mut buf).unwrap();
|
||||||
|
for line in buf.split_terminator('\n') {
|
||||||
|
floor.push(
|
||||||
|
line.chars()
|
||||||
|
.map(|c| c.to_digit(10).unwrap().try_into().unwrap())
|
||||||
|
.collect(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Floor { floor }
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Floor {
|
||||||
|
floor: Vec<Vec<u8>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Floor {
|
||||||
|
fn rows(&self) -> usize {
|
||||||
|
self.floor.len()
|
||||||
|
}
|
||||||
|
fn cols(&self) -> usize {
|
||||||
|
self.floor[0].len()
|
||||||
|
}
|
||||||
|
fn get_neigbours(&self, p: &Point) -> Vec<Point> {
|
||||||
|
let mut points = vec![];
|
||||||
|
if p.row < self.rows() - 1 {
|
||||||
|
points.push(Point {
|
||||||
|
row: p.row + 1,
|
||||||
|
col: p.col,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if p.col < self.cols() - 1 {
|
||||||
|
points.push(Point {
|
||||||
|
row: p.row,
|
||||||
|
col: p.col + 1,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if p.row > 0 {
|
||||||
|
points.push(Point {
|
||||||
|
row: p.row - 1,
|
||||||
|
col: p.col,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if p.col > 0 {
|
||||||
|
points.push(Point {
|
||||||
|
row: p.row,
|
||||||
|
col: p.col - 1,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
points
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_low_points(&self) -> Vec<Point> {
|
||||||
|
let mut res = vec![];
|
||||||
|
|
||||||
|
for r in 0..self.rows() {
|
||||||
|
for c in 0..self.cols() {
|
||||||
|
let p = Point::new(r, c);
|
||||||
|
if self.get_neigbours(&p).iter().all(|n| self[n] > self[&p]) {
|
||||||
|
res.push(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_basin_size(&self, p: &Point) -> u32 {
|
||||||
|
let mut used = HashSet::new();
|
||||||
|
|
||||||
|
let mut q = VecDeque::from([*p]);
|
||||||
|
while !q.is_empty() {
|
||||||
|
let p = q.pop_front().unwrap();
|
||||||
|
used.insert(p);
|
||||||
|
|
||||||
|
self.get_neigbours(&p)
|
||||||
|
.into_iter()
|
||||||
|
.filter(|p| !used.contains(p) && self[p] != 9)
|
||||||
|
.for_each(|p| q.push_back(p));
|
||||||
|
}
|
||||||
|
|
||||||
|
used.len().try_into().unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Index<&Point> for Floor {
|
||||||
|
type Output = u8;
|
||||||
|
|
||||||
|
fn index(&self, index: &Point) -> &Self::Output {
|
||||||
|
&self.floor[index.row][index.col]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
|
||||||
|
struct Point {
|
||||||
|
row: usize,
|
||||||
|
col: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Point {
|
||||||
|
fn new(row: usize, col: usize) -> Self {
|
||||||
|
Self { row, col }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn smoke_basin_1(test_mode: TestMode) {
|
||||||
|
let floor = parse_input(test_mode);
|
||||||
|
let sum: u32 = floor
|
||||||
|
.find_low_points()
|
||||||
|
.iter()
|
||||||
|
.map(|p| floor[p] as u32 + 1)
|
||||||
|
.sum();
|
||||||
|
println!("{}", sum);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn smoke_basin_2(test_mode: TestMode) {
|
||||||
|
let floor = parse_input(test_mode);
|
||||||
|
|
||||||
|
let mut basins: Vec<_> = floor
|
||||||
|
.find_low_points()
|
||||||
|
.iter()
|
||||||
|
.map(|p| floor.find_basin_size(p))
|
||||||
|
.collect();
|
||||||
|
basins.sort_unstable();
|
||||||
|
|
||||||
|
let sum: u32 = basins.iter().rev().take(3).product();
|
||||||
|
println!("{}", sum);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,100 @@
|
||||||
|
9987653234589654549865432101235789979765459832101234567943986543101239874321012932397319985214896543
|
||||||
|
9898541015678943239876973876545699868954398765212345678932399654592345965432129891985498764323789432
|
||||||
|
9765432126789654123998765987897789759893219894333656789543498986989957898543498789976579895454678943
|
||||||
|
9879656737899797434589986798998897646789398989454789898959987899876899987654989678899699976565789656
|
||||||
|
8998767945678996545678997999569965435678987678967897947898765698765678998799878466798989988676898777
|
||||||
|
7679898998799987676789398998439876323999876567898976736569894329954569789987964345987878999788999888
|
||||||
|
5569959349898799787892139987321987549898765456789765623478989497542345699876543239876567898999998999
|
||||||
|
4398943245999659898993045996210499698759876345678954212349876989321234589876455123954453567899987897
|
||||||
|
6997832134678945959889159895432349999898763234567894303456965878943445678954321019843212456789976995
|
||||||
|
9876543265789434345678999789943498899987654126898985424579854567894578789986532129654325677899854789
|
||||||
|
9987654378894321256789987687894997789976543245789876539798768978965989897898763298767534798998765699
|
||||||
|
9998867459943210167899976576789876678898674689894988798999899989876999976987654349879545899999876789
|
||||||
|
8989978967894345234989895434598985568789788799933299987988989999987899895498765767989656987899987890
|
||||||
|
7679989878965976349876789323987654345699899899321012976567678998998998789329876878998767896789899951
|
||||||
|
6567895999876765498765678912396543236899956978932129854323567897899989698934998989679878945698789543
|
||||||
|
4367896989989896989824567893459874345789543569549299765434579945799877567895789997543989432397678954
|
||||||
|
6456789678998989873213678994598765456795432678998989879765678936998765456789896789732394321234589899
|
||||||
|
7867894569987678965302759789679876567894321799997878998976789029876744348978945699901298636346698778
|
||||||
|
8998923459876567973212345698789997678965433899876768987897899998765432124567934989893397545458975667
|
||||||
|
9769212598765459895463456789894398789877549998765656346789998769876545635688949879799498656867894356
|
||||||
|
9854324987654346789654577899943239899988698999854341247898987653987678986799198765678999987978965457
|
||||||
|
9985459876532235678968688987652124989998796598763210123567897632598789987891019654569998798989976768
|
||||||
|
9876598754321014567999799999873015678999987679874331234898998543469893498989198543456989659497899879
|
||||||
|
4987999865432323456789899998754123789687798798765765345789239754567912989678976432345678943236910989
|
||||||
|
3999998978543476567896978899875234896545679969896889656890198765678909876549876321234567894345899894
|
||||||
|
9899987987654587678965356789986346789639889345987992987999349989999999995434965430999698995456789763
|
||||||
|
8789995398765698789643235894398956998798999239899893998978969999898989984329876999878989976568997654
|
||||||
|
7679876219876789896542129901239899889897778998765789879569998998787878965510999876567678987879998795
|
||||||
|
6569997901989891987843458913498788778976667897654678965456987997676567894323987955476567898989989989
|
||||||
|
5498789892399932398954567894987654567895456789642567894235695987543478999499876545313456789899876567
|
||||||
|
6987678789999543459987678959876543679932378996543456965123984399864569998989985432101239898798765456
|
||||||
|
9876546679898954567999789546987621767891567789654587893239973298765678987879876543212345995697654367
|
||||||
|
9965434569767895978999893234598832348932345698765698954398764569976789656568987654323476789987743256
|
||||||
|
8954323698956789899998942195679953567893478999876799965499865678989896543459999866455678999976551045
|
||||||
|
6561012987545698788987893989998769878987567896987899896989987889298985432198754986566789678985432136
|
||||||
|
7432123498699987667896789878899989989987679975699989689678998994367965321096563497678994567986544357
|
||||||
|
6543434679987893459945698766789994597899789654599876575569899765459876432985432398989323456987655456
|
||||||
|
7654545689876789967897987655679913456789898765989975433456789876767989949874321019998910127898767667
|
||||||
|
8965656798765667898998986543489894768998999899879874321387899989898998899865432125987891238989898798
|
||||||
|
9878969899874356789999997432356789899567899999867965434458989999999987678976743434976989349876999899
|
||||||
|
4989878998543235678989854321247895912456789998759876545789678949899998789987854589865878998785679978
|
||||||
|
3497989987654146789679765432346954323457991987643987856894589439789769893498767679764567987654598767
|
||||||
|
2356799998763259895434996566459899496567890987732298997893499998698954902999898798943458976543987656
|
||||||
|
1345998759998768999323987878698798989698999896521019498902578896587893219899999987654569998651098945
|
||||||
|
2349887646789878998909998989789657478989298765432329399312456789476789399789999898765878979732129857
|
||||||
|
3498765434899989987898999999896545365679109876543498989423969893345995987678989769876989569843598767
|
||||||
|
4599894323987899876667899899987621234568914997656987878944878932239894598547568978989895479955679878
|
||||||
|
5689989210196998765456789789876210145679323498979766567895989210198795987832456899998794398766789989
|
||||||
|
6799878923965449887567895698765421234789459989898753456789994345989689976541368954989689239877899999
|
||||||
|
7899769999874335998789989899876532365678998876789866567899985459878599987430267893976578999988998989
|
||||||
|
8998958989910126999895678916998645466989897665789877689939876598766469898521256799865456789799987879
|
||||||
|
9987847768921237899934689105679656567898786544598999994324987987654349765432345987674347889659876567
|
||||||
|
9876426457892357998925693223998769779987654323987887889212998998743234978545469876544235678998765458
|
||||||
|
8765212346895468987998789339899878989876543105986455678929899999832123987676569998432123789989896345
|
||||||
|
9893101287896778956789895498799989294987654219875334599998798987654016898987978987654234599868987456
|
||||||
|
7654242398969889545678976987689990123499864329883223678998657998762145679398989398766345678956897678
|
||||||
|
8765357899954995434569989876578921934987986598761019999999736799763234789239799219875458789345999789
|
||||||
|
9876459987899894323678998875467899895976797987652128789989945689654756894345678998986567891239899899
|
||||||
|
9987699896798789434789897654323456789985698976543234567968896798765897895656799997897678910198776999
|
||||||
|
8998988765667678945896789876212345699996789987654345678959789989878998976767899976798989321987665678
|
||||||
|
7999876554354588996945679877103456789869899898765458789345678969989329987878999865659796499895434789
|
||||||
|
6789987432143456789439998765213467899953998769896569994234569658991012998989998764546679987654323890
|
||||||
|
5679896541012345799598789874327878969892987654987678996545678967989129879099876543234567899795434891
|
||||||
|
4598765432123569898987678985456789459789898743498789989756789879878998765146998732125698901989545789
|
||||||
|
3759986543234678987656589876769898698657789992109899978997894998767899943237984321016989992978956897
|
||||||
|
2349898757655989898743456989899999998745678989234998868789923499656798895349875432234678989867897896
|
||||||
|
3498769898767995679754687894999899899987789878976987654689934987543236789767976543345689876546789965
|
||||||
|
5957656999898994889898798943499789789998898769897998743476899876432125698978989954496898765435789954
|
||||||
|
9843545989919989998989899954987679678969987658789876532545899976521034567899999795987999876323567893
|
||||||
|
8732135678909878967879999899995564599357897645679987621236798765432145678978988689999899943213679954
|
||||||
|
7643014789998765456568998788994323788969919876798768730345679896543267989569876578998798654323789875
|
||||||
|
8654123898999654345457897656789515677896323987898654321656789987655358993459875467987698765434892996
|
||||||
|
8766234567898743212345789534994323456965434598989765442767895698767467892398764345696549876545993989
|
||||||
|
9874345678999832101234679423989434699799565989679877653458954349878878921987653234986539987656789878
|
||||||
|
9965657899298743212345894212878945987678976976547989765669765689989989439876543123497698998767899764
|
||||||
|
9876798921019654323456982104567899866567899867435699878878998799997699545998653234598987899889998943
|
||||||
|
3989899892198767434569877323456998753467997654526789989989219989876578976789854447679996867995387891
|
||||||
|
1298956789299878565678965434567897542346789643214567999894329878964347897899965557798765456894216789
|
||||||
|
0987645898989989678789876545878965321578998759323456999765498767894256798949876678987654345892105899
|
||||||
|
2698766987678997989898987856989954320789869898937599878978987856943145789432988989998743236789324678
|
||||||
|
3499989898598965397997698967898765434899754997999987567899876645894235699921299096999984345679434567
|
||||||
|
9988998765467893236789579989999887545678975986878976458998765434689346789890932125789965456796545678
|
||||||
|
8976899754359992125679456799999999698789876795467891367999986323478956896799843234699878767899696899
|
||||||
|
7895789973298989014568967898989439899994987984356910179898797212667897975689754348789989878998789999
|
||||||
|
6434890989987878923699878987678921999893499878268899298789598601457898954579765678895699989349899678
|
||||||
|
5423921298756867895789999896569890198789989862156788965678987542356789343467999789934989993210998569
|
||||||
|
8737893989943458976799998765476789987679876545034567894589999753478993212979878992129878994921987678
|
||||||
|
9656794979899569987999899654345679876543987632123478943499898764589432109898769994939769789892998989
|
||||||
|
8767999868767989799898698765476789999432499843234569654986789878997643498789356989898654698789899194
|
||||||
|
9879898657657895698795439876987899987654678954545678999875688989019759569653239876789543987698789012
|
||||||
|
6998775432348894239679921997898978998767989876789789789654567899998967898764699865678952986567678929
|
||||||
|
5987654321256789197598799998929867899898999987899897698973456789787978979978989976789769878454567898
|
||||||
|
4598763210368898986487678999213456789949989998921954567892567998656899754989978987899879764323678986
|
||||||
|
3459875391239897697396568789428589890129878999530123678943688974545799843499867898963989875214567895
|
||||||
|
2345965485446797543212345678937678932398767985432654789764569763234899754998756789642199932108678914
|
||||||
|
1459879876568999852101267899548789654987659876543465999875678954356999879877645678921019853219989103
|
||||||
|
2345989987879998763254345678959898767899536987754576789986789765456895998763234599934329764324598912
|
||||||
|
3589996598989899854395456789967999878998745699865679896597897987587894309854123578896449895434567893
|
||||||
|
4678965409599798765986577899878986999899656789986789965498986987698963219767012456789567976545998954
|
||||||
|
5789654312345679876897689910989754346798787891099899876899765698999654397654323767897689987656899865
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
2199943210
|
||||||
|
3987894921
|
||||||
|
9856789892
|
||||||
|
8767896789
|
||||||
|
9899965678
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
use std::{
|
||||||
|
collections::{HashMap, HashSet},
|
||||||
|
io::{BufReader, Read},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
lines: Vec<String>,
|
||||||
|
opening_chars: HashSet<char>,
|
||||||
|
opposites: HashMap<char, char>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_to_string(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let lines = buf.split_terminator('\n').map(|s| s.to_owned()).collect();
|
||||||
|
let opening_chars = HashSet::from(['(', '[', '{', '<']);
|
||||||
|
let opposites = HashMap::from([
|
||||||
|
('(', ')'),
|
||||||
|
('[', ']'),
|
||||||
|
('{', '}'),
|
||||||
|
('<', '>'),
|
||||||
|
(')', '('),
|
||||||
|
(']', '['),
|
||||||
|
('}', '{'),
|
||||||
|
('>', '<'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
Input {
|
||||||
|
lines,
|
||||||
|
opening_chars,
|
||||||
|
opposites,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn syntax_scoring_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
let score_chart = HashMap::from([(')', 3), (']', 57), ('}', 1197), ('>', 25137)]);
|
||||||
|
|
||||||
|
let mut score = 0;
|
||||||
|
for line in input.lines {
|
||||||
|
let mut stack = vec![];
|
||||||
|
for s in line.chars() {
|
||||||
|
if input.opening_chars.contains(&s) {
|
||||||
|
stack.push(s);
|
||||||
|
} else {
|
||||||
|
let old_char = stack.pop();
|
||||||
|
if old_char.is_none() || old_char.unwrap() != input.opposites[&s] {
|
||||||
|
score += score_chart[&s];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", score);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn syntax_scoring_2(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
let score_chart = HashMap::from([(')', 1), (']', 2), ('}', 3), ('>', 4)]);
|
||||||
|
|
||||||
|
let mut scores = vec![];
|
||||||
|
for line in input.lines {
|
||||||
|
let mut stack = vec![];
|
||||||
|
let mut valid = true;
|
||||||
|
for s in line.chars() {
|
||||||
|
if input.opening_chars.contains(&s) {
|
||||||
|
stack.push(s);
|
||||||
|
} else {
|
||||||
|
let old_char = stack.pop();
|
||||||
|
if old_char.is_none() || old_char.unwrap() != input.opposites[&s] {
|
||||||
|
valid = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if valid {
|
||||||
|
let mut local_score: u64 = 0;
|
||||||
|
stack
|
||||||
|
.iter()
|
||||||
|
.rev()
|
||||||
|
.map(|c| input.opposites[c])
|
||||||
|
.for_each(|c| local_score = 5 * local_score + score_chart[&c]);
|
||||||
|
scores.push(local_score)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
scores.sort_unstable();
|
||||||
|
println!("{}", scores[scores.len() / 2]);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,110 @@
|
||||||
|
{{{[(<<[[[<<([[]()]<()<>>)((()()))>([(()><{}[]>]({()[]}))>{[{(<>[]){{}[]}}<({}()){{}[]}>][<<(){}>(()<>)>{[{
|
||||||
|
{<<((({{<<[<<{[]()}(())>([[]()])><[[{}{}]<[]<>>](({}())[{}<>])>][([{[]{}}](<<>{}>{()()})){({[]{}}<<><>>}{({}
|
||||||
|
(<[{<{<(<[[<<<[][]>(<>)>><{<(){}>{[]{}}}<{{}[]}{()[]}]>][<([{}<>]<[]<>>)<{[]()}[()<>]>>[{{<><>}<<>{
|
||||||
|
([{([{{{<[[{[{{}()}<{}[]>]{{<>()}<()>}}{<<{}()>{<>{}}>}]]<(<<[<><>]<<><>>>{<{}()>({}())}>){(<{()<>}><<<
|
||||||
|
{(<{[{[{([<<{<()()>((){})}[[{}{})<()[]>]>>{([<{}<>><<>[]>]<{<>[]}[{}<>]>){<[<><>]{{}{}}><(
|
||||||
|
[<([<(<{[<[{<<()[]>{()[]}>}{<[{}][[]{}]){[()()]{<>[]}}}]>{(<(<[]()><{}<>>)(<{}<>><{}()>)><<(<>())>>)
|
||||||
|
(<{<[<[(({([(([][])([]())){(()[]){[][]}}][({[][]})[[[]{}]({}[])]])}{{{[{<>()}{()[]}](<{}[]><[]<>>)}<(
|
||||||
|
<<(({([[[([{[[()()]{<>[]}]<[<>[]]({}[])>}]((<[[]())(()<>)>(<{}()>([][])))<([<>[]](()[]))>))[<[[<{}<>>([][])]
|
||||||
|
(({[{[{<(({([{[]{}}(()())]{{()()}<<>()>})([{{}{}}[{}{}]]<<(){}>[()<>]>)}<{{(()[])}}{{[[]()
|
||||||
|
[<{<<<{<[[[[(((){})(()[])){<[]{}>}](<[<>[]][<>()]><[()<>]<<>[]>>)]({{[<><>]}<<<>{}>[{}<>]>}[{{{}{}}([]{})}
|
||||||
|
{[<({<{{<([(<<<>{}>{<>[]}>{{()<>}<<>{}>})(<<[]>((){})>)][<[<()<>>[()]]<((){})<<><>>>>[<{()[]}<{}[]>>]])>}{{<
|
||||||
|
([[<{([{<<[{<[{}<>]{<>{}}>{[(){}][()()]}}<{(<>[])(<>())}([<><>])>]>{{{<([][]){<>()}>{([]()><()()>}}{{({}()
|
||||||
|
(<[[({{<([[[[{{}<>}[<>()]][(<>[])<<>()>]]]([([[]()][()()])]([[{}[]]<{}[]>]{[{}<>]{<><>}}))))>(
|
||||||
|
<<{[([(<<({{([{}[]]<<>()>)<<()[]>[{}<>]>}({(<><>)[{}()]})}[{<[(){}]>{{<>[]}[<>{}]}}[<(<><>){{}[]}>{{<>{
|
||||||
|
[<({[({[<{[(<[{}()][{}<>]>{{()[]}(<>())})({{{}<>}<[]()>}{<()<>>})]}[<<{{[]}({}{})}([[]<>][()<>])>>[[[
|
||||||
|
(<<[[<{<(<<<<[()[]]<<>()>>({[]<>}[[]()])>([<<><>>](([]()){[]()}))>{<[{{}<>}<<>[]>]<<<>><[]()>>>{
|
||||||
|
<[[{[<({{[{(<([]())<{}[]>>(<<>{}>{<>})){[{[][]}{<>[]}]{[[]{}]<[]>}}}<<(([]{})[<>{}]){[{}()](<>{})}>[[([]{})[{
|
||||||
|
([(<[<[[{([[(({}{})[(){}])([<>[]]{()[]})]([[()<>][<><>]])]{[<{[][]}[[][]]>{<[]()><()[]>}]<[(<>())<<>{}>]>})}
|
||||||
|
([([{<<{{{({<<<>[]><<><>>>[[<>[]]<[]()>]}<<{[][]}[{}<>]>{[<>()]{()[]}}>)[[[<<><>>{(){}}>[({}[
|
||||||
|
[[<[[({{(<[{<{[]{}>>({[]()}{[]<>})}{(([]{})[<>{}])[(<>{})<[][]>]}]>){{<[{<{}<>>}<([][])([]<>)>]((<(){}>(()
|
||||||
|
([[{<[<((<{([{[]<>}({}[])]){{[[]]{<><>}}[<[][]>([][])]}}{[(((){})([]())>]{{{[]()}<<>()>}}}>){<[(
|
||||||
|
{<(<{{<{[{<{{<(){}>{<><>}}}[{[{}<>][{}<>]}[[[]{}](()[])]]>}][<<<{[{}[]]<()()>}(((){})[()[]])>)((<(()
|
||||||
|
{([<{<{([(<{[{{}[]}[(){}]]<{()}<{}()>>}[[[[]{}]{<>[]}}]>{[[[<>]<<>()>]{<()<>>{[]<>}}]})<<{[{<>()}<{}<>>]
|
||||||
|
{<<(<[<[[[[{{(()())([]<>)](<<>>({}()))}<[{<>()}[()<>]]>]({[[[]()]<()<>>]}[[<[]<>><()<>>]{<{}()>[
|
||||||
|
[<{(<<[<[(<[{(<>{})<{}()>}]<[[()<>]{<>()}]>>)]](({<{<[()()]{[]()}>((<>())(<>{}))}{[<{}()>]<(<>[
|
||||||
|
[<({({[[[<{<[[()<>]<<><>>]{([]<>)([][])}>[[(<>[]){(){}}]]}{{<{<>{}}<<>>>(([]{})[[]<>])}[<(()[]){{}{}}>]}>[{
|
||||||
|
{(<<{<[{[{({{[<><>]{{}[]}}}(([{}[]]<[]<>>)})[<(<[]{}><<>()>)[<{}<>>[<>[]]]>(<((){})[{}<>]>{(
|
||||||
|
[<(({<<([{[{{{<><>}([]<>)}}]}](<(<[([][])<{}[]>]{{{}{}}[{}{}]}>{(<[][]>{{}{}})})>)){[([{{<[][]><()>}
|
||||||
|
[({[[[(<<((<(<{}()>([]<>))(<()()}<{}[]>)>(([{}[]](<>{}))[{[]<>}(<>[])])))>>)][<{({<[[<{}{}>{[]()}]{(<>{}){
|
||||||
|
{(([((([<[{[(({}[]){()<>})[[{}[]]({}())]]{<[[][]](()<>)>{[{}[]]{[]()}}}}<{(<<><>><()<>>)<({}[])
|
||||||
|
{([{{[[{<({([[<><>]<{}<>>]<[()[]]<()[]>>)}[[{[{}{}]{{}{}}}]{[{[]{}}([]{})]{(()())[<>()]})])>}]<
|
||||||
|
([<[{{{([{{<[[{}{}]]{<()()>}>{{{()[]}([]())}}}<<{<[][]>{<>{}}}>{[[{}()]([]{})]{([]{})(()())}}>}])<<<((<<{}{}
|
||||||
|
[{{[<[[[<({[[<(){}>{{}[])]{{[]<>}([])}]}<({{<>()}[{}{}]}{[()()]{[]<>}})[{[()<>][()[]]}]>)>[<(<{{
|
||||||
|
(<{{({{{[({([({}[])<{}{}>](([]{})[{}{}]))})[(<<((){}){()<>}>[[[]<>][{}[]]]>{<([]){{}<>}>([[]{}])}){[(((
|
||||||
|
<[<{{(<(<<[{([(){}][()()])((<>())]}]>>)>)}[{(({({[[{(){}}]][{(()()){{}[]}}<(()())(<>())>]}{([{[]<>}<[]<>>]
|
||||||
|
{({<[[<<{<{(({<>{}}<<>{}>))[<<{}()><<>()>><<(){}>({}())>]}<(([{}[]][{}{}]){<{}>}){[<[][]>((
|
||||||
|
(<[{{[{([<<<(((){})([][]))>([[<>{}])[<{}()>{<>{}}])>>{{{{<[]{}>[()()]}[(<>{}){<>{}}]}{([[]{
|
||||||
|
{(<[{({<<(<<<(<>())[{}[]]>>{([()()]({}{})){<[]()>[[]<>]}}>[[<[{}{}]{{}<>}>{[<>()][<><>]}]{<[<>][[]<>]>((<>{
|
||||||
|
{[<<(<<({(<<[{<>[]}]{[{}{}]<[]()>}>(((())<<><>>)((<>{})[{}[]]))>[<({<><>}[[]{}])[<()[]>{()()}]>{{({}[])({}()
|
||||||
|
<<<(<((([<{[{{{}<>}{{}[]}}[(<>)<<>[]>]]<[([])]<{()()}{<>{}}>>}><{<[[[]<>]<{}<>>]>[(({}[])<[]<>
|
||||||
|
{<(([[{{[({(([[]{}]<{}()>)<([]())[[][]}>)<<<<>>{()[]}>[<<>()>]>})<<[({[]<>}[[]<>])<<{}()>({})>]{<<()[]>(()[
|
||||||
|
([<([{<[<{<([<()>({}[])](<<>{}>{{}{}}))<<({}{}){{}()}>[([]{})[[]()]]>>{{<[()<>]{()<>}>((<>())[{}<>])}<[(<
|
||||||
|
<([{({({<({[[(()[])[[][]]][(()){()[]}]](<{()<>}(()())><[[]()]([][])>)}{[{[<><>][{}{}]}<(<>[]){{}[]}>]
|
||||||
|
(({[<<[[{{<[{{[][]}(()[])}{<()<>>}]([<[]<>><{}<>>]{<{}()>[<><>]})><{{<<>{}>[[]{}]}{<{}<>>[[]{})}}<<<{}<>>
|
||||||
|
<{{<(({{(<[<<[[][]]{[]()}>><<{()[]}{<>)>(({}{})(()()))>]{(<({})({}{})>([()()]<{}<>>)){([{}[]]([]{}))[<[]
|
||||||
|
{({[<<[[<[<(<{<>{}}{{}()]>([{}[]][()[]])){{[()[]]{<><>}}({<>()}[<>()])}><<{[()<>]<[]>}<({}[]
|
||||||
|
<{{<<{<{<([(([<>()])<({}())<{}[]>>)[[(()())[()()]]{{()()}<{}()>}]])<[([<{}{}><[][]>])[[<[]<>>{[]<>}
|
||||||
|
<{<([[<{[{([[[[][]]<[]<>>][({}()){()()}]]<(([]())[<>[]]){[()<>]}>)[[<<{}<>>([]{})>[(()<>)[[]()]]]]}((((<<>>
|
||||||
|
[[{[<<([[({{<<{}<>>{<><>}>[<(){}>([]<>)]}<{<{}[]>{()[]}}((<>{})<()[]>}>}[<([[][]]([][]))({()()}<()
|
||||||
|
[{[[{(<({(<({({}<>){{}[]}}{<<>[]>{()[]}})<(({}())[[]{}])>><[<{{}[]}>{<[][]>[()]}]{((<>{})(<>
|
||||||
|
{{<{[[[(<({<(<[][]><{}<>>)[(<>{})<<><>>]>})>)]]]}{([[<<{[{<<()[]>({}{})>({{}()})}]<{[{()()}]<[[]]<()>>
|
||||||
|
[{{[<((<<(({{[[]()]([]())}{<[]{}>[{}{}]}}<({<>{}}{()[]})<{{}}{{}[]}>>)(<<<{}[])<[]()>>({[]
|
||||||
|
([[[<(<([{(({{{}[]}[{}]}[[()()][{}{}]]}({(<>{})({}())}({()()}([]<>)))){{({()<>}(<>[]))[(()())<[][]>
|
||||||
|
{([<<{<(<((({({}[])({}[])}([<><>]([]())))<<<[]{}><<><>>>({{}[]}{()[]})>}(<[({}[]){<>[]}](<[][]>{{
|
||||||
|
{{(<{<([[<[[(((){})<{}[]>)[[[]<>][<>()]]]{((<>[])(<>())){<<>>([]{})}}]<[([[][]][{}])]>><(({{<>()}}[<[][]>])
|
||||||
|
{[[{<<<{{{[[(<(){}>{[]{}})]]}({<[[{}()][{}{}]]{({}[])[{}<>]}>{{{[]<>}[<>[]]}<{[][]}(<>[])>}})}{[<{[([][]){<
|
||||||
|
<[<{<[{<({(<<([][])<()[]>><[<>()]{{}()}>)<([()<>]<<>{}>)(({}<>)[()<>])>)})>}][(<<<[[({{}()}{{}[
|
||||||
|
<{{(<<{[{<{{{{[]<>}{()()}}{(<>()){()[]}}}[{(<>[])}(({}[])[()[]])]}<<[{<>()}]<{<>()}<{}()>>>{((<
|
||||||
|
{[<[{{[[<[{<<[[][]]<{}[]>>><<<()[]>({}[])>>}([[[[][]]]((<>())<<>()>)](<[{}()]<[][]>>({<>[]}{[]()}))>]{{<[{{}
|
||||||
|
<([[{[{<<(<{<[{}[]]{(){}}>(<{}<>>{<>()})}{(<(){}>{[]))((()<>)[{}[]])}><(<<(){}><()>>){(<()<>>(()()))<({}())[
|
||||||
|
{<(<<{<[<<<[[<[]{}><[]()>]<{{}{}}{{}<>}>]>[[(<<><>>((){}))]({<()()><{}{}>}({<>()}))]>>]([(({<{()()}[
|
||||||
|
([{[([({[[<[{(<>[])<<>()>}[[{}[]]<[][]>]]><(<<()<>>({}<>)><(()[])(()())>)({[[]{}]{<>()}}{[[]
|
||||||
|
[(({([{[<<[{{((){})({}())}}]{{{<()<>>[[]()]}((<>[])(<>()))}[[[<><>]([]())]({()[]}{()[]})]}>>({[[<<
|
||||||
|
<{{(([[[<(<(([[]()]<[]{}>))[<[{}{}](()())>[[()<>](()())]]>{<{<()<>>}(<{}<>>[[]()])>})>[({<
|
||||||
|
[<{([{{<<{{(<([]{})[<>{}]>[<()<>><()[]>])({(()<>)<<>[]>)(([]{})([]<>)))}}>[{[({({}())[(){}]}<(
|
||||||
|
<([<<[<(<<<<({()[]}<{}<>>)[[()[]][[]()]]><({{}{}}){[[][]]}>>{[((()[])[[][]]>{{()()}{()<>}}]<{<
|
||||||
|
<((<{<{<{<<[[<<>()>{<>}]{({}[])<<><>>}]([{()<>}{[][]}]([[]<>](<>())))>[<<[[]<>]<()()>>[{()()}<(){
|
||||||
|
<<{[{[{[<{{<<[<>()]<[]<>>>[[()()][{}{}]]>([{{}[]}<()<>>])}[((([]{})[[]<>])<<{}{}>{<>[]}))]}><[{(
|
||||||
|
{{{{<<[{<{(({<{}()><[]<>>})[{<[]{}><()()>}{<<>[]>[[][]]}))<{<[<>[]][[]{}]>{[(){}][[]()]}}{{
|
||||||
|
<<{([({{[{{<[<[][]>{[]<>}][<[]()>]>{{[{}][()[]]}({{}[]}[()[]])}}{[[<<>{}>](<()()>)][<[[]{}]<{}{}>>
|
||||||
|
[{{<{([[<{(({<[]{}><[]()>}<<()<>><<>()>>)<{(<>()}[{}<>]}>){(<{<>{}}({}[])><{()<>}>)}}[({(<[]()>({}<>))<[[]
|
||||||
|
{{{({({<{<{[[{[]{}}{[]()}]<{{}()}<{}[]>>]({<[]<>>[[]()]}<[<>[]}<{}<>>>)}{<<(()[])<()[]>>[(<>[])<()[]>]>(<[[](
|
||||||
|
<{[(([[[([[<[[{}()]([]<>)][(()[])[<><>]]>(([<>{}]({}()))<{{}}[[][]]>)]({{<{}[]><[]()>}({[]{})[[
|
||||||
|
{(<({({(<(<(([<>()][{}<>])<{()<>}<{}()>>)[[[()[]]<[]{}>][[()<>]<[]{}>]]>{<<<[]><[]()>><(<><>)<[]{}>>>})(([
|
||||||
|
<{<(([(<<<<<{(()<>)}{<()()>(<>[])}>>>>>){{(<<[[{<>[]}(<><>)]<{[]{}}>]>>)[([{[[<><>]<()()>]{(()[])<<><>>}
|
||||||
|
({{[(<([({((([()[]]{{}{}})[(<>{})([][])])){{({<><>}[()()]){<{}[]>[<><>]}}}}{(<[<<>[]>]>><<[{()}<()()>]
|
||||||
|
([{[[([{<[({{({}[]><[][]>}}((<()()>[<>[]])<({}())({}())>))]<[[[(<>{}){[]}]{{[][]}{()[]}}]]<{<<{}<>><<
|
||||||
|
({{<[[({{((<[{()<>}[{}[]]]([[]()](()[]))>{[{()[]}{{}[]}][{{}{}}{[]{}}]})({{[{}](<><>)}[([]()
|
||||||
|
[<<{[{({{[[{{<[]{}>[<>[]]}<({}[])[()[]]>>{[[<>()]{{}[]}][{[]{}}{[]()}]}][<<([]()){[]<>}>((<>){{}()})>[{{{}(
|
||||||
|
(<{[{<{[[[<[<{{}<>}<()>>{[<><>][()()]}][<[<>()]{{}{}}>([[]())[[]<>])]>]{[(<[()()]{<><>}>{[{}[]]<
|
||||||
|
<{[[[{(({{<({(()[])(<>{})}(<[][]>[<>]))({([]<>)<<>[]>}<[<><>][()()]>)>[<[[<><>][()()]](<()>[()<>]
|
||||||
|
[<[([[<<[{((<[<>{}][{}[]]><(<>{}){[]<>}>))}][{{<<<[][]><{}<>>>><({()[]}<()[]>)>}<([<(){}>({}())]<[{}][()]>)[
|
||||||
|
[([({{[[{{[[{{{}{}}<[]<>>}]]<{{{{}{}}<<>()>}((()())({}[]))}[[<(){}>(<>{})][[<>{}]{{}<>}]]>
|
||||||
|
<<[{<<([[({([[[][]]{{}()}])[[{{}[]}<{}()>]{[(){}]{<>[]}}]}([{{[][]}>]<{{()[]}<()[]>}<(()<>)
|
||||||
|
[[[{(<[[{(({<({}())>{{<>{}}[{}{}]]}<{{()()}[{}<>]}[<{}<>>(<><>)]>))<<<{<<>[]>}{[{}()][{}{}]}>[<[(){}][{}{}
|
||||||
|
{<([{[[([{[{(<()()><<>[]>)(({}{})[{}<>])}[<<()[]>[()<>]>{({}<>){()()}}]]<<{(<>[]){()()}}<{{}[]}(<><>)>>((
|
||||||
|
(({{<(<({[[{({{}[]}([][]))[{[]<>}<<>[]>]}[<{[]{}}([])>]]{{([<>[]]({}()))(<()<>>{[]{}})}}][{<<{<>()
|
||||||
|
{{[<[<(([<{[([()()][[]<>])[<()<>>{()[]}]]}>[{({{()()}([][])}({()}(()<>)))[[({}())]{{<>()}[<>]}]}]]{<{({({
|
||||||
|
{{([([({[<((<{<><>}>{(<>[])})([({}{}){<>()}]))<[{<{}{}>{<>[]}}]<(<(){}>{()<>}){<<><>>}>>>[{[
|
||||||
|
[<{<[(<{{[((<[<><>]{(){}}>(([]<>)[()()]))(<{{}()}[{}[]]>{<<><>>{()<>}}))({[<()()>{<><>}]<{[]<
|
||||||
|
<((([(<[{<<[<<<>()>({})>][((()[]))<{{}()><<><>>>]>>({[[[<>{}][<><>]]({{}()}<{}{}>)]}((<<[]>
|
||||||
|
[[{({[({[[[[<[<>()]{<>{}}>]{([<>{}](()<>))[[{}<>]({}[])]}]{{{(<>{})({}[]]}}[{[()<>]{()()}}]}]]<<{[((<>())<()<
|
||||||
|
{<{{{([(<([<[{<>()}{<>{}}]<([]{})<[][]>>>([<(){}>[[][]]]{<()<>><<>[]>})]<<<[()()]>>[([()()]
|
||||||
|
[([[(({[[{{<{(<>{})<(){}>}[({}{})[<><>]]>({<<>{}>[<>{}]})}}[[<{<()><{}{}>}{{<><>}}>([[()()]{{
|
||||||
|
{{[({({([([<({()}([]()))>[[(<>[]){<><>}][{[]{}]<{}>]]]{{[({}{}){<><>}][[[]<>][<>[]]]}((([]<
|
||||||
|
{{<<[<<(({[[{{{}()}({}{})}<{()[]}{()()}>][{{<>{}}[()<>]}([{}[]]{{}[]})]]<[{{[]<>}{<>{}}}{[<>[]]<[][]>}]
|
||||||
|
[{<({({<{{({{{<>{}}<{}()>}{(<>())[<>{}]}}[(<<>{}>[{}])])((<<<><>><{}()>>(<<><>>([])))(<([]<>)>{{
|
||||||
|
{[<[((<{{[{{<({}{})>}<((<>)<[]<>>)[[<>()]{{}}]>}]}}>))]({[{{([[<<<{}[]>><<<>()><<>[]>>>[{{(){}}}<[[]{}]({}
|
||||||
|
<<<[<({[(<(<<(()<>)<{}{}>>{([]<>){<>{}}}>{{<{}<>>(<>{})}<[()<>]>})<{[({}())[<>[]]]({<>()}<<>{}>)><{
|
||||||
|
({<<[{<<[{{<([(){}]<<>()>)<<<>()>[[]()]>>(<{<>()}([]())>{[[]<>](<>{})})}}]]{<(<<[<<><>>((){})]{
|
||||||
|
<([{{[{<<[[{{[{}[]][()]}<[{}()][[][]]>}}[<{[<>[]]{{}()}}>{(<()()><[][]>)({()<>})}]]<[<[<{}<>>([]<>)
|
||||||
|
([<<[[([(<<[({()<>})<{[]()}{()}>]({{()<>}})>{[([<>()]([]()))[{[]{}}]]}>{{{(<[]()><[]>)<{{}{}}[{
|
||||||
|
([[{[[{<{[{<({()()}[<>{}])<<{}{}><<>()>>><[[<>{}](<>()]]<<[][]>{<>{}}>>}][<{(<<>()>[()[]])<{<>{}}
|
||||||
|
<{<<{<((([{[<(())<{}[]>>]<(<{}()><<>{}>)<<<>{}>>>}<{{<<>()>{{}()}}<<(){}>>}[[{[]()}({}())]((<>
|
||||||
|
([[([(<[<<{[<[()<>][[]()]>[[[]<>]<()()>]][[(<><>)]<<<>>(<>[])>]}><{([(<><>)]{[()<>}})}>><<[[(<
|
||||||
|
{{(<<({<([([{{[]()}}([<>{}]{{}()})])])[[[[[[<>{}>({}())]{{[]{}}({}())}]]([{{<>}(()<>)}[{<>()}<[][]>]])](<[[[
|
||||||
|
((({{<[<<{{{<<[]()>[<>[]]>[({}[])([]{})]}<<[[]{}]<()<>>><({}())(())>>}[<<[(){}]<[]()>>[{{}<>}
|
||||||
|
[<([<{[([[[(<[<>{}]({}{})>([()[]]({})))([{()()}{()[]}]<[<><>]{()()}>)]({({(){}}{<><>})<[<>()]{{}()
|
||||||
|
<(({(<[[{[{[((<>())[{}])[[<>]{<>()}]](<{[][]}{<>()}>([<>{}>{[]<>}))}[[({<>{}}{<>()})((()[])<<>
|
||||||
|
<{{{{<{[[<[({{<>[]}(()<>)})<(<<>{}>[(){}])[{<>{}}{<>{}}]>]({[{<>()}<()<>>]{<[]()><{}()>}}([
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
[({(<(())[]>[[{[]{<()<>>
|
||||||
|
[(()[<>])]({[<{<<[]>>(
|
||||||
|
{([(<{}[<>[]}>{[]{[(<()>
|
||||||
|
(((({<>}<{<{<>}{[]{[]{}
|
||||||
|
[[<[([]))<([[{}[[()]]]
|
||||||
|
[{[{({}]{}}([{[{{{}}([]
|
||||||
|
{<[[]]>}<{[{[{[]{()[[[]
|
||||||
|
[<(<(<(<{}))><([]([]()
|
||||||
|
<{([([[(<>()){}]>(<<{{
|
||||||
|
<{([{{}}[<[[[<>{}]]]>[]]
|
||||||
|
|
@ -0,0 +1,157 @@
|
||||||
|
use std::io::{BufReader, Read};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
const NUM_ROWS: usize = 10;
|
||||||
|
const NUM_COLS: usize = 10;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
map: Vec<Vec<u32>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_to_string(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let mut map = Vec::new();
|
||||||
|
for line in buf.split_terminator('\n') {
|
||||||
|
let m = line.chars().map(|c| c.to_digit(10).unwrap()).collect();
|
||||||
|
map.push(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
Input { map }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn flash(m: &mut [Vec<u32>], fm: &mut [[bool; NUM_COLS]; NUM_ROWS], r: usize, c: usize) -> u32 {
|
||||||
|
let dirs: [(i8, i8); 8] = [
|
||||||
|
(-1, -1),
|
||||||
|
(-1, 0),
|
||||||
|
(-1, 1),
|
||||||
|
(0, -1),
|
||||||
|
(0, 1),
|
||||||
|
(1, -1),
|
||||||
|
(1, 0),
|
||||||
|
(1, 1),
|
||||||
|
];
|
||||||
|
|
||||||
|
if fm[r][c] {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
fm[r][c] = true;
|
||||||
|
|
||||||
|
let mut num_flashes = 1;
|
||||||
|
|
||||||
|
for (d_r, d_c) in dirs {
|
||||||
|
let r: i8 = ((d_r as isize) + (r as isize)).try_into().unwrap();
|
||||||
|
let c: i8 = ((d_c as isize) + (c as isize)).try_into().unwrap();
|
||||||
|
|
||||||
|
if r < 0 || c < 0 || r as usize >= m.len() || c as usize >= m[0].len() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let r: usize = r.try_into().unwrap();
|
||||||
|
let c: usize = c.try_into().unwrap();
|
||||||
|
|
||||||
|
m[r][c] += 1;
|
||||||
|
|
||||||
|
if m[r][c] > 9 {
|
||||||
|
num_flashes += flash(m, fm, r, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
num_flashes
|
||||||
|
}
|
||||||
|
|
||||||
|
fn print_matrix(m: &[Vec<u32>]) {
|
||||||
|
for row in m {
|
||||||
|
for c in row {
|
||||||
|
print!("{}", *c);
|
||||||
|
}
|
||||||
|
println!()
|
||||||
|
}
|
||||||
|
println!()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dumbo_octopus_1(test_mode: TestMode) {
|
||||||
|
let mut input = parse_input(test_mode);
|
||||||
|
|
||||||
|
const NUM_STEPS: usize = 100;
|
||||||
|
|
||||||
|
println!("Before any steps:");
|
||||||
|
print_matrix(&input.map);
|
||||||
|
|
||||||
|
let mut num_flashes = 0;
|
||||||
|
for s in 1..=NUM_STEPS {
|
||||||
|
let mut fm = [[false; 10]; 10];
|
||||||
|
|
||||||
|
for r in 0..NUM_ROWS {
|
||||||
|
for c in 0..NUM_COLS {
|
||||||
|
input.map[r][c] += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for r in 0..NUM_ROWS {
|
||||||
|
for c in 0..NUM_COLS {
|
||||||
|
if input.map[r][c] > 9 {
|
||||||
|
num_flashes += flash(&mut input.map, &mut fm, r, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (r, row) in fm.iter().enumerate() {
|
||||||
|
for (c, cell) in row.iter().enumerate() {
|
||||||
|
if *cell {
|
||||||
|
input.map[r][c] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("After step {}", s);
|
||||||
|
print_matrix(&input.map);
|
||||||
|
}
|
||||||
|
println!("{}", num_flashes);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn dumbo_octopus_2(test_mode: TestMode) {
|
||||||
|
let mut input = parse_input(test_mode);
|
||||||
|
|
||||||
|
println!("Before any steps:");
|
||||||
|
print_matrix(&input.map);
|
||||||
|
|
||||||
|
let mut s = 0;
|
||||||
|
loop {
|
||||||
|
s += 1;
|
||||||
|
|
||||||
|
let mut fm = [[false; 10]; 10];
|
||||||
|
|
||||||
|
for r in 0..NUM_ROWS {
|
||||||
|
for c in 0..NUM_COLS {
|
||||||
|
input.map[r][c] += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut num_flashes = 0;
|
||||||
|
for r in 0..NUM_ROWS {
|
||||||
|
for c in 0..NUM_COLS {
|
||||||
|
if input.map[r][c] > 9 {
|
||||||
|
num_flashes += flash(&mut input.map, &mut fm, r, c);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (r, row) in fm.iter().enumerate() {
|
||||||
|
for (c, cell) in row.iter().enumerate() {
|
||||||
|
if *cell {
|
||||||
|
input.map[r][c] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("After step {}", s);
|
||||||
|
print_matrix(&input.map);
|
||||||
|
|
||||||
|
if num_flashes as usize == NUM_ROWS * NUM_COLS {
|
||||||
|
println!("{}", s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
8261344656
|
||||||
|
7773351175
|
||||||
|
7527856852
|
||||||
|
1763614673
|
||||||
|
8674556743
|
||||||
|
6853382153
|
||||||
|
4135852388
|
||||||
|
2846715522
|
||||||
|
7477425863
|
||||||
|
4723888888
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
5483143223
|
||||||
|
2745854711
|
||||||
|
5264556173
|
||||||
|
6141336146
|
||||||
|
6357385478
|
||||||
|
4167524645
|
||||||
|
2176841721
|
||||||
|
6882881134
|
||||||
|
4846848554
|
||||||
|
5283751526
|
||||||
|
|
@ -0,0 +1,154 @@
|
||||||
|
use std::{
|
||||||
|
collections::{HashMap, HashSet},
|
||||||
|
io::{BufReader, Read},
|
||||||
|
ops::{AddAssign, SubAssign},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
struct Input {
|
||||||
|
graph: HashMap<Cave, HashSet<Cave>>,
|
||||||
|
start: Cave,
|
||||||
|
end: Cave,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||||
|
enum Cave {
|
||||||
|
Small(String),
|
||||||
|
Big(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<&str> for Cave {
|
||||||
|
fn from(s: &str) -> Self {
|
||||||
|
if s.to_lowercase() == s {
|
||||||
|
Cave::Small(s.to_owned())
|
||||||
|
} else {
|
||||||
|
Cave::Big(s.to_owned())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_to_string(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let mut graph = HashMap::new();
|
||||||
|
for line in buf.split_terminator('\n') {
|
||||||
|
let mut s = line.split_terminator('-');
|
||||||
|
let a = Cave::from(s.next().unwrap());
|
||||||
|
let b = Cave::from(s.next().unwrap());
|
||||||
|
|
||||||
|
graph
|
||||||
|
.entry(a.to_owned())
|
||||||
|
.or_insert_with(HashSet::new)
|
||||||
|
.insert(b.to_owned());
|
||||||
|
graph.entry(b).or_default().insert(a.to_owned());
|
||||||
|
}
|
||||||
|
|
||||||
|
Input {
|
||||||
|
graph,
|
||||||
|
start: Cave::from("start"),
|
||||||
|
end: Cave::from("end"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_paths(input: &Input, path: &mut Vec<Cave>) -> usize {
|
||||||
|
let current_node = path.last().unwrap();
|
||||||
|
if current_node == &input.end {
|
||||||
|
// println!("{}", path.join(","));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut paths = 0;
|
||||||
|
|
||||||
|
for n in &input.graph[current_node] {
|
||||||
|
let n = n.to_owned();
|
||||||
|
|
||||||
|
let is_small_cave = match n {
|
||||||
|
Cave::Small(_) => true,
|
||||||
|
Cave::Big(_) => false,
|
||||||
|
};
|
||||||
|
|
||||||
|
if !is_small_cave || !path.contains(&n) {
|
||||||
|
path.push(n.to_owned());
|
||||||
|
paths += find_paths(input, path);
|
||||||
|
path.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
paths
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_paths2(
|
||||||
|
input: &Input,
|
||||||
|
path: &mut Vec<Cave>,
|
||||||
|
small_cave_occurances: &mut HashMap<Cave, i32>,
|
||||||
|
) -> usize {
|
||||||
|
let current_node = path.last().unwrap();
|
||||||
|
if current_node == &input.end {
|
||||||
|
// let v: Vec<_> = path
|
||||||
|
// .iter()
|
||||||
|
// .map(|p| match p {
|
||||||
|
// Cave::Small(n) => n.to_owned(),
|
||||||
|
// Cave::Big(n) => n.to_owned(),
|
||||||
|
// })
|
||||||
|
// .collect();
|
||||||
|
// println!("{}", v.join(","));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut num_paths = 0;
|
||||||
|
|
||||||
|
let has_double = small_cave_occurances.values().filter(|v| **v == 2).count() >= 1;
|
||||||
|
|
||||||
|
for n in &input.graph[current_node] {
|
||||||
|
if n == &input.start {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let e = small_cave_occurances.entry(n.to_owned()).or_default();
|
||||||
|
if *e >= 2 || (*e == 1 && has_double) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if let Cave::Small(_) = n {
|
||||||
|
e.add_assign(1)
|
||||||
|
};
|
||||||
|
|
||||||
|
path.push(n.to_owned());
|
||||||
|
|
||||||
|
num_paths += find_paths2(input, path, small_cave_occurances);
|
||||||
|
|
||||||
|
if let Cave::Small(_) = n {
|
||||||
|
small_cave_occurances
|
||||||
|
.entry(n.to_owned())
|
||||||
|
.or_default()
|
||||||
|
.sub_assign(1)
|
||||||
|
};
|
||||||
|
|
||||||
|
path.pop();
|
||||||
|
}
|
||||||
|
|
||||||
|
num_paths
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn passage_passing_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
println!("{:?}", input);
|
||||||
|
|
||||||
|
let mut path = vec![input.start.clone()];
|
||||||
|
let paths = find_paths(&input, &mut path);
|
||||||
|
println!("{}", paths);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn passage_passing_2(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
println!("{:?}", input);
|
||||||
|
|
||||||
|
let mut path = vec![input.start.clone()];
|
||||||
|
let mut small_cave_occurances = HashMap::new();
|
||||||
|
let paths = find_paths2(&input, &mut path, &mut small_cave_occurances);
|
||||||
|
println!("{}", paths);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
start-YA
|
||||||
|
ps-yq
|
||||||
|
zt-mu
|
||||||
|
JS-yi
|
||||||
|
yq-VJ
|
||||||
|
QT-ps
|
||||||
|
start-yq
|
||||||
|
YA-yi
|
||||||
|
start-nf
|
||||||
|
nf-YA
|
||||||
|
nf-JS
|
||||||
|
JS-ez
|
||||||
|
yq-JS
|
||||||
|
ps-JS
|
||||||
|
ps-yi
|
||||||
|
yq-nf
|
||||||
|
QT-yi
|
||||||
|
end-QT
|
||||||
|
nf-yi
|
||||||
|
zt-QT
|
||||||
|
end-ez
|
||||||
|
yq-YA
|
||||||
|
end-JS
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
fs-end
|
||||||
|
he-DX
|
||||||
|
fs-he
|
||||||
|
start-DX
|
||||||
|
pj-DX
|
||||||
|
end-zg
|
||||||
|
zg-sl
|
||||||
|
zg-pj
|
||||||
|
pj-he
|
||||||
|
RW-he
|
||||||
|
fs-DX
|
||||||
|
pj-RW
|
||||||
|
zg-RW
|
||||||
|
start-pj
|
||||||
|
he-WI
|
||||||
|
zg-he
|
||||||
|
pj-fs
|
||||||
|
start-RW
|
||||||
|
|
@ -0,0 +1,153 @@
|
||||||
|
use std::{
|
||||||
|
collections::HashSet,
|
||||||
|
io::{BufReader, Read},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Eq, Hash, PartialEq)]
|
||||||
|
struct Point {
|
||||||
|
x: u16,
|
||||||
|
y: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
enum Fold {
|
||||||
|
X(u16),
|
||||||
|
Y(u16),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
points: HashSet<Point>,
|
||||||
|
folds: Vec<Fold>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_to_string(&mut buf).unwrap();
|
||||||
|
let lines = buf.split_terminator('\n');
|
||||||
|
|
||||||
|
let mut first_input_stage = true;
|
||||||
|
|
||||||
|
let mut points = HashSet::new();
|
||||||
|
let mut folds = vec![];
|
||||||
|
|
||||||
|
for line in lines {
|
||||||
|
if line.is_empty() {
|
||||||
|
first_input_stage = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if first_input_stage {
|
||||||
|
let mut s = line.split_terminator(',');
|
||||||
|
points.insert(Point {
|
||||||
|
x: s.next().unwrap().parse().unwrap(),
|
||||||
|
y: s.next().unwrap().parse().unwrap(),
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
let mut s = line
|
||||||
|
.strip_prefix("fold along ")
|
||||||
|
.unwrap()
|
||||||
|
.split_terminator('=');
|
||||||
|
let f = match s.next().unwrap() {
|
||||||
|
"x" => Fold::X(s.next().unwrap().parse().unwrap()),
|
||||||
|
"y" => Fold::Y(s.next().unwrap().parse().unwrap()),
|
||||||
|
_ => panic!(),
|
||||||
|
};
|
||||||
|
folds.push(f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Input { points, folds }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn transparent_origami_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
println!("{:?}", input);
|
||||||
|
|
||||||
|
let mut paper_points = input.points.clone();
|
||||||
|
let mut new_paper_points = HashSet::new();
|
||||||
|
match input.folds[0] {
|
||||||
|
Fold::X(x) => {
|
||||||
|
for p in paper_points {
|
||||||
|
if p.x < x {
|
||||||
|
new_paper_points.insert(p);
|
||||||
|
} else {
|
||||||
|
new_paper_points.insert(Point {
|
||||||
|
x: 2 * x - p.x,
|
||||||
|
..p
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Fold::Y(y) => {
|
||||||
|
for p in paper_points {
|
||||||
|
if p.y < y {
|
||||||
|
new_paper_points.insert(p);
|
||||||
|
} else {
|
||||||
|
new_paper_points.insert(Point {
|
||||||
|
y: 2 * y - p.y,
|
||||||
|
..p
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
paper_points = new_paper_points;
|
||||||
|
|
||||||
|
println!("{:?}", paper_points);
|
||||||
|
println!("num points: {}", paper_points.len());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn show_paper(paper_points: &HashSet<Point>) {
|
||||||
|
for y in 0..=paper_points.iter().map(|p| p.y).max().unwrap() {
|
||||||
|
for x in 0..=paper_points.iter().map(|p| p.x).max().unwrap() {
|
||||||
|
if paper_points.contains(&Point { x, y }) {
|
||||||
|
print!("*");
|
||||||
|
} else {
|
||||||
|
print!(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn transparent_origami_2(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
let mut paper_points = input.points.clone();
|
||||||
|
for f in input.folds {
|
||||||
|
let mut new_paper_points = HashSet::new();
|
||||||
|
match f {
|
||||||
|
Fold::X(x) => {
|
||||||
|
for p in paper_points {
|
||||||
|
if p.x < x {
|
||||||
|
new_paper_points.insert(p);
|
||||||
|
} else {
|
||||||
|
new_paper_points.insert(Point {
|
||||||
|
x: 2 * x - p.x,
|
||||||
|
..p
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Fold::Y(y) => {
|
||||||
|
for p in paper_points {
|
||||||
|
if p.y < y {
|
||||||
|
new_paper_points.insert(p);
|
||||||
|
} else {
|
||||||
|
new_paper_points.insert(Point {
|
||||||
|
y: 2 * y - p.y,
|
||||||
|
..p
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
paper_points = new_paper_points;
|
||||||
|
}
|
||||||
|
|
||||||
|
show_paper(&paper_points);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,763 @@
|
||||||
|
1288,822
|
||||||
|
842,72
|
||||||
|
693,68
|
||||||
|
561,254
|
||||||
|
1007,192
|
||||||
|
405,794
|
||||||
|
929,45
|
||||||
|
58,296
|
||||||
|
411,317
|
||||||
|
164,3
|
||||||
|
894,317
|
||||||
|
371,306
|
||||||
|
272,205
|
||||||
|
646,865
|
||||||
|
1027,700
|
||||||
|
920,667
|
||||||
|
728,665
|
||||||
|
1240,105
|
||||||
|
390,227
|
||||||
|
972,257
|
||||||
|
561,640
|
||||||
|
954,128
|
||||||
|
440,194
|
||||||
|
1136,712
|
||||||
|
37,516
|
||||||
|
1072,93
|
||||||
|
1210,576
|
||||||
|
390,486
|
||||||
|
682,611
|
||||||
|
343,368
|
||||||
|
236,840
|
||||||
|
366,889
|
||||||
|
238,644
|
||||||
|
55,130
|
||||||
|
939,388
|
||||||
|
619,726
|
||||||
|
1092,23
|
||||||
|
1180,458
|
||||||
|
338,189
|
||||||
|
176,516
|
||||||
|
915,210
|
||||||
|
550,100
|
||||||
|
773,466
|
||||||
|
351,554
|
||||||
|
460,389
|
||||||
|
266,560
|
||||||
|
154,810
|
||||||
|
604,646
|
||||||
|
969,880
|
||||||
|
627,793
|
||||||
|
211,0
|
||||||
|
842,520
|
||||||
|
460,647
|
||||||
|
678,72
|
||||||
|
1007,702
|
||||||
|
863,170
|
||||||
|
371,836
|
||||||
|
716,233
|
||||||
|
1260,695
|
||||||
|
682,84
|
||||||
|
710,745
|
||||||
|
852,94
|
||||||
|
200,756
|
||||||
|
574,383
|
||||||
|
112,306
|
||||||
|
1072,698
|
||||||
|
1103,460
|
||||||
|
617,826
|
||||||
|
276,827
|
||||||
|
1158,73
|
||||||
|
959,702
|
||||||
|
454,327
|
||||||
|
90,502
|
||||||
|
790,463
|
||||||
|
480,742
|
||||||
|
985,577
|
||||||
|
1205,334
|
||||||
|
298,766
|
||||||
|
371,388
|
||||||
|
320,754
|
||||||
|
1004,252
|
||||||
|
765,437
|
||||||
|
1290,550
|
||||||
|
1191,210
|
||||||
|
1170,296
|
||||||
|
865,522
|
||||||
|
262,663
|
||||||
|
504,714
|
||||||
|
406,222
|
||||||
|
174,630
|
||||||
|
402,609
|
||||||
|
30,169
|
||||||
|
164,127
|
||||||
|
1074,54
|
||||||
|
663,77
|
||||||
|
136,353
|
||||||
|
316,632
|
||||||
|
164,52
|
||||||
|
512,718
|
||||||
|
1038,82
|
||||||
|
351,453
|
||||||
|
1027,413
|
||||||
|
68,600
|
||||||
|
1110,756
|
||||||
|
5,18
|
||||||
|
1160,180
|
||||||
|
632,822
|
||||||
|
600,793
|
||||||
|
798,718
|
||||||
|
428,625
|
||||||
|
964,443
|
||||||
|
904,672
|
||||||
|
596,122
|
||||||
|
174,745
|
||||||
|
366,403
|
||||||
|
648,252
|
||||||
|
1121,164
|
||||||
|
920,606
|
||||||
|
464,807
|
||||||
|
749,254
|
||||||
|
624,501
|
||||||
|
1282,543
|
||||||
|
1126,494
|
||||||
|
554,891
|
||||||
|
236,54
|
||||||
|
333,483
|
||||||
|
1233,459
|
||||||
|
843,504
|
||||||
|
928,171
|
||||||
|
500,278
|
||||||
|
1168,512
|
||||||
|
937,504
|
||||||
|
6,177
|
||||||
|
830,264
|
||||||
|
584,105
|
||||||
|
1287,788
|
||||||
|
375,250
|
||||||
|
982,58
|
||||||
|
788,695
|
||||||
|
386,324
|
||||||
|
1273,378
|
||||||
|
88,129
|
||||||
|
756,3
|
||||||
|
218,471
|
||||||
|
686,501
|
||||||
|
20,326
|
||||||
|
326,114
|
||||||
|
885,750
|
||||||
|
536,182
|
||||||
|
209,56
|
||||||
|
20,568
|
||||||
|
944,98
|
||||||
|
428,94
|
||||||
|
1101,693
|
||||||
|
644,413
|
||||||
|
373,410
|
||||||
|
912,830
|
||||||
|
1096,833
|
||||||
|
390,219
|
||||||
|
0,828
|
||||||
|
93,684
|
||||||
|
1038,306
|
||||||
|
1101,390
|
||||||
|
1037,493
|
||||||
|
1290,763
|
||||||
|
288,403
|
||||||
|
346,317
|
||||||
|
1191,140
|
||||||
|
840,821
|
||||||
|
962,131
|
||||||
|
1116,505
|
||||||
|
688,458
|
||||||
|
55,460
|
||||||
|
416,196
|
||||||
|
405,100
|
||||||
|
856,474
|
||||||
|
528,376
|
||||||
|
929,849
|
||||||
|
873,381
|
||||||
|
483,621
|
||||||
|
1002,317
|
||||||
|
1004,730
|
||||||
|
375,644
|
||||||
|
279,250
|
||||||
|
378,442
|
||||||
|
1128,317
|
||||||
|
1022,768
|
||||||
|
681,843
|
||||||
|
164,630
|
||||||
|
80,606
|
||||||
|
20,763
|
||||||
|
112,588
|
||||||
|
972,189
|
||||||
|
514,150
|
||||||
|
1084,766
|
||||||
|
433,782
|
||||||
|
373,484
|
||||||
|
1180,436
|
||||||
|
894,196
|
||||||
|
1089,560
|
||||||
|
1290,26
|
||||||
|
1192,731
|
||||||
|
576,672
|
||||||
|
1185,145
|
||||||
|
296,228
|
||||||
|
38,441
|
||||||
|
870,733
|
||||||
|
1059,747
|
||||||
|
1006,856
|
||||||
|
1255,434
|
||||||
|
1275,278
|
||||||
|
718,38
|
||||||
|
806,714
|
||||||
|
1304,177
|
||||||
|
313,14
|
||||||
|
412,563
|
||||||
|
877,112
|
||||||
|
238,698
|
||||||
|
976,502
|
||||||
|
1168,624
|
||||||
|
1139,397
|
||||||
|
1038,588
|
||||||
|
1010,308
|
||||||
|
242,115
|
||||||
|
679,393
|
||||||
|
935,838
|
||||||
|
959,620
|
||||||
|
62,550
|
||||||
|
8,29
|
||||||
|
1230,383
|
||||||
|
1256,745
|
||||||
|
1252,632
|
||||||
|
1184,376
|
||||||
|
140,296
|
||||||
|
1002,353
|
||||||
|
594,774
|
||||||
|
734,222
|
||||||
|
1242,70
|
||||||
|
1146,400
|
||||||
|
296,725
|
||||||
|
87,187
|
||||||
|
786,10
|
||||||
|
982,562
|
||||||
|
1128,577
|
||||||
|
1096,385
|
||||||
|
542,285
|
||||||
|
1198,588
|
||||||
|
433,112
|
||||||
|
161,82
|
||||||
|
492,854
|
||||||
|
209,504
|
||||||
|
80,624
|
||||||
|
984,556
|
||||||
|
325,364
|
||||||
|
126,868
|
||||||
|
1128,50
|
||||||
|
760,346
|
||||||
|
1287,554
|
||||||
|
1059,644
|
||||||
|
54,745
|
||||||
|
865,372
|
||||||
|
283,33
|
||||||
|
288,5
|
||||||
|
1038,597
|
||||||
|
944,348
|
||||||
|
863,252
|
||||||
|
994,262
|
||||||
|
788,505
|
||||||
|
37,378
|
||||||
|
1174,311
|
||||||
|
1124,374
|
||||||
|
990,140
|
||||||
|
383,764
|
||||||
|
1037,885
|
||||||
|
874,812
|
||||||
|
1120,171
|
||||||
|
662,754
|
||||||
|
1119,116
|
||||||
|
142,718
|
||||||
|
492,171
|
||||||
|
326,506
|
||||||
|
1146,630
|
||||||
|
1283,793
|
||||||
|
234,382
|
||||||
|
990,754
|
||||||
|
1230,606
|
||||||
|
1287,106
|
||||||
|
1116,4
|
||||||
|
1148,499
|
||||||
|
296,666
|
||||||
|
437,381
|
||||||
|
944,770
|
||||||
|
209,693
|
||||||
|
472,437
|
||||||
|
749,192
|
||||||
|
296,218
|
||||||
|
1248,102
|
||||||
|
1183,502
|
||||||
|
885,592
|
||||||
|
8,865
|
||||||
|
820,2
|
||||||
|
130,94
|
||||||
|
774,387
|
||||||
|
1086,263
|
||||||
|
119,140
|
||||||
|
962,252
|
||||||
|
1236,161
|
||||||
|
683,793
|
||||||
|
539,642
|
||||||
|
147,190
|
||||||
|
632,374
|
||||||
|
932,173
|
||||||
|
7,525
|
||||||
|
50,621
|
||||||
|
528,742
|
||||||
|
806,266
|
||||||
|
832,516
|
||||||
|
835,256
|
||||||
|
537,649
|
||||||
|
1014,423
|
||||||
|
15,816
|
||||||
|
1166,661
|
||||||
|
1223,747
|
||||||
|
105,334
|
||||||
|
408,507
|
||||||
|
636,465
|
||||||
|
1138,84
|
||||||
|
273,9
|
||||||
|
405,346
|
||||||
|
1139,716
|
||||||
|
761,560
|
||||||
|
559,12
|
||||||
|
328,836
|
||||||
|
1238,665
|
||||||
|
126,119
|
||||||
|
1310,828
|
||||||
|
981,418
|
||||||
|
390,606
|
||||||
|
348,252
|
||||||
|
80,383
|
||||||
|
600,275
|
||||||
|
502,98
|
||||||
|
875,130
|
||||||
|
405,548
|
||||||
|
756,563
|
||||||
|
351,441
|
||||||
|
232,292
|
||||||
|
510,213
|
||||||
|
358,808
|
||||||
|
241,11
|
||||||
|
1290,131
|
||||||
|
190,171
|
||||||
|
1232,672
|
||||||
|
306,730
|
||||||
|
340,404
|
||||||
|
1198,509
|
||||||
|
840,73
|
||||||
|
744,765
|
||||||
|
935,250
|
||||||
|
612,462
|
||||||
|
308,17
|
||||||
|
174,264
|
||||||
|
271,802
|
||||||
|
970,404
|
||||||
|
338,705
|
||||||
|
229,750
|
||||||
|
782,518
|
||||||
|
937,670
|
||||||
|
574,288
|
||||||
|
271,259
|
||||||
|
1148,575
|
||||||
|
1303,817
|
||||||
|
47,56
|
||||||
|
808,613
|
||||||
|
956,801
|
||||||
|
28,543
|
||||||
|
994,705
|
||||||
|
130,542
|
||||||
|
119,618
|
||||||
|
775,460
|
||||||
|
519,824
|
||||||
|
1248,744
|
||||||
|
574,848
|
||||||
|
1303,824
|
||||||
|
592,102
|
||||||
|
303,702
|
||||||
|
303,340
|
||||||
|
928,619
|
||||||
|
219,578
|
||||||
|
798,644
|
||||||
|
1037,849
|
||||||
|
150,180
|
||||||
|
1305,876
|
||||||
|
1180,94
|
||||||
|
908,285
|
||||||
|
706,646
|
||||||
|
490,52
|
||||||
|
214,283
|
||||||
|
6,588
|
||||||
|
236,137
|
||||||
|
584,718
|
||||||
|
218,306
|
||||||
|
850,330
|
||||||
|
981,866
|
||||||
|
1136,264
|
||||||
|
818,171
|
||||||
|
710,275
|
||||||
|
0,605
|
||||||
|
873,65
|
||||||
|
207,434
|
||||||
|
1255,460
|
||||||
|
952,808
|
||||||
|
850,135
|
||||||
|
1201,737
|
||||||
|
594,661
|
||||||
|
718,856
|
||||||
|
23,788
|
||||||
|
1184,308
|
||||||
|
1044,101
|
||||||
|
416,698
|
||||||
|
325,577
|
||||||
|
1165,887
|
||||||
|
535,140
|
||||||
|
162,575
|
||||||
|
1021,602
|
||||||
|
932,721
|
||||||
|
118,546
|
||||||
|
1184,294
|
||||||
|
634,868
|
||||||
|
584,294
|
||||||
|
528,518
|
||||||
|
596,150
|
||||||
|
902,507
|
||||||
|
627,742
|
||||||
|
810,278
|
||||||
|
63,266
|
||||||
|
115,476
|
||||||
|
985,317
|
||||||
|
870,161
|
||||||
|
529,590
|
||||||
|
214,611
|
||||||
|
20,131
|
||||||
|
49,520
|
||||||
|
1039,259
|
||||||
|
972,262
|
||||||
|
26,588
|
||||||
|
1261,520
|
||||||
|
375,838
|
||||||
|
1027,861
|
||||||
|
343,526
|
||||||
|
771,642
|
||||||
|
1146,127
|
||||||
|
838,577
|
||||||
|
77,459
|
||||||
|
907,634
|
||||||
|
492,275
|
||||||
|
1195,670
|
||||||
|
1235,634
|
||||||
|
126,308
|
||||||
|
62,38
|
||||||
|
58,324
|
||||||
|
390,288
|
||||||
|
191,116
|
||||||
|
905,794
|
||||||
|
478,378
|
||||||
|
846,737
|
||||||
|
1163,190
|
||||||
|
830,546
|
||||||
|
1230,507
|
||||||
|
1031,364
|
||||||
|
674,429
|
||||||
|
1084,317
|
||||||
|
1220,392
|
||||||
|
791,824
|
||||||
|
592,344
|
||||||
|
522,505
|
||||||
|
174,149
|
||||||
|
464,82
|
||||||
|
1220,502
|
||||||
|
276,4
|
||||||
|
346,353
|
||||||
|
112,385
|
||||||
|
266,793
|
||||||
|
1077,192
|
||||||
|
1062,448
|
||||||
|
42,432
|
||||||
|
528,824
|
||||||
|
346,577
|
||||||
|
1084,128
|
||||||
|
383,802
|
||||||
|
395,210
|
||||||
|
1027,33
|
||||||
|
592,150
|
||||||
|
1195,700
|
||||||
|
574,894
|
||||||
|
648,754
|
||||||
|
592,856
|
||||||
|
1267,77
|
||||||
|
1267,58
|
||||||
|
340,490
|
||||||
|
749,702
|
||||||
|
421,702
|
||||||
|
863,460
|
||||||
|
251,147
|
||||||
|
1238,341
|
||||||
|
698,462
|
||||||
|
440,611
|
||||||
|
249,346
|
||||||
|
964,281
|
||||||
|
172,138
|
||||||
|
664,865
|
||||||
|
115,726
|
||||||
|
136,801
|
||||||
|
155,845
|
||||||
|
810,362
|
||||||
|
283,506
|
||||||
|
412,779
|
||||||
|
219,477
|
||||||
|
944,5
|
||||||
|
226,128
|
||||||
|
1022,403
|
||||||
|
636,429
|
||||||
|
984,562
|
||||||
|
388,334
|
||||||
|
70,401
|
||||||
|
764,759
|
||||||
|
1074,502
|
||||||
|
50,695
|
||||||
|
846,157
|
||||||
|
972,632
|
||||||
|
666,413
|
||||||
|
1146,3
|
||||||
|
383,316
|
||||||
|
1149,82
|
||||||
|
356,128
|
||||||
|
1180,800
|
||||||
|
103,44
|
||||||
|
174,712
|
||||||
|
273,493
|
||||||
|
629,51
|
||||||
|
499,49
|
||||||
|
1274,742
|
||||||
|
416,252
|
||||||
|
683,242
|
||||||
|
596,296
|
||||||
|
316,637
|
||||||
|
882,129
|
||||||
|
1103,684
|
||||||
|
226,317
|
||||||
|
1077,702
|
||||||
|
1093,65
|
||||||
|
846,807
|
||||||
|
817,812
|
||||||
|
144,233
|
||||||
|
130,800
|
||||||
|
724,70
|
||||||
|
522,340
|
||||||
|
985,364
|
||||||
|
1310,156
|
||||||
|
1207,850
|
||||||
|
683,652
|
||||||
|
959,254
|
||||||
|
1297,462
|
||||||
|
390,675
|
||||||
|
856,518
|
||||||
|
1248,38
|
||||||
|
574,831
|
||||||
|
1061,548
|
||||||
|
447,460
|
||||||
|
818,40
|
||||||
|
182,801
|
||||||
|
676,26
|
||||||
|
308,613
|
||||||
|
272,689
|
||||||
|
1292,541
|
||||||
|
333,484
|
||||||
|
694,348
|
||||||
|
1146,842
|
||||||
|
792,353
|
||||||
|
1185,749
|
||||||
|
492,619
|
||||||
|
54,149
|
||||||
|
207,460
|
||||||
|
736,270
|
||||||
|
681,51
|
||||||
|
1222,250
|
||||||
|
985,353
|
||||||
|
319,402
|
||||||
|
316,262
|
||||||
|
272,306
|
||||||
|
20,282
|
||||||
|
406,672
|
||||||
|
990,541
|
||||||
|
1027,194
|
||||||
|
584,124
|
||||||
|
1260,646
|
||||||
|
190,801
|
||||||
|
850,759
|
||||||
|
1178,505
|
||||||
|
1091,130
|
||||||
|
1103,194
|
||||||
|
325,353
|
||||||
|
194,505
|
||||||
|
1223,187
|
||||||
|
686,277
|
||||||
|
105,177
|
||||||
|
308,283
|
||||||
|
216,763
|
||||||
|
288,546
|
||||||
|
1260,173
|
||||||
|
13,462
|
||||||
|
523,852
|
||||||
|
512,644
|
||||||
|
850,389
|
||||||
|
806,378
|
||||||
|
1263,56
|
||||||
|
764,135
|
||||||
|
718,150
|
||||||
|
736,0
|
||||||
|
773,354
|
||||||
|
1092,471
|
||||||
|
440,733
|
||||||
|
1138,810
|
||||||
|
874,530
|
||||||
|
775,684
|
||||||
|
959,640
|
||||||
|
818,275
|
||||||
|
775,434
|
||||||
|
1155,49
|
||||||
|
841,80
|
||||||
|
88,196
|
||||||
|
546,135
|
||||||
|
1265,873
|
||||||
|
782,586
|
||||||
|
283,413
|
||||||
|
1081,144
|
||||||
|
308,353
|
||||||
|
200,138
|
||||||
|
929,401
|
||||||
|
80,224
|
||||||
|
354,588
|
||||||
|
550,346
|
||||||
|
1222,765
|
||||||
|
522,695
|
||||||
|
832,378
|
||||||
|
920,219
|
||||||
|
937,581
|
||||||
|
171,397
|
||||||
|
728,229
|
||||||
|
830,854
|
||||||
|
25,51
|
||||||
|
226,331
|
||||||
|
1037,9
|
||||||
|
1176,431
|
||||||
|
686,871
|
||||||
|
694,98
|
||||||
|
928,597
|
||||||
|
1038,569
|
||||||
|
939,588
|
||||||
|
288,768
|
||||||
|
375,56
|
||||||
|
827,621
|
||||||
|
709,401
|
||||||
|
1021,292
|
||||||
|
340,42
|
||||||
|
281,448
|
||||||
|
1148,52
|
||||||
|
744,250
|
||||||
|
422,548
|
||||||
|
437,9
|
||||||
|
1014,725
|
||||||
|
662,140
|
||||||
|
1002,283
|
||||||
|
928,588
|
||||||
|
736,471
|
||||||
|
792,541
|
||||||
|
70,124
|
||||||
|
726,572
|
||||||
|
300,84
|
||||||
|
157,746
|
||||||
|
390,238
|
||||||
|
1260,273
|
||||||
|
1088,520
|
||||||
|
447,252
|
||||||
|
1078,346
|
||||||
|
234,512
|
||||||
|
577,883
|
||||||
|
1002,765
|
||||||
|
288,348
|
||||||
|
207,724
|
||||||
|
249,11
|
||||||
|
185,528
|
||||||
|
771,224
|
||||||
|
464,535
|
||||||
|
714,122
|
||||||
|
731,260
|
||||||
|
691,726
|
||||||
|
616,403
|
||||||
|
694,403
|
||||||
|
1168,718
|
||||||
|
279,530
|
||||||
|
894,698
|
||||||
|
686,23
|
||||||
|
771,726
|
||||||
|
1280,169
|
||||||
|
892,392
|
||||||
|
413,435
|
||||||
|
781,590
|
||||||
|
1175,742
|
||||||
|
774,182
|
||||||
|
313,880
|
||||||
|
828,138
|
||||||
|
88,250
|
||||||
|
539,224
|
||||||
|
582,105
|
||||||
|
724,518
|
||||||
|
551,268
|
||||||
|
490,891
|
||||||
|
23,106
|
||||||
|
991,402
|
||||||
|
229,144
|
||||||
|
566,250
|
||||||
|
1285,51
|
||||||
|
1068,779
|
||||||
|
182,577
|
||||||
|
472,885
|
||||||
|
770,840
|
||||||
|
1007,340
|
||||||
|
80,288
|
||||||
|
644,848
|
||||||
|
574,176
|
||||||
|
251,644
|
||||||
|
1014,218
|
||||||
|
1272,43
|
||||||
|
248,448
|
||||||
|
468,520
|
||||||
|
810,616
|
||||||
|
25,724
|
||||||
|
348,642
|
||||||
|
194,389
|
||||||
|
604,695
|
||||||
|
189,164
|
||||||
|
216,131
|
||||||
|
1116,564
|
||||||
|
674,465
|
||||||
|
125,749
|
||||||
|
907,147
|
||||||
|
10,413
|
||||||
|
937,410
|
||||||
|
550,822
|
||||||
|
|
||||||
|
fold along x=655
|
||||||
|
fold along y=447
|
||||||
|
fold along x=327
|
||||||
|
fold along y=223
|
||||||
|
fold along x=163
|
||||||
|
fold along y=111
|
||||||
|
fold along x=81
|
||||||
|
fold along y=55
|
||||||
|
fold along x=40
|
||||||
|
fold along y=27
|
||||||
|
fold along y=13
|
||||||
|
fold along y=6
|
||||||
|
|
@ -0,0 +1,21 @@
|
||||||
|
6,10
|
||||||
|
0,14
|
||||||
|
9,10
|
||||||
|
0,3
|
||||||
|
10,4
|
||||||
|
4,11
|
||||||
|
6,0
|
||||||
|
6,12
|
||||||
|
4,1
|
||||||
|
0,13
|
||||||
|
10,12
|
||||||
|
3,4
|
||||||
|
3,0
|
||||||
|
8,4
|
||||||
|
1,10
|
||||||
|
2,14
|
||||||
|
8,10
|
||||||
|
9,0
|
||||||
|
|
||||||
|
fold along y=7
|
||||||
|
fold along x=5
|
||||||
|
|
@ -0,0 +1,136 @@
|
||||||
|
use std::{
|
||||||
|
collections::{HashMap, HashSet},
|
||||||
|
io::{BufRead, BufReader},
|
||||||
|
ops::AddAssign,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
template: HashMap<String, u64>,
|
||||||
|
rules: HashMap<String, Vec<String>>,
|
||||||
|
template_terminal_chars: HashSet<char>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn split_template(s: &str) -> HashMap<String, u64> {
|
||||||
|
let x: Vec<_> = s
|
||||||
|
.as_bytes()
|
||||||
|
.windows(2)
|
||||||
|
.map(|w| String::from_utf8(w.to_vec()).unwrap())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let mut hm: HashMap<String, u64> = HashMap::new();
|
||||||
|
for e in x {
|
||||||
|
hm.entry(e).or_default().add_assign(1);
|
||||||
|
}
|
||||||
|
hm
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
let mut br = BufReader::new(f);
|
||||||
|
|
||||||
|
let mut template = String::new();
|
||||||
|
br.read_line(&mut template).unwrap();
|
||||||
|
template.truncate(template.len() - 1);
|
||||||
|
|
||||||
|
let template_terminal_chars = template
|
||||||
|
.char_indices()
|
||||||
|
.filter_map(|(i, c)| {
|
||||||
|
if i == 0 || i == template.len() - 1 {
|
||||||
|
Some(c)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
let template = split_template(template.trim_end());
|
||||||
|
|
||||||
|
let mut buf = String::new();
|
||||||
|
br.read_line(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let mut rules = HashMap::new();
|
||||||
|
loop {
|
||||||
|
buf.clear();
|
||||||
|
br.read_line(&mut buf).unwrap();
|
||||||
|
if buf.is_empty() {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut s = buf.trim_end().split_terminator(" -> ");
|
||||||
|
let pattern = s.next().unwrap().to_owned();
|
||||||
|
let pattern_chars: Vec<_> = pattern.chars().collect();
|
||||||
|
let new_letter = s.next().unwrap().to_owned();
|
||||||
|
|
||||||
|
let mut pattern_chars_it = pattern_chars.iter();
|
||||||
|
|
||||||
|
rules.insert(
|
||||||
|
pattern,
|
||||||
|
vec![
|
||||||
|
format!("{}{}", pattern_chars_it.next().unwrap(), new_letter),
|
||||||
|
format!("{}{}", new_letter, pattern_chars_it.next().unwrap()),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Input {
|
||||||
|
template,
|
||||||
|
template_terminal_chars,
|
||||||
|
rules,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_for_steps(input: &Input, steps: usize) {
|
||||||
|
let mut template = input.template.clone();
|
||||||
|
for _ in 0..steps {
|
||||||
|
let mut new_template = HashMap::<String, u64>::new();
|
||||||
|
for (t, num_t) in template {
|
||||||
|
if input.rules.contains_key(&t) {
|
||||||
|
for i in input.rules[&t].iter() {
|
||||||
|
new_template
|
||||||
|
.entry(i.to_owned())
|
||||||
|
.or_default()
|
||||||
|
.add_assign(num_t);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
new_template.entry(t).or_default().add_assign(num_t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
template = new_template;
|
||||||
|
}
|
||||||
|
|
||||||
|
// println!("{:?}", template);
|
||||||
|
|
||||||
|
let mut occurances = HashMap::<char, u64>::new();
|
||||||
|
for (s, i) in template {
|
||||||
|
for c in s.chars() {
|
||||||
|
occurances.entry(c).or_default().add_assign(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (s, i) in occurances.iter_mut() {
|
||||||
|
if input.template_terminal_chars.contains(s) {
|
||||||
|
*i = *i / 2 + 1;
|
||||||
|
} else {
|
||||||
|
*i /= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{:?}", occurances);
|
||||||
|
|
||||||
|
let min = occurances.values().min().unwrap();
|
||||||
|
let max = occurances.values().max().unwrap();
|
||||||
|
|
||||||
|
println!("{:?}", max - min);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn extended_polymerisation_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
run_for_steps(&input, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn extended_polymerisation_2(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
run_for_steps(&input, 40);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,102 @@
|
||||||
|
SVCHKVFKCSHVFNBKKPOC
|
||||||
|
|
||||||
|
NC -> H
|
||||||
|
PK -> V
|
||||||
|
SO -> C
|
||||||
|
PH -> F
|
||||||
|
FP -> N
|
||||||
|
PN -> B
|
||||||
|
NP -> V
|
||||||
|
NK -> S
|
||||||
|
FV -> P
|
||||||
|
SB -> S
|
||||||
|
VN -> F
|
||||||
|
SC -> H
|
||||||
|
OB -> F
|
||||||
|
ON -> O
|
||||||
|
HN -> V
|
||||||
|
HC -> F
|
||||||
|
SN -> K
|
||||||
|
CB -> H
|
||||||
|
OP -> K
|
||||||
|
HP -> H
|
||||||
|
KS -> S
|
||||||
|
BC -> S
|
||||||
|
VB -> V
|
||||||
|
FC -> B
|
||||||
|
BH -> C
|
||||||
|
HH -> O
|
||||||
|
KH -> S
|
||||||
|
VF -> F
|
||||||
|
PF -> P
|
||||||
|
VV -> F
|
||||||
|
PP -> V
|
||||||
|
BO -> H
|
||||||
|
BF -> B
|
||||||
|
PS -> K
|
||||||
|
FO -> O
|
||||||
|
KF -> O
|
||||||
|
FN -> H
|
||||||
|
CK -> B
|
||||||
|
VP -> V
|
||||||
|
HK -> F
|
||||||
|
OV -> P
|
||||||
|
CS -> V
|
||||||
|
FF -> P
|
||||||
|
OH -> N
|
||||||
|
VS -> H
|
||||||
|
VO -> O
|
||||||
|
CP -> O
|
||||||
|
KC -> V
|
||||||
|
KV -> P
|
||||||
|
BK -> B
|
||||||
|
VK -> S
|
||||||
|
NF -> V
|
||||||
|
OO -> V
|
||||||
|
FH -> H
|
||||||
|
CN -> O
|
||||||
|
SP -> B
|
||||||
|
KN -> V
|
||||||
|
OF -> H
|
||||||
|
NV -> H
|
||||||
|
FK -> B
|
||||||
|
PV -> N
|
||||||
|
NB -> B
|
||||||
|
KK -> P
|
||||||
|
VH -> P
|
||||||
|
CC -> B
|
||||||
|
HV -> V
|
||||||
|
OC -> H
|
||||||
|
PO -> V
|
||||||
|
NO -> O
|
||||||
|
BP -> C
|
||||||
|
NH -> H
|
||||||
|
BN -> O
|
||||||
|
BV -> S
|
||||||
|
CV -> B
|
||||||
|
HS -> O
|
||||||
|
NN -> S
|
||||||
|
NS -> P
|
||||||
|
KB -> F
|
||||||
|
CO -> H
|
||||||
|
HO -> P
|
||||||
|
PB -> B
|
||||||
|
BS -> P
|
||||||
|
SH -> H
|
||||||
|
FS -> V
|
||||||
|
SF -> O
|
||||||
|
OK -> F
|
||||||
|
KP -> S
|
||||||
|
BB -> C
|
||||||
|
PC -> B
|
||||||
|
OS -> C
|
||||||
|
SV -> N
|
||||||
|
SK -> K
|
||||||
|
KO -> C
|
||||||
|
SS -> V
|
||||||
|
CF -> C
|
||||||
|
HB -> K
|
||||||
|
VC -> B
|
||||||
|
CH -> P
|
||||||
|
HF -> K
|
||||||
|
FB -> V
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
NNCB
|
||||||
|
|
||||||
|
CH -> B
|
||||||
|
HH -> N
|
||||||
|
CB -> H
|
||||||
|
NH -> C
|
||||||
|
HB -> C
|
||||||
|
HC -> B
|
||||||
|
HN -> C
|
||||||
|
NN -> C
|
||||||
|
BH -> H
|
||||||
|
NC -> B
|
||||||
|
NB -> B
|
||||||
|
BN -> B
|
||||||
|
BB -> N
|
||||||
|
BC -> B
|
||||||
|
CC -> N
|
||||||
|
CN -> C
|
||||||
|
|
@ -0,0 +1,157 @@
|
||||||
|
use std::{
|
||||||
|
collections::{BinaryHeap, HashMap},
|
||||||
|
io::{BufReader, Read},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
risk_level_map: Vec<Vec<u32>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _print_table(t: &[Vec<u32>], separator: &str) {
|
||||||
|
for row in t {
|
||||||
|
println!(
|
||||||
|
"{}",
|
||||||
|
row.iter()
|
||||||
|
.map(|u| u.to_string())
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(separator)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_to_string(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let mut risk_level_map = Vec::new();
|
||||||
|
|
||||||
|
for line in buf.split_terminator('\n') {
|
||||||
|
let line: Vec<_> = line.chars().map(|c| c.to_digit(10).unwrap()).collect();
|
||||||
|
risk_level_map.push(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
Input { risk_level_map }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_neigbours(index: (usize, usize), n: usize) -> Vec<(usize, usize)> {
|
||||||
|
let mut res = Vec::new();
|
||||||
|
if index.0 > 0 {
|
||||||
|
res.push((index.0 - 1, index.1));
|
||||||
|
}
|
||||||
|
if index.1 > 0 {
|
||||||
|
res.push((index.0, index.1 - 1));
|
||||||
|
}
|
||||||
|
if index.0 < n - 1 {
|
||||||
|
res.push((index.0 + 1, index.1));
|
||||||
|
}
|
||||||
|
if index.1 < n - 1 {
|
||||||
|
res.push((index.0, index.1 + 1));
|
||||||
|
}
|
||||||
|
res
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Eq, PartialEq)]
|
||||||
|
struct State {
|
||||||
|
node: (usize, usize),
|
||||||
|
cost: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for State {
|
||||||
|
fn cmp(&self, other: &Self) -> std::cmp::Ordering {
|
||||||
|
other
|
||||||
|
.cost
|
||||||
|
.cmp(&self.cost)
|
||||||
|
.then_with(|| self.node.cmp(&other.node))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialOrd for State {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_min(table: &[Vec<u32>]) -> Option<u32> {
|
||||||
|
let n = table.len();
|
||||||
|
|
||||||
|
let start_node = (0, 0);
|
||||||
|
let end_node = (n - 1, n - 1);
|
||||||
|
|
||||||
|
let mut best_paths = HashMap::new();
|
||||||
|
best_paths.insert(start_node, 0);
|
||||||
|
|
||||||
|
let mut frontline = BinaryHeap::from([State {
|
||||||
|
node: start_node,
|
||||||
|
cost: 0,
|
||||||
|
}]);
|
||||||
|
|
||||||
|
while let Some(State { node, cost }) = frontline.pop() {
|
||||||
|
if node == end_node {
|
||||||
|
return Some(cost);
|
||||||
|
}
|
||||||
|
|
||||||
|
if cost > *best_paths.entry(node).or_insert(u32::MAX) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let neigbours = get_neigbours(node, n);
|
||||||
|
|
||||||
|
for neighbour in neigbours {
|
||||||
|
let neigbour_cost = table[neighbour.0][neighbour.1];
|
||||||
|
let best_neigbour_cost = best_paths.entry(neighbour).or_insert(u32::MAX);
|
||||||
|
|
||||||
|
if cost + neigbour_cost < *best_neigbour_cost {
|
||||||
|
*best_neigbour_cost = cost + neigbour_cost;
|
||||||
|
|
||||||
|
frontline.push(State {
|
||||||
|
node: neighbour,
|
||||||
|
cost: *best_neigbour_cost,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn chiton_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
let min = find_min(&input.risk_level_map).unwrap();
|
||||||
|
println!("{}", min);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_val(v: &u32) -> u32 {
|
||||||
|
if *v == 9 {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
*v + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn chiton_2(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
let n = input.risk_level_map.len();
|
||||||
|
const FACTOR: usize = 5;
|
||||||
|
|
||||||
|
let mut new_risk_level_map = input.risk_level_map;
|
||||||
|
for i in 0..FACTOR - 1 {
|
||||||
|
for line in new_risk_level_map.iter_mut() {
|
||||||
|
line.extend(line.clone()[n * i..n * (i + 1)].iter().map(new_val));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i in 0..FACTOR - 1 {
|
||||||
|
for line in new_risk_level_map.clone().iter().skip(n * i).take(n) {
|
||||||
|
new_risk_level_map.push(line.iter().map(new_val).collect());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2973 - too high
|
||||||
|
// 2966 - just right!
|
||||||
|
let min = find_min(&new_risk_level_map).unwrap();
|
||||||
|
println!("{}", min);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,100 @@
|
||||||
|
8795561346959611984851795223993199426691978637498615942935297722897942579728189182383276311836891971
|
||||||
|
9971917929239749392313919138788785878436257678478978964999643688839227886859465518439985489795943919
|
||||||
|
1519761672617778785983978488277814115999116451991978869729122618211379791865816152742849499151214682
|
||||||
|
9897768578325969757223986999919271436414939289747483386572979869519481591978913852845739134918128698
|
||||||
|
6131844837515911671618346728935389713865862689991891968992859599212148719512981655915843896819419699
|
||||||
|
9994158898369771516892943629594768792167999156447986693115896589979189597554487929195418898275991939
|
||||||
|
7899714915991971118529915219739988517292138842395144993792669384948991998684649619885511938319926529
|
||||||
|
8439945422238997549198746429761826973391669898967884389843379199899887495381477519258959688562189998
|
||||||
|
8193158996336869219329798167599696253894399636289548599616776971684358719751199457412129189416339337
|
||||||
|
8915467845679571319719627819399444276933882997919488941218392246725699575931358682988728811692994888
|
||||||
|
2183821795618759299397119999912447724899136432675238876256982162673596561194541917989927328994884775
|
||||||
|
8789678487971129849969177111293971322992799168799694179116768117969482793885681672825369745192292798
|
||||||
|
9899995799751915683316369897193479341895969161197819529318324971956766824967977979682349271859692499
|
||||||
|
9738389836681141541749679428151189548958914789921712997989991986792969749119449656969797779397987971
|
||||||
|
9699386193977846925881916878943588579248899536993991794576926484969985986958761239832944749381396877
|
||||||
|
2938918897233812797889785112782764111371659727455889948919937998893948984527919431599729431858423312
|
||||||
|
6669951996546696289498264116385727972556973497368864657695549198987126379129178799142291929595944531
|
||||||
|
9593327798991199813978669827818164893823995153184287992392877622665469666148268197736278655385853893
|
||||||
|
4489883181443655445696668196922477872145911769238794459937988771294974551878994626812499591419882438
|
||||||
|
9828537889259279861788699459666699933159822299169969994311839953287658281994334947114298299449399739
|
||||||
|
4188562547592911131922397722799988999499427811169546472448222946122399994149695698195849512899141156
|
||||||
|
7812927129675599119818993368441873851158999359195519823173938847593874317319938262871877982994151854
|
||||||
|
8925469217741929237517277969589678521292549411978981218821255391918872181337782152599971935434586641
|
||||||
|
5539173242188516261195962935992419699921211771998999829366384756736985679791323524894919899791751927
|
||||||
|
7997814295618599112279785547892749118824587414992484558129913948987899996139582741731588699495997181
|
||||||
|
9294699723167493823939899799875297999693938976152179786642196948529943458129635959926986719188788299
|
||||||
|
3382299747968914256996638119179579489495894917369311729612961928153965889817885929465121747699993923
|
||||||
|
1269933289896689643116489371719798989991587811658981468139317814827819327181648686519922623159872716
|
||||||
|
8749822282959139712191898935929168514293911199984129154669719688839883778199899299699619241169648787
|
||||||
|
7789461829886475855754227981617959439666958496998884492729328586718954493775988189711859281328961118
|
||||||
|
1996981999456693988591117919251641821968898256445988799178396189162182741171111899482722939388958511
|
||||||
|
3281911384597899419698914798194911889589839273747496947197364795912194969393957795992989291837591999
|
||||||
|
1293812999287868589289214241179594649119899992343411877615638772289591199319196215849889992628429262
|
||||||
|
2598787636835395941715619539222694792812975975481748539877868612571891699419489899939987379366597698
|
||||||
|
4781462274896758851786199964998495994884799928116913548959881394813979886818979751785863571721749154
|
||||||
|
9781899957313649191946278938943668952725533114949839896192161387789132989919592489457498991499145634
|
||||||
|
8939291595887684897787947956711653882547657238349261375815578499482296127299179887193666585829749989
|
||||||
|
3987392781148476892679669911899929328939559696918985892627927769683956664885969479599936511452997261
|
||||||
|
9718491979119959846848498131157967812971882896718922983832319776899132516188992612996481749999992686
|
||||||
|
8919943758399972755642585691411913377667687791139364126793319649518996979999699899691164918399189872
|
||||||
|
7377178689183729718471814618846971671488612597556998591379995391219797917687997492569812892162829899
|
||||||
|
6198691883598199239981463965166178891395862717797769949534348818992699479916324441967852879113914389
|
||||||
|
9216989165552946188295851854481689328373995258899376993895872229212951841639956946995929695927819249
|
||||||
|
9188886992578419341444721993392494111118832893996694812192621891797989996585963719519899668496979761
|
||||||
|
6178959769221537294292836517919989929381873925111177297994731171813548771847917883712814928381315828
|
||||||
|
3716898729898898116791923615175892681249798369195979923194893399955242992199314988739418974466288117
|
||||||
|
6712671172426933931999899491979987495165963185198717561866882185885895989659986798139793799819433118
|
||||||
|
4584379959151684983916286557263499959997582313992956794499595279918993992689611978329772677199695197
|
||||||
|
9983899196819771699641681959945138993831935591154986184953899351941365399295712466533478897952142168
|
||||||
|
6899162163198818566972762787289989382494938538296469493317537999999195467999754271988141381266789918
|
||||||
|
1452932263797497952199118888137861961329529437698719177689997249821121712191719777639699188944321936
|
||||||
|
8937299999674997371979425811822714647182423856472824694292841198359827339725542547754913932519964957
|
||||||
|
9994946989869977763295691999117176543478371299189888681177844256187727685388616713239797198891771592
|
||||||
|
7554973739824921451596999899131383498318934996922147599937751455999839159799296692986193923888918716
|
||||||
|
2183293736212193119141897255991593533998965599699986684333511369999247828115626787252781948997399355
|
||||||
|
7166988753117411929413382997948886498187158558318973167282939868978289154979461968949393388198748635
|
||||||
|
3848991198627879899197562857896159183619819718874617129918483191133991967698128553471899459892397929
|
||||||
|
2765314119181599176729133659328796299792767869687928921291778482422185719921369149813699944966311469
|
||||||
|
8482691159398923761627882926982881117188945644896835748384958683499176311775975826629528934976436159
|
||||||
|
8629967953659486936456699817244387935152911955491258868396712994893218779896713818697822473611899472
|
||||||
|
9869569395962994217619893792989865797229926372388199383181753799972387947281751917911412193198648899
|
||||||
|
2911975492385168179852911515718689961977743548821737615588468287984829778119138931993495899999411139
|
||||||
|
6627692176997581928496111176845898128798398982139541832937981149719315979978979925639977479916288297
|
||||||
|
7971686592726999387593121969616452677783738499693549294716146947144911287158388446849188523198921159
|
||||||
|
9654356698192284395828218447993789572441791288511865165275957319726133989295828997899981479293199367
|
||||||
|
1983295918471185535848787124187154967288585591968899954121721297447389146121365419765845984999697995
|
||||||
|
3772299933945255981887183847913843946135928498137753611472573189883189388898147899899311559517594526
|
||||||
|
6935119987289199372691298387496561978547581187375589699139538917889149981989973389296691993898137585
|
||||||
|
9596981933155656783964173864653743482911961278323228972783896794973182687777999797879485992688899864
|
||||||
|
7946745867994687182819593938168758438993987764997671339742591814996711459998829197381873761169833199
|
||||||
|
7998761391174687853825798296855419379326297812911135911535769961499179699318147216113263387981953698
|
||||||
|
6975995197822218189738184719494471188758894169771883498878198461499469547885896968499963693355941716
|
||||||
|
4351931919415521116137351999816179752593389213165382519362992963377712912373918797312697527115653474
|
||||||
|
4219916669692263574989959697799511818886799247369637226524896979114739798437327795849691299932928316
|
||||||
|
9469815173589995599191717511929851241512129287419528975628498911949738259719499364539555799899987749
|
||||||
|
8479915281919179814239178416812398824865776973192848267616874181477979169919153488172116912595685919
|
||||||
|
1289893698599996944651792299632392688252343961243995892218884283891981753441377799862931899681885987
|
||||||
|
1918997431886381819198395396582984757593892248817191118278199825665792383989396744979898488291819787
|
||||||
|
1593953997936192775781629434971795219615284969133998265488117988899576939192195943941191263898454787
|
||||||
|
4116191989544268918925399499117319147593767434896144251686491796711286886419319219768919724488339918
|
||||||
|
5724615913863188944231161142188759223298646797932191661684846867251942817233499629528599748994238819
|
||||||
|
9568989891141898878889593392781881437292997772591628197913688948429735171975377969524966319878852198
|
||||||
|
1451975884978888899851513598956919574939335964999412895192972398975389988737989199973987816587729912
|
||||||
|
8266921296948786193491779253862131431671987882857169537999157578838774176914698161799177147198972998
|
||||||
|
9899977419231149419726862744398113392793194994238576864681993162199811196897926857981885899436634991
|
||||||
|
8863975882112417779869387818526982917699448259848195932976179866278536198163191794669219691194232985
|
||||||
|
8964676952961795683996858297181963591827634248715774196944191928959643811872914981968142899983398969
|
||||||
|
3819129921898559367111958191971712538989297786949383519349717524859963945439921799892281989822321974
|
||||||
|
6843888714292337419966941942419999999577112282934993189218898131672285193999999299488947947756888796
|
||||||
|
4897177883982914929221319627191749689347559979399184189239223629815698729511514457552661229971845791
|
||||||
|
7951497555381399499653191719458486151898656381679791193539839579318194299745115665134795986878886958
|
||||||
|
8999796933696665971996778728127922964493478822898217169185834914999629245188781933911948789292989969
|
||||||
|
9196969381136611468918217972388437845173999195912928197355989571899481559772197996243198878913819631
|
||||||
|
7166988339662186997128362499643382919978799844892892946796715324518121699785894695193874729916993919
|
||||||
|
9298281551968695911458882111884212373479298692144188529258731314391839459899983882393129697999711159
|
||||||
|
8558438898992511996283529341897299969324918789817899999965999939196128992393994111199692651355275955
|
||||||
|
7689899924699293736392725716697734919419784152918395812482316549583957919989329617954687594936783898
|
||||||
|
1169796382849566792128293597457371455827987519511199778291917942178294599929539841167862969924979581
|
||||||
|
9496929588378869969158122779414228929724985988984299699786358995268989949878981121159539739996566173
|
||||||
|
9791763949837198338991393152592978229948887552199237768112426143281161433828316999916998589965921948
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
1163751742
|
||||||
|
1381373672
|
||||||
|
2136511328
|
||||||
|
3694931569
|
||||||
|
7463417111
|
||||||
|
1319128137
|
||||||
|
1359912421
|
||||||
|
3125421639
|
||||||
|
1293138521
|
||||||
|
2311944581
|
||||||
|
|
@ -0,0 +1,279 @@
|
||||||
|
use bitvec::prelude::*;
|
||||||
|
use serde::Serialize;
|
||||||
|
use std::{
|
||||||
|
fmt::Debug,
|
||||||
|
io::{BufReader, Read},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
lines: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_to_string(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let lines = buf.lines().map(|l| l.to_owned()).collect();
|
||||||
|
|
||||||
|
Input { lines }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn decode_to_binary(s: &str) -> BitVec<Msb0, u8> {
|
||||||
|
let d: Vec<u8> = s
|
||||||
|
.chars()
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.chunks(2)
|
||||||
|
.map(|c| u8::from_str_radix(&String::from_iter(c.iter()), 16).unwrap())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
d.view_bits::<Msb0>().to_owned()
|
||||||
|
}
|
||||||
|
|
||||||
|
const TYPE_ID_LITERAL: u8 = 4;
|
||||||
|
const LENGTH_TYPE_TOTAL_LEN: bool = false;
|
||||||
|
const LENGTH_TYPE_NUM_PACKETS: bool = true;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize)]
|
||||||
|
struct Packet {
|
||||||
|
#[serde(skip)]
|
||||||
|
version: u8,
|
||||||
|
packet_type: PacketType<Self>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize)]
|
||||||
|
enum PacketType<P> {
|
||||||
|
L(u64),
|
||||||
|
Op(OpType, Vec<P>),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, Serialize)]
|
||||||
|
enum OpType {
|
||||||
|
Sum,
|
||||||
|
Product,
|
||||||
|
Min,
|
||||||
|
Max,
|
||||||
|
GreaterThan,
|
||||||
|
LessThan,
|
||||||
|
EqualTo,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<u8> for OpType {
|
||||||
|
fn from(id: u8) -> Self {
|
||||||
|
match id {
|
||||||
|
0 => Self::Sum,
|
||||||
|
1 => Self::Product,
|
||||||
|
2 => Self::Min,
|
||||||
|
3 => Self::Max,
|
||||||
|
5 => Self::GreaterThan,
|
||||||
|
6 => Self::LessThan,
|
||||||
|
7 => Self::EqualTo,
|
||||||
|
_ => panic!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Packet {
|
||||||
|
fn version_sum(&self) -> u64 {
|
||||||
|
let s = if let PacketType::Op(_, subpackets) = &self.packet_type {
|
||||||
|
subpackets.iter().map(|p| p.version_sum()).sum()
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
let v: u64 = self.version.into();
|
||||||
|
s + v
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_operator(type_id: u8, version: u8, subpackets: Vec<Packet>) -> Self {
|
||||||
|
let packet_type = PacketType::Op(OpType::from(type_id), subpackets);
|
||||||
|
Self {
|
||||||
|
version,
|
||||||
|
packet_type,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_literal(version: u8, value: u64) -> Self {
|
||||||
|
Self {
|
||||||
|
version,
|
||||||
|
packet_type: PacketType::L(value),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn calculate(&self) -> u64 {
|
||||||
|
match &self.packet_type {
|
||||||
|
PacketType::L(value) => *value,
|
||||||
|
PacketType::Op(operator_type, subpackets) => {
|
||||||
|
let subs: Vec<_> = subpackets.iter().map(|p| p.calculate()).collect();
|
||||||
|
match operator_type {
|
||||||
|
OpType::Sum => subs.iter().sum(),
|
||||||
|
OpType::Product => subs.iter().product(),
|
||||||
|
OpType::Min => *subs.iter().min().unwrap(),
|
||||||
|
OpType::Max => *subs.iter().max().unwrap(),
|
||||||
|
OpType::GreaterThan => {
|
||||||
|
if subs[0] > subs[1] {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpType::LessThan => {
|
||||||
|
if subs[0] < subs[1] {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
OpType::EqualTo => {
|
||||||
|
if subs[0] == subs[1] {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn _get_expr(&self) -> String {
|
||||||
|
match &self.packet_type {
|
||||||
|
PacketType::L(value) => format!("{}", value),
|
||||||
|
PacketType::Op(operator_type, subpackets) => {
|
||||||
|
let subs = subpackets
|
||||||
|
.iter()
|
||||||
|
.map(|s| s._get_expr())
|
||||||
|
.collect::<Vec<_>>()
|
||||||
|
.join(", ");
|
||||||
|
match operator_type {
|
||||||
|
OpType::Sum => format!("sum({})", subs),
|
||||||
|
OpType::Product => format!("product({})", subs),
|
||||||
|
OpType::Min => format!("min({})", subs),
|
||||||
|
OpType::Max => format!("max({})", subs),
|
||||||
|
OpType::GreaterThan => format!("gt({})", subs),
|
||||||
|
OpType::LessThan => format!("lt({})", subs),
|
||||||
|
OpType::EqualTo => format!("eq({})", subs),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_packet(
|
||||||
|
packet: &BitSlice<Msb0, u8>,
|
||||||
|
inner_len: &mut usize,
|
||||||
|
max_num_packets: Option<usize>,
|
||||||
|
) -> Vec<Packet> {
|
||||||
|
// println!("parse_packet: {:?} (max packets: {:?})", packet, max_num_packets);
|
||||||
|
|
||||||
|
let mut packets = Vec::new();
|
||||||
|
|
||||||
|
let mut i = 0;
|
||||||
|
|
||||||
|
loop {
|
||||||
|
if i >= packet.len() - 1 || packets.len() >= max_num_packets.unwrap_or(usize::MAX) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
let version = packet[i..i + 3].load_be();
|
||||||
|
let type_id = packet[i + 3..i + 6].load_be();
|
||||||
|
|
||||||
|
// skip header
|
||||||
|
i += 6;
|
||||||
|
|
||||||
|
match type_id {
|
||||||
|
TYPE_ID_LITERAL => {
|
||||||
|
let mut value: u64 = 0;
|
||||||
|
loop {
|
||||||
|
let m = &packet[i..i + 5];
|
||||||
|
i += 5;
|
||||||
|
|
||||||
|
value = (value << 4) | m[1..].load_be::<u64>();
|
||||||
|
if !m[0] {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
packets.push(Packet::new_literal(version, value));
|
||||||
|
}
|
||||||
|
_ => {
|
||||||
|
// operator
|
||||||
|
|
||||||
|
let length_type_id = packet[i];
|
||||||
|
i += 1;
|
||||||
|
|
||||||
|
let subpackets = match length_type_id {
|
||||||
|
LENGTH_TYPE_TOTAL_LEN => {
|
||||||
|
let len: usize = packet[i..i + 15].load_be::<u16>().into();
|
||||||
|
i += 15;
|
||||||
|
|
||||||
|
let mut _unused = 0;
|
||||||
|
let subpackets = parse_packet(&packet[i..i + len], &mut _unused, None);
|
||||||
|
assert_eq!(_unused, len);
|
||||||
|
i += len;
|
||||||
|
|
||||||
|
subpackets
|
||||||
|
}
|
||||||
|
LENGTH_TYPE_NUM_PACKETS => {
|
||||||
|
let num_packets: usize = packet[i..i + 11].load_be();
|
||||||
|
i += 11;
|
||||||
|
|
||||||
|
let mut inner_len = 0;
|
||||||
|
let subpackets =
|
||||||
|
parse_packet(&packet[i..], &mut inner_len, Some(num_packets));
|
||||||
|
i += inner_len;
|
||||||
|
|
||||||
|
subpackets
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
packets.push(Packet::new_operator(type_id, version, subpackets));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*inner_len = i;
|
||||||
|
|
||||||
|
packets
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn packet_decoder_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
for line in input.lines {
|
||||||
|
let v = decode_to_binary(&line);
|
||||||
|
println!("{:?}", line);
|
||||||
|
// println!("{:?}", v);
|
||||||
|
|
||||||
|
let mut x = 0;
|
||||||
|
let p = parse_packet(&v, &mut x, Some(1));
|
||||||
|
let p = p.first().unwrap();
|
||||||
|
println!("{:?}", p);
|
||||||
|
println!("{}", p.version_sum());
|
||||||
|
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn packet_decoder_2(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
|
||||||
|
for line in input.lines {
|
||||||
|
let v = decode_to_binary(&line);
|
||||||
|
println!("{:?}", line);
|
||||||
|
|
||||||
|
let mut x = 0;
|
||||||
|
let p = parse_packet(&v, &mut x, Some(1));
|
||||||
|
let p = p.first().unwrap();
|
||||||
|
// println!("{:?}", p);
|
||||||
|
|
||||||
|
println!("{}", serde_yaml::to_string(p).unwrap());
|
||||||
|
println!("{}", p.calculate());
|
||||||
|
// println!("{}", p.get_expr());
|
||||||
|
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 327007 - too low
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
805311100469800804A3E488ACC0B10055D8009548874F65665AD42F60073E7338E7E5C538D820114AEA1A19927797976F8F43CD7354D66747B3005B401397C6CBA2FCEEE7AACDECC017938B3F802E000854488F70FC401F8BD09E199005B3600BCBFEEE12FFBB84FC8466B515E92B79B1003C797AEBAF53917E99FF2E953D0D284359CA0CB80193D12B3005B4017968D77EB224B46BBF591E7BEBD2FA00100622B4ED64773D0CF7816600B68020000874718E715C0010D8AF1E61CC946FB99FC2C20098275EBC0109FA14CAEDC20EB8033389531AAB14C72162492DE33AE0118012C05EEB801C0054F880102007A01192C040E100ED20035DA8018402BE20099A0020CB801AE0049801E800DD10021E4002DC7D30046C0160004323E42C8EA200DC5A87D06250C50015097FB2CFC93A101006F532EB600849634912799EF7BF609270D0802B59876F004246941091A5040402C9BD4DF654967BFDE4A6432769CED4EC3C4F04C000A895B8E98013246A6016CB3CCC94C9144A03CFAB9002033E7B24A24016DD802933AFAE48EAA3335A632013BC401D8850863A8803D1C61447A00042E3647B83F313674009E6533E158C3351F94C9902803D35C869865D564690103004E74CB001F39BEFFAAD37DFF558C012D005A5A9E851D25F76DD88A5F4BC600ACB6E1322B004E5FE1F2FF0E3005EC017969EB7AE4D1A53D07B918C0B1802F088B2C810326215CCBB6BC140C0149EE87780233E0D298C33B008C52763C9C94BF8DC886504E1ECD4E75C7E4EA00284180371362C44320043E2EC258F24008747785D10C001039F80644F201217401500043A2244B8D200085C3F8690BA78F08018394079A7A996D200806647A49E249C675C0802609D66B004658BA7F1562500366279CCBEB2600ACCA6D802C00085C658BD1DC401A8EB136100
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
C200B40A82
|
||||||
|
04005AC33890
|
||||||
|
880086C3E88112
|
||||||
|
CE00C43D881120
|
||||||
|
D8005AC2A8F0
|
||||||
|
F600BC2D8F
|
||||||
|
9C005AC2F8F0
|
||||||
|
9C0141080250320F1802104A08
|
||||||
|
EE00D40C823060
|
||||||
|
38006F45291200
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
8A004A801A8002F478
|
||||||
|
620080001611562C8802118E34
|
||||||
|
C0015000016115A2E0802F182340
|
||||||
|
A0016C880162017C3686B18A3D4780
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
C200B40A82
|
||||||
|
04005AC33890
|
||||||
|
880086C3E88112
|
||||||
|
CE00C43D881120
|
||||||
|
D8005AC2A8F0
|
||||||
|
F600BC2D8F
|
||||||
|
9C005AC2F8F0
|
||||||
|
9C0141080250320F1802104A08
|
||||||
|
|
@ -0,0 +1,116 @@
|
||||||
|
use std::io::{BufRead, BufReader};
|
||||||
|
|
||||||
|
use regex::Regex;
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
min_x: i32,
|
||||||
|
max_x: i32,
|
||||||
|
min_y: i32,
|
||||||
|
max_y: i32,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_line(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let r = Regex::new(r"target area: x=(-?\d+)\.\.(-?\d+), y=(-?\d+)\.\.(-?\d+)").unwrap();
|
||||||
|
let matches = r.captures(&buf).unwrap();
|
||||||
|
let min_x = matches.get(1).unwrap().as_str().parse().unwrap();
|
||||||
|
let max_x = matches.get(2).unwrap().as_str().parse().unwrap();
|
||||||
|
let min_y = matches.get(3).unwrap().as_str().parse().unwrap();
|
||||||
|
let max_y = matches.get(4).unwrap().as_str().parse().unwrap();
|
||||||
|
|
||||||
|
Input {
|
||||||
|
min_x,
|
||||||
|
max_x,
|
||||||
|
min_y,
|
||||||
|
max_y,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn find_max_y(v_x: i32, v_y: i32, input: &Input) -> Option<i32> {
|
||||||
|
let mut x = 0;
|
||||||
|
let mut y = 0;
|
||||||
|
let mut v_x = v_x;
|
||||||
|
let mut v_y = v_y;
|
||||||
|
|
||||||
|
let mut max_y = 0;
|
||||||
|
while x <= input.max_x && y >= input.min_y {
|
||||||
|
x += v_x;
|
||||||
|
y += v_y;
|
||||||
|
|
||||||
|
if y > max_y {
|
||||||
|
max_y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if x >= input.min_x && x <= input.max_x && y >= input.min_y && y <= input.max_y {
|
||||||
|
return Some(max_y);
|
||||||
|
}
|
||||||
|
match v_x.cmp(&0) {
|
||||||
|
std::cmp::Ordering::Less => v_x += 1,
|
||||||
|
std::cmp::Ordering::Equal => {}
|
||||||
|
std::cmp::Ordering::Greater => v_x -= 1,
|
||||||
|
}
|
||||||
|
v_y -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn trick_shot_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
println!("{:?}", input);
|
||||||
|
|
||||||
|
let mut min_x = 0;
|
||||||
|
while min_x * (min_x + 1) < 2 * input.min_x {
|
||||||
|
min_x += 1;
|
||||||
|
}
|
||||||
|
let max_x = input.max_x;
|
||||||
|
let min_y = input.min_y;
|
||||||
|
|
||||||
|
println!("min_x: {}, max_x: {}", min_x, max_x);
|
||||||
|
|
||||||
|
let mut global_max_y = 0;
|
||||||
|
for x in min_x..=max_x {
|
||||||
|
for y in min_y..150 {
|
||||||
|
let max_y = find_max_y(x, y, &input).unwrap_or(0);
|
||||||
|
if max_y > global_max_y {
|
||||||
|
global_max_y = max_y;
|
||||||
|
// println!("x: {}, y: {}, max_y: {}", x, y, max_y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 2701 - too low
|
||||||
|
println!("{}", global_max_y);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn trick_shot_2(test_mode: TestMode) {
|
||||||
|
let input = parse_input(test_mode);
|
||||||
|
println!("{:?}", input);
|
||||||
|
|
||||||
|
let mut min_x = 0;
|
||||||
|
while min_x * (min_x + 1) < 2 * input.min_x {
|
||||||
|
min_x += 1;
|
||||||
|
}
|
||||||
|
let max_x = input.max_x;
|
||||||
|
let min_y = input.min_y;
|
||||||
|
// v_y0 = (n^2 - n + 2M) / 2n = n/2 - 1/2 + M/n = (n - 1)/2 + M/n
|
||||||
|
let max_y = 2 * input.min_y.abs();
|
||||||
|
|
||||||
|
println!("min_x: {}, max_x: {}", min_x, max_x);
|
||||||
|
println!("min_y: {}, max_y: {}", min_y, max_y);
|
||||||
|
|
||||||
|
let mut num_options = 0;
|
||||||
|
for x in min_x..=max_x {
|
||||||
|
for y in min_y..=max_y {
|
||||||
|
if find_max_y(x, y, &input).is_some() {
|
||||||
|
num_options += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
println!("{}", num_options);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
target area: x=81..129, y=-150..-108
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
target area: x=20..30, y=-10..-5
|
||||||
|
|
@ -0,0 +1,270 @@
|
||||||
|
use std::{
|
||||||
|
cell::RefCell,
|
||||||
|
fmt::Display,
|
||||||
|
io::{BufReader, Read},
|
||||||
|
ops::{Add, Deref},
|
||||||
|
rc::Rc,
|
||||||
|
str::FromStr,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::types::TestMode;
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
enum SnailNum {
|
||||||
|
Pair(Rc<RefCell<Box<SnailNum>>>, Rc<RefCell<Box<SnailNum>>>),
|
||||||
|
Number(u8),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Display for SnailNum {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
match &self {
|
||||||
|
&Self::Pair(left, right) => f.write_fmt(format_args!(
|
||||||
|
"[{},{}]",
|
||||||
|
left.as_ref().borrow(),
|
||||||
|
right.as_ref().borrow()
|
||||||
|
)),
|
||||||
|
&Self::Number(n) => f.write_fmt(format_args!("{}", n)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Add for SnailNum {
|
||||||
|
type Output = Self;
|
||||||
|
|
||||||
|
fn add(self, rhs: Self) -> Self::Output {
|
||||||
|
let left = Rc::new(RefCell::new(Box::new(self)));
|
||||||
|
let right = Rc::new(RefCell::new(Box::new(rhs)));
|
||||||
|
let n = Self::Pair(left, right);
|
||||||
|
// println!("after addition: {}", n);
|
||||||
|
n.resolve_explodes()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for SnailNum {
|
||||||
|
type Err = &'static str;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
let mut _unused = 0;
|
||||||
|
Ok(Self::internal_from_str(s, &mut _unused))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SnailNum {
|
||||||
|
fn internal_from_str(s: &str, consumed_len_out: &mut usize) -> SnailNum {
|
||||||
|
if s.starts_with('[') {
|
||||||
|
let mut current_index = 1;
|
||||||
|
|
||||||
|
let mut left_len = 0;
|
||||||
|
let left = Self::internal_from_str(&s[current_index..], &mut left_len);
|
||||||
|
|
||||||
|
current_index += left_len + 1;
|
||||||
|
|
||||||
|
let mut right_len = 0;
|
||||||
|
let right = Self::internal_from_str(&s[current_index..], &mut right_len);
|
||||||
|
|
||||||
|
current_index += right_len + 1;
|
||||||
|
|
||||||
|
*consumed_len_out = current_index;
|
||||||
|
|
||||||
|
SnailNum::Pair(
|
||||||
|
Rc::new(RefCell::new(Box::new(left))),
|
||||||
|
Rc::new(RefCell::new(Box::new(right))),
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
let value = u8::from_str(&s[0..1]).unwrap();
|
||||||
|
*consumed_len_out = 1;
|
||||||
|
SnailNum::Number(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn resolve_splits(&self, did_do_splits: &mut bool) -> Self {
|
||||||
|
let result = self.clone();
|
||||||
|
|
||||||
|
let mut q = Vec::new();
|
||||||
|
if let SnailNum::Pair(left, right) = &result {
|
||||||
|
q.push(right.clone());
|
||||||
|
q.push(left.clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut split_pair = None;
|
||||||
|
let mut split_number = 0;
|
||||||
|
|
||||||
|
while let Some(n) = q.pop() {
|
||||||
|
let pp = n.deref().borrow_mut();
|
||||||
|
|
||||||
|
match pp.as_ref() {
|
||||||
|
SnailNum::Pair(left, right) => {
|
||||||
|
q.push(right.clone());
|
||||||
|
q.push(left.clone());
|
||||||
|
}
|
||||||
|
SnailNum::Number(number) => {
|
||||||
|
if number > &9 {
|
||||||
|
split_pair = Some(n.clone());
|
||||||
|
split_number = *number;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(p) = &split_pair {
|
||||||
|
let left = Rc::new(RefCell::new(Box::new(SnailNum::Number(
|
||||||
|
(split_number - (split_number % 2)) / 2,
|
||||||
|
))));
|
||||||
|
let right = Rc::new(RefCell::new(Box::new(SnailNum::Number(
|
||||||
|
(split_number + (split_number % 2)) / 2,
|
||||||
|
))));
|
||||||
|
|
||||||
|
*p.deref().borrow_mut() = Box::new(SnailNum::Pair(left, right));
|
||||||
|
|
||||||
|
// println!("after split: {}", result);
|
||||||
|
}
|
||||||
|
|
||||||
|
*did_do_splits = split_pair.is_some();
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn resolve_explodes(self) -> Self {
|
||||||
|
let mut result = self.clone();
|
||||||
|
|
||||||
|
let mut q = Vec::new();
|
||||||
|
if let SnailNum::Pair(left, right) = &result {
|
||||||
|
q.push((right.clone(), 1));
|
||||||
|
q.push((left.clone(), 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut numbers = Vec::new();
|
||||||
|
let mut exploding_node = None;
|
||||||
|
|
||||||
|
while let Some(n) = q.pop() {
|
||||||
|
let pp = n.0.deref().borrow_mut();
|
||||||
|
|
||||||
|
match pp.as_ref() {
|
||||||
|
SnailNum::Pair(left, right) => {
|
||||||
|
q.push((right.clone(), n.1 + 1));
|
||||||
|
q.push((left.clone(), n.1 + 1));
|
||||||
|
|
||||||
|
if n.1 > 3 && exploding_node.is_none() {
|
||||||
|
exploding_node = Some(n.0.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SnailNum::Number(_) => {
|
||||||
|
numbers.push(n.0.clone());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(node) = &exploding_node {
|
||||||
|
if let SnailNum::Pair(nested_left, nested_right) = node.deref().borrow().as_ref() {
|
||||||
|
if let SnailNum::Number(nested_left_num) = nested_left.deref().borrow().as_ref() {
|
||||||
|
let nested_left_index = numbers
|
||||||
|
.iter()
|
||||||
|
.position(|x| x.as_ptr() == nested_left.as_ptr())
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
if nested_left_index > 0 {
|
||||||
|
let mut x = numbers[nested_left_index - 1].deref().borrow_mut();
|
||||||
|
match **x {
|
||||||
|
SnailNum::Number(n) => {
|
||||||
|
*x = Box::new(SnailNum::Number(n + nested_left_num))
|
||||||
|
}
|
||||||
|
_ => panic!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let SnailNum::Number(nested_right_num) = nested_right.deref().borrow().as_ref() {
|
||||||
|
let nested_right_index = numbers
|
||||||
|
.iter()
|
||||||
|
.position(|x| x.as_ptr() == nested_right.as_ptr())
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
if nested_right_index < numbers.len() - 1 {
|
||||||
|
let mut x = numbers[nested_right_index + 1].deref().borrow_mut();
|
||||||
|
match **x {
|
||||||
|
SnailNum::Number(n) => {
|
||||||
|
*x = Box::new(SnailNum::Number(n + nested_right_num))
|
||||||
|
}
|
||||||
|
_ => panic!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*node.deref().borrow_mut() = Box::new(SnailNum::Number(0));
|
||||||
|
|
||||||
|
// println!("after explode: {}", &result);
|
||||||
|
}
|
||||||
|
|
||||||
|
if exploding_node.is_some() {
|
||||||
|
result.resolve_explodes()
|
||||||
|
} else {
|
||||||
|
let mut resolved_spits = false;
|
||||||
|
result = result.resolve_splits(&mut resolved_spits);
|
||||||
|
|
||||||
|
if resolved_spits {
|
||||||
|
result.resolve_explodes()
|
||||||
|
} else {
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn magnitude(&self) -> u64 {
|
||||||
|
match self {
|
||||||
|
SnailNum::Pair(left, right) => {
|
||||||
|
3 * left.deref().borrow().magnitude() + 2 * right.deref().borrow().magnitude()
|
||||||
|
}
|
||||||
|
SnailNum::Number(n) => *n as u64,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Input {
|
||||||
|
numbers: Vec<SnailNum>,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn parse_input(test_mode: &TestMode) -> Input {
|
||||||
|
let f = test_mode.input_file(file!());
|
||||||
|
let mut buf = String::new();
|
||||||
|
BufReader::new(f).read_to_string(&mut buf).unwrap();
|
||||||
|
|
||||||
|
let numbers = buf.lines().map(|line| line.parse().unwrap()).collect();
|
||||||
|
Input { numbers }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn snailfish_1(test_mode: TestMode) {
|
||||||
|
let input = parse_input(&test_mode);
|
||||||
|
|
||||||
|
let mut s = input.numbers[0].clone();
|
||||||
|
for n in input.numbers[1..].into_iter() {
|
||||||
|
// println!(" {}", s);
|
||||||
|
// println!("+ {}", n);
|
||||||
|
s = s + n.clone();
|
||||||
|
// println!("= {}\n", s);
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{}", s.magnitude())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn snailfish_2(test_mode: TestMode) {
|
||||||
|
let mut max = 0;
|
||||||
|
let input = parse_input(&test_mode);
|
||||||
|
for i in 0..input.numbers.len() {
|
||||||
|
for j in 0..input.numbers.len() {
|
||||||
|
if i != j {
|
||||||
|
let input = parse_input(&test_mode);
|
||||||
|
// println!("{}, {}", i, j);
|
||||||
|
let x = input.numbers[i].clone();
|
||||||
|
let y = input.numbers[j].clone();
|
||||||
|
let s = x.clone() + y.clone();
|
||||||
|
let m = s.magnitude();
|
||||||
|
// println!("|{} + {}| = {} ({})", &x, &y, m, s);
|
||||||
|
if m > max {
|
||||||
|
max = m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{}", max);
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,100 @@
|
||||||
|
[[3,[[6,3],[9,6]]],[6,[[0,9],[9,7]]]]
|
||||||
|
[[[3,9],[[0,8],[7,6]]],[[[7,9],1],[1,3]]]
|
||||||
|
[8,[[[9,6],[8,4]],4]]
|
||||||
|
[5,[[1,2],[3,7]]]
|
||||||
|
[[[[7,7],5],[[3,5],8]],4]
|
||||||
|
[[[5,[0,7]],3],[[5,[5,3]],[1,[9,4]]]]
|
||||||
|
[[[[3,5],[7,1]],6],[[[3,6],[5,6]],[[3,2],5]]]
|
||||||
|
[[[[2,0],[3,0]],[5,7]],[[4,4],[[9,9],[9,3]]]]
|
||||||
|
[[[[8,0],7],[[7,1],9]],[[3,[8,6]],8]]
|
||||||
|
[[6,[7,5]],[[6,8],9]]
|
||||||
|
[[[9,[1,8]],2],[[[4,0],[9,3]],1]]
|
||||||
|
[[7,[1,[3,8]]],[[4,7],[8,1]]]
|
||||||
|
[[[5,5],[[4,5],[2,9]]],[[[7,7],0],8]]
|
||||||
|
[[[[4,7],3],5],[[[4,3],[3,8]],[[6,5],5]]]
|
||||||
|
[[[[3,8],2],[1,7]],[[[3,1],4],9]]
|
||||||
|
[[[[2,1],4],[[9,5],[1,4]]],[[3,5],[[9,1],9]]]
|
||||||
|
[[[6,[1,8]],[0,0]],[9,[0,3]]]
|
||||||
|
[[[[2,2],[3,3]],[[4,8],4]],[[[6,8],4],5]]
|
||||||
|
[4,[[[7,8],[3,4]],[[3,2],9]]]
|
||||||
|
[[[9,0],3],[[[7,1],4],7]]
|
||||||
|
[[[1,4],8],[[7,5],[[8,0],[0,7]]]]
|
||||||
|
[9,[[4,6],[[2,9],1]]]
|
||||||
|
[[[[1,8],8],6],[[[2,0],6],[0,5]]]
|
||||||
|
[[[5,5],[6,4]],[[3,8],[9,[7,6]]]]
|
||||||
|
[[0,[8,[1,4]]],2]
|
||||||
|
[[[[9,5],0],5],[9,[7,5]]]
|
||||||
|
[[9,[4,8]],[[8,1],[[8,6],[7,1]]]]
|
||||||
|
[4,[[[9,6],5],9]]
|
||||||
|
[[[[3,7],6],0],[[7,7],[[2,7],[9,3]]]]
|
||||||
|
[[[6,[3,7]],[[8,3],2]],[8,[6,[8,5]]]]
|
||||||
|
[[[5,[2,7]],[[6,7],3]],[5,[[4,4],1]]]
|
||||||
|
[[1,0],[[2,8],[[0,4],9]]]
|
||||||
|
[[[1,4],6],[[[9,8],[1,0]],1]]
|
||||||
|
[[3,4],[[1,[8,4]],8]]
|
||||||
|
[[[[9,4],[0,7]],[[5,4],[8,2]]],2]
|
||||||
|
[5,[[[8,7],[3,4]],[2,4]]]
|
||||||
|
[[[[1,3],[8,6]],[[3,4],6]],[[8,5],[[9,3],[5,7]]]]
|
||||||
|
[[0,[[0,9],[7,8]]],[3,9]]
|
||||||
|
[0,[[8,[2,3]],[[3,5],[4,9]]]]
|
||||||
|
[[[4,3],[[1,9],[1,5]]],[4,[[9,1],1]]]
|
||||||
|
[[[[3,6],[2,5]],3],[[8,[8,0]],[[6,9],[5,8]]]]
|
||||||
|
[7,[[3,[3,6]],[[6,9],[2,7]]]]
|
||||||
|
[[[[8,3],[6,5]],[[3,9],2]],[6,1]]
|
||||||
|
[[[2,0],[2,3]],8]
|
||||||
|
[[1,[[8,7],2]],[[[9,4],8],[4,[9,0]]]]
|
||||||
|
[[[6,7],[[5,2],3]],[[0,5],[[9,4],[2,6]]]]
|
||||||
|
[[[9,[5,8]],[[9,3],[6,9]]],5]
|
||||||
|
[[[5,[4,6]],[5,[3,2]]],[2,[9,[5,4]]]]
|
||||||
|
[8,6]
|
||||||
|
[[[4,8],[3,1]],[1,[[7,8],[7,5]]]]
|
||||||
|
[[4,[[8,8],4]],[5,[8,[3,9]]]]
|
||||||
|
[[[4,[9,0]],[[0,3],5]],[[5,[3,0]],[6,[2,3]]]]
|
||||||
|
[[[4,0],8],[[[4,0],7],[[9,6],3]]]
|
||||||
|
[[8,[[7,8],5]],[[[6,2],8],[1,[0,4]]]]
|
||||||
|
[[1,[[3,4],[0,8]]],[[6,5],3]]
|
||||||
|
[[5,2],[[8,6],[1,[9,7]]]]
|
||||||
|
[5,[6,[[1,3],[1,0]]]]
|
||||||
|
[[0,[[1,9],[5,6]]],[[[6,2],[5,1]],[[1,2],[1,0]]]]
|
||||||
|
[[[7,1],4],[[[0,3],3],[[4,8],1]]]
|
||||||
|
[[3,[9,[3,4]]],[1,[[0,0],[1,4]]]]
|
||||||
|
[1,[7,[1,[3,7]]]]
|
||||||
|
[[[0,[5,6]],[[7,4],[5,7]]],[[[6,8],[4,6]],9]]
|
||||||
|
[[[9,8],[7,[1,3]]],3]
|
||||||
|
[[[4,[0,3]],[[3,0],6]],[[2,[9,2]],1]]
|
||||||
|
[[[[1,9],[3,3]],[8,1]],5]
|
||||||
|
[[7,[5,2]],[[4,[0,1]],[3,3]]]
|
||||||
|
[[[6,6],[0,6]],[[3,[5,9]],[[4,2],[4,3]]]]
|
||||||
|
[[[7,[5,4]],[7,1]],9]
|
||||||
|
[[6,[5,2]],[[7,[0,5]],4]]
|
||||||
|
[[[8,1],[[7,6],[4,1]]],2]
|
||||||
|
[[[[4,3],[1,4]],[9,6]],[3,[[2,5],3]]]
|
||||||
|
[[[[9,3],[5,0]],1],[1,[[9,7],9]]]
|
||||||
|
[[[8,5],[5,9]],[2,[4,[0,0]]]]
|
||||||
|
[[[[7,9],2],[[8,8],[6,3]]],[7,[0,9]]]
|
||||||
|
[[[[6,6],[0,2]],[2,[9,0]]],[[0,9],[9,9]]]
|
||||||
|
[[[9,[1,3]],[6,5]],[[[1,1],8],[9,[7,2]]]]
|
||||||
|
[[8,[[8,4],6]],[[4,[5,9]],0]]
|
||||||
|
[[8,[5,[6,7]]],[[[1,9],9],[0,[0,9]]]]
|
||||||
|
[[9,[9,[7,3]]],[4,[4,7]]]
|
||||||
|
[[[[9,3],7],5],[[5,[8,5]],[0,[8,0]]]]
|
||||||
|
[[[5,[9,0]],[[7,4],[5,3]]],[3,[[1,1],[1,8]]]]
|
||||||
|
[[1,[[1,4],[5,9]]],[[[9,1],[6,5]],[9,[0,7]]]]
|
||||||
|
[[[[9,4],9],[5,3]],[[[4,2],[2,2]],[[1,0],0]]]
|
||||||
|
[[[6,[8,6]],9],[8,[[0,1],[9,7]]]]
|
||||||
|
[[2,0],[5,[[8,3],4]]]
|
||||||
|
[[[[0,2],0],8],[8,[[2,5],[8,2]]]]
|
||||||
|
[[[[7,4],8],[9,[7,5]]],[8,[7,[5,3]]]]
|
||||||
|
[[2,4],[3,[3,8]]]
|
||||||
|
[[5,4],[[0,[5,8]],[4,3]]]
|
||||||
|
[6,[[5,[4,7]],9]]
|
||||||
|
[[[2,[6,8]],[5,5]],[[[3,0],4],[[6,6],[0,1]]]]
|
||||||
|
[[[1,[4,2]],[[8,0],8]],[8,[[6,1],[0,0]]]]
|
||||||
|
[[9,[2,[3,3]]],[[2,6],[[5,2],[5,8]]]]
|
||||||
|
[[9,[4,4]],[[[8,6],1],2]]
|
||||||
|
[2,[[[0,7],7],[[7,8],5]]]
|
||||||
|
[[[4,0],[[1,1],[7,6]]],[[6,7],[[7,2],1]]]
|
||||||
|
[[[[2,5],0],[[9,5],9]],[6,[7,[6,1]]]]
|
||||||
|
[[[7,8],1],[[[6,2],0],[[9,7],[3,5]]]]
|
||||||
|
[[[9,1],0],[3,[[6,1],[6,9]]]]
|
||||||
|
[[[[9,0],0],[4,[7,0]]],[[6,[4,0]],[8,[4,2]]]]
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
[[[0,[5,8]],[[1,7],[9,6]]],[[4,[1,2]],[[1,4],2]]]
|
||||||
|
[[[5,[2,8]],4],[5,[[9,9],0]]]
|
||||||
|
[6,[[[6,2],[5,6]],[[7,6],[4,7]]]]
|
||||||
|
[[[6,[0,7]],[0,9]],[4,[9,[9,0]]]]
|
||||||
|
[[[7,[6,4]],[3,[1,3]]],[[[5,5],1],9]]
|
||||||
|
[[6,[[7,3],[3,2]]],[[[3,8],[5,7]],4]]
|
||||||
|
[[[[5,4],[7,7]],8],[[8,3],8]]
|
||||||
|
[[9,3],[[9,9],[6,[4,9]]]]
|
||||||
|
[[2,[[7,7],7]],[[5,8],[[9,3],[0,2]]]]
|
||||||
|
[[[[5,2],5],[8,[3,7]]],[[5,[7,5]],[4,4]]]
|
||||||
|
|
@ -0,0 +1,36 @@
|
||||||
|
use std::{fs::File, path::PathBuf, str::FromStr};
|
||||||
|
|
||||||
|
pub enum TestMode {
|
||||||
|
Test,
|
||||||
|
Production,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TestMode {
|
||||||
|
fn input_file_name(&self, module_file: &'static str) -> PathBuf {
|
||||||
|
let in_name = match self {
|
||||||
|
TestMode::Test => "test.in",
|
||||||
|
TestMode::Production => "prod.in",
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut p = PathBuf::from(module_file);
|
||||||
|
p.pop();
|
||||||
|
p.push(in_name);
|
||||||
|
p
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn input_file(&self, module_file: &'static str) -> File {
|
||||||
|
File::open(self.input_file_name(module_file)).unwrap()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for TestMode {
|
||||||
|
type Err = &'static str;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||||
|
match s {
|
||||||
|
"p" => Ok(TestMode::Production),
|
||||||
|
"t" => Ok(TestMode::Test),
|
||||||
|
_ => Err("Unknown test mode!"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue