Thue-Morse: Difference between revisions
Content added Content deleted
(added =={{header|Pascal}}==) |
m (→{{header|Pascal}}: use a function with length set once. 50% faster than before. ^ v as alias for 0 1) |
||
Line 149: | Line 149: | ||
=={{header|Pascal}}== |
=={{header|Pascal}}== |
||
{{works with|Free Pascal}} |
{{works with|Free Pascal}} |
||
Like the C++ Version [[http://rosettacode.org/wiki/Thue-Morse#C.2B.2B]] the lenght of the sequence is given in advance. |
|||
<lang pascal> |
|||
Program ThueMorse; |
<lang pascal>Program ThueMorse; |
||
function fThueMorse(maxLen: NativeInt):AnsiString; |
|||
⚫ | |||
//Flipping between two values:x oszillating A,B,A,B -> x_next = A+B-x |
|||
//Beware A+B < High(Char), the compiler will complain ... |
|||
⚫ | |||
cVal0 = '^';cVal1 = 'v';// cVal0 = '0';cVal1 = '1'; |
|||
procedure NextThueMorse(var s: AnsiString); |
|||
⚫ | |||
//flipping x between A;B - > x_next = A+B-x |
|||
var |
var |
||
⚫ | |||
pOrg, |
pOrg, |
||
pRpl : pChar; |
pRpl : pChar; |
||
i,k,ml : NativeUInt;//MaxLen: NativeInt |
|||
Begin |
Begin |
||
iF maxlen < 1 then |
|||
Begin |
Begin |
||
result := ''; |
|||
EXIT; |
EXIT; |
||
end; |
end; |
||
//setlength only one time |
|||
⚫ | |||
setlength( |
setlength(result,Maxlen); |
||
⚫ | |||
pRpl := @s[i+1]; |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end; |
|||
⚫ | |||
procedure NextThueMorseLSystem(var s: AnsiString); |
|||
pOrg[0] := cVal0; |
|||
//double length and replace every 0 -> 01 and 1 -> 10 |
|||
⚫ | |||
//doing it backwards, so no extra copy is needed. |
|||
⚫ | |||
cReplace : array['0'..'1'] of String[2] = ('01','10'); |
|||
var |
|||
i : NativeInt; |
|||
pS,pR : pChar; |
|||
Begin |
|||
⚫ | |||
Begin |
|||
s := '0'; |
|||
EXIT; |
EXIT; |
||
end; |
|||
pRpl := pOrg; |
|||
inc(pRpl); |
|||
k := 1; |
|||
ml:= Maxlen; |
|||
repeat |
repeat |
||
i := 0; |
|||
repeat |
|||
pRpl[0] := chr(Ord(cVal0)+Ord(cVal1)-Ord(pOrg[i])); |
|||
inc(pRpl); |
|||
inc(i); |
|||
until i |
until i>=k; |
||
⚫ | |||
until k+k> ml; |
|||
// the rest |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
inc(i) |
|||
⚫ | |||
end; |
end; |
||
var |
var |
||
s: AnsiString; |
|||
i : integer; |
i : integer; |
||
Begin |
Begin |
||
For i := 0 to |
For i := 0 to 8 do |
||
writeln(i:3,' ',fThueMorse(i)); |
|||
Begin |
|||
fThueMorse(1 shl 30); |
|||
NextThueMorse(s); |
|||
⚫ | |||
⚫ | |||
end; |
|||
writeln(length(s)); |
|||
end.</lang> |
end.</lang> |
||
{{Output}}<pre>Compile with /usr/lib/fpc/3.0.1/ppc386 "ThueMorse.pas" -al -XX -Xs -O4 -MDelphi |
|||
{{Output}}<pre>//NextThueMorse |
|||
without -O4 -> 2 secs |
|||
0 |
|||
0 |
|||
01 |
|||
1 ^ |
|||
0110 |
|||
2 ^v |
|||
01101001 |
|||
3 ^vv |
|||
0110100110010110 |
|||
4 ^vv^ |
|||
01101001100101101001011001101001 |
|||
5 ^vv^v |
|||
1073741824 ( 1 GB) |
|||
6 ^vv^v^ |
|||
⚫ | |||
7 ^vv^v^^ |
|||
//NextThueMorseLSystem |
|||
8 ^vv^v^^v |
|||
Same Output |
|||
not written: 1 shl 30 == 1GB |
|||
real 0m1.981s user 0m1.492s sys 0m0.486s |
|||
⚫ | |||
</pre> |
|||
=={{header|Perl 6}}== |
=={{header|Perl 6}}== |
||
{{Works with|rakudo|2015-12-22}} |
{{Works with|rakudo|2015-12-22}} |