-4

ユーザーから値を取得し、Passwords.txt ファイルから単語のリストを読み取り、各文字を値ごとに右にシフトしようとしています。

•def shift():
    value=eval(input("Please enter the value here."))
    file = open("Passwords.txt","w")
    with open ("word-text.txt","r") as m:
        for line in m:
            line=line.strip()
            print (line)
            newString = ""
            for char in line:
                char_int=ord(char)
                t=char_int+value
                if t==124:
                    t = t-27
                charme= chr(t)
                print (char,">>",charme)
                newString += charme
            file.writelines(line+" "+newString+"\n")
4

3 に答える 3

1

ascii に変換する必要はありません。maketrans 関数を使用するだけです。

def shift_string(text, shift):
    intab='abcdefghijklmnopqrstuvwxyz'
    outab=intab[shift:]+intab[:shift]
    return maketrans(intab, outab)
于 2013-10-27T09:06:48.483 に答える
0

大変な作業は単語の変換を行うことなので、私はそれを行いました - 残りは非常に些細なことなので、あなたが行うことができます。:)

これは、各文字を数値表現に変換し、循環パフォーマンスを修正することによって機能します (つまりZ、シフトによって2出力されますB)。

def limits_correction(character, distance, start, end):
    char = character
    if char >= start and char < end:
        if char + distance >= end:
            char = char + distance - 26
        else:
            char = char + distance
    return char


def modify_string(string, distance):
    ords = [ord(c) for c in string]

    corrected_distance = 0
    if distance > 26:
        corrected_distance = distance % 26
    elif distance > 0 and distance <= 26:
        corrected_distance = distance

    lower_start = 97
    lower_end = lower_start + 26
    upper_start = 65
    upper_end = upper_start + 26

    shifted_string = []

    for char in ords:
        if char >= lower_start and char < lower_end:
            char = limits_correction(char, corrected_distance, lower_start, lower_end)
        elif char >= upper_start and char < upper_end:
            char = limits_correction(char, corrected_distance, upper_start, upper_end)

        shifted_string.append(chr(char))

    return ''.join(shifted_string)

これは、任意の整数シフト番号 (0 から非常に大きいものまで)の大文字と小文字にも機能します。

参照:

http://www.asciitable.com/

于 2013-10-27T08:13:09.593 に答える
0

課題は自分で行う必要があり (そうでないと、プログラミングを学ぶ意味がありません)、質問が理解できない場合は、先生に質問して説明を求める必要があります。

とはいえ、シフトは原則として非常に簡単です。手で行うことができます。A という文字がある場合、それを 1 (キー = 1) ずらすと B に変換されます。代入では、2 桁ずらすと、A は C になり、B (元の単語では) は D になります。等々。アルファベットの末尾には少し注意が必要です。1 シフトすると、Z は A になります。2 シフトすると、Y は A になり、Z は B になります。

したがって、あなたの例では、HELLO は JGNNQ になります。

H => J

E => G

L => N

O => Q

(注:読みやすくするために大文字を使用していますが、あなたの割り当ては小文字の作業に関するものであるようです。小文字のみを処理するよう求められていると思います。)

これどうやってやるの?あなたが与えられたリンクをチェックしてください。基本的に ord() は文字を整数に変換し、chr() はそのような整数の 1 つを文字に変換します。これは、コンピューターで文字が数字として表現される方法に基づいています。そのため、特定の文字を ord() に変換すると、キーを追加してシフトし、chr() で文字に戻すことができます。

Y と Z から A と B にラップするには、モジュラス演算子 (%) を使用できますが、少し面倒なので注意してください (文字の順序と 'a' の順序の差を計算する必要があります)。 、% 26 (0 から 25 までの数値が得られます) を適用し、それを ord('a) に追加して正しい ord を取得します)。複雑すぎる場合は、いくつかの IF を使用してください。

ユーザーからの入力を受け取り、出力を出力して正しく動作していることを確認する小さなプログラムから始めることをお勧めします。最終バージョンでは入力と出力は必要ありませんが、シフト コードが正しく機能することをテストするのに役立ちます。

次に、ファイルからの読み取りとファイルへの書き込みに関する部分があります。割り当ては、ユーザーに入力を求めるのではなく、ファイルから読み取ります。あなたの行with open ("word-text.txt","r") as f:は問題ないように見えます。これにより、データを読み取るために必要なファイルハンドルが得られます。f.read() でデータを読み取り、変数に割り当てることができます。あなたが何を教えられたかはわかりませんが、文字列を単語に分割して、文字列<string>.split()のリスト(あなたの言葉)を作成します。

次に、単語ごとに、以前に記述したコードを使用して文字列をシフトし、元の単語とシフトされた単語の両方を出力ファイルに書き込むことができます。最も簡単な方法は、出力ファイルを (書き込みモードで) 開くことから始めて、リストをループすることにより、シフトと書き込みの両方を一度に行うことです。

于 2013-10-27T09:24:40.347 に答える