TIP: Click on subject to list as thread! ANSI
echo: mens_issues
to: All
from: `ian` drawnai{at}hotmail.Co
date: 2005-03-03 01:41:00
subject: Re: It was very romantic

Actually I don't need to write it. I've managed to simulate the flow,
using Not existing selects as cdrs.

If I do this, I end up with, in pure Lisp style, everything done in a
single command.

"Delete B From Box B Where Exists (Select * From Box Z Where B.V = Z.V
And (B.C  Z.C Or B.R  Z.R) And (B.R = Z.R Or B.C = Z.C Or B.Box =
Z.Box) And Not Exists (Select * from Box F Where F.R = Z.R And F.C =
Z.C And F.V  Z.V)) Or Exists (Select * From Box B2 Where B2.R = B.R
And B2.C = B.C And B2.V  B.V And (Not Exists (Select * From Box B3
Where B2.R = B3.R And B3.C  B2.C And B2.V = B3.V) Or Not Exists
(Select * From Box B3 Where B2.C = B3.C And B3.R  B2.R And B2.V =
B3.V) Or Not Exists (Select * From Box B3 Where B2.Box = B3.Box And
(B2.R  B3.R Or B3.C  B2.C) And B2.V = B3.V)))"

It even has Lots of Silly Parentheses.

Of course there's lots more clever ways the soduko puzzles could be
complicated, such as adding further levels of induction in order to
determine for certain, a particular step.

This one above only solves the typical cases where deduction is all you
need.


---------------------------------------------------------------------------------------
All the rest of the code is setting the data up. The single instruction
above (repeatedly called) solves the soduko. In the lisp it would of
course repeatedly iterate itself.

use Test
Drop View SQ
Drop Table dbo.Box
Drop Procedure dbo.spSudokuInitRow2
Drop Procedure dbo.spSudokuInitBox2
Drop Procedure dbo.spViewAll2
Go
Create View SQ As Select Val = 1 Union Select Val = 2 Union Select Val
= 3 Union Select Val = 4 Union Select Val = 5 Union Select Val = 6
Union Select Val = 7 Union Select Val = 8 Union Select Val = 9
Go
Create Table dbo.Box (R TinyInt, C TinyInt, V TinyInt, Box As 3 * ((R -
1) / 3) + (C - 1) / 3 + 1)
Go
Create Procedure dbo.spSudokuInitRow2 {at}R TinyInt, {at}Data Char (9) As
Begin
 Declare {at}C TinyInt, {at}Ch Char (1), {at}V TinyInt
 Set {at}C = 1
 While {at}C <= 9 Begin
  Set {at}Ch = Substring ({at}Data, {at}C, 1)
  If {at}Ch in ('1', '2', '3', '4', '5', '6', '7', '8', '9') Delete Box
Where R = {at}R And C = {at}C And V  Convert (TinyInt, {at}Ch)
  Set {at}C = {at}C + 1
 End
End
Go
Create Procedure dbo.spSudokuInitBox2 {at}Row1 Char(9), {at}Row2 Char(9),
{at}Row3 Char(9), {at}Row4 Char(9), {at}Row5 Char(9), {at}Row6 Char(9), {at}Row7
Char(9), {at}Row8 Char(9), {at}Row9 Char(9) As Begin
 Set NoCount On
 Delete dbo.Box
 Insert Box Select S1.Val, S2.Val, S3.Val From SQ S1, SQ S2, SQ S3
 Exec dbo.spSudokuInitRow2 1, {at}Row1
 Exec dbo.spSudokuInitRow2 2, {at}Row2
 Exec dbo.spSudokuInitRow2 3, {at}Row3
 Exec dbo.spSudokuInitRow2 4, {at}Row4
 Exec dbo.spSudokuInitRow2 5, {at}Row5
 Exec dbo.spSudokuInitRow2 6, {at}Row6
 Exec dbo.spSudokuInitRow2 7, {at}Row7
 Exec dbo.spSudokuInitRow2 8, {at}Row8
 Exec dbo.spSudokuInitRow2 9, {at}Row9
