論理パズルをBASICで解く (10進basic使用)
REM 問題 青山学院大学の入試問題です。 REM A,B,Cの3名がいて、正直者が2人、残りの1人が嘘つきである。そして3名とも誰が正直者で、誰が嘘つきかは知っているとする。 REM ここで、正直者とは常に真実をいう人、嘘つきとは常に真実と反対のことをいう人である。このとき、つぎのようなA,B,Cの証言が得られた。 REM Aの証言:Cは嘘つきである。 REM Bの証言:Aは正直者である。 REM Cの証言:Bは嘘つきである。 REM 誰が嘘つきか。 REM 下記のコードを実行すれば 1,1,0という結果が出力されCが嘘つきであることが REM わかります。 REM------------------- !記号以下は注釈文 , &は次行への継続 FOR A=0 TO 1 !0が嘘つき、1が正直者 FOR B=0 TO 1 !0が嘘つき、1が正直者 FOR C=0 TO 1 !0が嘘つき、1が正直者 IF ((A=0 AND C=1) OR (A=1 AND C=0)) AND & & (( B=0 AND A=0) OR (B=1 AND A=1)) AND & & ((C=0 AND B=1) OR (C=1 AND B=0)) AND (A+B+C=2) THEN PRINT A;B;C NEXT C NEXT B NEXT A END
bellman ford 法(10進basic)
DIM dist(7), node$(7),path$(7) MAT READ node$ DATA A,B,C,D,E,F,G MAT path$=node$(1)&NUL$ DIM c(7,7) MAT c=1000*CON LET inf=1000 LET dist(1)=0 LET dist(2)=inf LET dist(3)=inf LET dist(4)=inf LET dist(5)=inf LET dist(6)=inf LET dist(7)=inf LET c(1,1)=0 LET c(2,2)=0 LET c(3,3)=0 LET c(4,4)=0 LET c(5,5)=0 LET c(6,6)=0 LET c(7,7)=0 LET c(1,2)=30 LET c(2,1)=30 LET c(1,3)=20 LET c(3,1)=20 LET c(1,7)=1 LET c(7,1)=1 LET c(2,3)=2 LET c(3,2)=2 LET c(2,4)=6 LET c(4,2)=6 LET c(2,5)=1 LET c(5,2)=1 LET c(2,7)=6 LET c(7,2)=6 LET c(3,4)=2 LET c(4,3)=2 LET c(3,5)=3 LET c(5,3)=3 LET c(3,6)=1 LET c(6,3)=1 LET c(4,5)=20 LET c(5,4)=20 LET c(4,6)=30 LET c(6,4)=30 LET c(4,7)=100 LET c(7,4)=100 LET c(5,7)=2 LET c(7,5)=2 LET c(5,6)=5 LET c(6,5)=5 LET c(6,7)=10 LET c(7,6)=10 REM----------------------------------------------------------------- LET w=0 DO WHILE w<=7 FOR t=1 TO 7 FOR i=1 TO 7 IF dist(i)>dist(t)+c(t,i) THEN LET dist(i)=dist(t)+c(t,i) LET path$(i)=path$(t)&node$(i) END IF NEXT i NEXT t LET w=w+1 LOOP REM----------------------------------- PRINT "-------------------------------------------------------" FOR x=1 TO 7 PRINT "最短距離="; dist(x); ", 経路=";path$(x) NEXT x END
ライツアウト
10進basicを使っています DIM a(9,9) DIM b(9,9) DIM c(9) DIM d(9) MAT a=ZER LET a(1,1)=1 LET a(1,2)=1 LET a(1,4)=1 LET a(2,1)=1 LET a(2,2)=1 LET a(2,3)=1 LET a(2,5)=1 LET a(3,2)=1 LET a(3,3)=1 LET a(3,6)=1 LET a(4,1)=1 LET a(4,4)=1 LET a(4,5)=1 LET a(4,7)=1 LET a(5,2)=1 LET a(5,4)=1 LET a(5,5)=1 LET a(5,6)=1 LET a(5,8)=1 LET a(6,3)=1 LET a(6,5)=1 LET a(6,6)=1 LET a(6,9)=1 LET a(7,4)=1 LET a(7,7)=1 LET a(7,8)=1 LET a(8,5)=1 LET a(8,7)=1 LET a(8,8)=1 LET a(8,9)=1 LET a(9,6)=1 LET a(9,8)=1 LET a(9,9)=1 MAT b=INV(a) LET c(1)=1 LET c(2)=1 LET c(3)=0 LET c(4)=0 LET c(5)=0 LET c(6)=0 LET c(7)=1 LET c(8)=0 LET c(9)=0 MAT d=b*c LET g=DET(a) DIM h(9) MAT h=g*d FOR k=1 TO 9 PRINT MOD( h(k),2) NEXT K END
ガウス ジョルダン法(連立方程式)(十進basic)
INPUT m INPUT n DIM a(m,n) PRINT m×n;"個";"の数字を入力してください。" FOR x=1 TO m FOR y=1 TO n INPUT w LET a(x,y)=w NEXT Y NEXT X REM データー例 m=3 n=4 w=2,3,1,4,4,1,-3,-2,-1,2,2,2 解 x=2 y=-1 z=3 DIM d(m) REM-------------------------------- FOR k=1 TO m LET pivot=a(k,k) FOR j=1 TO n LET a(k,j)=a(k,j)/pivot NEXT j FOR i=1 TO m IF i<>k THEN LET d(i)=a(i,k) NEXT i FOR ii=1 TO m FOR jj=1 TO n IF ii<>k THEN LET a(ii,jj)=a(ii,jj)-d(ii)*a(k,jj) NEXT jj NEXT ii NEXT k REM-------------------------------------- FOR i=1 TO m FOR j=1 TO n PRINT a(i,j); NEXT J PRINT NEXT I END
奇数次の魔方陣
REM 十進basicを使っています。オプションメニューから文法--microsoft BASIC互換を選んで実行してください。 REM !印以下は注釈文です。実行には影響を与えません。 REM アルゴリズムはサイモン-ド-ラ-ルベールの斜進法を使っています。斜進法についてはインターネットなどで調べてください。 REM ------------------------------------------------------------------- INPUT PROMPT "奇数を入力してください。":n PRINT ! 出力を見やすくするため PRINT ! PRINT ! OPTION BASE 1 DIM a(n,n) !用いる配列の宣言 MAT a=ZER !配列を0で初期化 LET k=1 LET i=1 ! 行上段 LET j=(n+1)/2 ! 列中央 LET a(i,j)=1 ! 上段中央を1とする 10 LET k=k+1 IF k=n*n+1 THEN GOTO 50 ! 全部置けたら50へ飛んで盤面を表示 LET i=i-1 LET j=j+1 IF i<1 AND j>n THEN LET a(i+2,j-1)=k:i=i+2:j=j-1:GOTO 10 IF i<1 THEN GOTO 30 ! iの値が上側の壁なら30へ飛ぶ IF j>n THEN GOTO 40 ! jの値が右側の壁なら40へ飛ぶ IF a(i,j)=0 THEN LET a(i,j)=k :GOTO 10 ! 進むべきところが0ならそこをkとする IF a(i,j)<>0 THEN LET a(i+2,j-1)=k :i=i+2:j=j-1:GOTO 10 !進むべきところが0でないならば1つ下をkとする 30 LET i=n ! 下段に飛ぶ LET j=j LET a(i,j)=k GOTO 10 ! 行番号10へもどる 40 LET i=i LET j=1 ! 一番左の列に飛ぶ LET a(i,j)=k GOTO 10 ! 行番号10へもどる REM ------------------------------------------------ ! 盤面出力 50 PRINT n;"次魔方陣" PRINT FOR p=1 TO n FOR q=1 TO n PRINT a(p,q); NEXT Q PRINT NEXT P REM--------------------------------------------------------- PRINT PRINT "各行の合計の確認" sum=0 FOR t=1 TO n FOR tt=1 TO n sum=sum+a(t,tt) NEXT PRINT sum sum=0 NEXT REM ------------------------------------ PRINT PRINT "各列の合計の確認" sum2=0 FOR t=1 TO n FOR tt=1 TO n sum2=sum2+a(tt,t) NEXT PRINT sum2 sum2=0 NEXT REM--------------------------------------------- PRINT PRINT "主対角線の合計の確認" sum3=0 FOR t=1 TO n FOR tt=1 TO n IF t=tt THEN sum3=sum3+a(t,tt) NEXT NEXT PRINT sum3 REM------------------------------------ PRINT PRINT "副対角線の合計の確認" sum4=0 FOR t=1 TO n FOR tt=1 TO n IF t+tt=n+1 THEN sum4=sum4+a(t,tt) NEXT NEXT PRINT sum4 END
10進数と16進数の対応表(10進basic)
LET i=1 DO WHILE i<=1000 LET y=i LET ff$="" FOR x=1 TO 100 LET z=y/16 LET w=INT(z) LET r=MOD(y,16) ! PRINT "r="; r LET r$=STR$(r) IF r=10 THEN LET r$="a" else IF r=11 THEN LET r$="b" ELSE IF r=12 THEN LET r$="c" ELSE IF r=13 THEN LET r$="d" ELSE IF r=14 THEN LET r$="e" ELSE IF r=15 THEN LET r$="f" ELSE LET ff$=r$&ff$ LET y=w IF w=0 THEN EXIT FOR NEXT X PRINT i;"===>";ff$ ! GOTO 10 LET i=i+1 loop PRINT "終了" END
ズッカーマン数(十進basic)
十進basicを使っています。 ズッカーマン数をもとめています。 オプションタブより microsoft 互換モードで実行 LET s=1 FOR a=1 TO 1000000 LET aa$=STR$(a) LET b=LEN(aa$) LET product=1 FOR r=1 TO b LET product=product*VAL(mid$(aa$,r,1)) NEXT R WHEN EXCEPTION IN IF MOD(a,product)=0 THEN PRINT s; a IF MOD(a,product)=0 THEN LET s=s+1 USE END WHEN LET product=1 NEXT A END