DevelopmentEvent 更新

「#俳句プログラミング プチコンテスト 2015」ピックアップ Vol. 1

慧: こんにちは! 「俳句プログラミング プチコンテスト」の応募されたコードをピックアップして紹介していくよ。毎回言うけど、別に良い悪いって話じゃないからね! たくさん応募があるから、他の人のコードを参考にアップデートしてもいいし、バグがあったらつっこむのもアリだよ!

みんなのツイート

みんなのコードを見るには、Togetter まとめ から。たくさん応募待ってるよ~。

ピックアップ No.1 (なでしこ)

ひとつ目は、最初の応募作品。「ソースコードで俳句」部門だね。

haiku_01.nako
# @3846masa
尋ねたら
それを2で割り
言ってやる

なでしこだと、575 できちゃうんだね。季語が難しそうだけど。

ピックアップ No.2 (F#)

次は、F# で縦書き表示だね。今回いろいろなコードを募集しているけど、お題に困ったら縦書き表示のプログラムを応募してみてね。

https://twitter.com/Myoga1012/status/570856300931719169

Haiku2.fs
// コマンドライン引数に俳句を半角スペースで5・7・5に区切って入力してから、実行します。
[<EntryPoint>]
let main argv =

    // 文字数1番多い行の文字数を求めます。
    let max = ( argv |> Seq.maxBy( fun a -> a.Length ) ).Length

    // 各行は上で求めた文字数になるように、全角スペースで末尾をパディングします。
    let argv2 = argv |> Array.map( fun a -> a.PadRight( max, ' ' ) )

    // 文字列のを縦書きになるように並び替えて、出力します。
    Array.init max ( fun i -> System.String( [| for j in 0..argv2.Length - 1 -> argv2.[j].[i] |] |> Array.rev ) )
    |> Array.iter( fun v -> v |> printfn "%s" )

    0

俳句自体は、コマンドライン引数に 5 7 5 に区切って入力っていう方法だね。

ピックアップ No.3 (C++)

続いて、C++。これは、俳句を出力しているし、コード中に俳句も書かれているパターンだよ。

haiku.cpp
#include <iostream>
using namespace std;

#define kakikueba int main() { cout << "huruikeya\n";
#define kaneganarunari cout << "kawazutobikomu\n";
#define houryuuji cout << "mizunooto\n"; return 0;}

kakikueba
kaneganarunari
houryuuji

ピックアップ No.4 (CoffeeScript + HTML)

次は、CoffeeScript。

https://twitter.com/MysticDoll/status/570938725191933952

https://twitter.com/MysticDoll/status/570951449808515072

HaikuVue.coffee
do ->
  poems = [
    {creator: "正岡子規", kamigo: "赤とんぼ", nakashichi: "筑波に雲も", shimogo: "無かりけり"},
    {creator: "松尾芭蕉", kamigo: "五月雨を", nakashichi: "集めてはやし", shimogo: "最上川"}
  ]

  haikuVM = new Vue
    data:
      haikus: poems
  haikuVM.$mount '#haiku'
  return
haikuView.html
<html>
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/0.11.5/vue.min.js"></script>
    <style>h3{white-space: pre }</style>
  </head>
  <body>
    <div id="haiku">
      <div v-repeat="haikus">
        <h1>{{creator}}</h1>
        <h3>  {{kamigo}}</h3>
        <h3>  {{nakashichi}}</h3>
        <h3>  {{shimogo}}</h3>
      </div>
    </div>
    <script src="./haikuVue.js"></script>
  </body>
</html>

単純に俳句を表示する部類に入ると思うけど、Vue.js というデータバインディングライブラリを使った作品。後発のライブラリで、軽量・高速が特徴みたいだよ。

ピックアップ No.5 (RFO BASIC)

次は、BASIC! で、Android 環境だよ。RFO BASIC! for Android という環境を利用しているみたい。

私の画像データも活用してくれている作品で、オリジナルの俳句を表示しているよ。

コードは、長すぎるので省略! 画像データも base64 形式でコードに埋め込まれているから、すごいことに……。

ピックアップ No.6 (SmileBASIC)

次は、プチコンの SmileBASIC。

縦書き変換のプログラムに加えて、27行目の TALK 命令で、音声出力もあるのがポイントかな。プチコンならではの手軽さだね。

ピックアップ No.7 (BASIC)

次は、ポケコン SHARP PC-1260 で BASIC!

HAIKU_PC-1260.BAS
10 CLS
20 DIM S$(3)*24: DIM SS$(3)*24
30 S$(2) = "ポケコンモ"
40 S$(1) = "マダマダゲンエキ"
50 S$(0) = "ベ!シック"
60 LPRINT "I-------I"
70 FOR I=1 TO 24
80 FOR J=0 TO 2
90 SS$(J) = MID$(S$(J), I, 1)
100 IF SS$(J)="" THEN LET SS$(J)=" "
110 NEXT J
120 IF SS$(0)=" " AND SS$(1)=" " AND SS$(2)=" " THEN GOTO 150
130 LPRINT "I " +SS$(0)+" "+SS$(1)+" "+SS$(2)+ " I"
140 NEXT I
150 LPRINT "I-------I

機械がが古すぎて印字がうまくできなかったみたいだけど、LPRINT 命令で、紙に出力するのがポイントだね。

ピックアップ No.8 (jQuery)

JavaScript(jQuery)の作品。

ちょっと AA みたいな縦書きの方法だね。俳句を入力して実行するんだけど、goo 形態素解析 API を使って、一部の単語をが置き替えちゃって新しい俳句を作るのが新しい!

ピックアップ No.9 (Ruby)

Ruby の作品。

haiku.rb
#! /usr/local/bin/ruby21
require 'csv'
F, S = [], []
open("naist-jdic.csv", "r:EUC-JP:UTF-8"){|file|
    file.each_line {|buf|
       a = buf.split(",")
       next if a[13] != ""
       if a[11].length == 5 then F << a[0]
       elsif a[11].length == 7 then S << a[0]
       end
    }
}
loop {
    print "%s %s %s\n" % [F.sample, S.sample, F.sample]
    sleep 1
}

辞書データ「NAIST Japanese Dictionary」を読み込んで、5 7 5 の単語からいろいろな俳句を出力する、俳句生成系のパターン! もう少し俳句っぽくなるデータの辞書だとよさそう。

ピックアップ No.10 (Ruby)

次も Ruby の作品。

haiku.rb
sounds=%w(c o u g h)
cough = sounds.shuffle
count = 0
while (sounds != cough)
	cough.shuffle! 
	print sounds != cough ? "(⊙ ω ⊙)" : "  (´・ω・`)ゴホン  "
	count += 1
	(1..count).each{|c| print c != count ? "(⊙ ω ⊙)" : "(⊙ ω ⊙)\n" } if sounds == cough
end

p "咳をしても一人"
p (count*2).to_s + "人の中で一人です"

自由律俳句「咳をしても一人」を表現した意欲作! たくさんの顔文字の中で、ひとりだけ咳をしている顔文字が出力されるよ。

以上、Vol.2 へ続く!

応募方法は、「プロ生ちゃん #俳句プログラミング プチコンテスト 2015」を確認してね。ハッシュタグと「@pronama」を含めてツイートだよ!