ミームの死骸を待ちながら

We are built as gene machines and cultured as meme machines, but we have the power to turn against our creators. We, alone on earth, can rebel against the tyranny of the selfish replicators. - Richard Dawkins "Selfish Gene"

We are built as gene machines and cultured as meme machines, but we have the power to turn against our creators.
We, alone on earth, can rebel against the tyranny of the selfish replicators.
- Richard Dawkins "Selfish Gene"

第2章(前半)

itochanさんに助言され、ソフトバンククリエイティブ社に、新版 C言語によるアルゴリズムとデータ構造Ruby翻訳公開の是非を問うてみた。柴田望洋氏に話を通してくれ、「こころよく許可します」と許可をいただきました。ので、内容にもざくざく触れつつがりがり翻訳していくよ。
例の如く全て見るには「続きを読む」で。

演習2-1 要素内の最小値を求める関数

Arrayクラスを拡張する。sortやらminやら、Rubyは配列を柔軟に扱えていいね。

#引数で好きなだけ数字を要素に取って、(要素数n)その最小値を求めるとする

class Array
  def minof
    a = self.collect{|x| x.to_i}
    a.sort!
    puts "最小の値は#{a.shift}です"
  end
end

ARGV.minof

###############################################

#ていうかよく考えたらこれでいいしorz

p ARGV.collect{|x| x.to_i}.min

###############################################

演習2-2 要素の和を求める

Rubyから入った軟弱似非プログラマとしては、さっきのminメソッドみたいに一気に和を出すメソッドないかなぁとか思ったり。joinの数値版みたいな。id:nakao_mitsuteruさんにご指摘いただきました。優れもののinjectメソッドを使えば一行で済んじゃいます。感動。

class Array
  def sumof

    sum = self.inject{|memo, item| memo.to_i + item.to_i }

#    a = self.collect{|x| x.to_i}
#    sum = 0
#    for i in a
#      sum += i
#    end

    puts "和は#{sum}です"
  end
end

ARGV.sumof

演習2-3 要素の平均値を実数値で求める

さっきのsumof関数利用。requireしようとしたがうまくいかず…

class Array

  def sumof
    a = self.collect{|x| x.to_i}
    @sum = 0
    for i in a
      @sum += i
    end
    return @sum
  end

  def aveof
    sum = self.sumof.to_f
    size = self.size
    print "平均値は "
    printf("%.2f", sum/size)  #ここ覚えとく!
    print " です\n"
  end
end

ARGV.aveof

"%.2f"で小数点以下を指定して出力。覚えとこう

例2-8 整数を2〜36進数に変換

36進数まで?…んー、0-9 + a-zか。

# 引数1,2は各々「変換前の数字」と、「何進数にするか」。

def card_convr(n,m)
  char = %w(0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z)
  result = []
  if n == 0
    print "0は ", m, " 進法にしても 0\n"
  elsif n < 0 || m < 2 || m > 36; print n, " は ", m, " 進数に へんかんできない!"
  else
    n0 = n
    while n > m
      d = n.divmod(m)
      result << char[d[1]]
      n = d[0]
    end
    result << char[n]
    conved = result.reverse.join
    print n0, "を", m, "進数に変換すると ", conved, "\n"
  end
end

card_convr(rand(1000),rand(37))

演習2-4はreverse外せばいけるはず。なので略。
いまさらながら書いてる環境
vimで書いたコードをRDEにコピペしてF5で実行し、確認して保存。
てな形でやってます。

[Life](´・ω・`)

今のやることリストから英語勉強を外した。4ヶ月前までやってた簿記を結構忘れてたので、もうちょい時間つぎ込まんと1級受かりそうもない。優先度で切り捨て。