在UVa10415題目,關於薩克斯風的按鍵要做資料預處理。手打是最差但最穩方法,但是以程式設計師為目標,當然要用程式做預處理。以下是處理資料各版本,並從版本中發現錯誤做修改。
將上圖資料處理成下方所述
c=[0, 1, 1, 1, 0, 0, 1, 1, 1, 1]
bt=按鍵。
0=無,1=按下。
sinp為每一行資料讀入。
為避免水字嫌疑,所以結果輸出只輸出部分。
bt=[0]*10
for bti in range(12,len(sinp)):
if (sinp[bti]=="∼"):
for fb in range(int(sinp[bti-1])-1,int(sinp[bti+1])):
bt[fb]=1
print(bt)
d 2∼4, 7∼9
[0, 1, 1, 1, 0, 0, 1, 1, 1, 0]
e 2∼4, 7, 8
[0, 1, 1, 1, 0, 0, 0, 0, 0, 0]
如果遇到音符"e",那麼按鍵7,8會顯示0,這是錯誤的。
反思:思考單數字處理
#判斷字元是否為數字
for nui in range(10):#num=文字0~9
num.append(str(nui))
for bti in range(12,len(sinp)):
#新增下段,處理單數字
if(sinp[bti]) in num:
bt[int(sinp[bti])]=1
...
c 2∼4, 7∼10
[1, 1, 1, 1, 1, 0, 0, 1, 0, 0]
e 2∼4, 7, 8
[0, 1, 1, 1, 1, 0, 0, 1, 1, 0]
但是"c"只讀取到1,而不是10
import sys
sinp=sys.stdin.readline()
while (sinp!=""):
bt=[0]*10#薩克斯風按鈕
oper=[]
sinp=sinp.replace("\n","").replace(",","")#整理原始資料
print(sinp[2],sinp[12:len(sinp)])#輸出音符、按鈕位置
#按鈕添加
oper=sinp[12:len(sinp)].split()#儲存按鈕位置
for opi in range(len(oper)):
if(len(oper[opi])>2):#表示資料有"~"連接,所以長度大於2,例:2∼4、7∼10。
#這邊會得到兩個數字,就算數字是二位元以上,也不會有版本二的錯誤。
oper[opi]=oper[opi].replace("∼"," ").split()
for bti in range(int(oper[opi][0])-1,int(oper[opi][1])):
bt[bti]=1#將範圍數字一到數字二,按鈕設為真
else:
bt[int(oper[opi])-1]=1#將單數字按鈕設為真
print(oper)
print(bt)
sinp=sys.stdin.readline()
c 2∼4 7∼10
[['2', '4'], ['7', '10']]
[0, 1, 1, 1, 0, 0, 1, 1, 1, 1]
d 2∼4 7∼9
[['2', '4'], ['7', '9']]
[0, 1, 1, 1, 0, 0, 1, 1, 1, 0]
e 2∼4 7 8
[['2', '4'], '7', '8']
[0, 1, 1, 1, 0, 0, 1, 1, 0, 0]
前面太過於執著一個個字元讀取,如果善加利用split()。
資料處理會比較輕鬆,也不用一直判斷資料範圍及資料型別。
這題解題思路花不到半小時,但是資料處理卻花了三小時之久。
找時間要研究資料結構這門課
感謝撥冗閱讀