注:おそらくこれを学校の課題として行っているようです。以下のコードは、完全なソリューションとしてではなく、例としてのみ使用することを強くお勧めします。私はあなたの任務を取り巻く盗作の問題があることを嫌います、そしてあなたの教授/教師は前の仕事のためにグーグルで知識があると確信しています。あなたの割り当てに頑張ってください!
私はあなたの問題にどのように取り組むことができるかについての簡単な例を書きました。この例には、いくつかの既知の問題があります。
- 大文字は扱いません。(小文字に変換する以外。)
- 句読点や英数字以外の文字は扱いません。(数字、スペース、または行末。)
- エラーチェックはありません。
- -25未満の数値を変換しようとすると、スローされます。
おそらく、解決する必要のある最大の問題は、とを使用しないという制限でしord()
たchr()
。文字から数字へ、またはその逆の独自の変換リストを作成することで、この制限を回避しました。確実に対処するためのトリッキーなコーナーケースは、シフトによって文字が変換範囲[0,25]の外に移動した場合に発生することです。
補足として、ファイルを復号化する場合は、ファイルをプレーンテキストとして開き、絶対値が暗号化オフセットと等しい負のオフセットを使用できます。または、パラメータを使用する場合は、平易な英語で:
infile = clear.txt, offset = 1, outfile = encrypted.txt
復号化するには、次を使用できます。
infile = encrypted.txt, offset = -1, outfile = decrypted.txt
caesarcipher.py
import itertools
letters = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
'r','s','t','u','v','w','x','y','z']
numbers = range(26) # Numbers 0 - 25
lettersToNumbers = dict(zip(letters, numbers))
numbersToLetters = dict(zip(numbers, letters))
def printHeader():
""" Print the program informational header """
print """=======================================
Welcome to CaesarCipher - The unbreakable
Roman cipher.
======================================="""
def convertToNumber(letter):
""" Convert a letter to a number using our predefined conversion table
@param letter: The letter to convert to an integer value
@type letter: str
@rtype: int
"""
return lettersToNumbers[letter]
def convertToLetter(number):
""" Convert a number to a letter using our predefined conversion table
@param number: The number to convert to a letter
@type number: int
@rtype: str
"""
# If we shift outside of our range make sure to wrap
if number > 25:
return numbersToLetters[number%25]
elif number < 0:
return numbersToLetters[number+25]
else:
return numbersToLetters[number]
def shiftUp(letter, shift):
""" Shift letter up a given number of positions
@param letter: The letter we're shifting
@param shift: The number of positions to shift up
@type letter: str
@type shift: int
@note: For simplicity we encode both capital and lowercase letters
to the same values
"""
number = convertToNumber(letter.lower())
number += shift
return convertToLetter(number)
def prompt():
""" Prompt for user input
@rtype: tuple of str, int, str
"""
infile = raw_input("File to encrypt: ")
offset = int(raw_input("Encoding number: "))
outfile = raw_input("Encrypted file destination: ")
return (infile, offset, outfile)
def encrypt(infile, offset, outfile):
""" Encrypt the file using the given offset """
print "=== Plaintext input ==="
printFile(infile)
with open(infile) as red_file:
with open(outfile, 'w') as black_file:
for line in red_file:
for letter in line:
# Only convert alphabetic characters
if letter.isalpha():
black_file.write(shiftUp(letter, offset))
else:
black_file.write(letter)
print "=== Ciphertext output ==="
printFile(outfile)
def printFile(path):
""" Print the data in the given file """
with open(path) as print_file:
for line in print_file:
print line
printHeader()
encrypt(*prompt()) # `*` unpacks the tuple returned by `prompt()` into
# three separate arguments.
test.txt
abcdef
ABCDEF
This is some text I want to try and encrypt.
実行例:
mike@test:~$ python caesarcipher.py
=======================================
Welcome to CaesarCipher - The unbreakable
Roman cipher.
=======================================
File to encrypt: test.txt
Encoding number: 1
Encrypted file destination: test.out
=== Plaintext input ===
abcdef
ABCDEF
This is some text I want to try and encrypt.
=== Ciphertext output ===
bcdefg
bcdefg
uijt jt tpnf ufyu j xbou up usz boe fodszqu.