Pythonを勉強するため、Python Challenge をやっています。
Python Challenge
http://www.pythonchallenge.com/
レベル1は、"a"なら"c"、"b"なら"d"、"c"なら"e"というように1つずつ文字を飛ばすスクリプトを作る問題です。
そこで、次のようなスクリプトを作ってみました。
import string import fileinput all_ascii = string.ascii_lowercase return_string = '' for line in fileinput.input(): for char in line: if char == ' ' or char == '.' or char == '(' or char == ')': return_string += char else: index = all_ascii.find(char) if (index == -1): continue index += 2 if (index >= len(all_ascii)): index -= len(all_ascii) return_string += all_ascii[index] print return_string
僕のいまのPythonレベルではこれが限界のようです。。。
このスクリプトに問題文の文字列を読み込ませてみると、string.maketrans()を使うといいよ♪っとでてきました。
ということで、このstring.maketrans()を使って、スクリプトを書き直してみます。
import string import fileinput from_string = string.lowercase to_string = '' for char in string.lowercase: if ord(char)+2 > ord('z'): offset = ord(char)+2 - ord('z') to_string += chr(ord('a')-1 + offset) else: to_string += chr(ord(char)+2) trans_table = string.maketrans(from_string, to_string) for line in fileinput.input(): print string.translate(line, trans_table)
英小文字以外の文字は変換されずにそのままになるので、前のソースよりはいいですかね。
to_string の変数を作っているところは、もっと綺麗にかけそうですが、疲れてきたのでこのへんで。
追記:
to_string は、わざわざ頑張らなくても
to_string = string.ascii_lowercase[2:]+string.ascii_lowercase[:2]
でいいですね。