48 lines
736 B
Plaintext
48 lines
736 B
Plaintext
**
|
|
** Generates a run-length encoding for a string
|
|
**
|
|
class RLE
|
|
{
|
|
Run[] encode(Str s)
|
|
{
|
|
runs := Run[,]
|
|
|
|
s.size.times |i|
|
|
{
|
|
ch := s[i]
|
|
if (runs.size==0 || runs.last.char != ch)
|
|
runs.add(Run(ch))
|
|
runs.last.inc
|
|
}
|
|
return runs
|
|
}
|
|
|
|
Str decode(Run[] runs)
|
|
{
|
|
buf := StrBuf()
|
|
runs.each |run|
|
|
{
|
|
run.count.times { buf.add(run.char.toChar) }
|
|
}
|
|
return buf.toStr
|
|
}
|
|
|
|
Void main()
|
|
{
|
|
echo(decode(encode(
|
|
"WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW"
|
|
)))
|
|
}
|
|
|
|
}
|
|
|
|
internal class Run
|
|
{
|
|
Int char
|
|
Int count := 0
|
|
new make(Int ch) { char = ch }
|
|
Void inc() { ++count }
|
|
|
|
override Str toStr() { return "${count}${char.toChar}" }
|
|
}
|