Add day 14
This commit is contained in:
parent
3d507bbda4
commit
f951932c2c
@ -61,4 +61,8 @@ path = "src/day12/main.rs"
|
||||
name = "day13"
|
||||
path = "src/day13/main.rs"
|
||||
|
||||
[[bin]]
|
||||
name = "day14"
|
||||
path = "src/day14/main.rs"
|
||||
|
||||
[dependencies]
|
||||
|
129
day14.txt
Normal file
129
day14.txt
Normal file
@ -0,0 +1,129 @@
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
484,41 -> 484,42 -> 495,42 -> 495,41
|
||||
494,51 -> 498,51
|
||||
470,158 -> 475,158
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
458,171 -> 462,171
|
||||
473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
|
||||
492,162 -> 497,162
|
||||
494,27 -> 498,27
|
||||
471,162 -> 476,162
|
||||
480,156 -> 485,156
|
||||
498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
461,165 -> 465,165
|
||||
477,70 -> 487,70 -> 487,69
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
|
||||
462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
482,37 -> 488,37 -> 488,36
|
||||
473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
464,162 -> 469,162
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
473,173 -> 477,173
|
||||
462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
|
||||
498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
|
||||
464,167 -> 468,167
|
||||
468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
476,154 -> 481,154
|
||||
461,173 -> 465,173
|
||||
468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
|
||||
494,33 -> 498,33
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
477,70 -> 487,70 -> 487,69
|
||||
473,156 -> 478,156
|
||||
455,173 -> 459,173
|
||||
478,162 -> 483,162
|
||||
462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
467,173 -> 471,173
|
||||
498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
484,41 -> 484,42 -> 495,42 -> 495,41
|
||||
497,30 -> 501,30
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
|
||||
498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
|
||||
468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
|
||||
485,162 -> 490,162
|
||||
482,37 -> 488,37 -> 488,36
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
491,30 -> 495,30
|
||||
468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
|
||||
467,169 -> 471,169
|
||||
452,171 -> 456,171
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
464,171 -> 468,171
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
484,41 -> 484,42 -> 495,42 -> 495,41
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
|
||||
474,160 -> 479,160
|
||||
500,51 -> 504,51
|
||||
494,45 -> 498,45
|
||||
461,169 -> 465,169
|
||||
468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
|
||||
488,51 -> 492,51
|
||||
458,167 -> 462,167
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
|
||||
498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
466,137 -> 466,138 -> 484,138
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
|
||||
468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
|
||||
468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
|
||||
498,13 -> 498,17 -> 497,17 -> 497,24 -> 505,24 -> 505,17 -> 502,17 -> 502,13
|
||||
467,160 -> 472,160
|
||||
468,107 -> 468,100 -> 468,107 -> 470,107 -> 470,104 -> 470,107 -> 472,107 -> 472,97 -> 472,107
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
481,160 -> 486,160
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
497,48 -> 501,48
|
||||
491,48 -> 495,48
|
||||
455,169 -> 459,169
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
500,33 -> 504,33
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
449,173 -> 453,173
|
||||
473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
470,171 -> 474,171
|
||||
477,158 -> 482,158
|
||||
468,123 -> 468,127 -> 460,127 -> 460,132 -> 474,132 -> 474,127 -> 473,127 -> 473,123
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
462,120 -> 462,112 -> 462,120 -> 464,120 -> 464,114 -> 464,120 -> 466,120 -> 466,119 -> 466,120 -> 468,120 -> 468,118 -> 468,120 -> 470,120 -> 470,119 -> 470,120
|
||||
473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
473,73 -> 473,77 -> 466,77 -> 466,82 -> 485,82 -> 485,77 -> 477,77 -> 477,73
|
||||
466,137 -> 466,138 -> 484,138
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
484,158 -> 489,158
|
||||
462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
|
||||
462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
|
||||
488,33 -> 492,33
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
|
||||
480,151 -> 480,145 -> 480,151 -> 482,151 -> 482,150 -> 482,151 -> 484,151 -> 484,144 -> 484,151 -> 486,151 -> 486,148 -> 486,151 -> 488,151 -> 488,142 -> 488,151
|
||||
482,64 -> 482,59 -> 482,64 -> 484,64 -> 484,55 -> 484,64 -> 486,64 -> 486,58 -> 486,64 -> 488,64 -> 488,54 -> 488,64 -> 490,64 -> 490,55 -> 490,64
|
||||
488,160 -> 493,160
|
||||
462,85 -> 462,88 -> 454,88 -> 454,94 -> 470,94 -> 470,88 -> 466,88 -> 466,85
|
2
day14_test.txt
Normal file
2
day14_test.txt
Normal file
@ -0,0 +1,2 @@
|
||||
498,4 -> 498,6 -> 496,6
|
||||
503,4 -> 502,4 -> 502,9 -> 494,9
|
101
src/day14/main.rs
Normal file
101
src/day14/main.rs
Normal file
@ -0,0 +1,101 @@
|
||||
use std::collections::HashSet;
|
||||
use base::read_file;
|
||||
|
||||
#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)]
|
||||
struct Pos(i32, i32);
|
||||
|
||||
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
||||
struct Line(Pos, Pos);
|
||||
|
||||
impl Line {
|
||||
fn contains(&self, p: &Pos) -> bool {
|
||||
let Pos(x1, y1) = self.0;
|
||||
let Pos(x2, y2) = self.1;
|
||||
let x_max = x1.max(x2);
|
||||
let x_min = x1.min(x2);
|
||||
let y_max = y1.max(y2);
|
||||
let y_min = y1.min(y2);
|
||||
return if x1 == x2 {
|
||||
let y_range = y_min..=y_max;
|
||||
p.0 == x1 && y_range.contains(&p.1)
|
||||
} else if y1 == y2 {
|
||||
let x_range = x_min..=x_max;
|
||||
x_range.contains(&p.0) && p.1 == y1
|
||||
} else {
|
||||
false
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
impl Pos {
|
||||
fn can_move_to(&self, relative: &Pos, lines: &Vec<Line>, others: &HashSet<Pos>) -> bool {
|
||||
let relative = Pos(self.0 + relative.0, self.1 + relative.1);
|
||||
for line in lines {
|
||||
if line.contains(&relative) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
!others.contains(&relative)
|
||||
}
|
||||
}
|
||||
|
||||
fn do_simulation(rock_lines: &Vec<Line>, max_height: i32) -> u32 {
|
||||
let mut spawns = 0;
|
||||
let mut sands = HashSet::new();
|
||||
let sand_spawn = Pos(500, 0);
|
||||
let mut sand = sand_spawn;
|
||||
|
||||
|
||||
loop {
|
||||
if sand.can_move_to(&Pos(0, 1), &rock_lines, &sands) {
|
||||
sand = Pos(sand.0, sand.1 + 1);
|
||||
} else if sand.can_move_to(&Pos(-1, 1), &rock_lines, &sands) {
|
||||
sand = Pos(sand.0 - 1, sand.1 + 1);
|
||||
} else if sand.can_move_to(&Pos(1, 1), &rock_lines, &sands) {
|
||||
sand = Pos(sand.0 + 1, sand.1 + 1);
|
||||
} else {
|
||||
if sand == sand_spawn {
|
||||
spawns += 1;
|
||||
break;
|
||||
}
|
||||
sands.insert(sand);
|
||||
sand = sand_spawn;
|
||||
spawns += 1;
|
||||
}
|
||||
|
||||
if sand.1 == max_height {
|
||||
println!("Sand reached void");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
spawns
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let lines = read_file("day14.txt");
|
||||
let mut rock_lines = vec![];
|
||||
|
||||
for x in lines {
|
||||
x.split_whitespace().filter(|s| !(s == &"->")).map(|s| {
|
||||
let mut split = s.split(',');
|
||||
let x = split.next().unwrap().parse().unwrap();
|
||||
let y = split.next().unwrap().parse().unwrap();
|
||||
Pos(x, y)
|
||||
}).collect::<Vec<_>>().windows(2).map(|pos| Line(pos[0], pos[1])).collect::<Vec<_>>().iter().for_each(|line| rock_lines.push(*line));
|
||||
}
|
||||
|
||||
|
||||
let max_height = rock_lines.iter().flat_map(|line| [line.0.1, line.1.1]).max().unwrap() + 1;
|
||||
println!("Everything above {max_height} is void");
|
||||
|
||||
let task1 = do_simulation(&rock_lines, max_height);
|
||||
println!("Task1: Got {task1} spawns");
|
||||
|
||||
rock_lines.push(Line(Pos(i32::MIN, max_height + 1), Pos(i32::MAX, max_height + 1)));
|
||||
|
||||
let task2 = do_simulation(&rock_lines, i32::MAX);
|
||||
println!("Task2: Got {task2} spawns");
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user