PHPでローマ字アナグラムメーカーを作る

こんばんは。きわさです。

以前の記事 冴えない僕がローマ字のアナグラムメーカーを作ってみた で、アナグラムメーカーのサンプルを置いたら意外と好評だったので、PHP版のコードについて取り上げてみたいと思います。
動きとしては、入力された文字列を並べ替えてできる全種類のうち、以下のルールにあてはまるものをすべて表示します。
・子音が続かない
・最後は母音

<?php
function makeName($input, $output) {
    $len = strlen($input);
    for($i = 0; $i < $len; $i++) {
        $name = $output . substr($input, $i, 1);
        if(!isValidName($name)) {
            continue;
        }
        if($len > 1) {
            $str = '';
            for($j = 0; $j < $len; $j++) {
                if($j != $i) {
                    $str = $str . substr($input, $j, 1);
                }
            }
            makeName($str, $name);
        } else {
            if(isVowel($input)) {
                echo $name . "<br />\n";
            }
        } 
    }
    return;
}
function isValidName($str) {
    $isVowel = TRUE;
    for($i = 0; $i < strlen($str); $i++) {
        if(!isVowel(substr($str, $i, 1))) {
            if(!$isVowel) {
                return FALSE;
            }
            $isVowel = FALSE;
        } else {
            $isVowel = TRUE;
        }
    }
    return TRUE;
}
function isVowel($c) {
    if(($c == 'a') || 
       ($c == 'i') ||
       ($c == 'u') ||
       ($c == 'e') ||
       ($c == 'o')) {
        return TRUE;
    }
    return FALSE;
}
?>

関数 isValidName は子音が続かないかどうかチェックする関数で、
関数 isVowel は引数の文字が母音であるかチェックする関数です。
関数 makeName がアナグラム処理を行う関数です。
使い方は、makeName(‘mojiretu’, ”) のように、引数 input に元の文字列、output には空文字列を渡してやるだけです。
処理としては、
1. 受け取った input 文字列から1文字を output の文字列の後ろに足す
2. その文字列が有効かチェック(子音が続かない)
3. input 文字列が1文字より多い場合は、1 で選んだ文字を input 文字列から削除して再度1 に戻る
4. input 文字列が最後の1文字であり、かつ母音であれば出力

といった感じで全通り終わるまで繰り返しています。

複雑な処理は入れていないので、tsu や shi も無効になってしまいます。
有効にしたい場合は関数 isValidName を少し変更する必要があります。

スポンサーリンク