http://qiita.com/Nabetani/items/4364285801d1c9f370a1
http://nabetani.sakura.ne.jp/hena/ord7selectchair/
トイレとかでよく見る光景です。
右端は要らないのに左端は特殊な処理が必要というあたりが微妙な感じです。
かかった時間は1時間弱。
左端と右端の門番を別の文字にしてわかりやすくしようとしたらifが増えてわかりにくくなった。
「オフラインリアルタイムどう書く」の一覧
http://nabetani.sakura.ne.jp/hena/ord7selectchair/
トイレとかでよく見る光景です。
<?php
class CHAIR{
/**
* 椅子に座る
* @param String 「6:NABEbBZn」みたいな文字列
* @return String 「-ZAB-E」みたいな文字列
*/
public function get($input){
// 入力値を分解
list($num, $input) = explode(':', $input, 2);
// 椅子のリスト 前後に門番
$chairs = str_repeat('-', $num+2);
// 検索用
$loneliness = '---';
$teteatete = '--';
$lotlotlot = '-';
// 順番に繰り返し
for($i=0; $i<strlen($input); $i++){
// 大文字であれば追加
if(ctype_upper($input[$i])){
// 両隣が空いてる
if(($pos = strpos($chairs, $loneliness)) !== false){
$chairs[$pos+1] = $input[$i];
continue;
}
// 左端が空いてる
if(substr($chairs, 0, 2) === $teteatete){
$chairs[1] = $input[$i];
continue;
}
// 右が空いてる (右端含む)
if(($pos = strpos($chairs, $teteatete, 1)) !== false){
$chairs[$pos] = $input[$i];
continue;
}
// 両隣に人がいる
$chairs[strpos($chairs, $lotlotlot, 1)] = $input[$i];
continue;
// 小文字であれば削除
}else{
$chairs = str_replace(strtoupper($input[$i]), '-', $chairs);
continue;
}
}
// 前後の門番を削除して返す
return substr($chairs, 1, -1);
}
}
// テスト
$test = [
['6:NABEbBZn', '-ZAB-E'],
/* 省略 */
];
$chair = new CHAIR();
foreach($test as $key=>$data){
$answer = $chair->get($data[0]);
if($answer !== $data[1]){
print('えらー');
}
}
右端は要らないのに左端は特殊な処理が必要というあたりが微妙な感じです。
かかった時間は1時間弱。
左端と右端の門番を別の文字にしてわかりやすくしようとしたらifが増えてわかりにくくなった。
「オフラインリアルタイムどう書く」の一覧
PR