【Rubyプログラミング狂室】
(疑似)ハナモゲラ和歌・立志編
(2002.03.10)

解説

 第一版・純情編(または黎明編)をざざっと書き上げて、いったん頭 を冷やそうとヨットからそのまま海に飛込み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版プログラムが抱えていた本質的な問題、すなわ ち拗音や促音を取り入れるという問題を解決しようと試みたが、諦めた。

 規則としては次のようになるかと思う。

  1. 拗音、促音は語頭には現れない。⇒語頭でこれらを選んだ場合、 文字を選び直す。
  2. 拗音、促音は語尾にも現れない。⇒語尾でこれらを選んだ場合、 文字を選び直す。

ここまではまぁよいのだが、

  1. 拗音、促音は連続して現れない。⇒直前の文字が拗音、促音である なら文字を選び直す。
  2. 語尾でも拗音はいいんじゃないか?
  3. 促音はふつう一音(文字)と数えるが、拗音は直前の文字と合わせ て一音扱いする。

 ……などと、考え出すといろいろな条件分岐が必要になりそうで、そ うするとプログラムが一挙に複雑になるのだ。それに、そこまで考える ならいまのプログラムが抱えているほかの問題、つまり「を」や 「ん」は連続して現れないとかいうのも直さないと意味がないじゃ ないか(苦笑)。

補足の補足

(2002.03.24)

 後日「(疑似)ハナモゲラ和歌・疾風怒濤編」 を書いたら、上のクラスではうまくないことが判明した。ちゃんと した(たぶん)クラス定義については疾風怒濤編を参照してください。

(2002.03.10)

Rubyプログラミング狂室へ
参考図書へ
コンピューター言語研究所へ
トップページへ
(C) ©Copyright Noboru HIWAMATA (nulpleno). All rights reserved.