mirror of
https://github.com/Noratrieb/advent-of-code.git
synced 2026-01-14 17:45:02 +01:00
part 2
This commit is contained in:
parent
d246992de0
commit
05606dc222
3 changed files with 101 additions and 4 deletions
25
2024/Cargo.lock
generated
25
2024/Cargo.lock
generated
|
|
@ -51,6 +51,12 @@ dependencies = [
|
||||||
"windows-sys 0.59.0",
|
"windows-sys 0.59.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "autocfg"
|
||||||
|
version = "1.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "2.6.0"
|
version = "2.6.0"
|
||||||
|
|
@ -186,6 +192,7 @@ dependencies = [
|
||||||
"divan",
|
"divan",
|
||||||
"helper",
|
"helper",
|
||||||
"nom",
|
"nom",
|
||||||
|
"num-integer",
|
||||||
"smallvec",
|
"smallvec",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -273,6 +280,24 @@ dependencies = [
|
||||||
"minimal-lexical",
|
"minimal-lexical",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-integer"
|
||||||
|
version = "0.1.46"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
|
||||||
|
dependencies = [
|
||||||
|
"num-traits",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "num-traits"
|
||||||
|
version = "0.2.19"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.92"
|
version = "1.0.92"
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ nom.workspace = true
|
||||||
helper.workspace = true
|
helper.workspace = true
|
||||||
divan.workspace = true
|
divan.workspace = true
|
||||||
smallvec = "1.13.2"
|
smallvec = "1.13.2"
|
||||||
|
num-integer = "0.1.46"
|
||||||
|
|
||||||
[[bench]]
|
[[bench]]
|
||||||
name = "benches"
|
name = "benches"
|
||||||
|
|
|
||||||
|
|
@ -244,7 +244,7 @@ fn part1_arrayvec(input: &str) -> u64 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl<'a> IntoIterator for &'a Arrayvec {
|
impl<'a> IntoIterator for &'a Arrayvec {
|
||||||
type IntoIter = std::slice::Iter<'a,Coods>;
|
type IntoIter = std::slice::Iter<'a, Coods>;
|
||||||
type Item = &'a Coods;
|
type Item = &'a Coods;
|
||||||
fn into_iter(self) -> Self::IntoIter {
|
fn into_iter(self) -> Self::IntoIter {
|
||||||
unsafe { self.elems.get_unchecked(0..self.len).iter() }
|
unsafe { self.elems.get_unchecked(0..self.len).iter() }
|
||||||
|
|
@ -312,8 +312,79 @@ fn part1_arrayvec(input: &str) -> u64 {
|
||||||
.count() as u64
|
.count() as u64
|
||||||
}
|
}
|
||||||
|
|
||||||
fn part2(_input: &str) -> u64 {
|
fn part2(input: &str) -> u64 {
|
||||||
0
|
let mut all_antennas = [const { vec![] }; 256];
|
||||||
|
|
||||||
|
let mut width = 0;
|
||||||
|
|
||||||
|
let mut row = 0;
|
||||||
|
let mut col = 0;
|
||||||
|
for cell in input.bytes() {
|
||||||
|
if cell == b'\n' {
|
||||||
|
row += 1;
|
||||||
|
width = col;
|
||||||
|
col = 0;
|
||||||
|
} else if cell != b'.' {
|
||||||
|
all_antennas[cell as usize].push((col as i64, row as i64));
|
||||||
|
col += 1;
|
||||||
|
} else {
|
||||||
|
col += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let height = row;
|
||||||
|
|
||||||
|
let mut is_antinode = vec![false; width * height];
|
||||||
|
let all_antennas = &all_antennas[b'0' as usize..b'z' as usize];
|
||||||
|
|
||||||
|
for antennas in all_antennas {
|
||||||
|
for (i, &a) in antennas.iter().enumerate() {
|
||||||
|
for (j, &b) in antennas.iter().enumerate() {
|
||||||
|
if i >= j {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut diff = (a.0 - b.0, a.1 - b.1);
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let gcd = num_integer::gcd(diff.0, diff.1);
|
||||||
|
if gcd == 1 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
diff = (diff.0 / gcd, diff.1 / gcd);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut antinode = a;
|
||||||
|
while (0..(width as i64)).contains(&antinode.0)
|
||||||
|
&& (0..(height as i64)).contains(&antinode.1)
|
||||||
|
{
|
||||||
|
unsafe {
|
||||||
|
*is_antinode.get_unchecked_mut(
|
||||||
|
(antinode.0 as usize * width) + antinode.1 as usize,
|
||||||
|
) = true;
|
||||||
|
}
|
||||||
|
antinode = (antinode.0 + diff.0, antinode.1 + diff.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut antinode = a;
|
||||||
|
while (0..(width as i64)).contains(&antinode.0)
|
||||||
|
&& (0..(height as i64)).contains(&antinode.1)
|
||||||
|
{
|
||||||
|
unsafe {
|
||||||
|
*is_antinode.get_unchecked_mut(
|
||||||
|
(antinode.0 as usize * width) + antinode.1 as usize,
|
||||||
|
) = true;
|
||||||
|
}
|
||||||
|
antinode = (antinode.0 - diff.0, antinode.1 - diff.1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
is_antinode
|
||||||
|
.iter()
|
||||||
|
.filter(|is_antinode| **is_antinode)
|
||||||
|
.count() as u64
|
||||||
}
|
}
|
||||||
|
|
||||||
helper::tests! {
|
helper::tests! {
|
||||||
|
|
@ -324,7 +395,7 @@ helper::tests! {
|
||||||
}
|
}
|
||||||
part2 {
|
part2 {
|
||||||
small => 34;
|
small => 34;
|
||||||
default => 0;
|
default => 949;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
helper::benchmarks! {}
|
helper::benchmarks! {}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue