忍者ブログ
[PR]
×

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



2017/03/27 19:43 |
PHP5.5.0 「第14回オフラインリアルタイムどう書くの問題」をPHPで解く
http://qiita.com/Nabetani/items/0597bd3af481e5834ae1
http://nabetani.sakura.ne.jp/hena/ord14linedung/
眠れるモンスターを狩ります。
武器AでモンスターBを狩れる、モンスターBは武器Cを落とす、武器CはモンスターDを狩れる、という連鎖です。
<?php
	
	class MONSTER{
		// 武器で狩れるモンスターと落とす武器
		private $list = [
			'a' => 'Bc',
			'c' => 'De',
			'e' => 'Fg',
			'g' => 'Hi',
			'i' => 'Jk',
			'k' => 'La',
		];
	
		/**
		* 狩ったモンスターの数を返す
		* @param String 「gLDLBgBgHDaD」みたいな文字列
		* @return int 「6」みたいな数値
		*/
		public function get($input){
			// 初期値
			$weapons = new ArrayIterator();
			$monsters = [];
			$ret = 0;
		
			// 入力値を整形
			foreach(count_chars($input, 1) as $key=>$val){
				// 小文字は武器、大文字はモンスター
				if($key < 97){
					$monsters[chr($key)] = $val;
				}else{
					$weapons[chr($key)] = $val;
				}
			}
			
			// 武器でくるくる
			foreach($weapons as $weapon=>$val){
				// その武器で狩れるモンスターがいれば
				if(isset($monsters[$this->list[$weapon][0]])){
					// 狩る
					$ret += $monsters[$this->list[$weapon][0]];
					// 落とした武器を入手
					$weapons[$this->list[$weapon][1]] = 1;
				}
			}
			
			return $ret;
		}
	}
	
	// 以下はテスト
	$test = [
		['gLDLBgBgHDaD', '6'],
		['DBcDLaLgDBH', '6'],
		['JJca', '0'],
		['FJDLBH', '0'],
		['HJBLFDg', '6'],
		['HBaDLFJ', '6'],
		['DJaHLB', '2'],
		['gDLHJF', '3'],
		['cJFgLHD', '5'],
		['FFBJaJJ', '1'],
		['FJeJFBJ', '2'],
		['iJFFJJB', '3'],
		['JBJiLFJF', '5'],
		['JDiFLFBJJ', '8'],
		['BDFDFFDFFLLFFJFDBFDFFFFDDFaDBFFB', '28'],
		['DDFBFcBDFFFFFFLBFDFFBFLFDFDJDFDF', '24'],
		['FDLBFDDBFFFeFFFFFDFBLDDFDDFBFFJF', '16'],
		['FDBFFLFDFFDBBDFFBJDLFgDFFFDFFDFF', '0'],
		['FDiFLDFFFFBDDJDDBFBFDFFFBFFDFLFF', '31'],
		['FDFDJBLBLBFFDDFFFDFFFFFDDFBkFDFF', '30'],
		['HBkFFFFHBLH', '3'],
		['FBHHFFFHLaB', '2'],
		['LFHFBBcHFHF', '0'],
		['LFBHFFeFHBH', '7'],
		['LgFHHHBFBFF', '3'],
		['FFiFHBHLBFH', '0'],
		['BFHHFFHBeFLk', '10'],
		['FHFaBBHFHLFg', '5'],
		['FFgacaFg', '0'],
		['JHDaDcBJiiHccBHDBDH', '9'],
		['FHJJLckFckFJHDFF', '12'],
		['DeDHJHDFHJBLHDLLDHJLBDD', '22'],
		['gJLLLJgJgJLJL', '0'],
		['DaaaDDD', '0'],
		['HFeJFHiBiiBJeJBBFFB', '9'],
		['FJFFJDBHBHaLJBHJHDLHkLLLFFFgJgHJLHkJkB', '32'],
		['giFLBiBJLLJgHBFJigJJJBLHFLDLL', '23'],
		['cgkLJcLJJJJgJc', '2'],
		['LDFHJHcFBDBLJBLFLcFJcDFBL', '22'],
		['JJHHHkHJkHLJk', '1'],
		['kHHBBaBgHagHgaHBBB', '11'],
		['HDBFFDHHHDFLDcHHLFDcJD', '20'],
		['HFFFHeFFee', '7'],
		['gLLDHgDLgFL', '1'],
		['JJJBBaBBHBBHaLBHJ', '7'],
		['FBFBgJBDBDgF', '0'],
		['LLLLakakLakLL', '7'],
		['HeJHeJe', '0'],
		['LDFLBLLeBLDBBFFBLFBB', '4'],
	];

	$monster = new MONSTER();
	foreach($test as $key=>$data){
		$answer = $monster->get($data[0]);
		if($answer !== (int)$data[1]){
			print('えらー');
		}
	}

単純に、手持ちの武器でモンスターを狩って、その戦利品で次のモンスターを狩って、を繰り返しただけです。
ArrayIteratorは、反復処理中に値の変更が可能という便利な配列です。
ここが普通の配列だとaddしたループ中は参照してくれません。

かかった時間は1時間くらい。
最初上で書いたとおり普通の配列でやろうとして動かなかった。
あとモンスターと武器の文字が順に並んでるので、ビット演算とかで解けないかと思ったがさっぱりわからなかった。


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

PR


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

コメント

コメントを投稿する






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



<<買ったものリスト 2013/11/10 | HOME | paluの忘却録『phpで特定の日付からある日数分前の日付一覧を取得する』の感想>>
忍者ブログ[PR]