// 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> { // Handle command input let args: Vec = 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 = 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::()?; 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(()) }