Entries

「99 Bottles of Beer on the Wall(壁にビールが99本)」

(4/18追記 ようやく成功した)

練習問題でのたうちまわっている。
$ ruby ruby_program.rb
5 bottles of beer on the wall, 5 bottles of beer!
Take one down, pass it around, 4 bottles of beer on the wall!
4 bottles of beer on the wall, 4 bottles of beer!
Take one down, pass it around, 3 bottles of beer on the wall!
3 bottles of beer on the wall, 3 bottles of beer!
Take one down, pass it around, 2 bottles of beer on the wall!
2 bottles of beer on the wall, 2 bottles of beer!
Take one down, pass it around, 1 bottle of beer on the wall!
1 bottle of beer on the wall, 1 bottle of beer!
Take one down, pass it around, no more bottles of beer on the wall!

とかいう感じに出力させたかったのに
無限ループができあがって電池がどんどん減っていく。
以下現在のベストオブ珍解答です。
while true
beer = 5
beer_ageta = beer - 1
puts beer.to_s + 'bottoles of beer on the wall,' + beer.to_s + 'bottles of beer!'
puts 'Take one down,pass it around,'+ beer_ageta.to_s + 'bottles of beer on the wall!'
# beer_agetaが2以上なら−1して繰り返す
if beer_ageta > 2
beer - 1
elsif beer_ageta == 1
break
end
end
puts '1 bottle of beer on the wall,1 bottle of beer!'
puts 'Take one down,pass it around,no more bottles of beer on the wall!'

とにかく壁にあるビールの数を1本ずつ減らして
2本になったら終わらせたいという強い意志しか見えない。

一方本に載ってた解答例です。
num_at_start = 5 #99にかえても可
num_now = num_at_start
while num_now >2
puts num_now.to_s + 'bottoles of beer on the wall,' +
num_now.to_s + 'bottles of beer!'
puts 'Take one down,pass it around,'+
num_now.to_s + 'bottles of beer on the wall!'
end
puts '2 bottles of beer on the wall,2 bottles of beer!'
puts 'Take one down,pass it around,1 bottle of beer on the wall!'
puts '1 bottles of beer on the wall,1 bottle of beer!'
puts 'Take one down,pass it around,no more bottles of beer on the wall!'

並べてみるとなんとなくだめなところがわかる。気がする。
一番だめなところは英語ができないところだと思う。
1bottlesひどい。
とりあえず明日おさらいする。

(4/18追記)
awa:programs drunkennessgod$ ruby calc.rb
5bottoles of beer on the wall,5bottles of beer!
Take one down,pass it around,4bottles of beer on the wall!
4bottoles of beer on the wall,4bottles of beer!
Take one down,pass it around,3bottles of beer on the wall!
3bottoles of beer on the wall,3bottles of beer!
Take one down,pass it around,2bottles of beer on the wall!
2bottoles of beer on the wall,2bottles of beer!
Take one down,pass it around,1bottles of beer on the wall!
1 bottles of beer on the wall,1 bottles of beer!
Take one down,pass it around,no more bottles of beer on the wall!

中身
beer_start = 5
beer = beer_start
# beerが1より大きかったら−1して繰り返す
while beer > 1
puts beer.to_s + 'bottoles of beer on the wall,' + beer.to_s + 'bottles of beer!'
beer = beer - 1
puts 'Take one down,pass it around,'+ beer.to_s + 'bottles of beer on the wall!'
end
puts '1 bottles of beer on the wall,1 bottles of beer!'
puts 'Take one down,pass it around,no more bottles of beer on the wall!'

・反省
書く順番がわからない。まず変数でその次にメソッドとか、多分慣れるしかない。どこからどこまでをループさせたいのかをきちんと考えないとだめ。変数の内容を変更してループさせるときオリジナルと変更後でわけないと無限ループが爆誕するっぽい。1bottlesになってるけどもういいだろ……

もうすこし初心者がやらかしがちな猿レベルの失敗を解説してくれる本がほしい。なんで変数を2つ用意するのか、この位置に変数の減算はさむのはどういう理由があるのか、なぜこういう書き方になるのか理解があいまいなまま完成させるのは気持ちがわるい。無理矢理これはこういうもんだから!って丸呑みするように頑張ってるけど小学校のとき算数きらいだったこと思い出した。多分慣れてきたらファジーな理解が得られるんだろうけど。はやくそこへ至りたい。
関連記事

Appendix

浅野あわわ

PV

CURRENT MOON

SEARCH

EVENT LINK