-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.rs
98 lines (85 loc) · 2.32 KB
/
main.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use std::fs::File;
use std::io::{self, BufRead};
const WIDTH: usize = 25;
const HEIGHT: usize = 6;
struct Layer {
pixel: [[u8; WIDTH]; HEIGHT],
}
fn load() -> Vec<Layer> {
let file = File::open("input").unwrap();
let line = io::BufReader::new(file).lines().next().expect("line").unwrap();
let bytes = line.as_bytes();
assert_eq!(bytes.len() % (WIDTH * HEIGHT), 0);
let num_layers = bytes.len() / (WIDTH * HEIGHT);
let mut layers: Vec<Layer> = Vec::new();
let mut index: usize = 0;
for _ in 0 .. num_layers {
let mut layer = Layer {
pixel: [[0; WIDTH]; HEIGHT],
};
for y in 0 .. HEIGHT {
for x in 0 .. WIDTH {
layer.pixel[y][x] = bytes[index];
index += 1;
}
}
layers.push(layer);
}
assert_eq!(index, bytes.len());
return layers;
}
fn part1() {
let layers = load();
let mut result: usize = 0;
let mut least_zeroes: usize = usize::MAX;
for layer in layers {
let mut zeroes: usize = 0;
let mut ones: usize = 0;
let mut twos: usize = 0;
for y in 0 .. HEIGHT {
for x in 0 .. WIDTH {
match layer.pixel[y][x] {
b'0' => zeroes += 1,
b'1' => ones += 1,
b'2' => twos += 1,
_ => {},
}
}
}
if zeroes < least_zeroes {
least_zeroes = zeroes;
result = ones * twos;
}
}
println!("{}", result);
}
fn part2() {
let mut layers = load();
let mut combined = Layer {
pixel: [[0; WIDTH]; HEIGHT],
};
layers.reverse();
for layer in layers {
for y in 0 .. HEIGHT {
for x in 0 .. WIDTH {
match layer.pixel[y][x] {
b'0' | b'1' => combined.pixel[y][x] = layer.pixel[y][x],
_ => {},
}
}
}
}
for y in 0 .. HEIGHT {
for x in 0 .. WIDTH {
print!("{}", match combined.pixel[y][x] {
b'1' => '#',
_ => ' ',
});
}
println!();
}
}
fn main() {
part1();
part2();
}