-
Notifications
You must be signed in to change notification settings - Fork 0
/
018.lisp
31 lines (29 loc) · 1007 Bytes
/
018.lisp
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
(defun solve ()
(maximize-path (reverse (triangle))))
(defun triangle ()
'((75)
(95 64)
(17 47 82)
(18 35 87 10)
(20 04 82 47 65)
(19 01 23 75 03 34)
(88 02 77 73 07 63 67)
(99 65 04 28 06 16 70 92)
(41 41 26 56 83 40 80 70 33)
(41 48 72 33 47 32 37 16 94 29)
(53 71 44 65 25 43 91 52 97 51 14)
(70 11 33 28 77 73 17 78 39 68 17 57)
(91 71 52 38 17 14 91 43 58 50 27 29 48)
(63 66 04 68 89 53 67 30 73 16 69 87 40 31)
(04 62 98 27 23 09 70 98 73 93 38 53 60 04 23)))
(defun maximize-path (triangle)
(let ((row (car triangle))
(remaining (cdr triangle)))
(if (= (length row) 1)
(car row)
(let* ((new-row (car remaining))
(rows (cdr remaining))
(summed-row (loop :for i :from 0 :below (length new-row)
:collect (+ (nth i new-row)
(max (nth i row) (nth (+ i 1) row))))))
(maximize-path (cons summed-row rows))))))