L99 P21 から P25 のオレオレ解答

どもです。
L99 ですが,バックトラック法を,もひとつ,いやさ,全然わかってないので,
P59 で立ち止まって,少し戻って武器を獲得すべくよりみち勉強。
The Land of Lisp についても,しんどくなったので,少し戻って,Lisp の基礎を勉強中。
これがほんとうのバックトラック,ってかっ!?
いいんですよ。今日はとても暑いので,このくらいさぶいほうが。


てかよー,腰が痛くて椅子に座ってられないくらい。
何が原因かなぁ。肥満が原因なのはそうなんだけど,それだけじゃない気がする。
とりあえずは,湿布貼って,健康バンドをまいて,クッションを背中に挟んで
姿勢良くして座ればなんとかなるが,しんどい。非常にしんどい。
基本,めちゃくちゃ姿勢が悪いので,悪いのは姿勢だけではござんせんが,
姿勢を正していこうと思う。

P21 から P25

;;;; P21
(defun insert-at (newelt lst pos)
  (labels ((insert-at-aux (l i)
             (if (= i pos)
                 (cons newelt (nthcdr (1- pos) lst))
                 (cons (car l) (insert-at-aux (cdr l) (1+ i))))))
    (insert-at-aux lst 1)))

(insert-at 'alfa '(a b c d) 2) => (A ALFA B C D)
(insert-at 'new '(a b c) 1) => (NEW A B C)
(insert-at 'new '(a b c) 3) => (A B NEW C)
(insert-at 'new '() 1) => (NEW)

;;;; P22
(defun range (i j)
  (labels ((range-inc (b e)
             (if (> b e) nil
                 (cons b (range-inc (1+ b) e))))
           (range-dec (b e)
             (if (< b e) nil
                 (cons b (range-dec (1- b) e)))))
    (if (<= i j)
        (range-inc i j)
        (range-dec i j))))

(range 4 9) => (4 5 6 7 8 9)
(range 1 1) => (1)
(range 9 4) => (9 8 7 6 5 4)

;;;; P23
(defun rnd-select (lst n)
  (let ((i (and lst (random (length lst)))))
    (if (zerop n) nil
        (cons (nth i lst)
              (rnd-select (remove-at lst (1+ i)) (1- n))))))

(rnd-select '(a b c d e f g h) 3) => (G D H)
(rnd-select '(a) 1) => (A)

;;;; P24
(defun lotto-select (n m)
  (rnd-select (range 1 m) n))

(lotto-select 6 49) => (20 2 46 38 49 43)
(lotto-select 1 1) => (1)
(lotto-select 1 5) => (4)

;;;; P25
(defun rnd-permu (lst)
  (rnd-select lst (length lst)))

(loop for i below 5 collect (rnd-permu '(a b c d e f)))
=> ((F E B C A D) (C E B D A F) (C A E D B F) (D E F A C B) (D A F C E B))