full aoc5-2

This commit is contained in:
Hane 2023-12-26 23:29:19 +01:00
commit 7983a35b24
4 changed files with 225 additions and 88 deletions

View file

@ -1,91 +1,231 @@
;; #!/bin/sbcl --script ;; #!/bin/sbcl --script
(defun seed-list (seed-string) (defun seed-list (seed-string)
(let ((temp-string "") (source-parsed nil) (temp-source 0) (temp-range 0) (index 0) (return-list '())) (let ((temp-string "") (return-list '()) (base 0) (base-parsed nil) (range 0))
(loop for c across seed-string (loop for c across seed-string
do do
(if(char= c #\Space) (if(char= c #\Space)
(cond ((not source-parsed) (if(not base-parsed)
(setf temp-source (parse-integer temp-string) ) (progn
(setf temp-string "") (setf base (parse-integer temp-string))
(setf source-parsed t)) (setf return-list (append return-list (list base) ))
(t (setf temp-range (parse-integer temp-string)) (setf base-parsed t)
(setf temp-string "") (setf temp-string ""))
;(setf index temp-range) (progn
(loop while (< index temp-range) (setf range (parse-integer temp-string))
do (setf return-list (append return-list (list (+ base (- range 1)) )))
(push (+ temp-source index) return-list) (setf base-parsed nil)
(incf index) (setf temp-string "")))
) (setf temp-string (format nil "~a~c" temp-string c)))
(setf index 0) finally
(setf source-parsed nil))) (setf range (parse-integer temp-string))
(setf temp-string (format nil "~a~c" temp-string c))) (setf return-list (append return-list (list (+ base (- range 1)) ))))
finally return-list))
(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
(with-open-file (file "aoc5input.txt") (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 ;;Prep work
(setf temp-first-line (read-line file nil)) (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 manipulated-line (subseq temp-first-line (+ 2 (position #\: temp-first-line :test #'equalp)) (length temp-first-line) ))
(setf numbers (seed-list manipulated-line)) (setf yet-to-translate (seed-list manipulated-line))
(dolist (item numbers) (push nil translated)) (print yet-to-translate)
(print numbers)
(print translated) (print translated)
(print "----")
(read-line file nil) (read-line file nil)
(loop for line = (read-line file nil) (loop for line = (read-line file nil)
while line while line
do do
(when (equalp 0 (length line)) (when (equalp 0 (length line))
(let((current-index 0)) (print (append yet-to-translate translated))
(print "hola") (print "----")
(dolist (item translated) (setf yet-to-translate (append yet-to-translate translated))
(setf (nth current-index translated) nil) (setf translated '()))
(incf current-index)))) (loop for c across line
(loop for c across line do
do (if(digit-char-p c)
(if(digit-char-p c) (progn
(progn (setf digit-line t)
(setf digit-line t) (setf temp-string (format nil "~a~c" temp-string c)))
(setf temp-string (format nil "~a~c" temp-string c))) (if digit-line
(if digit-line (progn
(progn (if dest-parsed
(push (parse-integer temp-string) code) (push (parse-integer temp-string) source-exploded)
(setf temp-string "")))) (progn
finally (setf dest-parsed t)
(push (parse-integer temp-string) dest-exploded)))
(setf temp-string ""))))
finally
(when digit-line (when digit-line
(push (parse-integer temp-string) code) ;;RANGES
(print code) ;;(format T "~%~a" temp-string)
(let((current-index 0) (translation 0)) ;;(print "newline")
(dolist (item numbers) (setf range (parse-integer temp-string))
(when (not (nth current-index translated)) (setf source-exploded (append source-exploded (list (+ (first source-exploded) (- range 1)))))
(setf translation (parse-map item (nth 1 code) (nth 0 (last code)) (first code))) (setf dest-exploded (append dest-exploded (list (+ (first dest-exploded) (- range 1)))))
(when (not (equal item translation)) ;;DANGER ZONE
(setf (nth current-index translated) t) (let( (unqualified '() ) (done '()) (source-base (nth 0 source-exploded)) (source-end (nth 1 source-exploded))
(setf (nth current-index numbers) translation) (dest-base (nth 0 dest-exploded)) (dest-end (nth 1 dest-exploded)) (len (list-length yet-to-translate)) )
(setf translation 0))) (loop with index = 0
(incf current-index))) with current-base = 0
(setf temp-string "") 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 digit-line nil)
(setf code '())) )) (setf dest-parsed nil)
(format T "~%~a ~A" "Result: " numbers) (setf temp-string "")
(let( (lowest (first numbers))) (setf source-exploded '())
(dolist (item numbers) (setf dest-exploded '()) )
(when (< item lowest) (setf lowest item))) ))
(print lowest))))
(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)) ))

View file

@ -25,7 +25,6 @@
(with-open-file (file "aoc6input.txt") (with-open-file (file "aoc6input.txt")
(let( (file-lines '()) (time-list '()) (distance-list '()) (result 1) ) (let( (file-lines '()) (time-list '()) (distance-list '()) (result 1) )
(loop for line = (read-line file nil) (loop for line = (read-line file nil)
while line while line
do do
@ -39,7 +38,5 @@
do do
;(print (num-ways-to-win (nth index time-list) (nth index distance-list))) ;(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)))) (setf result (* result (num-ways-to-win (nth index time-list) (nth index distance-list))))
(incf index) (incf index))
) (print result)))
(print result)
))