aoc2023/src/aoc5.lisp
2023-12-21 19:45:02 +01:00

72 lines
2.4 KiB
Common Lisp

;; #!/bin/sbcl --script
(defun seed-list (seed-string)
(let ((temp-string "") (return-list '()))
(loop for c across seed-string
do
(if(char= c #\Space)
(progn
(push (parse-integer temp-string) return-list)
(setf temp-string ""))
(setf temp-string (format nil "~a~c" temp-string c)))
finally
(push (parse-integer temp-string) 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))
(with-open-file (file "aoc5input.txt")
(let( (digit-line nil) (temp-first-line "") (temp-string "") (manipulated-line "") (code '()) (numbers '()) (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)
(print translated)
(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 "")
(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))))