diff --git a/src/day8.rs b/src/day8.rs index d16e4b1..fa26855 100644 --- a/src/day8.rs +++ b/src/day8.rs @@ -4,11 +4,11 @@ use tinyvec::ArrayVec; use crate::memchr_inv::OneInv; #[cfg(not(test))] -const SIZE: usize = 50; +const SIZE: i32 = 50; #[cfg(test)] -const SIZE: usize = 12; +const SIZE: i32 = 12; -const SIZE1: usize = SIZE + 1; +const SIZE1: i32 = SIZE + 1; const FREQ_RANGE: usize = (b'z' - b'0' + 1) as usize; @@ -23,17 +23,23 @@ pub fn part1(s: &str) -> u64 { fn part1_inner(s: &str) -> u64 { let s = s.as_bytes(); - let mut masts: [ArrayVec<[usize; 5]>; FREQ_RANGE] = + let mut masts: [ArrayVec<[i32; 5]>; FREQ_RANGE] = [ArrayVec::from_array_empty([0; 5]); FREQ_RANGE]; - let mut antinodes = [false; SIZE * SIZE]; + let mut antinodes = [false; (SIZE * SIZE) as usize]; let mut total_antinotedes = 0; + let mut set_node = |x, y| { + total_antinotedes += !antinodes[(y * SIZE + x) as usize] as u64; + antinodes[(y * SIZE + x) as usize] = true; + }; + for i in unsafe { OneInv::new_unchecked(b'.').iter(s) } { if s[i] == b'\n' { continue; } let f = s[i] - b'0'; + let i = i as i32; let new_x = i % SIZE1; let new_y = i / SIZE1; @@ -41,48 +47,36 @@ fn part1_inner(s: &str) -> u64 { let mast_x = mast_i % SIZE1; let mast_y = mast_i / SIZE1; - let diff_x = new_x.abs_diff(mast_x); - let diff_y = new_y.abs_diff(mast_y); + let diff_x = new_x.abs_diff(mast_x) as i32; + let diff_y = new_y.abs_diff(mast_y) as i32; if new_x > mast_x { if mast_x >= diff_x && mast_y >= diff_y { let node_x = mast_x - diff_x; let node_y = mast_y - diff_y; - if !antinodes[node_y * SIZE + node_x] { - total_antinotedes += 1; - antinodes[node_y * SIZE + node_x] = true; - } + set_node(node_x, node_y); } if new_x + diff_x < SIZE && new_y + diff_y < SIZE { let node_x = new_x + diff_x; let node_y = new_y + diff_y; - if !antinodes[node_y * SIZE + node_x] { - total_antinotedes += 1; - antinodes[node_y * SIZE + node_x] = true; - } + set_node(node_x, node_y); } } else { if mast_x + diff_x < SIZE && mast_y >= diff_y { let node_x = mast_x + diff_x; let node_y = mast_y - diff_y; - if !antinodes[node_y * SIZE + node_x] { - total_antinotedes += 1; - antinodes[node_y * SIZE + node_x] = true; - } + set_node(node_x, node_y); } if new_x >= diff_x && new_y + diff_y < SIZE { let node_x = new_x - diff_x; let node_y = new_y + diff_y; - if !antinodes[node_y * SIZE + node_x] { - total_antinotedes += 1; - antinodes[node_y * SIZE + node_x] = true; - } + set_node(node_x, node_y); } } } @@ -104,17 +98,22 @@ pub fn part2(s: &str) -> u64 { fn part2_inner(s: &str) -> u64 { let s = s.as_bytes(); - let mut masts: [ArrayVec<[usize; 5]>; FREQ_RANGE] = + let mut masts: [ArrayVec<[i32; 5]>; FREQ_RANGE] = [ArrayVec::from_array_empty([0; 5]); FREQ_RANGE]; - let mut antinodes = [false; SIZE * SIZE]; + let mut antinodes = [false; (SIZE * SIZE) as usize]; let mut total_antinotedes = 0; + let mut set_node = |x, y| { + total_antinotedes += !antinodes[(y * SIZE + x) as usize] as u64; + antinodes[(y * SIZE + x) as usize] = true; + }; for i in unsafe { OneInv::new_unchecked(b'.').iter(s) } { if s[i] == b'\n' { continue; } let f = s[i] - b'0'; + let i = i as i32; let new_x = i % SIZE1; let new_y = i / SIZE1; @@ -122,61 +121,50 @@ fn part2_inner(s: &str) -> u64 { let mast_x = mast_i % SIZE1; let mast_y = mast_i / SIZE1; - let o_diff_x = new_x.abs_diff(mast_x); - let o_diff_y = new_y.abs_diff(mast_y); + let o_diff_x = new_x.abs_diff(mast_x) as i32; + let o_diff_y = new_y.abs_diff(mast_y) as i32; for k in 0.. { let diff_x = o_diff_x * k; let diff_y = o_diff_y * k; - let mut new_node = false; + let mut new_mast = false; if new_x > mast_x { if mast_x >= diff_x && mast_y >= diff_y { let node_x = mast_x - diff_x; let node_y = mast_y - diff_y; - new_node = true; - if !antinodes[node_y * SIZE + node_x] { - total_antinotedes += 1; - antinodes[node_y * SIZE + node_x] = true; - } + new_mast = true; + set_node(node_x, node_y); } if new_x + diff_x < SIZE && new_y + diff_y < SIZE { let node_x = new_x + diff_x; let node_y = new_y + diff_y; - new_node = true; - if !antinodes[node_y * SIZE + node_x] { - total_antinotedes += 1; - antinodes[node_y * SIZE + node_x] = true; - } + new_mast = true; + set_node(node_x, node_y); } } else { if mast_x + diff_x < SIZE && mast_y >= diff_y { let node_x = mast_x + diff_x; let node_y = mast_y - diff_y; - new_node = true; - if !antinodes[node_y * SIZE + node_x] { - total_antinotedes += 1; - antinodes[node_y * SIZE + node_x] = true; - } + new_mast = true; + set_node(node_x, node_y); } if new_x >= diff_x && new_y + diff_y < SIZE { let node_x = new_x - diff_x; let node_y = new_y + diff_y; - new_node = true; - if !antinodes[node_y * SIZE + node_x] { - total_antinotedes += 1; - antinodes[node_y * SIZE + node_x] = true; - } + new_mast = true; + set_node(node_x, node_y); } } - if !new_node { + + if !new_mast { break; } }