Run-length encoding: Difference between revisions
Content added Content deleted
(add RPL) |
imported>Maxima enthusiast |
||
Line 3,664: | Line 3,664: | ||
=={{header|Maxima}}== |
=={{header|Maxima}}== |
||
To encode |
|||
<syntaxhighlight lang="maxima">rle(a) := block( |
<syntaxhighlight lang="maxima">rle(a) := block( |
||
[n: slength(a), b: "", c: charat(a, 1), k: 1], |
[n: slength(a), b: "", c: charat(a, 1), k: 1], |
||
Line 3,670: | Line 3,671: | ||
sconcat(b, k, c) |
sconcat(b, k, c) |
||
)$ |
)$ |
||
</syntaxhighlight> |
|||
To decode |
|||
<syntaxhighlight lang="maxima"> |
|||
/* Function to return a list where all but the last entries are integers */ |
|||
intbucket(lst):=block(bucket:[],while integerp(first(lst)) do (push(first(lst),bucket),lst:rest(lst)),lst:append(reverse(bucket),[first(lst)])); |
|||
/* Run-length decoding */ |
|||
rld(string_list):=block( |
|||
coref:map(eval_string,charlist(string_list)), |
|||
listcharact:sublist(coref,lambda([x],integerp(x)=false)), |
|||
map(intbucket,append([coref],makelist(coref:rest(coref,length(intbucket(coref))),length(listcharact)-1))), |
|||
makelist(sublist(%%[i],integerp),i,1,length(%%)), |
|||
map(eval_string,makelist(apply(concat,%%[i]),i,1,length(%%))), |
|||
makelist(smake(%%[i],string(listcharact[i])),i,1,length(listcharact)), |
|||
apply(concat,%%)); |
|||
</syntaxhighlight> |
|||
Output |
|||
<syntaxhighlight lang="maxima"> |
|||
rle("WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"); |
rle("WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"); |
||
"12W1B12W3B24W1B14W" |
"12W1B12W3B24W1B14W" |
||
rld(%); |
|||
/* "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW" */ |
|||
</syntaxhighlight> |
|||
=={{header|MMIX}}== |
=={{header|MMIX}}== |