第一版・純情編(または黎明編)をざざっと書き上げて、いったん頭 を冷やそうとヨットからそのまま海に飛込み2500キロ泳ぎ、上陸してキ リマンジャロを駆け足で登攀し、その辺にあった板切れで直滑降し、草 原から密林を時速30キロで駆け抜け、帰ってきてオレンジジュースを5 ガロン一気に飲み干し煙草を500本同時に吸ってからふと見ると、これ ではRubyの機能を適当に利用しただけで(それだけでも大したものだ が)、改良の余地が歴然と己れを主張していることに気づいた。
そこでちょっと手を加えてみた。
コメントとかメソッド名、変数名などにある見慣れない文字列は エスペラントという言語でっす。
このバージョンではコードをふたつに分けている。tanshi.rbがハナ モゲラ和歌を生成する本体で、wakasamp.rbはそれを呼び出すテスト用 のアプリケーションになる。
--- tanshi.rb --- 1: #! c://loka/ruby/bin/ruby 2: # 3: # tanshi.rb -- rafinado de programo generanta japanajn mallongajn 4: # poemojn 5: # 6: 7: require 'jcode' 8: $KCODE = "sjis" 9: 10: # 短歌、俳句など日本の短詩のスーパークラス 11: class Tanshi 12: Cand = "あいうえおかきくけこさしすせそたちつてとなにぬねの" + 13: "はひふへほまみむんもやゆよらりるれろわをん" + 14: "がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽゐゑ" 15: 16: @@formo = [] # その詩の連ごとの語数の配列(俳句なら5, 7, 5) 17: 18: # 内部メソッド: 次の一文字を選びとる 19: def sekva() 20: nth = rand(Cand.jlength) * 2 21: Cand[nth..nth+1] 22: end 23: 24: # 短詩をひとつ捻り出す 25: def generi 26: uta = "" 27: for n in @@formo do 28: # nは第x連の文字数を表す 29: 1.upto(n){|m| # 悪いけどmに用はない 30: uta << sekva() 31: } 32: uta << " " # 連の区切り 33: end 34: uta.sub(/ $/, "") # 末尾の全角空白を取り除く 35: end 36: end 37: 38: # end of file --- wakasamp.rb --- 1: #! c://loka/ruby/bin/ruby 2: # 3: # wakasamp.rb -- rafinado de programo naskanta japanajn mallongajn 4: # poemojn 5: # 6: 7: require 'tanshi' 8: 9: $KCODE='sjis' 10: 11: # 短歌クラス 12: class Tanka < Tanshi 13: @@formo = [5, 7, 5, 7, 7] 14: end 15: 16: tanka = Tanka.new 17: print "短歌\n" 18: print tanka.generi, "\n" 19: 20: # 俳句クラス 21: class Haiku < Tanshi 22: @@formo = [5, 7, 5] 23: end 24: 25: haiku = Haiku.new 26: print "俳句\n" 27: print haiku.generi, "\n" 28: 29: class Chouka < Tanshi 30: @@formo = [5, 7, 5, 7, 5, 7, 5, 7, 5, 7, 7] 31: end 32: 33: chouka = Chouka.new 34: print "長歌\n" 35: print chouka.generi, "\n" 36: 37: #end of file
いや、長歌がこの形式かどうかよく知らないんですが(^^;)
短歌
ほあひぼど だきたづえべみ ゐすにぐせ らおぐえにぱば ぢずびちぢかぞ
ほりぎゑぶ たもをぎすえふ ぬゐれれき しぷふでのゆざ びぱさけそみな
えんむゑぶ えはぞだぽにの ねぷけざが ぱづべせやでせ らけしえほがひ
俳句
ちさひじぬ ぼわぴずゑふど くげぬぺえ
じゐりしば よずんとぺずち ぐどだるせ
てびひびぷ だはだてまいず てわだろぎ
長歌
りをはぼぜ ぷすんげゑぱば だゐなやは ねかなるどぶぺ
こざくぐう りちででぐげち よすころち だべそゑびぱね
くうてをを ひよのきぜぼぢ とほぜみぴしび
れみれぷく をたおびいごな こびだがこ しでたざにへぐ
こならはで たまろへげんは うにんろろ てえへあさんり
こづがぬう もふはぶおまぬ ばびどきどてず
ぜぢざさど わどゐさがあに あゆぐえま どつくぐだがけ
えあでぺむ ぽろてそらてご ばぞかびた どぺきらべをつ
だぱをがぬ とねほげきのつ ぞすへびとをぬ
この程度の抽象化、継承・差分プログラミングごっこなら、Awkでは ちょっと苦しいかも知れないけれどPerlだったらなんとかできてしまう かも。
ま、いいか。
オブジェクト指向プログラミング(言語)の「利点」は、特徴の異な るデータ(や振舞い)を、異なるクラスという「型」の違いで表現でき ること、そしてオブジェクトという形で持ち運べることなんだな。
ま、いっか。
ついでにもとのAwk版プログラムが抱えていた本質的な問題、すなわ ち拗音や促音を取り入れるという問題を解決しようと試みたが、諦めた。
規則としては次のようになるかと思う。
ここまではまぁよいのだが、
……などと、考え出すといろいろな条件分岐が必要になりそうで、そ うするとプログラムが一挙に複雑になるのだ。それに、そこまで考える ならいまのプログラムが抱えているほかの問題、つまり「を」や 「ん」は連続して現れないとかいうのも直さないと意味がないじゃ ないか(苦笑)。
(2002.03.24)
後日「(疑似)ハナモゲラ和歌・疾風怒濤編」 を書いたら、上のクラスではうまくないことが判明した。ちゃんと した(たぶん)クラス定義については疾風怒濤編を参照してください。
(2002.03.10)
(C) ©Copyright Noboru HIWAMATA (nulpleno). All rights reserved.