変更の仕方

 投稿者:GAI  投稿日:2017年 9月29日(金)16時12分43秒
  以前異なる8個のものを2つずつ4組構成するプログラムで

DIM A$(105) !全パターン 例. 12345678なら、(1,2)(3,4)(5,6)(7,8)と読む
LET C=1
FOR i=2 TO 8 !1組目(1,i) ※comb(8,2)/4=7通り
   LET w$="12345678" !restore it

   LET A$(C)=w$(1:1)&w$(i:i) !その2つを抜き取って、連番を再構成する
   LET w$(i:i)=""
   LET w$(1:1)=""

   FOR j=2 TO 6 !2組目(1,j) ※comb(6,2)/3=5通り
      LET x$=w$ !restore it

      LET A$(C)=A$(C)(1:2)&x$(1:1)&x$(j:j)
      LET x$(j:j)=""
      LET x$(1:1)=""

      FOR k=2 TO 4 !3組目(1,k) ※comb(4,2)/2=3通り
         LET y$=x$ !restore it

         LET A$(C)=A$(C)(1:4)&y$(1:1)&y$(k:k)
         LET y$(k:k)=""
         LET y$(1:1)=""

         LET A$(C)=A$(C)&y$ !4組目 ※comb(2,2)/1=1通り


         PRINT C;": ";A$(C) !結果を表示する

         LET C=C+1
         IF C<=105 THEN LET A$(C)=A$(C-1)(1:4) !copy it
      NEXT k
   NEXT j
NEXT i
END

が紹介されていました。

これを異なる16個を4つずつ4組作るものに改変しようと試みていましたがいまいちやり方がわからなくなりました。
どなたか変更するとどの様に変えればいいのか教えて下さい。

 

Re: 変更の仕方

 投稿者:しばっち  投稿日:2017年 9月29日(金)22時36分12秒
  > No.4401[元記事へ]

GAIさんへのお返事です。

> これを異なる16個を4つずつ4組作るものに改変しようと試みていましたがいまいちやり方がわからなくなりました。
> どなたか変更するとどの様に変えればいいのか教えて下さい。
>

総数 2627625となりましたが、個数はあっているでしょうか?

FOR I1=2 TO 14
   FOR J1=I1+1 TO 15
      FOR K1=J1+1 TO 16
         LET W$="123456789ABCDEFG"
         LET A$=W$(1:1)&W$(I1:I1)&W$(J1:J1)&W$(K1:K1)
         LET W$(1:1)="*"
         LET W$(I1:I1)="*"
         LET W$(J1:J1)="*"
         LET W$(K1:K1)="*"
         CALL ERASE(W$)
         FOR I2=2 TO 10
            FOR J2=I2+1 TO 11
               FOR K2=J2+1 TO 12
                  LET X$=W$
                  LET A$=A$(1:4)&X$(1:1)&X$(I2:I2)&X$(J2:J2)&X$(K2:K2)
                  LET X$(1:1)="*"
                  LET X$(I2:I2)="*"
                  LET X$(J2:J2)="*"
                  LET X$(K2:K2)="*"
                  CALL ERASE(X$)
                  FOR I3=2 TO 6
                     FOR J3=I3+1 TO 7
                        FOR K3=J3+1 TO 8
                           LET Y$=X$
                           LET A$=A$(1:8)&Y$(1:1)&Y$(I3:I3)&Y$(J3:J3)&Y$(K3:K3)
                           LET Y$(1:1)="*"
                           LET Y$(I3:I3)="*"
                           LET Y$(J3:J3)="*"
                           LET Y$(K3:K3)="*"
                           CALL ERASE(Y$)
                           LET A$=A$&Y$
                           LET C=C+1
                           PRINT C;":";A$(1:4);"  ";A$(5:8);"  ";A$(9:12);"  ";A$(13:16) !' 2627625 まで
                           LET A$=A$(1:12)
                        NEXT K3
                     NEXT J3
                  NEXT I3
               NEXT K2
            NEXT J2
         NEXT I2
      NEXT K1
   NEXT J1
NEXT I1
END

EXTERNAL  SUB ERASE(A$)
DO
   LET FL=0
   FOR I=1 TO LEN(A$)
      IF A$(I:I)="*" THEN
         LET A$(I:I)=""
         LET FL=1
      END IF
   NEXT I
LOOP UNTIL FL=0
END SUB
 

Re: 変更の仕方

 投稿者:GAI  投稿日:2017年 9月29日(金)23時31分12秒
  > No.4402[元記事へ]

しばっちさんへのお返事です。


>
> 総数 2627625となりましたが、個数はあっているでしょうか?
>

プログラムありがとうございます。
計算上
16C4*12C4*8C4/4!=2627625
ですので正しく動いています。
 

戻る