mirror of
https://github.com/bertptrs/adventofcode.git
synced 2025-12-25 21:00:31 +01:00
Solutions to day 10.
This commit is contained in:
7
2016/day-10/Cargo.toml
Normal file
7
2016/day-10/Cargo.toml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
[package]
|
||||||
|
name = "day-10"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Bert Peters <bert.ljpeters@gmail.com>"]
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
regex="^0.1"
|
||||||
88
2016/day-10/src/main.rs
Normal file
88
2016/day-10/src/main.rs
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
extern crate regex;
|
||||||
|
|
||||||
|
use regex::Regex;
|
||||||
|
use std::env;
|
||||||
|
use std::io::prelude::*;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::BufReader;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::collections::VecDeque;
|
||||||
|
use std::cmp::min;
|
||||||
|
use std::cmp::max;
|
||||||
|
|
||||||
|
fn give_value(values: &mut HashMap<i32, i32>, todo: &mut VecDeque<(i32, i32, i32)>, bot: i32, value: i32)
|
||||||
|
{
|
||||||
|
if values.contains_key(&bot) {
|
||||||
|
let current = values[&bot];
|
||||||
|
values.remove(&bot);
|
||||||
|
|
||||||
|
todo.push_back((bot, value, current))
|
||||||
|
} else {
|
||||||
|
values.insert(bot, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let args: Vec<String> = env::args().collect();
|
||||||
|
let f = File::open(&args[1]).expect("Could not open file");
|
||||||
|
let reader = BufReader::new(f);
|
||||||
|
|
||||||
|
let input_regex = Regex::new(r"value (\d+) goes to bot (\d+)").unwrap();
|
||||||
|
let action_regex = Regex::new(r"bot (\d+) gives low to (bot|output) (\d+) and high to (bot|output) (\d+)").unwrap();
|
||||||
|
|
||||||
|
let mut bot_values = HashMap::new();
|
||||||
|
let mut bot_actions = HashMap::new();
|
||||||
|
let mut action_queue = VecDeque::new();
|
||||||
|
|
||||||
|
for line in reader.lines() {
|
||||||
|
let contents = line.unwrap();
|
||||||
|
match action_regex.captures(&contents) {
|
||||||
|
Some(caps) => {
|
||||||
|
let bot: i32 = caps[1].parse().unwrap();
|
||||||
|
let t1 = &caps[2] == "bot";
|
||||||
|
let n1: i32 = caps[3].parse().unwrap();
|
||||||
|
let t2 = &caps[4] == "bot";
|
||||||
|
let n2: i32 = caps[5].parse().unwrap();
|
||||||
|
|
||||||
|
bot_actions.insert(bot, (t1, n1, t2, n2));
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
let caps = input_regex.captures(&contents).unwrap();
|
||||||
|
let value: i32 = caps[1].parse().unwrap();
|
||||||
|
let bot: i32 = caps[2].parse().unwrap();
|
||||||
|
|
||||||
|
give_value(&mut bot_values, &mut action_queue, bot, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut bins = HashMap::new();
|
||||||
|
|
||||||
|
while !action_queue.is_empty() {
|
||||||
|
let (bot, val1, val2) = action_queue.pop_front().unwrap();
|
||||||
|
|
||||||
|
let lo = min(val1, val2);
|
||||||
|
let hi = max(val1, val2);
|
||||||
|
|
||||||
|
if lo == 17 && hi == 61 {
|
||||||
|
println!("Bot {} handling 17 and 61", bot);
|
||||||
|
}
|
||||||
|
|
||||||
|
let (tlo, nlo, thi, nhi) = bot_actions[&bot];
|
||||||
|
|
||||||
|
if tlo {
|
||||||
|
give_value(&mut bot_values, &mut action_queue, nlo, lo);
|
||||||
|
} else {
|
||||||
|
bins.insert(nlo, lo);
|
||||||
|
}
|
||||||
|
|
||||||
|
if thi {
|
||||||
|
give_value(&mut bot_values, &mut action_queue, nhi, hi);
|
||||||
|
} else {
|
||||||
|
bins.insert(nhi, hi);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let product = bins[&0] * bins[&1] * bins[&2];
|
||||||
|
println!("Product: {}", product);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user