第3回 基礎プログラミング II レポート課題 氏名:吉田瑞恵 学籍番号:C1082030 語学クラス:英語(?) コース(系):社会 1. A. YoshidaMizueをコード表を使い16進数に直す。 Y=0x59 o=0x6f s=0x73 h=0x68 i=0x69 d=0x64 a=0x61 M=0x4d i=0x69 z=0x7a u=0x75 e=0x65 となった。 前期第5回レポートで瑠美姫の理想の番人を調べる為に使ったプログラムを応用して確認する。 #!/usr/koeki/bin/ruby printf("%c%c%c%c%c%c%c%c%c%c%c%cだよ。\n", 0x59,0x6f,0x73,0x68,0x69,0x64,0x61,0x4d,0x69,0x7a,0x75,0x65) 実行したところ pan{c108203}% ./test.rb [~/Ruby] YoshidaMizueだよ。 となった。 また、10進数に直すと 0x59 = 16*5+9 = 0d89 0x6f = 16*6+15= 0d111 0x73 = 16*7+3 = 0d115 0x68 = 16*6+8 = 0d104 0x69 = 16*6+9 = 0d105 0x64 = 16*6+4 = 0d100 0x61 = 16*6+1 = 0d97 0x4d = 16*4+13= 0d77 0x69 = 16*6+9 = 0d105 0x7a = 16*7+10= 0d122 0x75 = 16*7+5 = 0d117 0x65 = 16*6+5 = 0d101 これも、さっきのプログラムを活用して確認した。 #!/usr/koeki/bin/ruby printf("%c%c%c%c%c%c%c%c%c%c%c%cだよ。\n", 0d89,0d111,0d115,0d104,0d105,0d100,0d97,0d77,0d105,0d122,0d117,0d101) 実行すると pan{c108203}% ./test.rb [~/Ruby] YoshidaMizueだよ。 と出たので正しいと考えた。 B. これはなふだよ(3例) これ、はなふだよ(これ、花札よ) これは、なふだよ(これは、名札よ) これはな、ふだよ(これはな、麸だよ) あったかい(4例) あったかい。(温かい) あったかい? (有ったかい?) あっ、たかい(あっ、高い) あった、かい(あった、貝) C. 花札の「こいこい」で、3枚で出来る役の役名をkey、使う札と点数をvalueとした。 Hash配列はyakuと言う名前にする。 その1: key「てっぽう」に対して valueは「"桜に幕","芒に月","菊に杯",5」 その2: key「猪鹿蝶」に対して valueは「"萩に猪","紅葉に鹿","牡丹に蝶",5」 その3: key「赤タン」に対して valueは「"松に赤短","梅に赤短","桜に赤短",6」 その4: key「青タン」に対して valueは「"牡丹に青短","菊に青短","紅葉に青短",6」 その5: key「三光」に対して valueは「"松に鶴","芒に月","桐に鳳凰",6」 hash配列で表記すると yaku["てっぽう"]=["桜に幕","芒に月","菊に杯",5] yaku["猪鹿蝶"]=["萩に猪","紅葉に鹿","牡丹に蝶",5] yaku["赤タン"]=["松に赤短","梅に赤短","桜に赤短",6] yaku["青タン]"=["牡丹に青短","菊に青短","紅葉に青短",6] yaku["三光"]=["松に鶴","芒に月","桐に鳳凰",6] となる。 もう一つの表記法は yaku={"てっぽう"=>["桜に幕","芒に月","菊に杯",5], "猪鹿蝶"=>["萩に猪","紅葉に鹿","牡丹に蝶",5], "赤タン"=>["松に赤短","梅に赤短","桜に赤短",6], "青タン"=>["牡丹に青短","菊に青短","紅葉に青短",6], "三光"=>["松に鶴","芒に月","桐に鳳凰",6]} である。 2.A,B,C,Dを選択 A. a.設定 花札の「花合わせ」で出来る役の役名をkey,必要な札、枚数と点数をvalueとし たものをあらかじめ登録し、表示させるプログラムhash_ary_print.rb b.作成プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語を使う宣言。 hanaawase = Hash.new # Hash配列で、変数をhanaawaseとする。 hanaawase["月見酒"]=2,"芒に月","菊に盃","なし","なし","なし","なし",20 hanaawase["六短"]=6,"松に赤短","桜に赤短","藤に赤短","萩に赤短","菊に青短","紅葉に青短",30 hanaawase["赤短"]=3,"松に赤短","梅に赤短","桜に赤短","なし","なし","なし",40 hanaawase["四光"]=4,"松に鶴","桜に幕","芒に月","桐に鳳凰","なし","なし",60 hanaawase["五光"]=5,"松に鶴","桜に幕","芒に月","柳に小野道風","桐に鳳凰","なし",200 #ここまでは登録するHashのkeyとvalueの組み合わせ。 print("花札の役を表示します。\n6枚に満たない場合は、役札以外は「なし」と表示されます。\n\n") for yaku , cards in hanaawase # Hashの中の物を出してyakuとcardsにする printf("%sは %d 枚が必要で、点数は%d文。\n",yaku,cards[0],cards[7]) #枚数が入っている配列の1つ目と、点数の入った8つ目を表示させる。 printf("%s、\n%s、\n%s、\n%s、\n%s、\n%s\nでできます。\n\n",cards[1],cards[2],cards[3],cards[4],cards[5],cards[6]) #カード名が入った配列の2番目から7番目を表示 end #for文の終了 c.変更点 前回作成したプログラム、hash_for.rbをもとにした。 ・変数を設定に合わせ変更 ・表示させるものを配列の番号で指定した。 d.実行結果 pan{c108203}% ./hash_ary_print.rb [~/Ruby] 花札の役を表示します。 6枚に満たない場合は、役札以外は「なし」と表示されます。 赤短は 3 枚が必要で、点数は40文。 松に赤短、 梅に赤短、 桜に赤短、 なし、 なし、 なし でできます。 月見酒は 2 枚が必要で、点数は20文。 芒に月、 菊に盃、 なし、 なし、 なし、 なし でできます。 四光は 4 枚が必要で、点数は60文。 松に鶴、 桜に幕、 芒に月、 桐に鳳凰、 なし、 なし でできます。 六短は 6 枚が必要で、点数は30文。 松に赤短、 桜に赤短、 藤に赤短、 萩に赤短、 菊に青短、 紅葉に青短 でできます。 五光は 5 枚が必要で、点数は200文。 松に鶴、 桜に幕、 芒に月、 柳に小野道風、 桐に鳳凰、 なし でできます。 e.考察 あらかじめ設定しておいたものが正しく表示された。 順番はコンピュータが記憶した順番なので問題ない。 なので正しく作動している。 B. a.設定 花札の「花合わせ」で出来る役の役名をkey,必要な札、枚数と点数をvalueとした ものをあらかじめ登録し、それを必要な札数が少ない順に並べて表示させるプログラム hash_ary_print.rb b.作成プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語を使う宣言。 hanaawase = Hash.new # Hash配列で、変数をhanaawaseとする。 hanaawase["月見酒"]=2,"芒に月","菊に盃","なし","なし","なし","なし",20 hanaawase["六短"]=6,"松に赤短","桜に赤短","藤に赤短","萩に赤短","菊に青短","紅葉に青短",30 hanaawase["赤短"]=3,"松に赤短","梅に赤短","桜に赤短","なし","なし","なし",40 hanaawase["四光"]=4,"松に鶴","桜に幕","芒に月","桐に鳳凰","なし","なし",60 hanaawase["五光"]=5,"松に鶴","桜に幕","芒に月","柳に小野道風","桐に鳳凰","なし",200 #ここまでは登録するHashのkeyとvalueの組み合わせ。 print("花札の役と点数を、使用札数の少ない順に表示します。\n\n") for yaku , cards in hanaawase # Hashの中の物を出してyakuとcardsにする end #for 文終了 hanaawase.keys.sort{|before, after| #key変数を、並べ替える前のものをbefore、並べ替えた後のものをafterとする。 hanaawase[before][0] <=> hanaawase[after][0] #配列の1番目に入ったもので並べ替える。今回の場合は枚数の少ない順に並べる。 }.each{|hnfd| #hnfdという変数に配列の要素をいれる printf("%sには %d 枚必要で、点数は%d文です。\n",hnfd,hanaawase[hnfd][0],hanaawase[hnfd][7]) #役名と、枚数が入っている配列の1つ目と、点数の入った8つ目を表示させる。 } #今回は役札は表示しないことにした。 c.変更点 授業で扱われたプログラムhash_sesame.rbをもとに作成。 ・Hashデータを読みこむのでなくプログラムの始めにいれた。 ・変数をプログラムに合わせ変更した。 d.実行結果 pan{c108203}% ./hash_ary_sort.rb [~/Ruby] 花札の役と点数を、使用札数の少ない順に表示します。 月見酒には 2 枚必要で、点数は20文です。 赤短には 3 枚必要で、点数は40文です。 四光には 4 枚必要で、点数は60文です。 五光には 5 枚必要で、点数は200文です。 六短には 6 枚必要で、点数は30文です。 e.考察 配列[0]の数字が小さい順、つまり枚数の少ない順に表示された。 なので正しく動作しているといえる。 C. a. 登録されている「花合わせ」の役名と必要札、枚数、点数のhashを 点数が低い順に並べ替え表示し、更にその全ての点数を足すプログラム hash_ary_calc.rb b.作成プログラム #!/usr/koeki/bin/ruby $KCODE = 'e' # 日本語を使う宣言。 hanaawase = Hash.new # Hash配列で、変数をhanaawaseとする。 point = 0 #後で計算に使う変数。初期値は 0 hanaawase["月見酒"]=2,"芒に月","菊に盃","なし","なし","なし","なし",20 hanaawase["六短"]=6,"松に赤短","桜に赤短","藤に赤短","萩に赤短","菊に青短","紅葉に青短",30 hanaawase["赤短"]=3,"松に赤短","梅に赤短","桜に赤短","なし","なし","なし",40 hanaawase["四光"]=4,"松に鶴","桜に幕","芒に月","桐に鳳凰","なし","なし",60 hanaawase["五光"]=5,"松に鶴","桜に幕","芒に月","柳に小野道風","桐に鳳凰","なし",200 #ここまでは登録するHashのkeyとvalueの組み合わせ。 print("花札の役と点数を、得点の少ない順に表示します。\n\n") #枚数を足してもつまらないので、今回は点数を中心にプログラムする。 for yaku , cards in hanaawase # Hashの中の物を出してyakuとcardsにする point += cards[7] #cardsの8番目に入ったものを足していく。 end # for終了 hanaawase.keys.sort{|before, after| #key変数を、並べ替える前のものをbefore、並べ替えた後のものをafterとする。 hanaawase[before][7] <=> hanaawase[after][7] #配列の8番目に入った点数の低い順で並べ替える }.each{|hnfd| #hnfdという変数に配列の要素をいれる printf("%sには %d 枚必要で、点数は%d文です。\n",hnfd,hanaawase[hnfd][0],hanaawase[hnfd][7]) #役名と、枚数が入っている配列の1つ目と、点数の入った8つ目を表示させる。 } #今回も役札は表示しない。 printf("全ての得点を合わせると、%s文になります\n",point) #pointの中の数字を表示させる。 c.変更点 hash_ary_sort.rbを、 2009年度 基礎プログラミング II 第03回 「情報の構造を分析しよう」 レポート講評 に挙げられていたレポートを参考に改良。 ・for〜endの間に計算式を入れた。 ・計算結果を入れる変数をpointとした。 d.実行結果 roy{c108203}% ./hash_ary_calc.rb [~/Ruby] 花札の役と点数を、使用札数の少ない順に表示します。 月見酒には 2 枚必要で、点数は20文です。 六短には 6 枚必要で、点数は30文です。 赤短には 3 枚必要で、点数は40文です。 四光には 4 枚必要で、点数は60文です。 五光には 5 枚必要で、点数は200文です。 全ての得点を合わせると、350文になります e.考察 表示されるものは指定した通り、得点の低い順に表示された。 計算結果を確かめ算する。 roy{c108203}% bc -l [~/Ruby] 20+30+40+60+200 350 quit 結果も合っている。なので正常に動いていると言える。 D. a.設定 データを読みこみ、hash_ary_calc.rbと同じ計算をするプログラム hash_ary_read.rb b.作成プログラム #!/usr/koeki/bin/ruby $KCODE='e' #日本語を使う。 hana=Hash.new #hanaという変数でHashを使うと宣言。 total=0 #計算結果を入れる変数 open("hash_ary_data.dat","r")do|point| #hash_ary_data.datを開き、変数pointで読みこむ。 while had = point.gets #h(ash_)a(ry_)d(ata) if /(\S+)\s+(\d+)\s+(\d+)/ =~ had hana[$1]=[$2.to_i,$3.to_i] #データの中の1番目をkey,2、3番目を数値として取り込み、valueにする。 #ここで数値として取り込まないと、文字列と認識され計算ができなくなる。 end #if終了 end #while終了 end #open終了 for yaku,tokuten in hana #hana内のものをyaku,tokutenにする total += tokuten[1] #tokutenの2番目に入ったものを足していく。 end #for終了 hana.keys.sort{|mae,ato| #key変数を、並べ替える前のものをmae、並べ替えた後のものをatoとする。 hana[mae][1]<=>hana[ato][1] #value配列の2番目に入った数字が小さい順に並べ替える }.each{|ten| #変数tenに配列を入れる printf("%sを作るには%d枚必要で、得点は%d文になります。\n",ten,hana[ten][0],hana[ten][1]) } printf("これらの得点を全て合わせると%d文です。\n",total) #結果表示 データ hash_ary_data.dat #役名 #枚数 #点数 月見酒 2 20 五光 5 200 六短 6 30 四光 4 60 赤短 3 40 #計算させるだけのプログラムなので、「必要な札」は省いてデータ化した。 c.変更点 hash_ary_calc.rbを元に作成。 基礎プログラミング I 講義ノート 第7回 正規表現と Ruby 言語でのプログラミング 「データを読み込むようにするには」 も参考にした。 ・変数を少し変更した。 ・数字を配列に取り込むときにto_iで数値化した。 d.実行結果 roy{c108203}% ./hash_ary_read.rb [~/Ruby] 月見酒を作るには2枚必要で、得点は20文になります。 六短を作るには6枚必要で、得点は30文になります。 赤短を作るには3枚必要で、得点は40文になります。 四光を作るには4枚必要で、得点は60文になります。 五光を作るには5枚必要で、得点は200文になります。 これらの得点を全て合わせると350文です。 e.考察 計算結果を確かめる。 roy{c108203}% bc -l [~/Ruby] 20+30+40+60+200 350 quit また、20,30,40,60,200と得点の小さい順に並んだが、 これは偶然このように並んだのではないかを確認するため、 もう一つの数値である必要札の枚数を並べ替える設定にしてみた。 25行目の hana[mae][1]<=>hana[ato][1] の[1]を[0]に変えて実行する。 これで枚数が少ない順に並べば偶然でなく小さい順に並べ替えたと言えるだろう。 実行したところ roy{c108203}% ./hash_ary_read.rb [~/Ruby] 月見酒を作るには2枚必要で、得点は20文になります。 赤短を作るには3枚必要で、得点は40文になります。 四光を作るには4枚必要で、得点は60文になります。 五光を作るには5枚必要で、得点は200文になります。 六短を作るには6枚必要で、得点は30文になります。 これらの得点を全て合わせると350文です。 と、枚数の少ない順に並んだ。 なのでこのプログラムは正常に作動していると言える。 3.感想 繰り返す物語の例を考えた わらしべ長者タイプのものとして「風が吹けば桶屋がもうかる」というものがある。 風が吹く →風で砂が舞う →砂が目に入る →盲目の人が増える →盲目の人が三味線を求め、三味線の需要が増える →三味線の材料となる猫の数が激減する →猫が減るとネズミが増える →ネズミが桶をかじる →桶が使えなくなり、人々は桶を求める →桶屋がもうかる。 というものだ。 ねずみの嫁入りタイプとしては ノルウェーの昔話、「三びきのやぎのがらがらどん」がある。 谷の向こうに草を食べにいくため、3匹のヤギ がらがらどん は橋を渡ろうとする。 橋には恐ろしい怪物、トロル がいる。 小さい がらがらどん が橋を渡る。 トロル が 「お前を食べてやる」 と言うと 小さい がらがらどん は 「あとで 中くらいの がらがらどん が渡るから、ぼくを食べないで」 と言う。トロルは 小さい がらがらどん を渡らせた。 中くらいの がらがらどん が橋を渡る。 トロル が 「お前を食べてやる」 と言うと 中くらいの がらがらどん は 「あとで 大きい がらがらどん が渡るから、ぼくを食べないで」 と言う。トロルは 中くらいの がらがらどん を渡らせた。 大きい がらがらどん が橋を渡る。 トロル が 「お前を食べてやる」 と言うと 大きい がらがらどん は 「おれが 大きい がらがらどん だ」 と言い トロル の 目を角で突いた。トロル は死んだ。 橋を渡った がらがらどん たちは おなかいっぱい草を食べたとさ。 という話だ。 大きさを表す語、がらがらどん、トロルと言った言葉が複数回出てくる。 小さい がらがらどん と 中くらいの がらがらどん が橋を渡るところの文は 出てくる 大きさを表す語が違うだけでほとんど同じだ。 ########################### 今回のレポートも、先生が作った講義ノートのページを見ながら進めた。 これでは自分の実にならない。授業中だけでなく、レポート作成時にも わからなかった個所がわかったときにもメモを取るべきだと感じた。 そうすれば少しは自分のものになると思う。 参考文献 広瀬 雄二先生 著「Rubyプログラミング基礎講座」2006,技術評論社 p107 ASCIIコード 渡部小童 著「花札を初めてやる人の本」2010,土屋書店 基礎プログラミング I 講義ノート 第7回 正規表現と Ruby 言語でのプログラミング 「データを読み込むようにするには」 http://roy/~madoka/2010/r1/07/07_09_theme_08_fileread.html 基礎プログラミング II 講義ノート 第2回 なになにといえばこれこれ 「要素の一部分を使って入れ替えをするには」 http://roy/~madoka/2010/r2/02/02_15_theme_14_sorthasharraycomp.html 2009年度 基礎プログラミング II 第03回 情報の構造を分析しよう レポート講評 http://roy/~madoka/2009/r2/03/crt.html http://roy/~madoka/2009/r2/03/rpt/c108022.txt http://roy/~madoka/2009/r2/03/rpt/c108057.txt http://roy/~madoka/2009/r2/03/rpt/c108170.txt http://roy/~madoka/2009/r2/03/rpt/c108172.txt 作成者 西村まどか先生