parses input for day11
This commit is contained in:
parent
b2aa96255e
commit
14a80c2cca
2 changed files with 115 additions and 0 deletions
114
2022-aoc/src/d11.rs
Normal file
114
2022-aoc/src/d11.rs
Normal file
|
@ -0,0 +1,114 @@
|
|||
use std::collections::VecDeque;
|
||||
|
||||
use aoc_runner_derive::{aoc as aoc_run, aoc_generator};
|
||||
|
||||
#[derive(Debug, Clone, Default)]
|
||||
struct Monkey {
|
||||
items: VecDeque<Item>,
|
||||
op: Operation,
|
||||
tmod: u32,
|
||||
target: (usize, usize),
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Default)]
|
||||
struct Item(u32);
|
||||
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
enum Operation {
|
||||
Add(Option<u32>),
|
||||
Mul(Option<u32>),
|
||||
}
|
||||
|
||||
impl Default for Operation {
|
||||
fn default() -> Self {
|
||||
Operation::Add(Some(0))
|
||||
}
|
||||
}
|
||||
|
||||
#[aoc_generator(day11)]
|
||||
fn parse_input(input: &str) -> Vec<Monkey> {
|
||||
let mut out = Vec::new();
|
||||
let mut monkey = Monkey::default();
|
||||
|
||||
for line in input.lines() {
|
||||
let monkey = &mut monkey;
|
||||
let line = line.trim();
|
||||
|
||||
if line.starts_with("Monkey") {
|
||||
continue;
|
||||
}
|
||||
if line.starts_with("Starting") {
|
||||
monkey.items = parse_items(line);
|
||||
continue;
|
||||
}
|
||||
if line.starts_with("Operation") {
|
||||
monkey.op = parse_operation(line);
|
||||
continue;
|
||||
}
|
||||
if line.starts_with("Test") {
|
||||
monkey.tmod = line.split_whitespace().last().unwrap().parse().unwrap();
|
||||
continue;
|
||||
}
|
||||
if line.starts_with("If true") {
|
||||
monkey.target.0 = line.split_whitespace().last().unwrap().parse().unwrap();
|
||||
continue;
|
||||
}
|
||||
if line.starts_with("If false") {
|
||||
monkey.target.1 = line.split_whitespace().last().unwrap().parse().unwrap();
|
||||
let m = monkey.clone();
|
||||
out.push(m);
|
||||
*monkey = Monkey::default();
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
out
|
||||
}
|
||||
|
||||
fn parse_items(items: &str) -> VecDeque<Item> {
|
||||
let mut out = VecDeque::new();
|
||||
let (_, items) = items.split_once(" items: ").unwrap();
|
||||
for item in items.split(", ") {
|
||||
out.push_back(Item(item.parse().unwrap()));
|
||||
}
|
||||
out
|
||||
}
|
||||
|
||||
fn parse_operation(op: &str) -> Operation {
|
||||
let (_, op) = op.split_once(" new = old ").unwrap();
|
||||
let (op, val) = op.split_once(' ').unwrap();
|
||||
match op {
|
||||
"*" => Operation::Mul(val.parse().ok()),
|
||||
"+" => Operation::Add(val.parse().ok()),
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
#[aoc_run(day11, part1)]
|
||||
fn part1(troop: &[Monkey]) -> u32 {
|
||||
0
|
||||
}
|
||||
|
||||
#[aoc_run(day11, part2)]
|
||||
fn part2(troop: &[Monkey]) -> u32 {
|
||||
0
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
const INPUT: &str = "";
|
||||
|
||||
#[test]
|
||||
fn part1_test() {
|
||||
let v = parse_input(INPUT);
|
||||
|
||||
assert_eq!(part1(&v), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn part2_test() {
|
||||
let v = parse_input(INPUT);
|
||||
assert_eq!(part2(&v), 1);
|
||||
}
|
||||
}
|
|
@ -10,5 +10,6 @@ mod d7;
|
|||
mod d8;
|
||||
mod d9;
|
||||
mod d10;
|
||||
mod d11;
|
||||
|
||||
aoc_lib! { year = 2022 }
|
||||
|
|
Loading…
Reference in a new issue