Python HAIL CAESAR (凯撒密码) 3

# 6.00x Problem Set 6
#
# Part 1 - HAIL CAESAR!


import string
import random


WORDLIST_FILENAME = "E:/python/2015-6-10/words.txt"


# -----------------------------------
# Helper code
# (you don't need to understand this helper code)
def loadWords():
    """
    Returns a list of valid words. Words are strings of lowercase letters.
    
    Depending on the size of the word list, this function may
    take a while to finish.
    """
    print "Loading word list from file..."
    inFile = open(WORDLIST_FILENAME, 'r')
    wordList = inFile.read().split()
    print "  ", len(wordList), "words loaded."
    return wordList


def isWord(wordList, word):
    """
    Determines if word is a valid word.


    wordList: list of words in the dictionary.
    word: a possible word.
    returns True if word is in wordList.


    Example:
    >>> isWord(wordList, 'bat') returns
    True
    >>> isWord(wordList, 'asdf') returns
    False
    """
    word = word.lower()
    word = word.strip(" !@#$%^&*()-_+={}[]|\\:;'<>?,./\"")
    return word in wordList


def randomWord(wordList):
    """
    Returns a random word.


    wordList: list of words  
    returns: a word from wordList at random
    """
    return random.choice(wordList)


def randomString(wordList, n):
    """
    Returns a string containing n random words from wordList


    wordList: list of words
    returns: a string of random words separated by spaces.
    """
    return " ".join([randomWord(wordList) for _ in range(n)])


def randomScrambled(wordList, n):
    """
    Generates a test string by generating an n-word random string
    and encrypting it with a sequence of random shifts.


    wordList: list of words
    n: number of random words to generate and scamble
    returns: a scrambled string of n random words


    NOTE:
    This function will ONLY work once you have completed your
    implementation of applyShifts!
    """
    s = randomString(wordList, n) + " "
    shifts = [(i, random.randint(0, 25)) for i in range(len(s)) if s[i-1] == ' ']
    return applyShifts(s, shifts)[:-1]


def getStoryString():
    """
    Returns a story in encrypted text.
    """
    return open("story.txt", "r").read()




# (end of helper code)
# -----------------------------------




#
# Problem 1: Encryption
#
def buildCoder(shift):
    """
    Returns a dict that can apply a Caesar cipher to a letter.
    The cipher is defined by the shift value. Ignores non-letter characters
    like punctuation, numbers and spaces.


    shift: 0 <= int < 26
    returns: dict
    """
    ### TODO.
    b = string.ascii_lowercase
    a = string.ascii_uppercase 
    x = {}
    y = {}
    for z in range(len(a) - shift):
        x[a[z]] = a[z + shift]
    for z in range(len(a) - shift, len(a)):
        x[a[z]] = a[z + shift - len(a)]
    for z in range(len(b) - shift):
        y[b[z]] = b[z + shift]
    for z in range(len(b) - shift, len(b)):
        y[b[z]] = b[z + shift - len(b)]
    return dict(x, **y)
        
        
        


def applyCoder(text, coder):
    """
    Applies the coder to the text. Returns the encoded text.


    text: string
    coder: dict with mappings of characters to shifted characters
    returns: text after mapping coder chars to original text
    """
    ### TODO.
    new = ""
    for word in text:
        if word in string.ascii_lowercase or word in string.ascii_uppercase:
            new = new + coder[word]
        else:
            new = new + word
    return new
    
    
def applyShift(text, shift):
    """
    Given a text, returns a new text Caesar shifted by the given shift
    offset. Lower case letters should remain lower case, upper case
    letters should remain upper case, and all other punctuation should
    stay as it is.


    text: string to apply the shift to
    shift: amount to shift the text (0 <= int < 26)
    returns: text after being shifted by specified amount.
    """
    ### TODO.
    ### HINT: This is a wrapper function.
    try:
        return applyCoder(text, buildCoder(shift))
    except:

        return "0"

    这个地方如果不用try 就一直返回TypeError, 很奇怪 一晚上没搞明白= =

    105     x = {}
    106     y = {}
--> 107     for z in range(26 - shift):
    108         x[a[z]] = a[z + shift]
    109     for z in range(len(a) - shift, len(a)):


TypeError: unsupported operand type(s) for -: 'int' and 'str' 



一直没搞明白 先记录下来


    




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值