http://qiita.com/Nabetani/items/93cde1a6b7561426a3ac
http://nabetani.sakura.ne.jp/hena/ord11bitamida/
前回はいきなり第12回を解いてたので、だんだん後ろに戻ってみたいと思います。
今回は第11回。
お題はビットあみだくじ。
そのかわりといってはなんですが、5段以上、10行以上のあみだにも簡単に対応できます。
「オフラインリアルタイムどう書く」の一覧
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