यहां एक त्वरित स्क्रिप्ट है कि एक स्ट्रिंग के भीतर अलग-अलग पात्रों के संयोजन मिल जाएगा है। यदि आप चाहें तो इसे आसानी से सरणी के साथ काम करने के लिए अनुकूलित किया जा सकता है। संयोजन कार्यों और कॉल दिनचर्या (all*
, lex*
, ran*
) का उपयोग करने के बजाय यह दृष्टिकोण 2**len
तक पूर्णांक के द्विआधारी प्रतिनिधित्व का उपयोग करके क्रमपरिवर्तन बनाता है। मैं इस दृष्टिकोण को पसंद करता हूं क्योंकि मुझे लगता है कि यह दिखाता है कि क्या हो रहा है, अधिक पारदर्शी है और सरणी असाइनमेंट के क्रम को नहीं बदलता है।
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;
तुम क्या हैं क्रमपरिवर्तन तो चाहते हैं एक similar approach संख्या के factoradic अभ्यावेदन का उपयोग कर सकता है।लेकिन, मैं अनुशंसा करता हूं कि आप एक संयोजन समारोह का उपयोग करें क्योंकि रूपांतरण अधिक शामिल होंगे। यह शायद सीखने के लिए काफी अच्छा कोडिंग अभ्यास है।
यह अगर एसएएस बूलियन पैटर्न से तार को कम करने के लिए एक समारोह था बहुत अच्छा होगा, लेकिन यह शायद ज्यादा उपयोग नहीं मिलेगा।
bsubstr("ABCD", "1010") --> "AC"
bsubstr("ABCD", "1110") --> "ABC"
bsubstr("ABCD", "0001") --> "D"
मुझे लगता है कि यह क्रमपरिवर्तन के बजाय संयोजन है। – Lovnlust
'एबी' और' बीए 'अलग क्रमपरिवर्तन हैं लेकिन एक ही संयोजन हैं। – MatBailie
जैसा कि यह पूछा गया था कि यह कोड मांग रहा था। जिस तरीके से मैंने संपादित किया है उससे पूछना अधिक स्वीकार्य है। – Joe