数独 初級 攻略 プログラム 番外

BASIC 未分類

久しぶりです。
多面体関連の内容で 今はお伝えするほどのエピソードはありません。
そこで やっと出来た BASIC プログラムを載せておきます。
以前 Excel で作ったこともある 簡単なロジックで作っています。
仮定を設けての推論はせず 論理的必然としての 結果を表示します。
Excel では IF文が錯綜し 頭が混乱しました。

! 数独 初級 攻略 ツール
! フリーウエアー 十進BASIC でプログラム     
! http://hp.vector.co.jp/authors/VA008683/ を参照  
! http://hp.vector.co.jp/authors/VA008683/english/index.htm 英語版     

OPTION BASE 0

DIM x001(9,10)  ! 集計用配列
DIM s001(9,9)   ! 問題データ格納
DIM s002(9,9)   ! 判定用数値格納
DIM s003(9,9)   ! 累積判定用数値格納

! 集計振り分け用データ取り込み
FOR x=1 TO 9
   FOR y=1 TO 9
      READ x001(x,y)
   NEXT y
NEXT x

! 集計振り分け用データ
DATA  1,1,1,  2,2,2,  3,3,3
DATA  1,1,1,  2,2,2,  3,3,3
DATA  1,1,1,  2,2,2,  3,3,3

DATA  4,4,4,  5,5,5,  6,6,6
DATA  4,4,4,  5,5,5,  6,6,6
DATA  4,4,4,  5,5,5,  6,6,6

DATA  7,7,7,  8,8,8,  9,9,9
DATA  7,7,7,  8,8,8,  9,9,9
DATA  7,7,7,  8,8,8,  9,9,9

! 問題データ取り込み  と  集計データ格納
FOR x=1 TO 9
   FOR y=1 TO 9
      READ w001
      IF w001 = 0 THEN LET s002(x,y)=0
      IF w001 > 0 THEN LET s002(x,y)=10^(w001-1)
      LET s001(x,y)=w001
      LET x001(x,0)=x001(x,0)+s002(x,y)
      LET x001(0,y)=x001(0,y)+s002(x,y)
      LET w002=x001(x,y)
      LET x001(w002,10)=x001(w002,10)+s002(x,y)
   NEXT y
NEXT x
PRINT       !   1行スぺースを空ける

! 問題内容を 視覚化
FOR x=1 TO 9
   FOR y=1 TO 9
      IF s001(x,y)=0 THEN 
         PRINT "□ ";
      ELSE
         PRINT s001(x,y);
      END if
      IF y=3 OR y=6 THEN PRINT  "   ";
      IF y=9        THEN PRINT  
   NEXT y
   IF x=3 OR x=6 THEN PRINT 
NEXT x

! 個々の位置に判定数値を格納
FOR x=1 TO 9
   FOR y=1 TO 9
      LET w001=x001(x,y)
      IF s002(x,y) = 0 THEN  
         LET s003(x,y)=x001(x,0)+x001(0,y)+x001(w001,10)
      END if
   NEXT y
NEXT x

PRINT        !   1行スぺースを空ける

! 個々の判定数値を表示
FOR x=1 TO 9
   FOR y=1 TO 9
      IF s003(x,y) = 0 THEN 
         PRINT  "[  ";s001(x,y);"  ]";" ";
      ELSE
         LET w006$=""
         LET w004$= STR$(s003(x,y)+10^9)
         FOR z=1 TO 9
            LET zz=10-z
            LET w005$=mid$(w004$,z+1,1) 
            IF w005$="0" THEN 
               LET w006$=w006$ & STR$(zz)
            ELSE
               LET w006$=w006$ & " "
            END if
         NEXT z
         PRINT w006$;" ";
      END IF
      IF y=3 OR y=6 THEN PRINT  "  ";
      IF y=9        THEN PRINT  
   NEXT y
   IF x=3 OR x=6 THEN PRINT 
NEXT x

! 問題データ
!     a b c   d e f   g h i 

DATA  0,0,0,  0,0,7,  0,8,0  ! 1
DATA  0,0,0,  0,0,0,  0,2,3  ! 2
DATA  1,6,4,  0,0,0,  0,0,0  ! 3

DATA  2,0,7,  1,8,6,  0,0,0  ! 4
DATA  0,8,1,  9,5,0,  0,7,0  ! 5
DATA  9,4,5,  0,0,3,  0,0,6  ! 6

DATA  4,1,2,  0,6,0,  7,0,8  ! 7
DATA  0,0,6,  4,0,9,  2,3,1  ! 8
DATA  3,7,9,  2,0,8,  4,0,5  ! 9

END
以上です。下のような出力になります。
□ □ □    □ □  7    □  8 □ 
□ □ □    □ □ □    □  2  3 
 1  6  4    □ □ □    □ □ □ 

 2 □  7     1  8  6    □ □ □ 
□  8  1     9  5 □    □  7 □ 
 9  4  5    □ □  3    □ □  6 

 4  1  2    □  6 □     7 □  8 
□ □  6     4 □  9     2  3  1 
 3  7  9     2 □  8     4 □  5 

    5     9   5 32        3       65 3   9    4321 [   7   ]  9  65   1 [   8   ] 9    4    
 87 5     9   5      8          8 65     9    4  1     54  1  9  65   1 [   2   ] [   3   ] 
[   1   ] [   6   ] [   4   ]   8  5 3   9     32      5  2   9   5     9   5     9 7       

[   2   ]       3   [   7   ]  [   1   ] [   8   ] [   6   ]  9   5 3   9   54    9    4    
   6      [   8   ] [   1   ]  [   9   ] [   5   ]      4 2         3   [   7   ]      4 2  
[   9   ] [   4   ] [   5   ]    7         7    2  [   3   ]   8      1         1 [   6   ] 

[   4   ] [   1   ] [   2   ]      5 3   [   6   ]     5      [   7   ] 9         [   8   ] 
 8  5         5     [   6   ]  [   4   ]   7       [   9   ]  [   2   ] [   3   ] [   1   ] 
[   3   ] [   7   ] [   9   ]  [   2   ]         1 [   8   ]  [   4   ]    6      [   5   ]

« »