同じものを含む順列の問題を十進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]