This commit is contained in:
traxys 2025-12-01 14:53:20 +01:00
parent e00cbffbfa
commit 14306595bd

96
src/bin/day1.rs Normal file
View 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(())
}