###### 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 字串中,最終輸出完整的字串並添加空行。