2006-04-01から1ヶ月間の記事一覧
おそらくこの100日の「るびこ」の活動に対してだと思うのですが、はてなポイントを送ってくださった方がいらっしゃいました。思いがけないことで、びっくりしましたけれど、嬉しいです。ありがとうございます♪
「るびこの日記」は今日で100日になりました。毎日更新を心がけて来ましたが、今後はペースを大きくダウンいたします。 こういうやり方で勉強するのがとてもおもしろく役に立つことがわかったので、今度はSICPを試しに読んでみようかと思います。 ということ…
何となくパスカルの三角形を描きたくなったので。 def combination(n, k) if k == 1 or k == n return 1 else return combination(n - 1, k) + combination(n - 1, k - 1) end end def line(n) a = Array.new (1..n).each do |k| a << combination(n, k) end…
月の名前、日の名前。 require 'date' p Date::MONTHNAMES p Date::DAYNAMES p Date::ABBR_MONTHNAMES p Date::ABBR_DAYNAMES実行結果です。 [nil, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "No…
Integer#upto, Integer#downtoは引数で指定した限界までイテレートします。uptoは増やしていく、downtoは減らしていく。限界も含みます。 0.upto(10) do |k| print "#{k}, " end puts 10.downto(0) do |k| print "#{k}, " end puts実行結果です。 0, 1, 2, 3…
はてな認証API / ためしに作ってみましたで公開されているmake_api_sig.plをRubyに移植しました。 secretに秘密鍵、api_keyにapi_keyを入れ、ローカルに動かします。 require 'md5' secret = "0123456789abcdef" api_key = "abcdef0123456789abcdef012345678…
「ほほえみつつ、Ruby。」をキャッチフレーズにしてRubyの勉強を続けています。早いもので、今日で96日目(二進法では1100000と切りがよい)、今月末で100日目になります。 継続のポイントといってもcallccの使い方ではありません。勉強を継続する三つのポイン…
srandは疑似乱数の種を与えます。同じ種からは同じ乱数列が生成されます。これは再現性のテストで重要。 5.times do srand 12345 10.times do print rand(10), " " end puts end実行結果です。 2 5 1 4 9 5 2 1 6 1 2 5 1 4 9 5 2 1 6 1 2 5 1 4 9 5 2 1 6 1…
Hash#mergeは非破壊的ですが、Hash#merge!は破壊的です。!が付いているメソッドは使い方に注意が必要なメソッドです。 a = { "Alice" => 23, "Bobby" => 16, "Chris" => 21, } b = { "Alice" => 15, "David" => 12, } p a #=> {"Alice"=>23, "Chris"=>21, "B…
世の中ではaccumulateが流行っているらしいので(ひげぽんさんとtociyukiさん)、最近のラムダ遊びで私もaccumulateしてみます。 Add = lambda{|x, y| x + y} Call = lambda {|f, *a| f[f, *a]} Sequence = lambda {|xs, *a| lambda { return a[0], Call[xs, *…
今回の主な修正点は… Callの中でlambdaを返すのは無駄なのでやめた。すぐ評価。 Zipの定義にZipが出てきていたのをやめた。再帰呼び出しはCallで作る。 シーケンスの頭に要素を逆詰めするUnshiftOfを作った。 シーケンスのひながたOf...自体のシーケンスを作…
今回の主な修正点は… 累積的な処理を行うAccumulateWithを作成。 それを元にしてSumOfとProductOfを作成。 それを元にしてSumOfNaturalPlus, ProductOfNaturalPlusを作成。 class NilClass def to_s "_" end end Call = lambda {|f, *a| f[f, *a]} Sequence …
今回の主な修正点は… AccumulateWithの引数をfold風にした。 念願のMapを作成。 無意味な同一引数渡しを省略(op, eachfなど)。 Mapを使ってFibonacciの各項が偶数か奇数かを調べてみる。 Call = lambda {|f, *a| f[f, *a]} Zip = lambda {|op, s, t| Call[ l…
今回の主な修正点は… nilを_で表示 Ten = Sequence[OfConstant, 10] PowerOf = lambda {|s| Zip[Power, s, Natural]} PowerOfTen = PowerOf[Ten] Show[PowerOfTen] class NilClass def to_s "_" end end Call = lambda {|f, *a| lambda { f[f, *a] } } Walk …
昨日の続きで、無限列を考えています。zipの意味を変えて少し整理しました。 class Sequence < Proc def self.create(*a, &block) self.new(&block).define(*a) end def define(*a) lambda { return a[0], self.call(self, *a) } end end class Proc def to_…
仮想的な無限列シリーズです。オブジェクト指向ベースではなく、関数ベースを試してみます。 SelfCall = lambda {|f, *a| lambda { f.call(f, *a) } } Show = lambda {|xs| SelfCall.call( lambda {|f, xs, n| if n == 0 puts "..." else y, ys = xs.call() …
仮想的な無限列(4)では、ShowとDropが似ていたので、無限列のはじめからn歩あるくWalkを作って統合しました。 Call = lambda {|f, *a| lambda { f.call(f, *a) } } Walk = lambda {|n, xs, eachf, lastf| Call.call( lambda {|fs, xs, n, eachf, lastf| if n…
リファレンスri Proc#callを見ていて、f.call(1, 2, 3)の代わりにf[1, 2, 3]が使えることを知りました。すばらしい。 Call = lambda {|f, *a| lambda { f[f, *a] } } Walk = lambda {|n, xs, eachf, lastf| Call[ lambda {|fs, xs, n, eachf, lastf| if n > …
Zipを作りました。それからarityや型的なものをちょっぴり名前に反映。OfNarutalとか。 Call = lambda {|f, *a| lambda { f[f, *a] } } Walk = lambda {|n, xs, eachf, lastf| Call[ lambda {|fs, xs, n, eachf, lastf| if n > 0 y, ys = xs[] eachf[y, ys] …
有限列も使えるようにしました。OfGivenを使います。 Call = lambda {|f, *a| lambda { f[f, *a] } } Walk = lambda {|n, xs, eachf, lastf| Call[ lambda {|fs, xs, n, eachf, lastf| if n > 0 y, ys = xs[] eachf[y, ys] fs[fs, ys, n - 1, eachf, lastf] …
forkはWindowsでは実装されていませんでした。 Kernel.fork{ system("notepad") } #=> in `fork': the fork() function is unimplemented on this machine (NotImplementedError)
昨日の続きで、仮想的な無限列を作っております。とりあえず、こんなのできましたというご紹介を。 Sequenceクラスは、初期値が与えられれば無限列を作るひながたを表すクラスです。 そしてSequence#defineで初期値を与えると実際の無限列が作られます。 無…
フィボナッチ数列を題材に考えてきたことをSequenceというクラスにまとめてみました。仮想的な無限列です。誰かがどこかでやっていると思いますが、自分の勉強の成果として。 class Sequence < Proc def car(*args) args[0] end def cdr(*args) call(self, *…
いえ、何か新機軸があるわけではありません。 def fib_gen() a, b = 1, 1 while yield(a) a, b = b, a + b end end fib_gen() do |x| print x, " " x < 5000 end #=> 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765単に練習しているだ…
Comparable#between?(min, max)はselfがmin以上max以下のときにtrueのようです。つまりinclusive. p 0.between?(1, 3) #=> false p 1.between?(1, 3) #=> true p 2.between?(1, 3) #=> true p 3.between?(1, 3) #=> true p 4.between?(1, 3) #=> falseところ…
Rubyの鬼門を読みました。ふむふむ、なるほど。
おとといのフィボナッチ数列の続きです。id:sumimさんが、call/cc を使ったコルーチンもどきでフィボナッチ数列という楽しいプログラムを書いていらしたので、便乗させていただきました。 違うところは、callccで保存する環境を直接ローカル変数にしたのと、…
lambdaとprocはいずれもProc.newの同義語です。 p lambda {} #=> #<Proc:0x00000000@a.rb:1> p proc {} #=> #<Proc:0x00000000@a.rb:2> p Proc.new {} #=> #<Proc:0x00000000@a.rb:3>追記:あ、ささださんからツッコミが。確かに"except the resulting Proc objects check the number of parameters passed when called."というのを見</proc:0x00000000@a.rb:3></proc:0x00000000@a.rb:2></proc:0x00000000@a.rb:1>…
その名の通りbase64符号化を行います。 詳しくはri Base64参照。ri base64では何も表示されないので注意。 require 'base64' s = 'URL of my diary is http://d.hatena.ne.jp/rubyco/' print Base64.encode64(s)実行結果です。 VVJMIG9mIG15IGRpYXJ5IGlzIGh0…
id:pyletさんのフィボナッチ数列(fib2)をRubyにて。 Pythonのrange(n)の意味は(0...n)でよいのかしらん。 def fib(n) a, b = 1, 1 for i in (0...n) a, b = b, a + b end a end for i in (0...20) print fib(i), " " end #=> 1 1 2 3 5 8 13 21 34 55 89 144…