忍者ブログ
[PR]
×

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



2024/04/19 02:54 |
PHP5.5.0 「第2回オフラインリアルタイムどう書くの問題」をPHPで解く
http://nabetani.sakura.ne.jp/hena/ord2/

配置済のテトリスです。
横に揃った行を削除して、消した結果を出力します。
<?php
	class TETRIS{
		
		/**
		* テトリス
		* @param  String 「ff-2f-23-f3-77-7f-3b」みたいな文字列
		* @return String 「1f-03-00-1c-0d-0f-06」みたいな文字列
		*/
		public function get($input){
			// 入力
			$input = explode('-', $input);
			$arr = array_fill(0, 8, '');
			$arr2 = array_fill(0, count($input), '');
			$ret = '';
			
			// 横向きに切る
			foreach($input as $key=>$val){
				$tmp = sprintf('%08s', base_convert($val, 16, 2));
				for($i=0; $i<8; $i++){
					$arr[$i] .= $tmp[$i];
				}
			}
			// 揃ってるところは消えて落ちる
			foreach($arr as $key=>$val){
				if(strpos($val, '0')=== false){
					unset($arr[$key]);
					array_unshift($arr, str_repeat('0', strlen($val)));
				}
			}
			// 縦に戻す
			foreach($arr as $key=>$val){
				for($i=0; $i<strlen($val); $i++){
					$arr2[$i] .= $val[$i];
				}
			}
			// 文字列にして戻す
			foreach($arr2 as $key=>$val){
				$ret .= '-' . sprintf('%02s', base_convert($val, 2, 16));
			}
			return substr($ret, 1);
		}
	}
	
	// テスト
	$test = [
		['ff-2f-23-f3-77-7f-3b', '1f-03-00-1c-0d-0f-06'],
		['01', '00'],
		['00', '00'],
		['7a-4e', '0c-02'],
		['56-b6', '08-14'],
		['12-12-12', '00-00-00'],
		['de-ff-7b', '0a-0f-05'],
		['95-be-d0', '05-1e-20'],
		['7c-b0-bb', '1c-20-2b'],
		['7a-b6-31-6a', '3a-56-11-2a'],
		['32-0e-23-82', '18-06-11-40'],
		['ff-7f-bf-df-ef', '0f-07-0b-0d-0e'],
		['75-df-dc-6e-42', '35-5f-5c-2e-02'],
		['62-51-ef-c7-f8', '22-11-6f-47-78'],
		['0c-47-8e-dd-5d-17', '04-23-46-6d-2d-0b'],
		['aa-58-5b-6d-9f-1f', '52-28-2b-35-4f-0f'],
		['ff-55-d5-75-5d-57', '0f-00-08-04-02-01'],
		['fe-fd-fb-f7-ef-df-bf', '7e-7d-7b-77-6f-5f-3f'],
		['fd-fb-f7-ef-df-bf-7f', '7e-7d-7b-77-6f-5f-3f'],
		['d9-15-b5-d7-1b-9f-de', '69-05-55-67-0b-4f-6e'],
		['38-15-fd-50-10-96-ba', '18-05-7d-20-00-46-5a'],
		['fe-fd-fb-f7-ef-df-bf-7f', 'fe-fd-fb-f7-ef-df-bf-7f'],
	];

	$tetris = new TETRIS();
	foreach($test as $key=>$data){
		$answer = $tetris->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
言いたいことはわかる。
何回ループ回してんだよ。

見たかんじビット演算使えば即座に解けるような内容だと思うんですよね。
しかし私はビット演算が苦手(というかまともに勉強したことがない)ので、入力を横に切って全部1だったら消すという超絶力業での回答です。
いやはや酷いもんだ。

かかった時間は1時間くらい。


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


2013/09/20 23:57 | Comments(0) | PHP

コメント

コメントを投稿する






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



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