講評: 行の少ないプログラム作成においては、 プログラミングの技術というよりはむしろ、 文章を整頓したりしなくてはならないという推敲の点で、 工夫が必要になってきます。 ---- 10 月 24 日 第 4 回レポート 「Value が hash 配列のとき」 学籍番号 :c106XXXX 氏名 :XXXXXXXX 語学クラス:XXXX語 系 :XXXX系 1、筆記問題 A、 連続した hash 配列になる 5 対。 私の好きなラーメン店を hash 配列 haraheri としました。 おいしい味つながり。 haraheri = { 一番屋 => 麻婆ラーメン, 麻婆ラーメン => 菜花, 菜花 => 天津 飯, 天津飯 => せいか楼, せいか楼 => レバニラ } B、 "すももももももかわらない"(例5) すもも も もも も かわらない (李も桃も変わらない) すもも も も も も か わらない (李も喪も藻か割らない) すもも も もも も かわらない (李も桃も代わらない) す も も も もも も かわらない (酢も藻も桃も変わらない) す も もも も も も かわらない (巣も桃も藻も代わらない) 2、 ( 1 ) 勘違いをして、三段論法で結論を表示させるものを作ってしまったのですが、消すの も悔しいため、レポートとして残しておきました。 ●a、考えた設定 あらかじめプログラムに登録してある対のうち、結論を表示するもの。 食品はラーメン屋を対象にした。 ●b、作成したプログラムコード strawrich-each.rb ●プログラム本体 #!/usr/koeki/bin/ruby uma =Hash.new # 前提を代入する Hash 配列 miso = "菜花" sio = "麻婆ラーメン" uma[miso] = sio # 大前提 miso2 = "一番屋" sio2 = "菜花" # 小前提 uma[miso2] = sio2 if uma.value?(miso) == true # 同じ文字列が key と value にあるかどう か調べている # hash配列.values?("文字列") value に "文字列" が存在するかどう か printf("ラーメンと言えば%sの%s\n",miso,uma[miso]) printf("%sと並ぶといえば%s\n",miso2,uma[miso2]) printf("ゆえに%sの%sはうまい!!\n", miso2,uma[miso]) end # miso や、uma[miso]など、それぞれ順番に変 数の部分にしまわれる。 ●c、もとにしたプログラムからの変更点 三段論法より、変数を変え、言葉を適切なものに変えた。 ●d、 プログラムを実行した結果画 irsv{c106029}% ./strawrich-each.rb [~/Ruby] ラーメンと言えば菜花の麻婆ラーメン 一番屋と並ぶといえば菜花 ゆえに一番屋の麻婆ラーメンはうまい!! ●e 、導き出された結果の考察 表示される文字の順番は指定してあるので、適切な文に変更が効くので、表現 をきちんとできることが改めてわかった。 正しい場合は、trueとかえされ、falseの場合のパターンも付ければ良いと思っ た。 ●f、参考文献 西村まどか先生のHP:「三段論法」より http://roy/~madoka/2007/r2/04/04-02-syllogism.html ( 2 ) ●a、考えた設定 あらかじめプログラムに登録してある対のうち、結論だけを表示するもの。 ストーリーの内容としては、あるおばあちゃんがラーメンつくりの旅に出て、 結果、おいしいラーメンを作れたというものだ。 ●b、作成したプログラムコード strawrich-exist.rb ●プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で出力する # Hash 配列を men と定義する # Hash 配列 = {"key_1" => "value_1", "key_2" =>"value_2", ...} # いくつも 1 行で書き込む方法 men = {"あるところにおばあちゃんがいた" =>"ラーメンの旅に出た", "ラーメンの旅に出た" => "たくさんの店をまわった", "たくさんの店をまわった" => "足腰にひびいた", "足腰にひびいた" => "湯治に行った", "湯治に行った" => "田田のマイナスイオンルームが素敵だった", "田田のマイナスイオンルームが素敵だった" => "三川町が好きになった", "三川町が好きになった" => "お腹が空いた", "お腹が空いた" => "持っていたおにぎりを食べた", "持っていたおにぎりを食べた" => "自家製の梅干しを持っていた", "自家製の梅干しを持っていた" => "それを見ていた男性が話しかけてきた", "それを見ていた男性が話しかけてきた" => "「私にその梅干しを譲ってくれませんか?」", "「私にその梅干しを譲ってくれませんか?」" => "何のために使うのか訪ねてみた", "何のために使うのか訪ねてみた" => "私のラーメン店で使いたいのです", "私のラーメン店で使いたいのです" => "そこで一緒に行ってみることにした", "そこで一緒に行ってみることにした" => "その店のラーメンを食べるとおいしかった", "その店のラーメンを食べるとおいしかった" => "「一緒にラーメンを作りませんか?」", "「一緒にラーメンを作りませんか?」" => "その店で梅干しラーメンを作る決意をした", "その店で梅干しラーメンを作る決意をした" => "が、ラーメンと梅干しの相性は最悪だった", "が、ラーメンと梅干しの相性は最悪だった" => "新に旅に出た", "新に旅に出た" => "おいしいスープの店に出会った", "おいしいスープの店に出会った" => "そこで勉強をさせてもらった", "そこで勉強をさせてもらった" => "そして、ついに自信作ができた", "そして、ついに自信作ができた" => "「塩梅梅ラーメン」の完成だ", "「塩梅梅ラーメン」の完成だ" => "老若男女に大繁盛した", "老若男女に大繁盛した" => "健康ブームの先駆けとなったラーメンを作った人物だったのだ"} for sobo in men.keys if men.value?(sobo) == false # hash配列.values?("文字列") value に "文字列" が存在するかどうか printf("%s。そして",sobo) end end # for キー名, in 値 ハッシュ配列名 for umebosi in men.values if men.key?(umebosi) == false # hash配列.key?("文字列") key に "文字列" が存在するかどうか printf("%s\n",umebosi) end # 結論は key, value に重複していない文 字列によって構成される end ●c、もとにしたプログラムからの変更点 rich.rb から、変数と、ストーリーの変更。 ●d、 プログラムを実行した結果画 irsv{c106029}% ./strawrich-exist.rb [~/Ruby] あるところにおばあちゃんがいた。そして健康ブームの先駆けとなったラーメンを作った人物だったのだ ●e 、導き出された結果の考察 変数をきちんと指定することにより、すっぱりと表示することが出来た。 説明はしてみたものの、最初と最後が表示されるのは、最初にバリューで出だ しの文をとってきて、最後にキーで最後の文を取ってくるのだと思っていたが、 結論は key, value に重複していない文字列によって構成されるということが 後になってから納得いった。 ●f、参考文献 西村まどか先生のHP:「わらしべ長者」rich.rb より http://roy/~madoka/2007/r2/04/04-03-hash-rich.html ( 3 ) ●a、考えた設定 同じ行動を繰り返す物語。 のんびり村に甘いものが大好きなくまがいて、そのくまが近所の森のあまーい旅に出た物語である。 ●b、作成したプログラムコード hash-while.rb ●プログラム本体 #!/usr/koeki/bin/ruby ama = {"みつ蜂" => ["リンゴの木","ホットケーキ"], # ama にしまわれてい る "リンゴの木" => ["蜜柑の木","パン"], "蜜柑の木" => ["いちごの実","アイスクリーム"], "いちごの実" => ["桃の木","フルーツポンチ"]} tasuke = "みつ蜂" # tasuke にみつ蜂をしまう print("のんびり村にくまがいた。甘いものが大好きだ。\n") print("日々太る毎日だったが、食べ続けた。\n") print("近所の森のあまーい旅に出た。\n") printf("物知りで長寿な%sに話をした。\n",tasuke) # = みつ蜂がはいる while true # 繰り返し if tasuke == "桃の木" # もし tasuke が桃の木だったら、終了 break end print("くま:「そのあまーい食べ物を私にください」\n") printf("%s: 「私のあまーいのは%sです。%sにつけて食べるとおいしいよ」 \n",tasuke,ama[tasuke][0],ama[tasuke][1]) # 配列に変数の要素番号順に しまわれる。 printf("そこで%sの言われたようにあまーくあまーく食べた。\n",ama[tasuke][0]) tasuke = ama[tasuke][0] # 配列に変数の要素番号順に しまわれる end printf("%sに感謝して、御馳走様をした♪\n",tasuke) # = 桃の木がはいる ●c、もとにしたプログラムからの変更点 変数と、要素番号を変えた。 ●d、 プログラムを実行した結果画 irsv{c106029}% ./hash-while.rb [~/Ruby] のんびり村にくまがいた。甘いものが大好きだ。 日々太る毎日だったが、食べ続けた。 近所の森のあまーい旅に出た。 物知りで長寿なみつ蜂に話をした。 くま:「そのあまーい食べ物を私にください」 みつ蜂: 「私のあまーいのはリンゴの木です。ホットケーキにつけて食べるとおいしいよ」 そこでリンゴの木の言われたようにあまーくあまーく食べた。 くま:「そのあまーい食べ物を私にください」 リンゴの木: 「私のあまーいのは蜜柑の木です。パンにつけて食べるとおいしいよ」 そこで蜜柑の木の言われたようにあまーくあまーく食べた。 くま:「そのあまーい食べ物を私にください」 蜜柑の木: 「私のあまーいのはいちごの実です。アイスクリームにつけて食べるとおいしいよ」 そこでいちごの実の言われたようにあまーくあまーく食べた。 くま:「そのあまーい食べ物を私にください」 いちごの実: 「私のあまーいのは桃の木です。フルーツポンチにつけて食べるとおいしいよ」 そこで桃の木の言われたようにあまーくあまーく食べた。 桃の木に感謝して、御馳走様をした♪ ●e 、導き出された結果の考察 正直言って、リンゴの木には、リンゴがおいしいと言ってもらいたかったが、 いじると、余計におかしくなって、この状態が一番良い状態だと思った。 "リンゴの木" => ["蜜柑の木","パン"], "蜜柑の木" => ["いちごの実","アイスクリーム], のように、順番で表示されないと、キーとバリューの関係がずれることが分かっ た。 ●f、参考文献 西村まどか先生のHP:「ねずみの嫁入り」mouse.rb より http://roy/~madoka/2007/r2/04/04-04-hash-in-hash.html ( 4 ) ●a、考えた設定 あらかじめプログラムに登録してある対を全て表示するもの。 ●b、作成したプログラムコード strawrich-each_1.rb ●プログラム本体 #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語コード EUC で出力する men = {"あるところにおばあちゃんがいた" =>"ラーメンの旅に出た", "ラーメンの旅に出た" => "たくさんの店をまわった", "たくさんの店をまわった" => "足腰にひびいた", "足腰にひびいた" => "湯治に行った", "湯治に行った" => "田田のマイナスイオンルームが素敵だった", "田田のマイナスイオンルームが素敵だった" => "三川町が好きになった", "三川町が好きになった" => "お腹が空いた", "お腹が空いた" => "持っていたおにぎりを食べた", "持っていたおにぎりを食べた" => "自家製の梅干しを持っていた", "自家製の梅干しを持っていた" => "それを見ていた男性が話しかけてきた", "それを見ていた男性が話しかけてきた" => "「私にその梅干しを譲ってくれませんか?」", "「私にその梅干しを譲ってくれませんか?」" => "何のために使うのか訪ねてみた", "何のために使うのか訪ねてみた" => "私のラーメン店で使いたいのです", "私のラーメン店で使いたいのです" => "そこで一緒に行ってみることにした", "そこで一緒に行ってみることにした" => "その店のラーメンを食べるとおいしかった", "その店のラーメンを食べるとおいしかった" => "「一緒にラーメンを作りませんか?」", "「一緒にラーメンを作りませんか?」" => "その店で梅干しラーメンを作る決意をした", "その店で梅干しラーメンを作る決意をした" => "が、ラーメンと梅干しの相性は最悪だった", "が、ラーメンと梅干しの相性は最悪だった" => "新に旅に出た", "新に旅に出た" => "おいしいスープの店に出会った", "おいしいスープの店に出会った" => "そこで勉強をさせてもらった", "そこで勉強をさせてもらった" => "そして、ついに自信作ができた", "そして、ついに自信作ができた" => "「塩梅梅ラーメン」の完成だ", "「塩梅梅ラーメン」の完成だ" => "老若男女に大繁盛した", "老若男女に大繁盛した" => "健康ブームの先駆けとなったラーメンを作った人物だったのだ"} # for sobo in men.keys mono = "あるところにおばあちゃんがいた" # この文をmono にしまう # printf("%s。\n",mono) while true # 繰り返し # この文を mono にしまう if mono == "健康ブームの先駆けとなったラーメンを作った人物だったのだ" break # 終了 end printf("%s。 %s。\n",mono,men[mono]) # mono、 men[mono]の順番でしまう mono = men[mono] # monoをmen[mono]にしまう end ●c、もとにしたプログラムからの変更点 printf 文を減らし、変数を変えた。 繰り返しは変更せず利用した。 ●d、 プログラムを実行した結果画 irsv{c106029}% ./strawrich-each_1.rb [~/Ruby] あるところにおばあちゃんがいた。 ラーメンの旅に出た。 ラーメンの旅に出た。 たくさんの店をまわった。 たくさんの店をまわった。 足腰にひびいた。 足腰にひびいた。 湯治に行った。 湯治に行った。 田田のマイナスイオンルームが素敵だった。 田田のマイナスイオンルームが素敵だった。 三川町が好きになった。 三川町が好きになった。 お腹が空いた。 お腹が空いた。 持っていたおにぎりを食べた。 持っていたおにぎりを食べた。 自家製の梅干しを持っていた。 自家製の梅干しを持っていた。 それを見ていた男性が話しかけてきた。 それを見ていた男性が話しかけてきた。 「私にその梅干しを譲ってくれませんか?」。 「私にその梅干しを譲ってくれませんか?」。 何のために使うのか訪ねてみた。 何のために使うのか訪ねてみた。 私のラーメン店で使いたいのです。 私のラーメン店で使いたいのです。 そこで一緒に行ってみることにした。 そこで一緒に行ってみることにした。 その店のラーメンを食べるとおいしかった。 その店のラーメンを食べるとおいしかった。 「一緒にラーメンを作りませんか?」。 「一緒にラーメンを作りませんか?」。 その店で梅干しラーメンを作る決意をした。 その店で梅干しラーメンを作る決意をした。 が、ラーメンと梅干しの相性は最悪だった。 が、ラーメンと梅干しの相性は最悪だった。 新に旅に出た。 新に旅に出た。 おいしいスープの店に出会った。 おいしいスープの店に出会った。 そこで勉強をさせてもらった。 そこで勉強をさせてもらった。 そして、ついに自信作ができた。 そして、ついに自信作ができた。 「塩梅梅ラーメン」の完成だ。 「塩梅梅ラーメン」の完成だ。 老若男女に大繁盛した。 老若男女に大繁盛した。 健康ブームの先駆けとなったラーメンを作った人物だったのだ。 ●e 、導き出された結果の考察 重複する文があり、なかなか納得行かない状況になった。しかし、今講義の復 習もかねた勉強ができた。しまうものが、変数ではなく、文字でも可能なこと が解った。また、一番最初に for 文を使わなくとも良いことが解った。 print文は、一つでいいことがわかった。 ●f、参考文献 西村まどか先生のHP:「ねずみの嫁入り」mouse.rb より http://roy/~madoka/2007/r2/04/04-04-hash-in-hash.html ( 5 ) ●a、考えた設定 やぶ医者プログラム。 患者から適当に話を聞き取り、「"A" とは "B" のことですね」と症状を結論づけるもの。 ●b、作成したプログラムコード hash-doctor.rb ●プログラム本体 #!/usr/koeki/bin/ruby # 同じ value を持った場合に、keyword をつなげ文章にする $KCODE = 'e' # 日本語コード EUC で出力する # 同じ value を持たなければ、その value について定義を訊 ねる構造になっている。 uso = Hash.new # Hash 配列を uso と定義する STDERR.printf("どこがどんな症状ですか??**** Ctrol - D で終了 ****\n") byou = gets while true # 繰り返し if byou == nil # Ctrl-D が押されたら終了 then break else # Ctrl D 以外の文字列はここに進む byou == byou.chomp! # 改行文字を取る end # ここの文字に該当するものを選択する ↓ if /^(\S+)(は|が)(\S+)(ね|の|だ|で|です)/ =~ byou # p byou # 入力した、byou がしまわれる syu = $1 # $1 にしまわれる yamai = $3 # $2 にしまわれる end uso[yamai] = syu # どちらを切り出したいか考える # uso[syu] = yamai # p uso uso.each{ # obj 配列.each{ |反復変数| 反復変数を用いた実行文 } |hei| if (uso.value?(syu) == true && hei[0] != yamai) # ハッシュvalue.?(value) # 文字列 value があるかどうか調 べる # あったら、hei[0]にしまい、 yamaiと同じ 文字の種類として扱う そしてここにしまわれる ↓ printf("%sっていうのは%sですね\n",hei[0],yamai) print("他にどんな症状ですか??\n") break else printf("%sが、どうしたんですか?\n",hei[1]) break end } byou = gets # byou をしまう end print("お大事に。\n") ●c、もとにしたプログラムからの変更点 「人工無能」 chatterbot.rbより、終了を追加した。 if文のつなぎに「は」だけでなく、「です」や「が」を追加した。 変数を変えた。 ●d、 プログラムを実行した結果画面 irsv{c106029}% ./hash-doctor.rb [~/Ruby] どこがどんな症状ですか??**** Ctrol - D で終了 **** 頭が痛いです 頭が、どうしたんですか? 頭がズキズキするんです 痛いっていうのはズキズキするんですね 他にどんな症状ですか?? お腹が下るんです お腹が、どうしたんですか? お腹が苦痛なんです 下るんっていうのは苦痛なんですね 他にどんな症状ですか?? お大事に。 ●e 、導き出された結果の考察 「 &&」とは何か解らなかった。入力する言葉のニュアンスを少しでも変えると、 結果表示が変わり上手く反応されず、入力する言葉が制限され大変だった。 ●f、参考文献 西村まどか先生のHP:「人工無能」chatterbot.rb より http://roy/~madoka/2007/r2/04/04-05-hash-chatterbot.html 3、感想 ハッシュvalue.?(value) について少し忘れていたため、講義ノートや、自信 の提出レポートを振り返り読んだ。また、あらかじめプログラムに登録して ある対を全て表示するものでは、Hash の対を表示するにはなどを振り返って 沢山復習したが、結局使わなかった。参考にしたプログラムのよけいな部分をと ることで、よりスリムなプログラムが出来る場合も有るのだと考えさせられた。 スリムなプログラム作りは、長いものよりも、技術を凝縮するため難しいと実感した。