2025-05-27 22:33:40 -05:00
|
|
|
// https://adventofcode.com/2024/day/3
|
2025-05-26 11:59:58 -05:00
|
|
|
//
|
|
|
|
|
// Run command: cargo run ./input.txt
|
|
|
|
|
|
2025-05-26 13:25:35 -05:00
|
|
|
mod op;
|
|
|
|
|
mod parser;
|
|
|
|
|
mod tokenizer;
|
|
|
|
|
|
|
|
|
|
use crate::op::Ops;
|
|
|
|
|
use crate::parser::parse_tokens;
|
|
|
|
|
use crate::tokenizer::{Token, tokenize};
|
|
|
|
|
|
2025-05-26 11:59:58 -05:00
|
|
|
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);
|
|
|
|
|
|
2025-05-26 12:46:12 -05:00
|
|
|
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,
|
|
|
|
|
}
|
2025-05-26 11:59:58 -05:00
|
|
|
}
|
|
|
|
|
|
2025-05-26 12:46:12 -05:00
|
|
|
println!("Answer part 1: {}", accumulator_part1);
|
|
|
|
|
println!("Answer part 2: {}", accumulator_part2);
|
2025-05-26 11:59:58 -05:00
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|