講評: 今週のレポートは何だか光っていました。 講義でこのくらいいつも集中していると、 このようなレポートが書けるのではないかと思います。 ---- 10 月 24 日 第 4 回レポート 「Value が hash 配列のとき」 学籍番号 : c106XXXX 氏名 : XXXXXXXX 語学クラス : XXXX語クラス 系 : XXXX系 -------------------------------------------------------------- 1 A ポケモンしりとりを hash 配列 poke としました。 poke = {アチャモ =>モンジャラ , モンジャラ =>ラプラス, ラプラス=> ストライク, ストライク =>クラブ, クラブ =>ブラッキー, ブラッキー =>キルリア....} http://www.weblio.jp/content/%E4%BA%94%E5%8D%81%E9%9F%B3%E9%A0%86%E3%81%AE%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3%E4%B8%80%E8%A6%A7 B わかち文 おんだんかぼうしかいぎ おんだん かぼうし かいぎ ( 温暖 過防止 会議 ) おんだんかぼうしか いぎ ( 温暖化防止か 異議 ) おんだんか ぼうし かいぎ ( 温暖か 某氏 懐疑 ) おん だんか ぼうし かいぎ ( 怨 檀家 暴死 怪疑 ) おんだんか ぼうし かいぎ ( 音団家 帽子 会議 ) きみはしらないのかい? きみは しらないのかい? ( 君は 知らないのかい? ) きみ はしらないのかい? ( 君 走らないのかい? ) きみ はしら ないのかい? ( 君 柱 ないのかい? ) みんなもうじゅうかったか? みんな もう じゅうかったか? ( みんな もう 銃を買ったか? ) みんな もうじゅうかったか? ( みんな 猛獣を飼ったか? ) http://www.sutv.zaq.ne.jp/shirokuma/nag971012.html からと、創作文です。 -------------------------------------------------------------------- 2 A ●考えた設定 シンデレラストーリーの結論だけを表示するプログラム strawrich-exist.rb ●プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' yume = { "シンデレラは、一人だった" =>"シンデレラの母は、死んだ", "シンデレラの母は、死んだ" =>"継母にイジメられた", "継母にイジメられた" => "シンデレラは、舞踏会にいけない", "シンデレラは、舞踏会にいけない" => "悲しくて泣いていた", "悲しくて泣いていた" => "魔法使いが出てきた", "魔法使いが出てきた" => "魔法をかけた", "魔法をかけた" => "シンデレラは、変身した", "シンデレラは、変身した" => "お城に出かけた", "お城に出かけた" => "王子様にであった", "王子様にであった" => "一緒に踊った", "一緒に踊った" => "楽しい時間は、すぐに過ぎていった", "楽しい時間は、すぐに過ぎていった" => "12時になった", "12時になった" => "魔法が消えるので、走って帰った", "魔法が消えるので、走って帰った" => "急いでいたため、ガラスの靴が片方ぬげた", "急いでいたため、ガラスの靴が片方ぬげた" => "王子は、靴を拾った", "王子は、靴を拾った" => "靴は、めちゃめちゃサイズが小さかった", "靴は、めちゃめちゃサイズが小さかった" => "王子は、靴の持ち主を探した", "王子は、靴の持ち主を探した" => "シンデレラが見つかった", "シンデレラが見つかった" => "王子と一緒に幸せに暮らした",} #keys(左側)=>value(右側) for mahou in yume.keys #yume.keys(左側)をmahou変数に入れる if yume.value?(mahou) == false #もし、value(右側)が、keys(左側)と対応しなかったら、 #同じ文章が右側と、左側でなかったら、 printf("%s。そして",mahou) #表示させる end end for kabotya in yume.values #yume.values(右側)をkabotya変数に入れる if yume.key?( kabotya) == false #もし、value(右側)が、keys(左側)と対応しなかったら、 #同じ文章が右側と、左側でなかったら、 printf("%s\n", kabotya) #表示させる end end ●もとにしたプログラムからの変更点 keys(左側)value(右側)の内容 変数の変更 ●実行結果 irsv{c106090}% ./strawrich-exist.rb [~/Ruby] シンデレラは、一人だった。そして王子と一緒に幸せに暮らした ●参考文献 http://roy/~madoka/2007/r2/04/04-03-hash-rich.html -------------------------------------------------------------------------- B ●考えた設定 家族にお金を借りようとしたときのエンドレスストーリーのプログラム hash-while.rb ●作成したプログラムコードそのもの #!/usr/koeki/bin/ruby kazoku = {"お父さん" => ["お母さん","お父さんの財布も持っている"], "お母さん" => ["おじいちゃん","年金があるんだ"], "おじいちゃん" => ["孫","バイトして稼いでいる"] } # kazoku という Hash の中に keys(右側) value(左側)がある tarori = "お父さん" # tarori という変数に お父さん を入れてはじまる print("\nある日、あたしは、とっても欲しい物ができた。\n") print("\nどうしても買いたいあたしは、\n") print("\n援助(金)をもとめて、家族を頼った。\n") printf("\n%sのところに、かりに行った。\n",tarori) while true if tarori == "孫" break # tarori が、孫になったら、終わる end print("\nあたし:「ちょっとお金かして欲しいんだけど…」\n") printf("\n%s: 「%sにかしてもらいなさい。%sから」\n",tarori,kazoku[tarori][0],kazoku[tarori][1]) # kazoku[tarori][0] keys(お父さん)のvalue(お母さん) # kazoku[tarori][1] keys(お父さん)のvalue(お父さんの財布も持っている) # のように、繰り返すから、上から順番に入れて行く printf("\nそこで、あたしは%sに助けをもとめた。\n",kazoku[tarori][0]) tarori = kazoku[tarori][0] end printf("\n結局 %s = あたし が、お金を持っているらしかった。\n",tarori) ●もとにしたプログラムからの変更点 keys(左側)value(右側)の内容 変数の変更 ●プログラムを実行した結果画面 irsv{c106090}% ./hash-while.rb [~/Ruby] ある日、あたしは、とっても欲しい物ができた。 どうしても買いたいあたしは、 援助(金)をもとめて、家族を頼った。 お父さんのところに、かりに行った。 あたし:「ちょっとお金かして欲しいんだけど…」 お父さん: 「お母さんにかしてもらいなさい。お父さんの財布も持っているから」 そこで、あたしはお母さんに助けをもとめた。 あたし:「ちょっとお金かして欲しいんだけど…」 お母さん: 「おじいちゃんにかしてもらいなさい。年金があるんだから」 そこで、あたしはおじいちゃんに助けをもとめた。 あたし:「ちょっとお金かして欲しいんだけど…」 おじいちゃん: 「孫にかしてもらいなさい。バイトして稼いでいるから」 そこで、あたしは孫に助けをもとめた。 結局 孫 = あたし が、お金を持っているらしかった。 ●参考文献 http://roy/~madoka/2007/r2/04/04-04-hash-in-hash.html ------------------------------------------------------------------------ C ●考えた設定 シンデレラストーリーの結論だけでなく過程も表示するプログラム strawrich-each.rb ●作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e' yume = {"シンデレラは、一人だった" => "シンデレラの母は死んだのだ", "シンデレラの母は死んだのだ" => "継母にイジメられた", "継母にイジメられた" => "シンデレラは、舞踏会にいけない", "シンデレラは、舞踏会にいけない" => "悲しくて泣いていた", "悲しくて泣いていた" => "魔法使いが出てきた", "魔法使いが出てきた" => "魔法をかけた", "魔法をかけた" => "シンデレラは、変身した", "シンデレラは、変身した" => "お城に出かけた", "お城に出かけた" => "王子様にであった", "王子様にであった" => "一緒に踊った", "一緒に踊った" => "楽しい時間は、すぐに過ぎていった", "楽しい時間は、すぐに過ぎていった" => "12時になった", "12時になった" => "魔法が消えるので、走って帰った", "魔法が消えるので、走って帰った" => "急いでいたため、ガラスの靴が片方ぬげた", "急いでいたため、ガラスの靴が片方ぬげた" => "王子は、靴を拾った", "王子は、靴を拾った" => "靴は、めちゃめちゃサイズが小さかった", "靴は、めちゃめちゃサイズが小さかった" => "王子は、靴の持ち主を探した", "王子は、靴の持ち主を探した" => "シンデレラが見つかった", "シンデレラが見つかった" => "王子と一緒に幸せに暮らした"} # keys(左側)=>value(右側) yume.keys.each{ |mahou| # yume.keys(左側)で、keyの並んだ配列を、mahouに代入 if yume.value?(mahou) == false # もし、value(右側)が、keys(左側)と対応しなかったら、 # 同じ文章が右側と、左側でなかったら、 printf("\n%s なぜなら、%s\n",mahou, yume[mahou]) # 表示させる ouji = yume[mahou] # ouji変数に、yume 配列 mahou を代入 # yume[mahou] のままだと、while true が、上手く動かない while true if yume.key?(ouji) == false # もし、value(右側)が、keys(左側)と対応しなかったら、 # 同じ文章が右側と、左側でなかったら、おわる。 break else garasu = ouji kutu = yume[ouji] # while true が、上手く動かないため kutu と、garasuに代入する # value(右側)が、keys(左側)と対応したら、繰り返す printf("\n%s そして、%s\n", garasu,kutu) ouji = kutu end end end } ●もとにしたプログラムからの変更点 each文は、1回しか繰り返してくれないため、2回目以降の検索用に、while文を入れた keys(左側)value(右側)の内容 変数の変更 ●プログラムを実行した結果画面 irsv{c106090}% ./strawrich-each.rb [~/Ruby] シンデレラは、一人だった なぜなら、シンデレラの母は死んだのだ シンデレラの母は死んだのだ そして、継母にイジメられた 継母にイジメられた そして、シンデレラは、舞踏会にいけない シンデレラは、舞踏会にいけない そして、悲しくて泣いていた 悲しくて泣いていた そして、魔法使いが出てきた 魔法使いが出てきた そして、魔法をかけた 魔法をかけた そして、シンデレラは、変身した シンデレラは、変身した そして、お城に出かけた お城に出かけた そして、王子様にであった 王子様にであった そして、一緒に踊った 一緒に踊った そして、楽しい時間は、すぐに過ぎていった 楽しい時間は、すぐに過ぎていった そして、12時になった 12時になった そして、魔法が消えるので、走って帰った 魔法が消えるので、走って帰った そして、急いでいたため、ガラスの靴が片方ぬげた 急いでいたため、ガラスの靴が片方ぬげた そして、王子は、靴を拾った 王子は、靴を拾った そして、靴は、めちゃめちゃサイズが小さかった 靴は、めちゃめちゃサイズが小さかった そして、王子は、靴の持ち主を探した 王子は、靴の持ち主を探した そして、シンデレラが見つかった シンデレラが見つかった そして、王子と一緒に幸せに暮らした ●参考文献 http://roy/~madoka/2007/r2/04/04-03-hash-rich.html -------------------------------------------------------------------------- D ●考えた設定 なんちゃってお医者様のプログラム hash-doctor.rb ●作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e' doctor = Hash.new STDERR.printf("今日は、どうしましたか?\n") syoujyou = gets.chomp while true if /^(\S+)(は|が|を|に|も)(\S+)(ね|の|だ|で|て|な|の|こと|の)/ =~ syoujyou kiken = $1 yabu = $3 end doctor[yabu] = kiken # どちらを切り出したいか考える # yabuと kikenを入れ替えるとcheck[0]に入るものと、 # yabuに入るものが一緒になり表示の際に変化がある doctor.each{ |check| if (doctor.value?(kiken) == true && check[0] != yabu) # もし、check[0]と、yabuが、一緒だった時に、(下が)表示され、 # エンドレスに質問が続く printf("%sっていうのは%sですね\n",check[0], yabu) print("他に気になるところは、ありますか?\n") break else printf("%sと言うのは、どういうことですか?\n",check[1]) break end } syoujyou = gets.chomp end ●もとにしたプログラムからの変更点 変数の変更 正規表現の語数を増やした ●プログラムを実行した結果画面 irsv{c106090}% ./hash-doctor.rb [~/Ruby] 今日は、どうしましたか? 捻挫が治らないんです 捻挫と言うのは、どういうことですか? 捻挫は足が腫れているってことです 治らないんっていうのは腫れているってことですね 他に気になるところは、ありますか? 肩も痛いんです 治らないんっていうのは痛いんですね 他に気になるところは、ありますか? 偏頭痛も時々あるんです 治らないんっていうのは時々あるんですね 他に気になるところは、ありますか? ニキビ 後が痛いんです 治らないんっていうのは時々あるんですね 他に気になるところは、ありますか? 疲れが溜まるんです 治らないんっていうのは溜まるんですね 他に気になるところは、ありますか? あくびが止まらないんです 治らないんっていうのは止まらないんですね 他に気になるところは、ありますか? ( …エンドレス) ●参考文献 http://roy/~madoka/2007/r2/04/04-05-hash-chatterbot.html -------------------------------------------------------------- 3 感想 わかち書きは、ネットでは、なぎなた(ぎなた)読みとして、けっこう出ていた。 考え出すと、けっこうおもしろかった!! strawrich-each.rb の ところで、あらかじめプログラムに登録してある対に、 句読点や、スペースをつけたら、表示順が変化した。 なぜだか解らないので、句読点とスペースを、とりました。 もう1つは、1行目の比較のときに、key と value が、 同じだった場合 1行目に表示される 文章が、繰り下がって表示されたのを 直すのに苦労した。