From 174164093037c7549f0b1ea4ffbdfe44ddc13e2b Mon Sep 17 00:00:00 2001 From: Tyrel Souza Date: Wed, 14 Dec 2022 02:38:19 -0500 Subject: [PATCH] day 14 part 1 and 2 --- 2022/full/day14.txt | 134 +++++++++++++++++++++++++++++++++++++ 2022/python/day14.py | 146 +++++++++++++++++++++++++++++++++++++++++ 2022/python/matrix.py | 55 +++++++++++++++- 2022/python/shared.py | 3 + 2022/samples/day14.txt | 2 + requirements.txt | 1 + 6 files changed, 339 insertions(+), 2 deletions(-) create mode 100644 2022/full/day14.txt create mode 100644 2022/python/day14.py create mode 100644 2022/samples/day14.txt diff --git a/2022/full/day14.txt b/2022/full/day14.txt new file mode 100644 index 0000000..c5d837b --- /dev/null +++ b/2022/full/day14.txt @@ -0,0 +1,134 @@ +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +494,16 -> 499,16 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +505,57 -> 505,59 -> 498,59 -> 498,66 -> 509,66 -> 509,59 -> 507,59 -> 507,57 +492,52 -> 496,52 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +510,123 -> 515,123 +492,48 -> 496,48 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +501,54 -> 505,54 +513,120 -> 518,120 +502,138 -> 502,141 -> 498,141 -> 498,145 -> 514,145 -> 514,141 -> 507,141 -> 507,138 +483,54 -> 487,54 +505,57 -> 505,59 -> 498,59 -> 498,66 -> 509,66 -> 509,59 -> 507,59 -> 507,57 +508,103 -> 508,93 -> 508,103 -> 510,103 -> 510,101 -> 510,103 -> 512,103 -> 512,96 -> 512,103 +512,106 -> 512,108 -> 505,108 -> 505,114 -> 518,114 -> 518,108 -> 516,108 -> 516,106 +532,129 -> 537,129 +501,16 -> 506,16 +508,103 -> 508,93 -> 508,103 -> 510,103 -> 510,101 -> 510,103 -> 512,103 -> 512,96 -> 512,103 +502,138 -> 502,141 -> 498,141 -> 498,145 -> 514,145 -> 514,141 -> 507,141 -> 507,138 +520,120 -> 525,120 +489,50 -> 493,50 +498,19 -> 503,19 +505,151 -> 505,152 -> 518,152 -> 518,151 +510,73 -> 514,73 +516,77 -> 520,77 +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +511,129 -> 516,129 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +524,123 -> 529,123 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +505,57 -> 505,59 -> 498,59 -> 498,66 -> 509,66 -> 509,59 -> 507,59 -> 507,57 +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +507,75 -> 511,75 +495,22 -> 495,25 -> 492,25 -> 492,32 -> 501,32 -> 501,25 -> 499,25 -> 499,22 +514,149 -> 524,149 -> 524,148 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +504,129 -> 509,129 +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +508,103 -> 508,93 -> 508,103 -> 510,103 -> 510,101 -> 510,103 -> 512,103 -> 512,96 -> 512,103 +504,77 -> 508,77 +495,22 -> 495,25 -> 492,25 -> 492,32 -> 501,32 -> 501,25 -> 499,25 -> 499,22 +516,117 -> 521,117 +514,149 -> 524,149 -> 524,148 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +495,22 -> 495,25 -> 492,25 -> 492,32 -> 501,32 -> 501,25 -> 499,25 -> 499,22 +502,138 -> 502,141 -> 498,141 -> 498,145 -> 514,145 -> 514,141 -> 507,141 -> 507,138 +512,106 -> 512,108 -> 505,108 -> 505,114 -> 518,114 -> 518,108 -> 516,108 -> 516,106 +505,57 -> 505,59 -> 498,59 -> 498,66 -> 509,66 -> 509,59 -> 507,59 -> 507,57 +508,103 -> 508,93 -> 508,103 -> 510,103 -> 510,101 -> 510,103 -> 512,103 -> 512,96 -> 512,103 +508,103 -> 508,93 -> 508,103 -> 510,103 -> 510,101 -> 510,103 -> 512,103 -> 512,96 -> 512,103 +507,126 -> 512,126 +513,75 -> 517,75 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +502,138 -> 502,141 -> 498,141 -> 498,145 -> 514,145 -> 514,141 -> 507,141 -> 507,138 +505,151 -> 505,152 -> 518,152 -> 518,151 +510,77 -> 514,77 +528,126 -> 533,126 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +512,106 -> 512,108 -> 505,108 -> 505,114 -> 518,114 -> 518,108 -> 516,108 -> 516,106 +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +518,129 -> 523,129 +505,57 -> 505,59 -> 498,59 -> 498,66 -> 509,66 -> 509,59 -> 507,59 -> 507,57 +495,22 -> 495,25 -> 492,25 -> 492,32 -> 501,32 -> 501,25 -> 499,25 -> 499,22 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +491,19 -> 496,19 +505,19 -> 510,19 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +508,103 -> 508,93 -> 508,103 -> 510,103 -> 510,101 -> 510,103 -> 512,103 -> 512,96 -> 512,103 +506,135 -> 517,135 -> 517,134 +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +506,135 -> 517,135 -> 517,134 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +512,106 -> 512,108 -> 505,108 -> 505,114 -> 518,114 -> 518,108 -> 516,108 -> 516,106 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +497,13 -> 502,13 +489,54 -> 493,54 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +512,106 -> 512,108 -> 505,108 -> 505,114 -> 518,114 -> 518,108 -> 516,108 -> 516,106 +505,69 -> 505,70 -> 511,70 -> 511,69 +487,45 -> 487,38 -> 487,45 -> 489,45 -> 489,42 -> 489,45 -> 491,45 -> 491,39 -> 491,45 -> 493,45 -> 493,39 -> 493,45 +502,138 -> 502,141 -> 498,141 -> 498,145 -> 514,145 -> 514,141 -> 507,141 -> 507,138 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +512,106 -> 512,108 -> 505,108 -> 505,114 -> 518,114 -> 518,108 -> 516,108 -> 516,106 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +525,129 -> 530,129 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +505,151 -> 505,152 -> 518,152 -> 518,151 +495,22 -> 495,25 -> 492,25 -> 492,32 -> 501,32 -> 501,25 -> 499,25 -> 499,22 +521,126 -> 526,126 +512,106 -> 512,108 -> 505,108 -> 505,114 -> 518,114 -> 518,108 -> 516,108 -> 516,106 +495,50 -> 499,50 +495,54 -> 499,54 +502,138 -> 502,141 -> 498,141 -> 498,145 -> 514,145 -> 514,141 -> 507,141 -> 507,138 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +508,103 -> 508,93 -> 508,103 -> 510,103 -> 510,101 -> 510,103 -> 512,103 -> 512,96 -> 512,103 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +508,103 -> 508,93 -> 508,103 -> 510,103 -> 510,101 -> 510,103 -> 512,103 -> 512,96 -> 512,103 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +495,22 -> 495,25 -> 492,25 -> 492,32 -> 501,32 -> 501,25 -> 499,25 -> 499,22 +498,52 -> 502,52 +517,123 -> 522,123 +514,126 -> 519,126 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +495,22 -> 495,25 -> 492,25 -> 492,32 -> 501,32 -> 501,25 -> 499,25 -> 499,22 +505,69 -> 505,70 -> 511,70 -> 511,69 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +512,90 -> 512,87 -> 512,90 -> 514,90 -> 514,86 -> 514,90 -> 516,90 -> 516,87 -> 516,90 -> 518,90 -> 518,82 -> 518,90 -> 520,90 -> 520,81 -> 520,90 -> 522,90 -> 522,86 -> 522,90 -> 524,90 -> 524,84 -> 524,90 -> 526,90 -> 526,82 -> 526,90 -> 528,90 -> 528,82 -> 528,90 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +505,57 -> 505,59 -> 498,59 -> 498,66 -> 509,66 -> 509,59 -> 507,59 -> 507,57 +520,165 -> 520,160 -> 520,165 -> 522,165 -> 522,163 -> 522,165 -> 524,165 -> 524,159 -> 524,165 -> 526,165 -> 526,159 -> 526,165 -> 528,165 -> 528,155 -> 528,165 +505,69 -> 505,70 -> 511,70 -> 511,69 +505,57 -> 505,59 -> 498,59 -> 498,66 -> 509,66 -> 509,59 -> 507,59 -> 507,57 +502,138 -> 502,141 -> 498,141 -> 498,145 -> 514,145 -> 514,141 -> 507,141 -> 507,138 +486,52 -> 490,52 diff --git a/2022/python/day14.py b/2022/python/day14.py new file mode 100644 index 0000000..b078c82 --- /dev/null +++ b/2022/python/day14.py @@ -0,0 +1,146 @@ +import matrix +import shared +import itertools +import functools + + +SAND_START = [0,500] + + +def get_lines(rows): + _rows = [] + for row in rows: + _row = [] + for point in row.split(" -> "): + _row.append(list(reversed(list(map(int, point.split(",")))))) + _rows.append(_row) + return _rows + +def find_bounds(lines): + x = [] + y = [] + for line in lines: + x.extend(matrix.split_x_out(line)) + y.extend(matrix.split_y_out(line)) + return shared.minmax(y),shared.minmax(x) + + +def part1(rows): + def get_next(sand): + next_y = sand[0]+1 + dl = sand[1]-1 + d = sand[1] + dr = sand[1]+1 + return next_y, (dl,d,dr) + lines = get_lines(rows) + (minY,maxY), (minX,maxX) = find_bounds(lines) + mx = matrix.matrix_of_size(maxX+2,maxY+2) + walls = [] + for line in lines: + for x in range(len(line)-1): + coords = matrix.coords_between_points(line[x], line[x+1]) + walls.extend(coords) + for y,x in walls: + mx[y][x] = "#" + mx[SAND_START[0]][SAND_START[1]] = "+" + + sands = [] + + try: + for sand_grains in range(900): # produce Sand one unit at a time + last_grain = [] + sand = SAND_START[:] + #print("starting sand", sand_grains+1, sand) + while True: + last_grain.append(sand[:]) + next_y, (dl, d, dr) = get_next(sand) + if mx[next_y][d] == 0: + #print(mx[next_y][d],"moving_down", end=' ') + #print("moving down") + sand[0] = next_y + elif mx[next_y][dl] == 0: + #print(mx[next_y][dl], "moving left", end=' ') + #print("moving left") + sand[0] = next_y + sand[1] = dl + elif mx[next_y][dr] == 0: + #print(mx[next_y][dr], "moving right", end=' ') + #print("moving right") + sand[0] = next_y + sand[1] = dr + else: + mx[sand[0]][sand[1]] = "o" + #print(mx[next_y][dl], mx[next_y][d], mx[next_y][dr]) + #print("STOPPING", end=' ') + break + #matrix.view_matrix(mx, 0,minX-1, maxY+1,maxX+2) + except IndexError: + sands.append(last_grain) + for y,x in sands[-1]: + mx[y][x] = "~" + #matrix.view_matrix(mx, 0,minX-1, maxY+1,maxX+2) + print("done", sand_grains) + + +def part2(rows): + def get_next(sand): + next_y = sand[0]+1 + dl = sand[1]-1 + d = sand[1] + dr = sand[1]+1 + return next_y, (dl,d,dr) + def check_air(y,x): + if y == floor: + return False + if (y,x) in walls: + return False + return True + + lines = get_lines(rows) + (minY,maxY), (minX,maxX) = find_bounds(lines) + walls = set() + for line in lines: + for x in range(len(line)-1): + coords = matrix.coords_between_points(line[x], line[x+1]) + for c in coords: + walls.add(c) + for y,x in walls: + walls.add((y,x)) + floor = maxY + 2 + + sand_grains = -1 + while True: + sand_grains += 1 + sand = [0,500] + if tuple(sand) in walls: + print("done", sand_grains) + break + while True: + next_y, (dl, d, dr) = get_next(sand) + if check_air(next_y, d): + sand[0] = next_y + elif check_air(next_y,dl): + sand[0] = next_y + sand[1] = dl + elif check_air(next_y, dr): + sand[0] = next_y + sand[1] = dr + else: + walls.add(tuple(sand)) + break + #matrix.view_matrix(mx, 0,minX-1, maxY+3,maxX+2) + + + +def main(): + rows = [row for row in shared.load_rows(14)] + with shared.elapsed_timer() as elapsed: + part1(rows) + print("🕒", elapsed()) + with shared.elapsed_timer() as elapsed: + part2(rows) + print("🕒", elapsed()) + + +if __name__ == "__main__": + main() diff --git a/2022/python/matrix.py b/2022/python/matrix.py index b73f4c6..ea0d8fc 100644 --- a/2022/python/matrix.py +++ b/2022/python/matrix.py @@ -1,5 +1,6 @@ from copy import deepcopy from collections import defaultdict +import math from typing import List, Dict, Tuple @@ -7,6 +8,12 @@ split_word_to_chr_list = lambda y: [w for w in y] split_word_to_int_list = lambda y: [int(w) for w in y] split_line_to_int_list = lambda y: [int(w) for w in y.split(" ") if w] +def split_x_out(l): + return [x for _,x in l] + +def split_y_out(l): + return [y for y,_ in l] + class colors: # HEADER = '\033[95m' @@ -188,6 +195,39 @@ def line_of_sight(mx, row, col): return los + +def coords_between_points(point1, point2): + y1,x1 = point1 + y2,x2 = point2 + + coords = [] + x = 0 + y = 0 + + if x2 < x1: + y = point1[0] + for _x in range(x2, x1+1): + coords.append((y,_x)) + elif x1 < x2: + y = point1[0] + for _x in range(x1, x2+1): + coords.append((y,_x)) + elif y2 < y1: + x = point1[1] + for _y in range(y2, y1+1): + coords.append((_y,x)) + elif y1 < y2: + x = point1[1] + for _y in range(y1, y2+1): + coords.append((_y,x)) + return coords + + + + + + + def get_size(matrix): height = len(matrix) width = len(matrix[0]) @@ -241,13 +281,14 @@ def ppmx(*matrices, pad=True, space=True, zero="."): """ print a matrix of anything, Falsy values turns to `.` for clarity """ + out = [] if len(matrices) > 1: matrices = list(zip(*matrices)) for row in matrices: r = [] for col in row: r.append("".join([f"{x or zero}".rjust(3) for x in col])) - print(" ".join(r)) + out.append(" ".join(r)) else: for row in matrices: for c in row: @@ -259,7 +300,17 @@ def ppmx(*matrices, pad=True, space=True, zero="."): f = lambda x: f"{x or zero}" if space: f = lambda x: f"{x or zero} " - print("".join([f(x) for x in c])) + out.append("".join([f(x) for x in c])) + return "\n".join(out) + +def view_matrix(matrix, y1,x1, y2,x2): + print(y1,y2) + print(x1,x2) + lines = ppmx(matrix, pad=0,space=0).split("\n") + for line in lines[y1:y2+1]: + print(line[x1:x2]) + + def highlight(matrix, red=[], green=[], blue=[], blink_green=[]): diff --git a/2022/python/shared.py b/2022/python/shared.py index 63c2197..e252078 100644 --- a/2022/python/shared.py +++ b/2022/python/shared.py @@ -5,6 +5,9 @@ from pathlib import Path spl = lambda y: [int(w) for w in y] +def minmax(l): + return min(l),max(l) + def load_rows(day): return [row for row in load(day)] diff --git a/2022/samples/day14.txt b/2022/samples/day14.txt new file mode 100644 index 0000000..4e87bb5 --- /dev/null +++ b/2022/samples/day14.txt @@ -0,0 +1,2 @@ +498,4 -> 498,6 -> 496,6 +503,4 -> 502,4 -> 502,9 -> 494,9 diff --git a/requirements.txt b/requirements.txt index add9451..98c124a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ numpy pandas scanf scikit-image +dijkstar