Basic Sudoku Solver

The code below was constructed and tested at quitebasic.com website, but is very slow (hours, hence additional given "7..." at the start, then less than 10 minutes).
Note the creative usage of "goto" to avoid if-blocks. The syntax for C-64 is more strict. See below

Code


10 CLS
20 LET G0="700000030050607004008903760000000520000216000042000000087302100200108090030000000"
30 LET G1 = G0
40 LET R0 = 0
50 FOR R0 = 0 TO 8
60 LET C0 = 0
65 LET N2 = 0 
70 FOR C0 = 0 TO 8
80 IF MID(G1,R0*9+C0,1)<>"0" THEN GOTO 980
88 LET F1 = 0
90 LET F2 = 0 
100 LET N1 = 0
110 IF N2<>0 THEN LET N1 = N2
120 LET N2 = 0
125 LET N = 0
130 FOR N = N1+1 TO 9
140 LET F1 = 0
150 LET R1 = 0
160 FOR R1 = 0 TO 8
170 IF R1=R0 THEN GOTO 200
180 IF MID(G1,R1*9+C0,1)=N THEN LET F1=1
190 IF F1=1 THEN GOTO 600
200 NEXT R1
210 LET C1 = 0
220 FOR C1 = 0 TO 8
230 IF C1=C0 THEN GOTO 260
240 IF MID(G1,R0*9+C1,1)=N THEN LET F1=1
250 IF F1=1 THEN GOTO 600
260 NEXT C1
270 LET R3 = FLOOR(R0/3)*3
280 LET C3 = FLOOR(C0/3)*3
290 LET R2 = R3
300 FOR R2 = R3 TO R3+2
310 LET C2 = C3
320 FOR C2 = C3 TO C3+2
330 IF R0*9+C0=R2*9+C2 THEN GOTO 390
340 IF MID(G1,R2*9+C2,1)=N THEN LET F1=1
350 IF F1=1 THEN GOTO 600
390 NEXT C2
400 NEXT R2
410 LET F2=1
420 LET G1 = MID(G1,0,R0*9+C0)+N+MID(G1,R0*9+C0+1)
421 IF R0<2 OR C0<2 THEN PRINT G1
430 GOTO 610
600 NEXT N
610 IF F2=1 THEN GOTO 980
620 REM Now F1 should be 1 and N should be 9
630 REM Undo current position:
640 LET G1 = MID(G1,0,R0*9+C0)+"0"+MID(G1,R0*9+C0+1)
650 REM Take a step back
660 IF C0 > 0 THEN GOTO 680
670 LET C0 = 9
675 LET R0 = R0 - 1
680 LET C0 = C0 - 1
690 IF MID(G0,R0*9+C0,1)<>"0" THEN GOTO 650
700 IF MID(G1,R0*9+C0,1)<>"9" THEN GOTO 800
710 REM previous filled spot is exhausted but wrong so go even further back
720 LET G1 = MID(G1,0,R0*9+C0)+"0"+MID(G1,R0*9+C0+1)
730 GOTO 650
800 LET N2 = 1*MID(G1,R0*9+C0,1)
810 LET G1 = MID(G1,0,R0*9+C0)+"0"+MID(G1,R0*9+C0+1)
818 REM counteract iterator:
820 LET C0 = C0 - 1
980 NEXT C0
1000 NEXT R0
1020 PRINT G1

Quitebasic.com playground. Web emulator.

Extra C-64 syntax


10 REM string variables and functions have a $ suffix
20 REM numbers must be converted to strings: ""+RIGHT$(STR$(N),1)+""
30 REM strings must be converted to numbers: LET N2 = VAL(MID$(G1$,1+R0*9+C0,1))
40 REM in PC-Basic the indices are "one" based instead of zero based
50 REM F11+v to paste code in PC-Basic window; type run

PC-Basic documentation. Desktop emulator.

6x6 sudoku


