忍者ブログ
[PR]
×

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



2024/03/29 09:38 |
PHP5.5.0 「第3回オフラインリアルタイムどう書くの問題」をPHPで解く
http://nabetani.sakura.ne.jp/hena/ord3ynode/
第3回はqiitaの記事がないようです。

左右後ろに進み、どのような道筋を辿ったかを算出します。
<?php

	class YNODE{
		
		// 次の方向
		private $next = [
			'BA' => ['r'=>'C', 'l'=>'D'], 'CA' => ['r'=>'D', 'l'=>'B'], 'DA' => ['r'=>'B', 'l'=>'C'],
			'AB' => ['r'=>'E', 'l'=>'C'], 'CB' => ['r'=>'A', 'l'=>'E'], 'EB' => ['r'=>'C', 'l'=>'A'],
			'AC' => ['r'=>'B', 'l'=>'F'], 'BC' => ['r'=>'F', 'l'=>'A'], 'FC' => ['r'=>'A', 'l'=>'B'],
			'AD' => ['r'=>'F', 'l'=>'E'], 'ED' => ['r'=>'A', 'l'=>'F'], 'FD' => ['r'=>'E', 'l'=>'A'],
			'BE' => ['r'=>'D', 'l'=>'F'], 'DE' => ['r'=>'F', 'l'=>'B'], 'FE' => ['r'=>'B', 'l'=>'D'],
			'CF' => ['r'=>'E', 'l'=>'D'], 'DF' => ['r'=>'C', 'l'=>'E'], 'EF' => ['r'=>'D', 'l'=>'C'],
		];
		
		/**
		* 進んだルートを求める
		* @param  String 「rrrrbllrlrbrbrr」みたいな文字
		* @return String 「ACBACABCFDEDADFC」みたいな数値
		*/
		public function get($input){
			// 現在進んでる方向
			$nowRoute = 'BA';
			// 返り値
			$ret = 'A';
			
			for($i=0; $i<strlen($input); $i++){
				// bだったら後ろに戻る
				if($input[$i] === 'b'){
					$ret .= $nowRoute[0];
					$nowRoute = strrev($nowRoute);
					continue;
				}
				
				// 次に進む
				$next = $this->next[$nowRoute][$input[$i]];
				$ret .= $next;
				$nowRoute = $nowRoute[1] . $next;
			}
			
			return $ret;
		}
		
	}
	
	// テスト
	$test = [
		['b', 'AB'],
		/* 省略 */
	];

	$ynode = new YNODE();
	foreach($test as $key=>$data){
		$answer = $ynode->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
全方向を持たせておくという原始的方法で解決。
'BA'が決まれば'CA''DA'は傾ければいいだけなので算出は可能なのですが、面倒になったのでもういいやー的な。
後ろに戻る場合も$nextに持たせておけばforループ内でわざわざ分岐する必要もないのですが、まあそちらも面倒なのでいいや的に。

かかった時間は30分程度。あっさり。


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


PR


2013/09/09 22:07 | Comments(0) | PHP

コメント

コメントを投稿する






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



<<PHP5.5.0 「第13回オフラインリアルタイムどう書くの問題」をPHPで解く | HOME | 買ったものリスト 2013/09/08>>
忍者ブログ[PR]