http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861
http://nabetani.sakura.ne.jp/hena/ord15elebubo/
異星の電光掲示板。
解き方自体は前やったエントロピー符号と同じです。
しかし今回は、単純に「00」を詰めると「110111101110」みたいな一意にならない値が出てしまうので注意が必要です。
と思ったけど別に注意するようなことは全くなかった。
preg_replace()とかでまとめてできないかと思ったけど無理だった。
かかった時間は45分くらい。
ところでBUBOって何ですかね。
http://nabetani.sakura.ne.jp/hena/ord15elebubo/
異星の電光掲示板。
解き方自体は前やったエントロピー符号と同じです。
しかし今回は、単純に「00」を詰めると「110111101110」みたいな一意にならない値が出てしまうので注意が必要です。
と思ったけど別に注意するようなことは全くなかった。
<?php
class ELEBUBO{
/**
* 異星の電光掲示板
* @param String 「2ed8aeed/34b0ea5b」みたいな文字列
* @return String 「LTRSUNTSJ」みたいな文字列
*/
public function get($input){
// 入力を2進数に
$input =explode('/', $input);
$upper = sprintf('%032s', base_convert($input[0], 16, 2));
$under = sprintf('%032s', base_convert($input[1], 16, 2));
// 一列にする
$string = '';
for($key=0;$key<strlen($upper); $key++){
$string .= $upper[$key] . $under[$key];
}
// 置換
$search = ['00', '101110', '110111', '111011', '011110', '101101', '1101', '1110', '0111'];
$replace = ['', 'T', 'U', 'N', 'S', 'Z', 'L', 'R', 'J'];
$ret = '';
do{
foreach($search as $key=>$val){
if(strpos($string, $val) === 0){
$string = substr($string, strlen($val));
$ret .= $replace[$key];
continue 2;
}
}
}while(strlen($string));
return $ret;
}
}
// 以下はテスト
$test = [
['2ed8aeed/34b0ea5b', 'LTRSUNTSJ'],
['00000200/00000300', 'L'],
['00018000/00010000', 'R'],
['00002000/00006000', 'J'],
['00000700/00000200', 'T'],
['01400000/01c00000', 'U'],
['00003800/00002800', 'N'],
['000c0000/00180000', 'S'],
['00003000/00001800', 'Z'],
['132eae6c/1a64eac6', 'LRJTUNSZ'],
['637572d0/36572698', 'ZSNUTJRL'],
['baddb607/d66b6c05', 'LTJZTSSSN'],
['db74cd75/6dac6b57', 'ZZZTJZRJNU'],
['3606c2e8/1b0d8358', 'ZZSSLTJ'],
['ad98c306/e6cc6183', 'UZZZZZZ'],
['4a4aaee3/db6eeaa6', 'JJLLUUNNS'],
['ecd9bbb6/598cd124', 'TSSZZTTRR'],
['e0000002/40000003', 'TL'],
['a0000007/e0000005', 'UN'],
['c0000003/80000006', 'RS'],
['40000006/c0000003', 'JZ'],
['01da94db/00b3b6b2', 'TSUJLRSR'],
['76eeaaea/24aaeeae', 'TRNNUUNU'],
['1dacaeee/1566e444', 'NRJZUTTT'],
['26c9ac60/6c6d66c0', 'JSZLRJZS'],
['6c977620/36da5360', 'ZZLLTNZJ'],
['069aeae6/0db34eac', 'SJSLTUNS'],
['06d53724/049da56c', 'RRULRNJJ'],
['069b58b0/04d66da0', 'RLRSLZJR'],
['1b6eced4/11b46a9c', 'RZZTZNRU'],
['522e8b80/db6ad900', 'JLLJNLJT'],
['6546cdd0/376c6898', 'ZULSZRTL'],
['4e6d5b70/6ad9d620', 'LNSSURST'],
['37367772/65635256', 'SNSZNTNJ'],
['25535d58/377669cc', 'LUUSLTUZ'],
['0ae6a55d/0eacedcb', 'UNSUJUTJ'],
['76762edc/23536a88', 'TZNZJNRT'],
/**/
];
$elebubo = new ELEBUBO();
foreach($test as $key=>$data){
$answer = $elebubo->get($data[0]);
if($answer !== $data[1]){
print('えらー');
}
}
うーん置換のあたりが微妙。preg_replace()とかでまとめてできないかと思ったけど無理だった。
かかった時間は45分くらい。
ところでBUBOって何ですかね。
PR