#:g1: GOOでL-99 (P09 連続して現われる要素を纏める)

Posted 2008-04-09 19:23:00 GMT

-(http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)
今回も無駄にリストだけでなくコレクションクラスに対応してみました。
また、GOOでは、繰り返しの為の値の蓄積にpackerというものが使えるようなので使ってみました。
packer-fabでpakerのインスタンスを作成し、pack-inで蓄積、packedで蓄積結果を任意のクラスで返します。割とややこしい使い勝手。

(my-pack '(a a a a b c c a a d e e e e)) ;=> ((a a a a) (b) (c c) (a a) (d) (e e e e)) (my-pack #(a a a a b c c a a d e e e e)) ;=> #((a a a a) (b) (c c) (a a) (d) (e e e e)) (my-pack #[a a a a b c c a a d e e e e]) ;=> #[(a a a a) (b) (c c) (a a) (d) (e e e e)] (my-pack "aaaabccaadeeee") ;=> "aaaa,b,cc,aa,d,eeee"

(dm my-pack (u|<col> => <col>) (if (empty? u) u (as (class-of u) (my-pack1 u))))

(dm my-pack (u|<str> => <str>) (if (empty? u) u (join (map (op as <str> _) (my-pack1 u)) ",")))

(df my-pack1 (u|<col> => <lst>) (let ((prev (1st u)) (res (packer-fab <lst>)) (tem (packer-fab <lst>))) (for ((x u)) (unless (= x prev) (pack-in res (packed tem)) (set tem (packer-fab <lst>))) (pack-in tem x) (set prev x)) (pack-in res (packed tem)) (packed res)))

;))))))))))

comments powered by Disqus