10 CLS
11 REM PC-Basic F11+v
15 LET O=0
20 LET G0$="200140134652060000015030503061041000"
30 LET G1$ = G0$
40 LET R0 = 0
50 FOR R0 = 0 TO 5
60 LET C0 = 0
65 LET N2 = 0 
70 FOR C0 = 0 TO 5
80 IF MID$(G1$,O+R0*6+C0,1)<>"0" THEN GOTO 980
88 LET F1 = 0
90 LET F2 = 0 
100 LET N1 = 0
110 IF N2<>0 THEN LET N1 = N2
120 LET N2 = 0
125 LET N = 0
130 FOR N = N1+1 TO 6
140 LET F1 = 0
150 LET R1 = 0
160 FOR R1 = 0 TO 5
170 IF R1=R0 THEN GOTO 200
180 IF (MID$(G1$,O+R1*6+C0,1))=N THEN LET F1=1
190 IF F1=1 THEN GOTO 600
200 NEXT R1
210 LET C1 = 0
220 FOR C1 = 0 TO 5
230 IF C1=C0 THEN GOTO 260
240 IF (MID$(G1$,O+R0*6+C1,1))=N THEN LET F1=1
250 IF F1=1 THEN GOTO 600
260 NEXT C1
270 LET R3 = FLOOR(R0/2)*2
280 LET C3 = FLOOR(C0/3)*3
290 LET R2 = R3
300 FOR R2 = R3 TO R3+1
310 LET C2 = C3
320 FOR C2 = C3 TO C3+2
330 IF R0*6+C0=R2*6+C2 THEN GOTO 390
340 IF (MID$(G1$,O+R2*6+C2,1))=N THEN LET F1=1
350 IF F1=1 THEN GOTO 600
390 NEXT C2
400 NEXT R2
410 LET F2=1
420 LET G1$ = MID$(G1$,O+0,R0*6+C0)+N+MID$(G1$,O+R0*6+C0+1)
421 IF 1=1 OR R0<2 OR C0<2 THEN PRINT G1$
430 GOTO 610
600 NEXT N
610 IF F2=1 THEN GOTO 980
620 REM Now F1 should be 1 and N should be 6
630 REM Undo current position:
640 LET G1$ = MID$(G1$,O+0,R0*6+C0)+"0"+MID$(G1$,O+R0*6+C0+1)
650 REM Take a step back
660 IF C0 > 0 THEN GOTO 680
670 LET C0 = 6
675 LET R0 = R0 - 1
680 LET C0 = C0 - 1
690 IF MID$(G0$,O+R0*6+C0,1)<>"0" THEN GOTO 660
700 IF MID$(G1$,O+R0*6+C0,1)<>"6" THEN GOTO 800
710 REM previous filled spot is exhausted but wrong so go even further back
720 LET G1$ = MID$(G1$,O+0,R0*6+C0)+"0"+MID$(G1$,O+R0*6+C0+1)
730 GOTO 650
800 LET N2 = 1*(MID$(G1$,O+R0*6+C0,1))
810 LET G1$ = MID$(G1$,O+0,R0*6+C0)+"0"+MID$(G1$,O+R0*6+C0+1)
818 REM counteract iterator:
820 LET C0 = C0 - 1
980 NEXT C0
1000 NEXT R0
1020 PRINT G1$

As expected, this version is fast enough.

C-64 version with Debug info prepared


