新しく発言する  EXIT  インデックスへ

覆面算をプログラムで解く


  覆面算をプログラムで解く 山中和義 2008/06/07 21:11:59  (修正1回)
  場合の数を減らした場合 山中和義 2008/06/08 14:31:17  (修正1回)
  面白いですね 島村1243 2008/06/16 07:36:15 

  覆面算をプログラムで解く 山中和義 2008/06/07 21:11:59  (修正1回)  ツリーへ
覆面算をプログラムで解く  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/06/07 21:11:59 ** この記事は1回修正されてます
! SEND  9567
!+ MORE  1085
!------
! MONEY 10652

DIM p(8) !文字SENDMORY ※異なる文字の数
MAT p=ZER

PUBLIC NUMERIC ANSWER_COUNT !解答数
LET ANSWER_COUNT=0

LET t0=TIME
CALL perm(p,1)
PRINT "計算時間=";TIME-t0

END


EXTERNAL SUB perm(p(), l) !nPr順列での数の組を生成する
FOR j=0 TO 9 !0〜9の数字
FOR k=1 TO l-1 !重複なし ※文字が異なれば数字も異なる
IF j=p(k) THEN EXIT FOR
NEXT k
IF k>l-1 THEN
LET p(l)=j !仮に

IF l=UBOUND(p) THEN !すべてが確定したら、式を検証する

LET v1= p(1)*1000+p(2)*100+p(3)*10+p(4) ! SEND
LET v2= p(5)*1000+p(6)*100+p(7)*10+p(2) ! MORE
LET v3=p(5)*10000+p(6)*1000+p(3)*100+p(2)*10+p(8) !MONEY
IF v1+v2=v3 THEN !式が成立するなら

LET ANSWER_COUNT=ANSWER_COUNT+1 !解答数
PRINT ANSWER_COUNT

PRINT USING " SEND ####":v1 !結果の表示
PRINT USING "+ MORE ####":v2
PRINT "-------"
PRINT USING " MONEY #####":v3
PRINT

END IF
ELSE
CALL perm(p,l+1) !次の文字へ
END IF

END IF
NEXT j
END SUB



!例1
!DIM p(7) !文字 ※異なる文字の数

!LET v1= p(1)*1000+p(2)*100+p(3)*10+p(4) ! BASE
!LET v2= p(1)*1000+p(2)*100+p(5)*10+p(5) ! BALL
!LET v3=p(6)*10000+p(2)*1000+p(7)*100+p(4)*10+p(3) !GAMES
!IF v1+v2=v3 THEN !式の成立するなら
! LET ANSWER_COUNT=ANSWER_COUNT+1 !解答数
! PRINT ANSWER_COUNT
!
! PRINT USING " BASE ####":v1 !結果の表示
! PRINT USING "+ BALL ####":v2
! PRINT "-------"
! PRINT USING " GAMES #####":v3
! PRINT
!END IF



!例2
!LET v1= p(1)*10000+p(2)*1000+p(2)*100+p(3)*10+p(4) ! WOODS
!LET v2=p(5)*100000+p(2)*10000+p(6)*1000+p(7)*100+p(4)*10+p(8) !FOREST
!IF v1+v1+v1=v2 THEN !式の成立するなら
! LET ANSWER_COUNT=ANSWER_COUNT+1 !解答数
! PRINT ANSWER_COUNT
!
! PRINT USING " WOODS #####":v1 !結果の表示
! PRINT USING " WOODS #####":v1
! PRINT USING "+ WOODS #####":v1
! PRINT "--------"
! PRINT USING " FOREST ######":v2
! PRINT
!END IF
  場合の数を減らした場合 山中和義 2008/06/08 14:31:17  (修正1回)  ツリーへ
Re: 覆面算をプログラムで解く  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/06/08 14:31:17 ** この記事は1回修正されてます
場合の数を減らした場合

プログラムは読みにくくなりますが、処理時間は短くなります。



!覆面算

! SEND  9567
!+ MORE  1085
!------
! MONEY 10652

DIM p(7) !文字SENDMOR ※異なる文字の数
MAT p=ZER

PUBLIC NUMERIC ANSWER_COUNT !解答数
LET ANSWER_COUNT=0

LET t0=TIME
CALL perm(p,1)
PRINT "計算時間=";TIME-t0

END


EXTERNAL FUNCTION fig(x,n) !n桁目の数を得る ※0:一の位、1:十の位、2:百の位、…
LET fig=MOD(INT(x/10^n),10)
END FUNCTION

EXTERNAL SUB perm(p(), l) !nPr順列での数の組を生成する
FOR j=0 TO 9 !0〜9の数字
FOR k=1 TO l-1 !重複なし ※文字が異なれば数字も異なる
IF j=p(k) THEN EXIT FOR
NEXT k
IF k>l-1 THEN
LET p(l)=j !仮に

IF l=UBOUND(p) THEN !すべてが確定したら、式を検証する

LET v1=p(1)*1000+p(2)*100+p(3)*10+p(4) !SEND
LET v2=p(5)*1000+p(6)*100+p(7)*10+p(2) !MORE
LET v3=v1+v2 !MONEY

IF fig(v3,4)=p(5) THEN !M----
IF fig(v3,3)=p(6) THEN !-O---
IF fig(v3,2)=p(3) THEN !--N--
IF fig(v3,1)=p(2) THEN !---E-
LET c=fig(v3,0) !----Y
FOR k=1 TO l !重複なし ※文字が異なれば数字も異なる
IF c=p(k) THEN EXIT FOR
NEXT k
IF k>7 THEN

LET ANSWER_COUNT=ANSWER_COUNT+1 !解答数
PRINT ANSWER_COUNT

PRINT USING " SEND ####":v1 !結果の表示
PRINT USING "+ MORE ####":v2
PRINT "-------"
PRINT USING " MONEY #####":v3
PRINT

END IF
END IF
END IF
END IF
END IF
ELSE
CALL perm(p,l+1) !次の文字へ
END IF

END IF
NEXT j
END SUB
  面白いですね 島村1243 2008/06/16 07:36:15   ツリーへ
Re: 覆面算をプログラムで解く  返事を書く  ノートメニュー
島村1243 <bjllmpcujp> 2008/06/16 07:36:15
面白いですね
覆面算なるもの、初めて知り、またロジックも大変参考になりました。
当方のPCはCPUの能力が1.4GHzと低速なので、テキストに最初の文字が出力されるまでに比較的時間を要して
おり、「あれ?、どうしたのかな」と心配になる状況でした。
出力迄に時間がかかるプログラムの場合は、run最初の時点で「計算中、お待ちください」等のメッセージを
テキスト画面に出すコードを付記する等をすれば、不安が解消されるのではないかと感じました。

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。