###### tags: `APCS` # **e283-小崴的特殊編碼** ### **題目連結:** [**e283**](https://zerojudge.tw/ShowProblem?problemid=e283) ### **題目解析** 這道題目要求將經過特殊編碼的字串解碼,輸入的編碼只包含字元 A~F 對應的二元序列。我們需要將這些二元序列轉換回原始的字元。 ### **解題方向** 1. 建立一個編碼對照表,將每個字元對應的二元序列存入字典。 1. 讀取輸入的字串長度及其對應的二元序列。 1. 將每個二元序列對應回原始的字元,組成完整的原始字串。 1. 讀取到 EOF 結束。 ### **程式解析** * 版本一 * 使用列表 code 來存儲每個字元對應的二元序列,和 charset 來存儲對應的字元。 * 使用 sys.stdin 來讀取輸入直到 EOF。 * 對於每個輸入,讀取字串的長度 N,然後讀取 N 行二元序列。 * 將每行二元序列轉換為整數列表,然後對照 code 找到對應的字元。 * 輸出解碼後的字串,每個字串之間用一個空行隔開。 * 版本二 * 使用字典 code 來直接對應每個二元序列字串和對應的字元。 * 使用 sys.stdin 來讀取輸入直到 EOF。 * 對於每個輸入,讀取字串的長度 N,然後讀取 N 行二元序列。 * 將每行二元序列轉換為字串並查找對應的字元。 * 將解碼後的字串存入 ans,最後輸出完整的解碼字串,每個字串之間用一個空行隔開。 ### **完整程式碼** 版本一 ```python= import sys code = [[0, 1, 0, 1], [0, 1, 1, 1], [0, 0, 1, 0], [1, 1, 0, 1], [1, 0, 0, 0], [1, 1, 0, 0]] charset = ['A', 'B', 'C', 'D', 'E', 'F'] #start for i in sys.stdin: N = int(i) for i in range(N): s = sys.stdin.readline() data = list(map(int, s.split())) for x in range(6): if code[x] ==data : print(charset[x], end='') break print() ``` 版本二 ```python= import sys code = { "0 1 0 1":"A", "0 1 1 1":"B", "0 0 1 0":"C", "1 1 0 1":"D", "1 0 0 0":"E", "1 1 0 0":"F"} #start for i in sys.stdin: N = int(i) ans = "" for i in range(N): #使用 strip() 去除字串字尾 \n s = sys.stdin.readline().strip('\n') ans +=code[s] print(ans) ``` ### 詳細解析 版本一 * code 變數包含了對應字元的二元序列列表,charset 變數包含對應的字元。 * 使用 sys.stdin 讀取輸入直到 EOF。 * 每次讀取一個整數 N,表示接下來的 N 行是編碼。 * 內層迴圈讀取 N 行二元序列,將每行轉換為整數列表並檢查是否在 code 中。 * 如果匹配,則輸出對應的字元,最終輸出完整的字串並添加空行。 版本二 * code 字典直接對應二元序列字串和對應的字元,方便查找。 * 使用 sys.stdin 讀取輸入直到 EOF。 * 每次讀取一個整數 N,表示接下來的 N 行是編碼。 * 內層迴圈讀取 N 行二元序列,去除換行符並查找對應字元。 * 將字元添加到 ans 字串中,最終輸出完整的字串並添加空行。