忍者ブログ
[PR]
×

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



2024/11/23 12:24 |
PHP5.5.0 「第5回オフラインリアルタイムどう書くの参考問題」をPHPで解く
http://qiita.com/Nabetani/items/0ddde0164a745cd09c34
http://nabetani.sakura.ne.jp/hena/ord5railsontiles/

順番的には「第5回オフラインリアルタイムどう書くの問題」なのですが、難しすぎて解けないのでとりあえずパスして次に。
いや、解いたには解いたんですが500行とかになってしまったのでこれはあかん。

懐かしチクタクバンバン。
ただしこちらはパネルは動きません。
進むラインを求めます。

<?php
	class TICKTUCK{

		// 入力方向から次の入力方向を求める ←0↑1→2↓3
		private $panel = [
			0=>[0=>0, 1=>1, 2=>2, 3=>3],
			1=>[0=>1, 1=>0, 2=>3, 3=>2],
			2=>[0=>3, 1=>2, 2=>1, 3=>0],
		];
		
		// 入力方向による現在値の変化 ←-1↑-13→+1↓+13
		private $direction = [0=>1, 1=>13, 2=>-1, 3=>-13 ];
		
		// 侵入許可パネル
		private $okPanel = [10=>1, 11=>1, 12=>1, 23=>1, 24=>1, 25=>1, 36=>1, 37=>1, 38=>1];
		
		/**
		* チクタクバンバン
		* @param  String 「101221102」みたいな文字列
		* @return String 「BEDGHIFEH」みたいな文字列
		*/
		public function get($input){
			// 現在地
			$nowPanel = 11;
			// 現在の方向
			$nowDirection = 1;
			// 進んだ順
			$ret = '';
			
			do{
				// 現在地
				$ret .= chr(65 + $nowPanel%10);
				// 次の方向を求める
				$nowDirection = $this->panel[$input[$nowPanel%10]][$nowDirection];
				// 次の現在地を求める
				$nowPanel += $this->direction[$nowDirection];
			
			// 進める限り繰り返し
			}while(isset($this->okPanel[$nowPanel]));
			
			return $ret;
		}
	}
	
	// テスト
	$test = [
		['101221102','BEDGHIFEH'],
		/* 省略 */
	];

	$ticktuck = new TICKTUCK();
	foreach($test as $key=>$data){
		$answer = $ticktuck->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
パネルのA~Iをそれぞれ0~8に割り当て、パネルの形状によって移動する次のパネルを求める、という基本的には単純な作りです。
ただ普通に0~8とすると2→3の移動がOKとみなされてしまうため、侵入許可パネルという微妙なプロパティを作る羽目になりました。
あとPHPは
    private $okPanel = array_flip([10, 11, 12, 23, 24, 25, 36, 37, 38]);
とか書けないから微妙にめんどい。

かかった時間は1時間くらい。
完成した後で考えなおしてみたら'ABC-DEF-GHI'の位置とかでやったほうがずっと簡単そうだった。
まあいいか。


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

PR


2013/08/31 00:00 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<今週の実績 2013/09/01 | HOME | 地球防衛軍4 M67 山岳解放戦 INFERNO>>
忍者ブログ[PR]