Oto krótki skrypt, który znajdzie kombinacje poszczególnych postaci ciągu znaków. Można to łatwo zaadaptować do pracy z tablicami, jeśli wolisz. Zamiast używać funkcji kombinacyjnych i procedur wywoływania (,, lex*
, ran*
) podejście to tworzy permutacje za pomocą binarnej reprezentacji liczb całkowitych do 2**len
. Preferuję to podejście, ponieważ uważam, że demonstruje to, co się dzieje, jest bardziej przejrzyste i nie zmienia kolejności przydziałów tablicowych.
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;
Jeśli zrobić chcą permutacje następnie similar approach jest możliwe przy użyciu factoradic reprezentacje liczb.Zalecam jednak użycie funkcji kombinowanej, ponieważ konwersje byłyby znacznie bardziej zaangażowane. Prawdopodobnie jest to całkiem fajne ćwiczenie kodowania do nauki.
Byłoby świetnie, gdyby SAS miał funkcję zmniejszania ciągów według wzorców logicznych, ale prawdopodobnie nie miałoby dużego zastosowania.
bsubstr("ABCD", "1010") --> "AC"
bsubstr("ABCD", "1110") --> "ABC"
bsubstr("ABCD", "0001") --> "D"
Myślę, że jest to połączenie zamiast permutacji. – Lovnlust
'AB' i' BA' to różne permutacje, ale ta sama kombinacja. – MatBailie
Na pytanie to było pytanie o kod. Pytanie o to, co zredagowałem, jest bardziej akceptowalne. – Joe