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-03-06

ArcでL-99 (P28a リストを子リストの長さ順で整列)

| 11:55 | ArcでL-99 (P28a リストを子リストの長さ順で整列) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P28a リストを子リストの長さ順で整列) - わだばLisperになる

今回は、リストを子リストの要素数で昇順に整列させるというお題です。

Arcには備え付けでsortがあり、それを使った方が効率が良いとは思うのですが、sortを自作させるのが主旨なんだろうなということで再帰のqsortで書いてみました。

なお、Arcのsortは引数の順番がCommon Lispとは逆のようです。

(lsort '((a b c) (d e) (f g h) (d e) (i j k l) (m n) (o)))
;=> ((o) (d e) (d e) (m n) (a b c) (f g h) (i j k l))

(def lsort (lst)
  (if no.lst
      ()
      (let piv (len car.lst)
	(+ (lsort:rem [<= piv len._] cdr.lst)
	   (list car.lst)
	   (lsort:rem [> piv len._] cdr.lst)))))

;; sort使用
(def lsort (lst)
  (sort (fn (x y) (< (len x) (len y)))
	lst))