Filter out the worst repetition

This commit is contained in:
2021-12-19 18:38:30 +01:00
parent d56f4ae8f8
commit 944d3e644a

View File

@@ -152,12 +152,13 @@ fn try_overlap(
None None
} }
pub fn part1(input: &mut dyn Read) -> String { fn parts_common(input: &mut dyn Read) -> (HashSet<Point3>, Vec<Point3>) {
let mut scanners = read_input(input, parse_input); let mut scanners = read_input(input, parse_input);
let mut points: HashSet<_> = scanners[0].iter().copied().collect(); let mut points: HashSet<_> = scanners[0].iter().copied().collect();
let mut todo = vec![std::mem::take(&mut scanners[0])]; let mut todo = vec![std::mem::take(&mut scanners[0])];
let mut scanners_found = vec![Point3::default()];
while let Some(matched) = todo.pop() { while let Some(matched) = todo.pop() {
if scanners.iter().all(Vec::is_empty) { if scanners.iter().all(Vec::is_empty) {
@@ -174,7 +175,8 @@ pub fn part1(input: &mut dyn Read) -> String {
continue; continue;
} }
if let Some((_, result)) = try_overlap(&relative, candidate) { if let Some((scanner, result)) = try_overlap(&relative, candidate) {
scanners_found.push(scanner);
points.extend(result.iter().copied()); points.extend(result.iter().copied());
todo.push(result); todo.push(result);
candidate.clear(); candidate.clear();
@@ -182,43 +184,21 @@ pub fn part1(input: &mut dyn Read) -> String {
} }
} }
(points, scanners_found)
}
pub fn part1(input: &mut dyn Read) -> String {
let (points, _) = parts_common(input);
points.len().to_string() points.len().to_string()
} }
pub fn part2(input: &mut dyn Read) -> String { pub fn part2(input: &mut dyn Read) -> String {
let mut scanners = read_input(input, parse_input); let (_, scanners) = parts_common(input);
let mut found_scanners = vec![Point3::default()]; scanners
let mut todo = vec![std::mem::take(&mut scanners[0])];
while let Some(matched) = todo.pop() {
if scanners.iter().all(Vec::is_empty) {
break;
}
let relative: Vec<(Point3, HashSet<Point3>)> = matched
.iter()
.map(|&base| (base, matched.iter().map(|&other| (other - base)).collect()))
.collect();
for candidate in &mut scanners {
if candidate.is_empty() {
continue;
}
if let Some((new_offset, result)) = try_overlap(&relative, candidate) {
todo.push(result);
candidate.clear();
found_scanners.push(new_offset);
}
}
}
found_scanners
.iter() .iter()
.flat_map(|&first| { .flat_map(|&first| {
found_scanners scanners
.iter() .iter()
.map(move |&second| (first - second).manhattan()) .map(move |&second| (first - second).manhattan())
}) })