十進BASIC 第3掲示板

十進BASIC第3掲示板

十進BASICプログラミングについての質問や研究成果の公開にご利用ください。
メッセージ入力枠は右下をドラッグして拡大できます。 画像,URLは省略可能です。
編集/削除キーを入力しなくてもエラーにはなりませんが,何か適当な半角英数字4~8文字を指定してください。
特に,長文投稿の場合,プレビューで最後の行を確認しても,実際には途中で切れてしまうことがあるので,投稿後の確認が必要です。

数独 - 永野護

2025/09/20 (Sat) 18:04:28

下記は数独を解くpythonコードです。十進basicに移植したらどうなるでしょうか。
# 数独全解探索プログラム (バックトラック法)

# --- 問題データ(0は空白) ---
board = [
[5,3,0,0,7,0,0,0,0],
[6,0,0,1,9,5,0,0,0],
[0,9,8,0,0,0,0,6,0],
[8,0,0,0,6,0,0,0,3],
[4,0,0,8,0,3,0,0,1],
[0,0,0,0,2,0,0,0,6],
[0,6,0,0,0,0,2,8,0],
[0,0,0,0,1,9,0,0,0],
[0,0,0,0,8,0,0,0,0]
]

solution_count = 0


def print_board(b):
"""盤面を表示"""
for r in range(9):
for c in range(9):
print(b[r][c], end=" ")
print()
print()


def is_valid(b, r, c, num):
"""(r,c) に num を置けるか判定"""

# 行チェック
# if num in b[r]:
for i in range(9):
if b[r][i]==num:
return False

# 列チェック
for i in range(9):
if b[i][c] == num:
return False

