Skip to content

Commit

Permalink
Use i32
Browse files Browse the repository at this point in the history
  • Loading branch information
EbbDrop committed Dec 8, 2024
1 parent 01c180b commit 9028f1e
Showing 1 changed file with 37 additions and 49 deletions.
86 changes: 37 additions & 49 deletions src/day8.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -23,66 +23,60 @@ 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;
for mast_i in &masts[f as usize] {
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);
}
}
}
Expand All @@ -104,79 +98,73 @@ 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;
for mast_i in &masts[f as usize] {
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;
}
}
Expand Down

0 comments on commit 9028f1e

Please sign in to comment.