http://qiita.com/Nabetani/items/0ddde0164a745cd09c34
http://nabetani.sakura.ne.jp/hena/ord5railsontiles/
順番的には「第5回オフラインリアルタイムどう書くの問題」なのですが、難しすぎて解けないのでとりあえずパスして次に。
いや、解いたには解いたんですが500行とかになってしまったのでこれはあかん。
懐かしチクタクバンバン。
ただしこちらはパネルは動きません。
進むラインを求めます。
ただ普通に0~8とすると2→3の移動がOKとみなされてしまうため、侵入許可パネルという微妙なプロパティを作る羽目になりました。
あとPHPは
private $okPanel = array_flip([10, 11, 12, 23, 24, 25, 36, 37, 38]);
とか書けないから微妙にめんどい。
かかった時間は1時間くらい。
完成した後で考えなおしてみたら'ABC-DEF-GHI'の位置とかでやったほうがずっと簡単そうだった。
まあいいか。
「オフラインリアルタイムどう書く」の一覧
http://nabetani.sakura.ne.jp/hena/ord5railsontiles/
順番的には「第5回オフラインリアルタイムどう書くの問題」なのですが、難しすぎて解けないのでとりあえずパスして次に。
いや、解いたには解いたんですが500行とかになってしまったのでこれはあかん。
懐かしチクタクバンバン。
ただしこちらはパネルは動きません。
進むラインを求めます。
<?php
class TICKTUCK{
// 入力方向から次の入力方向を求める ←0↑1→2↓3
private $panel = [
0=>[0=>0, 1=>1, 2=>2, 3=>3],
1=>[0=>1, 1=>0, 2=>3, 3=>2],
2=>[0=>3, 1=>2, 2=>1, 3=>0],
];
// 入力方向による現在値の変化 ←-1↑-13→+1↓+13
private $direction = [0=>1, 1=>13, 2=>-1, 3=>-13 ];
// 侵入許可パネル
private $okPanel = [10=>1, 11=>1, 12=>1, 23=>1, 24=>1, 25=>1, 36=>1, 37=>1, 38=>1];
/**
* チクタクバンバン
* @param String 「101221102」みたいな文字列
* @return String 「BEDGHIFEH」みたいな文字列
*/
public function get($input){
// 現在地
$nowPanel = 11;
// 現在の方向
$nowDirection = 1;
// 進んだ順
$ret = '';
do{
// 現在地
$ret .= chr(65 + $nowPanel%10);
// 次の方向を求める
$nowDirection = $this->panel[$input[$nowPanel%10]][$nowDirection];
// 次の現在地を求める
$nowPanel += $this->direction[$nowDirection];
// 進める限り繰り返し
}while(isset($this->okPanel[$nowPanel]));
return $ret;
}
}
// テスト
$test = [
['101221102','BEDGHIFEH'],
/* 省略 */
];
$ticktuck = new TICKTUCK();
foreach($test as $key=>$data){
$answer = $ticktuck->get($data[0]);
if($answer !== $data[1]){
print('えらー');
}
}
パネルのA~Iをそれぞれ0~8に割り当て、パネルの形状によって移動する次のパネルを求める、という基本的には単純な作りです。ただ普通に0~8とすると2→3の移動がOKとみなされてしまうため、侵入許可パネルという微妙なプロパティを作る羽目になりました。
あとPHPは
private $okPanel = array_flip([10, 11, 12, 23, 24, 25, 36, 37, 38]);
とか書けないから微妙にめんどい。
かかった時間は1時間くらい。
完成した後で考えなおしてみたら'ABC-DEF-GHI'の位置とかでやったほうがずっと簡単そうだった。
まあいいか。
「オフラインリアルタイムどう書く」の一覧
PR