n個のオブジェクトを同時にk個使用するときのインデックスのすべての組み合わせを、辞書式順序で生成します。
カテゴリ: | 組み合わせ |
data _null_; array x[5] $3 ('ant' 'bee' 'cat' 'dog' 'ewe'); array c[3] $3; array i[3]; n=dim(x); k=dim(i); i[1]=0; ncomb=comb(n, k); do j=1 to ncomb; call lexcombi(n, k, of i[*]); do h=1 to k; c[h]=x[i[h]]; end; put @4 j= @10 'i= ' i[*] +3 'c= ' c[*]; end; run;
j=1 i= 1 2 3 c= ant bee cat j=2 i= 1 2 4 c= ant bee dog j=3 i= 1 2 5 c= ant bee ewe j=4 i= 1 3 4 c= ant cat dog j=5 i= 1 3 5 c= ant cat ewe j=6 i= 1 4 5 c= ant dog ewe j=7 i= 2 3 4 c= bee cat dog j=8 i= 2 3 5 c= bee cat ewe j=9 i= 2 4 5 c= bee dog ewe j=10 i= 3 4 5 c= cat dog ewe
%macro test; %let x1=0; %let x2=0; %let x3=0; %let n=5; %let k=3; %let ncomb=%sysfunc(comb(&n, &k)); %do j=1 %to &ncomb+1; %syscall lexcombi(n, k, x1, x2, x3); %let jfmt=%qsysfunc(putn(&j, 5.)); %let pad=%qsysfunc(repeat(%str(), 6-%length(&x1 &x2 &x3))); %put &jfmt: &x1 &x2 &x3 &pad sysinfo=&sysinfo; %end; %mend; %test
1: 1 2 3 sysinfo=1 2: 1 2 4 sysinfo=3 3: 1 2 5 sysinfo=3 4: 1 3 4 sysinfo=2 5: 1 3 5 sysinfo=3 6: 1 4 5 sysinfo=2 7: 2 3 4 sysinfo=1 8: 2 3 5 sysinfo=3 9: 2 4 5 sysinfo=2 10: 3 4 5 sysinfo=1 11: 3 4 5 sysinfo=-1