RosettaCodeData/Task/Permutations/ALGOL-68/permutations-1.alg

34 lines
1,009 B
Text
Raw Permalink Normal View History

2013-06-05 21:47:54 +00:00
# -*- coding: utf-8 -*- #
2013-04-10 23:57:08 -07:00
2013-06-05 21:47:54 +00:00
COMMENT REQUIRED BY "prelude_permutations.a68"
MODE PERMDATA = ~;
PROVIDES:
# PERMDATA*=~* #
# perm*=~ list* #
END COMMENT
2013-04-10 23:57:08 -07:00
2013-06-05 21:47:54 +00:00
MODE PERMDATALIST = REF[]PERMDATA;
MODE PERMDATALISTYIELD = PROC(PERMDATALIST)VOID;
2013-04-10 23:57:08 -07:00
2013-06-05 21:47:54 +00:00
# Generate permutations of the input data list of data list #
PROC perm gen permutations = (PERMDATALIST data list, PERMDATALISTYIELD yield)VOID: (
2013-04-10 23:57:08 -07:00
# Warning: this routine does not correctly handle duplicate elements #
2013-06-05 21:47:54 +00:00
IF LWB data list = UPB data list THEN
yield(data list)
2013-04-10 23:57:08 -07:00
ELSE
2013-06-05 21:47:54 +00:00
FOR elem FROM LWB data list TO UPB data list DO
PERMDATA first = data list[elem];
data list[LWB data list+1:elem] := data list[:elem-1];
data list[LWB data list] := first;
# FOR PERMDATALIST next data list IN # perm gen permutations(data list[LWB data list+1:] # ) DO #,
## (PERMDATALIST next)VOID:(
yield(data list)
2013-04-10 23:57:08 -07:00
# OD #));
2013-06-05 21:47:54 +00:00
data list[:elem-1] := data list[LWB data list+1:elem];
data list[elem] := first
2013-04-10 23:57:08 -07:00
OD
FI
);
2013-06-05 21:47:54 +00:00
SKIP