@@ -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+
127163pub 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