use std::io::Read; fn main() { let mut input = String::new(); std::io::stdin().read_to_string(&mut input).unwrap(); let input = parse_input(&input); part1(&input); } fn part1(input: &Input) { let mut out = 0; for &(a, b, c, d, e) in &input.keys { for a in 0..(6 - a) { for b in 0..(6 - b) { for c in 0..(6 - c) { for d in 0..(6 - d) { for e in 0..(6 - e) { if input.locks[a][b][c][d][e] { out += 1; } } } } } } } eprintln!("{out}"); } #[derive(Default, Debug)] struct Input { keys: Vec<(usize, usize, usize, usize, usize)>, locks: [[[[[bool; 7]; 7]; 7]; 7]; 7], } #[allow(clippy::many_single_char_names)] fn parse_input(s: &str) -> Input { let mut input = Input::default(); for combo in s.split("\n\n") { let matrix = combo .split('\n') .map(|v| v.chars().collect::>()) .collect::>(); let count_for = |col| (0..7).filter(|&y| matrix[y][col] == '#').count() - 1; let a = count_for(0); let b = count_for(1); let c = count_for(2); let d = count_for(3); let e = count_for(4); if matrix[0].contains(&'#') { input.locks[a][b][c][d][e] = true; } else { input.keys.push((a, b, c, d, e)); } } input }