Problem 11

(require 'cl)

(defun make-ad-lst (pivot len grid-size)
  (let* ((idx (1- len))
	 (right (loop for i from 0 to idx collect i))
	 (down (loop for i from 0 to idx collect (* grid-size i)))
	 (right-down (loop for i from 0 to idx collect (+ (* grid-size i) i)))
	 (left-down (loop for i from 0 to idx collect (- (* grid-size i) i)))
	 (right-flag (< (+ (% pivot grid-size) idx) grid-size))
	 (down-flag (< (+ (/ pivot grid-size) idx) grid-size))
	 (left-flag (>= (- (% pivot grid-size) idx) 0))
	 rst)
    (setq right (mapcar #'(lambda (i) (+ i pivot)) right))
    (setq down (mapcar #'(lambda (i) (+ i pivot)) down))
    (setq right-down (mapcar #'(lambda (i) (+ i pivot)) right-down))
    (setq left-down (mapcar #'(lambda (i) (+ i pivot)) left-down))

    (if right-flag
	(push right rst) )
    (if down-flag
	(push down rst) )
    (if (and right-flag down-flag)
	(push right-down rst) )
    (if (and left-flag down-flag)
	(push left-down rst) )
    rst))

(let ((grid (vconcat
	     '(08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08
		  49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00
		  81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65
		  52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91
		  22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80
		  24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50
		  32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70
		  67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21
		  24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72
		  21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95
		  78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92
		  16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57
		  86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58
		  19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40
		  04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66
		  88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69
		  04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36
		  20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16
		  20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54
		  01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48)))
      (grid-size 20)
      (len 4)
      (rst 0)
      (rst-lst))

  (dotimes (p (* grid-size grid-size))
    (let ((ad-lst (make-ad-lst p len grid-size))
	  tmp)
      (dolist ( idxs ad-lst)
	(setq tmp (apply #'* (mapcar #'(lambda (idx) (aref grid idx)) idxs)))
	(if (> tmp rst)
	    (progn (setq rst tmp)
		   (setq rst-lst idxs))))))
  (princ rst)
  (princ "\n") )
メモ
  • vconcat でリストをベクトルに変換