2004-08-20 (Fri) [長年日記]
_ defined?と改行
defined?と引数の間って改行が入ってもいいんだ。
foo = 1 p defined? foo
出力結果:
"local-variable"
parse.yをながめていて気付いた。
しかし、何のために?
_ Linux体験講座
島根大学の縄手先生の講座に、社長やまつもとさん、かずひこさん、その他大勢(失礼)と参加。 細かいところを(小声で、愛をこめて)つっこんだりしていたが、とても興味深かった。
一般の人向けのRubyによるプログラミング入門的な講座だったのだが、自宅の近所の奥さんが来ていたりして、びっくり。 時代は変わったものだ。
最後に演習の時間があったのだが、講座で説明された機能しか使っては いけないという縛りがあったので、会社のみんなもけっこう苦労していた。 中でも、
Loto6のような1から48までの数を6個作るスクリプトを考えましょう.やはり rand を使います.
ヒントと手順
* ループでくり返し乱数発生させます.
* 作った乱数は配列に順次格納します.
* もし前に出た数と同じものが出ると破棄します.
* 数が6個できあがったら出力します.
[Samplesより引用]
というのが曲者で、「えー、Array#include?も使っちゃだめなのかよ」という声多数。 まあ、Rubyだと思わなければ簡単なんですが。
縛りがないなら解はいろいろありそう。
candidates = (1..48).to_a ary = (1..6).collect { candidates.delete_at(rand(candidates.length)) } p ary
とか、
rand_stream = Object.new def rand_stream.each loop do yield(rand(48) + 1) end end rand_stream.extend(Enumerable) ary = [] 6.times do ary.push(rand_stream.detect { |j| !ary.include?(j) }) end
とか。
まつもとさんはワンライナーでredoを使って書いていたようだ。
_ めんたいこフランスパンとハンバーグとかぼちゃのスープ
というわけで、今夜は洋風のごちそうである。
パンも自家製でなかなかいける。けど、この間の方がもうちょっとおいしかった。同じ材料でも色々なところで違いが出るようだ。
私のはこんな感じ<br><br> a=[]; 6.times{n=rand(48)+1; redo if a.include? n; a.push n}; puts a<br><br>しかし、やっぱ使う機能に制限がつくととたんにRuby的じゃなくなりますねえ。
だいたい想像通りでした。<br><br>> しかし、やっぱ使う機能に制限がつくととたんにRuby的じゃなくなりますねえ。<br><br>はい、defも.も一つもないとRubyに見えないですね。
ヒントと違うけど珠玉のプログラミングかプログラミング作法で読んだやつはこんな雰囲気でした。<br><br> a=[]; 48.times {|n| a.push(n+1) if rand(48-n) < (6-a.size)}; puts a<br><br>結果がソート済みです(^^
へー、そんなやり方もあるんですね。<br>Loto6って順番は関係ないんですね。知らなかった...。
puts((1..48).sort_by{rand}[0...6])
ここから最短競争が始まる予感<br>でもこれ以上短いのは無理かな?<br>[0,6]にするとかを除くと。
Loto6は順番に関係なく6つの数字を選ぶだけですが、Numbersは順番が関係するストレートと無関係なボックスの両方があります。
ふむふむ。おとなしく年末ジャンボにしときます。