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