講評: each も for も同じ使い方ができることに気づいたところが 重要です。Hash 配列は、順番を関係なくデータをしまうので、 出力させると、思ったとおりに出力されません。 ---- 10 月 24 日 第 4 回レポート 「Value が hash 配列のとき」 学籍番号: c106XXXX 氏名: XXXXXXXX 語学クラス: XXXX語選択XX 系: XXXX系 1. A.しりとりを hash 配列 siritori とした。 siritori = {しりとり => りんご, りんご => ごりら, ごりら => らっぱ, らっ ぱ => ぱせり, ぱせり => りす} B."にわとりをかう" にわとり を かう (鶏を飼う) にわとり を かう (鶏を買う) にわ とり を かう (二羽鳥を飼う) にわ とり を かう (二羽鳥を買う) 2.1)strawrich-exist.rb a.考えた設定 浦島太朗の物語の始まりと結末を表示するプログラム。 b.プログラムコード #!/usr/koeki/bin/ruby $KCODE = 'e' ura = {"浦島太郎は亀を助けた" =>"女人が迎えにきた", "女人が迎えにきた" => "舟に乗った", "舟に乗った" => "宮殿に迎えられた", "宮殿に迎えられた" => "姫と3年暮らした", "姫と3年暮らした" => "両親が心配になり帰りたいと申しでた", "両親が心配になり帰りたいと申しでた" => "姫は助けられた亀だと明かした", "姫は助けられた亀だと明かした" => "玉手箱を手渡された", "玉手箱を手渡された" => "元住んでいた浜にたどり着いた", "元住んでいた浜にたどり着いた" => "村が消え果てていた", "村が消え果てていた" => "玉手箱をあけた", "玉手箱をあけた" => "鶴になって飛び去った"} for hajimari in ura.keys if ura.value?(hajimari) == false printf("%s。そして",hajimari) end end for ketumatu in ura.values if ura.key?(ketumatu) == false printf("%s。\n",ketumatu) end end c.変更点 rich.rbをもとに作成した。 d.結果画面 irsv{c106179}% ./strawrich-exist.rb [~/Ruby] 浦島太郎は亀を助けた。そして鶴になって飛び去った。 e.考察 予想通りの結果が得られた。 f.参考HP ・西村先生のHP 第 04 回: Hash 配列と反復 http://roy/~madoka/2007/r2/04/index.html ・浦島太郎 あらすじ『御伽草子』 http://ja.wikipedia.org/wiki/%E6%B5%A6%E5%B3%B6%E5%A4%AA%E9%83%8E 2)hash-while.rb a.考えた設定 それぞれの県の友達に名産について聞くことを繰り返すプログラム。 b.プログラムコード #!/usr/koeki/bin/ruby meisan = {"青森" => ["岩手","わんこそば"], "岩手" => ["秋田","きりたんぽ"], "秋田" => ["宮城","牛タン"], "宮城" => ["山形","さくらんぼ"]} ken = "青森" print("あなたはどの県の名産を食べるか悩んでいます。\n") printf("%s県 の友達に聞いてみることにしました。\n\n",ken) while true if ken == "山形" break end print("あなた: 「あなたの地元の名産はおいしいですか?」\n") printf("%s県 の友達 : 「はい。でも、 %s県 の %s もおいしいと思いますよ。」\n\n",ken,meisan[ken][0],meisan[ken][1]) printf("そこであなたは %s県 の友達に話を聞きました。\n",meisan[ken][0]) ken = meisan[ken][0] end printf("\nあなたは %s県 の名産を食べることにしました。\n",ken) c.変更点 mouse.rbを参考にした。 d.結果画面 irsv{c106179}% ./hash-while.rb [~/Ruby] あなたはどの県の名産を食べるか悩んでいます。 青森県 の友達に聞いてみることにしました。 あなた: 「あなたの地元の名産はおいしいですか?」 青森県 の友達 : 「はい。でも、 岩手県 の わんこそば もおいしいと思いますよ。」 そこであなたは 岩手県 の友達に話を聞きました。 あなた: 「あなたの地元の名産はおいしいですか?」 岩手県 の友達 : 「はい。でも、 秋田県 の きりたんぽ もおいしいと思いますよ。」 そこであなたは 秋田県 の友達に話を聞きました。 あなた: 「あなたの地元の名産はおいしいですか?」 秋田県 の友達 : 「はい。でも、 宮城県 の 牛タン もおいしいと思いますよ。」 そこであなたは 宮城県 の友達に話を聞きました。 あなた: 「あなたの地元の名産はおいしいですか?」 宮城県 の友達 : 「はい。でも、 山形県 の さくらんぼ もおいしいと思いますよ。」 そこであなたは 山形県 の友達に話を聞きました。 あなたは 山形県 の名産を食べることにしました。 e.考察 予想通りの結果が得られた。 f.参考HP 西村先生のHP 第 04 回: Hash 配列と反復 http://roy/~madoka/2007/r2/04/index.html 3)strawrich-each.rb、strawrich-each2.rb a.考えた設定 浦島太郎の物語を表示するプログラム。 同じプログラムを each を使ったプログラムに変更したものも作成した。 b.プログラムコード ※ strawrich-each.rb #!/usr/koeki/bin/ruby ura = Hash.new $KCODE = 'e' ura = {"浦島太郎は亀を助けた" =>"女人が迎えにきた", "女人が迎えにきた" => "舟に乗った", "舟に乗った" => "宮殿に迎えられた", "宮殿に迎えられた" => "姫と3年暮らした", "姫と3年暮らした" => "両親が心配になり帰りたいと申しでた", "両親が心配になり帰りたいと申しでた" => "姫は助けられた亀だと明かした", "姫は助けられた亀だと明かした" => "玉手箱を手渡された", "玉手箱を手渡された" => "元住んでいた浜にたどり着いた", "元住んでいた浜にたどり着いた" => "村が消え果てていた", "村が消え果てていた" => "玉手箱をあけた", "玉手箱をあけた" => "鶴になって飛び去った"} ura.keys{ }.each{ |tarou| tuduki = "浦島太郎は亀を助けた" printf("%s。\n",tuduki) while true if tuduki == "鶴になって飛び去った" break end printf("%s。\n",ura[tuduki]) tuduki = ura[tuduki] end break } ※strawrich-each2.rb #!/usr/koeki/bin/ruby $KCODE = 'e' ura = {"浦島太郎は亀を助けた" =>"女人が迎えにきた", "女人が迎えにきた" => "舟に乗った", "舟に乗った" => "宮殿に迎えられた", "宮殿に迎えられた" => "姫と3年暮らした", "姫と3年暮らした" => "両親が心配になり帰りたいと申しでた", "両親が心配になり帰りたいと申しでた" => "姫は助けられた亀だと明かした", "姫は助けられた亀だと明かした" => "玉手箱を手渡された", "玉手箱を手渡された" => "元住んでいた浜にたどり着いた", "元住んでいた浜にたどり着いた" => "村が消え果てていた", "村が消え果てていた" => "玉手箱をあけた", "玉手箱をあけた" => "鶴になって飛び去った"} tarou = "浦島太郎は亀を助けた" printf("%s。\n",tarou) while true if tarou == "鶴になって飛び去った" break end printf("%s。\n",ura[tarou]) tarou = ura[tarou] end c.変更点 mouse.rbを参考にした。 d.結果画面 ( strawrich-each2.rb の結果画面は省略 ) irsv{c106179}% ./strawrich-each.rb [~/Ruby] 浦島太郎は亀を助けた。 女人が迎えにきた。 舟に乗った。 宮殿に迎えられた。 姫と3年暮らした。 両親が心配になり帰りたいと申しでた。 姫は助けられた亀だと明かした。 玉手箱を手渡された。 元住んでいた浜にたどり着いた。 村が消え果てていた。 玉手箱をあけた。 鶴になって飛び去った。 e.考察 予想通りの結果が得られた。 f.参考HP 西村先生のHP 第 04 回: Hash 配列と反復 http://roy/~madoka/2007/r2/04/index.h 4)hash-doctor.rb a.考えた設定 患者から適当に話を聞き、診断するプログラム。 b.プログラムコード #!/usr/koeki/bin/ruby $KCODE = 'e' kotae = Hash.new STDERR.printf("今日はどうなされましたか?(Ctrl-dで終了)\n") syoujou = gets.chomp while true if /^(\S+)(は|が)(\S+)(ね|の|だ|です|よ|す|ん)/ =~ syoujou hanasi = $1 word = $3 end kotae[word] = hanasi kotae.each{ |sindan| if (kotae.value?(hanasi) == true && sindan[0] != word) printf("%sって%sだね\n",sindan[0],word) print("もう少し詳しく聞かせて下さい。\n") break else printf("では、%sについてもっと話して下さい。\n",sindan[1]) break end } syoujou = gets if syoujou == nil break end syoujou.chomp end print("あなたは風邪ですね。処方箋をだしておきます。\n") c.変更点 chatterbot.rbをもとにした。 d.結果画面 irsv{c106179}% ./hash-doctor.rb [~/Ruby] 今日はどうなされましたか?(Ctrl-dで終了) 頭が痛いです では、頭についてもっと話して下さい。 後頭部がずきずきします では、後頭部についてもっと話して下さい。 あなたは風邪ですね。処方箋をだしておきます。 e.考察 予想通りの結果が得られた。 f.参考HP 西村先生のHP 第 04 回: Hash 配列と反復 http://roy/~madoka/2007/r2/04/index.h 3.感想 hash は順序通りに出力されないので、物語を順序通りに出すにはどうしたらいいか悩んだ。 しかし、授業で作成したrich.rbを参考にし、きちんと順序通りに出力させることができた。 最初は each を使わないで作成したが、 試しに each を使ってみたところ正常に起動した。 同様に for 文を使っても作成できると思う。