2017-09-26 14 views
2

rotate_word()という関数は、文字列と整数をパラメータとして受け取り、指定された量だけ回転した元の文字列の文字を含む新しい文字列を返します。 Rotate_word('cheer',7) == 'jolly'Rotate_word('melon', -10) = 'cubed'、**Pythonでキーを使用して単語を回転させる

私のPythonコードは次のとおりです。正しい

Enter a string: cheer 
Enter rotate number: 7 
jolly 

def Rotate_word(str_, num_): 
    result = '' 
    for i in str_: 
     i = chr(ord(i) + num_) 
     result = result + i 
    return (result) 

str_ =input("Enter a string: ") 
num_ = int(input("Enter rotate number: ")) 
print (Rotate_word(str_,num_)) 

それはのような出力を提供します。

Enter a string: melon 
Enter rotate number: -10 
c[bed 

これは間違っている正しい答えは私が間違って何をcubed

やっているとどのように私はそれを修正することができますか?

答えて

1

修正です'a'または'z'を下回る場合は、「ラップアラウンド」する必要があります。しかし、代わりにchrを使用してordあなたは、単にstr.translatestr.maketransで使用できるの

:それはまた、大文字を処理するために追加の作業のビットを必要とする

import string 

def Rotate_word(str_, num_): 
    # Create a translation table from lowercase characters to shifted lowercase chars 
    tab = str.maketrans(string.ascii_lowercase, 
         string.ascii_lowercase[num_:] + string.ascii_lowercase[:num_]) 
    return str_.translate(tab) 

str_ =input("Enter a string: ") 
num_ = int(input("Enter rotate number: ")) 
print(Rotate_word(str_,num_)) 

。しかし、 'melon'-10'cheer'7の正しい出力が得られます。

1

あなたは小文字のみを必要とすると仮定すると、あなたはそれを周りにラップする必要がある場合は、それがzを超えたりa前に行けば意味も「オーバーフロー」、:

left_bound = ord("a") 
right_bound = ord("z") 

してから、このような何かを:

char_num = ord(i) + num_ 
while char_num > right_bound: char_num -= 26 
while char_num < left_bound: char_num += 26 
i = chr(char_num) 
result = result + i 

あり短く、よりエレガントな解決策はありますが、これは最も単純な問題があることである

関連する問題