Day 14
This commit is contained in:
		
							parent
							
								
									9ba195d0e3
								
							
						
					
					
						commit
						99988afbe7
					
				
							
								
								
									
										118
									
								
								14/input
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								14/input
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,118 @@
 | 
				
			|||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
 | 
					454,118 -> 454,122 -> 451,122 -> 451,126 -> 464,126 -> 464,122 -> 458,122 -> 458,118
 | 
				
			||||||
 | 
					440,135 -> 440,136 -> 453,136 -> 453,135
 | 
				
			||||||
 | 
					498,21 -> 502,21
 | 
				
			||||||
 | 
					469,69 -> 473,69
 | 
				
			||||||
 | 
					440,135 -> 440,136 -> 453,136 -> 453,135
 | 
				
			||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					455,72 -> 455,76 -> 452,76 -> 452,81 -> 464,81 -> 464,76 -> 459,76 -> 459,72
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					489,19 -> 493,19
 | 
				
			||||||
 | 
					469,65 -> 473,65
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					449,84 -> 453,84
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					438,158 -> 442,158
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					443,88 -> 447,88
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					470,50 -> 470,52 -> 469,52 -> 469,60 -> 478,60 -> 478,52 -> 474,52 -> 474,50
 | 
				
			||||||
 | 
					445,131 -> 454,131 -> 454,130
 | 
				
			||||||
 | 
					454,118 -> 454,122 -> 451,122 -> 451,126 -> 464,126 -> 464,122 -> 458,122 -> 458,118
 | 
				
			||||||
 | 
					454,118 -> 454,122 -> 451,122 -> 451,126 -> 464,126 -> 464,122 -> 458,122 -> 458,118
 | 
				
			||||||
 | 
					446,86 -> 450,86
 | 
				
			||||||
 | 
					463,65 -> 467,65
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					435,155 -> 439,155
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					457,69 -> 461,69
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					455,72 -> 455,76 -> 452,76 -> 452,81 -> 464,81 -> 464,76 -> 459,76 -> 459,72
 | 
				
			||||||
 | 
					495,19 -> 499,19
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					440,135 -> 440,136 -> 453,136 -> 453,135
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
 | 
					455,72 -> 455,76 -> 452,76 -> 452,81 -> 464,81 -> 464,76 -> 459,76 -> 459,72
 | 
				
			||||||
 | 
					454,118 -> 454,122 -> 451,122 -> 451,126 -> 464,126 -> 464,122 -> 458,122 -> 458,118
 | 
				
			||||||
 | 
					470,50 -> 470,52 -> 469,52 -> 469,60 -> 478,60 -> 478,52 -> 474,52 -> 474,50
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					455,72 -> 455,76 -> 452,76 -> 452,81 -> 464,81 -> 464,76 -> 459,76 -> 459,72
 | 
				
			||||||
 | 
					472,67 -> 476,67
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					470,50 -> 470,52 -> 469,52 -> 469,60 -> 478,60 -> 478,52 -> 474,52 -> 474,50
 | 
				
			||||||
 | 
					439,91 -> 439,94 -> 435,94 -> 435,98 -> 444,98 -> 444,94 -> 443,94 -> 443,91
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					495,14 -> 506,14 -> 506,13
 | 
				
			||||||
 | 
					429,155 -> 433,155
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					470,50 -> 470,52 -> 469,52 -> 469,60 -> 478,60 -> 478,52 -> 474,52 -> 474,50
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					455,72 -> 455,76 -> 452,76 -> 452,81 -> 464,81 -> 464,76 -> 459,76 -> 459,72
 | 
				
			||||||
 | 
					439,91 -> 439,94 -> 435,94 -> 435,98 -> 444,98 -> 444,94 -> 443,94 -> 443,91
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
 | 
					445,131 -> 454,131 -> 454,130
 | 
				
			||||||
 | 
					452,86 -> 456,86
 | 
				
			||||||
 | 
					455,88 -> 459,88
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					441,114 -> 441,115 -> 455,115
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					460,67 -> 464,67
 | 
				
			||||||
 | 
					470,50 -> 470,52 -> 469,52 -> 469,60 -> 478,60 -> 478,52 -> 474,52 -> 474,50
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					492,21 -> 496,21
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					439,91 -> 439,94 -> 435,94 -> 435,98 -> 444,98 -> 444,94 -> 443,94 -> 443,91
 | 
				
			||||||
 | 
					470,50 -> 470,52 -> 469,52 -> 469,60 -> 478,60 -> 478,52 -> 474,52 -> 474,50
 | 
				
			||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					492,17 -> 496,17
 | 
				
			||||||
 | 
					455,72 -> 455,76 -> 452,76 -> 452,81 -> 464,81 -> 464,76 -> 459,76 -> 459,72
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					454,118 -> 454,122 -> 451,122 -> 451,126 -> 464,126 -> 464,122 -> 458,122 -> 458,118
 | 
				
			||||||
 | 
					466,67 -> 470,67
 | 
				
			||||||
 | 
					470,50 -> 470,52 -> 469,52 -> 469,60 -> 478,60 -> 478,52 -> 474,52 -> 474,50
 | 
				
			||||||
 | 
					466,63 -> 470,63
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					486,21 -> 490,21
 | 
				
			||||||
 | 
					455,72 -> 455,76 -> 452,76 -> 452,81 -> 464,81 -> 464,76 -> 459,76 -> 459,72
 | 
				
			||||||
 | 
					439,91 -> 439,94 -> 435,94 -> 435,98 -> 444,98 -> 444,94 -> 443,94 -> 443,91
 | 
				
			||||||
 | 
					481,34 -> 481,32 -> 481,34 -> 483,34 -> 483,27 -> 483,34 -> 485,34 -> 485,32 -> 485,34 -> 487,34 -> 487,26 -> 487,34
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
 | 
					426,158 -> 430,158
 | 
				
			||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
 | 
					441,114 -> 441,115 -> 455,115
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					475,69 -> 479,69
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					454,118 -> 454,122 -> 451,122 -> 451,126 -> 464,126 -> 464,122 -> 458,122 -> 458,118
 | 
				
			||||||
 | 
					463,69 -> 467,69
 | 
				
			||||||
 | 
					432,158 -> 436,158
 | 
				
			||||||
 | 
					439,91 -> 439,94 -> 435,94 -> 435,98 -> 444,98 -> 444,94 -> 443,94 -> 443,91
 | 
				
			||||||
 | 
					454,118 -> 454,122 -> 451,122 -> 451,126 -> 464,126 -> 464,122 -> 458,122 -> 458,118
 | 
				
			||||||
 | 
					439,91 -> 439,94 -> 435,94 -> 435,98 -> 444,98 -> 444,94 -> 443,94 -> 443,91
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					432,152 -> 436,152
 | 
				
			||||||
 | 
					439,91 -> 439,94 -> 435,94 -> 435,98 -> 444,98 -> 444,94 -> 443,94 -> 443,91
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					473,47 -> 473,42 -> 473,47 -> 475,47 -> 475,45 -> 475,47 -> 477,47 -> 477,39 -> 477,47 -> 479,47 -> 479,45 -> 479,47 -> 481,47 -> 481,42 -> 481,47 -> 483,47 -> 483,46 -> 483,47 -> 485,47 -> 485,39 -> 485,47
 | 
				
			||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
 | 
					495,14 -> 506,14 -> 506,13
 | 
				
			||||||
 | 
					435,149 -> 435,148 -> 435,149 -> 437,149 -> 437,146 -> 437,149 -> 439,149 -> 439,146 -> 439,149 -> 441,149 -> 441,145 -> 441,149
 | 
				
			||||||
 | 
					449,88 -> 453,88
 | 
				
			||||||
 | 
					441,111 -> 441,105 -> 441,111 -> 443,111 -> 443,104 -> 443,111 -> 445,111 -> 445,106 -> 445,111 -> 447,111 -> 447,104 -> 447,111
 | 
				
			||||||
							
								
								
									
										171
									
								
								14/solution.mjs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										171
									
								
								14/solution.mjs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,171 @@
 | 
				
			|||||||
 | 
					import { readFileSync } from 'node:fs';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const input = readFileSync('input', 'utf-8');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function inclusiveRange(from, to) {
 | 
				
			||||||
 | 
					  const difference = to - from;
 | 
				
			||||||
 | 
					  const distance = Math.abs(difference);
 | 
				
			||||||
 | 
					  const add = difference / (distance || 1);
 | 
				
			||||||
 | 
					  return new Array(distance + 1).fill().map((_, i) => from + i * add)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const rockCoords = input
 | 
				
			||||||
 | 
					  .split('\n')
 | 
				
			||||||
 | 
					  .filter(Boolean)
 | 
				
			||||||
 | 
					  .flatMap(path => path
 | 
				
			||||||
 | 
					    .split(' -> ')
 | 
				
			||||||
 | 
					    .map(coordinates => coordinates
 | 
				
			||||||
 | 
					      .split(',')
 | 
				
			||||||
 | 
					      .map(coordinate => parseInt(coordinate))
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    // Separate into pairs of coordinates that represent a line
 | 
				
			||||||
 | 
					    .flatMap((coord, i, coords) => i === 0 ? [] : [[coords[i - 1], coord]])
 | 
				
			||||||
 | 
					    // Fill in gaps between coordinates, will include duplicates
 | 
				
			||||||
 | 
					    .flatMap(([from, to]) => [
 | 
				
			||||||
 | 
					      ...inclusiveRange(from[0], to[0]).map(x => [x, from[1]]),
 | 
				
			||||||
 | 
					      ...inclusiveRange(from[1], to[1]).map(y => [from[0], y])
 | 
				
			||||||
 | 
					    ])
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class InfinitePage {
 | 
				
			||||||
 | 
					  constructor() {
 | 
				
			||||||
 | 
					    this.ox = null;
 | 
				
			||||||
 | 
					    this.oy = null;
 | 
				
			||||||
 | 
					    this.lines = [];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  get(x, y) {
 | 
				
			||||||
 | 
					    return this.lines[y - (this.oy ?? y)]?.[x - (this.ox ?? x)] || ' ';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  set(x, y, v) {
 | 
				
			||||||
 | 
					    const c = v?.length ? v[0] : ' ';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (this.ox === null) this.ox = x;
 | 
				
			||||||
 | 
					    if (this.oy === null) this.oy = y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const height = this.lines.length;
 | 
				
			||||||
 | 
					    const width = this.lines[0]?.length ?? 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const expandLeft = Math.max(0, this.ox - x);
 | 
				
			||||||
 | 
					    const expandUp = Math.max(0, this.oy - y);
 | 
				
			||||||
 | 
					    const expandRight = Math.max(0, (x - this.ox + 1) - width);
 | 
				
			||||||
 | 
					    const expandDown = Math.max(0, (y - this.oy + 1) - height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.expand(expandUp, expandRight, expandDown, expandLeft);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    const ax = x - this.ox;
 | 
				
			||||||
 | 
					    const ay = y - this.oy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const line = this.lines[ay];
 | 
				
			||||||
 | 
					    this.lines[ay] = line.slice(0, ax) + c + line.slice(ax + 1);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  expand(up, right, down, left) {
 | 
				
			||||||
 | 
					    const width = this.lines[0]?.length ?? 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (up + right + down + left > 0) {
 | 
				
			||||||
 | 
					      this.lines = [
 | 
				
			||||||
 | 
					        ...new Array(up).fill(' '.repeat(width)),
 | 
				
			||||||
 | 
					        ...this.lines,
 | 
				
			||||||
 | 
					        ...new Array(down).fill(' '.repeat(width))
 | 
				
			||||||
 | 
					      ].map(line => ' '.repeat(left) + line + ' '.repeat(right));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    this.ox -= left;
 | 
				
			||||||
 | 
					    this.oy -= up;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  print() {
 | 
				
			||||||
 | 
					    console.log(this.lines.join('\n'));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  getBounds() {
 | 
				
			||||||
 | 
					    return {
 | 
				
			||||||
 | 
					      minX: this.ox,
 | 
				
			||||||
 | 
					      maxX: this.ox + (this.lines[0]?.length ?? 1) - 1,
 | 
				
			||||||
 | 
					      minY: this.oy,
 | 
				
			||||||
 | 
					      maxY: this.oy + (this.lines.length || 1) - 1
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getCave() {
 | 
				
			||||||
 | 
					  const cave = new InfinitePage();
 | 
				
			||||||
 | 
					  for (const coord of rockCoords) {
 | 
				
			||||||
 | 
					    cave.set(...coord, '#');
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return cave;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Sand simulation
 | 
				
			||||||
 | 
					function nextSandPos(x, y, canMoveTo) {
 | 
				
			||||||
 | 
					  const fallPriority = [
 | 
				
			||||||
 | 
					    {x: 0, y: 1},
 | 
				
			||||||
 | 
					    {x: -1, y: 1},
 | 
				
			||||||
 | 
					    {x: 1, y: 1}
 | 
				
			||||||
 | 
					  ];
 | 
				
			||||||
 | 
					  for (const fall of fallPriority) {
 | 
				
			||||||
 | 
					    const nx = x + fall.x;
 | 
				
			||||||
 | 
					    const ny = y + fall.y;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (canMoveTo(nx, ny)) {
 | 
				
			||||||
 | 
					      return [nx, ny];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function addUnitOfSand(cave, canMoveTo) {
 | 
				
			||||||
 | 
					  let x = 500;
 | 
				
			||||||
 | 
					  let y = 0;
 | 
				
			||||||
 | 
					  while (true) {
 | 
				
			||||||
 | 
					    let nextPos = nextSandPos(x, y, canMoveTo);
 | 
				
			||||||
 | 
					    if (!nextPos) {
 | 
				
			||||||
 | 
					      cave.set(x, y, 'o');
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    ([x, y] = nextPos);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class EndSimulationError extends Error {}
 | 
				
			||||||
 | 
					function simulateSand(cave, canMoveTo) {
 | 
				
			||||||
 | 
					  let sandCount = 0;
 | 
				
			||||||
 | 
					  while (true) {
 | 
				
			||||||
 | 
					    try {
 | 
				
			||||||
 | 
					      addUnitOfSand(cave, canMoveTo);
 | 
				
			||||||
 | 
					      sandCount++;
 | 
				
			||||||
 | 
					    } catch (err) {
 | 
				
			||||||
 | 
					      if (!(err instanceof EndSimulationError)) {
 | 
				
			||||||
 | 
					        throw err;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return sandCount;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const cave1 = getCave();
 | 
				
			||||||
 | 
					const bounds = cave1.getBounds();
 | 
				
			||||||
 | 
					const count1 = simulateSand(
 | 
				
			||||||
 | 
					  cave1,
 | 
				
			||||||
 | 
					  (x, y) => {
 | 
				
			||||||
 | 
					    if (x < bounds.minX || x > bounds.maxX || y < 0 || y > bounds.maxY) {
 | 
				
			||||||
 | 
					      throw new EndSimulationError();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return cave1.get(x, y) === ' ';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					console.log(`First simulation ended after ${count1} units of sand`);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const cave2 = getCave();
 | 
				
			||||||
 | 
					const count2 = simulateSand(
 | 
				
			||||||
 | 
					  cave2,
 | 
				
			||||||
 | 
					  (x, y) => {
 | 
				
			||||||
 | 
					    if (cave2.get(500, 0) === 'o') {
 | 
				
			||||||
 | 
					      throw new EndSimulationError();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return y < bounds.maxY + 2 && cave2.get(x, y) === ' ';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					console.log(`Second simulation ended after ${count2} units of sand`);
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user