iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 27
0
自我挑戰組

程式設計師大冒險系列 第 27

[27/150]將資料做預處理10415 - Eb Alto Saxophone Player

  • 分享至 

  • xImage
  •  

在UVa10415題目,關於薩克斯風的按鍵要做資料預處理。手打是最差但最穩方法,但是以程式設計師為目標,當然要用程式做預處理。以下是處理資料各版本,並從版本中發現錯誤做修改。


10415 - Eb Alto Saxophone Player

大綱

  • 將按鍵處理成布林資料
  • 資料說明
  • 版本一(透過"~")
  • 版本二(增加單數字處理)
  • 版本三(重新處理資料)
  • 總結

將按鍵處理成布林資料

https://ithelp.ithome.com.tw/upload/images/20181027/20091910HvcvwtXLxW.jpg
將上圖資料處理成下方所述
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()。
資料處理會比較輕鬆,也不用一直判斷資料範圍及資料型別。


總結

這題解題思路花不到半小時,但是資料處理卻花了三小時之久。
找時間要研究資料結構這門課
感謝撥冗閱讀


上一篇
[26/150]UVa10057 - 圖解說明(下集)
下一篇
[28/150]10415 - Eb Alto Saxophone Player
系列文
程式設計師大冒險115
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言