Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-09-26

Clojureでcompact-number-list

| 09:11 | Clojureでcompact-number-list - わだばLisperになる を含むブックマーク はてなブックマーク - Clojureでcompact-number-list - わだばLisperになる

朝のRSSチェックをしていたら、ひげぽんさんのところで、リスト操作のお題が出ていました。

丁度今日やった、L-99の問題にそっくりです。

ということで Scheme どう書く?的 - higepon blogに早速挑戦!

L-99は、27問目まで、こういうリスト操作の問題ばかりなので、こういう問題が好きな方にはL-99がお勧めです!!

(defn 
  #^{:doc "整列済みの number のリストで、'(1 3 4 5 6 12 13 15)
リスト内で数が連続している部分は '(1 2 3) -> '(1 . 3) のように両端のみのリストに纏める。
最初の例のリストであれば以下のようになる。
'(1 (3  6) (12  13) 15)"
     :test (do (test= (group-number-list '(1 3 4 5 6 12 13 15))
                      '(1 (3 6) (12 13) 15))
               (test= (group-number-list []) [] )
               (test= (group-number-list [1 1 1 1 1 1 1]) [1 1 1 1 1 1 1]))}
; -----------------
  group-number-list [coll]
; -----------------  
  (assert (every? number? coll))
  (loop [coll (reverse (cons (gensym) coll)), tem [], acc [] ]
    (let [[car & cdr] coll, [temcar & temcdr] tem]
      (cond (empty? coll) 
            acc
            ;;
            (or (empty? tem)
                (= car (- temcar 1)))
            (recur cdr (cons car tem) acc)
            ;;
            :else
            (recur cdr 
                   (list car)
                   (cons (if temcdr (list temcar (last tem)) temcar)
                         acc))))))

(defmacro test= [expr val]
  `(do (assert (= ~expr ~val))))

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

| 07:40 | ClojureでL-99 (P09 連続して現われる要素を纏める) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P09 連続して現われる要素を纏める) - わだばLisperになる

なんとなくコメントも付けてみました。どうやら、キーと値のペアなら何でも格納できるようなので、色々活用できるのかもしれません。

(defn
  #^{:doc "P09 (**) Pack consecutive duplicates of list elements into sublists.
If a list contains repeated elements they should be placed in separate sublists."
     :test (do (test= (pack []) [[]])
               (test= (pack [1]) [[1]])
               (test= (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))))
     :comment "(pack []) => []とすべきか、(pack []) => [[]]とすべきか…"}
; ----
  pack
; ----
  [coll]
  (loop [coll coll, tem [], acc [] ]
    (let [[car & cdr] coll]
      (cond (empty? coll) 
            (reverse (cons tem acc))
            ;;
            (or (= car (first tem)) (empty? tem))
            (recur cdr (cons car tem) acc)
            ;;
            :else
            (recur cdr (list car) (cons tem acc))))))

(:comment ^#'pack)
;=> "(pack []) => []とすべきか、(pack []) => [[]]とすべきか…"

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20080926