PythonでTypoglycemiaを作る


PythonでTypoglycemiaを作ってみた。

Typoglycemiaとは

Typoglycemiaとは文章中の単語で、最初と最後の文字以外が入れ替わっていても文章が読めてしまう現象です。多分、例を見たらわかるので、以下を読んでみてください。

こんちには みさなん おんげき ですか? わしたは げんき です。
この ぶんょしう は いりぎす の ケブンッリジ だがいく の けゅきんう の けっか
にんんげ は もじ を にしんき する とき その さしいょ と さいご の もさじえ あいてっれば
じばんゅん は めくちちゃゃ でも ちんゃと よめる という けゅきんう に もづいとて
わざと もじの じんばゅん を いかれえて あまりす。
どでうす? ちんゃと よゃちめう でしょ?
ちんゃと よためら はのんう よしろく

どうですか?ちゃんと読めてしまいますよね。
2ちゃんねるに投稿されたコピペで、実際にケンブリッジ大学で研究が行われた訳ではないみたいです。

Pythonで文字を入れ替えてみる

前後の文字だけを残して中身の文字順を変えるのは簡単にできます。
例えば、Helloという単語の場合、先頭と後方の単語をそれぞれ、HeaderとFooterとして固定します。
さらに内側のellをBodyとして、このBodyの語順を入れ替えればTypoglycemiaになります。

プログラムでは文字に先頭から番号をふり、文字と番号を結び付けその番号の順番をランダムに変えることで文字順を入れ替えています。この場合、入れ替えが起こるのは1,2,3番の文字だけで、先頭の0番と後方の4番は入れ替えが起こらないように固定するようにします。

Pythonで以上の仕組みを再現します。

shuffle.py
import random

def shuffle(input_word):

    input_word_length = len(input_word)
    body = ""

    header = str(input_word[0])
    footer = str(input_word[input_word_length-1])

    body_num = list(range(1,input_word_length-1))
    random.shuffle(body_num)

    old_word = ""

    if input_word_length == 1:
        return input_word

    if input_word_length == 4:
        body = input_word[2] + input_word[1]
        shuffled_word = header + body + footer
        return shuffled_word

    for num_selector in range(0,input_word_length-2):
        body = old_word + input_word[body_num[num_selector]]
        old_word = body

    shuffled_word = header + body + footer

    return shuffled_word

input = input()

print("---> " + shuffle(input))

Helloと入力すると意図した動作をしてくれます。

Hello
---> Hlelo

これだと1単語しか変換できないので、スペースで区切られた文章を変換できるようにします。
PythonではString型の変数にsplit関数が用意されており、スペースで区切られた文章を単語に区切り、listにしてくれます。便利ですね!

以下のようにlistを作り1単語ごとshuffle関数に入れることで入れ替えた文章を作ります。

make_typoglycemia.py

def make_typoglycemia(input_sentence):

    if input_sentence == "":
        typoglycemia = ""
        return typoglycemia

    word_split_list = input_sentence.split()
    old_word = ""

    for word_selector in range(len(word_split_list)):
            word_split_list[word_selector] = shuffle(word_split_list[word_selector])

            typoglycemia = old_word + word_split_list[word_selector]
            old_word = typoglycemia + " "

    return typoglycemia

GUIアプリケーションにする

これを元にGUIアプリケーションを作りました。日本語入力モードだと挙動が不安定な部分もありますが良かったら見てください!(漢字ひらがな変換にpykakasi、GUI構築にtkinterを使ったので実行する際はインストールしてください。)

PythonでGUIを作るのに意外とハマったところが多かったので記事にするかもです。