|
| 1 | +use aoc::{common, grid::Grid, io}; |
| 2 | + |
| 3 | +fn solve<const PART: usize>(input: &str) -> usize { |
| 4 | + let mut ans = 0; |
| 5 | + |
| 6 | + let mut shape_lines = Vec::new(); |
| 7 | + let mut cases: Vec<(usize, usize, Vec<usize>)> = Vec::new(); |
| 8 | + for line in input.lines() { |
| 9 | + if line.is_empty() { |
| 10 | + continue; |
| 11 | + } |
| 12 | + if line.contains("x") { |
| 13 | + if let Some((dim, vals)) = line.split_once(": ") { |
| 14 | + let dims = io::tokenize_nums(dim, "x"); |
| 15 | + let values = io::tokenize_nums(vals, " "); |
| 16 | + cases.push((dims[0], dims[1], values)); |
| 17 | + } |
| 18 | + } else { |
| 19 | + shape_lines.push(line); |
| 20 | + } |
| 21 | + } |
| 22 | + |
| 23 | + let total_shapes = shape_lines.iter().filter(|l| l.contains(":")).count(); |
| 24 | + let mut shapes: Vec<Grid<char>> = vec![Grid::new(3, 3, '.'); total_shapes]; |
| 25 | + |
| 26 | + for i in 0..total_shapes { |
| 27 | + for r in 0..3 { |
| 28 | + shapes[i].set_row(r, shape_lines[4 * i + r + 1].chars().collect()); |
| 29 | + } |
| 30 | + } |
| 31 | + |
| 32 | + // LEt's figure out the clear YESes and clear NOs first.. |
| 33 | + // Clear yes : Can fit all 3x3 shapes |
| 34 | + // Clear no : Total space too little to fit even all solid spaces |
| 35 | + |
| 36 | + let solid_spaces: Vec<usize> = shapes.iter().map(|g| g.count(&'#')).collect(); |
| 37 | + |
| 38 | + for (d0, d1, number) in &cases { |
| 39 | + let x = d0 / 3; |
| 40 | + let y = d1 / 3; |
| 41 | + let n = number.iter().sum(); |
| 42 | + if x * y >= n { |
| 43 | + println!("Trivial YES"); |
| 44 | + ans += 1; |
| 45 | + continue; |
| 46 | + } |
| 47 | + |
| 48 | + let min_solid_spaces_required: usize = number |
| 49 | + .iter() |
| 50 | + .zip(solid_spaces.iter()) |
| 51 | + .map(|(x, y)| x * y) |
| 52 | + .sum(); |
| 53 | + |
| 54 | + if min_solid_spaces_required > d0 * d1 { |
| 55 | + println!("Trivial NO"); |
| 56 | + continue; |
| 57 | + } |
| 58 | + |
| 59 | + // Thanks for the input Eric! |
| 60 | + println!("Tough : {}x{} : {:?}", d0, d1, number); |
| 61 | + } |
| 62 | + |
| 63 | + ans |
| 64 | +} |
| 65 | + |
| 66 | +fn main() { |
| 67 | + if let Some(input) = common::get_input() { |
| 68 | + common::timed(&input, solve::<1>, true); |
| 69 | + } |
| 70 | +} |
0 commit comments