summaryrefslogtreecommitdiff
path: root/src/bin
diff options
context:
space:
mode:
authorReiner Herrmann <reiner@reiner-h.de>2022-12-21 15:13:36 +0100
committerReiner Herrmann <reiner@reiner-h.de>2022-12-21 15:13:36 +0100
commit6fd1fa3b36e0ded1e3a107a8540f96b1e5837887 (patch)
treede428f969a641416daf954bb7279c5a9580ec1a9 /src/bin
parentadbe5a7aab590ea66a642183513c28eb9beb2210 (diff)
day18 part1
Diffstat (limited to 'src/bin')
-rw-r--r--src/bin/day18.rs72
1 files changed, 72 insertions, 0 deletions
diff --git a/src/bin/day18.rs b/src/bin/day18.rs
new file mode 100644
index 0000000..87f2133
--- /dev/null
+++ b/src/bin/day18.rs
@@ -0,0 +1,72 @@
+static DAY: u8 = 18;
+
+fn main() {
+ let input = advent::read_lines(DAY);
+ println!("{DAY}a: {}", surface_area(&input));
+ println!("{DAY}b: {}", 0);
+}
+
+struct Cube {
+ x: i32,
+ y: i32,
+ z: i32,
+}
+
+impl Cube {
+ fn new(input: &str) -> Cube {
+ let mut coords = input.split(',');
+ let x = coords.next().unwrap().parse().unwrap();
+ let y = coords.next().unwrap().parse().unwrap();
+ let z = coords.next().unwrap().parse().unwrap();
+ Cube { x, y, z }
+ }
+
+ fn unconnected_surfaces(&self, cubes: &[Cube]) -> usize {
+ let neighbors = [
+ (self.x + 1, self.y, self.z),
+ (self.x - 1, self.y, self.z),
+ (self.x, self.y + 1, self.z),
+ (self.x, self.y - 1, self.z),
+ (self.x, self.y, self.z + 1),
+ (self.x, self.y, self.z - 1),
+ ];
+ 6 - cubes.iter()
+ .filter(|c| neighbors.contains(&(c.x, c.y, c.z)))
+ .count()
+ }
+}
+
+fn surface_area(input: &[String]) -> usize {
+ let cubes = input.iter()
+ .map(|x| Cube::new(x))
+ .collect::<Vec<_>>();
+ cubes.iter()
+ .map(|c| c.unconnected_surfaces(&cubes))
+ .sum()
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test() {
+ let input = [
+ "2,2,2",
+ "1,2,2",
+ "3,2,2",
+ "2,1,2",
+ "2,3,2",
+ "2,2,1",
+ "2,2,3",
+ "2,2,4",
+ "2,2,6",
+ "1,2,5",
+ "3,2,5",
+ "2,1,5",
+ "2,3,5",
+ ].iter().map(|&x| String::from(x)).collect::<Vec<_>>();
+
+ assert_eq!(surface_area(&input), 64);
+ }
+}