1use crate::util::iter::*;
14use crate::util::parse::*;
15
16type Vent = [u32; 4];
17
18pub fn parse(input: &str) -> [usize; 2] {
19 let all: Vec<_> = input.iter_unsigned().chunk::<4>().collect();
20 let (orthogonal, diagonal): (Vec<_>, Vec<_>) =
21 all.iter().partition(|[x1, y1, x2, y2]| x1 == x2 || y1 == y2);
22
23 let mut grid = vec![0_u8; 1_000_000];
24 let first = vents(&orthogonal, &mut grid);
25 let second = vents(&diagonal, &mut grid);
26
27 [first, second]
28}
29
30pub fn part1(input: &[usize]) -> usize {
31 input[0]
32}
33
34pub fn part2(input: &[usize]) -> usize {
35 input[0] + input[1]
36}
37
38fn vents(input: &[Vent], grid: &mut [u8]) -> usize {
39 let mut result = 0;
40
41 for &[x1, y1, x2, y2] in input {
42 let (x1, y1, x2, y2) = (x1 as i32, y1 as i32, x2 as i32, y2 as i32);
43 let count = (y2 - y1).abs().max((x2 - x1).abs());
44 let delta = (y2 - y1).signum() * 1000 + (x2 - x1).signum();
45 let mut index = y1 * 1000 + x1;
46
47 for _ in 0..=count {
48 if grid[index as usize] == 1 {
49 result += 1;
50 }
51 grid[index as usize] += 1;
52 index += delta;
53 }
54 }
55
56 result
57}