;; #!/bin/sbcl --script (defun numbers-in-line (index line-length line) (let( (temp-str "") (numbers-found '() ) ) (setf temp-str (format nil "~a~c" temp-str (char line index))) (loop while (digit-char-p c) with c = #\0 with current-index = index do (setf c (if(zerop current-index) #\. (char line (- current-index 1)))) (if (digit-char-p c) (progn (setf temp-str (format nil "~c~a" c temp-str)) (decf current-index) ))) (loop while (digit-char-p c) with c = #\0 with current-index = index do (setf c (if(= line-length (+ current-index 1)) #\. (char line (+ current-index 1)))) (if (digit-char-p c) (progn (setf temp-str (format nil "~a~c" temp-str c)) (incf current-index) ))) (let( (validNumber nil) (number-str "")) (loop for c across temp-str do (if(digit-char-p c) (progn (when (not validNumber) (setf validNumber t)) (setf number-str (format nil "~a~c" number-str c))) (progn (when validNumber (progn (push (parse-integer number-str) numbers-found) (setf validNumber nil) (setf number-str ""))))) finally (when validNumber (progn (push (parse-integer number-str) numbers-found) (setf validNumber nil))))) ;;DEBUG ;;(dolist (item numbers-found) ;;(format T "~%~d" item)) numbers-found )) (with-open-file (file "aoc3input.txt") (let((result 0) (thirdLine "") (previousLine "") (currentLine "") (lineLen 0) (numbers-in-gear '())) (loop for line = (read-line file nil) while line do (setf currentLine line) (format T "~%~a ~a~%~a ~a~%~a ~a" "Third line: " thirdLine "Previous Line:" previousLine "Current line: " currentLine) (if(string= previousLine "") (progn (setf lineLen (length line)) ) (progn (setf currentLine line) (format T "~%") (loop for c across previousLine with currentIdx = 0 do (when (char= c #\*) (progn (format T "~%~a ~d" "\* found in:" currentIdx) (setf numbers-in-gear (append numbers-in-gear (numbers-in-line currentIdx lineLen (if(string= "" thirdLine) "." thirdLine)))) (setf numbers-in-gear (append numbers-in-gear (numbers-in-line currentIdx lineLen previousLine))) (setf numbers-in-gear (append numbers-in-gear (numbers-in-line currentIdx lineLen currentLine))) (print numbers-in-gear) (when(> (list-length numbers-in-gear) 1) (let((gear-value 1)) (dolist (item numbers-in-gear) (setf gear-value (* gear-value item))) (setf result (+ result gear-value)) )) (setf numbers-in-gear '()) )) (incf currentIdx) ))) (setf thirdLine previousLine) (setf previousLine currentLine) ) (print result) ))