忍者ブログ
[PR]
×

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



2017/11/19 13:58 |
PHP5.3.7 「第12回オフラインリアルタイムどう書くの参考問題」を解いてみた
http://qiita.com/Nabetani/items/1de39df381dfeee305ab
http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/
道なりの亀、という問題を見つけました。
我らがPHPで解いてる人が誰もいなかったのでやってみました。
かかった時間はたぶん1時間くらいです。
きちんと計っとけばよかった。

<?php
	class KAME{
		// マップ
		private $mapArray = [
		 'ABCDEFGHIJK', 'LMNOPQRSTUV', 'WXYZabcdefg'
		,'hij?????765', 'klm?????432', 'nop?????10z'
		,'qrs?????yxw', 'tuv?????vut'];
		// 一歩進む先
		private $directionTo = [[1, 0], [0, 1], [-1, 0], [0, -1]];
		
		// 現在地
		private $nowX = 0;
		private $nowY = 0;
		// 向いてる方向
		private $direction = 0; // →0↓1←2↑3
		
		/**
		* 辿ったルートを取得
		* @param String 辿る道順
		* @param String 辿ったルート
		*/
		public function get($route){
			$this->reset();
			
			$ret = 'A';
			foreach(str_split($route) as $now){
				if($now === 'R'){
					$this->turnRight();
					continue;
				}elseif($now === 'L'){
					$this->turnLeft();
					continue;
				}else{
					$ret .= $this->getRoute(hexdec($now));
					if(substr($ret, -1) === '?'){return $ret;}
					continue;
				}
			}
			return $ret;
		}
		
		/**
		* 辿ったルートを取得
		* @param int 何歩進むか
		* @param String 辿ったルートを表す文字列
		*/
		private function getRoute($steps){
			$ret = '';
			
			// 歩数分繰り返し
			for($i=0; $i<$steps; $i++){
				// 一歩進む
				$this->nowX += $this->directionTo[$this->direction][0];
				$this->nowY += $this->directionTo[$this->direction][1];
				
				// 進んだ先の値を取得
				if(!isset($this->mapArray[$this->nowY][$this->nowX])){
					return $ret . '?';
				}
				$kame = $this->mapArray[$this->nowY][$this->nowX];
				
				// 進んだ先が場外であれば終了
				if($kame==='?'){
					return $ret . '?';
				}
			
				// 前回進んだ先が'tuv'であれば現在地と方向を変換
				$this->routeChange($kame);
				
				// ルートを積む
				$ret .= $kame;
			}
			return $ret;
		}
		
		/**
		* 現在地が'tuv'の何れかである場合、現在地と方向を変更する必要がある
		* @param 現在地
		*/
		private function routeChange($kame){
			// tuv以外なら何もしない
			if(strpos('tuv', $kame) === false){
				return;
			}
			
			// それ以外なら位置を変更、方向は反転
			$this->nowX = (10 - $this->nowX);
			$this->turnRight();
			$this->turnRight();
		}
		
		/**
		* 右を向く
		*/
		private function turnRight(){
			if(++$this->direction >= 4){$this->direction = 0;}
		}
		
		/**
		* 左を向く
		*/
		private function turnLeft(){
			if(--$this->direction <= -1){$this->direction = 3;}
		}
		
		/**
		* リセット
		*/
		private function reset(){
			$this->nowX = 0;
			$this->nowY = 0;
			$this->direction = 0;
		}
	}
	
	// 以下はテスト
	$test = [];
	$test[] = [ "2RcL3LL22", "ABCNYjmpsvy147edcbcdef" ];
	$test[] = [ "L3R4L5RR5R3L5", "A?" ];
	$test[] = [ "2ReLLe", "ABCNYjmpsvy147eTITe741yvspmjYNC" ];
	$test[] = [ "1ReRRe", "ABMXilorux036fUJUf630xuroliXMB" ];
	$test[] = [ "ReRRe", "ALWhknqtwz25gVKVg52zwtqnkhWLA" ];
	$test[] = [ "f", "ABCDEFGHIJK?" ];
	$test[] = [ "Rf", "ALWhknqtwz25gVK?" ];
	$test[] = [ "1Rf", "ABMXilorux036fUJ?" ];
	$test[] = [ "2Rf", "ABCNYjmpsvy147eTI?" ];
	$test[] = [ "aR1RaL1LaR1R2L1L2", "ABCDEFGHIJKVUTSRQPONMLWXYZabcdefg567432" ];
	$test[] = [ "2R1R2L1L2R1R2L1L2R1R2L1L2R1R2L1L2", "ABCNMLWXYjihklmponqrsvutwxy" ];
	$test[] = [ "2R4R2L4L2R4R2L4L2R4R2L4L2", "ABCNYjmlknqtwxy147efgVK?" ];
	$test[] = [ "R1L2R4R2L4L2R4R2L4L2R4R2L4L2", "ALMNYjmponqtwz0147eTUVK?" ];
	$test[] = [ "R2L2R4R2L4L2R4R2L4L2R4R2L4L2", "ALWXYjmpsrqtwz2347eTIJK?" ];
	$test[] = [ "R3L2R4R2L4L2R4R2L4L2R4R2L4L2", "ALWhijmpsvutwz2567eTI?" ];
	$test[] = [ "R5L2L5L1LaR1L4L5", "ALWhknopmjYNCBMXilorux0325gVKJIHGF" ];
	$test[] = [ "1R2L4L2R4R2L4L2R4", "ABMXYZabQFGHIJUfg?" ];
	$test[] = [ "2R2L4L2R4R2L4L2R4", "ABCNYZabcRGHIJKVg?" ];
	$test[] = [ "3R2L4L2R4R2L4L2R4", "ABCDOZabcdSHIJK?" ];
	$test[] = [ "4R2L4L2R4R2L4L2R4", "ABCDEPabcdeTIJK?" ];
	$test[] = [ "5R2L4L2R4R2L4L2R4", "ABCDEFQbcdefUJK?" ];
	$test[] = [ "LLL1RRR1LLL1RRR2R1", "ALMXYZ?" ];
	$test[] = [ "R3RRR3", "ALWhij?" ];
	$test[] = [ "1LLL4RRR1LR1RL1", "ABMXilm?" ];
	$test[] = [ "R2L1R2L1R3R4", "ALWXilmpsvut?" ];
	$test[] = [ "7R4f47LLLc6R9L", "ABCDEFGHSd?" ];
	$test[] = [ "5RR868L8448LL4R6", "ABCDEFEDCBA?" ];
	$test[] = [ "42Rd1RLLa7L5", "ABCDEFGRc?" ];
	$test[] = [ "RRLL6RLR1L5d12LaLRRL529L", "ABCDEFGRSTUV?" ];
	$test[] = [ "RLR7L6LL1LRRRcRL52R", "ALWhknqtuv?" ];
	$test[] = [ "1RLR8RLR1R437L99636R", "ABMXiloruxwtqnkhWLA?" ];
	$test[] = [ "LLL2L3La9Le5LRR", "ALWXYZOD?" ];
	$test[] = [ "R1LcRR491", "ALMNOPQRSTUV?" ];
	$test[] = [ "R8L1R1R512L8RLLReRf", "ALWhknqtwx0z?" ];
	$test[] = [ "1RcL8f1L29a5", "ABMXilorux036fedcbaZYXW?" ];
	$test[] = [ "R822LeL46LL39LL", "ALWhknqtwz25gfedcbaZYXW?" ];
	$test[] = [ "9R3L5LRRLb5R3L7cLLLR4L", "ABCDEFGHIJUf65?" ];
	$test[] = [ "7LLRRR2R3R69Lf76eR2L", "ABCDEFGHSdcbaPE?" ];
	$test[] = [ "8RRRLL3Le", "ABCDEFGHITe765?" ];
	$test[] = [ "8R5RLL6LbL4LL5bL", "ABCDEFGHITe7410z?" ];
	$test[] = [ "6LR2R1LR5LRLRL484L63", "ABCDEFGHITe741yxw?" ];
	
	$kame = new KAME();
	foreach($test as $key=>$data){
		$route = $kame->get($data[0]);
		if($route !== $data[1]){
			print('えらー');
		}
	}


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


2013/06/26 21:51 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<PHP5.3.7 「第11回オフラインリアルタイムどう書くの問題」をPHPで解く | HOME | GeNERACE labo「あなたのコード、激遅ぷんぷん丸?今すぐできる7つのチェック項目 PHP編」の感想>>
忍者ブログ[PR]