ランダムな平仮名俳句を生成するプログラム作ってみました

Myoga-SB-SDF-A2

Hello~! ミョウガです!

今回は、F#でランダムな俳句を生成するプログラムを作ってみました。

1. F#でランダムな平仮名を生成し、俳句を作成するプログラム

open System    // RandomクラスとString.Joinメソッドで必要です。

let rnd = Random()

// 0x3041(ぁ)~0x3093(ん)までのUnicodeのひらがなの句をランダムに生成しまます。
let phrase n = [for i in 1..n -> char( rnd.Next( 0x3041, 0x3094 ) )]

// 5・7・5の俳句を作成して出力します。
[phrase(5); phrase(7); phrase(5)] |> Seq.iter( fun phr -> String.Join( "", phr ) |> printfn "%s" )

※GitHubではこちらです →  https://gist.github.com/Nia-TN1012/13e3e7117b95f46d181906b1281aab97 (※GitHubアカウントの統合のため、ニア側のGistに移動しました)

F#で乱数を生成する時は、.NET FrameworkのRandomクラスを利用します。このクラスのデフォルトコンストラクターを呼び出すと、現在の時間を初期値として初期化されます。

9行目では、その乱数オブジェクトを使って、ランダムな平仮名を生成する関数定義です。nに整数を受け取って、要素数nのchar型のシーケンスを生成します。

F#(というより、.NET系言語)の文字列はUnicodeという文字コードで表現されていて、平仮名(ゔ、ゕ、ゖを除く)は 0x3041(ぁ)~0x3093(ん) の範囲内にあります。(→ 参考:Unicode一覧 3000-3FFF | Wikipedia

RandomクラスのNextメソッドはオーバーロードされていて、Next( 0x3041, 0x3094 )と、引数2つを指定することで、範囲内のランダムな整数を求めることができます。ただ、第2引数(下線部)の値は戻り値の範囲に含まれないから気を付けてね。

12行目では、その関数を使って、5・7・5の句のシーケンスを生成し、1句ずつイテレーターで画面に出力します。各句はchar型のシーケンス(Seq<T>もとい、IEnumerable<T>)なので、string.Joinメソッドで要素を連結します。

このプログラムを実行すると、以下のようになります。

haikurnd

上の画像でできた俳句はこちら・・・、何かの暗号かな?

ごなんでぼ はりふねきはぞ ぶやづへに

paiza.IOで作ったプログラムのブログパーツをここに埋め込みました。

2. ちょっと手を加えると・・・

先ほどのコードにある5・7・5の句のシーケンスに「phrase( 7 )」を2つ追加すると・・・

[phrase(5); phrase(7); phrase(5); phrase(7); phrase(7)]

短歌にもなります。

tankarnd

phrase関数自体は、謎解きゲーム用の文字列生成にも活用できそうです。

3. おわりに

今回初めて、paiza.IOのブログパーツ機能を利用してみました。閲覧者がプログラムを実際に実行できるから、プログラムの内容をより深めることができそうです。

俳句プログラミングだけでなく、カレンダープログラミングの記事にも入れてみようかな。

[END]

コメント

タイトルとURLをコピーしました