Skip to content

Commit f992710

Browse files
committed
Part 2 solved (Although it takes for ever...)
1 parent 285b85f commit f992710

File tree

1 file changed

+50
-13
lines changed

1 file changed

+50
-13
lines changed

src/day_15.rs

Lines changed: 50 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ struct Range {
3838
// ....x...x......
3939
// .....x.x.......
4040
// ......x........
41-
fn get_x_range(scan: &Scan, inspect_y: i32) -> Option<Range> {
41+
fn get_x_range(scan: &Scan, inspect_y: i32, without_beacons: bool) -> Option<Range> {
4242
let distance = (scan.beacon.x - scan.sensor.x).abs() + (scan.beacon.y - scan.sensor.y).abs();
4343
if inspect_y > scan.sensor.y + distance || inspect_y < scan.sensor.y - distance {
4444
return None
@@ -47,18 +47,20 @@ fn get_x_range(scan: &Scan, inspect_y: i32) -> Option<Range> {
4747
let delta = (scan.sensor.y - inspect_y).abs();
4848
let mut start = scan.sensor.x - distance + delta;
4949
let mut end = scan.sensor.x + distance - delta;
50-
if inspect_y == scan.beacon.y {
51-
if scan.beacon.x == scan.sensor.x {
52-
53-
} else if scan.beacon.x <= scan.sensor.x {
54-
start += 1;
55-
} else {
56-
end -= 1;
50+
if without_beacons {
51+
if inspect_y == scan.beacon.y {
52+
if scan.beacon.x == scan.sensor.x {
53+
54+
} else if scan.beacon.x <= scan.sensor.x {
55+
start += 1;
56+
} else {
57+
end -= 1;
58+
}
5759
}
5860
}
59-
if start == end {
60-
return None
61-
}
61+
// if start == end {
62+
// return None
63+
// }
6264
return Some(Range {
6365
start,
6466
end,
@@ -85,7 +87,7 @@ fn part1(scans: &Vec<Scan>, inspect_y: i32) {
8587
let mut min_range_opt = None;
8688
let mut min_x = i32::MAX;
8789
for scan in scans {
88-
let range_opt = get_x_range(scan, inspect_y);
90+
let range_opt = get_x_range(scan, inspect_y, true);
8991
if range_opt.is_some() {
9092
let range = range_opt.unwrap();
9193
ranges.push(range);
@@ -124,6 +126,40 @@ fn part1(scans: &Vec<Scan>, inspect_y: i32) {
124126
println!("Part 1: {}", count);
125127
}
126128

129+
fn part2(scans: &Vec<Scan>, inspect_max: i32) {
130+
for y in 0..=inspect_max {
131+
let ranges: Vec<Range> = scans.iter()
132+
.map(|&scan| { get_x_range(&scan, y, false) })
133+
.filter(|x| x.is_some())
134+
.map(|range| { range.unwrap() })
135+
.collect();
136+
137+
// println!("{:?}", ranges);
138+
139+
let mut cursor = 0;
140+
let mut cursor_range: Option<Range> = None;
141+
while cursor <= inspect_max {
142+
let next_range = get_next_range(&ranges, cursor);
143+
//println!("{:?}, {:?}", cursor_range, next_range);
144+
if next_range.is_some() {
145+
if cursor_range.is_none() || next_range.unwrap().start <= cursor_range.unwrap().end + 1 {
146+
cursor = next_range.unwrap().end + 1;
147+
cursor_range = next_range;
148+
continue
149+
} else {
150+
break;
151+
}
152+
}
153+
}
154+
if cursor < inspect_max {
155+
println!("Part 2: {}", (inspect_max as usize) * (cursor as usize) + (y as usize));
156+
break;
157+
} else {
158+
// println!("Part 2: None{}\n\n\n", y);
159+
}
160+
}
161+
}
162+
127163
pub fn run() {
128164
let mut input = input_reader::read_file_in_cwd("src/day_15.data");
129165
input = input
@@ -146,7 +182,8 @@ pub fn run() {
146182
}
147183
};
148184
}).collect();
149-
150185
part1(&scans, 2000000);
186+
part2(&scans, 4000000);
151187
// part1(&scans, 10);
188+
// part2(&scans, 20);
152189
}

0 commit comments

Comments
 (0)