RosettaCodeData/Task/Run-length-encoding/Refal/run-length-encoding.refal

45 lines
743 B
Plaintext

$ENTRY Go {
, <Print <Example>>: e.In
, <Print <RLEncode e.In>>: e.Enc
= <Prout <RLDecode e.Enc>>;
};
Example {
= 'WWWWWWWWWWWWBWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWWWWWWWWWWBWWWWWWWWWWWWWW';
};
RLEncode {
e.X = <Each (Count) <Chunk e.X>>;
};
RLDecode {
e.X = <Concat <Each (Repeat) e.X>>;
};
Count {
e.X, <Lenw e.X>: s.L s.C e.Y = s.L s.C;
};
Repeat {
0 s.C = ;
s.N s.C = s.C <Repeat <Sub s.N 1> s.C>;
};
Each {
(e.F) = ;
(e.F) (e.X) e.Y = (<Mu e.F e.X>) <Each (e.F) e.Y>;
};
Chunk {
= ;
(e.I) = (e.I);
(e.I t.I) t.I e.X = <Chunk (e.I t.I t.I) e.X>;
(e.I) t.J e.X = (e.I) <Chunk (t.J) e.X>;
t.I e.X = <Chunk (t.I) e.X>;
};
Concat {
= ;
(e.X) e.Y = e.X <Concat e.Y>;
};