Day 5 Part 1
This commit is contained in:
7
day_05/Cargo.lock
generated
Normal file
7
day_05/Cargo.lock
generated
Normal file
@@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "day_05"
|
||||
version = "0.1.0"
|
||||
6
day_05/Cargo.toml
Normal file
6
day_05/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "day_05"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
1368
day_05/input.txt
Normal file
1368
day_05/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
28
day_05/small_input.txt
Normal file
28
day_05/small_input.txt
Normal file
@@ -0,0 +1,28 @@
|
||||
47|53
|
||||
97|13
|
||||
97|61
|
||||
97|47
|
||||
75|29
|
||||
61|13
|
||||
75|53
|
||||
29|13
|
||||
97|29
|
||||
53|29
|
||||
61|53
|
||||
97|53
|
||||
61|29
|
||||
47|13
|
||||
75|47
|
||||
97|75
|
||||
47|61
|
||||
75|61
|
||||
47|29
|
||||
75|13
|
||||
53|13
|
||||
|
||||
75,47,61,53,29
|
||||
97,61,53,29,13
|
||||
75,29,13
|
||||
75,97,47,61,53
|
||||
61,13,29
|
||||
97,13,75,29,47
|
||||
87
day_05/src/main.rs
Normal file
87
day_05/src/main.rs
Normal file
@@ -0,0 +1,87 @@
|
||||
use std::{
|
||||
collections::{HashMap, HashSet},
|
||||
env,
|
||||
error::Error,
|
||||
fs::File,
|
||||
io::{BufReader, prelude::*},
|
||||
};
|
||||
|
||||
fn main() -> Result<(), Box<dyn Error>> {
|
||||
// Handle command input
|
||||
let args: Vec<String> = env::args().collect();
|
||||
if args.len() != 2 {
|
||||
panic!(
|
||||
"{} must be run with a single argument of files name!",
|
||||
&args[0]
|
||||
)
|
||||
}
|
||||
let input_file_string = &args[1];
|
||||
|
||||
let buffer = BufReader::new(File::open(input_file_string)?);
|
||||
|
||||
let mut rules_stage = true;
|
||||
let mut page_rules: HashMap<i64, HashSet<i64>> = HashMap::new();
|
||||
let mut valid_page_updates: Vec<Vec<i64>> = Vec::new();
|
||||
// Load rules that look like 1|1
|
||||
for line in buffer.lines() {
|
||||
let line = line?;
|
||||
if rules_stage {
|
||||
// Stage 1: load rules
|
||||
if line.is_empty() {
|
||||
// Blank line means end of rules
|
||||
rules_stage = false;
|
||||
println!("Page Rules: {:?}", page_rules);
|
||||
continue;
|
||||
}
|
||||
let split_line: Vec<&str> = line.split("|").collect();
|
||||
if split_line.len() != 2 {
|
||||
Err(format!("Invalid input in rules: {}", line))?;
|
||||
}
|
||||
|
||||
// parse rule line and insert into out rule sets
|
||||
let key = split_line[0].parse::<i64>()?;
|
||||
let value = split_line[1].parse::<i64>()?;
|
||||
match page_rules.get_mut(&key) {
|
||||
Some(rule) => {
|
||||
rule.insert(value);
|
||||
}
|
||||
None => {
|
||||
let mut new_rule_set = HashSet::new();
|
||||
new_rule_set.insert(value);
|
||||
page_rules.insert(key, new_rule_set);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Stage 2: check updates
|
||||
let update_page_nums: Vec<i64> = line
|
||||
.split(",")
|
||||
.map(|v| v.parse::<_>())
|
||||
.collect::<Result<_, _>>()?;
|
||||
|
||||
let mut prev_pages: HashSet<i64> = HashSet::new();
|
||||
let mut is_valid = true;
|
||||
for page_num in update_page_nums.iter() {
|
||||
if let Some(rule_set) = page_rules.get(page_num) {
|
||||
if !prev_pages.is_disjoint(rule_set) {
|
||||
is_valid = false;
|
||||
break;
|
||||
}
|
||||
prev_pages.insert(*page_num);
|
||||
}
|
||||
}
|
||||
if is_valid {
|
||||
valid_page_updates.push(update_page_nums);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let mut accumulator = 0;
|
||||
for update in valid_page_updates {
|
||||
let middle_page = update[update.len() / 2];
|
||||
accumulator += middle_page;
|
||||
}
|
||||
|
||||
println!("Sum of middle pages from valid updates: {}", accumulator);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user