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メソッドで要素を連結します。
このプログラムを実行すると、以下のようになります。
上の画像でできた俳句はこちら・・・、何かの暗号かな?
ごなんでぼ はりふねきはぞ ぶやづへに
paiza.IOで作ったプログラムのブログパーツをここに埋め込みました。
2. ちょっと手を加えると・・・
先ほどのコードにある5・7・5の句のシーケンスに「phrase( 7 )」を2つ追加すると・・・
[phrase(5); phrase(7); phrase(5); phrase(7); phrase(7)]
短歌にもなります。
phrase関数自体は、謎解きゲーム用の文字列生成にも活用できそうです。
3. おわりに
今回初めて、paiza.IOのブログパーツ機能を利用してみました。閲覧者がプログラムを実際に実行できるから、プログラムの内容をより深めることができそうです。
俳句プログラミングだけでなく、カレンダープログラミングの記事にも入れてみようかな。
[END]
コメント