59 lines
1.1 KiB
ObjectPascal
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.
|