Files
adventofcode2024/day_03/src/main.rs
2025-05-27 22:33:40 -05:00

63 lines
1.5 KiB
Rust

// https://adventofcode.com/2024/day/3
//
// Run command: cargo run ./input.txt
mod op;
mod parser;
mod tokenizer;
use crate::op::Ops;
use crate::parser::parse_tokens;
use crate::tokenizer::{Token, tokenize};
use core::panic;
use std::env;
use std::error::Error;
use std::fs::File;
use std::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 input_buffer = BufReader::new(File::open(input_file_string)?);
let mut tokens: Vec<Token> = Vec::new();
for line in input_buffer.lines() {
tokens.append(&mut tokenize(line? + "\n"));
}
//println!("{:?}", tokens);
let muls = parse_tokens(&tokens);
//println!("{:?}", muls);
let mut accumulator_part1: i64 = 0;
let mut accumulator_part2: i64 = 0;
let mut enabled: bool = true;
for op in muls {
match op {
Ops::Mul(mul_op) => {
let value = mul_op.multiple::<i64>()?;
accumulator_part1 += value;
if enabled {
accumulator_part2 += value;
}
}
Ops::Do(_) => enabled = true,
Ops::Dont(_) => enabled = false,
}
}
println!("Answer part 1: {}", accumulator_part1);
println!("Answer part 2: {}", accumulator_part2);
Ok(())
}