Once upon a time, SUDOKU was a popular puzzle. The following query will attempt to solve a puzzle that is entered towards the top of this query. You'll need to enter the given numbers in their proper locations; the "-" represents an empty box. Note that this query is a very clever implementation of a 'recursive-WITH'. Have fun!
with sudoku_solver ( sol_str, ind ) as ( select sud , instr( sud, '-' ) from ( select '6--9-1--8' -- Row #1 || '-4--8--3-' -- Row #2 || '---4-6---' -- Row #3 || '-9-----7-' -- Row #4 || '5-7-1-2-9' -- Row #5 || '-3-----5-' -- Row #6 || '---1-2---' -- Row #7 || '-1--5--9-' -- Row #8 || '7--8-9--2' -- Row #9 as sud from dual ) union all select substr( sol_str, 1, ind - 1 ) || z || substr( sol_str, ind + 1 ) , instr( sol_str, '-', ind + 1 ) from sudoku_solver , ( select to_char( rownum ) z from dual connect by rownum <= 9 ) z where ind > 0 and not exists ( select 1 from (select rownum lp from dual connect by rownum <= 9) where z = substr(sol_str, trunc((ind-1)/9)*9+lp, 1) or z = substr(sol_str, mod(ind-1, 9)-8+lp*9, 1) or z = substr(sol_str, mod(trunc((ind-1)/3), 3)*3+ trunc((ind-1)/27)*27+lp+trunc((lp-1)/3)*6, 1) ) ) , results as (select sol_str from sudoku_solver where ind = 0 ) SELECT 'Row #' || rownum as "Row Number" , substr(sol_str, rownum*9-8, 9) as "Solution" from results connect by level <= 9 ;
Note: this code is not the product of my brain-steam. I found this algorithm somewhere on the web and have enjoyed playing with it. I apologize for not remembering where or who originally came up with it; but, my hat is off to them!
No comments:
Post a Comment