2010/06/26

Series で L-99 P07-08

夏風邪だかリンゴ病だかですっかり体調と生活のリズムを崩していたが、そろそろ戻さないと。リハビリがてらに Series で L-99 を。

Common Lisp には flatten がなく Series には scan-lists-of-lists-fringe がある。これが Series の好きなところの一つ。

previous は一つ前の値を必要とする際のパターンで、2番目の引数に最初の穴を埋める値を指定できる。

(#Meql ...)(map-fn t #'eql ...) に同じ((series::install) が必要)。

;; P07 (**) Flatten a nested list structure.
;; Transform a list, possibly holding lists as elements into a `flat' list by replacing each list with its elements (recursively).
;;
;; Example:
;; * (my-flatten '(a (b (c d) e)))
;; (A B C D E)
;;
;; Hint: Use the predefined functions list and append.
;; しかたない、入力はリストで。
(defun my-flatten (x)
(scan-lists-of-lists-fringe x))
(my-flatten '(a (b (c d) e)))


;; P08 (**) Eliminate consecutive duplicates of list elements.
;; If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed.
;;
;; Example:
;; * (compress '(a a a a b c c a a d e e e e))
;; (A B C A D E)
(defun compress (x)
(choose (#Mnot (#Meql x (previous x (gensym)))) x))
(compress #z(a a a a b c c a a d e e e e))
(compress #z(nil nil a a a a b c c a a d e e e e))

0 件のコメント: