Day 11, puzzle 2

This commit is contained in:
jazzpi 2022-12-15 21:34:16 +01:00
parent 4f5d6d7fa0
commit 876ebfcfe3
5 changed files with 178 additions and 13 deletions

134
Cargo.lock generated
View File

@ -18,9 +18,16 @@ dependencies = [
"env_logger", "env_logger",
"itertools", "itertools",
"log", "log",
"num",
"regex", "regex",
] ]
[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.3.2" version = "1.3.2"
@ -79,6 +86,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "fuchsia-cprng"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.2.6" version = "0.2.6"
@ -152,6 +165,121 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "num"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e"
dependencies = [
"num-bigint",
"num-complex",
"num-integer",
"num-iter",
"num-rational",
"num-traits",
]
[[package]]
name = "num-bigint"
version = "0.1.44"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e63899ad0da84ce718c14936262a41cee2c79c981fc0a0e7c7beb47d5a07e8c1"
dependencies = [
"num-integer",
"num-traits",
"rand",
"rustc-serialize",
]
[[package]]
name = "num-complex"
version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b288631d7878aaf59442cffd36910ea604ecd7745c36054328595114001c9656"
dependencies = [
"num-traits",
"rustc-serialize",
]
[[package]]
name = "num-integer"
version = "0.1.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9"
dependencies = [
"autocfg",
"num-traits",
]
[[package]]
name = "num-iter"
version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee314c74bd753fc86b4780aa9475da469155f3848473a261d2d18e35245a784e"
dependencies = [
"num-bigint",
"num-integer",
"num-traits",
"rustc-serialize",
]
[[package]]
name = "num-traits"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [
"autocfg",
]
[[package]]
name = "rand"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
dependencies = [
"fuchsia-cprng",
"libc",
"rand_core 0.3.1",
"rdrand",
"winapi",
]
[[package]]
name = "rand_core"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
dependencies = [
"rand_core 0.4.2",
]
[[package]]
name = "rand_core"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
[[package]]
name = "rdrand"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
dependencies = [
"rand_core 0.3.1",
]
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.7.0" version = "1.7.0"
@ -169,6 +297,12 @@ version = "0.6.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
[[package]]
name = "rustc-serialize"
version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
[[package]] [[package]]
name = "rustix" name = "rustix"
version = "0.36.5" version = "0.36.5"

View File

@ -10,6 +10,7 @@ regex = "1"
itertools = "^0.10" itertools = "^0.10"
log = "^0.4" log = "^0.4"
env_logger = "^0.10" env_logger = "^0.10"
num = "^0.1"
[[bin]] [[bin]]
name = "d1p1" name = "d1p1"

View File

@ -10,8 +10,8 @@ pub fn main() {
let monkeys = day11::parse_monkeys(&util::parse_input()); let monkeys = day11::parse_monkeys(&util::parse_input());
for _ in 0..20 { for _ in 0..N_ROUNDS {
day11::do_round(&monkeys); day11::do_round(&monkeys, true);
} }
println!( println!(

22
src/bin/d11p2.rs Normal file
View File

@ -0,0 +1,22 @@
use aoc22::{
day11::{self, monkey_business},
util,
};
const N_ROUNDS: usize = 10000;
pub fn main() {
env_logger::init();
let monkeys = day11::parse_monkeys(&util::parse_input());
for _ in 0..N_ROUNDS {
day11::do_round(&monkeys, false);
}
println!(
"Monkey business after {} rounds is {}",
N_ROUNDS,
monkey_business(&monkeys)
);
}

View File

@ -1,6 +1,7 @@
use std::{borrow::BorrowMut, cell::RefCell, collections::VecDeque}; use std::{cell::RefCell, collections::VecDeque};
use itertools::Itertools; use itertools::Itertools;
use num::Integer;
use regex::Regex; use regex::Regex;
#[derive(Debug)] #[derive(Debug)]
@ -137,7 +138,12 @@ fn parse_op_kind(s: &str) -> OpKind {
} }
} }
pub fn do_round(monkeys: &Vec<RefCell<Monkey>>) { pub fn do_round(monkeys: &Vec<RefCell<Monkey>>, do_worry: bool) {
let overall_mod = monkeys
.iter()
.map(|m| m.borrow().test.div)
.reduce(|acc, div| acc.lcm(&div))
.unwrap();
for n in 0..monkeys.len() { for n in 0..monkeys.len() {
let mut monkey = monkeys.get(n).unwrap().borrow_mut(); let mut monkey = monkeys.get(n).unwrap().borrow_mut();
log::debug!("Monkey {}", n); log::debug!("Monkey {}", n);
@ -145,21 +151,23 @@ pub fn do_round(monkeys: &Vec<RefCell<Monkey>>) {
monkey.activity += 1; monkey.activity += 1;
let mut item = monkey.items.pop_front().unwrap(); let mut item = monkey.items.pop_front().unwrap();
log::debug!(" Monkey inspects an item with a worry level of {}.", item); log::debug!(" Monkey inspects an item with a worry level of {}.", item);
item = run_op(&monkey.op, item); item = run_op(&monkey.op, item) % overall_mod;
log::debug!(" Worry level increases to {}.", item); log::debug!(" Worry level increases to {}.", item);
if do_worry {
item /= 3; item /= 3;
log::debug!( log::debug!(
" Monkey gets bored with item. Worry level is divided by 3 to {}.", " Monkey gets bored with item. Worry level is divided by 3 to {}.",
item item
); );
}
let target = if item % monkey.test.div == 0 { let target = if item % monkey.test.div == 0 {
log::debug!("Current worry level is divisible by {}", monkey.test.div);
monkey.test.target_true
} else {
log::debug!( log::debug!(
"Current worry level is not divisible by {}", "Current worry level is not divisible by {}",
monkey.test.div monkey.test.div
); );
monkey.test.target_true
} else {
log::debug!("Current worry level is divisible by {}", monkey.test.div);
monkey.test.target_false monkey.test.target_false
}; };
log::debug!( log::debug!(