53 lines
1.2 KiB
Plaintext
53 lines
1.2 KiB
Plaintext
use RegEx;
|
|
|
|
class RunLengthEncoding {
|
|
function : Main(args : String[]) ~ Nil {
|
|
input := "WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW";
|
|
|
|
encoded := Encode(input);
|
|
"encoding: {$encoded}"->PrintLine();
|
|
test := encoded->Equals("12W1B12W3B24W1B14W");
|
|
"encoding match: {$test}"->PrintLine();
|
|
|
|
decoded := Decode(encoded);
|
|
test := input->Equals(decoded);
|
|
"decoding match: {$test}"->PrintLine();
|
|
}
|
|
|
|
function : Encode(source : String) ~ String {
|
|
dest := "";
|
|
each(i : source) {
|
|
runLength := 1;
|
|
while(i+1 < source->Size() & source->Get(i) = source->Get(i+1)) {
|
|
runLength+= 1;
|
|
i+= 1;
|
|
};
|
|
dest->Append(runLength);
|
|
dest->Append(source->Get(i));
|
|
};
|
|
|
|
return dest;
|
|
}
|
|
|
|
function : Decode(source : String) ~ String {
|
|
output := "";
|
|
regex := RegEx->New("[0-9]+|([A-Z]|[a-z])");
|
|
found := regex->Find(source);
|
|
count : Int;
|
|
each(i : found) {
|
|
if(i % 2 = 0) {
|
|
count := found->Get(i)->As(String)->ToInt();
|
|
}
|
|
else {
|
|
letter := found->Get(i)->As(String);
|
|
while(count <> 0) {
|
|
output->Append(letter);
|
|
count -= 1;
|
|
};
|
|
};
|
|
};
|
|
|
|
return output;
|
|
}
|
|
}
|