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