10 CLS
11 REM PC-Basic F11+v
15 LET O=1
17 LET W=6
20 LET G0$="200140134652060000015030503061041000"
30 LET G1$ = G0$
35 PRINT G0$ ; " given"
36 PRINT "256143134652362514415236523461641325" ; " expected"
40 LET R0 = 0
50 FOR R0 = 0 TO W-1
60 LET C0 = 0
65 LET N2 = 0 
70 FOR C0 = 0 TO W-1
80 IF MID$(G1$,O+R0*W+C0,1)<>"0" THEN GOTO 980
82 REM PRINT MID$(G1$,O,O+R0*W+C0) ; " N2" ; STR$(N2)
88 LET F1 = 0
90 LET F2 = 0 
100 LET N1 = 0
110 IF N2<>0 THEN LET N1 = N2
120 LET N2 = 0
125 LET N = 0
130 FOR N = N1+1 TO W
140 LET F1 = 0
145 LET F2 = 0
150 LET R1 = 0
160 FOR R1 = 0 TO W-1
170 IF R1=R0 THEN GOTO 200
180 IF VAL(MID$(G1$,O+R1*W+C0,1))=N THEN LET F1=1
190 IF F1=1 THEN GOTO 600
200 NEXT R1
205 REM IF R0=0 AND C0=5 THEN PRINT "N" ; N ; "F1 row" ; F1
210 LET C1 = 0
220 FOR C1 = 0 TO W-1
230 IF C1=C0 THEN GOTO 260
240 IF VAL(MID$(G1$,O+R0*W+C1,1))=N THEN LET F1=1
250 IF F1=1 THEN GOTO 600
260 NEXT C1
262 REM IF R0=0 AND C0=5 THEN PRINT "N" ; N ; "F1 col" ; F1
269 REM FLOOR Function doesn't work:
270 LET R3 = 0
271 IF R0 > 1 AND R0 < 4 THEN LET R3 = 2
272 IF R0 > 3 THEN LET R3 = 4
273 REM LET R3 = FLOOR(R0/(W/3))*(W/3)
280 LET C3 = 0
281 IF C0 > 2 THEN LET C3 = 3
283 REM LET C3 = FLOOR(C0/3)*3
290 LET R2 = R3
300 FOR R2 = R3 TO R3+((W/3)-1)
310 LET C2 = C3
320 FOR C2 = C3 TO C3+2
330 IF R0*W+C0=R2*W+C2 THEN GOTO 390
340 IF VAL(MID$(G1$,O+R2*W+C2,1))=N THEN LET F1=1
350 IF F1=1 THEN GOTO 600
390 NEXT C2
400 NEXT R2
402 REM IF R0=0 AND C0=5 THEN PRINT "N" ; N ; "F1 box" ; F1
410 LET F2=1
420 LET G1$ = MID$(G1$,O+0,R0*W+C0)+RIGHT$(STR$(N),1)+MID$(G1$,O+R0*W+C0+1)
421 REM IF 1=1 OR R0<2 OR C0<2 THEN PRINT G1$
430 GOTO 610
600 NEXT N
610 IF F2=1 THEN GOTO 980
620 REM Now F1 should be 1 and N should be W
630 REM Undo current position:
640 LET G1$ = MID$(G1$,O+0,R0*W+C0)+"0"+MID$(G1$,O+R0*W+C0+1)
650 REM Take a step back
660 IF C0 > 0 THEN GOTO 680
670 LET C0 = W
675 LET R0 = R0 - 1
680 LET C0 = C0 - 1
690 IF MID$(G0$,O+R0*W+C0,1)<>"0" THEN GOTO 660
700 IF VAL(MID$(G1$,O+R0*W+C0,1))<>W THEN GOTO 800
710 REM previous filled spot is exhausted but wrong so go even further back
720 LET G1$ = MID$(G1$,O+0,R0*W+C0)+"0"+MID$(G1$,O+R0*W+C0+1)
730 GOTO 650
800 LET N2 = VAL(MID$(G1$,O+R0*W+C0,1))
810 LET G1$ = MID$(G1$,O+0,R0*W+C0)+"0"+MID$(G1$,O+R0*W+C0+1)
818 REM counteract iterator:
820 LET C0 = C0 - 1
980 NEXT C0
1000 NEXT R0
1020 PRINT G1$

Note: FLOOR function did not work in the emulator, replaced by IF's.

C-64 9x9 version


