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

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