day 8
							parent
							
								
									3b88057214
								
							
						
					
					
						commit
						474ad0a248
					
				| @ -0,0 +1,7 @@ | |||||||
|  | # This file is automatically @generated by Cargo. | ||||||
|  | # It is not intended for manual editing. | ||||||
|  | version = 3 | ||||||
|  | 
 | ||||||
|  | [[package]] | ||||||
|  | name = "day08" | ||||||
|  | version = "0.1.0" | ||||||
| @ -0,0 +1,8 @@ | |||||||
|  | [package] | ||||||
|  | name = "day08" | ||||||
|  | version = "0.1.0" | ||||||
|  | edition = "2021" | ||||||
|  | 
 | ||||||
|  | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html | ||||||
|  | 
 | ||||||
|  | [dependencies] | ||||||
| @ -0,0 +1,83 @@ | |||||||
|  | fn main() { | ||||||
|  |     let f = std::fs::read_to_string("/dev/stdin").unwrap(); | ||||||
|  |     let rows = f | ||||||
|  |         .lines() | ||||||
|  |         .map(|c| { | ||||||
|  |             c.chars() | ||||||
|  |                 .map(|c| c.to_digit(10).unwrap() as usize) | ||||||
|  |                 .collect::<Vec<usize>>() | ||||||
|  |         }) | ||||||
|  |         .collect::<Vec<Vec<usize>>>(); | ||||||
|  | 
 | ||||||
|  |     let mut cols: Vec<Vec<usize>> = Vec::new(); | ||||||
|  |     for i in 0..rows.len() { | ||||||
|  |         let mut col = Vec::new(); | ||||||
|  |         for j in 0..rows.len() { | ||||||
|  |             col.push(*rows.get(j).unwrap().get(i).unwrap()); | ||||||
|  |         } | ||||||
|  |         cols.push(col); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     let mut total_visible = 0; | ||||||
|  |     let mut scenic_score = 0; | ||||||
|  | 
 | ||||||
|  |     for (row_num, row) in rows.iter().enumerate() { | ||||||
|  |         if row_num == 0 { | ||||||
|  |             total_visible += (row.len() - 1) * 4; // perimeter
 | ||||||
|  |             continue; | ||||||
|  |         } | ||||||
|  |         if row_num == rows.len() - 1 { | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         for (col_num, col) in row.get(0..row.len() - 1).unwrap().iter().enumerate() { | ||||||
|  |             if col_num == 0 { | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|  |             let before_row = row.get(0..col_num).unwrap(); | ||||||
|  |             let after_row = row.get(col_num + 1..).unwrap(); | ||||||
|  |             let this_col = cols.get(col_num).unwrap(); | ||||||
|  |             let before_col = this_col.get(0..row_num).unwrap(); | ||||||
|  |             let after_col = this_col.get(row_num + 1..).unwrap(); | ||||||
|  | 
 | ||||||
|  |             let visible_before = get_viewing_distance(*col, before_row, true); | ||||||
|  |             let visible_after = get_viewing_distance(*col, after_row, false); | ||||||
|  |             let visible_above = get_viewing_distance(*col, before_col, true); | ||||||
|  |             let visible_below = get_viewing_distance(*col, after_col, false); | ||||||
|  |             let score = visible_before * visible_after * visible_above * visible_below; | ||||||
|  |             if score > scenic_score { | ||||||
|  |                 scenic_score = score; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if before_row.iter().filter(|t| t >= &col).count() == 0 | ||||||
|  |                 || after_row.iter().filter(|t| t >= &col).count() == 0 | ||||||
|  |                 || before_col.iter().filter(|t| t >= &col).count() == 0 | ||||||
|  |                 || after_col.iter().filter(|t| t >= &col).count() == 0 | ||||||
|  |             { | ||||||
|  |                 total_visible += 1; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     println!("{}, {}", total_visible, scenic_score); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | fn get_viewing_distance(height: usize, view: &[usize], reverse_order: bool) -> usize { | ||||||
|  |     let mut visible = 0; | ||||||
|  |     if reverse_order { | ||||||
|  |         for tree in view.iter().rev() { | ||||||
|  |             visible += 1; | ||||||
|  |             if tree >= &height { | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } else { | ||||||
|  |         for tree in view { | ||||||
|  |             visible += 1; | ||||||
|  |             if tree >= &height { | ||||||
|  |                 break; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     visible | ||||||
|  | } | ||||||
| @ -0,0 +1,5 @@ | |||||||
|  | 30373 | ||||||
|  | 25512 | ||||||
|  | 65332 | ||||||
|  | 33549 | ||||||
|  | 35390 | ||||||
					Loading…
					
					
				
		Reference in New Issue