トップ «前の日記(2004-08-19 (Thu)) 最新 次の日記(2004-08-21 (Sat))» 編集   RSS 1.0 FEED  

Journal InTime


2004-08-20 (Fri) [長年日記]

_ defined?と改行

defined?と引数の間って改行が入ってもいいんだ。

foo = 1
p defined?
foo

出力結果:

"local-variable"

parse.yをながめていて気付いた。

しかし、何のために?

Tags: Ruby

_ 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を使って書いていたようだ。

Tags: Ruby

_ 包丁とミキサーとフライパン

包丁とミキサー

フライパン

奥さんが注文していた包丁とミキサーとフライパンが届いた。

Tags: 買い物

_ めんたいこフランスパンとハンバーグとかぼちゃのスープ

めんたいこフランスパンとハンバーグとかぼちゃのスープ

というわけで、今夜は洋風のごちそうである。

パンも自家製でなかなかいける。けど、この間の方がもうちょっとおいしかった。同じ材料でも色々なところで違いが出るようだ。

Tags:

_ thenと:

いつの間にthenの代りに:が使えるようになってたんだ。

if foo:
  print "foo\n"
end

「次はこっそりendが省略可能になる」とはうささんの予言。

Tags: Ruby
本日のツッコミ(全8件) [ツッコミを入れる]
_ まつもと (2004-08-20 (Fri) 23:20)

私のはこんな感じ<br><br> a=[]; 6.times{n=rand(48)+1; redo if a.include? n; a.push n}; puts a<br><br>しかし、やっぱ使う機能に制限がつくととたんにRuby的じゃなくなりますねえ。

_ shugo (2004-08-21 (Sat) 01:04)

だいたい想像通りでした。<br><br>> しかし、やっぱ使う機能に制限がつくととたんにRuby的じゃなくなりますねえ。<br><br>はい、defも.も一つもないとRubyに見えないですね。

_ (2004-08-21 (Sat) 08:51)

ヒントと違うけど珠玉のプログラミングかプログラミング作法で読んだやつはこんな雰囲気でした。<br><br> a=[]; 48.times {|n| a.push(n+1) if rand(48-n) < (6-a.size)}; puts a<br><br>結果がソート済みです(^^

_ shugo (2004-08-21 (Sat) 11:08)

へー、そんなやり方もあるんですね。<br>Loto6って順番は関係ないんですね。知らなかった...。

_ ささだ (2004-08-21 (Sat) 12:13)

puts((1..48).sort_by{rand}[0...6])

_ shugo (2004-08-21 (Sat) 18:37)

ここから最短競争が始まる予感<br>でもこれ以上短いのは無理かな?<br>[0,6]にするとかを除くと。

_ KENN (2004-08-21 (Sat) 19:29)

Loto6は順番に関係なく6つの数字を選ぶだけですが、Numbersは順番が関係するストレートと無関係なボックスの両方があります。

_ shugo (2004-08-22 (Sun) 13:37)

ふむふむ。おとなしく年末ジャンボにしときます。