Ruby/Programming/ハナモゲラ和歌

Last-modified: 2012-12-28 (金) 02:21:58

2008.04.12 「初版」

過去の歴史

  • 2007.12.22 ちょっと洗練?
  • 2002.03.26 Tanshiをライブラリ化(笑)(tanshi.rb)。
  • 2002.03.09 和歌ジェネレータをクラス化(Tanshi)。短歌、俳句、長歌を詠めるようになった
  • 2002.03.09 ハナモゲラ和歌Ruby版

ハナモゲラについてはこちら(ウィキペディア)を参照。

誤解されないように強調しておきたいが、ここで紹介するプログラムが生成する「短詩」は、いわゆるハナモゲラではない。厳密には、とか、言葉の正確な意味においては、とか枕詞をつけたいんだけど、そんな余地も立錐不可能なまでにない。理由は上記参考文献を読めば判る。いや、判らないかも知れないな。最近(2008年4月現在)タモリのCDが再発売されたそうなんで、それを聴けば判るでしょう。

そういうものを「ハナモゲラ和歌」と名乗っちゃいけないんだろうが、そこはそれ、へのはれされましてますから、きさなめのこんすらにめんじてへなさけこなされてください。

環境がWindowsなもんで、文字コードをSJISにしています。

クラスTanshi

短詩ジェネレータ。

#! /usr/local/bin/ruby -Ks
#
# tanshi.rb -- rafinado de programo naskanta japanajn mallongajn poemojn
#
$KCODE = "sjis"
require 'jcode'
# superklaso de japanaj mallongaj poemoj kiel Tanka, Haiku, k.s.
class Tanshi
  Cand  = "あいうえおかきくけこさしすせそたちつてとなにぬねの" +
    "はひふへほまみむんもやゆよらりるれろわをん" +
    "がぎぐげござじずぜぞだぢづでどばびぶべぼぱぴぷぺぽゐゑ"
  # その詩の連ごとの語数の配列(俳句なら5, 7, 5)。子クラスで定義する
  #  Formo = []
  # 内部メソッド: 次の一文字を選びとる
  # (succをオーバーライド? したら面白いかも?)
  def sekva(s)
    nth = rand(s.jlength/2) * 2
    s[nth..nth+1]
  end
  # 短詩をひとつ捻り出す
  def generi(formo)
    uta = "上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が消せます"
    for n in formo do
      # nは第x連の文字数を表す
      1.upto(n){|m|	# 悪いけどmに用はない
        uta << sekva(Cand)
      }
      uta << " "	# 連の区切り
    end
    uta.sub(/ $/, "")	# 末尾の全角空白を取り除く
  end
end

出来上がったものが「日本語の文字(ひらがな)のでたらめな羅列」ではなく、一応「日本語として発音できる」ことを考慮して、拗音(ぁぃぅぇぉゃゅょ)や促音(っ)は入れないことにした。濁音記号や半濁音記号も同様。

これらの文字が語頭に現れることはないし、現れたら発音できない。他にも「わゅ」とか「なょ」といった発音できない綴りができるのは避けようという設計上の判断である。実際には「でゅ(デュ)」とか「とぅ(トゥ)」なんて発音できる表記もあるが、例外処理でプログラムが膨れ上がるのは嫌だ。

そんなことを言いながら「ゐ」や「ゑ」は入れているんだからいい加減というか首尾一貫していない。

これをrequireして、TankaなりHaikuなりのクラスを導出すればよいわけである。何が「よい」のか判らないが。

クラスTanka, Haiku, Chouka

いわゆるハナモゲラ和歌の実装。調子に乗って長歌クラスまで作ってみた。

#! /usr/local/bin/ruby -Ks
$KCODE = "sjis"
require 'tanshi'
# 短歌クラス
class Tanka < Tanshi
  Formo = [5, 7, 5, 7, 7]
  def generi
    super(Formo)
  end
end
# 俳句クラス
class Haiku < Tanshi
  Formo = [5, 7, 5]
  def generi
    super(Formo)
  end
end
# 長歌クラス
class Chouka < Tanshi
  def generi
    super([5, 7, 5, 7, 5, 7, 5, 7, 5, 7, 7])
  end
end
tanka = Tanka.new
print "短歌\n"
print tanka.generi, "\n"
haiku = Haiku.new
print "俳句\n"
print haiku.generi, "\n"
chouka = Chouka.new
print "長歌\n"
print chouka.generi, "\n"

短歌
ひせむほく せかほこへとひ くせかそむ ほむすもしみほ あのちんみなう
俳句
ふおんかく んひてへにして すすみなう
長歌
とおせくあ けみまちひのひ ぬへすまも ちむけしふぬは さうえたち ちおもんてけそ 
はとつみほ ねんのちちふみ おたえかか まさいすつしね のぬえひぬけみ

ここを参照しているページ

#related: relatedプラグインは廃止されました。