program ideone;
{$MODE FPC}
uses
SysUtils;
procedure RLEEncodeString(const AInput: AnsiString; var AOutput: AnsiString);
var
pchrLetter, pchrToken, pchrLast: PAnsiChar;
begin
pchrLast := @AInput[Length(AInput) + 1];
pchrToken := @AInput[1];
while pchrToken < pchrLast do
begin
pchrLetter := pchrToken;
repeat
Inc(pchrToken);
until pchrToken^ <> pchrLetter^;
AOutput := AOutput + pchrLetter^ + IntToStr(pchrToken - pchrLetter);
end
end;
procedure RLEDecodeString(const AInput: AnsiString; var AOutput: AnsiString);
var
pchrLetter, pchrCntBegin, pchrCntEnd, pchrLast: PAnsiChar;
strCount: AnsiString;
begin
pchrLast := @AInput[Length(AInput) + 1];
pchrLetter := @AInput[1];
while pchrLetter < pchrLast do
begin
pchrCntBegin := pchrLetter + 1;
pchrCntEnd := pchrCntBegin + 1;
while pchrCntEnd^ in ['0' .. '9'] do
Inc(pchrCntEnd);
SetLength(strCount, pchrCntEnd - pchrCntBegin);
Move(pchrCntBegin^, strCount[1], pchrCntEnd - pchrCntBegin);
AOutput := AOutput + StringOfChar(pchrLetter^, StrToInt(strCount));
pchrLetter := pchrCntEnd;
end;
end;
var
strInput, strOutput: AnsiString;
begin
{ encoding }
strInput := 'AAANNNNTTTKKKK';
WriteLn('Input: ', strInput);
RLEEncodeString(strInput, strOutput);
WriteLn('Output: ', strOutput);
WriteLn;
{ swap values }
strInput := strOutput;
strOutput := '';
{ decoding }
WriteLn('Input: ', strInput);
RLEDecodeString(strInput, strOutput);
WriteLn('Output: ', strOutput);
ReadLn;
end.
cHJvZ3JhbSBpZGVvbmU7Cgp7JE1PREUgRlBDfQoKdXNlcwogIFN5c1V0aWxzOwoKICBwcm9jZWR1cmUgUkxFRW5jb2RlU3RyaW5nKGNvbnN0IEFJbnB1dDogQW5zaVN0cmluZzsgdmFyIEFPdXRwdXQ6IEFuc2lTdHJpbmcpOwogIHZhcgogICAgcGNockxldHRlciwgcGNoclRva2VuLCBwY2hyTGFzdDogUEFuc2lDaGFyOwogIGJlZ2luCiAgICBwY2hyTGFzdCA6PSBAQUlucHV0W0xlbmd0aChBSW5wdXQpICsgMV07CiAgICBwY2hyVG9rZW4gOj0gQEFJbnB1dFsxXTsKCiAgICB3aGlsZSBwY2hyVG9rZW4gPCBwY2hyTGFzdCBkbwogICAgYmVnaW4KICAgICAgcGNockxldHRlciA6PSBwY2hyVG9rZW47CgogICAgICByZXBlYXQKICAgICAgICBJbmMocGNoclRva2VuKTsKICAgICAgdW50aWwgcGNoclRva2VuXiA8PiBwY2hyTGV0dGVyXjsKCiAgICAgIEFPdXRwdXQgOj0gQU91dHB1dCArIHBjaHJMZXR0ZXJeICsgSW50VG9TdHIocGNoclRva2VuIC0gcGNockxldHRlcik7CiAgICBlbmQKICBlbmQ7CgogIHByb2NlZHVyZSBSTEVEZWNvZGVTdHJpbmcoY29uc3QgQUlucHV0OiBBbnNpU3RyaW5nOyB2YXIgQU91dHB1dDogQW5zaVN0cmluZyk7CiAgdmFyCiAgICBwY2hyTGV0dGVyLCBwY2hyQ250QmVnaW4sIHBjaHJDbnRFbmQsIHBjaHJMYXN0OiBQQW5zaUNoYXI7CiAgICBzdHJDb3VudDogQW5zaVN0cmluZzsKICBiZWdpbgogICAgcGNockxhc3QgOj0gQEFJbnB1dFtMZW5ndGgoQUlucHV0KSArIDFdOwogICAgcGNockxldHRlciA6PSBAQUlucHV0WzFdOwoKICAgIHdoaWxlIHBjaHJMZXR0ZXIgPCBwY2hyTGFzdCBkbwogICAgYmVnaW4KICAgICAgcGNockNudEJlZ2luIDo9IHBjaHJMZXR0ZXIgKyAxOwogICAgICBwY2hyQ250RW5kIDo9IHBjaHJDbnRCZWdpbiArIDE7CgogICAgICB3aGlsZSBwY2hyQ250RW5kXiBpbiBbJzAnIC4uICc5J10gZG8KICAgICAgICBJbmMocGNockNudEVuZCk7CgogICAgICBTZXRMZW5ndGgoc3RyQ291bnQsIHBjaHJDbnRFbmQgLSBwY2hyQ250QmVnaW4pOwogICAgICBNb3ZlKHBjaHJDbnRCZWdpbl4sIHN0ckNvdW50WzFdLCBwY2hyQ250RW5kIC0gcGNockNudEJlZ2luKTsKCiAgICAgIEFPdXRwdXQgOj0gQU91dHB1dCArIFN0cmluZ09mQ2hhcihwY2hyTGV0dGVyXiwgU3RyVG9JbnQoc3RyQ291bnQpKTsKICAgICAgcGNockxldHRlciA6PSBwY2hyQ250RW5kOwogICAgZW5kOwogIGVuZDsKCnZhcgogIHN0cklucHV0LCBzdHJPdXRwdXQ6IEFuc2lTdHJpbmc7CmJlZ2luCiAgeyBlbmNvZGluZyB9CiAgc3RySW5wdXQgOj0gJ0FBQU5OTk5UVFRLS0tLJzsKCiAgV3JpdGVMbignSW5wdXQ6ICAnLCBzdHJJbnB1dCk7CiAgUkxFRW5jb2RlU3RyaW5nKHN0cklucHV0LCBzdHJPdXRwdXQpOwogIFdyaXRlTG4oJ091dHB1dDogJywgc3RyT3V0cHV0KTsKCiAgV3JpdGVMbjsKCiAgeyBzd2FwIHZhbHVlcyB9CiAgc3RySW5wdXQgIDo9IHN0ck91dHB1dDsKICBzdHJPdXRwdXQgOj0gJyc7CgogIHsgZGVjb2RpbmcgfQogIFdyaXRlTG4oJ0lucHV0OiAgJywgc3RySW5wdXQpOwogIFJMRURlY29kZVN0cmluZyhzdHJJbnB1dCwgc3RyT3V0cHV0KTsKICBXcml0ZUxuKCdPdXRwdXQ6ICcsIHN0ck91dHB1dCk7CgogIFJlYWRMbjsKZW5kLgo=