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…

Date::MONTHNAMES

月の名前、日の名前。 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…

upto, downto

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のURL作成

はてな認証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

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…

mergeとmerge!

Hash#mergeは非破壊的ですが、Hash#merge!は破壊的です。!が付いているメソッドは使い方に注意が必要なメソッドです。 a = { "Alice" => 23, "Bobby" => 16, "Chris" => 21, } b = { "Alice" => 15, "David" => 12, } p a #=> {"Alice"=>23, "Chris"=>21, "B…

accumulate

世の中では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, *…

仮想的な無限列(10)

今回の主な修正点は… Callの中でlambdaを返すのは無駄なのでやめた。すぐ評価。 Zipの定義にZipが出てきていたのをやめた。再帰呼び出しはCallで作る。 シーケンスの頭に要素を逆詰めするUnshiftOfを作った。 シーケンスのひながたOf...自体のシーケンスを作…

仮想的な無限列(11)

今回の主な修正点は… 累積的な処理を行うAccumulateWithを作成。 それを元にしてSumOfとProductOfを作成。 それを元にしてSumOfNaturalPlus, ProductOfNaturalPlusを作成。 class NilClass def to_s "_" end end Call = lambda {|f, *a| f[f, *a]} Sequence …

仮想的な無限列(12)

今回の主な修正点は… AccumulateWithの引数をfold風にした。 念願のMapを作成。 無意味な同一引数渡しを省略(op, eachfなど)。 Mapを使ってFibonacciの各項が偶数か奇数かを調べてみる。 Call = lambda {|f, *a| f[f, *a]} Zip = lambda {|op, s, t| Call[ l…

仮想的な無限列(9)

今回の主な修正点は… 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 …

仮想的な無限列(3)

昨日の続きで、無限列を考えています。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_…

仮想的な無限列(4)

仮想的な無限列シリーズです。オブジェクト指向ベースではなく、関数ベースを試してみます。 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() …

仮想的な無限列(5)

仮想的な無限列(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…

仮想的な無限列(6)

リファレンス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 > …

仮想的な無限列(7)

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] …

仮想的な無限列(8)

有限列も使えるようにしました。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

forkはWindowsでは実装されていませんでした。 Kernel.fork{ system("notepad") } #=> in `fork': the fork() function is unimplemented on this machine (NotImplementedError)

仮想的な無限列(2)

昨日の続きで、仮想的な無限列を作っております。とりあえず、こんなのできましたというご紹介を。 Sequenceクラスは、初期値が与えられれば無限列を作るひながたを表すクラスです。 そしてSequence#defineで初期値を与えると実際の無限列が作られます。 無…

仮想的な無限列(1)

フィボナッチ数列を題材に考えてきたことを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単に練習しているだ…

between?

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の鬼門

Rubyの鬼門を読みました。ふむふむ、なるほど。

フィボナッチ数列、もっと

おとといのフィボナッチ数列の続きです。id:sumimさんが、call/cc を使ったコルーチンもどきでフィボナッチ数列という楽しいプログラムを書いていらしたので、便乗させていただきました。 違うところは、callccで保存する環境を直接ローカル変数にしたのと、…

lambdaとproc

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

その名の通り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…