1
0
This commit is contained in:
2024-12-04 07:03:13 +01:00
parent 1f638fc7c7
commit 9ab3453b02

View File

@@ -12,26 +12,13 @@ pub fn day_main() {
type RiddleResult = usize; type RiddleResult = usize;
fn part1(input: &str) -> RiddleResult { fn part1(input: &str) -> RiddleResult {
let mut puzzle = HashMap::<(usize, usize), char>::new(); let puzzle = parse_map(input);
input.lines().enumerate().for_each(|(y, line)| {
line.chars().enumerate().for_each(|(x, chr)| {
puzzle.insert((x, y), chr);
})
});
diags(&puzzle)
// 2023 wrong
}
fn diags(m: &HashMap<(usize, usize), char>) -> usize {
let mut count = 0; let mut count = 0;
let xmax = m.keys().map(|k| k.0).max().unwrap(); let x_max = puzzle.keys().map(|k| k.0).max().unwrap();
let ymax = m.keys().map(|k| k.1).max().unwrap(); let y_max = puzzle.keys().map(|k| k.1).max().unwrap();
println!("{xmax},{ymax}");
let S = "XMAS".chars().collect_vec();
for sx in 0..=xmax { for sx in 0..=x_max {
for sy in 0..=ymax { for sy in 0..=y_max {
'foo: for (a, b) in [ 'foo: for (a, b) in [
(1, 1), (1, 1),
(-1, 1), (-1, 1),
@@ -42,18 +29,17 @@ fn diags(m: &HashMap<(usize, usize), char>) -> usize {
(0, -1), (0, -1),
(-1, 0), (-1, 0),
] { ] {
for (i, c) in S.iter().enumerate() { for (i, c) in "XMAS".chars().enumerate() {
let i = i as i32; let i = i as i32;
let p = (sx as i32 + i * a, sy as i32 + i * b); let p = (sx as i32 + i * a, sy as i32 + i * b);
if p.0 < 0 || p.1 < 0 || p.0 > xmax as i32 || p.1 > ymax as i32 { if p.0 < 0 || p.1 < 0 || p.0 > x_max as i32 || p.1 > y_max as i32 {
continue 'foo; continue 'foo;
} }
if m[&(p.0 as usize, p.1 as usize)] != *c { if puzzle[&(p.0 as usize, p.1 as usize)] != c {
continue 'foo; continue 'foo;
} }
} }
println!("found from {sx},{sy} ({a},{b})");
count += 1; count += 1;
} }
} }
@@ -63,17 +49,12 @@ fn diags(m: &HashMap<(usize, usize), char>) -> usize {
} }
fn part2(input: &str) -> RiddleResult { fn part2(input: &str) -> RiddleResult {
let mut puzzle = HashMap::<(usize, usize), char>::new(); let puzzle = parse_map(input);
input.lines().enumerate().for_each(|(y, line)| {
line.chars().enumerate().for_each(|(x, chr)| {
puzzle.insert((x, y), chr);
})
});
let mut count = 0; let mut count = 0;
let xmax = puzzle.keys().map(|k| k.0).max().unwrap(); let x_max = puzzle.keys().map(|k| k.0).max().unwrap();
let ymax = puzzle.keys().map(|k| k.1).max().unwrap(); let y_max = puzzle.keys().map(|k| k.1).max().unwrap();
for sx in 1..xmax { for sx in 1..x_max {
for sy in 1..ymax { for sy in 1..y_max {
let first = [ let first = [
puzzle[&(sx - 1, sy - 1)], puzzle[&(sx - 1, sy - 1)],
puzzle[&(sx, sy)], puzzle[&(sx, sy)],
@@ -97,6 +78,16 @@ fn part2(input: &str) -> RiddleResult {
count count
} }
fn parse_map(input: &str) -> HashMap<(usize, usize), char> {
let mut puzzle = HashMap::<(usize, usize), char>::new();
input.lines().enumerate().for_each(|(y, line)| {
line.chars().enumerate().for_each(|(x, chr)| {
puzzle.insert((x, y), chr);
})
});
puzzle
}
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::{part1, part2}; use super::{part1, part2};