Python Challenge Level1

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]

でいいですね。