# a065 - 提款卡密碼 ### 題目連結: [a065](https://zerojudge.tw/ShowProblem?problemid=a065) ### 題目解析 * 將英文字串轉換為密碼 * 密碼轉換通常有所謂的公式、規則,依據這些項目,就能將任何字元進行轉換 ### 題目類型 字元處理 ### 範例測資解讀 * 輸入 * 每筆資料一行,每行為七個相連的大寫字母,中間無空白 * 輸出 * 經過公式後產生的密碼,由於規則限制,必定為六個數字字元 ### 其他注意事項 此題的規則限制滿嚴格的,因此輸入資料都必定為7個英文字元,因此不會有太過於複雜的程式設計 ### 程式解析 將英文字母轉換為密碼的公式題目上有說明: * 相鄰的每兩個字母間的「距離」就依序代表密碼中的一位數。 * 所謂「距離」指的是從較「小」的字母要數幾個字母才能數到較「大」字母。字母的大小則是依其順序而定,越後面的字母越「大」。 從以上規則可以整理出程式計算的方法 1. 查表法 ``` python CODE = ['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'] def encode(c1, c2): # 首先抓出兩個字母 c1, c2 if c1 in CODE: num1 = CODE.index(c1)+1 if c2 in CODE: num2 = CODE.index(c2)+1 if num1>=num2: r = num1 - num2 elif num1<num2: r = num2 - num1 else: r = num1 - num2 return r ``` 2. ASCII 比較法,利用英文字元都有一個相對應 code 的方式,相減後取絕對值並減掉-48 ``` python def encode(c1, c2): # 首先抓出兩個字母 c1, c2 r = abs(ord(c1)-ord(c2))-48 return r ``` ### 完成程式碼 (基礎寫法提供初學者參考,並非優化過後的程式碼) ``` python=01 import sys CODE = ['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'] def encode(c1, c2): if c1 in CODE: num1 = CODE.index(c1)+1 if c2 in CODE: num2 = CODE.index(c2)+1 if num1>=num2: r = num1 - num2 elif num1<num2: r = num2 - num1 else: r = num1 - num2 return r #start for s in sys.stdin: data = list(s) #移除最後的 '\n' data.pop() for i in range(len(data)-1): result = encode(data[i], data[i+1]) print(result, end='') print() ``` ###### tags: `基礎15題解` `APCS` `ZeroJudge`