Try integrating it with a user interface like this example: http://www.vantasyworld.com/fun/sudoku/sudokusolver.html.

Does it also detect sudoku puzzles that are impossible to solve?

]]>http://vbaexcel.eu/vba-macro-code/sudoku-solver

This solver I have been using works fine but it is alot of code compared to yours!

]]>-Mark

]]>I assume I need the first part, select from dual, then the model clause (model reference xxx on …. dimension by (i,j) measures (r), then followed by the “main solve” clause?

I keep getting syntax errors trying to run it, in 10.2.0.3.

-Mark

]]>http://www.devx.com/dbzone/Article/33551

FULL DISCLOSURE: That guy happens to be my dad 😉

]]>

By the way – if you like sql pluzzles you might like to try this, which can be solved by a single sql statement ( it will work even with Oracle 8i) , assuming you have a table called nums that holds the values 2..100.

I like this problem , since it is almost impossible to solve by hand. By the way, the answer is the same even if you make the largest value 1000 (and then solving by hand becomes a nightmare).

efine minval=2<br />define maxval=100<br />set numwidth 6<br />set pages 0<br />set feedback off<br />set verify off<br />column a3 format a3<br />column a15 format a15<br />column num format 9999<br />prompt<br />prompt Solve the problem set by:<br />prompt<br />prompt There are 2 integers a and b between &amp;&amp;minval and &amp;maxval, with a= a.num;<br /><br />create view sums as select a+b s,count(*) cc<br /> from pairs<br /> group by a+b;<br /> <br />create view products as select a*b p,count(*) cc<br /> from pairs<br /> group by a*b;<br /><br />prompt<br />prompt Paul: I don't know what the numbers are<br />prompt Sam : I knew that. I don't know what the numbers are either<br />prompt<br />prompt Paul's first statement is more helpful than it first appears<br />prompt The pair of numbers cannot be uniquely determined by their product<br />prompt This includes not just 2 primes such as 7 and 11, <br />prompt but also pairs like 19 and 38, or 4 and 53, 77 and 17<br />prompt (assuming we are only looking at 2 digit numbers)<br />prompt<br />prompt Sam's first statement is even more helpful.<br />prompt Sam knows that Paul can't possibly know the numbers<br />prompt So whatever his sum is, it cannot <br />prompt be formed by a pair that uniquely determines their product<br />prompt For example : the sum cannot be 18, or 57 or 94 using the above examples<br />prompt<br />prompt generate poss_sums as <br />prompt the only sums that cannot possibly be made by distinct product pairs<br />prompt There are surprisingly few<br />pause Ready?<br /><br />create view poss_sums as<br /> select s from sums where cc &gt; 1<br /> minus<br /> select pairs.a+pairs.b s from pairs where pairs.a*pairs.b in<br /> (select p from products where cc=1);<br /><br />prompt<br />prompt From Sam's first statement the sum must be one of<br />prompt<br />select s from poss_sums<br />order by s;<br /><br />prompt<br />prompt Paul's last statement:<br />prompt Paul: I do now!<br />prompt<br />prompt So Paul knows that Sam knew that he did not know the numbers and so <br />prompt must have a sum matching the above criterion<br />prompt This enables him to deduce the pairs.<br />prompt So Paul must have a product that decomposes to one of the sums <br />prompt in the above list<br />prompt in exactly one way (2 or more would not give him a solution and 0 <br />prompt would violate Sam's previous statement)<br />prompt find all products that can have exactly one sum matching the list of sums above<br />prompt<br />pause Ready?<br /><br />create view poss_prods as<br />select products.p,max(poss_sums.s) s <br />from products,pairs,poss_sums<br />where products.cc &gt; 1<br /> and pairs.a*pairs.b = products.p<br /> and pairs.a+pairs.b = poss_sums.s<br />group by products.p<br />having count(poss_sums.s) = 1;<br /><br />select 'product is ', p, 'sum is', s from poss_prods<br />order by p,s;<br /> <br />-- now find the sum that has only one possible product fitting that criterion <br /><br />prompt <br />prompt Sam's last statement:<br />prompt Sam : So do I!<br />prompt <br />prompt So we need to find a sum that only occurs once in the above list<br />prompt Otherwise Sam could still not deduce the pair.<br />prompt and as we know both the product and the sum we can find the pair<br />prompt<br />pause Ready?<br /><br />col plan_plus_exp for a120<br />set lines 160<br /><br />select 'In the range' a15,min(num) num,'to' a3,max(num) num from nums;<br /><br />set autotrace on explain<br /><br />select 'The numbers are' a15, a num,'and' a3, b num<br />from pairs,<br /> ( select max(p) p,s from poss_prods group by s having count(*) = 1) pp<br />where pairs.a*pairs.b = pp.p<br /> and pairs.a+pairs.b= pp.s<br />order by a,b;<br /><br />set autotrace off<br /><br />drop view poss_prods;<br />drop view poss_sums;<br /><br />drop view products;<br />drop view sums;<br />drop view pairs;<br /><br />prompt<br />prompt or to be perverse, and use only in-line views<br />pause Ready?<br />prompt<br /><br />-- using the with clause is much too slow in 10.1<br />-- with nums as (select rownum+&amp;&amp;minval-1 num from sys.tab$<br />-- where rownum = a.num<br /> ) pairs,<br /> ( select max(p) p,s <br /> from ( select products.p,max(poss_sums.s) s <br /> from ( select a.num*b.num p,count(*) cc<br /> from nums a, nums b<br /> where b.num&gt;= a.num<br /> group by a.num*b.num<br /> having count(*) &gt; 1<br /> ) products,<br /> ( select a.num a, b.num b<br /> from nums a, nums b <br /> where b.num &gt;= a.num<br /> ) prs,<br /> (<br /> select s <br /> from ( select a.num+b.num s<br /> from nums a, nums b<br /> where b.num &gt;= a.num<br /> group by a.num+b.num<br /> having count(*) &gt; 1 <br /> ) sums<br /> minus<br /> select prs2.a+prs2.b s <br /> from ( select a.num a, b.num b<br /> from nums a, nums b<br /> where b.num &gt;= a.num <br /> ) prs2 <br /> where prs2.a*prs2.b in<br /> ( select a.num*b.num p<br /> from nums a, nums b<br /> where b.num &gt;= a.num<br /> group by a.num*b.num<br /> having count(*) = 1<br /> )<br /> ) poss_sums<br /> where prs.a*prs.b = products.p<br /> and prs.a+prs.b = poss_sums.s<br /> group by products.p<br /> having count(poss_sums.s) = 1<br /> ) <br /> group by s having count(*) = 1<br /> ) pp<br />where pairs.a*pairs.b = pp.p<br /> and pairs.a+pairs.b= pp.s<br />order by a,b;<br /><br />set autotrace off<br />set timing off<br /><br />drop table nums; <br />]]>