RosettaCodeData/Task/Padovan-sequence/ALGOL-68/padovan-sequence.alg

85 lines
3.6 KiB
Plaintext

BEGIN # show members of the Padovan Sequence calculated in various ways #
# returns the first n elements of the Padovan sequence by the #
# recurance relation: P(n)=P(n-2)+P(n-3) #
OP PADOVANI = ( INT n )[]INT:
BEGIN
[ 0 : n - 1 ]INT p; p[ 0 ] := p[ 1 ] := p[ 2 ] := 1;
FOR i FROM 3 TO UPB p DO
p[ i ] := p[ i - 2 ] + p[ i - 3 ]
OD;
p
END; # PADOVANI #
# returns the first n elements of the Padovan sequence by #
# computing by truncation P(n)=floor(p^(n-1) / s + .5) #
# where s = 1.0453567932525329623 #
# and p = the "plastic ratio" #
OP PADOVANC = ( INT n )[]INT:
BEGIN
LONG REAL s = 1.0453567932525329623;
LONG REAL p = 1.324717957244746025960908854;
LONG REAL pf := 1 / p;
[ 0 : n - 1 ]INT result;
FOR i FROM LWB result TO UPB result DO
result[ i ] := SHORTEN ENTIER ( pf / s + 0.5 );
pf *:= p
OD;
result
END; # PADOVANC #
# returns the first n L System strings of the Padovan sequence #
OP PADOVANL = ( INT n )[]STRING:
BEGIN
[ 0 : n - 1 ]STRING l; l[ 0 ] := "A"; l[ 1 ] := "B"; l[ 2 ] := "C";
FOR i FROM 3 TO UPB l DO
l[ i ] := l[ i - 3 ] + l[ i - 2 ]
OD;
l
END; # PADOVANC #
# returns TRUE if a and b have the same values, FALSE otherwise #
OP = = ( []INT a, b )BOOL:
IF LWB a /= LWB b OR UPB a /= UPB b
THEN # rows are not the same size # FALSE
ELSE
BOOL result := TRUE;
FOR i FROM LWB a TO UPB a WHILE result := a[ i ] = b[ i ] DO SKIP OD;
result
FI; # = #
# returns the number of elements in a #
OP LENGTH = ( []INT a )INT: ( UPB a - LWB a ) + 1;
# returns the number of characters in s #
OP LENGTH = ( STRING s )INT: ( UPB s - LWB s ) + 1;
# returns a string representation of n #
OP TOSTRING = ( INT n )STRING: whole( n, 0 );
# generate 64 elements of the sequence and 32 L System values #
[]INT iterative = PADOVANI 64;
[]INT calculated = PADOVANC 64;
[]STRING l system = PADOVANL 32;
[ LWB l system : UPB l system ]INT l length;
FOR i FROM LWB l length TO UPB l length DO l length[ i ] := LENGTH l system[ i ] OD;
# first 20 terms #
print( ( "First 20 terms of the Padovan Sequence", newline ) );
FOR i FROM LWB iterative TO 19 DO
print( ( " ", TOSTRING iterative[ i ] ) )
OD;
print( ( newline ) );
print( ( "The first "
, TOSTRING LENGTH iterative
, " iterative and calculated values "
, IF iterative = calculated THEN "are the same" ELSE "differ" FI
, newline
)
);
# print the first 10 values of the L System strings #
print( ( newline, "First 10 L System strings", newline ) );
FOR i FROM LWB l system TO 9 DO
print( ( " ", l system[ i ] ) )
OD;
print( ( newline ) );
print( ( "The first "
, TOSTRING LENGTH l length
, " iterative values and L System lengths "
, IF l length = iterative[ LWB l length : UPB l length @ LWB l length ] THEN "are the same" ELSE "differ" FI
, newline
)
)
END