2024年5月12日 星期日

【ZEROJUDGE】522. 106 彰雲嘉區複賽 - Q2 跑長編碼與資料壓縮

 522. 106 彰雲嘉區複賽 - Q2 跑長編碼與資料壓縮

ttps://zerojudge.tw/ShowProblem?problemid=e522

解題思路-Python-給我自己的筆記 

1。輸入n(有n筆)
  我用ans=[ ]放答案用

2for迴圈an
  ans.append([ ]) 用二維陣列放答案
  s=input 一筆一筆放資料
  我先判斷如果輸入的不是二進位,直接給-1,跳出這回合的for continue
    (判斷方式,出現1的次數+出現0的次數不等於s總長度)
  ss=[ ] 我用一個空list放各組連續結果
  for迴圈is字串次,一個一個字元抓出來看
    如果是一樣的字元,確定長度小於7時,放同一個ss[[放這裡]]
           長度=7時,創一個新的[ ]放。ss[[滿7],[放新的這裡]]
    否則(不一樣字元時),創一個新的[ ]放。ss[[相同],[不同的放這]]
  處理ss,把它整整成壓縮後的格式
  for迴圈xss次,每次抓出一組相同的值
    計算有幾個字元,轉二進位之後整理成所要的格式
    xx[0].zfill(1)+(bin(tim)[2:]).zfill(3)   
    第一個值放01的字元,
    之後三個放二進位之後的結果,zfill0三位數。 bin轉二進位
  算壓縮率後放到ans

3。印出ans

----------------------

程式碼參考

n=int(input())   #輸入有n

ans=[] #放所有答案用

for a in range(n):  #n筆跑n

    ans.append([])  #ans用二維裝

    s=input()  #一筆一筆輸入資料

    if s.count('1')+s.count('0') != len(s):   #若輸入非二進位時(10的次數長度不符)

        ans[a].append(-1)

        continue  #跳出本次,到下一次

    ss=[]  #放各組連續的結果

    ind=0  #[0]開始放

    ss.append([]) 

    t=s[0] #抓第一個出來看

    for i in s:   #看輸入的單組字串有多長就跑幾次

            if i == t:       #把相同的放一組,有可能281

                if len(ss[ind])<7:   

                    ss[ind].append(i)

                else:

                    ss.append([])                    

                    ind=ind+1

                    ss[ind].append(i)

            else:

                ss.append([])

                ind=ind+1                

                ss[ind].append(i)

                t=str(int(t)^1)   

    #處理ss整理成壓縮後的格式

    timx=0

    for x in ss:

        ans[a].append([])

        xx=''.join(x)       

        tim=len(xx)        

        ans[a][timx]=(xx[0].zfill(1)+(bin(tim)[2:]).zfill(3))

        timx=timx+1

    #算壓縮率

    xxx=''.join(ans[a])    

    ans[a].append(str(round(len(xxx)/len(s)*100)) +'%')

for i in ans:    

    print(*i)