忍者ブログ
[PR]
×

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



2017/07/21 17:55 |
PHP5.5.3 「第15回オフラインリアルタイムどう書くの問題」をPHPで解く
http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861
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


2013/11/15 23:59 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<今週の実績 2013/11/17 | HOME | Dust: An Elysian Tail Chapter5>>
忍者ブログ[PR]