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-02-29

ArcでL-99 (P24 ロトくじ)

| 10:37 | ArcでL-99 (P24 ロトくじ) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P24 ロトくじ) - わだばLisperになる

今回は、ロトくじの様に数列からランダムに任意の個数の数字を抜き出したリストを返すというお題です。

ヒントとして以前に作成したrnd-selectとrangeを使用する、とあります。

前回のお題でも若干疑問に感じていたのですが、並びもランダムにしようと思うと、remove-atのように要素を元のリストから要素を落す方法では、並びは元のリストを継承してしまいます。

その辺をどうするのかと。

問題をみると並びまでばらばらなので、rnd-selectを変更して、残った要素と、落とす要素の二つのリストをリストにして返すことにしました。Arcには多値がないようなのでリストで。

(lotto-select 6 49)
;=> (20 44 31 36 1 9)

(def rnd-select (lst num)
  (and (< 0 num)
       ((afn (lst acc cnt)
	  (if (or no.lst (is len.lst num))
	      (list lst acc)
	      (let pos (+ 1 (rand len.lst))
		(self (remove-at lst pos)
		      (cons (lst (- pos 1)) acc)
		      (+ 1 cnt)))))
	lst () num)))

(def lotto-select (n rng)
  (cadr:rnd-select (range 1 rng) (- rng n)))