From 60d24f2986aec066a90c2eacd88cfdb196f16e4f Mon Sep 17 00:00:00 2001 From: Jacopo De Simoi Date: Fri, 12 Dec 2025 18:57:42 -0500 Subject: [PATCH] =?UTF-8?q?[p10]=20still=20nothing=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- p10/p10.org | 300 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 256 insertions(+), 44 deletions(-) diff --git a/p10/p10.org b/p10/p10.org index 39da603..53451cd 100644 --- a/p10/p10.org +++ b/p10/p10.org @@ -4,7 +4,7 @@ This problem is pretty hard. I have not yet completely understood the linear algebra behind it. #+begin_src emacs-lisp :results none (with-temp-buffer - (insert-file-contents "input-test") + (insert-file-contents "input") (advent/replace-multiple-regex-buffer '(("," . " ") ("^" . "(") @@ -80,7 +80,7 @@ There is a little complication, since the matrices involved are degenerate and we have constraints; #+begin_src emacs-lisp :results none - (setq machines (--map (-rotate 1 (cdr it)) data) machines) + (setq machines (--map (-rotate 1 (cdr it)) data)) #+end_src These are some auxiliary functions to create and deal with matrices @@ -134,44 +134,258 @@ These are some auxiliary functions to create and deal with matrices (let* ((pivot-coeff (nth pivot-index original-row))) (when (< pivot-coeff 0) (setq rMt (--map (flip-index base-index it) rMt))) - (assert (= 1 (abs pivot-coeff))) + (if (not (= 1 (abs pivot-coeff))) (setq pivot-coeff (* 1.0 pivot-coeff))) (let* ((lambdas (append (-repeat (1+ base-index) 0) (-drop (1+ base-index) (nth it rMt)))) (lambdas-corrected (--map (/ it (abs pivot-coeff)) lambdas))) (setq rMt (--map (subtract-composite lambdas-corrected base-index it) rMt) base-index (1+ base-index))))))) (apply '-zip-lists rMt))) + + #+end_src + +#+RESULTS: +: row-reduce + +#+begin_src emacs-lisp :results none + (defun fix-machine (machine) + (let ((machine-1 (let ((permutation (-grade-up '> (car machine)))) + (cons (-sort '> (car machine)) (--map (--map (nth it permutation) it) (cdr machine)))))) + (cons (car machine-1) + (--sort (< (-max it) (-max other)) + (--sort (> (length it) (length other)) (cdr machine-1)))))) + + + (setq machines (-map #'fix-machine machines)) #+end_src #+RESULTS: -| 10 | 1 | 1 | 1 | 0 | -| -1 | 0 | 1 | 0 | -1 | -| 5 | 0 | 0 | 1 | 0 | -| 0 | 0 | 0 | 0 | 0 | -| 0 | 0 | 0 | 0 | 0 | -| 0 | 0 | 0 | 0 | 0 | - -arst +| (29 26 26 12 9 26 26) | (0 1 3 5) | (1 2 4 5 6) | (0 1 2 5 6) | (0 2 3 4 6) | (0 3 4 6) | | | | | | | | | +| (31 51 38 61 77 74 49 72) | (1 3 4) | (0 1 2 3 4 5) | (1 3 4 5 6) | (3 4 6) | (0 4 5 7) | (2 3 4 7) | (1 5 7) | (2 6 7) | (0 5 7) | (5 6 7) | | | | +| (59 21 65 80 39 32 29 43) | (1 2 3) | (0 2 4 5 6) | (0 3 6) | (2 5 6) | (0 2 3 4 5 7) | (0 1 3 5 7) | (0 2 3 4 7) | (1 3 5 7) | | | | | | +| (45 34 45 25 51 61 41) | (0 1 2 3 4) | (1 4) | (0 2 3 5) | (0 1 2 4 5 6) | (0 2 3 5 6) | (4 5 6) | | | | | | | | +| (84 50 59 44 21 77 61 83) | (0 1 3 4 5 6) | (0 3 4 5 6) | (0 1 3 5 6) | (0 1 2 4 6 7) | (0 1 5 6 7) | (0 2 4 5 7) | (0 2 3 5 7) | (0 1 2 6 7) | (2 6 7) | (5 7) | | | | +| (35 18 29 30 49 28 30 35 48) | (1 2 3 4 6 7) | (0 1 2 4 5 7) | (0 2 7) | (0 3 4 5 6 7 8) | (0 1 3 4 6 8) | (0 2 3 4 6 8) | (2 4 5 7 8) | | | | | | | +| (45 8 50 30 16 45) | (1 2) | (0 2 3) | (0 2 3 4 5) | (1 2 4 5) | (0 5) | (2 5) | (5) | | | | | | | +| (26 33 44 35 25 48 30 33 11 45) | (2 5) | (1 3 6) | (1 7) | (2 3 4 6 7 8) | (0 1 2 4 5 6 7 9) | (2 3 4 5 8 9) | (1 3 5 7 9) | (0 5 9) | (3 9) | | | | | +| (49 37 54 32 31 23) | (0 1 2) | (0 1 2 3) | (2 3 4) | (0 2 3 4 5) | (0 1 3 4 5) | (0 2 4 5) | (0 1 5) | (4 5) | | | | | | +| (46 18 33 22) | (0) | (0 1) | (0 1 2) | (0 2 3) | (2 3) | | | | | | | | | +| (23 50 24 46 47 43) | (0 1) | (0 2 3) | (0 1 3 4) | (1 3 4) | (2 3 4) | (0 1 2 3 5) | (1 4 5) | (5) | | | | | | +| (22 15 45 45 48 49) | (0) | (2 4) | (0 2 3 4 5) | (1 3 4 5) | (0 1 2 5) | (0 2 3 5) | (2 3 4 5) | (1 2 5) | | | | | | +| (42 51 56 67 54 34 32 69 49) | (0 3 4 5 6 7) | (1 3 4 7) | (2 6 7) | (5 7) | (0 1 2 3 4 5 8) | (0 1 2 3 5 6 8) | (1 3 4 7 8) | (0 2 3 7 8) | (1 2 4 8) | | | | | +| (74 36 61 78 36 34 19 46 17 29) | (2 3) | (1 3 4) | (0 1 2 3 4 5 6 7) | (0 2 3 7) | (0 1 2 3 4 6 7 8) | (0 1 3 4 5 7 8) | (1 3 4 5 7 8) | (0 2 3 5 8 9) | (2 3 9) | (0 9) | | | | +| (30 19 38 38 32) | (0 2 3) | (2 3) | (0 2 3 4) | (1 4) | | | | | | | | | | +| (42 58 43 59 47 32 29 70 66 53) | (0 3 4 7) | (4 7) | (1 6 7 8) | (0 8) | (1 8) | (0 1 2 3 6 7 8 9) | (1 2 3 4 5 7 8 9) | (0 3 4 5 7 8 9) | (0 1 2 3 4 6 9) | (1 2 5 6 7 9) | | | | +| (9 194 203 18 194) | (0 2 3) | (1 2 3 4) | (1 2 4) | | | | | | | | | | | +| (1 16 1 16) | (0 2) | (1 3) | | | | | | | | | | | | +| (19 23 23 62 25 60 23) | (0) | (2) | (3 4) | (0 1 3 4 5) | (3 5) | (1 2 3 4 5 6) | (0 3 4 5 6) | (2 3 5 6) | (1 2 5 6) | | | | | +| (38 71 40 20 34 45 46 22 57) | (4) | (0 1 2 6 7) | (0 1 2 4 5 6 8) | (1 2 3 5 6 7 8) | (0 1 4 5 6 8) | (1 2 3 8) | (1 5 8) | | | | | | | +| (21 34 25 11 38) | (1) | (2) | (0 2 3) | (1 2 3) | (0 1 4) | (1 4) | (4) | | | | | | | +| (18 24 25 33 23 31) | (0 1 3) | (1 3) | (0 4) | (0 2 3 4 5) | (1 3 4 5) | (1 5) | (2 5) | | | | | | | +| (210 12 211 19 219) | (0) | (1 2) | (0 2 3 4) | (1 3 4) | (0 2 4) | (2 4) | | | | | | | | +| (44 25 62 37 54 51 26 74 57) | (0 2 5) | (0 3 4 5 6 7) | (0 3 7) | (1 2 4 5 6 7 8) | (0 2 3 4 5 7 8) | (0 1 4 5 6 8) | (1 3 5 6 7 8) | (2 4 7 8) | | | | | | +| (66 66 214 278 231 77 256 48 78 46) | (2 3 4 6) | (0 1 3 5 6 7) | (0 2 7) | (1 3 4 5 7 8) | (0 2 3 4 6 8) | (0 1 3 4 8) | (3 6 8) | (0 8) | (0 2 3 5 6 8 9) | (0 3 5 6 7 8 9) | (1 3 4 5 6 9) | (1 2 5 9) | (3 6 9) | +| (19 13 16 50 42) | (1 2 3) | (0 3) | (2 3 4) | (3 4) | (1 4) | | | | | | | | | +| (71 22 39 41 31 39 55) | (0 2) | (0 1 2 3 4) | (2 4) | (0 1 2 3 4 5) | (0 3 4 5 6) | (0 1 2 3 6) | (0 3 5 6) | (0 4 5 6) | | | | | | +| (147 46 37 53 31 26 46 109 31) | (1 2 3 5 6) | (0 3 6) | (0 7) | (0 1 2 3 4 6 8) | (0 1 3 4 5 6 8) | (0 1 2 3 4 5 8) | (1 4 8) | | | | | | | +| (11 11 10 6) | (0 2) | (1 2) | (0 1 3) | | | | | | | | | | | +| (49 39 214 216 34 83 235 89 223 64) | (2 3 5 6 7) | (3 5 7 8) | (2 3 6 8) | (0 2 3 4 5 6 7 8 9) | (1 2 3 5 6 7 8 9) | (0 1 2 4 5 6 7 9) | (0 1 5 6 7 8 9) | (6 7 9) | | | | | | +| (45 28 7 23 28 27 13 14 21) | (0 1 3 4 5) | (0 5 6) | (2 6) | (0 1 6 7) | (0 1 2 3 6 7 8) | (0 4 5 7 8) | (0 8) | (4 8) | | | | | | +| (54 28 43 21 41 57 26) | (0 2) | (0 1 3 5) | (1 2 4 5) | (0 3 5) | (2 5) | (0 2 4 5 6) | (0 1 4 6) | | | | | | | +| (38 18 3 17 18) | (0 2) | (0 3) | (0 1 4) | (1 2 4) | | | | | | | | | | +| (163 183 34 36) | (0 1) | (1 2 3) | (0 1 3) | (1 3) | (2 3) | | | | | | | | | +| (57 40 57 53 234 58 29 49 76 44) | (0 1 2) | (4) | (3 5) | (0 5 6) | (0 1 2 4 5 7 8) | (1 2 3 5 6 8) | (2 3 4 7 8) | (3 4 6 8) | (0 3 4 5 7 8 9) | (0 6 8 9) | (5 7 8 9) | (9) | | +| (38 25 29 19 26 40 9 31) | (0) | (2 3 5) | (3 4 5) | (0 1 2 3 4 6) | (0 5 6) | (1 6) | (0 1 2 4 5 7) | (2 4 6 7) | (3 5 7) | | | | | +| (9 1 27 8 1) | (2) | (0 2 3) | (0 1 4) | | | | | | | | | | | +| (48 17 224 48 26 16) | (0 1 2) | (2) | (0 3) | (3) | (0 1 2 4) | (0 2 3 4) | (0 2 3 4 5) | (1 3 5) | | | | | | +| (214 20 197 17) | (0 1 2) | (0 2) | (0 1 3) | | | | | | | | | | | +| (25 50 13 26 27) | (1 2) | (1 3) | (0 1 3 4) | (1 2 4) | (0 1 4) | | | | | | | | | +| (32 37 40 36 26 33 39 33 23) | (2 5) | (0 1 2 3 4 6 7) | (0 1 2 3 5 6 7) | (3 5 7) | (1 3 4 6 7 8) | (0 4 5 6 7 8) | (0 3 5 6 8) | (1 8) | | | | | | +| (21 23 1 24 8 28 35) | (3) | (0 1 2 3 4 5) | (1 4 5) | (0 3 5 6) | (1 6) | | | | | | | | | +| (92 58 43 92 54 73 46) | (0 1 2) | (0 1 2 3 4) | (0 1 3 4 5) | (0 2 3 5) | (0 3 5) | (2 3 4 5 6) | (1 3 4 5 6) | (0 3 4 6) | (0 3 5 6) | | | | | +| (27 14 36 69 36 40) | (0 1 3) | (2 3 4) | (4) | (0 2 3 5) | (1 3 5) | (3 5) | | | | | | | | +| (19 15 69 27) | (1 2) | (0 2) | (2) | (0 2 3) | (2 3) | | | | | | | | | +| (57 154 139 128 143 13) | (0 1 2) | (1 3) | (0 1 2 3 4) | (1 2 3 4) | (0 4) | (0 3 4 5) | (1 5) | | | | | | | +| (58 47 61 54 71 45 39 45) | (3 4) | (1 4 5) | (4 5) | (0 1 2 3 6) | (4 6) | (1 2 4 5 6 7) | (0 1 5 6 7) | (0 2 4 5 7) | (0 1 2 3 7) | | | | | +| (87 24 5 78 65 95 69 62 69 62) | (0 3) | (5 6) | (6) | (3 4 5 7) | (3 4 7) | (1 3 4 5 8) | (0 8) | (5 8) | (0 3 5 6 7 9) | (0 4 6 7 8 9) | (1 5 6 7 9) | (2 3 4 5 9) | (0 5 9) | +| (19 45 13 142 172 161 156) | (1 2 4) | (1 4 5) | (0 3 4 5 6) | (0 2 3 5 6) | (3 4 5 6) | (1 6) | | | | | | | | +| (9 4 17 133) | (1 2) | (0 2) | (2 3) | (3) | | | | | | | | | | +| (15 7 27 12 25 25) | (0 2 3) | (1 2 3) | (2 3 4 5) | (0 2 4 5) | (1 3 4 5) | (2 4 5) | | | | | | | | +| (39 45 71 73 97 91 65 68 71) | (0 4) | (3 5 6) | (1 2 3 4 5 6 7) | (7) | (0 1 2 3 4 5 6 8) | (2 3 4 5 6 7 8) | (0 1 2 4 5 8) | (0 1 2 3 4 8) | (0 2 4 7 8) | (4 5 7 8) | (8) | | | +| (6 35 41 16 13 35) | (1 2 4) | (0 2 3 5) | (1 2 4 5) | (1 2 3 5) | (1 2 5) | | | | | | | | | +| (50 59 51 46 50 33 28 49 71 68) | (6 7) | (0 2 3 4 5 6 8) | (1 4 8) | (0 2 3 4 5 7 8 9) | (1 2 4 6 7 8 9) | (1 3 4 5 6 7 9) | (0 1 2 5 8 9) | (0 1 3 7 8 9) | (2 3 4 5 9) | (0 1 2 8 9) | (7 9) | | | +| (46 19 31 32 25 32) | (0) | (1 3) | (0 1 2 3 4) | (1 2 3 4) | (3 4) | (3 4 5) | (0 2 5) | | | | | | | +| (12 24 7 17 36) | (1 3 4) | (2 3 4) | (1 2 4) | (0 4) | | | | | | | | | | +| (17 12 35 29 23 29) | (0 2 4) | (0 2 3 4 5) | (2 3 4 5) | (1 2 3 5) | | | | | | | | | | +| (42 210 196 207 47 232 92 48 233 227) | (4 6) | (0 6) | (0 1 2 4 5 6 8) | (0 3 4 5 6 8) | (1 3 6 7 8) | (0 1 2 4 5 6 8 9) | (0 2 4 5 7 8 9) | (1 2 3 5 8 9) | (1 3 5 7 8 9) | (1 3 5 6 9) | (2 5 6 8 9) | | | +| (177 139 153 37 38 62 49 56) | (0 1 2) | (1 2 3 4 5) | (1 2 3 4 5 6) | (0 1 2 4 5 6) | (0 2 5 6) | (2 4 6) | (0 1 2 3 4 5 7) | (0 3 6 7) | (0 5 7) | (7) | | | | +| (189 197 199 38 46 190 25) | (2) | (0 2 3 4) | (1 3 4) | (0 1 2 3 4 5) | (0 1 2 5) | (2 5) | (0 1 4 6) | (0 3 4 6) | (3 5 6) | | | | | +| (71 55 64 38 41 63 44) | (2) | (1 3 4) | (0 1 3 4 5) | (0 1 2 5) | (0 5) | (0 1 2 4 5 6) | (0 1 2 4 6) | (0 3 4 6) | (2 3 6) | | | | | +| (220 33 198 38 18 55 42) | (0 2) | (1 3 5) | (3 5) | (0 2 3 4 5 6) | (0 1 3 5 6) | (1 2 4 6) | (0 1 5 6) | (3 6) | | | | | | +| (71 27 201 51 60 53 41 39 56) | (2) | (3 4) | (0 1 3 4 5 6 7) | (0 1 3 5 6 7) | (0 2 3 4 7 8) | (0 4 5 6 8) | (1 4 6 8) | (0 2 5 8) | | | | | | +| (33 37 33 38 40 33 51 38 33) | (1 3) | (4) | (0 1 2 3 4 6) | (3 6) | (6 7) | (0 2 4 5 6 7 8) | (1 2 4 5 6 7 8) | (0 1 2 3 5 7 8) | (5 6 7 8) | | | | | +| (19 0 5 15 16 11) | (0 1 3) | (0 3 4) | (1 2 4) | (3 4) | (0 2 3 5) | (0 4 5) | | | | | | | | +| (35 0 13 59 30) | (2) | (0 3) | (3) | (0 3 4) | (2 3 4) | (1 2 4) | (4) | | | | | | | +| (20 15 5 20) | (0 1 3) | (0 2 3) | | | | | | | | | | | | +| (22 11 11 31) | (0 1 2) | (0 1 3) | (0 3) | (2 3) | | | | | | | | | | +| (11 1 11 1) | (0 2) | (1 3) | | | | | | | | | | | | +| (45 45 32 29 45 43 28 49 38 32) | (5 6) | (0 3 4 5 7) | (0 1 2 4 5 6 7 8) | (0 1 4 5 6 7 8) | (1 2 5 7 8) | (0 3 4 6 9) | (1 2 8 9) | (1 7 9) | | | | | | +| (8 9 6 23) | (2 3) | (1 3) | (0 3) | | | | | | | | | | | +| (242 110 78 295 305 83 116 282 116 76) | (0 3 4 7) | (1 4 6 7) | (0 6 7) | (1 2 3 4 5 6 7 8) | (0 1 2 3 5 6 7 8) | (1 2 3 4 5 6 8) | (0 1 3 4 6 7 8 9) | (0 2 3 4 6 7 8 9) | (1 3 4 5 6 7 8 9) | (0 1 2 3 4 5 7 9) | (1 2 3 4 6 8 9) | (1 4 5 7 8 9) | (0 4 5 8 9) | +| (5 5 0 23 23 5) | (0 2 4) | (3 4) | (0 1 3 4 5) | (1 2 5) | | | | | | | | | | +| (9 13 22 13) | (0 2) | (1 2 3) | | | | | | | | | | | | +| (51 29 19 41 52 29 38 34) | (0 2 3 4) | (4 5) | (1 3 4 5 6) | (3 6) | (0 1 2 5 6 7) | (0 1 5 6 7) | (0 4 7) | | | | | | | +| (181 23 187 183) | (1) | (0 1 2) | (1 2) | (0 2 3) | (1 3) | (0 3) | | | | | | | | +| (16 16 22 16 33) | (0 2 3) | (0 1 3) | (1 2 3) | (0 3) | (0 3 4) | (1 2 4) | (4) | | | | | | | +| (41 32 18 32 27 24 21) | (1 2 3) | (0 4) | (0 1 3 5) | (1 2 3 6) | (0 4 6) | (5 6) | | | | | | | | +| (42 195 42 45 188 221) | (0 1 2 3 5) | (0 2 3 4 5) | (2 3 4 5) | (0 1 5) | (1 4 5) | (0 3 5) | | | | | | | | +| (28 187 185 45 187 30 171 35) | (1) | (0 1 2) | (2 4) | (2 3 5) | (1 2 4 6) | (0 1 2 4 5 6 7) | (1 2 3 4 5 6 7) | (0 1 3 4 6 7) | (4 5 7) | | | | | +| (51 64 57 59 81 67 39 70 53 50) | (1 4) | (0 5 6 7) | (1 2 3 4 5 6 7 8) | (1 2 3 5 6 7 8) | (0 4 5 6 7 8) | (0 1 3 4 5 6 7 8 9) | (0 2 3 4 5 7 8 9) | (0 1 2 3 4 7 9) | (0 2 3 5 9) | (2 4 5 9) | (1 5 9) | | | +| (151 20 21 130 150) | (0 2) | (0 1 2 4) | (0 3 4) | | | | | | | | | | | +| (69 66 62 54 68 71 37 25 38) | (0 1 2 3) | (1 4) | (4) | (0 1 2 3 4 5) | (0 3 4 5) | (4 6) | (0 1 2 3 5 6 7 8) | (0 2 5 6 7 8) | (1 5 6 7 8) | (1 2 5 8) | | | | +| (36 33 40 13 50 20) | (0 3) | (0 1 2 4) | (2 4) | (1 4 5) | (0 2 5) | | | | | | | | | +| (18 210 210 14 10) | (1 2) | (0 1 2 3) | (1 2 3) | (0 4) | | | | | | | | | | +| (24 15 9 0) | (0 1) | (0 2) | (0 3) | | | | | | | | | | | +| (50 31 27 160 140 49 129 7 39 144) | (0 1 3 4 5 6) | (0 7) | (0 3 5 6 8) | (0 1 2 3 4 5 8 9) | (1 2 4 6 7 8 9) | (1 3 4 5 8 9) | (0 2 3 5 8 9) | (0 1 3 4 8 9) | (3 4 6 9) | | | | | +| (52 60 212 241 50 32 21 221 51 92) | (0 1 2 4 6 7) | (2 3 7) | (4 6 7 8) | (0 1 3 4 5 7 8 9) | (0 1 3 5 6 7 8 9) | (2 3 4 5 6 7 9) | (0 1 2 3 4 5 9) | (0 1 4 6 7 8 9) | (0 2 3 7 9) | (2 3 7 8 9) | (3 4 8 9) | (1 9) | | +| (2 26 26 17 19 24) | (1 3) | (0 1 2 4) | (1 2 3 4 5) | (1 2 5) | | | | | | | | | | +| (53 34 19 122 32 140 151 51 44) | (3 5 6) | (0 1 2 3 5 7) | (0 6 7) | (0 1 3 5 6 7 8) | (0 1 2 4 6 7 8) | (0 1 4 5 7 8) | (1 2 4 7 8) | (0 1 7 8) | (2 3 5 8) | (4 5 6 8) | (0 2 3 8) | | | +| (24 36 8 16 20) | (0 2) | (0 1 3) | (1 3) | (0 1 4) | (1 4) | | | | | | | | | +| (27 40 47 51 31 38) | (1 2 3) | (3 4) | (0 2 3 4 5) | (0 1 2 5) | (1 5) | | | | | | | | | +| (64 57 76 53 61 66 28 43 34 43) | (0 1 2 4 5 7) | (2 6 7) | (0 7) | (0 1 3 4 5 8) | (0 1 2 3 4 6 7 9) | (0 1 2 3 4 5 8 9) | (0 1 2 3 4 7 8 9) | (1 2 3 5 6 8 9) | (0 2 3 4 5 9) | | | | | +| (39 57 68 14 50 54 35 70) | (1 2 5) | (2 4 6) | (0 1 2 4 5 6 7) | (0 1 2 5 6 7) | (0 1 4 5 6 7) | (0 1 3 4 7) | (2 4 7) | (5 7) | | | | | | +| (19 21 20 27 32) | (0 1 3) | (1 2 3 4) | (2 3 4) | (0 4) | | | | | | | | | | +| (32 10 12 12 40 32 50 12) | (0 1 2 4 5) | (4 5 6) | (0 6) | (4 6) | (0 1 3 4 5 6 7) | (0 2 3 4 5 6 7) | | | | | | | | +| (225 75 226 54 241 203 20 182 39 208) | (0 1 4) | (1 2 3 4 5) | (0 1 3 8) | (0 1 2 4 6 7 8 9) | (2 3 4 5 6 8 9) | (1 2 3 4 6 8 9) | (0 2 4 5 7 9) | (0 1 2 4 9) | | | | | | +| (37 32 46 56 23 40 37 56) | (1 5) | (0 1 4 6) | (1 2 3 4 5 7) | (0 2 3 5 6 7) | (0 1 2 4 5 7) | (0 2 3 6 7) | (1 3 4 7) | | | | | | | +| (131 150 133 9 151) | (1 2 3) | (0 1 2 4) | (0 3 4) | (1 4) | (3 4) | | | | | | | | | +| (79 59 72 88 29 73 77 23 38) | (0 1 3 4) | (2 5) | (0 1 2 4 5 6) | (0 1 2 3 6) | (0 3 5 6) | (5 6) | (1 2 3 4 5 6 8) | (0 2 3 6 7 8) | (1 2 3 4 5 8) | (1 3 4 7 8) | (1 3 5 8) | | | +| (63 43 43 55 65 19 58 55) | (0 1 2 3 4) | (0 2 3 4 5 6) | (0 1 3 4 6) | (0 2 3 4 6 7) | (0 1 2 3 6 7) | (0 1 2 4 6 7) | (0 2 6 7) | (3 4 5 7) | | | | | | +| (195 190 16 21 13 7 201) | (1 2) | (0 3 5) | (0 3 6) | (0 1 6) | (4 6) | | | | | | | | | +| (30 11 29 17) | (0) | (0 2) | (1 2) | (3) | | | | | | | | | | +| (70 36 63 23 42 69 62 71 89) | (0 1 4) | (1 2 6 7) | (0 2 4 5 6 7 8) | (0 3 5 6 7 8) | (0 1 4 5 7 8) | (2 3 5 7 8) | (4 5 6 8) | (0 2 5 8) | (0 2 6 8) | (3 8) | (0 8) | | | +| (53 57 81 50 47 94 41 81) | (0 1 2 5) | (0 1 5) | (2 5) | (0 6) | (0 1 2 3 6 7) | (0 3 4 5 6 7) | (4 5 6 7) | (1 2 4 7) | (2 3 5 7) | (1 3 7) | | | | +| (33 35 28 31 54 29 7) | (0 2 4) | (0 1 4) | (3 4) | (1 2 3 4 5) | (0 2 3 4 5) | (0 1 2 4 5) | (0 3 4 5 6) | | | | | | | +| (72 32 62 50 29 71 30 45 60 75) | (0 2 3) | (0 1 2 5 7 8) | (0 1 3 7 8) | (6 8) | (0 1 2 3 4 5 7 9) | (0 1 3 4 6 7 8 9) | (0 1 2 3 5 7 9) | (2 4 5 6 8 9) | (1 2 3 5 8 9) | (2 4 6 8 9) | (0 3 5 8 9) | (0 5 7 9) | (2 8 9) | +| (256 29 36 227 204 38 231) | (0 1 2) | (0 2) | (0 1 3 4 5) | (0 1 3 5 6) | (0 3 4 6) | (0 3 5 6) | (0 5 6) | (2 6) | | | | | | +| (9 14 20 13) | (1) | (2) | (0 2 3) | (1 2 3) | (0 3) | (3) | | | | | | | | +| (38 64 31 27 44 41 68) | (1 4) | (0 1 2 4 5 6) | (0 1 2 3 6) | (0 4 5 6) | (1 4 5 6) | (1 3 6) | | | | | | | | +| (24 18 18 6) | (0) | (0 1 2) | (1 3) | (3) | | | | | | | | | | +| (52 36 15 52 56) | (0 1 2) | (0 2 3) | (0 1 3 4) | (0 3 4) | (1 3 4) | (0 4) | | | | | | | | +| (76 49 67 39 55 23 72 56 52) | (0) | (0 4) | (0 5) | (0 1 3 4 6 7) | (1 2 7) | (0 1 7) | (0 2 3 4 6 8) | (0 2 5 6 7 8) | (1 2 4 6 7 8) | (1 2 6 8) | | | | +| (58 35 48 49 51 71 49 49) | (0 1 3 4) | (0 1 2 3 5 6) | (0 4 5 6) | (2 3 6) | (1 2 3 4 7) | (0 2 3 5 7) | (0 4 5 7) | (5 7) | | | | | | +| (18 9 24 27 23 7) | (1 3) | (0 2 3 4) | (1 2 3 4 5) | (0 2 3 5) | | | | | | | | | | +| (21 55 74 70 51 64 49 26 53) | (0 2 3 5) | (0 1 3 6) | (2 4 6) | (1 2 3 4 5 6 7) | (0 1 3 5 6 7 8) | (1 2 3 4 5 6 8) | (1 3 4 5 7 8) | (0 2 3 5 7 8) | (1 2 3 5 8) | (0 3 5 8) | | | | +| (12 15 27 23 32 28) | (0 3) | (1 2 4) | (1 2 3 4 5) | (0 3 4 5) | (2 4 5) | | | | | | | | | +| (49 66 35 36 41 85 24 59 66 58) | (2) | (2 3 5) | (5 7) | (3 7 8) | (6 7 8) | (1 5 8) | (0 1 2 3 4 6 7 8 9) | (0 1 2 4 5 7 8 9) | (1 2 3 4 5 6 8 9) | (1 3 5 6 7 8 9) | (0 3 5 6 7 8 9) | (0 1 4 5 9) | | +| (32 36 28 28 46 32 41 45 30) | (4) | (1 4 5) | (2 3 4 6) | (0 2 3 6 7) | (0 1 2 3 6 7 8) | (1 5 7 8) | (0 6 7 8) | | | | | | | +| (143 136 128 21 145 109 42) | (1 2) | (0 1 2 4 5) | (2 4 5) | (0 1 3 4 6) | (0 3 4 6) | (0 4 6) | (0 6) | | | | | | | +| (30 29 30 165 131 61 11 13 24 71) | (3 4) | (3 4 5) | (0 2 3 5 6 8 9) | (0 2 4 5 7 8 9) | (0 2 3 4 5 9) | (3 5 7 8 9) | (1 3 9) | (1 5 9) | | | | | | +| (43 18 34 48 32 32 23) | (0 2 3 4 5) | (0 3 4 5) | (2 3 4 5 6) | (0 1 2 3 6) | (1 2 6) | | | | | | | | | +| (73 41 80 52 67 18 49 75 23 77) | (0 2 3 4 6 7) | (6 7) | (0 1 3 4 5 7 8) | (1 2 3 4 5 6 8 9) | (0 1 2 3 7 9) | (0 2 4 6 7 9) | (0 2 3 5 9) | (0 1 4 9) | (2 3 7 9) | (2 6 8 9) | (2 4 9) | | | +| (145 13 158 145 13) | (0 2) | (0 2 3) | (1 2 4) | | | | | | | | | | | +| (223 26 57 51 57 17 93 199 63 45) | (0 6) | (1 6) | (0 2 3 4 5 6 7) | (6 7) | (0 7) | (0 2 4 6 8) | (0 2 3 4 6 7 8 9) | (1 2 3 4 6 8 9) | (0 1 3 7 8 9) | (3 5 8 9) | | | | +| (41 41 43 68 46 46 61 65 69 29) | (1 6) | (0 1 7) | (3 4 7) | (2 3 4 5 6 7 8) | (0 2 3 6 7 8) | (2 3 4 5 8) | (3 5 8) | (0 1 2 3 4 7 8 9) | (1 2 3 4 7 8 9) | (0 3 5 6 8 9) | (0 3 4 6 8 9) | (1 2 4 6 8 9) | (5 6 8 9) | +| (48 83 75 50 66 48 89 93) | (0 2 5) | (3 4 5) | (2 3 6) | (4 6) | (1 2 4 5 6 7) | (0 1 2 3 6 7) | (1 3 4 6 7) | (2 4 5 6 7) | (0 1 6 7) | (1 4 7) | | | | +| (60 34 40 115 126 23 109) | (0) | (1 3) | (0 2 4) | (0 1 2 5) | (2 5) | (0 1 2 4 5 6) | (3 4 6) | | | | | | | +| (224 208 62 40 233 203 226 219) | (0 1 2 3 4) | (0 5) | (0 1 2 5 6) | (2 3 4 6) | (6) | (0 1 4 5 6 7) | (0 2 3 6 7) | (2 4 7) | (7) | | | | | +| (44 67 46 53 27 70 71 65 45 44) | (1 3 6) | (0 5 6) | (0 1 2 3 4 5 6 7) | (0 1 2 4 5 6 7) | (5 7) | (1 3 4 6 7 8) | (1 2 3 5 6 7 8 9) | (0 1 2 5 8 9) | (0 1 2 5 9) | (0 3 6 9) | | | | +| (157 16 30 30 64 29 43 43 47 49) | (0) | (4 6) | (1 2 3 4 7) | (0 1 2 3 4 6 7 8) | (0 2 3 5 8) | (0 2 4 7 8) | (1 3 4 5 6 7 9) | (4 5 6 7 8 9) | (2 3 4 6 8 9) | (3 4 5 6 8 9) | (0 2 4 6 9) | (0 9) | | +| (8 20 37 4) | (1) | (0 1 2) | (1 2) | (2) | (2 3) | (1 3) | | | | | | | | +| (60 71 64 56 11 87 91 44) | (0 2 4 5) | (0 1 2 3 5 6) | (1 2 3 5 6) | (0 1 2 6) | (1 2 3 5 6 7) | (1 3 5 6 7) | (0 5 6 7) | | | | | | | +| (27 82 67 61 47 74 82 63 69 56) | (1) | (5) | (0 4 5 7) | (1 5 6 7) | (1 2 3 4 5 6 7 8) | (0 1 2 4 6 7 8) | (1 2 3 6 8) | (1 2 5 6 7 8 9) | (2 3 4 6 7 9) | (1 2 3 4 7 9) | (1 4 5 6 8 9) | (0 3 9) | | +| (27 28 51 54 42 15 38 29 39 42) | (1 3 4 7) | (0 1 2 3 5 6 7 8) | (0 2 6 8) | (1 5 7 8) | (0 2 3 4 6 7 8 9) | (1 2 3 4 5 6 8 9) | (1 2 5 6 9) | (2 3 9) | (0 4 9) | | | | | +| (53 23 71 30 38 44 28 45) | (2 3 4) | (2 5) | (0 1 4 5 6) | (2 5 6) | (0 2 3 4 5 6 7) | (0 1 2 7) | (0 7) | | | | | | | +| (37 13 26 11 31 17 32 22) | (0 4) | (1 5) | (0 2 3 4 5 6) | (0 1 5 6) | (0 1 4 7) | (2 6 7) | | | | | | | | +| (33 28 29 36 32) | (1 2) | (1 2 3) | (0 3) | (1 2 3 4) | (2 3 4) | (0 4) | | | | | | | | +| (39 26 16 31 45 16 50 49) | (1 2 3 5 6) | (0 1 3 4 6 7) | (2 3 4 5 6 7) | (2 3 5 6 7) | (0 1 4 7) | (0 4 6 7) | | | | | | | | +| (42 60 31 44 73 44 49) | (0 2) | (0 2 3) | (0 1 2 3 4) | (0 2 4 5) | (5) | (0 1 3 4 6) | (1 3 4 5 6) | (1 4 6) | | | | | | +| (28 15 66 59 19) | (2) | (1 2 3) | (2 3) | (0 3) | (0 2 3 4) | (4) | | | | | | | | +| (19 24 44 39 33 18 56 44 30) | (2 5) | (1 2 4 5 6) | (2 6) | (3 6 7) | (3 7) | (0 7) | (1 2 4 8) | (0 8) | (4 8) | | | | | +| (22 32 28 28 24 36 14 17) | (0 1 3 5) | (2 5) | (2 4 6) | (0 1 2 4 5 6 7) | (1 2 3 4 5 7) | (0 2 3 5 6 7) | | | | | | | | +| (55 23 31 58 49 66 80 65 72) | (0 3) | (0 1 4 6 7) | (0 5 7) | (2 3 4 5 6 7 8) | (1 2 3 4 5 6 8) | (0 4 5 6 7 8) | (1 2 3 6 7 8) | (3 6 7 8) | (5 6 8) | (0 3 8) | | | | +| (29 33 4 16) | (0 1) | (1) | (1 2) | (0 1 3) | (0 3) | | | | | | | | | +| (30 78 105 170 48) | (0 1 2) | (0 1 3) | (1 3) | (2 3) | (1 3 4) | (0 3 4) | (1 4) | | | | | | | +| (31 81 67 81 83 40 55 17 29 78) | (1 2 3 4 5) | (1 3 4 5 6) | (1 3 4 6) | (2 6) | (0 1 2 3 4 6 8) | (0 1 2 3 5 7 8 9) | (1 2 3 4 5 7 8 9) | (0 1 2 3 4 6 9) | (0 1 2 3 5 8 9) | (2 4 9) | (1 3 9) | (4 9) | | +| (166 154 173 176 17 183 166) | (2 3) | (2 4) | (5) | (0 2 3 4 5 6) | (0 1 3 4 5 6) | (0 1 2 3 5 6) | | | | | | | | +| (33 181 19 39) | (0 1) | (1) | (2) | (0 2 3) | (2 3) | (3) | | | | | | | | +| (148 7 155 155) | (0 2 3) | (1 2 3) | | | | | | | | | | | | +| (138 146 47 31 160 41 32 24 54) | (0 1 4) | (0 1 2 3 4 5) | (1 5 7) | (3 4 7) | (0 1 4 5 6 8) | (0 2 3 5 8) | (2 4 6 8) | (4 5 7 8) | (1 2 6 8) | | | | | + +This is the tricky part; we want solve the row-reduced form, but we +need to be careful with our choices if we have more than one +possibility + +#+begin_src emacs-lisp + (defun find-possible-indices (matrix i) + (let* ((row (nth i matrix)) + (next-row (nth (1+ i) matrix)) + (i ) + (j (if next-row (--find-index (not (= 0 it)) (cdr next-row)) + (1- length row)))) + (-iota (- j i) i))) + + + (defun solve-row-reduced (matrix) + ;; we start from the last row + (let* ((soln (list (-repeat (1- (length (car matrix))) 0))) + (last-used-button (length (car soln))) + (current-row (1- (length matrix)))) + (while (<= 0 current-row) + (let* ((row (nth current-row matrix)) + (a (car row)) + (i (--find-index (not (= 0 it)) (cdr row)))) + (if i + (let ((possible-indices (--filter (not (= 0 (nth it (cdr row)))) + (-iota (- last-used-button i) i)))) + (if (= 1 (length possible-indices)) ;no choices here, easy + (setq soln (-non-nil (--map (let* ((correction (advent/dot it (-replace-at i 0 (cdr row)))) + (corrected-a (- a correction)) + (pushes (/ corrected-a (nth i (cdr row))))) + (unless (< pushes 0) (-replace-at i pushes it))) + soln)) + last-used-button i + current-row (1- current-row)) + ;;otherwise, we create a number of solutions + (let* ((button (-last-item possible-indices))) + (setq soln (--mapcat (let* ((correction (advent/dot it (-replace-at i 0 (cdr row)))) + (corrected-a (- a correction)) + (max-soln (/ corrected-a (nth button (cdr row))))) + (if (< max-soln 0) (list it) + (-map (lambda (candidate) (-replace-at button candidate it)) (-iota (1+ (round max-soln)))))) + soln) + last-used-button button)))) + (setq current-row (1- current-row))))) + soln)) + + (defun minimal-pushes (machine) + (-min (-map #'-sum (solve-row-reduced (row-reduce (matrix-buttons machine)))))) + + + (setq problematic (--first (not (solve-row-reduced (row-reduce (matrix-buttons it)))) machines)) + + (row-reduce (matrix-buttons problematic)) + + +#+end_src + #+RESULTS: -| 7 | 1 | 1 | 0 | 1 | 0 | 0 | -| 5 | 0 | 1 | 0 | 0 | 0 | 1 | -| 4 | 0 | 0 | 1 | 1 | 1 | 0 | -| 3 | 0 | 0 | 0 | 0 | 1 | 1 | +| 51.0 | 1.0 | 1.0 | 1.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | +| 31.0 | 0.0 | 1.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | +| 43.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 1.0 | +| 10.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 1.0 | -1.0 | 0.0 | 0.0 | 0.0 | +| 16.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | +| 23.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 1.0 | -1.0 | 0.0 | +| 33.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 1.0 | 0.0 | 2.0 | 1.0 | +| 19.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 2.0 | -1.0 | 0.0 | #+begin_src emacs-lisp - (defun solve-row-reduced (matrix) - ;; we start from the last row - (let ((soln (-repeat (length (cdar matrix)) 0))) - (--each (-iota (length matrix) (- (length matrix) 1) -1) - (let* ((row (nth it matrix)) - (a (car row)) - (i (--find-index (not (= 0 it)) (cdr row)))) - (when i - (setq correction (advent/dot soln (append (-repeat (1+ i) 0) (drop (1+ i) (cdr row)))) - soln (-replace-at i (/ (- a correction) (nth i (cdr row))) soln))))) - soln)) - - (solve-row-reduced (row-reduce (matrix-buttons (caddr machines)))) + + + + + + ;; now, this is correct, but we need a positive solution that has ;; fewest button presses possible. @@ -182,30 +396,28 @@ arst (--map (advent/dot it vector) matrix)) (defun solution-p (machine candidate) - (--every (= 0 it) (matrix-appl (matrix-buttons machine) (cons -1 candidate))) - ) - (setq current-machine nil) + (--every (= 0 it) (matrix-appl (matrix-buttons machine) (cons -1 candidate)))) + (defun solve--machine (machine) - (setq current-machine machine) (let ((candidate (solve-row-reduced (row-reduce (matrix-buttons machine))))) - (setq canca candidate) - (and (--every (>= it 0) candidate) (solution-p machine candidate) candidate))) + (and (--every (= (round it) it) candidate) + (--every (>= it 0) candidate) + (solution-p machine candidate) candidate))) (defun solve-machine (machine) (let* ((reduced-mat (row-reduce (matrix-buttons machine))) (rank (rank reduced-mat)) (bunch (--map (cons (car machine) it) - (--filter 'identity - ;(<= rank (length it)) - (-powerset (cdr machine)))))) - (-min (-map '-sum (-non-nil (-map 'solve--machine bunch)))) - )) - - (-sum (-map 'solve-machine machines)) - current-machine - (solve--machine machine) - canca + (--filter (= rank (length it)) + (-powerset (cdr machine)))))) + (-min (-map '-sum (-non-nil (-map 'solve--machine bunch)))))) + + (-sum (-map 'solve-machine machines)) + #+end_src #+RESULTS: : 33 +* + +*