summaryrefslogtreecommitdiff
path: root/2018/src/bin/day_25.rs
diff options
context:
space:
mode:
Diffstat (limited to '2018/src/bin/day_25.rs')
-rw-r--r--2018/src/bin/day_25.rs47
1 files changed, 47 insertions, 0 deletions
diff --git a/2018/src/bin/day_25.rs b/2018/src/bin/day_25.rs
new file mode 100644
index 0000000..9e74f49
--- /dev/null
+++ b/2018/src/bin/day_25.rs
@@ -0,0 +1,47 @@
+extern crate advent_of_code_2018;
+use advent_of_code_2018::*;
+
+use std::error::Error;
+use std::path::PathBuf;
+
+// cargo watch -cs "cargo run --release --bin day_25"
+
+fn main() -> Result<(), Box<Error>> {
+ let input = read_file(&PathBuf::from("inputs/25.txt"))?;
+
+ let mut constellations: Vec<Vec<Vec<i32>>> = input.iter()
+ .map(|line| line.split(',').map(|x| x.parse().unwrap()).collect::<Vec<_>>())
+ .map(|points| vec!(points))
+ .collect();
+
+ // debug!(constellations);
+
+ while join_constellations(&mut constellations) {
+ }
+
+ debug!(constellations.len());
+
+ Ok(())
+}
+
+fn distance(xs: &[i32], ys: &[i32]) -> i32 {
+ xs.iter().zip(ys.iter()).map(|(x,y)| (x - y).abs()).sum()
+}
+
+fn join_constellations(constellations: &mut Vec<Vec<Vec<i32>>>) -> bool {
+ for i in 0..constellations.len()-1 {
+ for j in i+1..constellations.len() {
+ let connected = constellations[i].iter().any(|ci| {
+ constellations[j].iter().any(|cj| {
+ distance(&ci, &cj) <= 3
+ })
+ });
+ if connected {
+ let mut to_join = constellations.remove(j);
+ constellations[i].append(&mut to_join);
+ return true;
+ }
+ }
+ }
+ false
+}