0

つまり、基本的に、スタンザでいっぱいのテキストドキュメントを取得し、各スタンザの最初の行の命令を使用してそれらをデコードし、それを使用して後続の各行の暗号をデコードするこのコードがあります。サンプルは次のようになります。

-25 + 122-76
?ST ^ jT ^ jLj_P ^ _jZQj_SPjTY [`_jQTWPx?ST ^ jT ^ j_SPj ^ PNZYOjWTYPx

+ 123 + 12 + 1234
0A:MXPBEEXA:II> GXGHPw

これは、最初の行に整数を追加し、各ASCII文字をその分シフトすることによって解読されます。これまでの私のコードは次のようになります。

#Here I define the Shift function that will take a character, convert it to its ASCII numeric value, add N to it and return the ASCII character.

def Shift(char, N):
    A = ord(char)
    A += N
    A = chr(A)
    return A

#Here's the code I have that opens and reads a file's first line as instructions, evaluates the numeric value of that first line, throws rest into a list and runs the Shift helper function to eval the ASCII characters.
def driver(filename):
    file = open(filename)
    line = file.readline()
    file = file.readlines()
    N = eval(line)
    codeList = list(file)  
    for char in codeList:  
        newChar = Shift(char, N)  
        codeList[char] = codeList[newChar]  
    print str(codeList)  

さて、私の質問は、スタンザのすべての空白行の後にコードを繰り返すにはどうすればよいですか?また、ASCII範囲32(スペース)および126(〜)内でのみ文字をシフトさせるにはどうすればよいですか?また、これはPython2.7.3を使用しています

4

2 に答える 2

1

範囲内に収めるために、aを使用できます。dequeまた、evalさようならを作成し、最初に数値を手動でintに変換してから、変換テーブルを使用してデータをデコードします。例:

data = """-25+122-76
?ST^jT^jLj_P^_jZQj_SPjTY[`_jQTWPx ?ST^jT^j_SPj^PNZYOjWTYPx"""

lines = data.splitlines()

import re
from collections import deque
from string import maketrans

# Insted of using `eval` - find number with signs and sum
shift = sum(int(i) for i in re.findall('[-+]\d+', lines[0]))
# Explicit range of characters
base_set = map(chr, range(32, 127))
# Create a new deque which can be rotated and rotate by shift
d = deque(base_set)
d.rotate(-shift)
# Make translation table and translate
t = maketrans(''.join(base_set), ''.join(d))
print lines[1].translate(t)
# This is a test of the input file.5This is the second line.
于 2013-03-13T18:00:02.227 に答える
0
file = open(filename)
while True:
    line = file.readline()
    if not line:      # if end of file, exit
        print "Reached end of file"
        break
    if line == "\n":  # if new line, or empty line, continue
        continue
    else:
        your function

すべてをASCII範囲に保つ限り、私はあなたに返事をしなければなりません。簡単な答えではない場合は、すべてを正しい範囲に保つために別の制御構造を試してください。簡単な計算で十分です。

これを参照することもできます: リンク

于 2013-03-13T17:44:08.713 に答える