RosettaCodeData/Task/Permutation-test/ALGOL-68/permutation-test.alg

37 lines
1.5 KiB
Plaintext

BEGIN # Permutation test - translated from the C sample #
PROC pick = ( INT at, remain, accu, treat, []INT data )INT:
IF remain < 1
THEN IF accu > treat THEN 1 ELSE 0 FI
ELSE pick( at - 1, remain - 1, accu + data[ at - 1 ], treat, data )
+ IF at > remain THEN pick( at - 1, remain, accu, treat, data ) ELSE 0 FI
FI # pick # ;
PROC permutation test = ( []INT data, REF INT le, gt, REF REAL total )VOID:
IF LWB data /= 0
THEN print( ( "LWB data is not 0", newline ) ); stop
ELSE INT treat := 0;
INT mid = UPB data OVER 2;
total := 1;
FOR i FROM LWB data TO mid - 1 DO treat +:= data[ i ] OD;
FOR i FROM UPB data + 1 BY -1 TO mid + 2 DO total *:= i OD;
FOR i FROM mid BY -1 TO LWB data + 1 DO total /:= i OD;
gt := pick( UPB data + 1, mid, LWB data, treat, data );
le := ENTIER ( total - gt )
FI # permutation test # ;
BEGIN
REAL total := 0;
INT gt := -1, le := -1;
permutation test( []INT( 85, 88, 75, 66, 25, 29, 83, 39, 97
, 68, 41, 10, 49, 16, 65, 32, 92, 28, 98
)[ AT 0 ]
, le, gt, total
);
print( ( "<= : ", fixed( 100 * le / total, -9, 6 ), "% ", whole( le, 0 ), newline ) );
print( ( " > : ", fixed( 100 * gt / total, -9, 6 ), "% ", whole( gt, 0 ), newline ) )
END
END