http://qiita.com/Nabetani/items/0597bd3af481e5834ae1
http://nabetani.sakura.ne.jp/hena/ord14linedung/
眠れるモンスターを狩ります。
武器AでモンスターBを狩れる、モンスターBは武器Cを落とす、武器CはモンスターDを狩れる、という連鎖です。
単純に、手持ちの武器でモンスターを狩って、その戦利品で次のモンスターを狩って、を繰り返しただけです。
ArrayIteratorは、反復処理中に値の変更が可能という便利な配列です。
ここが普通の配列だとaddしたループ中は参照してくれません。
かかった時間は1時間くらい。
最初上で書いたとおり普通の配列でやろうとして動かなかった。
あとモンスターと武器の文字が順に並んでるので、ビット演算とかで解けないかと思ったがさっぱりわからなかった。
「オフラインリアルタイムどう書く」の一覧
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