From 619d58fc18095013a1326cdf911db303e69f348b Mon Sep 17 00:00:00 2001 From: Dreaded_X Date: Wed, 14 Dec 2022 19:24:31 +0100 Subject: [PATCH] 2022 - Day 14 --- 2022/input/14/input | 176 +++++++++++++++++++++++++ 2022/input/14/test-1 | 2 + 2022/src/bin/day14.rs | 290 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 468 insertions(+) create mode 100644 2022/input/14/input create mode 100644 2022/input/14/test-1 create mode 100644 2022/src/bin/day14.rs diff --git a/2022/input/14/input b/2022/input/14/input new file mode 100644 index 0000000..f188fec --- /dev/null +++ b/2022/input/14/input @@ -0,0 +1,176 @@ +500,30 -> 504,30 +503,28 -> 507,28 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +496,97 -> 496,99 -> 488,99 -> 488,103 -> 508,103 -> 508,99 -> 502,99 -> 502,97 +537,66 -> 541,66 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +479,85 -> 479,87 -> 473,87 -> 473,94 -> 486,94 -> 486,87 -> 483,87 -> 483,85 +540,64 -> 544,64 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +528,68 -> 532,68 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +537,62 -> 541,62 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +500,34 -> 504,34 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +482,82 -> 498,82 -> 498,81 +486,115 -> 486,117 -> 484,117 -> 484,123 -> 494,123 -> 494,117 -> 490,117 -> 490,115 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +546,64 -> 550,64 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +530,50 -> 530,53 -> 523,53 -> 523,57 -> 541,57 -> 541,53 -> 534,53 -> 534,50 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +506,34 -> 510,34 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +503,108 -> 508,108 +512,34 -> 516,34 +561,77 -> 561,78 -> 578,78 -> 578,77 +515,32 -> 519,32 +543,62 -> 547,62 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +534,64 -> 538,64 +514,110 -> 519,110 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +543,66 -> 547,66 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +503,32 -> 507,32 +504,112 -> 509,112 +561,77 -> 561,78 -> 578,78 -> 578,77 +479,85 -> 479,87 -> 473,87 -> 473,94 -> 486,94 -> 486,87 -> 483,87 -> 483,85 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +512,30 -> 516,30 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +496,97 -> 496,99 -> 488,99 -> 488,103 -> 508,103 -> 508,99 -> 502,99 -> 502,97 +500,110 -> 505,110 +488,161 -> 493,161 +549,66 -> 553,66 +486,115 -> 486,117 -> 484,117 -> 484,123 -> 494,123 -> 494,117 -> 490,117 -> 490,115 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +494,34 -> 498,34 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +530,50 -> 530,53 -> 523,53 -> 523,57 -> 541,57 -> 541,53 -> 534,53 -> 534,50 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +546,68 -> 550,68 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +511,112 -> 516,112 +547,73 -> 547,74 -> 567,74 +496,97 -> 496,99 -> 488,99 -> 488,103 -> 508,103 -> 508,99 -> 502,99 -> 502,97 +496,97 -> 496,99 -> 488,99 -> 488,103 -> 508,103 -> 508,99 -> 502,99 -> 502,97 +518,34 -> 522,34 +486,115 -> 486,117 -> 484,117 -> 484,123 -> 494,123 -> 494,117 -> 490,117 -> 490,115 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +482,140 -> 482,141 -> 489,141 -> 489,140 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +496,97 -> 496,99 -> 488,99 -> 488,103 -> 508,103 -> 508,99 -> 502,99 -> 502,97 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +479,85 -> 479,87 -> 473,87 -> 473,94 -> 486,94 -> 486,87 -> 483,87 -> 483,85 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +496,97 -> 496,99 -> 488,99 -> 488,103 -> 508,103 -> 508,99 -> 502,99 -> 502,97 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +496,97 -> 496,99 -> 488,99 -> 488,103 -> 508,103 -> 508,99 -> 502,99 -> 502,97 +552,68 -> 556,68 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +506,26 -> 510,26 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +479,85 -> 479,87 -> 473,87 -> 473,94 -> 486,94 -> 486,87 -> 483,87 -> 483,85 +479,85 -> 479,87 -> 473,87 -> 473,94 -> 486,94 -> 486,87 -> 483,87 -> 483,85 +494,157 -> 499,157 +486,115 -> 486,117 -> 484,117 -> 484,123 -> 494,123 -> 494,117 -> 490,117 -> 490,115 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +530,50 -> 530,53 -> 523,53 -> 523,57 -> 541,57 -> 541,53 -> 534,53 -> 534,50 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +486,115 -> 486,117 -> 484,117 -> 484,123 -> 494,123 -> 494,117 -> 490,117 -> 490,115 +498,159 -> 503,159 +510,108 -> 515,108 +530,50 -> 530,53 -> 523,53 -> 523,57 -> 541,57 -> 541,53 -> 534,53 -> 534,50 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +479,85 -> 479,87 -> 473,87 -> 473,94 -> 486,94 -> 486,87 -> 483,87 -> 483,85 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +534,68 -> 538,68 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +486,115 -> 486,117 -> 484,117 -> 484,123 -> 494,123 -> 494,117 -> 490,117 -> 490,115 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +482,140 -> 482,141 -> 489,141 -> 489,140 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +497,112 -> 502,112 +509,28 -> 513,28 +530,50 -> 530,53 -> 523,53 -> 523,57 -> 541,57 -> 541,53 -> 534,53 -> 534,50 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +547,73 -> 547,74 -> 567,74 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +540,60 -> 544,60 +482,82 -> 498,82 -> 498,81 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +502,161 -> 507,161 +477,136 -> 477,133 -> 477,136 -> 479,136 -> 479,135 -> 479,136 -> 481,136 -> 481,127 -> 481,136 -> 483,136 -> 483,131 -> 483,136 -> 485,136 -> 485,129 -> 485,136 -> 487,136 -> 487,135 -> 487,136 +506,30 -> 510,30 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +531,66 -> 535,66 +491,159 -> 496,159 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +518,112 -> 523,112 +561,77 -> 561,78 -> 578,78 -> 578,77 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +486,115 -> 486,117 -> 484,117 -> 484,123 -> 494,123 -> 494,117 -> 490,117 -> 490,115 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 +530,50 -> 530,53 -> 523,53 -> 523,57 -> 541,57 -> 541,53 -> 534,53 -> 534,50 +497,32 -> 501,32 +540,68 -> 544,68 +530,50 -> 530,53 -> 523,53 -> 523,57 -> 541,57 -> 541,53 -> 534,53 -> 534,50 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +482,154 -> 482,152 -> 482,154 -> 484,154 -> 484,149 -> 484,154 -> 486,154 -> 486,146 -> 486,154 -> 488,154 -> 488,153 -> 488,154 -> 490,154 -> 490,144 -> 490,154 -> 492,154 -> 492,147 -> 492,154 -> 494,154 -> 494,151 -> 494,154 -> 496,154 -> 496,151 -> 496,154 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +482,140 -> 482,141 -> 489,141 -> 489,140 +509,32 -> 513,32 +479,85 -> 479,87 -> 473,87 -> 473,94 -> 486,94 -> 486,87 -> 483,87 -> 483,85 +506,106 -> 511,106 +507,110 -> 512,110 +495,161 -> 500,161 +491,23 -> 491,15 -> 491,23 -> 493,23 -> 493,18 -> 493,23 -> 495,23 -> 495,15 -> 495,23 -> 497,23 -> 497,15 -> 497,23 -> 499,23 -> 499,18 -> 499,23 -> 501,23 -> 501,14 -> 501,23 -> 503,23 -> 503,21 -> 503,23 -> 505,23 -> 505,19 -> 505,23 -> 507,23 -> 507,15 -> 507,23 +514,47 -> 514,41 -> 514,47 -> 516,47 -> 516,42 -> 516,47 -> 518,47 -> 518,42 -> 518,47 -> 520,47 -> 520,44 -> 520,47 -> 522,47 -> 522,44 -> 522,47 -> 524,47 -> 524,42 -> 524,47 -> 526,47 -> 526,38 -> 526,47 -> 528,47 -> 528,43 -> 528,47 -> 530,47 -> 530,44 -> 530,47 diff --git a/2022/input/14/test-1 b/2022/input/14/test-1 new file mode 100644 index 0000000..4e87bb5 --- /dev/null +++ b/2022/input/14/test-1 @@ -0,0 +1,2 @@ +498,4 -> 498,6 -> 496,6 +503,4 -> 502,4 -> 502,9 -> 494,9 diff --git a/2022/src/bin/day14.rs b/2022/src/bin/day14.rs new file mode 100644 index 0000000..c295e36 --- /dev/null +++ b/2022/src/bin/day14.rs @@ -0,0 +1,290 @@ +#![feature(test)] +use core::fmt; +use std::{str::FromStr, cmp::{min, max}}; + +use anyhow::Result; +use aoc::Solver; + +// -- Runners -- +fn main() -> Result<()> { + Day::solve() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn part1_test1() -> Result<()> { + Day::test(Day::part1, "test-1", 24) + } + #[test] + fn part1_solution() -> Result<()> { + Day::test(Day::part1, "input", 1406) + } + #[test] + fn part2_test1() -> Result<()> { + Day::test(Day::part2, "test-1", 93) + } + #[test] + fn part2_solution() -> Result<()> { + Day::test(Day::part2, "input", 20870) + } + + // Benchmarks + extern crate test; + #[bench] + #[ignore] + fn part1_bench(b: &mut test::Bencher) { + Day::benchmark(Day::part1, b) + } + #[bench] + #[ignore] + fn part2_bench(b: &mut test::Bencher) { + Day::benchmark(Day::part2, b) + } +} + +#[derive(Debug)] +struct Point { + x: usize, + y: usize, +} + +impl fmt::Display for Point { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "({}, {})", self.x, self.y) + } +} + +impl FromStr for Point { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + let (x, y) = s.split_once(",").unwrap(); + let x = x.parse()?; + let y = y.parse()?; + + Ok(Point{x, y}) + } +} + +#[derive(Debug)] +struct Path (Vec); + +impl fmt::Display for Path { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + for (idx, point) in self.0.iter().enumerate() { + write!(f, "{}", point)?; + if idx+1 != self.0.len() { + write!(f, " -> ")?; + } + } + + Ok(()) + } +} + +impl FromStr for Path { + type Err = anyhow::Error; + + fn from_str(s: &str) -> Result { + let points = s + .split(" -> ") + .flat_map(Point::from_str) + .collect(); + + Ok(Path(points)) + } +} + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +enum Block { + Air, + Rock, + Sand, + Source, + Void, +} + +struct Cave { + grid: Vec>, + source: usize, + size: (usize, usize), +} + +impl Cave { + // Also returns the width and height of the cave + fn new(mut paths: Vec, floor: bool) -> Self { + // The sand source is at 500, 0 + // This means that xmax starts at 500 and we know ymin is 0 + let mut source = 500; + let (mut xmin, mut xmax, mut ymax) = (usize::MAX, source, 0); + + for path in paths.iter() { + for point in path.0.iter() { + xmin = min(xmin, point.x); + xmax = max(xmax, point.x); + ymax = max(ymax, point.y); + } + } + + + if floor { + ymax += 2; + xmin = min(xmin, source - ymax); + xmax = max(xmax, source + ymax); + + let path = Path(vec![Point{x: xmin, y: ymax}, Point{x: xmax, y: ymax}]); + paths.push(path); + } + + for path in paths.iter_mut() { + for point in path.0.iter_mut() { + point.x -= xmin; + } + } + + let width = xmax-xmin+1; + let height = ymax+1; + + let mut grid = vec![vec![Block::Air; width]; height]; + + for path in paths { + for line in path.0.windows(2) { + let ystart = min(line[0].y, line[1].y); + let yend = max(line[0].y, line[1].y)+1; + for y in ystart..yend { + let xstart = min(line[0].x, line[1].x); + let xend = max(line[0].x, line[1].x)+1; + for x in xstart..xend { + grid[y][x] = Block::Rock; + } + } + } + } + + source -= xmin; + grid[0][source] = Block::Source; + + Self { + grid, + source, + size: (xmax-xmin+1, ymax+1) + } + } + + fn from_str(s: &str, floor: bool) -> Self { + let paths = s + .lines() + .flat_map(Path::from_str) + .collect(); + + Self::new(paths, floor) + } + + fn check(&self, x: isize, y: isize) -> Block { + if x < 0 || y < 0 || x >= self.size.0 as isize || y >= self.size.1 as isize { + return Block::Void; + } + return self.grid[y as usize][x as usize]; + } + + fn simulate_sand(&mut self) -> bool { + let (mut x, mut y): (isize, isize) = (self.source as isize, -1); + + loop { + let positions = vec![ + (x, y+1), + (x-1, y+1), + (x+1, y+1), + ]; + + let mut moved = false; + for position in positions { + match self.check(position.0, position.1) { + // The sand can move into the position + Block::Air | Block::Source => { + // Update the coordinates + x = position.0; + y = position.1; + + // Mark that the sand has moved + moved = true; + + // Simulate the next step + break; + }, + // This position is occupied, check the next position + Block::Rock | Block::Sand => continue, + // The sand fell into the void, any sand we add will also fall into the void + // Return false to signify this + Block::Void => return false, + } + } + + // If the sand did not move, the sand has settled and we can return + if !moved { + let block = self.grid[y as usize][x as usize]; + self.grid[y as usize][x as usize] = Block::Sand; + // If we replaced the source block we are also done + return block != Block::Source; + } + } + } + + fn print(&self) { + for line in self.grid.iter() { + for block in line { + let c = match block { + Block::Air => '.', + Block::Rock => '#', + Block::Sand => 'o', + Block::Source => '+', + Block::Void => 'x', + }; + + print!("{}", c); + } + println!(""); + } + println!(""); + } + + fn count_sand(&self) -> usize { + self.grid.iter().flatten().filter(|&block| *block == Block::Sand).count() + } +} + +// fn size(paths: Vec) + +// -- Solution -- +pub struct Day; +impl aoc::Solver for Day { + type Output1 = usize; + type Output2 = usize; + + fn day() -> u8 { + 14 + } + + fn part1(input: &str) -> Self::Output1 { + let mut cave = Cave::from_str(input, false); + + while cave.simulate_sand() {} + + cave.print(); + + cave.count_sand() + } + + fn part2(input: &str) -> Self::Output2 { + let mut cave = Cave::from_str(input, true); + + while cave.simulate_sand() {} + + cave.print(); + + cave.count_sand() + } +}