Hier ist eine schnelle Skript, das die Kombinationen der einzelnen Zeichen innerhalb einer Zeichenfolge finden. Dies könnte leicht angepasst werden, um mit Arrays zu arbeiten, wenn Sie bevorzugen. Anstatt die kombinatorischen Funktionen und Aufrufroutinen (all*
, lex*
, ran*
) zu verwenden, werden bei diesem Ansatz die Permutationen mithilfe der binären Darstellung von ganzen Zahlen bis 2**len
erstellt. Ich bevorzuge diesen Ansatz, da ich denke, dass er zeigt, was passiert, transparenter ist und die Reihenfolge der Array-Zuweisungen nicht ändert.
data have;
str = "123456"; output;
str = "ABCD"; output;
run;
data want;
set have;
length comb $20.;
len = length(str);
/* Loop through all possible permutations */
do _i = 0 to 2**len - 1;
/* Store the current iteration number in binary */
_bin = putn(_i, "binary" || put(len, best.) || ".");
/* Initialise an empty output variable */
comb = "";
/* Loop through each value in the input string */
do _k = 1 to len;
/* Check if the kth digit of the binary representation is 1 */
/* And if so add the kth input character to the output */
if substr(_bin, _k, 1) = "1" then
comb = cats(comb, substr(str, _k, 1));
end;
output;
end;
/* Clean up temporary variables, commented so you can see what's happening */
/* drop _:; */
run;
Wenn Sie wollen Permutationen tun dann ein similar approach möglich ist factoradic Darstellungen der Zahlen.Aber ich würde empfehlen, dass Sie stattdessen eine kombinatorische Funktion verwenden, da die Konvertierungen viel mehr beteiligt wären. Es ist wahrscheinlich eine ziemlich gute Programmierübung zum Lernen.
Es wäre großartig, wenn SAS eine Funktion zum Reduzieren von Strings durch boolesche Muster hätte, aber es würde wahrscheinlich nicht viel Nutzen bringen.
bsubstr("ABCD", "1010") --> "AC"
bsubstr("ABCD", "1110") --> "ABC"
bsubstr("ABCD", "0001") --> "D"
Ich denke, das ist Kombination statt Permutation. – Lovnlust
'AB' und' BA' sind unterschiedliche Permutationen, aber die gleiche Kombination. – MatBailie
Wie gefragt wurde nach Code gefragt. Die Art und Weise zu fragen, die ich bearbeitet habe, ist akzeptabler. – Joe