Entries

「耳の遠いおばあちゃんのプログラム」

(5/20追記 まだ詰んでる)
(6/6追記 答え合わせ)

また練習問題で詰んでる。
・耳の遠いおばあちゃんのプログラムを書いてみましょう。 おばあちゃんに何を言っても(何をタイプしても)、叫ばない限り (つまり、全部大文字でタイプしない限り)、 は?! もっと大きな声で話しておくれ、坊や! と返事をします。もし叫んだときは、彼女はあなたの言葉を聞いて (少なくとも聞いた気がして)、 いやー、1938年以来ないねー! と大声で返事をします。 プログラムにちょっと真実味 を持たせるため、 1930年から1950年のランダムな数字で毎回違う年を叫ぶようにしましょう。あなたはBYEと叫ぶまでおばあちゃんとの会話から逃れられません。

以下現在の珍解答です。
while true
comment = gets.chomp
comment_dekai = comment.upcase
#大文字なら1930~1950年でランダムな数字を返す
nen_kari = rand(21)
nen = nen_kari + 1930
if comment == comment_dekai
puts 'NO,NOT SINCE ' + nen.to_s + '!'
#大文字じゃないときにループを返す
elsif (comment != comment_dekai && comment != 'BYE')
puts 'HUH!? SPEAK UP,SONNY!!'
elsif comment == 'BYE'
break
end
end

動かしたらとんでもないボケ老人が爆誕した。手に負えない。
awa:programs drunkennessgod$ ruby calc.rb
hey
HUH!? SPEAK UP,SONNY!!
HEY
NO,NOT SINCE 1941!
HEY?
NO,NOT SINCE 1936!
HEY
NO,NOT SINCE 1949!
BYE
NO,NOT SINCE 1943!
BYE
NO,NOT SINCE 1947!
^Ccalc.rb:2:in `gets': Interrupt
from calc.rb:2:in `gets'
from calc.rb:2:in `<main>'

BYEつってんだろ!!!といった感じ。終わらないので殺すしかない。多分論理演算子がおかしい。大文字ならランダムな年数を返す、けど大文字でBYEと言われたときだけ除外したい、これの方法がわからない。載ってないことはやらせないだろうし良心に期待してもうすこし粘る。んー年数作るのとかループとかうまくいったんだけどな、黙らす、絶対黙らす。

(5/20追記)
awa:programs drunkennessgod$ ruby calc2.rb
HELLO,SONNY!
hi
HUH!? SPEAK UP,SONNY!!
HI
NO,NOT SINCE 1930!
HI
NO,NOT SINCE 1949!
BYE
NO,NOT SINCE 1937!
BYE,SWEETIE!

中身
puts 'HELLO,SONNY!'
while true
comment = gets.chomp
if comment == comment.upcase
year = rand(21)+1930
puts 'NO,NOT ' + 'SINCE ' + year.to_s + '!'
else
puts 'HUH!? SPEAK UP,SONNY!!'
end
if comment == 'BYE'
puts 'BYE,SWEETIE!'
break
end
end

少しだけマシになった気がしないでもない。気のせい。やっぱり順番間違っててif,else,elsifの順で書いてずっと怒られてた。順番変えたら怒られなくなったので順番がおかしい、でも順番変えたらbreakしてくれなくなって、breakさせるためにif2つにわけてみたけど結局同じだった。とりあえず何がおかしいのかを探すところから始めなければいけないのは極めて厳しい。小学生のときに無理矢理やらされた宿題みたいなドリルがほしい。ifドリルとwhileドリル。途中で鉛筆の尻を噛みだすとおもう。

(6/6追記)
本に載ってた解答例
puts 'HEY THERE,SONNY!GIVE GRANDMA A KISS!'
while true
said = gets.chomp
if said == 'BYE'
puts 'BYE SWETTIE!'
break
end
if said != said.upcase
puts 'HUH!?SPEAK UP,SONNY!'
else
random_year = 1930 + rand(21)
puts 'NO,NOT SINCE ' + random_year.to_s + '!'
end
end

カンニングして書き直して走らせたやつ
awa:programs drunkennessgod$ ruby calc2.rb
HELLO,SONNY!
hi
HUH!? SPEAK UP,SONNY!!
HI
NO,NOT SINCE 1948!
HI
NO,NOT SINCE 1939!
HI
NO,NOT SINCE 1946!
BYE
BYE,SWEETIE!

中身
puts 'HELLO,SONNY!'
while true
comment = gets.chomp
if comment == 'BYE'
puts 'BYE,SWEETIE!'
break
end
if comment == comment.upcase
year = rand(21)+1930
puts 'NO,NOT ' + 'SINCE ' + year.to_s + '!'
else
puts 'HUH!? SPEAK UP,SONNY!!'
end
end

反省
if、elseとelsifの理解があいまいだった。if条件がtrueなら実行されてそれ以外はすべてelseになる、elseに条件をつける場合はelse if、elsifをつかう。条件はtrueかfalseのどちらかで返ってくることに慣れてないのでしょっちゅうよくわからないことになる。あとプログラムは上から順番に処理していくことをすぐに忘れる。実行する順番がおかしくて動かないとかそういうのもよくやる。上から順にいっこいっこ実行する、総当たりだってのを意識しておきたい。
なにかにつけてプログラミング以前の基本中の基本で引っかかってる。ファミコン初期のクソゲに似たプレイ感がある。
ループ文と条件分岐、相当しつこくやったのでしばらく忘れなさそう。
関連記事

Appendix

浅野あわわ

PV

CURRENT MOON

SEARCH

EVENT LINK