schedule2018-07-19

Typoglycemia(タイポグリセミア現象)をプログラミングする

はじめに

言語処理100本ノック 2015

Pythonを勉強するため、東京工業大学の岡崎教授が出題されている言語処理100本ノック 2015を解いていきます。

より深く理解するため、別解や利用したライブラリの解説もまとめていきます。

環境

Python3.6

OS : mac

問題

09. Typoglycemia
スペースで区切られた単語列に対して,各単語の先頭と末尾の文字は残し,それ以外の文字の順序をランダムに並び替えるプログラムを作成せよ.ただし,長さが4以下の単語は並び替えないこととする.適当な英語の文(例えば"I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .")を与え,その実行結果を確認せよ.

Typoglycemia (タイポグリセミア現象)とは

単語を構成する文字を並べ替えても、最初と最後の文字が合っていれば読めてしまう現象のこと。 なぜか読めちゃう文章Typoglycemia (タイポグリセミア) は7歳の子どもでも読めるのか?

ネットで話題になったこともある、あれですね。名前は知りませんでした。
同じところから、例文を引用します。

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

ひらがなとカタカナだけでしょうが、日本語でも適応できてしまうところがすごいですね。

解答

import random


def typoglycemia(text):

    def random_word(word):
        if len(word) < 5:
            # 4以下はそのまま
            return word
        # 先頭と末尾以外をランダムに並び替え
        arr = list(word[1:-1])
        random.shuffle(arr)
        # 先頭と末尾を加え返す。
        return word[0] + "".join(arr) + word[-1]
       
    return " ".join(list(map(random_word, text.split())))


text = "I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind ."

print(typoglycemia(text))

出力

1回目

print(typoglycemia(text))
# => I cuo'ndlt beleive that I cuold altacluy uatdsenrnd what I was riandeg : the pehenmnoal poewr of the hamun mind .

2回目

print(typoglycemia(text))
# => I cnl'udot bvleeie that I colud auatlcly uatenrsdnd what I was rndaieg : the pnoahmneel pewor of the haumn mind .

元の文

I couldn't believe that I could actually understand what I was reading : the phenomenal power of the human mind .

1回目

I cuo'ndlt beleive that I cuold altacluy uatdsenrnd what I was riandeg : the pehenmnoal poewr of the hamun mind .

2回目

I cnl'udot bvleeie that I colud auatlcly uatenrsdnd what I was rndaieg : the pnoahmneel pewor of the haumn mind .

どうです?読めましたか?

解説

標準ライブラリのrandomをインポートして使います。

random.shuffle()はリストのイテレータの順序をランダムに並べ替えます。 引数のリストを並べ変えるため、返り値はありません。

よって以下はダメな例です。

text = "abcd"

random.shuffle(text)
# => TypeError: 'str' object does not support item assignment

print(random.shuffle(list(text)))
# => None

文字列の場合はこのようにします。

text = "abcd"

tmp = list(text)
random.shuffle(tmp)

print("".join(tmp))
# => bdca

一度、リストの一時変数に入れshuffleします。その後、"".join()で文字列に直します。

arr = list(word[1:-1])
        random.shuffle(arr)

続いての記事

Python3で言語処理100本ノックまとめ

前の問題:08. 暗号文

次の問題:10. 行数のカウント