論理パズルを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