Add day 14
This commit is contained in:
		| @@ -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"); | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user