疲れたらリスト操作で遊ぶ L99

なれない会社でぐったりです。
今は耐える。

仕事で見なきゃいけないソリューションがvssで管理されているらしい。
そういえばそんなのあったな。
そりゃ使うか。。。そうか。。。vssか。。。

会社でMSプロダクトばかり使っているとLispがやりたくなる。
でもヘトヘトだからそんなに時間はとれない。眠いんです。

なのでここ数日ちょびちょびL99をやってました。
http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html
1、2問ならすぐ終わるから寝る前のパズルとしては最適。
まだ序盤だからいいけど難しくなってきたら厳しいんだろうな。

今で10問めまでクリア。

;;P01
(defun my-last (lst)
  (and lst
       (list (car (reverse lst)))))

;;P02
(defun my-last-but (lst)
  (and lst
       (let ((len (length lst)))
     (if (<= len 2)
         lst
       (subseq lst (- len 2) len)))))

;;P03
(defun my-nth (lst n)
  (and lst
       (if (= n 1)
       (car lst)
     (my-nth (rest lst) (1- n)))))

;;P04
(defun my-len (lst)
  (reduce #'(lambda (count e)
          (1+ count))
      lst
      :initial-value 0))

;;P05
(defun my-reverse (lst)
  (reduce #'(lambda (rvs e)
          (cons e rvs))
      lst
      :initial-value nil))

;;P06
(defun my-palindromep (lst)
  (let* ((cut-len (/ (1+ (length lst)) 2))
    (a (subseq lst 0 cut-len))
    (b (subseq (reverse lst) 0 cut-len)))
    (equal a b)))

;;P07
(defun my-flatten (lst)
  (and lst
       (if (atom (car lst))
       (cons (car lst) (my-flatten (cdr lst)))
     (append (my-flatten (car lst)) (my-flatten (cdr lst))))))

;;P08
(defun my-compress (lst)
  (reverse (reduce #'(lambda (result e)
               (if (equal (car result) e)
               result
             (cons e result)))
           lst
           :initial-value nil)))

;;P09
(defun my-pack (lst)
  (reverse (reduce #'(lambda (result e)
               (cond ((null result)
                  (list (list e)))
                 ((equal (car (car result)) e)
                  (append (list (cons e (car result))) (rest result)))
                 (t
                  (append (list (list e)) result))))
           lst
           :initial-value nil)))

;;P10
(defun my-encode (lst)
  (reverse (reduce #'(lambda (result e)
               (cond ((null result)
                  (list (list 1 e)))
                 ((equal (cadar result) e)
                  (append (list (list (1+ (caar result)) (cadar result))) (rest result)))
                 (t
                  (append (list (list 1 e)) result))))
           lst
           :initial-value nil)))