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-10

CLOSでL-99 (P08 連続して現われる要素を圧縮)

| 17:24 | CLOSでL-99 (P08 連続して現われる要素を圧縮) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P08 連続して現われる要素を圧縮) - わだばLisperになる

なんとなくのQiでの解答をなんとなくdefgenericで。

(compress '(a a a a b c c a a d e e e e '(foo) '(foo)))
;=> (A B C A D E '(FOO))

(defgeneric compress (lst)
  (:method ((lst null)) ())
  (:method (lst) (compress1 (car lst) (cdr lst))))

(defgeneric compress1 (head tail)
  (:method (head (tail null)) (list head))
  (:method (head (tail cons))
    (if (equal head (car tail))
	(compress tail)
	(cons head (compress tail)))))

QiでL-99 (P08 連続して現われる要素を圧縮)

| 16:47 | QiでL-99 (P08 連続して現われる要素を圧縮) - わだばLisperになる を含むブックマーク はてなブックマーク - QiでL-99 (P08 連続して現われる要素を圧縮) - わだばLisperになる

なんとなくで書いてみました。

(compress [a a a a b c c a a d e e e e])
\=> [a b c a d e]
\

(define compress
    [ ] -> [ ]
    [H T] -> [H] where (= H T)
    [H | [T | U]] -> (compress [T | U]) where (= H T)
    [H | T] -> [H | (compress T)])

ArcでL-99 (P32 最大公約数を求める)

| 16:18 | ArcでL-99 (P32 最大公約数を求める) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P32 最大公約数を求める) - わだばLisperになる

今回はユークリッドの互除法で最大公約数を求めよ、というお題です。

どうも今のところArcは算術系のオペレータは充実してない様子。余りを求める関数が探し出せなかったので自作しました。

(gcd 1071 1029 14)
;=> 7

(def gcd nums
  (reduce 
    (afn (x y)
      (if (is 0 y)
	  x
	  (let r (remainder x y)
	    (if (is 0 r)
		y
		(self y r)))))
    nums))

(def remainder (x y)
  ((afn (x y)
     (if (> 0 x)
	 (+ x y)
	 (self (- x y) y)))
   (abs x) (abs y)))

CLOSでL-99 (P07 リストの平坦化)

| 01:53 | CLOSでL-99 (P07 リストの平坦化) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P07 リストの平坦化) - わだばLisperになる

可能な限りif式を排除して型のディスパッチだけにしてみようということで、補助関数と本体の間で呼び出しあったりしてます。

なんとなくCLOSで解くというよりは、いかにQiの解答を移植するか、という感じになっています。

もしくは、型のディスパッチだけで、どこまで行けるか、みたいな(笑)

(flatten '(1 2 3 4 ((2 (3) 1) 5 6 7 () 8)))
;-> (1 2 3 4 2 3 1 5 6 7 NIL 8)

(defmethod flatten ((lst null)) () )
(defmethod flatten (lst)
  (flatten1 lst (car lst) (cdr lst)))

(defmethod flatten1 ((head cons) tail)
  (append (flatten head) (flatten tail)))
(defmethod flatten1 (head tail)
  (cons head (flatten tail)))

QiでL-99 (P07 リストの平坦化)

| 01:39 | QiでL-99 (P07 リストの平坦化) - わだばLisperになる を含むブックマーク はてなブックマーク - QiでL-99 (P07 リストの平坦化) - わだばLisperになる

今回は、flatten。Qiだと、どうなるのかいまいちはっきりしませんが、なんとなく解いてみました。

(flatten [1 2 3 4 [[2 [3] 1] 5 6 7 8]])

(define flatten
    [ ] -> [ ]
    [X | Y] -> (append (flatten X) (flatten Y)) where (cons? X)
    [X | Y] -> [X | (flatten Y)])

ArcでL-99 (P31 素数かどうかを判定する)

| 01:17 | ArcでL-99 (P31 素数かどうかを判定する) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P31 素数かどうかを判定する) - わだばLisperになる

L-99はリスト篇が終了し今回から算術篇。28から番号が飛んで31番なのですが、一応問題の数としては、31番目にはなっています。

問題の例としては、is-primeという名前になっていますが、処理系の習慣に沿いたいということで、Arcっぽく、primeとしてみました。

コードの内容としては、Qiのチュートリアルを読んでいたら素数判定のコードがあったので、そのまま移植。

(rem ~prime (range 1 100))
;-> (2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)

(def prime (n)
  (case n
    1 'nil
    2 't
    ((afn (x max div)
       (if (isa (/ x div) 'int) 'nil
	   (> div max) 't
	   'else (self x max (+ 1 div))))
     n (sqrt n) 2)))

ゲスト



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