1. 程式人生 > >密碼傳紙條演算法訓練 -- python 實現

密碼傳紙條演算法訓練 -- python 實現

今天幫朋友解了一個很有意思的問題 -- 傳紙條,(要求用python實現)題目如下:

李雷和韓梅梅坐前後排,上課想說話怕被老師發現,所以改為傳小紙條。為了不被老師發現他們紙條上說的是啥,他們約定了如下方法傳遞資訊:
將26個英文字母(全為大寫),外加空格,一共27個字元分成3組,每組9個。也就是ABCDEFGHI是第一組,JKLMNOPQR是第二組,STUVWXYZ*是第三組(此處用*代表空格)。
然後根據傳遞紙條那天的日期,改變字母的位置。
先根據月份數m,以整個分組為單位進行迴圈左移,移動(m-1)次。
然後根據日期數d,對每個分組內的字元進行迴圈左移,移動(d-1)次。
以3月8日為例,首先移動分組,3月需要迴圈左移2次,變成:
STUVWXYZ*,ABCDEFGHI,JKLMNOPQR
然後每組內的字元,8日的話需要迴圈左移7次,最終的編碼為:
Z*STUVWXY,HIABCDEFG,QRJKLMNOP
對於要傳遞資訊中的每個字元,用組號和組內序號兩個數字來表示。
如果在3月8日傳遞資訊“HAPPY”,那麼H位於第2組的第1個,A位於第2組第3個,P位於第3組第9個,Y位於第1組第9個,所以紙條上會寫成:
21 23 39 39 19
現在給定日期和需要傳遞的資訊,請輸出應該寫在紙條上的編碼。

輸入規範:
每個輸入包含兩行。第一行是用空格分隔的兩個數字,第一個數字是月份,第二個數字是日子。輸入保證是一個合法的日期。
第二行為需要編碼的資訊字串,僅由A~Z和空格組成,長度不超過1024個字元。

輸出規範:
對每個輸入,列印對應的編碼,數字之間用空格分隔,每個輸出佔一行。

輸入示例1:
3 8
HAPPY
輸出示例1:
21 23 39 39 19

輸入示例2:
2 14
I LOVE YOU
輸出示例2:
35 25 18 12 29 31 25 23 12 28

程式碼實現:


"""
題目求的是字母位置,也就是 (下標 + 1), 所以我們計算分組的下標和字母下標就好
開始需要計算 組的初始下標和字母在組中的初始下標,也就是字母的  (初始位置-1),
"""
#初始字母
letterList = ['ABCDEFGHI','JKLMNOPQR','STUVWXYZ*']
#字母下標
letterSubDict = {}
#計算初始下標
def comp_sub():
    global letterSubDict
    for i,j in enumerate(letterList):
        for a,b in enumerate(j):
            letterSubDict[b] = [i,a]

# 這裡獲取時間和字串,並計算字母移動過後的下標
def encry():
    global  letterSubDict
    date = input('輸入日期:')
    dateList =  [int(i) for i in date.split(' ')]
    strInfor = input('輸入字串:')
    #將空格轉為 * 號
    strInfor = strInfor.replace(' ','*')
    #月份實際移動次數和天數實際移動次數
    Mnums = (dateList[0]-1) % 3
    Dnums = (dateList[1]-1) % 9
    """
    。。。。。。。。。計算字母此時位置。。。。。。。。。。
    這裡很神奇:
    Python序列中的一個值按題目的方法移動,移動次數不大於序列長度的話, 下標 - 移動距離 = 移動後結果的反向下標
    (序列長度 + 反向下標) % 序列長度 = 正向下標 
    正向下標 + 1 = 字母位置
    """
    for i,j in letterSubDict.items():
        j[0] = str((3+(j[0]-Mnums))%3+1)
        j[1] = str((9+(j[1]-Dnums))%9+1)
        letterSubDict[i] = j
    #此處遍歷字串,並從字典中把字母的位置取出來就好
    position = []
    for i in strInfor:
        posit = ''.join(letterSubDict[i])
        position.append(posit)
    position = ' '.join(position)
    print(position)

if __name__ == '__main__':
    comp_sub()
    encry()

 

本文原創,