忍者ブログ
[PR]
×

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



2024/11/23 16:44 |
PHP5.3.7 「第11回オフラインリアルタイムどう書くの問題」をPHPで解く
http://qiita.com/Nabetani/items/93cde1a6b7561426a3ac
http://nabetani.sakura.ne.jp/hena/ord11bitamida/

前回はいきなり第12回を解いてたので、だんだん後ろに戻ってみたいと思います。
今回は第11回。
お題はビットあみだくじ。

extractHex($hexData);
			foreach($bitArray as $key=>$bits){
				// 1段進む
				$nowAmida = $this->getNext($nowAmida, $bits);
			}
			// 終了
			return implode('', $nowAmida);
		}
		
		/**
		* 1段進む
		* 1があれば、次の0を探してそこと入れ替えればよい
		* @param array 現在の配列
		* @param String '01010101'みたいな
		* @param array 一歩進んだ後の配列
		*/
		private function getNext($nowAmida, $bits){
			$bits .= '0'; // 最後の0
			$left = -1; // 左端の1の場所
			
			for($loop=0; $loop<strlen($bits); $loop++){="" 1だった="" if($bits[$loop]="=='1'){" 左端が無ければ左端としてセット="" if($left="" <="" 0){="" $left="$loop;" }="" continue;="" 0だった="" 左端がセットされていれば、その位置と入れ替える=""> -1){
					list($nowAmida[$loop], $nowAmida[$left]) = [ $nowAmida[$left], $nowAmida[$loop] ];
					$left = -1;
				}
			}
			return $nowAmida;
		}
		
		/**
		* 16進数を2進数に展開
		* @param String 「d6-7b-e1-9e」みたいな文字列
		* @return array ['00000000', '11111111' ]
		*/
		private function extractHex($hexData){
			$bin = explode('-', $hexData);
			array_walk($bin, function(&$n) {
				 $n = str_pad(base_convert($n, 16, 2), 8, '0', STR_PAD_LEFT);
			});
			return $bin;
		}
	}
	
	// 以下はテスト
	$test = [
		['d6-7b-e1-9e', '740631825' ], ['83-4c-20-10', '123805476' ], ['fb-f7-7e-df', '274056813' ], ['55-33-0f-ff', '123456780' ],
		['00-00-00-00', '012345678' ], ['00-00-00-55', '021436587' ], ['40-10-04-01', '021436587' ], ['00-00-aa-00', '103254768' ],
		['80-20-08-02', '103254768' ], ['ff-7e-3c-18', '876543210' ], ['aa-55-aa-55', '351708264' ], ['55-aa-aa-55', '012345678' ],
		['db-24-db-e7', '812543670' ], ['00-01-00-40', '021345687' ], ['00-00-80-00', '102345678' ], ['01-40-00-00', '021345687' ],
		['00-00-00-02', '012345768' ], ['00-00-02-00', '012345768' ], ['00-14-00-00', '012436578' ], ['00-00-01-40', '021345687' ],
		['00-80-01-00', '102345687' ], ['c8-00-00-81', '120354687' ], ['05-48-08-14', '021435687' ], ['24-05-00-f0', '413205687' ],
		['40-08-14-01', '021536487' ], ['18-c8-80-80', '210534678' ], ['1c-88-52-00', '120564738' ], ['ec-dc-67-62', '213468705' ],
		['0a-b6-60-e9', '035162784' ], ['52-d6-c6-c2', '120345678' ], ['47-e7-b0-36', '231047658' ], ['0f-85-91-aa', '108263754' ],
		['76-b6-ed-f3', '601435782' ], ['f5-5e-f7-3d', '025847163' ], ['dd-e7-fb-f9', '610247538' ], ['8f-f4-af-fd', '583246017' ],
		['bf-fb-cb-f7', '105382674' ], ['e5-fd-ff-ff', '512046378' ], ['ef-df-ef-fe', '713205648' ], ['bf-7f-fd-d7', '826437105' ],
		['36-ff-df-de', '814527603' ], ['6f-dd-ff-ff', '230685147' ]
	];
	$amida = new AMIDA();
	foreach($test as $key=>$data){
		$answer = $amida->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
ビット演算が苦手なので、地味に左から見ていくだけという単純かつ地道なアルゴリズムになっています。
そのかわりといってはなんですが、5段以上、10行以上のあみだにも簡単に対応できます。

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


2013/06/28 23:04 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<アジトオブスクラップ「ある牢獄からの脱出」に行ってきた | HOME | PHP5.3.7 「第12回オフラインリアルタイムどう書くの参考問題」を解いてみた>>
忍者ブログ[PR]