10 CLS
11 REM PC-Basic F11+v
15 LET O=1
17 LET W=9
20 LET G0$="790000030050607004008903760000000520000216000042000000087302100200108090030000000"
30 LET G1$ = G0$
35 PRINT G0$ ; " given"
36 PRINT "796481235351627984428953761613894527579216348842735619987342156265178493134569872" ; " expected"
40 LET R0 = 0
50 FOR R0 = 0 TO W-1
60 LET C0 = 0
65 LET N2 = 0 
70 FOR C0 = 0 TO W-1
80 IF MID$(G1$,O+R0*W+C0,1)<>"0" THEN GOTO 980
82 REM PRINT MID$(G1$,O,O+R0*W+C0) ; " N2" ; STR$(N2)
88 LET F1 = 0
90 LET F2 = 0 
100 LET N1 = 0
110 IF N2<>0 THEN LET N1 = N2
120 LET N2 = 0
125 LET N = 0
130 FOR N = N1+1 TO W
140 LET F1 = 0
145 LET F2 = 0
150 LET R1 = 0
160 FOR R1 = 0 TO W-1
170 IF R1=R0 THEN GOTO 200
180 IF VAL(MID$(G1$,O+R1*W+C0,1))=N THEN LET F1=1
190 IF F1=1 THEN GOTO 600
200 NEXT R1
205 REM IF R0=0 AND C0=5 THEN PRINT "N" ; N ; "F1 row" ; F1
210 LET C1 = 0
220 FOR C1 = 0 TO W-1
230 IF C1=C0 THEN GOTO 260
240 IF VAL(MID$(G1$,O+R0*W+C1,1))=N THEN LET F1=1
250 IF F1=1 THEN GOTO 600
260 NEXT C1
262 REM IF R0=0 AND C0=5 THEN PRINT "N" ; N ; "F1 col" ; F1
269 REM FLOOR Function doesn't work:
270 LET R3 = 0
271 IF R0 > 2 AND R0 < 6 THEN LET R3 = 3
272 IF R0 > 5 THEN LET R3 = 6
273 REM LET R3 = FLOOR(R0/(W/3))*(W/3)
280 LET C3 = 0
281 IF C0 > 2 AND C0 < 6 THEN LET C3 = 3
282 IF C0 > 5 THEN LET C3 = 6
283 REM LET C3 = FLOOR(C0/3)*3
290 LET R2 = R3
300 FOR R2 = R3 TO R3+((W/3)-1)
310 LET C2 = C3
320 FOR C2 = C3 TO C3+2
330 IF R0*W+C0=R2*W+C2 THEN GOTO 390
340 IF VAL(MID$(G1$,O+R2*W+C2,1))=N THEN LET F1=1
350 IF F1=1 THEN GOTO 600
390 NEXT C2
400 NEXT R2
402 REM IF R0=0 AND C0=5 THEN PRINT "N" ; N ; "F1 box" ; F1
410 LET F2=1
420 LET G1$ = MID$(G1$,O+0,R0*W+C0)+RIGHT$(STR$(N),1)+MID$(G1$,O+R0*W+C0+1)
421 IF 1=1 OR R0<2 OR C0<2 THEN PRINT LEFT$(G1$,70) ; "..."
430 GOTO 610
600 NEXT N
610 IF F2=1 THEN GOTO 980
620 REM Now F1 should be 1 and N should be W
630 REM Undo current position:
640 LET G1$ = MID$(G1$,O+0,R0*W+C0)+"0"+MID$(G1$,O+R0*W+C0+1)
650 REM Take a step back
660 IF C0 > 0 THEN GOTO 680
670 LET C0 = W
675 LET R0 = R0 - 1
680 LET C0 = C0 - 1
690 IF MID$(G0$,O+R0*W+C0,1)<>"0" THEN GOTO 660
700 IF VAL(MID$(G1$,O+R0*W+C0,1))<>W THEN GOTO 800
710 REM previous filled spot is exhausted but wrong so go even further back
720 LET G1$ = MID$(G1$,O+0,R0*W+C0)+"0"+MID$(G1$,O+R0*W+C0+1)
730 GOTO 650
800 LET N2 = VAL(MID$(G1$,O+R0*W+C0,1))
810 LET G1$ = MID$(G1$,O+0,R0*W+C0)+"0"+MID$(G1$,O+R0*W+C0+1)
818 REM counteract iterator:
820 LET C0 = C0 - 1
980 NEXT C0
1000 NEXT R0
1020 PRINT G1$

I installed the desktop emulator hoping it would be faster, but that is not the case. I sped things up by adding a few givens at the start.
The output window shows 80 characers per line, hence the truncation in Line 421