summaryrefslogtreecommitdiff
path: root/src/day18.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/day18.rs')
-rw-r--r--src/day18.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/day18.rs b/src/day18.rs
new file mode 100644
index 0000000..636b342
--- /dev/null
+++ b/src/day18.rs
@@ -0,0 +1,44 @@
+fn adjescent(p: &(usize,usize,usize)) -> Vec<(usize,usize,usize)> {
+ let mut v = vec![];
+ v.push((p.0+1,p.1,p.2));
+ v.push((p.0,p.1+1,p.2));
+ v.push((p.0,p.1,p.2+1));
+ if p.0 > 0 {
+ v.push((p.0-1,p.1,p.2));
+ }
+ if p.1 > 0 {
+ v.push((p.0,p.1-1,p.2));
+ }
+ if p.2 > 0 {
+ v.push((p.0,p.1,p.2-1));
+ }
+ v
+}
+
+pub fn run(input:String) {
+ let cubes = input.lines()
+ .map(|line| {
+ let res = line.split(",").map(|t| {t.parse::<usize>().unwrap()}).collect::<Vec<usize>>();
+ if res.len() != 3 {
+ panic!("malformatted line! {}", line);
+ }
+ (res[0], res[1], res[2])
+ }).collect::<Vec<(usize,usize,usize)>>();
+ let mx: usize = cubes.iter().map(|t| {vec![t.0, t.1, t.2]}).flatten().max().unwrap() + 3;
+ // Allocate a 3d space..
+ let mut grid: Vec<Vec<Vec<bool>>> = (0..mx).map(|_| {(0..mx).map(|_| {(0..mx).map(|_| {false}).collect()}).collect()}).collect();
+ for cube in cubes.iter() {
+ grid[cube.0][cube.1][cube.2] = true;
+ }
+ // Now count cubes. Each contributes 6,minus number of connections
+ let surface_area: usize = cubes.iter().map(|cube| {
+ let mut score = 6;
+ for p in adjescent(cube) {
+ if grid[p.0][p.1][p.2] {
+ score -= 1;
+ }
+ }
+ score
+ }).sum();
+ println!("Day 18: {}", surface_area);
+} \ No newline at end of file