忍者ブログ
[PR]
×

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



2024/04/20 11:45 |
PHP5.5.0 「第4回オフラインリアルタイムどう書くの問題」をPHPで解く
http://nabetani.sakura.ne.jp/hena/ord4tetroid/

qiita版リンク集がない?
作者による回答例はこちら。
http://qiita.com/Nabetani/items/cdc38bfc5665a5361942
http://qiita.com/Nabetani/items/a2d6f70241b9e80ab17d
4つの座標から、どのテトリミノかを判断します。

正直どうすればよいのかよくわからん。
<?php
	
	class TETRIMINO{
		
		// 全パターン
		private $minoList = [
			'L0' => ['00', '01', '02', '12'],
			'L1' => ['00', '01', '10', '20'],
			'L2' => ['00', '10', '11', '12'],
			'L3' => ['01', '11', '20', '21'],
			'L4' => ['02', '10', '11', '12'],
			'L5' => ['00', '01', '11', '21'],
			'L6' => ['00', '01', '02', '10'],
			'L7' => ['00', '10', '20', '21'],
			'I0' => ['00', '01', '02', '03'],
			'I1' => ['00', '10', '20', '30'],
			'T0' => ['00', '10', '11', '20'],
			'T1' => ['01', '10', '11', '12'],
			'T2' => ['01', '10', '11', '21'],
			'T3' => ['00', '01', '02', '11'],
			'O0' => ['00', '01', '10', '11'],
			'S0' => ['00', '01', '11', '12'],
			'S1' => ['01', '02', '10', '11'],
			'S2' => ['00', '10', '11', '21'],
			'S3' => ['01', '10', '11', '20'],
		];
		
		/**
		* テトリミノ
		* @param  String 「07,17,06,05」みたいな文字
		* @return String 「L」みたいな文字
		*/
		public function get($input){
			// パース
			$list = explode(',', $input);
			if(count(array_flip($list)) !== 4){ return '-'; }
			
			// 左上に詰める
			$minX = $minY = 9;
			foreach($list as $key=>$val){
				$minX = min($val[0], $minX);
				$minY = min($val[1], $minY);
			}
			foreach($list as $key=>$val){
				$list[$key] = ($val[0]-$minX) . ($val[1]-$minY);
			}
			
			// 同じものがあればそれを返す
			sort($list);
			foreach($this->minoList as $key=>$val){
				if($val === $list){
					return $key[0];
				}
			}
			// なかった
			return '-';
		}
		
	}
	
	// テスト
	$test = [
		['55,55,55,55', '-'],
		/* 省略 */
	];

	$tetrimino = new TETRIMINO();
	foreach($test as $key=>$data){
		$answer = $tetrimino->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
回転させるのが面倒なら、回転後のデータも全部持ってればいいじゃない、という暴挙。
一番左上に詰めたときのパターンを全て持っておき、一致すればそれを返すという単純な作りです。
foreachが3回も出てくるのが微妙だ。
かかった時間は40分くらい。


「オフラインリアルタイムどう書く」の一覧

PR


2013/09/02 23:49 | Comments(0) | PHP

コメント

コメントを投稿する






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



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