Day 1
This commit is contained in:
parent
e00cbffbfa
commit
14306595bd
1 changed files with 96 additions and 0 deletions
96
src/bin/day1.rs
Normal file
96
src/bin/day1.rs
Normal file
|
|
@ -0,0 +1,96 @@
|
||||||
|
use std::time::Instant;
|
||||||
|
|
||||||
|
use aoc_2025::{load, print_res};
|
||||||
|
use bstr::BString;
|
||||||
|
|
||||||
|
pub enum Side {
|
||||||
|
Plus,
|
||||||
|
Minus,
|
||||||
|
}
|
||||||
|
|
||||||
|
type Parsed = Vec<(Side, i16)>;
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
pub fn parsing(input: &BString) -> color_eyre::Result<Parsed> {
|
||||||
|
core::str::from_utf8(input)?
|
||||||
|
.lines()
|
||||||
|
.map(|l| match l.as_bytes().first() {
|
||||||
|
None => Err(color_eyre::eyre::eyre!("Invalid empty line")),
|
||||||
|
Some(b'L') => Ok((Side::Minus, l[1..].parse()?)),
|
||||||
|
Some(b'R') => Ok((Side::Plus, l[1..].parse()?)),
|
||||||
|
Some(_) => Err(color_eyre::eyre::eyre!("Invalid line `{l}`")),
|
||||||
|
})
|
||||||
|
.collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
pub fn part1(input: Parsed) {
|
||||||
|
let mut current: i16 = 50;
|
||||||
|
|
||||||
|
let mut zero_count = 0;
|
||||||
|
|
||||||
|
for (side, amount) in input {
|
||||||
|
match side {
|
||||||
|
Side::Plus => current += amount,
|
||||||
|
Side::Minus => current -= amount,
|
||||||
|
}
|
||||||
|
|
||||||
|
current = current.rem_euclid(100);
|
||||||
|
if current == 0 {
|
||||||
|
zero_count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print_res!("Zero count: {zero_count}");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
pub fn part2(input: Parsed) {
|
||||||
|
let mut current: i16 = 50;
|
||||||
|
|
||||||
|
let mut zero_count = 0;
|
||||||
|
|
||||||
|
for (side, amount) in input {
|
||||||
|
let towards = match side {
|
||||||
|
Side::Plus => 1,
|
||||||
|
Side::Minus => -1,
|
||||||
|
};
|
||||||
|
|
||||||
|
for _ in 0..amount {
|
||||||
|
current += towards;
|
||||||
|
|
||||||
|
if current == -1 {
|
||||||
|
current = 99;
|
||||||
|
} else if current == 100 {
|
||||||
|
current = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if current == 0 {
|
||||||
|
zero_count += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
print_res!("Zero count: {zero_count}");
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn main() -> color_eyre::Result<()> {
|
||||||
|
let context = load()?;
|
||||||
|
|
||||||
|
let start = Instant::now();
|
||||||
|
let parsed = parsing(&context.input)?;
|
||||||
|
let elapsed = humantime::format_duration(start.elapsed());
|
||||||
|
|
||||||
|
let start = Instant::now();
|
||||||
|
if context.part == 1 {
|
||||||
|
part1(parsed);
|
||||||
|
} else {
|
||||||
|
part2(parsed);
|
||||||
|
}
|
||||||
|
let elapsed_part = humantime::format_duration(start.elapsed());
|
||||||
|
|
||||||
|
println!(" Parsing: {elapsed}");
|
||||||
|
println!(" Solving: {elapsed_part}");
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue