--- /dev/null
+use std::io::Read;
+use std::error::Error;
+use std::fs::File;
+
+pub fn run(input_file: &str) -> Result<(), Box<dyn Error>> {
+ let mut f = File::open(input_file)?;
+ let mut input = String::new();
+ f.read_to_string(&mut input)?;
+
+ let res = run_part1(&input)?;
+ println!("{res}");
+
+ let res = run_part2(&input)?;
+ println!("{res}");
+
+ Ok(())
+}
+
+fn run_part1(input: &str) -> Result<u32, Box<dyn Error>> {
+ println!("Running day15 - part 1");
+
+ let s = match input.ends_with('\n') {
+ false => input,
+ true => &input[..input.len() - 1],
+ };
+ let res = s.split(',')
+ .filter_map(|h| {
+ match h.is_empty() {
+ true => None,
+ false => {
+ let mut r: u32 = 0;
+ h.as_bytes().iter()
+ .for_each(|&b| {
+ r = ((r + b as u32) * 17 ) % 256;
+ });
+ Some(r)
+ },
+ }
+ })
+ .sum();
+
+ Ok(res)
+}
+
+fn run_part2(input: &str) -> Result<u32, Box<dyn Error>> {
+ println!("Running day15 - part 2");
+ let res = 0;
+ Ok(res)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ static TEXT_INPUT: &str = "rn=1,cm-,qp=3,cm=2,qp-,pc=4,ot=9,ab=5,pc-,pc=6,ot=7";
+
+ #[test]
+ fn day15_part1() {
+ let res = run_part1(TEXT_INPUT);
+ assert_eq!(1320, res.unwrap());
+ }
+
+ #[test]
+ fn day15_part2() {
+ let res = run_part2(TEXT_INPUT);
+ assert_eq!(0, res.unwrap());
+ }
+}
pub mod day10;
pub mod day11;
pub mod day14;
+pub mod day15;
fn main() {
let args: Vec<String> = env::args().collect();
"day10" => day10::run(input_file)?,
"day11" => day11::run(input_file)?,
"day14" => day14::run(input_file)?,
+ "day15" => day15::run(input_file)?,
_ => return Err(format!("unknown day \"{day}\"").into()),
}
Ok(())