密碼傳紙條演算法訓練 -- 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()
本文原創,