aboutsummaryrefslogtreecommitdiff
path: root/2024/10/puzzles.lisp
blob: 696bb25bcd05970e1198e3bc26a589f19eded88e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/usr/bin/sbcl --script


(defun main (filename)
  (let ((lines (read-file-to-lines filename)))
    (loop with dimensions = (array-dimensions lines)
          for i from 0 below (first dimensions)
          summing (loop for j from 0 below (second dimensions)
                        when (char= #\0 (aref lines i j))
                        summing (score-for-trail-head lines i j)))))

(defun read-file-to-lines (filename)
  (with-open-file (stream filename)
    (let ((lines (loop for line = (read-line stream nil)
                       while line
                       collect (coerce line 'array))))
      (make-array (list (length lines)
                        (length (first lines)))
                  :initial-contents lines))))

(defun score-for-trail-head (lines i j)
  (let* ((positions (positions-of-nines lines i j))
         ;; START PART 1
         (positions (remove-duplicates positions :test 'equal))
         ;; END PART 1
         )
    (length positions)))

(defun positions-of-nines (lines i j)
  (let ((char (aref lines i j)))
    (if (char= #\9 char)
        (list (cons i j))
        (loop with needs = (code-char (1+ (char-code char)))
              with dimensions = (array-dimensions lines)
              for (i . j) in (list (cons (1- i) j) (cons i (1- j))
                                   (cons (1+ i) j) (cons i (1+ j)))
              when (and (< -1 i (first dimensions))
                        (< -1 j (second dimensions))
                        (char= (aref lines i j) needs))
              append (positions-of-nines lines i j)))))

(format t "~a~%" (main "input"))