2016-12-07 10 views
2

私は文字、「CHAR」(1の長さの文字列)、および整数「腐敗を受け取る機能機能 - シーザー暗号

rotate_character(char, rot) 

を作成しようとしています"この関数は、長さが1の新しい文字列を返す必要があります。これは、右の場所の腐敗数でcharを回転した結果です。

だから腐敗のためのチャー及び「13」は、「A」の入力は、(0の初期値を有し、そしてB 1の初期値などを有する)

N 

を返します。回転中に大文字を維持する必要があります。私は回転前(文字)の初期値を取得するには、この機能を使用することができることを理解

letter = input("Enter a letter: ") 

def alphabet_position(letter): 
    alphabet_pos = {'A':0, 'a':0, 'B':1, 'b':1, 'C':2, 'c':2, 'D':3, 
        'd':3, 'E':4, 'e':4, 'F':5, 'f':5, 'G':6, 'g':6, 
        'H':7, 'h':7, 'I':8, 'i':8, 'J':9, 'j':9, 'K':10, 
        'k':10, 'L':11, 'l':11, 'M':12, 'm':12, 'N': 13, 
        'n':13, 'O':14, 'o':14, 'P':15, 'p':15, 'Q':16, 
        'q':16, 'R':17, 'r':17, 'S':18, 's':18, 'T':19, 
        't':19, 'U':20, 'u':20, 'V':21, 'v':21, 'W':22, 
        'w':22, 'X':23, 'x':23, 'Y':24, 'y':24, 'Z':25, 'z':25 } 
    pos = alphabet_pos[letter] 
    return pos 

私はすでに辞書を用いてアルファベットの文字の位置を返す関数を作成しました。

def rotate_character(char, rot) 
    initial_char = alphabet_position(char) 
    final_char = initial_char + rot 

しかし、私の問題は、initial_char + rotが25より大きい場合、アルファベットの先頭に折り返してカウントを続ける必要があるということです。だから、「W」の入力(22の初期値)+腐敗のための8の入力はIのpythonを使用してこれを言うにはどうすればよい

e 

を返す必要がありますか?

if final_char > 25, start at the beginning of the list and continue counting 

alphabet_position関数で作成した辞書を使用する必要がありますか?私はこのように、文字のPythonの組み込みリストを使用して文字番号を見つけるIt was also suggested

import string 

letter = input('enter a letter: ') 

def alphabet_position(letter): 
    letter = letter.lower() 
    return list(string.ascii_lowercase).index(letter) 

return(alphabet_position(letter)) 

私はこれらの一つは、あなたがあなたながらラップする必要があるときに行くには良いオプションであるかわからないんだけど再カウント。あなたの助けを借りて/ありがとう!

EDIT

letter = input("enter a letter") 
rotate = input("enter a number") 

def rotate(letter, rotate): 
    letter = letter.lower() 
    return chr((ord(letter) + rotate - 97) % 26 + 97) 

print(rotate(letter)) 

EDIT 2

今、私のコードは次のようになります

def rotate(letter, number): 
    letter = letter.lower() 
    shift = 97 if letter.islower() else 65 
    return chr((ord(letter) + number - shift) % 26 + shift) 

letter = input('Enter a letter: ') 
number = int(eval(input('Enter a number: ') 
print(rotate(letter, number)) 

私にParseErrorのを与えた:「ParseErrorです:ライン上で不正な入力を8 "(印刷ライン)

+1

: 'print'前のラインでかっこの数はアンバランスです。ところで、 '' eval'を使うのをやめる!**](http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html)ちょうど '数値= int(入力( '数字を入力:'))'十分です。 – Matthias

答えて

3
def rotate(letter, rot): 
    shift = 97 if letter.islower() else 65 
    return chr((ord(letter) + rot - shift) % 26 + shift) 

letter = input('Enter a letter: ') 
rot = int(input('Enter a number: ')) 
print(rotate(letter, rot)) 
+0

これは、私が最初の関数、alphabet_positionを取り除く必要があるということですか?私が今使っているものを正確に見るために上記の編集を見てください。私はそれを実行しようとし、TypeErrorを持っています: "TypeError:rotate()は、8行目に2つの引数(1つの引数)をとります"。また、大文字を維持する必要があります。つまり、A + 13と入力すると、nの代わりにNが返されます。 – HappyHands31

+0

はい、その機能は不要です。 'ord(letter)+ rotate-97'は同じことを行い、回転します。それで '%26 + 97'は' chr'関数が幸せになることを保証します。何よりも、このソリューションは組み込み関数以外のものを必要としません。輸入の必要はありません。 –

+0

さて、なぜ私はエラーメッセージを受け取っているのですか? "TypeError:rotate()は、8行目に2つの引数(1が与えられている)を正確に取ります。 – HappyHands31

2
あなたは stringモジュールを使用して、アルファベットの最後を「ラップアラウンド」する剰余演算子を使用することができます

2番目の編集からエラーに関する
from string import lowercase 

def rotate_char(char, rot): 

    i = lowercase.index(char) 
    return lowercase[(i + rot) % 25]