Skip to content

Instantly share code, notes, and snippets.

@sasezaki
Created April 4, 2016 14:19
Show Gist options
  • Save sasezaki/0a2b8062059935d65a0c3b9ca7e2de8d to your computer and use it in GitHub Desktop.
Save sasezaki/0a2b8062059935d65a0c3b9ca7e2de8d to your computer and use it in GitHub Desktop.
ズンドコキヨシ・コーディングに対する感想
<?php
/**
* ズンドコキヨシ・コーディングに対する感想
*
* 設問から派生したところを考えた場合、
* ズンドコキヨシ問題をPHPとFSMで解く http://developer.cybozu.co.jp/akky/2016/03/zundoko-kiyoshi-in-php-and-fsm/
* などは導入したほうが分かりやすくなる例としてなるほどなとは思ったり、
* 短くするコードゴルフ始めてたりしてフーン(読みにくっ)と思ったり
*
* で、
* 野暮なのは承知ですが、へたすると無限に近いリストになるにも関わらずエラー
* 処理というか要件つめてないなあ、と
*
* 最高まで何回'コマ'を振るのが許されるのか?(うざくないのか)
* → とりあえず30回と想定
* 最高許容回数に到達してもキヨシが取得できなかった場合は?
* → とりあえず最後はキヨシで終わるように設定
* って考えると↓かな
*/
const MAX_COUNT = 30;
$songLoop = (function () {
static $count = 0;
$〆のフレーズ = ['ズン', 'ズン', 'ズン', 'ズン', 'ドコ'];
$checks = [];
PHRASE_START:
yield $checks[] = mt_rand(0, 1) ? 'ズン' : 'ドコ';
++$count;
// ループ上限に達したら強制終了
if ($count > MAX_COUNT) goto FORCE_END;
if ($checks !== $〆のフレーズ) {
// 直近5つと比較するので古いのを削除しとく
if (count($checks) === 5) {
array_shift($checks);
}
goto PHRASE_START;
}
yield 'キヨシ';
return;
FORCE_END:
yield 'ズンズンズンズンドコキヨシ';
})();
/** 出力例 1 **/
foreach($songLoop as $phrase) {
echo $phrase;
}
/** 出力例 ほか - もし出力サイズが巨大な場合 **/
$fp = (new SfpIteratorUrl\IteratorUrl)->open($songLoop);
$httpBodyAsStream = new Zend\Diactoros\Stream( $fp );
// 出力自体は、SapiStreamEmitterにまかせる https://github.com/zendframework/zend-diactoros/blob/master/src/Response/SapiStreamEmitter.php#L61
// ↑とは言っても、
// ほか - もし1つのループがDB接続伴うものだったら、
// ループ処理が重いけどキャッシュが許されていたら
// 前回来訪者と同じメッセージ出力が許されなかったら
// ・・・・
// などもあるためIteratorをストリームとして処理するの出番はあんまりない
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment