2006-01-01から1年間の記事一覧

10000までの完全数を列挙せよ

エラトステネスの篩もよいけれど、別の問題もやろうよ。ということで「完全数」です。 def perfect(n = 100, &block) sum = Array.new(n + 1, 1) (2..n).each do |i| if i == sum[i] block.call(i) end k = i + i while k <= n sum[k] += i k += i end end s…

100までの整数から素数を列挙せよ

普通に実装。(追記:不等号、間違っていたので直しました)。 def prime(n = 100, &block) is_prime = Array.new(n + 1, true) is_prime[0] = false is_prime[1] = false (2..n).each do |p| next unless is_prime[p] block.call(p) k = p + p while k <= n …

すべてのクラスを調べる

ObjectSpace.each_object(Class)で全クラスをvisitできます。 ObjectSpace.each_object(Class) do |o| p o end全クラスではなくExceptionクラスの子孫クラスだけを調べたいならば、次のようにします。 ObjectSpace.each_object(Class) do |o| if o < Excepti…

組み合わせの数

Haskellで書いた組み合わせの数をRubyで書いてみる。 def c(n,k) d(n,k).div(d(k,k)) end def d(n,k) (n-k+1..n).inject(1) {|result,item| result * item} end p c(1000,100) #=> 63850511926305130236698511142022274281262900693853331776286816221524376…

zipWithの自作

id:omochistさんのzipWithを読んで、私も書いてみました。。 対称的じゃないので、きれいじゃないけど、dupしないというメリットはあります。 def zipWith(xs, ys, &block) zipped = [] xs.each_with_index do |x, k| zipped << block.call(x, ys[k]) end zi…

yieldとProc#call

MatzさんのyieldとProc#callを読んで。 Matzさんが書いていた、 Proc#yieldメソッドを導入 nil.yieldメソッドも用意。これが「no block given」のメッセージを出す という二点は、現在のRubyでやるとしたら、以下のようになるという意味でしょうか。 class P…

パスカルの三角形、もう少し

epicsさんの続・パスカルの三角形の下の方に「挫折した方法」というのがあったので、そこから発展させてみました。ちょっと発想を変えまして…。 (1..9).inject([[1]]) {|c, n| c << eval(c[n - 1].inject("[0+") {|s, k| s + "#{k},#{k}+"} + "0]") }.each {…

injectを使ったパスカルの三角形

id:epicsさんの続・パスカルの三角形を読んで「injectかっこいい」と思い、まねっこします。ただまねっこだとつまらないので、nil.coerceして、変数名もちょっと工夫。 def nil.coerce(number) [number, 0] end (1..9).inject([[1]]) {|choose, n| choose <<…

Rubyで作る無限音階

Rubyで無限音階(Shepard Tone)

selectでフィルタ

filter関数を読んでいるうちに「Rubyでは何だっけ?」と思ってごそごそ調べました。 p "HelloWorld".split(//).select {|c| /^[A-Z]$/ =~ c } #=> ["H", "W"] HaskellではStringは[Char]だけれど、Rubyは違うんだっけ。 HaskellではChar.isUpperだけれど、Ru…

マルチリンガルなシソーラス検索

たとえば、 HaskellのChar.isUpper関数に相当するRubyのメソッドは何だろう Schemeのstring->list関数に対応するRubyのメソッドは何だろう Rubyのsplitメソッドに対応するHaskellの関数は何だろう Rubyの?Aに対応するSchemeの書き方は何だろう といった疑問…

Officeのイルカを動かすRubyスクリプト

カイルっていう名前のイルカを動かすRubyスクリプトだそうです。楽しい。 イルカと遊ぼう ちなみに、DOLPHINをSAEKOにすると冴子先生が空を飛びます。

二次元配列を縦に足す

二次元配列を列方向に処理を読んで作ったプログラム。 ar = Array.new DATA.each { |line| line.chomp!.split(/,/).each_with_index { |item, i| ar[i] or ar[i] = Array.new ar[i] << item.to_i } } p ar #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]] p ar.map {…

Rubyist Hotlinks

角谷さんの好きなメソッド嫌いなメソッドを読んで。 Object#extend Module#includeはクラスへのMixinで、Object#extendはインスタンスへのMixin。 module Rubycolify def rubyco p self.to_s end end s = "Hello" s.extend(Rubycolify) s.rubyco #=> "Hello"…

メソッド名自動生成

Danさんからお題が出ていたのでRubyで書いてみました。(Danさんのこのエントリ、なぜかトラックバックもコメントもできない…)←直っていました。 class AsciiChar def method_missing(method, *args) p "#{method}" if $DEBUG method.to_s.sub(/^_/, "").hex.…

感謝

おそらくこの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_…