http://qiita.com/Nabetani/items/1de39df381dfeee305ab
http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/
道なりの亀、という問題を見つけました。
我らがPHPで解いてる人が誰もいなかったのでやってみました。
かかった時間はたぶん1時間くらいです。
きちんと計っとけばよかった。
「オフラインリアルタイムどう書く」の一覧
http://nabetani.sakura.ne.jp/hena/ord12aloroturtle/
道なりの亀、という問題を見つけました。
我らがPHPで解いてる人が誰もいなかったのでやってみました。
かかった時間はたぶん1時間くらいです。
きちんと計っとけばよかった。
<?php
class KAME{
// マップ
private $mapArray = [
'ABCDEFGHIJK', 'LMNOPQRSTUV', 'WXYZabcdefg'
,'hij?????765', 'klm?????432', 'nop?????10z'
,'qrs?????yxw', 'tuv?????vut'];
// 一歩進む先
private $directionTo = [[1, 0], [0, 1], [-1, 0], [0, -1]];
// 現在地
private $nowX = 0;
private $nowY = 0;
// 向いてる方向
private $direction = 0; // →0↓1←2↑3
/**
* 辿ったルートを取得
* @param String 辿る道順
* @param String 辿ったルート
*/
public function get($route){
$this->reset();
$ret = 'A';
foreach(str_split($route) as $now){
if($now === 'R'){
$this->turnRight();
continue;
}elseif($now === 'L'){
$this->turnLeft();
continue;
}else{
$ret .= $this->getRoute(hexdec($now));
if(substr($ret, -1) === '?'){return $ret;}
continue;
}
}
return $ret;
}
/**
* 辿ったルートを取得
* @param int 何歩進むか
* @param String 辿ったルートを表す文字列
*/
private function getRoute($steps){
$ret = '';
// 歩数分繰り返し
for($i=0; $i<$steps; $i++){
// 一歩進む
$this->nowX += $this->directionTo[$this->direction][0];
$this->nowY += $this->directionTo[$this->direction][1];
// 進んだ先の値を取得
if(!isset($this->mapArray[$this->nowY][$this->nowX])){
return $ret . '?';
}
$kame = $this->mapArray[$this->nowY][$this->nowX];
// 進んだ先が場外であれば終了
if($kame==='?'){
return $ret . '?';
}
// 前回進んだ先が'tuv'であれば現在地と方向を変換
$this->routeChange($kame);
// ルートを積む
$ret .= $kame;
}
return $ret;
}
/**
* 現在地が'tuv'の何れかである場合、現在地と方向を変更する必要がある
* @param 現在地
*/
private function routeChange($kame){
// tuv以外なら何もしない
if(strpos('tuv', $kame) === false){
return;
}
// それ以外なら位置を変更、方向は反転
$this->nowX = (10 - $this->nowX);
$this->turnRight();
$this->turnRight();
}
/**
* 右を向く
*/
private function turnRight(){
if(++$this->direction >= 4){$this->direction = 0;}
}
/**
* 左を向く
*/
private function turnLeft(){
if(--$this->direction <= -1){$this->direction = 3;}
}
/**
* リセット
*/
private function reset(){
$this->nowX = 0;
$this->nowY = 0;
$this->direction = 0;
}
}
// 以下はテスト
$test = [];
$test[] = [ "2RcL3LL22", "ABCNYjmpsvy147edcbcdef" ];
$test[] = [ "L3R4L5RR5R3L5", "A?" ];
$test[] = [ "2ReLLe", "ABCNYjmpsvy147eTITe741yvspmjYNC" ];
$test[] = [ "1ReRRe", "ABMXilorux036fUJUf630xuroliXMB" ];
$test[] = [ "ReRRe", "ALWhknqtwz25gVKVg52zwtqnkhWLA" ];
$test[] = [ "f", "ABCDEFGHIJK?" ];
$test[] = [ "Rf", "ALWhknqtwz25gVK?" ];
$test[] = [ "1Rf", "ABMXilorux036fUJ?" ];
$test[] = [ "2Rf", "ABCNYjmpsvy147eTI?" ];
$test[] = [ "aR1RaL1LaR1R2L1L2", "ABCDEFGHIJKVUTSRQPONMLWXYZabcdefg567432" ];
$test[] = [ "2R1R2L1L2R1R2L1L2R1R2L1L2R1R2L1L2", "ABCNMLWXYjihklmponqrsvutwxy" ];
$test[] = [ "2R4R2L4L2R4R2L4L2R4R2L4L2", "ABCNYjmlknqtwxy147efgVK?" ];
$test[] = [ "R1L2R4R2L4L2R4R2L4L2R4R2L4L2", "ALMNYjmponqtwz0147eTUVK?" ];
$test[] = [ "R2L2R4R2L4L2R4R2L4L2R4R2L4L2", "ALWXYjmpsrqtwz2347eTIJK?" ];
$test[] = [ "R3L2R4R2L4L2R4R2L4L2R4R2L4L2", "ALWhijmpsvutwz2567eTI?" ];
$test[] = [ "R5L2L5L1LaR1L4L5", "ALWhknopmjYNCBMXilorux0325gVKJIHGF" ];
$test[] = [ "1R2L4L2R4R2L4L2R4", "ABMXYZabQFGHIJUfg?" ];
$test[] = [ "2R2L4L2R4R2L4L2R4", "ABCNYZabcRGHIJKVg?" ];
$test[] = [ "3R2L4L2R4R2L4L2R4", "ABCDOZabcdSHIJK?" ];
$test[] = [ "4R2L4L2R4R2L4L2R4", "ABCDEPabcdeTIJK?" ];
$test[] = [ "5R2L4L2R4R2L4L2R4", "ABCDEFQbcdefUJK?" ];
$test[] = [ "LLL1RRR1LLL1RRR2R1", "ALMXYZ?" ];
$test[] = [ "R3RRR3", "ALWhij?" ];
$test[] = [ "1LLL4RRR1LR1RL1", "ABMXilm?" ];
$test[] = [ "R2L1R2L1R3R4", "ALWXilmpsvut?" ];
$test[] = [ "7R4f47LLLc6R9L", "ABCDEFGHSd?" ];
$test[] = [ "5RR868L8448LL4R6", "ABCDEFEDCBA?" ];
$test[] = [ "42Rd1RLLa7L5", "ABCDEFGRc?" ];
$test[] = [ "RRLL6RLR1L5d12LaLRRL529L", "ABCDEFGRSTUV?" ];
$test[] = [ "RLR7L6LL1LRRRcRL52R", "ALWhknqtuv?" ];
$test[] = [ "1RLR8RLR1R437L99636R", "ABMXiloruxwtqnkhWLA?" ];
$test[] = [ "LLL2L3La9Le5LRR", "ALWXYZOD?" ];
$test[] = [ "R1LcRR491", "ALMNOPQRSTUV?" ];
$test[] = [ "R8L1R1R512L8RLLReRf", "ALWhknqtwx0z?" ];
$test[] = [ "1RcL8f1L29a5", "ABMXilorux036fedcbaZYXW?" ];
$test[] = [ "R822LeL46LL39LL", "ALWhknqtwz25gfedcbaZYXW?" ];
$test[] = [ "9R3L5LRRLb5R3L7cLLLR4L", "ABCDEFGHIJUf65?" ];
$test[] = [ "7LLRRR2R3R69Lf76eR2L", "ABCDEFGHSdcbaPE?" ];
$test[] = [ "8RRRLL3Le", "ABCDEFGHITe765?" ];
$test[] = [ "8R5RLL6LbL4LL5bL", "ABCDEFGHITe7410z?" ];
$test[] = [ "6LR2R1LR5LRLRL484L63", "ABCDEFGHITe741yxw?" ];
$kame = new KAME();
foreach($test as $key=>$data){
$route = $kame->get($data[0]);
if($route !== $data[1]){
print('えらー');
}
}
「オフラインリアルタイムどう書く」の一覧
PR