Hatena::Grouprubyist

krystal: プログラミング超初心者(文系)

2008-11-06 (Thu)Ruby写経+練習問題を解く

Ruby+プログラミング超初心者(文系)ということで、写経することから勉強します。

参考:プログラミング入門 - Rubyを使って -

8. メソッドの作り方

写経

def double_this(num)
  twice = num * 2
  puts num.to_s + " の 2 倍は " + twice.to_s + " です。"
end
double_this(33)
double_this(100)
puts twice.to_s  #twiceはローカル変数だから、メソッドの内部でしか(外からは)使えない。
def little_pest(var)
  var = nil
  puts "ハハ!お前の変数は破壊したぜ!"
end

var = "君はこの変数に手を触れることはできない!"
little_pest(var)
puts var
return_value = puts"この puts が返しているのは:"
puts return_value  #putsは常にnilを返す
def say_moo(num)
  puts "もぉ~~" * num
  "牛乳を飲もう~"
end

x = say_moo(2)
puts x
def ask(question)
  good_answer = false  
  while (not good_answer)
    puts question
    reply = gets.chomp.downcase
    
    if (reply == "yes" or reply == "no")
      good_answer = true
      if reply == "yes"
        answer = true
      else
        answer = false
      end
    else
      puts '"yes"か"no"かでお答えください。'
    end
  end
  
  answer
end

puts "こんにちは、私の実験のために..."
puts

ask "タコスは好きですか?"
ask "ブリートは好きですか?"
wets_bed = ask "ベッドを濡らしますか?"
ask "チミチャンガは好きですか?"
ask "タマーレは好きですか?"
puts "さらにいくつか質問を重ねます..."
ask "オルチャタを飲むのは好きですか?"
ask "フラウタスは好きですか?"

puts
puts "デブリーフィンブ:"
puts "ご協力感謝します..."
puts
puts wets_bed
def num_in_english(number)
  if number < 0
    return "負でない数を入力してください。"
  end
  if number == 0
    return "zero"
  end
  
  output = ""
  ones_place = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
  tens_place = ["ten", "twenty", "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety"]
  teenagers = ["eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
  
  remain = number
  write = remain/100
  remain = remain - write*100
  
  if write > 0
    hundred = num_in_english(write)
    output = output + hundred + " hundred"    
    if remain > 0
      output = output + " "
    end
  end
  
  write = remain/10
  remain = remain - write*10
  
  if write > 0
    if ((write == 1) and (remain > 0))
      output = output + teenagers[remain-1]
      remain = 0  #teenagersで1の位にも対応してくれるから1の位を出力させない。そうでないと、例)eleven oneになる。
    else
      output = output + tens_place[write-1]
    end
    if remain > 0
      output = output + " "
    end
  end
  
  write = remain
  remain = 0
  
  if write > 0
    output = output + ones_place[write-1]
  end
  output
end

puts num_in_english(0)
puts num_in_english(7)
puts num_in_english(11)
puts num_in_english(16)
puts num_in_english(34)
puts num_in_english(56)
puts num_in_english(88)
puts num_in_english(99)
puts num_in_english(100)
puts num_in_english(101)
puts num_in_english(234)
puts num_in_english(4634)
puts num_in_english(888888)
puts num_in_english(1000000000000)

練習

0-100までの数字を出力して、0何個あるかを数える。
i = 0
while i < 101
  puts i
  i += 1
end

arr = []
while /0|.0|.0.|..0/ =~ i.to_s #ここの問題か?
  arr << i
  i += 1
end

print "0の個数は:" + arr.length.to_s + "です。"

#値は合ってない。12のはずだが、なぜか10個しか出てこない。正規表現の使い方が間違ってる?
写経した「数字を英語発音にする」内容の改良
#ちゃんと表示されない数値いっぱいある
#重複が多い。うぅ!
def num_in_english(number)
  if number < 0
    return "負でない数を入力してください。"
  end
  if number == 0
    return "zero"
  end
  
  output = ""
  ones_place = ["one", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
  tens_place = ["ten", "twenty", "thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety"]
  teenagers = ["eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]
  
  remain = number
  write = remain/1000000
  remain = remain - write*1000000

  if write > 0
    output = output + ones_place[write-1] + " million"
    if remain > 0
      output = output + " "
    end
  end
  
  write = remain/1000
  remain = remain - write*1000

  if write > 0
    output = output + ones_place[write-1] + " thousand"
    if remain > 0
      output = output + " "
    end
  end
  
  write = remain/100
  remain = remain - write*100
  
  if write > 0
    output = output + ones_place[write-1] + " hundred"    
    if remain > 0
      output = output + " and "
    end
  end
  
  write = remain/10
  remain = remain - write*10
  
  if write > 0
    if ((write == 1) and (remain > 0))
      output = output + teenagers[remain-1]
      remain = 0  #teenagersで1の位にも対応してくれるから1の位を出力させない。そうでないと、例)eleven oneになる。
    else
      output = output + tens_place[write-1]
    end
    if remain > 0
      output = output + " "
    end
  end
  
  write = remain
  remain = 0
  
  if write > 0
    output = output + ones_place[write-1]
  end
  output
end

puts num_in_english(0)
puts num_in_english(7)
puts num_in_english(11)
puts num_in_english(16)
puts num_in_english(34)
puts num_in_english(56)
puts num_in_english(88)
puts num_in_english(99)
puts num_in_english(100)
puts num_in_english(101)
puts num_in_english(234)
puts num_in_english(4634)
puts num_in_english(8888)
puts num_in_english(6000000)

達人は短い行数で作れたのにな...

メソッドを作りましたっけ?

kalzekalze2008/11/07 19:28Ruby知らないのだけど。
練習「0-100までの数字を出力して、0何個あるかを数える。」のコメントに反応
arr = []
の後のwhileが全部意図したことと違うんじゃないかな
最初のwhileでiが1~100になってその間表示してる。
101になってwhile抜ける(初期化していないのでi=101)
で、次のwhileループ
101から110までは0が含まれるからwhileは真で、arrには101~110までの10個の数字が入っている
111になったときにwhileの条件式が偽になるので、while終了
なので最後は10になる

ちなみに、0の数ではなく、0が含まれる数の数だね(0の数というのであれば、100の時は2個とカウントすべき)

krystalkrystal2008/11/10 11:43kalzeさん、コメントありがとうございます!
本当ですね!
p arr
で見てみたら、中身は確かにそうなってました!

ちょっと修正しました。
>|ruby|
arr = []
for i in 0..100
if /0/ =~ i.to_s
arr << i
end
end
p arr
print arr.length
||<
しかしこれだと、0が含まれる数を数えることになるので、意図(0の個数を数えたい)と違います。
もうちょっと考えます。

krystalkrystal2008/11/10 11:45えっ!コメントでは「はてな記法」が使えないの~~~!?

rochefortrochefort2008/11/10 22:41re:数字を英語発音にする
やってみました。よかったらどうぞ。
http://rubyist.g.hatena.ne.jp/rochefort/20081109

krystalkrystal2008/11/11 15:30> rochefortさん
コメントありがとうございます!
では、そちらにお邪魔します^^