忍者ブログ
[PR]
×

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



2017/03/27 19:37 |
PHP5.6.0 「第16回オフラインリアルタイムどう書くの問題」をPHPで解く
http://qiita.com/Nabetani/items/6a9f5593d0f3d7e0568c
http://nabetani.sakura.ne.jp/hena/ord16boseg/

方眼紙を白と黒で塗り分けたとき、境界の線分の長さを求める。
極めて順当に実装。
<?php
	
	class BOSEG{
		/**
		* 境界線分
		* @param String 「060276724276」みたいな文字列
		* @return String 「6,2,1,1,0,1」みたいな文字列
		*/
		public function get($input){
			$boseg = array_fill(1, 6, 0);
			// 入力値をパース
			$input = array_map(function($input){
				return sprintf('%03d%03d', base_convert($input[0], 8, 2),base_convert($input[1], 8, 2));
			}, str_split($input, 2));
			
			// 横向きにチェック
			for($i=0;$i<5;$i++){
				$length=0;
				for($j=0;$j<=5;$j++){
					if($input[$i][$j] === $input[$i+1][$j]){
						// 上下が同じなら
						if($length > 0){
							// 違いがあったらそこで途切れる
							$boseg[$length]++;
							$length=0;
						}
					}elseif($j===5){
						// 最後だけ少し特殊
						if($input[$i][$j] !== $input[$i+1][$j]){
							$boseg[$length+1]++;
						}
					}else{
						// 違ってるのが続く
						$length++;
					}
				}
			}
			// 縦向きにチェック
			for($i=0;$i<5;$i++){
				$length=0;
				for($j=0;$j<=5;$j++){
					if($input[$j][$i] === $input[$j][$i+1]){
						if($length > 0){
							$boseg[$length]++;
							$length=0;
						}
					}elseif($j===5){
						if($input[$j][$i] !== $input[$j][$i+1]){
							$boseg[$length+1]++;
						}
					}else{
						$length++;
					}
				}
			}
			// 終了
			return implode(',',$boseg);
		}
		
	}
	
	// 以下はテスト
	$test = [
		['060276724276','6,2,1,1,0,1'],
		['770175454177','2,3,0,3,1,0'],
		['743733377170','9,3,1,0,0,0'],
		['724212121273','5,2,1,1,1,1'],
		['100000000000','3,0,0,0,0,0'],
		['000002000000','4,0,0,0,0,0'],
		['003622223600','0,4,0,4,0,0'],
		['520073737070','8,3,1,1,0,0'],
		['770077007700','0,0,0,0,0,5'],
		['555555555514','2,0,0,0,2,2'],
		['764252427600','4,0,4,0,2,0'],
		['774555554177','3,3,1,3,0,0'],
		['674574754557','11,5,0,1,0,0'],
		['000000000000','0,0,0,0,0,0'],
		['777777777777','0,0,0,0,0,0'],
		['774377777577','6,0,2,0,0,0'],
		['070777777777','0,1,1,0,0,0'],
		['373737373737','0,0,0,0,0,1'],
		['603260327725','30,0,0,0,0,0'],
		['466331144663','30,0,0,0,0,0'],
		['000000000242','3,2,0,0,0,0'],
		['567656043772','18,2,1,0,0,0'],
		['200763012420','15,4,1,0,0,0'],
		['400101140052','14,3,0,0,0,0'],
		['764767476476','13,2,0,1,0,0'],
		['001110140110','12,2,1,0,0,0'],
		['765405076527','16,3,0,1,0,0'],
		['377323370373','8,4,2,0,0,0'],
		['250541131216','11,5,2,0,0,0'],
		['744165741476','12,3,2,0,0,0'],
		['042101000300','10,3,0,0,0,0'],
		['002004554101','11,3,1,0,0,0'],
		['371707762706','15,1,1,0,0,0'],
		['130371310175','7,3,1,2,0,0'],
		['212537003613','13,2,1,1,1,0'],
		['157700063411','15,3,0,0,0,1'],
		['011500036007','6,7,1,0,0,0'],
		['743113313517','17,2,1,0,0,0'],
		['174105270405','13,3,1,1,0,0'],
		['427272200311','13,3,2,0,0,0'],
		['725370332237','12,5,1,1,0,0'],
		['005640420046','12,1,3,0,0,0'],
		['700350001101','14,3,1,0,0,0'],
		['577627744076','16,1,1,1,0,0'],
		['620332232007','10,4,2,1,0,0'],
		['260406401000','15,1,1,0,0,0'],
		['737272723276','5,0,0,0,3,0'],
		['000400040444','7,0,2,0,0,0'],
		['370222002177','13,2,2,0,0,0'],
		['372236024656','9,3,2,0,1,0'],
		['276131137003','11,6,2,0,0,0'],
		['742134007240','13,4,2,0,0,0'],
		['777721775571','13,1,2,0,0,0'],
		['700301232233','11,2,3,0,0,0'],
	];

	$boseg = new BOSEG();
	foreach($test as $key=>$data){
		$answer = $boseg->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
ループ最後のところだけ少し処理を追加してますが、それ以外は普通に順番に見ていってるだけです。
横向きと縦向きで思いっきり同じことをしているので、まとめればもっと記述を減らせますがもういいや。
PR


2014/05/26 23:12 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<PHP5.6.0 「第15回オフラインリアルタイムどう書くの参考問題」をPHPで解く | HOME | 買ったものリスト 2014/05/25>>
忍者ブログ[PR]