同じ文字列が何個続くか勘定する。
aabbbcccc なら,a が 2個,b が 3個,c が 4個なので,([2, 3, 4], ["a", "b", "c"]) のようなタプルを返す。
function rle(x)
""" Run Length Encoding
Compute the lengths and values of runs of equal values in a vector – or the reverse operation.
rle("001111000000011")
# ([2, 4, 7, 2], ["0", "1", "0", "1"])
rle("aabcccbbbaab")
# ([2, 1, 3, 3, 2, 1], ["a", "b", "c", "b", "a", "b"])
"""
s = split(x, "")
n = length(x)
n == 0 && return (Int[], "")
y = s[2:end] .!= s[1:end-1]
i = vcat((1:length(y))[y], n)
diff(vcat(0, i)), string.(s[i])rle(
end
rle("001111000000011") # ([2, 4, 7, 2], ["0", "1", "0", "1"])
rle("aabcccbbbaab") # ([2, 1, 3, 3, 2, 1], ["a", "b", "c", "b", "a", "b"])
StatsBase にも rle() という関数がある。全く同じことをやるのだが,引数はベクトルである。返すタプルも,(種類, 個数) の順。
※コメント投稿者のブログIDはブログ作成者のみに通知されます