From 7983a35b24aeb287fac83624a9fe6c5db5f7d496 Mon Sep 17 00:00:00 2001 From: Hane Date: Tue, 26 Dec 2023 23:29:19 +0100 Subject: [PATCH] full aoc5-2 --- src/aoc5-2.lisp | 302 +++++++++++++++++++++++++++++++++------------- src/aoc5input.txt | 2 +- src/aoc5test.txt | 2 +- src/aoc6-2.lisp | 7 +- 4 files changed, 225 insertions(+), 88 deletions(-) diff --git a/src/aoc5-2.lisp b/src/aoc5-2.lisp index b8a4e78..afd2e24 100644 --- a/src/aoc5-2.lisp +++ b/src/aoc5-2.lisp @@ -1,91 +1,231 @@ ;; #!/bin/sbcl --script -(defun seed-list (seed-string) - (let ((temp-string "") (source-parsed nil) (temp-source 0) (temp-range 0) (index 0) (return-list '())) - (loop for c across seed-string - do - (if(char= c #\Space) - (cond ((not source-parsed) - (setf temp-source (parse-integer temp-string) ) - (setf temp-string "") - (setf source-parsed t)) - (t (setf temp-range (parse-integer temp-string)) - (setf temp-string "") - ;(setf index temp-range) - (loop while (< index temp-range) - do - (push (+ temp-source index) return-list) - (incf index) - ) - (setf index 0) - (setf source-parsed nil))) - (setf temp-string (format nil "~a~c" temp-string c))) - finally - (setf temp-range (parse-integer temp-string)) - (loop while (< index temp-range) - do - (push (+ temp-source index) return-list) - (incf index))) - (format T "~%~A" return-list) - return-list)) - -(defun parse-map (seed source dest range) - (format T "~%~d-~d-~d-~d" seed source dest range) - (if(and(>= seed source) (<= seed (+ source range))) - (progn - (+ dest (- seed source))) - seed)) - -(defun parse-file (file - + (defun seed-list (seed-string) + (let ((temp-string "") (return-list '()) (base 0) (base-parsed nil) (range 0)) + (loop for c across seed-string + do + (if(char= c #\Space) + (if(not base-parsed) + (progn + (setf base (parse-integer temp-string)) + (setf return-list (append return-list (list base) )) + (setf base-parsed t) + (setf temp-string "")) + (progn + (setf range (parse-integer temp-string)) + (setf return-list (append return-list (list (+ base (- range 1)) ))) + (setf base-parsed nil) + (setf temp-string ""))) + (setf temp-string (format nil "~a~c" temp-string c))) + finally + (setf range (parse-integer temp-string)) + (setf return-list (append return-list (list (+ base (- range 1)) )))) + return-list)) (with-open-file (file "aoc5input.txt") - (let( (digit-line nil) (temp-first-line "") (temp-string "") (manipulated-line "") (code '()) (numbers '()) (translated '())) + (let( (lowest -1) (digit-line nil) (dest-parsed nil) (temp-first-line "") (range "") (temp-string "") + (manipulated-line "") (dest-exploded '()) (source-exploded '()) (yet-to-translate '()) (translated '())) ;;Prep work (setf temp-first-line (read-line file nil)) (setf manipulated-line (subseq temp-first-line (+ 2 (position #\: temp-first-line :test #'equalp)) (length temp-first-line) )) - (setf numbers (seed-list manipulated-line)) - (dolist (item numbers) (push nil translated)) - (print numbers) + (setf yet-to-translate (seed-list manipulated-line)) + (print yet-to-translate) (print translated) + (print "----") (read-line file nil) - (loop for line = (read-line file nil) - while line - do - (when (equalp 0 (length line)) - (let((current-index 0)) - (print "hola") - (dolist (item translated) - (setf (nth current-index translated) nil) - (incf current-index)))) - (loop for c across line - do - (if(digit-char-p c) - (progn - (setf digit-line t) - (setf temp-string (format nil "~a~c" temp-string c))) - (if digit-line - (progn - (push (parse-integer temp-string) code) - (setf temp-string "")))) - finally - (when digit-line - (push (parse-integer temp-string) code) - (print code) - (let((current-index 0) (translation 0)) - (dolist (item numbers) - (when (not (nth current-index translated)) - (setf translation (parse-map item (nth 1 code) (nth 0 (last code)) (first code))) - (when (not (equal item translation)) - (setf (nth current-index translated) t) - (setf (nth current-index numbers) translation) - (setf translation 0))) - (incf current-index))) - (setf temp-string "") + (loop for line = (read-line file nil) + while line + do + (when (equalp 0 (length line)) + (print (append yet-to-translate translated)) + (print "----") + (setf yet-to-translate (append yet-to-translate translated)) + (setf translated '())) + (loop for c across line + do + (if(digit-char-p c) + (progn + (setf digit-line t) + (setf temp-string (format nil "~a~c" temp-string c))) + (if digit-line + (progn + (if dest-parsed + (push (parse-integer temp-string) source-exploded) + (progn + (setf dest-parsed t) + (push (parse-integer temp-string) dest-exploded))) + (setf temp-string "")))) + finally + (when digit-line + ;;RANGES + ;;(format T "~%~a" temp-string) + ;;(print "newline") + (setf range (parse-integer temp-string)) + (setf source-exploded (append source-exploded (list (+ (first source-exploded) (- range 1))))) + (setf dest-exploded (append dest-exploded (list (+ (first dest-exploded) (- range 1))))) + ;;DANGER ZONE + (let( (unqualified '() ) (done '()) (source-base (nth 0 source-exploded)) (source-end (nth 1 source-exploded)) + (dest-base (nth 0 dest-exploded)) (dest-end (nth 1 dest-exploded)) (len (list-length yet-to-translate)) ) + (loop with index = 0 + with current-base = 0 + with current-end = 0 + while (< index len) + do + (setf current-base (nth index yet-to-translate)) + (setf current-end (nth (+ index 1) yet-to-translate)) + ;;(format T "~%~a ~a ~a ~a" "Current base:" current-base "Current end:" current-end) + ;;(format T "~%~a ~a ~a ~a" "Source base: " source-base "Source end: " source-end) + ;;(format T "~%~a ~a ~a ~a" "Dest base: " dest-base "Dest end: " dest-end) + (if(or(and(<= current-base source-end) (>= current-base source-base)) (and(>= current-end source-base) (<= current-end source-end)) + (and(<= source-end current-end) (>= source-base current-base)) ) + (progn + ;;(print "based") + (if (> current-end source-end) + (progn + (setf unqualified (append unqualified (list (+ source-end 1) current-end))) + (setf done (append done (list dest-end )))) + (setf done (append done (list (- dest-end (- source-end current-end))) ))) + (if (< current-base source-base) + (progn + (setf unqualified (append unqualified (list current-base (- source-base 1) ))) + (push dest-base done)) + (push (+ dest-base (- current-base source-base)) done)) + ;;(format T "~%~a ~A" "Done:" done) + (setf translated (append translated done)) + (setf done '())) + (progn + ;;(print "unbased") + (setf unqualified (append unqualified (list current-base current-end) )))) + ;;(format T "~%~a ~A ~a ~A" "Run unqualified:" unqualified "Translated:" translated) + (setf index (+ index 2))) + (setf yet-to-translate unqualified) ) + ;;CLEANUP + ;;(format T "~%~a ~A" "SE:" source-exploded) + ;;(format T "~%~a ~A" "DE:" dest-exploded) + ;;(format T "~%~a ~A ~a ~A" "Translated:" translated "Yet to translate:" yet-to-translate) (setf digit-line nil) - (setf code '())) )) - (format T "~%~a ~A" "Result: " numbers) - (let( (lowest (first numbers))) - (dolist (item numbers) - (when (< item lowest) (setf lowest item))) - (print lowest)))) + (setf dest-parsed nil) + (setf temp-string "") + (setf source-exploded '()) + (setf dest-exploded '()) ) + )) + + (format T "~%~a ~A" "final: " (append yet-to-translate translated)) + (print (list-length (append yet-to-translate translated))) + (dolist (item (append yet-to-translate translated)) + (when (or (= lowest -1) (< item lowest)) + (setf lowest item))) + (print lowest))) + + + + +;; ;; #!/bin/sbcl --script +;; (defun seed-list (seed-string file-content) +;; (let ((temp-string "") (lowest -1) (base 0) (base-parsed nil) (range 0)) +;; (loop for c across seed-string +;; do +;; (if(char= c #\Space) +;; (if(not base-parsed) +;; (progn +;; (setf base (parse-integer temp-string)) +;; (setf base-parsed t) +;; (setf temp-string "")) +;; (progn +;; (setf range (parse-integer temp-string)) +;; (loop with current-index = 0 +;; with return-value = 0 +;; while (< current-index range) +;; do +;; (format T "~%~a ~d" "FS:" (+ base current-index)) +;; (setf return-value (transform-value (+ base current-index) file-content)) +;; ;(format T "~%~a ~d-~d-~d-~d ~a ~d" "Seed-List:" base range current-index (+ base current-index) "Retval:" return-value) +;; (if (equalp -1 lowest) +;; (setf lowest return-value) +;; (when(< return-value lowest) +;; (setf lowest return-value))) +;; (incf current-index)) +;; (setf base-parsed nil) +;; (setf temp-string ""))) +;; (setf temp-string (format nil "~a~c" temp-string c))) +;; finally +;; (setf range (parse-integer temp-string)) +;; (loop with current-index = 0 +;; with return-value = 0 +;; while (< current-index range) +;; do +;; (format T "~%~a ~d ~a ~d" "FS:" (+ base current-index) "Index:" current-index) +;; (setf return-value (transform-value (+ base current-index) file-content)) +;; ;(format T "~%~a ~d-~d-~d-~d ~a ~d" "Seed-List:" base range current-index (+ base current-index) "Retval:" return-value) +;; (if (equalp lowest -1) +;; (setf lowest return-value) +;; (when(< return-value lowest) +;; (setf lowest return-value))) +;; (incf current-index)) +;; ) +;; lowest)) + +;; (defun transform-value (seed file-content) +;; (let( (digit-line nil) (stream "") (final-seed 0) (temp-string "") (code '()) (translated nil)) +;; (setf final-seed seed) +;; (setf stream (make-string-input-stream file-content)) +;; (loop for line = (read-line stream nil) +;; while line +;; do +;; ;(print line) +;; (when (equalp 0 (length line)) +;; (setf translated nil)) +;; (loop for c across line +;; do +;; (if(digit-char-p c) +;; (progn +;; (setf digit-line t) +;; (setf temp-string (format nil "~a~c" temp-string c))) +;; (if digit-line +;; (progn +;; (push (parse-integer temp-string) code) +;; (setf temp-string "")))) +;; finally +;; (when digit-line +;; (push (parse-integer temp-string) code) +;; ;(print code) + +;; (when (not translated) +;; (let( (temp-translate 0) ) +;; (setf temp-translate (parse-map final-seed (nth 1 code) (nth 0 (last code)) (first code))) +;; ;(format T "~%~a ~d" "Translated to:" final-seed) +;; (when(not(equalp temp-translate final-seed)) +;; (setf final-seed temp-translate) +;; (setf translated t)))) + +;; (setf temp-string "") +;; (setf digit-line nil) +;; (setf code '())) ) + +;; ) +;; final-seed)) + +;; (defun parse-map (seed source dest range) +;; ;(format T "~%~a ~d-~d-~d-~d" "Parse-map:" seed source dest range) +;; (if(and(>= seed source) (<= seed (+ source range))) +;; (progn +;; (+ dest (- seed source))) +;; seed)) + +;; (with-open-file (file "aoc5input.txt") +;; (let( (file-content "") (manipulated-line "") ) +;; ;;Prep work +;; (setf file-content (read-line file nil)) +;; (setf manipulated-line (subseq file-content (+ 2 (position #\: file-content :test #'equalp)) (length file-content) )) +;; (setf file-content "") +;; (read-line file nil) + +;; (loop for line = (read-line file nil) +;; while line +;; do +;; (if(not(string= file-content "")) +;; (setf file-content (format nil "~a~%" file-content))) +;; (setf file-content (format nil "~a~a" file-content line)) +;; ) +;; ;(print manipulated-line) +;; (print (seed-list manipulated-line file-content)) )) diff --git a/src/aoc5input.txt b/src/aoc5input.txt index 6cab5eb..bd43a49 100644 --- a/src/aoc5input.txt +++ b/src/aoc5input.txt @@ -274,4 +274,4 @@ humidity-to-location map: 2575348595 2130499969 195699098 593882556 705484119 648158843 3871554698 3932373353 42274873 -2998499327 1650316948 79272282 \ No newline at end of file +2998499327 1650316948 79272282 diff --git a/src/aoc5test.txt b/src/aoc5test.txt index bd902a4..f756727 100644 --- a/src/aoc5test.txt +++ b/src/aoc5test.txt @@ -30,4 +30,4 @@ temperature-to-humidity map: humidity-to-location map: 60 56 37 -56 93 4 \ No newline at end of file +56 93 4 diff --git a/src/aoc6-2.lisp b/src/aoc6-2.lisp index 2aef4af..e8a2d09 100644 --- a/src/aoc6-2.lisp +++ b/src/aoc6-2.lisp @@ -25,7 +25,6 @@ (with-open-file (file "aoc6input.txt") (let( (file-lines '()) (time-list '()) (distance-list '()) (result 1) ) - (loop for line = (read-line file nil) while line do @@ -39,7 +38,5 @@ do ;(print (num-ways-to-win (nth index time-list) (nth index distance-list))) (setf result (* result (num-ways-to-win (nth index time-list) (nth index distance-list)))) - (incf index) - ) - (print result) - )) + (incf index)) + (print result)))