Compare commits

..

2 Commits

Author SHA1 Message Date
f472ace665 Day 25 part 1. 2023-11-10 21:15:00 +01:00
a9b3c90a6c Fixed compiler warnings. 2023-11-10 19:17:51 +01:00
6 changed files with 1549 additions and 5 deletions

1405
input/day25.txt Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,3 @@
fn main() { fn main() {
aoc_2018::tasks::day18::task2(); aoc_2018::tasks::day25::task1();
} }

View File

@@ -10,7 +10,7 @@ pub fn task1() {
for line in input.lines() { for line in input.lines() {
let mut counts = [0u8; 26]; let mut counts = [0u8; 26];
for c in line.chars() { for c in line.chars() {
counts[(c as usize - 'a' as usize)] += 1; counts[c as usize - 'a' as usize] += 1;
} }
if counts.iter().any(|count| *count == 2) { if counts.iter().any(|count| *count == 2) {
count_two += 1; count_two += 1;
@@ -138,7 +138,7 @@ fn check_children_for_match(node: &Node<'_>) -> Option<String> {
) )
}) })
.collect(); .collect();
// go over all suffixes and count their occurences. If # = 2, match! // go over all suffixes and count their occurrences. If # = 2, match!
let mut suffix_counter: HashMap<&str, usize> = HashMap::new(); let mut suffix_counter: HashMap<&str, usize> = HashMap::new();
for suffix_set in suffix_candidates.values() { for suffix_set in suffix_candidates.values() {
for suffix in suffix_set { for suffix in suffix_set {
@@ -164,7 +164,7 @@ fn add_id_to_tree<'a>(root: &mut Node<'a>, id: &'a str) {
current.same_prefix.insert(id); current.same_prefix.insert(id);
for (i, c) in id.chars().enumerate() { for (i, c) in id.chars().enumerate() {
{ {
let mut next = current.outgoing.entry(c).or_insert(Node::default()); let next = current.outgoing.entry(c).or_insert(Node::default());
next.depth = i + 1; next.depth = i + 1;
next.same_prefix.insert(id); next.same_prefix.insert(id);
next.prefix = &id[..=i]; next.prefix = &id[..=i];

View File

@@ -71,7 +71,7 @@ fn perform_round(map: &[Vec<char>], carts: &mut Vec<Cart>) {
.collect(); .collect();
for cart_index in 0..carts.len() { for cart_index in 0..carts.len() {
let mut cart = &mut carts[cart_index]; let cart = &mut carts[cart_index];
if !cart.active { if !cart.active {
continue; continue;
} }

138
src/tasks/day25.rs Normal file
View File

@@ -0,0 +1,138 @@
use std::collections::VecDeque;
use crate::utils;
pub fn task1() {
println!("{}", solve(&utils::read_file("input/day25.txt")));
}
fn solve(input: &str) -> u32 {
let mut points: Vec<STP> = input.lines().map(STP::from).collect();
let mut constellations = 0;
while let Some(next_origin) = points.pop() {
constellations += 1;
let mut queue = VecDeque::new();
queue.push_back(next_origin);
while let Some(next) = queue.pop_front() {
let (neighbors, remainder) = points.into_iter().partition(|p| next.is_neighbor_to(p));
points = remainder;
for n in neighbors {
queue.push_back(n);
}
}
}
constellations
}
#[derive(Hash, Eq, PartialEq, Debug)]
struct STP(i32, i32, i32, i32);
impl STP {}
impl STP {
fn neighbors(&self) -> Vec<Self> {
let mut result = Vec::new();
for x in -3..=3 {
for y in -3..=3 {
for z in -3..=3 {
for t in -3..=3 {
let candidate = STP(self.0 + x, self.1 + y, self.2 + z, self.3 + t);
if self.is_neighbor_to(&candidate) {
result.push(candidate);
}
}
}
}
}
result
}
fn distance(&self, other: &Self) -> u32 {
((self.0 - other.0).abs()
+ (self.1 - other.1).abs()
+ (self.2 - other.2).abs()
+ (self.3 - other.3).abs()) as u32
}
fn is_neighbor_to(&self, other: &Self) -> bool {
self.distance(other) <= 3
}
}
impl From<&str> for STP {
fn from(value: &str) -> Self {
let mut split = value.split(",");
STP(
split.next().unwrap().parse().unwrap(),
split.next().unwrap().parse().unwrap(),
split.next().unwrap().parse().unwrap(),
split.next().unwrap().parse().unwrap(),
)
}
}
mod test {
use crate::tasks::day25::solve;
#[test]
fn example1() {
let input = "0,0,0,0
3,0,0,0
0,3,0,0
0,0,3,0
0,0,0,3
0,0,0,6
9,0,0,0
12,0,0,0";
assert_eq!(solve(input), 2);
}
#[test]
fn example2() {
let input = "-1,2,2,0
0,0,2,-2
0,0,0,-2
-1,2,0,0
-2,-2,-2,2
3,0,2,-1
-1,3,2,2
-1,0,-1,0
0,2,1,-2
3,0,0,0";
assert_eq!(solve(input), 4);
}
#[test]
fn example3() {
let input = "1,-1,0,1
2,0,-1,0
3,2,-1,0
0,0,3,1
0,0,-1,-1
2,3,-2,0
-2,2,0,0
2,-2,0,-1
1,-1,0,-1
3,2,0,2
";
assert_eq!(solve(input), 3);
}
#[test]
fn example4() {
let input = "1,-1,-1,-2
-2,-2,0,1
0,2,1,3
-2,3,-2,1
0,2,3,-2
-1,-1,1,-2
0,-2,-1,0
-2,2,3,-1
1,2,2,0
-1,-2,0,-2
";
assert_eq!(solve(input), 8);
}
}

View File

@@ -19,3 +19,4 @@ pub mod day20;
pub mod day22; pub mod day22;
pub mod day23; pub mod day23;
pub mod day24; pub mod day24;
pub mod day25;