diff --git a/src/2024/day6/rust/mod.rs b/src/2024/day6/rust/mod.rs index ad0450e..1f13d48 100644 --- a/src/2024/day6/rust/mod.rs +++ b/src/2024/day6/rust/mod.rs @@ -38,19 +38,28 @@ fn moving_into_boundaries(x: usize, y: usize, map_state: &mut [Vec], guard: } } -fn find_guard(map_state: &mut Vec>, counts: &mut i32, move_guard: fn(&mut Vec>, usize, usize) -> i32) -> bool { - map_state.iter().enumerate().find_map(|(y, row)| { - row.iter().enumerate().find_map(|(x, &tile)| { - if (3..=6).contains(&tile) { - Some((x, y)) - } else { - None - } +fn find_guard( + map_state: &mut Vec>, + counts: &mut i32, + move_guard: fn(&mut Vec>, usize, usize) -> i32, +) -> bool { + map_state + .iter() + .enumerate() + .find_map(|(y, row)| { + row.iter().enumerate().find_map(|(x, &tile)| { + if (3..=6).contains(&tile) { + Some((x, y)) + } else { + None + } + }) }) - }).map(|(x, y)| { - *counts += move_guard(map_state, x, y); - true - }).unwrap_or(false) + .map(|(x, y)| { + *counts += move_guard(map_state, x, y); + true + }) + .unwrap_or(false) } pub fn part_a(input: &str) -> i32 { @@ -64,7 +73,7 @@ pub fn part_a(input: &str) -> i32 { .position(|&x| x == guard) .expect("guard should face valid direction"); let direction_wheel_vectors: Vec<(i32, i32)> = vec![(0, -1), (1, 0), (0, 1), (-1, 0)]; - + if moving_into_boundaries(x, y, map_state, guard) { return 0; } @@ -101,7 +110,7 @@ pub fn part_a(input: &str) -> i32 { .filter(|&&tile| (3..=6).contains(&tile)) .count() as i32; - while find_guard(&mut map, &mut toggled_tile_count, move_guard) {}; + while find_guard(&mut map, &mut toggled_tile_count, move_guard) {} toggled_tile_count } @@ -231,7 +240,7 @@ pub fn part_b(input: &str) -> i32 { _ => panic!("Unexpected character in input"), } } - while find_guard(&mut map, &mut possible_loops, move_guard) {}; + while find_guard(&mut map, &mut possible_loops, move_guard) {} possible_loops } diff --git a/src/2024/day7/rust/mod.rs b/src/2024/day7/rust/mod.rs index f4eb1e0..2fd9482 100644 --- a/src/2024/day7/rust/mod.rs +++ b/src/2024/day7/rust/mod.rs @@ -4,23 +4,39 @@ struct TestCase { } pub fn part_a(input: &str) -> i64 { - parse_input(input).iter() - .filter_map(|test_case| if can_create(&test_case.test_val, &test_case.nums, false) { Some(test_case.test_val) } else { None }) + parse_input(input) + .iter() + .filter_map(|test_case| { + if can_create(&test_case.test_val, &test_case.nums, false) { + Some(test_case.test_val) + } else { + None + } + }) .sum() } pub fn part_b(input: &str) -> i64 { - parse_input(input).iter() - .filter_map(|test_case| if can_create(&test_case.test_val, &test_case.nums, true) { Some(test_case.test_val) } else { None }) + parse_input(input) + .iter() + .filter_map(|test_case| { + if can_create(&test_case.test_val, &test_case.nums, true) { + Some(test_case.test_val) + } else { + None + } + }) .sum() } fn parse_input(input: &str) -> Vec { - input.lines() + input + .lines() .filter_map(|line| { let parts: Vec<_> = line.split(": ").collect(); parts[0].parse::().map_or(None, |test_val| { - let nums = parts[1].split_whitespace() + let nums = parts[1] + .split_whitespace() .filter_map(|s| s.parse::().ok()) .collect(); Some(TestCase { test_val, nums }) diff --git a/src/2024/day8/rust/mod.rs b/src/2024/day8/rust/mod.rs index b67e830..05425a5 100644 --- a/src/2024/day8/rust/mod.rs +++ b/src/2024/day8/rust/mod.rs @@ -1,13 +1,9 @@ use std::collections::{HashMap, HashSet}; - -#[derive(Debug)] struct Antenna { frequency: char, x: usize, y: usize, } - -#[derive(Debug)] struct Map { width: usize, height: usize, @@ -19,16 +15,23 @@ fn parse_input(input: &str) -> Map { let mut antennas: HashMap> = HashMap::new(); let lines: Vec<&str> = input.lines().collect(); let (width, height) = (lines[0].len(), lines.len()); - for (y, line) in lines.iter().enumerate() { for (x, frequency) in line.chars().enumerate() { if frequency.is_alphanumeric() { - antennas.entry(frequency).or_default().push(Antenna { frequency, x, y }); + antennas + .entry(frequency) + .or_default() + .push(Antenna { frequency, x, y }); } } } - - Map { width, height, antennas, antinodes: HashSet::new() } + + Map { + width, + height, + antennas, + antinodes: HashSet::new(), + } } fn find_antinodes(map: &mut Map, is_part_b: bool) { @@ -36,21 +39,23 @@ fn find_antinodes(map: &mut Map, is_part_b: bool) { if let Some(antennas) = map.antennas.get(frequency) { for (i, antenna1) in antennas.iter().enumerate() { for antenna2 in &antennas[i + 1..] { - // let's do some geometry I guess if is_part_b { - let (dx, dy) = (antenna2.x as i32 - antenna1.x as i32, antenna2.y as i32 - antenna1.y as i32); + let (dx, dy) = ( + antenna2.x as i32 - antenna1.x as i32, + antenna2.y as i32 - antenna1.y as i32, + ); let directions = [(antenna1, dx, dy), (antenna2, -dx, -dy)]; - for (antenna, dx, dy) in &directions { let (mut x, mut y) = (antenna.x as i32, antenna.y as i32); - while (0..map.width as i32).contains(&x) && (0..map.height as i32).contains(&y) { + while (0..map.width as i32).contains(&x) + && (0..map.height as i32).contains(&y) + { map.antinodes.insert((x as usize, y as usize)); x += dx; y += dy; } } } - let offsets = [ ( antenna1.x as i32 - (antenna2.x as i32 - antenna1.x as i32), @@ -61,9 +66,9 @@ fn find_antinodes(map: &mut Map, is_part_b: bool) { antenna2.y as i32 + (antenna2.y as i32 - antenna1.y as i32), ), ]; - for &(x, y) in &offsets { - if (0..map.width as i32).contains(&x) && (0..map.height as i32).contains(&y) { + if (0..map.width as i32).contains(&x) && (0..map.height as i32).contains(&y) + { map.antinodes.insert((x as usize, y as usize)); } } @@ -77,7 +82,21 @@ fn print_map(map: &Map) { println!("Map:"); for y in 0..map.height { for x in 0..map.width { - let symbol = map.antennas.values().flatten().find(|a| a.x == x && a.y == y).map_or_else(|| if map.antinodes.contains(&(x, y)) { '#' } else { '.' }, |antenna| antenna.frequency); + let symbol = map + .antennas + .values() + .flatten() + .find(|a| a.x == x && a.y == y) + .map_or_else( + || { + if map.antinodes.contains(&(x, y)) { + '#' + } else { + '.' + } + }, + |antenna| antenna.frequency, + ); print!("{}", symbol); } println!();