忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/04/18 12:28 |
PHP5.3.7 「第7回オフラインリアルタイムどう書くの問題」をPHPで解く
http://qiita.com/Nabetani/items/4364285801d1c9f370a1
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


2013/08/02 23:29 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<今週の実績 2013/08/04 | HOME | PHP5.3.7 TwitterOAuthのラッパー>>
忍者ブログ[PR]