連続文字の数え上げ(圧縮)

問題

同じ文字が連続する場合、その文字列の出現回数を数えて圧縮するアルゴリズムを考えます。

0と1の2つの文字だけで構成される文字列を、回数だけで表現します。

(FAXの圧縮などで使われている方法です。)

たとえば、「000001111110111000000001111」[5, 6, 1, 3, 8, 4]というリストに変換するプログラムを作成してください。

文字列は必ず「0」から始まるものとし、「1」で始まる場合はリストの先頭を0にします。

解法・ソースコード

処理中の値は0か1のためフラグで管理し、異なる値が現れたときにフラグを反転させます。

同じ値が続いている場合はカウントし、異なる値が現れた時はこれまでのカウント数をリストに追加し、新たにカウントをリセット、フラグを反転します。

[Google Colaboratory]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
data = '000000111111100111000000001111'

flg = 0
count = 0
result = []
for i in data:
if int(i) == flg:
count += 1
else:
result.append(count)
count = 1
flg = 1 - flg

result.append(count)
print(result)

[実行結果]

[5, 6, 1, 3, 8, 4]