単語のシャッフル

単語のシャッフル - みずぴー日記 からです。 「人間は、単語の最初と最後さえ合っていれば、あとの順番はめちゃくちゃでもいいらしいです。」ということで、作ってみます。

既に配列のシャッフルでシャッフルするための関数は用意できていまから、これを利用します。 単語に分解して、それぞれの最初と最後の文字以外に対してシャッフルします。

#! /usr/bin/gawk -f
# word_shuffle.awk

{
    for (i = 1; i <= NF; i++) {
        # 最初と最後を入れ替えないため、自動的に 4 文字以上に限る
        if (length($i) >= 4) {
            $i = word_shuffle($i);
        }
    }
    $0 = $0
    print $0;
}

# 最初と最後の文字以外をシャッフルする
#   in:     文字列
#   out:    最初と最後の文字以外がシャッフルされた文字列
function word_shuffle(str,  obj_str, num_obj_str, arr_obj_str, ret_stri, i) {
    obj_str = substr(str, 2, length(str) - 2);
    num_obj_str = split(obj_str, arr_obj_str, "");

    shuffle_array(arr_obj_str);

    ret_str = "";
    for (i = 1; i <= num_obj_str; i++) {
        ret_str = ret_str arr_obj_str[i];
    }

    return substr(str, 1, 1) ret_str substr(str, length(str));
}


# 配列をシャッフルする
#   in:     配列
#   out:    元々の配列をシャフルされた配列に置換する
function shuffle_array(arr,    num_arr, tmp, a, i, j) {
    srand();

    for (a in arr) {
        num_arr++;
    }

    for (i = num_arr; i >= 1; i--) {
        j = int((i + 1) * rand());

        if (j == 0) {
            j = 1;
        }

        tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

実行してみましょう。

$ echo 'そろもんよ わたしは かえってきた' | gawk -f word_shuffle.awk
そもんろよ わしたは かてっきえた

$ cat word_shuffle.in
あの うんめいの よるから どれほどの さいげつが ながれたのか
しかし いま われわれが きずきつつある この せかいに とけいも かれんだも むようだ
われわれは いしょくじゅうを ほしょうされた さばいばるを いきぬき
かつて いだいなる せんだつたちも じつげん しえなかった ちじょうの らくえんを
あの えいえんの しゃんぐりらを じつげん するだろう
ああ えらばれし ものの こうこうつと ふあん ともに われに あり
じんるいの みらいが ひとえに われわれの そうけんに かかってある ことを
にんしき するとき めまいにも にた かんどうを きんじえない

$ gawk -f word_shuffle.awk word_shuffle.in
あの ういんめの よるから どどれほの さついげが なれのがたか
しかし いま われれわが きつきあずつる この せかいに とけいも かだれんも むようだ
われれわは いょうくゅしじを ほうょれしさた さいるばばを いきぬき
かつて いなだいる せつだちんたも じつげん しなっえかた ちうじょの らんくえを
あの えんいえの しぐんらゃりを じつげん すろるだう
ああ えれらばし ものの ここつううと ふあん ともに われに あり
じいんるの みらいが ひとえに われれわの そんうけに かっあかてる ことを
にんしき するとき めにまいも にた かうんどを きじなんえい

日本語に対しての一文字単位での分割は gawk または xgawk でないとできないため注意してください。

tag_gawk.pngtag_gawk.png