ズンドコキヨシ with SQL

  • 18
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

関連: http://qiita.com/yancya/items/1167e9764719151d0c80

PostgreSQL の再帰 SQL を使って頑張って書いた

SQL

WITH RECURSIVE t(w) AS (
        VALUES ('')
         UNION
        SELECT w || ('{ズン, ドコ}'::TEXT[])[TRUNC(RANDOM() * 2) + 1]
          FROM t
         WHERE NOT w ~ 'ズンズンズンズンドコ$'
               )
        SELECT w || 'キ・ヨ・シ!'
          FROM t
      ORDER BY LENGTH(w) DESC
         LIMIT 1;

解説

  1. 最初、t は '' という w を持つ行のみ
  2. 次のループで、t の各行の w の末尾に 'ズン' か 'ドコ' を結合した行を UNION(重複を除く) する。ただし、末尾が 'ズンズンズンズンドコ' となっている行を除く。これを繰り返していく
  3. 末尾が 'ズンズンズンズンドコ' となっている行がある状態のループでは、UNION により1行も増加しないので、そこで再帰が終了して t が返る
  4. t の中で w が一番長い行の末尾が 'ズンズンズンズンドコ' となっているはずなので、その行だけを対象に 'キ・ヨ・シ!' を結合して返す