Add day 11
This commit is contained in:
parent
c09126a27e
commit
052d21f132
65
Cargo.lock
generated
65
Cargo.lock
generated
@ -28,6 +28,7 @@ dependencies = [
|
|||||||
"indextree",
|
"indextree",
|
||||||
"itertools",
|
"itertools",
|
||||||
"regex",
|
"regex",
|
||||||
|
"sscanf",
|
||||||
"tuple-map",
|
"tuple-map",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -80,6 +81,26 @@ dependencies = [
|
|||||||
"unicode-width",
|
"unicode-width",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "const_format"
|
||||||
|
version = "0.2.30"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7309d9b4d3d2c0641e018d449232f2e28f1b22933c137f157d3dbc14228b8c0e"
|
||||||
|
dependencies = [
|
||||||
|
"const_format_proc_macros",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "const_format_proc_macros"
|
||||||
|
version = "0.2.29"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d897f47bf7270cf70d370f8f98c1abb6d2d4cf60a6845d30e05bfb90c6568650"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-xid",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "core-foundation-sys"
|
name = "core-foundation-sys"
|
||||||
version = "0.8.3"
|
version = "0.8.3"
|
||||||
@ -184,6 +205,12 @@ dependencies = [
|
|||||||
"wasm-bindgen",
|
"wasm-bindgen",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazy_static"
|
||||||
|
version = "1.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.138"
|
version = "0.2.138"
|
||||||
@ -280,6 +307,38 @@ version = "1.0.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898"
|
checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sscanf"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "887a5b09bbf30cc01d059ccb4b7a0b508a0cef3028df2f2ee0d745bc9e624c56"
|
||||||
|
dependencies = [
|
||||||
|
"const_format",
|
||||||
|
"lazy_static",
|
||||||
|
"regex",
|
||||||
|
"sscanf_macro",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "sscanf_macro"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b124cd4c68600cc3188a26987b1c3bed8cadcfd1be93124026096c668f2c0ee8"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"regex-syntax",
|
||||||
|
"strsim",
|
||||||
|
"syn",
|
||||||
|
"unicode-width",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strsim"
|
||||||
|
version = "0.10.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "1.0.105"
|
version = "1.0.105"
|
||||||
@ -329,6 +388,12 @@ version = "0.1.10"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
|
checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-xid"
|
||||||
|
version = "0.2.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasi"
|
name = "wasi"
|
||||||
version = "0.10.0+wasi-snapshot-preview1"
|
version = "0.10.0+wasi-snapshot-preview1"
|
||||||
|
@ -10,6 +10,7 @@ chrono = "0.4.23"
|
|||||||
indextree = "4.5.0"
|
indextree = "4.5.0"
|
||||||
itertools = "0.10.5"
|
itertools = "0.10.5"
|
||||||
regex = "1.7.0"
|
regex = "1.7.0"
|
||||||
|
sscanf = "0.4.0"
|
||||||
tuple-map = "0.4.0"
|
tuple-map = "0.4.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
55
input/11.txt
Normal file
55
input/11.txt
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
Monkey 0:
|
||||||
|
Starting items: 54, 82, 90, 88, 86, 54
|
||||||
|
Operation: new = old * 7
|
||||||
|
Test: divisible by 11
|
||||||
|
If true: throw to monkey 2
|
||||||
|
If false: throw to monkey 6
|
||||||
|
|
||||||
|
Monkey 1:
|
||||||
|
Starting items: 91, 65
|
||||||
|
Operation: new = old * 13
|
||||||
|
Test: divisible by 5
|
||||||
|
If true: throw to monkey 7
|
||||||
|
If false: throw to monkey 4
|
||||||
|
|
||||||
|
Monkey 2:
|
||||||
|
Starting items: 62, 54, 57, 92, 83, 63, 63
|
||||||
|
Operation: new = old + 1
|
||||||
|
Test: divisible by 7
|
||||||
|
If true: throw to monkey 1
|
||||||
|
If false: throw to monkey 7
|
||||||
|
|
||||||
|
Monkey 3:
|
||||||
|
Starting items: 67, 72, 68
|
||||||
|
Operation: new = old * old
|
||||||
|
Test: divisible by 2
|
||||||
|
If true: throw to monkey 0
|
||||||
|
If false: throw to monkey 6
|
||||||
|
|
||||||
|
Monkey 4:
|
||||||
|
Starting items: 68, 89, 90, 86, 84, 57, 72, 84
|
||||||
|
Operation: new = old + 7
|
||||||
|
Test: divisible by 17
|
||||||
|
If true: throw to monkey 3
|
||||||
|
If false: throw to monkey 5
|
||||||
|
|
||||||
|
Monkey 5:
|
||||||
|
Starting items: 79, 83, 64, 58
|
||||||
|
Operation: new = old + 6
|
||||||
|
Test: divisible by 13
|
||||||
|
If true: throw to monkey 3
|
||||||
|
If false: throw to monkey 0
|
||||||
|
|
||||||
|
Monkey 6:
|
||||||
|
Starting items: 96, 72, 89, 70, 88
|
||||||
|
Operation: new = old + 4
|
||||||
|
Test: divisible by 3
|
||||||
|
If true: throw to monkey 1
|
||||||
|
If false: throw to monkey 2
|
||||||
|
|
||||||
|
Monkey 7:
|
||||||
|
Starting items: 79
|
||||||
|
Operation: new = old + 8
|
||||||
|
Test: divisible by 19
|
||||||
|
If true: throw to monkey 4
|
||||||
|
If false: throw to monkey 5
|
104
src/day11/mod.rs
Normal file
104
src/day11/mod.rs
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
use crate::read;
|
||||||
|
use itertools::Itertools;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq, Clone, Hash)]
|
||||||
|
enum Operation {
|
||||||
|
Multiply(u64),
|
||||||
|
Add(u64),
|
||||||
|
Square,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Eq, Clone, Hash)]
|
||||||
|
struct Monkey {
|
||||||
|
pub items: Vec<u64>,
|
||||||
|
pub operation: Operation,
|
||||||
|
pub test: u64,
|
||||||
|
pub throw_to: [usize; 2],
|
||||||
|
pub inspected: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Monkey {
|
||||||
|
pub fn parse(s: &str) -> Self {
|
||||||
|
let (_, items, operation, operand, test, throw_true, throw_false) = sscanf::sscanf!(
|
||||||
|
s,
|
||||||
|
"Monkey {usize}:
|
||||||
|
Starting items: {str}
|
||||||
|
Operation: new = old {str} {str}
|
||||||
|
Test: divisible by {u64}
|
||||||
|
If true: throw to monkey {usize}
|
||||||
|
If false: throw to monkey {usize}"
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let items = items.split(", ").map(|i| i.parse().unwrap()).collect_vec();
|
||||||
|
let operation = match operation {
|
||||||
|
"*" => match operand {
|
||||||
|
"old" => Operation::Square,
|
||||||
|
n => Operation::Multiply(n.parse().unwrap()),
|
||||||
|
},
|
||||||
|
"+" => Operation::Add(operand.parse().unwrap()),
|
||||||
|
_ => unreachable!(),
|
||||||
|
};
|
||||||
|
Self {
|
||||||
|
items,
|
||||||
|
operation,
|
||||||
|
test,
|
||||||
|
throw_to: [throw_true, throw_false],
|
||||||
|
inspected: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn simulate(monkeys: &mut Vec<Monkey>, is_part_1: bool) {
|
||||||
|
let test_product: u64 = monkeys.iter().map(|m| m.test).product();
|
||||||
|
let rounds = if is_part_1 { 20 } else { 10_000 };
|
||||||
|
for _ in 0..rounds {
|
||||||
|
for i in 0..monkeys.len() {
|
||||||
|
let items = monkeys[i].items.clone();
|
||||||
|
for mut item in items {
|
||||||
|
item = match monkeys[i].operation {
|
||||||
|
Operation::Square => item * item,
|
||||||
|
Operation::Add(n) => item + n,
|
||||||
|
Operation::Multiply(n) => item * n,
|
||||||
|
};
|
||||||
|
item = if is_part_1 {
|
||||||
|
item / 3
|
||||||
|
} else {
|
||||||
|
item % test_product
|
||||||
|
};
|
||||||
|
let other_monkey =
|
||||||
|
monkeys[i].throw_to[if item % monkeys[i].test == 0 { 0 } else { 1 }];
|
||||||
|
monkeys[other_monkey].items.push(item);
|
||||||
|
}
|
||||||
|
monkeys[i].inspected += monkeys[i].items.len();
|
||||||
|
monkeys[i].items = Vec::new();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn calculate_monkey_business(monkeys: &[Monkey]) -> usize {
|
||||||
|
monkeys
|
||||||
|
.iter()
|
||||||
|
.map(|m| m.inspected)
|
||||||
|
.sorted()
|
||||||
|
.rev()
|
||||||
|
.take(2)
|
||||||
|
.product()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn run() {
|
||||||
|
let input = read("11");
|
||||||
|
let mut monkeys = input.split("\n\n").map(Monkey::parse).collect_vec();
|
||||||
|
|
||||||
|
#[cfg(feature = "part1")]
|
||||||
|
{
|
||||||
|
let monkeys = &mut monkeys.clone();
|
||||||
|
simulate(monkeys, true);
|
||||||
|
println!("Day 11, Part 01: {}", calculate_monkey_business(monkeys));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "part2")]
|
||||||
|
{
|
||||||
|
simulate(&mut monkeys, false);
|
||||||
|
println!("Day 11, Part 02: {}", calculate_monkey_business(&monkeys));
|
||||||
|
}
|
||||||
|
}
|
@ -11,6 +11,7 @@ mod day07;
|
|||||||
mod day08;
|
mod day08;
|
||||||
mod day09;
|
mod day09;
|
||||||
mod day10;
|
mod day10;
|
||||||
|
mod day11;
|
||||||
mod puter;
|
mod puter;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
@ -46,6 +47,9 @@ fn main() {
|
|||||||
if cfg!(feature = "day10") || (cfg!(feature = "today") && today == 10) {
|
if cfg!(feature = "day10") || (cfg!(feature = "today") && today == 10) {
|
||||||
day10::run();
|
day10::run();
|
||||||
}
|
}
|
||||||
|
if cfg!(feature = "day11") || (cfg!(feature = "today") && today == 11) {
|
||||||
|
day11::run();
|
||||||
|
}
|
||||||
println!("Finished, time taken: {:?}", now.elapsed())
|
println!("Finished, time taken: {:?}", now.elapsed())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user