RosettaCodeData/Task/Thue-Morse/Pascal/thue-morse.pas
2023-07-01 13:44:08 -04:00

59 lines
1.1 KiB
ObjectPascal

Program ThueMorse;
function fThueMorse(maxLen: NativeInt):AnsiString;
//double by appending the flipped original 0 -> 1;1 -> 0
//Flipping between two values:x oszillating A,B,A,B -> x_next = A+B-x
//Beware A+B < High(Char), the compiler will complain ...
const
cVal0 = '^';cVal1 = 'v';// cVal0 = '0';cVal1 = '1';
var
pOrg,
pRpl : pansiChar;
i,k,ml : NativeUInt;//MaxLen: NativeInt
Begin
iF maxlen < 1 then
Begin
result := '';
EXIT;
end;
//setlength only one time
setlength(result,Maxlen);
pOrg := @result[1];
pOrg[0] := cVal0;
IF maxlen = 1 then
EXIT;
pRpl := pOrg;
inc(pRpl);
k := 1;
ml:= Maxlen;
repeat
i := 0;
repeat
pRpl[0] := ansichar(Ord(cVal0)+Ord(cVal1)-Ord(pOrg[i]));
inc(pRpl);
inc(i);
until i>=k;
inc(k,k);
until k+k> ml;
// the rest
i := 0;
k := ml-k;
IF k > 0 then
repeat
pRpl[0] := ansichar(Ord(cVal0)+Ord(cVal1)-Ord(pOrg[i]));
inc(pRpl);
inc(i)
until i>=k;
end;
var
i : integer;
Begin
For i := 0 to 8 do
writeln(i:3,' ',fThueMorse(i));
fThueMorse(1 shl 30);
{$IFNDEF LINUX}readln;{$ENDIF}
end.