講評: Hash 配列のこの切り取りかたでのプログラムでは、頼りない医者になる ということをきちんと追究出来たプログラムでした。 他のプログラム全ても狙いを理解できています。考察で、自分の入力した 文章を Hash 配列であらわしてあるとよかったですね。 ---- 10 月 24 日 第 4 回レポート 「Value が hash 配列のとき」 学籍番号:c106XXXX 氏名:XXXXXXXX 語学クラス:XXXX語 XX 系:XXXX系 1. 筆記問題 (A). 連続した hash 配列になる 5 対を考えよ。 2文字しりとりを hash 配列 two としました two = {りく => くし, くし => しか, しか => かさ, かさ => ささ, ささ => さと, さと => とり} (B). 自分で創作した文章、あるいは複数の意味をあてることができる文章。 "こぶとりじいさん(3 例)" こぶ とり じいさん (コブ取りじいさん) こぶ とり じいさん (昆布捕りじいさん) こぶとり じいさん (小太りじいさん) 2.プログラムをできるところまで作成せよ。 ● strawrich-exist.rb のプログラム ● a. 考えた設定 ウサギとやぎと男が登場し、話の展開が進んで行くように設定した。そして最 初と最後だけをだすプログラムを考えた。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e' mono = {"ウサギとやぎを飼っている男がいた" =>"2匹を連れて旅に出掛けた", "2匹を連れて旅に出掛けた" => "ウサギはやぎにはなしかけた", "ウサギはやぎにはなしかけた" => "ご飯をちょっとわけてくれませんか??", "ご飯をちょっとわけてくれませんか??" => "・・・・・・(無言)", "・・・・・・(無言)" => "やぎは食いしん坊なので聞こえないふりをした", "やぎは食いしん坊なので聞こえないふりをした" => "ウサギはもう一度やぎに頼んだ", "ウサギはもう一度やぎに頼んだ" => "お腹がすきすぎたウサギは倒れてしまいました", "お腹がすきすぎたウサギは倒れてしまいました" => "それをみた男はウサギにご飯をあげました", "それをみた男はウサギにご飯をあげました" => "ウサギは回復しました", "ウサギは回復しました" => "今度はやぎのご飯がありません", "今度はやぎのご飯がありません" => "あ〜ぁ………ぁ。。", "あ〜ぁ………ぁ。。" => "やぎはため息をついた", "やぎはため息をついた" => "反省をした", "反省をした" => "やぎはウサギに謝った", "やぎはウサギに謝った" => "さっきはゴメンね…", "さっきはゴメンね…" => "ウサギは許しました", "ウサギは許しました" => "ウサギはさっき男にもらったご飯を分けてあげた", "ウサギはさっき男にもらったご飯を分けてあげた" => "やぎはお腹いっぱい食べた", "やぎはお腹いっぱい食べた" => "ウサギと男に感謝した", "ウサギと男に感謝した" => "とても仲良くなった",} for usagi in mono.keys if mono.value?(usagi) == false printf("%s。最終的に",usagi) #最後をださせる end end for yagi in mono.values if mono.key?(yagi) == false printf("%s\n",yagi) end end c. もとにしたプログラムからの変更点 今日授業で使用した "わらしべ長者" をもとに変更しました。 変更した点……変数の変更 d. プログラムを実行した結果画面 irsv{c106048}% ./strawrich-exist.rb [~/Ruby] ウサギとやぎを飼っている男がいた。最終的にとても仲良くなった e. 導き出された結果の考察 最初と最後の文がしっかり表示された。 f. 参考文献 西村まどか先生の基礎プログラミングIIのHP "http://roy/~madoka/2007/r2/04/04-03-hash-rich.html"より ● hash-while.rb のプログラム ● a. 考えた設定 ある森にりすが暮らしていました。ある日リスはドングリの木をみてすごいとお もいました。りすはドングリの木に訪ねました。……どんどんと話しの展開が進み、 最終的にリスに戻ってくるという話しになっています。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby risu = {"ドングリの木" => ["雨","育てる"], #Hash配列の変数をrisuとし、対となる言葉を入力していく "雨" => ["家","さえぎって"], "家" => ["ねずみ","傷めて"], "ねずみ" => ["猫","食べて"], "猫" => ["寒さ","凍えさせて"], "寒さ" => ["子供","吹き飛ばされて"], "子供" => ["リス","優しい気持ちにさせられて"]} sugoi = "ドングリの木" print("ある森にリスが暮らしていた。\n") print("リスはこの世で一番偉いのはだれか考えました。\n") printf("世界一偉いと見込んで%sを訪ねた。\n",sugoi) while true #文の繰り返し if sugoi == "リス" break #文の繰り返しを止めさせる end print("子りす:「太陽のような存在になってもらいたい」\n") printf("%s: 「わたしより偉いのは%s。わたしを%sしまうから」\n",sugoi,risu[sugoi][0],risu[sugoi][1]) printf("そこで子リスは%sに会いに行った。\n",risu[sugoi][0]) sugoi = risu[sugoi][0] end printf("子りすは%sを尊敬した。\n",sugoi) c. もとにしたプログラムからの変更点 今日の授業で学んだ "ねずみの嫁入り" のプログラムをもとにしました。 変更した点……文の変更 変数の変更 d. プログラムを実行した結果画面 irsv{c106048}% ./hash-while.rb [~/Ruby] ある森にリスが暮らしていた。 リスはこの世で一番偉いのはだれか考えました。 世界一偉いと見込んでドングリの木を訪ねた。 子りす:「太陽のような存在になってもらいたい」 ドングリの木: 「わたしより偉いのは雨。わたしを育てるしまうから」 そこで子リスは雨に会いに行った。 子りす:「太陽のような存在になってもらいたい」 雨: 「わたしより偉いのは家。わたしをさえぎってしまうから」 そこで子リスは家に会いに行った。 子りす:「太陽のような存在になってもらいたい」 家: 「わたしより偉いのはねずみ。わたしを傷めてしまうから」 そこで子リスはねずみに会いに行った。 子りす:「太陽のような存在になってもらいたい」 ねずみ: 「わたしより偉いのは猫。わたしを食べてしまうから」 そこで子リスは猫に会いに行った。 子りす:「太陽のような存在になってもらいたい」 猫: 「わたしより偉いのは寒さ。わたしを凍えさせてしまうから」 そこで子リスは寒さに会いに行った。 子りす:「太陽のような存在になってもらいたい」 寒さ: 「わたしより偉いのは子供。わたしを吹き飛ばされてしまうから」 そこで子リスは子供に会いに行った。 子りす:「太陽のような存在になってもらいたい」 子供: 「わたしより偉いのはリス。わたしを優しい気持ちにさせられてしまうから」 そこで子リスはリスに会いに行った。 子りすはリスを尊敬した。 e. 導き出された結果の考察 key と value がぐるぐる回るパターンを実行させることに成功した。 f. 参考文献 西村まどか先生の基礎プログラミングIIのHP "http://roy/~madoka/2007/r2/04/index.html" より ● strawrich-each.rb のプログラム ● a. 考えた設定 話しを全部出力させるプログラムにしたいと考え、keyとvalueの両方がでてこな いようにさせるように考えました。また、秒数を文ごとに入れていき、読みやす いように設定させるように考えました。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e' #日本語モードに切り替え mono = {"ウサギとやぎを飼っている男がいた" =>"2匹を連れて旅に出掛けた", "2匹を連れて旅に出掛けた" => "ウサギはやぎにはなしかけた", "ウサギはやぎにはなしかけた" => "ご飯をちょっとわけてくれませんか??", "ご飯をちょっとわけてくれませんか??" => "・・・・・・(無言)", "・・・・・・(無言)" => "やぎは食いしん坊なので聞こえないふりをした", "やぎは食いしん坊なので聞こえないふりをした" => "ウサギはもう一度やぎに頼んだ", "ウサギはもう一度やぎに頼んだ" => "お腹がすきすぎたウサギは倒れてしまいました", "お腹がすきすぎたウサギは倒れてしまいました" => "それをみた男はウサギにご飯をあげました", "それをみた男はウサギにご飯をあげました" => "ウサギは回復しました", "ウサギは回復しました" => "今度はやぎのご飯がありません", "今度はやぎのご飯がありません" => "あ〜ぁ………ぁ。。", "あ〜ぁ………ぁ。。" => "やぎはため息をついた", "やぎはため息をついた" => "反省をした", "反省をした" => "やぎはウサギに謝った", "やぎはウサギに謝った" => "さっきはゴメンね…", "さっきはゴメンね…" => "ウサギは許しました", "ウサギは許しました" => "ウサギはさっき男にもらったご飯を分けてあげた", "ウサギはさっき男にもらったご飯を分けてあげた" => "やぎはお腹いっぱい食べた", "やぎはお腹いっぱい食べた" => "ウサギと男に感謝した", "ウサギと男に感謝した" => "とても仲良くなった",} for usagi in mono.keys #for文で繰り返し hanasi = "ウサギとやぎを飼っている男がいた" printf("むか〜しむか〜し〜%s\n",hanasi) sleep 2 #文字のでてくる秒数を指定する while true if hanasi == "とても仲良くなった" break end printf("%s\n",mono[hanasi]) sleep 2 hanasi = mono[hanasi] end break #繰り返しを止める end c. もとにしたプログラムからの変更点 変更した点……変数の変更。 sleep 2 を入れたことにより秒数を指定した。 printf("むか〜しむか〜し〜%s\n",hanasi)と入力させた結果、 実行画面にしっかり表示された。 hanasi = "ウサギとやぎを飼っている男がいた"と、入力して Hashの始まりの文を意味させることに成功した。 d. プログラムを実行した結果画面 irsv{c106048}% ./strawrich-each.rb [~/Ruby] むか〜しむか〜し〜ウサギとやぎを飼っている男がいた 2匹を連れて旅に出掛けた ウサギはやぎにはなしかけた ご飯をちょっとわけてくれませんか?? ・・・・・・(無言) やぎは食いしん坊なので聞こえないふりをした ウサギはもう一度やぎに頼んだ お腹がすきすぎたウサギは倒れてしまいました それをみた男はウサギにご飯をあげました ウサギは回復しました 今度はやぎのご飯がありません あ〜ぁ………ぁ。。 やぎはため息をついた 反省をした やぎはウサギに謝った さっきはゴメンね… ウサギは許しました ウサギはさっき男にもらったご飯を分けてあげた やぎはお腹いっぱい食べた ウサギと男に感謝した とても仲良くなった e. 導き出された結果の考察 sleep を入れたことにより文が読みやすくなった。 printf("むか〜しむか〜し〜%s\n",hanasi)と入力させた結果、実行画面にしっかり表示された。 hanasi = "ウサギとやぎを飼っている男がいた"と、入力してHashの始まりの文 を意味させることに成功した。 ● hash-doctor.rb のプログラム ● a. 考えた設定 初めに乱数を使い、あいさつを表示させるようにプログラムを入力させ、症状を 訪ねる時も乱数を使い3つの言葉から適当にでてくるように設定した。 b. 作成したプログラムコードそのもの #!/usr/koeki/bin/ruby $KCODE = 'e' #日本語コードにする yabu = Hash.new srand kotoba = rand(3) #srandによって3つの言葉から適当に一つを選ぶ aisatu = ["おはようございます","こんにちは","こんばんは"] printf("%s!!今日はどんな具合ですか??\n",aisatu[kotoba]) kaze = gets.chomp if /(\S+)(が)(\S+)(のこと|だ|です)/ =~ kaze wadai = $1 syouzyou = $3 end while true #繰り返し srand kotoba2 = rand(3) #srandによって3つの言葉から適当に一つを選ぶ aisatu2 = ["の調子はどうかい??","について具体的に教えてください","についてもっと話してください"] STDERR.printf ("%s%s\n",wadai,aisatu2[kotoba2]) kaze = gets if kaze == nil #Ctr-l Dで終了する break end kaze.chomp if /^(\S+)(から|です|します|が|の|で|を|だ|も|こと|の|し)/ =~ kaze yabu[$1] = wadai yabu.each{|talk| #文字列を分解してHashに入れる if wadai == talk[1] if yabu[wadai] == nil break else printf("%sの症状は%sですね★\n",yabu[wadai],talk[1]) end end } wadai = syouzyou syouzyou = $1 end end print("お大事に……!!!!\n") c. もとにしたプログラムからの変更点 今日授業で学んだ"人工無能"プログラムから変更しました。 変更した点……乱数をいれて、毎回言葉を違うくなるように変更した。 if kaze == nil を入力してCtr-l Dで終了するように変更した。 d. プログラムを実行した結果画面 irsv{c106048}% ./hash-doctor.rb [~/Ruby] こんにちは!!今日はどんな具合ですか?? 喉が痛いです 喉について具体的に教えてください ヒリヒリします 痛いについてもっと話してください 赤く腫れています 痛いについて具体的に教えてください 声をだすことが難しいです ヒリヒリの調子はどうかい?? ご飯を飲み込むことが大変です 喉の症状はヒリヒリですね★ 声をだすことが難しいの調子はどうかい?? 会話をすることが出来ません 痛いの症状は声をだすことが難しいですね★ ご飯を飲み込むことが大変について具体的に教えてください お大事に……!!!! e. 導き出された結果の考察 プログラム通りに実行した。 srand を入力させたらしっかりと実行された。 変数の間違いや入力ミスに気を付けなければならないと学んだ。 f. 参考文献 西村まどか先生の基礎プログラミングIIのHP "http://roy/~madoka/2007/r2/04/04-05-hash-chatterbot.html"より 3. 感想。 今回のプログラム作成にはかなりの時間と頭をひねさせられました。 hash-doctor.rb のプログラムでは、日本語の文の繋がりと、文の繰り返しを妨 げることに苦労したけれど、ちょっとした入力ミスで実行した時に文が変になる というところを理解できました。来週も頑張ります。