『あみだくじ』投稿

どう書く?orgに投稿。

お題はあみだくじです。

次のような書式で与えられた「あみだくじ」があります。(あみだくじはコード中に埋め込んでも、標準入力や外部ファイルから読み込んでも、書きやすい方法でかまいません)

A B C D E  
| | |-| |  
|-| | |-|  
| |-| |-|  
|-| |-| |  
|-| | | |
このあみだくじをたどって
A B C D E  
| | |-| |  
|-| | |-|  
| |-| |-|  
|-| |-| |  
|-| | | |  
B D C A E
のように結果を表示させるプログラムを作ってください。

以下、投稿したコード。選択した言語はPHP。ファイルパスを渡すと結果付きで返却する。

function Amida($file_path)  
{  
  if (!file_exists($file_path)) {  
    return NULL;  
  }  
  $lines = file($file_path);  
  $org = array_shift($lines);  
  $p = $org;  
  foreach ($lines as $line) {  
    for ($i = 1; $i < strlen(trim($line)); $i+=2) {  
      if ($line[$i] == '-') {  
        $sub = array($p[$i+1]=>$p[$i-1], $p[$i-1]=>$p[$i+1]);  
        $p = strtr($p, $sub);  
      }  
    }  
  }  
  return $org.implode(, $lines).$p;  
}

echo sprintf(‘%s’, Amida(‘./amida.txt’));このような形で使用する。

strtr()、初めて使用した。 if内の入れ替え処理、よくあるバッファを用いたものより、直感的にわかりやすくなっている(かも)。