# 3x3 ブロックチェック
r0 = (r // 3) * 3
c0 = (c // 3) * 3
for i in range(3):
for j in range(3):
if b[r0+i][c0+j] == num:
return False

return True


def solve(b):
"""バックトラックで全解探索"""
global solution_count

for r in range(9):
for c in range(9):
if b[r][c] == 0:
for num in range(1, 10):
if is_valid(b, r, c, num):
b[r][c] = num
solve(b)
b[r][c] = 0
return # このマスが埋まらなければ戻る

# 空マスがない = 解を発見
solution_count += 1
print(f"---- 解 {solution_count} ----")
print_board(b)


# --- 実行 ---
solve(board)
print("総解数 =", solution_count)

Re: 数独 - SHIRAISHI Kazuo

2025/09/22 (Mon) 12:46:06

問題データの記述はDATA文,配列への読み込みはMAT READ,
大域変数solution_countはモジュールのPUBLIC変数に,
True, Falseは数値の1,0か,文字列の"Y',"N"で代用する,

といったところでしょうか。

Re: 数独 - しばっち

2025/09/23 (Tue) 07:53:02

pythonプログラムから十進basicへの移植を人工知能AI(copilot)に頼んでみた。
一部若干の修正が必要でしたが、ほぼ完ぺきに移植できていました。

移植とは2つの言語理解を必要とする高度な作業ですが
どうやらAIでも行えるようです。

これからはAIを活用していくことで言語習得の手助けとなりそうです。



PUBLIC NUMERIC SOLUTION_COUNT
!' --- 問題データ(0は空白) ---
DIM board(1 TO 9, 1 TO 9)
DATA 5,3,0,0,7,0,0,0,0
DATA 6,0,0,1,9,5,0,0,0
DATA 0,9,8,0,0,0,0,6,0
DATA 8,0,0,0,6,0,0,0,3
DATA 4,0,0,8,0,3,0,0,1
DATA 0,0,0,0,2,0,0,0,6
DATA 0,6,0,0,0,0,2,8,0
DATA 0,0,0,0,1,9,0,0,0
DATA 0,0,0,0,8,0,0,0,0

FOR i = 1 TO 9
FOR j = 1 TO 9
READ board(i,j)
NEXT j
NEXT i
LET solution_count = 0
!' --- 実行 ---
CALL solve(board)
PRINT "総解数 ="; solution_count
END

!' --- 盤面表示 ---
EXTERNAL SUB print_board(b(,))
FOR r = 1 TO 9
FOR c = 1 TO 9
PRINT b(r,c);
NEXT c
PRINT
NEXT r
PRINT
END SUB

!' --- (r,c) に num を置けるか判定 ---
EXTERNAL FUNCTION is_valid(b(,), r, c, num)
!' 行チェック
FOR i = 1 TO 9
IF b(r,i) = num THEN
LET is_valid = 0
EXIT FUNCTION
END IF
NEXT i

!' 列チェック
FOR i = 1 TO 9
IF b(i,c) = num THEN
LET is_valid = 0
EXIT FUNCTION
END IF
NEXT i

!' 3x3 ブロックチェック
LET r0 = INT((r - 1) / 3) * 3 + 1
LET c0 = INT((c - 1) / 3) * 3 + 1
FOR i = 0 TO 2
FOR j = 0 TO 2
IF b(r0 + i, c0 + j) = num THEN
LET is_valid = 0
EXIT FUNCTION
END IF
NEXT j
NEXT i

LET is_valid = 1
END FUNCTION

!' --- バックトラックで全解探索 ---
EXTERNAL SUB solve(b(,))
FOR r = 1 TO 9
FOR c = 1 TO 9
IF b(r,c) = 0 THEN
FOR num = 1 TO 9
IF is_valid(b, r, c, num)=1 THEN
LET b(r,c) = num
CALL solve(b)
LET b(r,c) = 0
END IF
NEXT num
EXIT SUB
END IF
NEXT c
NEXT r

!' 空マスがない = 解を発見
LET solution_count = solution_count + 1
PRINT "---- 解"; solution_count; " ----"
CALL print_board(b)
END SUB

実行結果

---- 解 1 ----
5 3 1 6 7 8 4 9 2
6 2 4 1 9 5 3 7 8
7 9 8 3 4 2 1 6 5
8 1 2 9 6 4 7 5 3
4 7 6 8 5 3 9 2 1
3 5 9 7 2 1 8 4 6
1 6 5 4 3 7 2 8 9
2 8 7 5 1 9 6 3 4
9 4 3 2 8 6 5 1 7

---- 解 2 ----
5 3 1 6 7 8 4 9 2
6 2 4 1 9 5 3 7 8
7 9 8 3 4 2 1 6 5
8 1 2 9 6 4 7 5 3
4 7 6 8 5 3 9 2 1
9 5 3 7 2 1 8 4 6
1 6 5 4 3 7 2 8 9
2 8 7 5 1 9 6 3 4
3 4 9 2 8 6 5 1 7

---- 解 3 ----
5 3 1 6 7 8 4 9 2
6 2 4 1 9 5 3 7 8
7 9 8 3 4 2 1 6 5
8 1 2 9 6 4 7 5 3
4 7 6 8 5 3 9 2 1
9 5 3 7 2 1 8 4 6
1 6 9 5 3 7 2 8 4
2 8 5 4 1 9 6 3 7
3 4 7 2 8 6 5 1 9

中略

---- 解 130 ----
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 4 3 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
3 6 1 5 4 7 2 8 9
2 8 5 3 1 9 6 7 4
9 4 7 2 8 6 1 3 5

---- 解 131 ----
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 4 3 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 3 4 7 2 8 5
2 8 7 5 1 9 6 3 4
3 4 5 2 8 6 1 7 9

---- 解 132 ----
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 4 3 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 3 4 7 2 8 5
3 8 5 2 1 9 6 7 4
2 4 7 5 8 6 1 3 9

総解数 = 132

名前
件名
メッセージ
画像
メールアドレス
URL
編集/削除キー (半角英数字のみで4~8文字)
プレビューする (投稿前に、内容をプレビューして確認できます)

Copyright © 1999- FC2, inc All Rights Reserved.