同じものを含む順列の問題を十進BASICで解いてみた。

 同じものを含む順列の問題十進BASICで解いてみました。(^_^;

「MATHEMATICS」の11文字から4文字を取りだして1列に並べる方法は何通りあるか?

 と、いうより、Javaから翻訳してみました。(^_^;
 nextPerm()をJavaから翻訳しようと試みたところ、FUNCTIONが 「値渡し」しか出来ないようなので、「参照渡し」を使うためにSUBルーチンにして、EXTERNAL SUB genPerm(p$(),n,r,nextPerm)としてnextPermをflag変数として返すことにしました。
 あと、toCharArray()やsort()等もSUBルーチンで作ってみましたが、Javaは初めから小道具が揃っているのでBASICより便利だなぁと見直しました。(^_^;

P.S.
 ちなみに、関数電卓 EvalCalcを使って計算すると次の通りです。

>GenPerm({MATHEMATICS},4)
 2454

※参考URL
同じものを含む順列をJavaで解いてみた。(2)
同じものを含む順列の問題をPythonで解いてみた。
同じものを含む順列の問題をPythonで解いてみた。(2)
同じものを含む順列の問題をVisual Basicで解いてみた。

● PermSame1.BAS

OPTION BASE 0
DECLARE EXTERNAL SUB toCharAr
DECLARE EXTERNAL SUB Sort
DECLARE EXTERNAL SUB genPerm
DECLARE EXTERNAL FUNCTION Join$

LET tm=TIME

LET s$="MATHEMATICS"
LET N=LEN(s$)
LET R=4

DIM p$(N-1)
CALL toCharAr(p$,s$)
CALL Sort(p$,0,N-1)

LET count=0
LET nextPerm=1
DO 
   LET count=count+1
   !PRINT mid$(Join$(p$),1,R)
   CALL genPerm(p$,N,R,nextPerm)
LOOP WHILE nextPerm=1 
PRINT count

PRINT "Runtime :";ROUND(TIME-tm,3);"[sec]"
END

EXTERNAL SUB toCharAr(a$(),s$)
LET j=LBOUND(a$)
FOR i=1 TO LEN(s$)
   LET a$(j)=s$(i:i)
   LET j=j+1
NEXT i
END SUB

EXTERNAL SUB Sort(a$(),f,t)
FOR i = f + 1 TO t 
   FOR j=i TO f+1 STEP -1
      IF a$(j-1)<=a$(j) THEN EXIT FOR
      swap a$(j),a$(j-1)
   NEXT j
NEXT i
END SUB

EXTERNAL SUB genPerm(p$(),n,r,nextPerm)
LET nextPerm=0
IF r<=0 OR n<r THEN EXIT SUB
FOR i=r+1 TO n-1
   FOR j=i TO r+1 STEP -1
      IF p$(j-1)>=p$(j) THEN EXIT FOR
      swap p$(j),p$(j-1)
   NEXT j
NEXT i

FOR i=n-1 TO 1 STEP -1
   IF p$(i-1)< p$(i) THEN EXIT FOR
NEXT i
IF i=0 THEN EXIT SUB
FOR j=n-1 TO i+1 STEP -1
   IF p$(i-1)< p$(j) THEN EXIT FOR
NEXT j
swap p$(j),p$(i-1)
FOR j=0 TO INT((n-1-i)/2)
   swap p$(i+j),p$(n-1-j)
NEXT j
LET nextPerm=1
END SUB

EXTERNAL FUNCTION Join$(a$())
LET r$=""
FOR i=LBOUND(a$) TO UBOUND(a$)
   LET r$=r$&a$(i)
NEXT i
LET Join$=r$
END FUNCTION

●実行結果

 2454 
Runtime : .06 [sec]