「第18回オフラインリアルタイムどう書くの参考問題」をPHPで解く
http://nabetani.sakura.ne.jp/hena/ord18mafovafo/
http://qiita.com/Nabetani/items/373105e7fafd12f5e9fd
山折り谷折りした後、折り目がどうなっているかを求める問題。
この手の図形問題って苦手なんですよね。
裏返しになったところを折ったらどうなるってあたりで頭がこんがらがる。
とか思ってたけど、実際に作り始めてみたらわりと一瞬で終わった。
かかった時間は20分程度。
<?php
class MAFOVAFO{
/**
* 山折り谷折り
* @param String 「JZ」みたいな文字列
* @return String 「mVVmV」みたいな文字列
**/
public function get($input){
$str = '';
for($i=strlen($input)-1; $i>=0; $i--){
switch($input[$i]){
case 'J':
$str = $str . 'V' . $this->reverse($str);
break;
case 'L':
$str = $this->reverse($str) . 'V' . $str;
break;
case 'Z':
$str = $str . 'm' . $this->reverse($str) . 'V' . $str;
break;
case 'S':
$str = $str . 'V' . $this->reverse($str) . 'm' . $str;
break;
case 'U':
$str = $this->reverse($str) . 'V' . $str . 'V' . $this->reverse($str);
break;
}
}
return $str;
}
// 反転する
private function reverse($input){
// 文字列を逆に
$input = strrev($input);
// mVを逆に 一括でm←→Vができない
$input = str_replace(['m', 'V'],['t', 'm'], $input);
$input = str_replace('t','V', $input);
return $input;
}
}
// 以下はテスト
$test = [
['JZ', 'mVVmV'],
['J', 'V'],
['L', 'V'],
['Z', 'mV'],
['U', 'VV'],
['S', 'Vm'],
['JL', 'VVm'],
['JS', 'VmVVm'],
['JU', 'VVVmm'],
['LU', 'mmVVV'],
['SL', 'VVmmV'],
['SS', 'VmVVmmVm'],
['SU', 'VVVmmmVV'],
['SZ', 'mVVmVmmV'],
['UL', 'mVVVm'],
['UU', 'mmVVVVmm'],
['UZ', 'mVVmVVmV'],
['ZJ', 'VmmVV'],
['ZS', 'VmmVmVVm'],
['ZZ', 'mVmmVVmV'],
['JJJ', 'VVmVVmm'],
['JJZ', 'mVVmVVmVmmV'],
['JSJ', 'VVmmVVmVVmm'],
['JSS', 'VmVVmmVmVVmVVmmVm'],
['JUS', 'VmVVmVVmVVmmVmmVm'],
['JUU', 'mmVVVVmmVVVmmmmVV'],
['JUZ', 'mVVmVVmVVmVmmVmmV'],
['LJJ', 'VmmVVVm'],
['LLS', 'VmmVmVVmVVm'],
['LLU', 'mmmVVVmmVVV'],
['LLZ', 'mVmmVVmVVmV'],
['LSU', 'mmVVVmmmVVVVmmmVV'],
['LSZ', 'mVVmVmmVVmVVmVmmV'],
['LZL', 'mmVVmVVmmVV'],
['LZS', 'VmmVmVVmVVmmVmVVm'],
['LZU', 'mmmVVVmmVVVmmmVVV'],
['SJL', 'VVmVVmmmVVm'],
['SLU', 'mmVVVVmmmVVmmmVVV'],
['SLZ', 'mVVmVVmVmmVmmVVmV'],
['SSU', 'VVVmmmVVVmmVVVmmmmVVVmmmVV'],
['SUJ', 'mVVVmVVmmmVmmVVVm'],
['SUS', 'VmVVmVVmVVmmVmmVmmVmVVmVVm'],
['SZZ', 'mVmmVVmVVmVmmVVmVmmVmmVVmV'],
['UJJ', 'VmmVVVmVVmm'],
['ULU', 'mmmVVVmmVVVVmmmVV'],
['ULZ', 'mVmmVVmVVmVVmVmmV'],
['UUU', 'VVmmmmVVVmmVVVVmmVVVmmmmVV'],
['ZJU', 'VVVmmmVVmmmVVVVmm'],
['ZLS', 'VmVVmmVmmVmVVmVVm'],
['ZSJ', 'VVmmVmmVVmmVVVmmV'],
['ZUJ', 'mVVVmmVmmmVVmVVVm'],
['JJLJ', 'mVVVmmVVmVVmmmV'],
['JLJJ', 'VmmVVVmVVmmmVVm'],
['JLJL', 'VmmVVVmVVmmmVVm'],
['LJJL', 'VVmmVmmVVVmVVmm'],
['LLJJ', 'VmmmVVmVVmmVVVm'],
['SZUS', 'VmVVmVVmmVmmVmmVmVVmVVmVVmVVmmVmmVmmVmVVmVVmVVmmVmmVmmVmVVmVVmmVmmVmmVmVVmVVmVVm'],
['ULLS', 'VmmVmmVmVVmVVmmVmVVmVVmVVmmVmmVmVVm'],
['JJJJZJ', 'VmmVVVmmVVmVVmmVVmmmVVmVVmmVVVmmVVmmVmmVVmmmVVmVVmmVVVmmVVmVVmmVVmmmVVmmVmmVVVmmVVmmVmmVVmmmVVm'],
['JULLLJ', 'mmVmmVVmmmVVmVVVmmVmmVVVmmVVmVVVmmVmmVVmmmVVmVVVmmVmmVVVmmVVmVVmmmVmmVVmmmVVmVVmmmVmmVVVmmVVmVV'],
['LJJJUL', 'mVVVmVVmmmVVmVVVmmVmmmVmmVVVmVVmmmVmmVVVmmVmmmVVmVVVmVVmmmVVmVVVmmVmmmVVmVVVmVVmmmVmmVVVmmVmmmV'],
['LJSJJL', 'VVmVVmmVVVmmVmmmVVmVVmmmVVmmVmmVVVmVVmmmVVmmVmmVVVmVVmmVVVmmVmmmVVmVVmmVVVmmVmmVVVmVVmmmVVmmVmm'],
['LZLLLJ', 'mmVmmVVmmmVVmVVmmmVmmVVVmmVVmVVVmmVmmVVmmmVVmVVVmmVmmVVVmmVVmVVmmmVmmVVmmmVVmVVVmmVmmVVVmmVVmVV'],
['SJJJJL', 'VVmVVmmVVVmmVmmVVVmVVmmmVVmmVmmVVVmVVmmVVVmmVmmmVVmVVmmmVVmmVmmmVVmVVmmVVVmmVmmVVVmVVmmmVVmmVmm'],
['ZLJLJL', 'VmmVVVmmVmmmVVmVVmmVVVmVVmmmVVmmVmmVVVmmVmmmVVmmVmmVVVmVVmmmVVmVVmmVVVmmVmmmVVmVVmmVVVmVVmmmVVm'],
];
$mafovafo = new MAFOVAFO();
foreach($test as $key=>$data){
$answer = $mafovafo->get($data[0]);
if($answer !== $data[1]){
print('えらー');
}
}
折るのではなく、後ろから開いていく方向で考えた。
たとえばJを開くと、左側はそのまま、中央に谷折りのVが入り、右側は左側のちょうど裏返しになる。
よーしこれは斬新な解き方だぜー、とか思って他の解答を見てみたら、当然みんな普通に使ってた。
Author And Source
この問題について(「第18回オフラインリアルタイムどう書くの参考問題」をPHPで解く), 我々は、より多くの情報をここで見つけました https://qiita.com/rana_kualu/items/9919f3e5ee163da23be8著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .