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 |

2010-11-13

同じ年月は同じグループとしてカウントして数を求める例でのコード比較を Common Lisp でも

| 22:05 | 同じ年月は同じグループとしてカウントして数を求める例でのコード比較を Common Lisp でも - わだばLisperになる を含むブックマーク はてなブックマーク - 同じ年月は同じグループとしてカウントして数を求める例でのコード比較を Common Lisp でも - わだばLisperになる

sumimさんの 同じ年月は同じグループとしてカウントして数を求める例でのコード比較を Squeak Smalltalk でも - Smalltalkのtは小文字です経由

まけるなCommon Lisp。しかし、ライブラリを使ってる時点で反則かもしれず。

最近、comp.lang.schemeで似たような質問があったんですが、そのスレッドの回答で見かけたequivalence-classesというのを使ってみました。

;;---(logic)----で囲んだ箇所を比較対象箇所とする
(import 'com.informatimago.common-lisp.list:equivalence-classes)

(defvar *year-months* '("2009-11"
                        "2009-01"
                        "2010-01"
                        "2010-12"
                        "2010-01"
                        "2010-04"
                        "2010-01"
                        "2010-12"
                        "2010-12"
                        "2010-04"))

;;---(logic)----
(mapcar (lambda (x) (cons (car x) (length x)))
        (sort (equivalence-classes *year-months* :test #'string=)
              #'string< :key #'car))
;;---(logic)----
;=> (("2009-01" . 1) ("2009-11" . 1) ("2010-01" . 3) ("2010-04" . 2)
;    ("2010-12" . 3))

無駄にSeriesで頑張ってみる

;; series::*series-implicit-map* ;=> T
(let ((ans () ))
  (iterate ((item (scan *year-months*)))
    (let ((place (member item ans :key #'car :test #'string=)))
      (if place
          (push item (car place))
          (push (list item) ans))))
  (series::let* ((ym (scan ans))
                 (ym.sum (cons (car ym) (length ym))))
    (alter ym ym.sum)
    (sort ans #'string< :key #'car)))
;=> (("2009-01" . 1) ("2009-11" . 1) ("2010-01" . 3) ("2010-04" . 2)
;    ("2010-12" . 3))

長い…まあ、equivalence-classesを使えば…

(series::let* ((ym (scan (equivalence-classes *year-months* :test #'string=)))
               (ym.sum (cons (car ym) (length ym))))
  (sort (collect ym.sum) #'string< :key #'car))
;=> (("2010-04" . 2) ("2010-12" . 3) ("2010-01" . 3) ("2009-01" . 1)
;    ("2009-11" . 1))

;; LetS風
(letS* ((ym (Elist (equivalence-classes *year-months* :test #'string=)))
        (ym.sum (cons (car ym) (length ym))))
  (sort (Rlist ym.sum) #'string< :key #'car))
;=> (("2010-04" . 2) ("2010-12" . 3) ("2010-01" . 3) ("2009-01" . 1)
;    ("2009-11" . 1))

ゲスト



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