Day 5 Part 1

This commit is contained in:
2025-05-30 07:59:06 -05:00
parent 374ffa5172
commit 82d48212cf
5 changed files with 1496 additions and 0 deletions

7
day_05/Cargo.lock generated Normal file
View 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
View File

@@ -0,0 +1,6 @@
[package]
name = "day_05"
version = "0.1.0"
edition = "2024"
[dependencies]

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
View 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
View 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(())
}