End
Go
Create Procedure dbo.spViewAll2 As Begin
 Set Nocount On
 Declare {at}R TinyInt, {at}Strn Varchar (3000), {at}C TinyInt, {at}ML Int, {at}Str
Varchar (19), {at}Cnt TinyInt
 Declare {at}T Table (IDX Int Identity (1, 1), Stng Varchar (4000))
 Select {at}ML = Max (Y.Cnt) From (Select Cnt = Count (*) From Box Group
By R, C) Y
 Set {at}R = 1
 While {at}R < 10 Begin
  Set {at}Strn = ''
  Set {at}C = 1
  While {at}C < 10 Begin
   Set {at}Cnt = 1
   Set {at}Str = ''
   While {at}Cnt < 10 Begin
    If Exists (Select * From Box Where R = {at}R And C = {at}C And V = {at}Cnt)
Set {at}Str = {at}Str + Convert (Varchar, {at}Cnt)
    Set {at}Cnt = {at}Cnt + 1
   End
   Set {at}Strn = {at}Strn + {at}Str + Space ({at}ML - Len ({at}Str))
   Set {at}C = {at}C + 1
   Set {at}Strn = {at}Strn + '|'
   If {at}C in (3, 6) Set {at}Strn = {at}Strn + '|'
  End
  Insert {at}T Values ({at}Strn)
  Set {at}R = {at}R + 1
 End
 Select Stng From {at}T
End
go
Drop Procedure dbo.solveit2
go
Create Procedure dbo.solveit2 As
Begin
 Declare {at}RowsLast Int, {at}RowsKeep Int
 Set {at}RowsKeep = 81
 Set {at}RowsLast = 0
 While {at}RowsLast  {at}RowsKeep Begin
 Set {at}RowsKeep = {at}RowsLast
 Delete B From Box B Where Exists (Select * From Box Z Where B.V = Z.V
And (B.C  Z.C Or B.R  Z.R) And (B.R = Z.R Or B.C = Z.C Or B.Box =
Z.Box) And Not Exists (Select * from Box F Where F.R = Z.R And F.C =
Z.C And F.V  Z.V)) Or Exists (Select * From Box B2 Where B2.R = B.R
And B2.C = B.C And B2.V  B.V And (Not Exists (Select * From Box B3
Where B2.R = B3.R And B3.C  B2.C And B2.V = B3.V) Or Not Exists
(Select * From Box B3 Where B2.C = B3.C And B3.R  B2.R And B2.V =
B3.V) Or Not Exists (Select * From Box B3 Where B2.Box = B3.Box And
(B2.R  B3.R Or B3.C  B2.C) And B2.V = B3.V)))
 Select {at}RowsLast = {at}{at}RowCount
 End
 Exec dbo.spViewAll2
End
go
exec dbo.spSudokuInitBox2 'xxx56x421', 'xxxx9xx86', 'xx2xxx7xx',
'8xx4xxx1x', 'xx5xxx3xx', 'x1xxx8xx7', 'xx1xxx9xx', '47xx2xxxx',
'639x41xxx'
Go
Exec solveit2



--- UseNet To RIME Gateway {at} 3/3/05 1:38:42 AM ---
* Origin: MoonDog BBS, Brooklyn,NY, 718 692-2498, 1:278/230 (1:278/230)
SEEN-BY: 633/267 270 5030/786
@PATH: 278/230 10/345 106/1 2000 633/267

SOURCE: echomail via fidonet.ozzmosis.com

Email questions or comments to sysop@ipingthereforeiam.com
All parts of this website painstakingly hand-crafted in the U.S.A.!
IPTIA BBS/MUD/Terminal/Game Server List, © 2025 IPTIA Consulting™.