はじめに
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)
続いての記事
前の問題:08. 暗号文
次の問題:10. 行数のカウント