<rdf:RDF
    xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'
    xmlns:s='http://snipsnap.org/rdf/snip-schema#'
    xml:base='http://www.peerbox.com:8668/rdf'>
    <s:Snip rdf:about='http://www.peerbox.com:8668/rdf#start/2005-12-25/1'
         s:name='start/2005-12-25/1'
         s:cUser='kgr'
         s:oUser='kgr'
         s:mUser='kgr'>
        <s:content>1 Sudoku Solver in JavaScript {anchor:Soduko Solver in JavaScript}&#xD;&#xA;One good thing about the holidays is that they usually give me the opportunity to spend some quality time with my computer. &#xD;&#xA;&#xD;&#xA;I&apos;ve taken advantage of this to finish off a {link:Sudoku|http://en.wikipedia.org/wiki/Sudoku} solver written in JavaScript.  This is the smallest solver that I&apos;ve seen.&#xD;&#xA;&#xD;&#xA;Notice that the method to solve the puzzle is only slightly larger than the method to display it.&#xD;&#xA;&#xD;&#xA;{code}&#xD;&#xA;// Author: Kevin Greer,   Date: Dec 25, 2005  --  Copyright 2005, All Rights Reserved&#xD;&#xA;&#xD;&#xA;s = [[[[0,0,0],[0,7,1],[0,0,5]], [[5,0,0],[0,6,9],[0,7,1]], [[0,7,1],[8,5,3],[4,2,0]]], &#xD;&#xA;     [[[0,1,0],[0,0,2],[0,0,0]], [[7,8,0],[1,5,4],[0,9,2]], [[0,4,0],[3,6,0],[1,8,0]]],&#xD;&#xA;     [[[0,6,4],[0,2,3],[0,5,0]], [[9,0,5],[0,1,0],[0,0,0]], [[7,0,0],[5,9,0],[0,0,0]]]]&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;function display() {&#xD;&#xA;   for ( a = 0 ; a &lt; 3 ; a++ ) {&#xD;&#xA;&#9;for ( b = 0 ; b &lt; 3 ; b++ ) {&#xD;&#xA;&#9;&#9;for ( c = 0 ; c &lt; 3 ; c++ ) {&#xD;&#xA;&#9;&#9;&#9;for ( d = 0 ; d &lt; 3 ; d++ )&#xD;&#xA;&#9;&#9;&#9;    document.write(&quot; &quot; + s[a][c][b][d])&#xD;&#xA;&#9;&#9;&#9;if ( c &lt; 2 ) document.write(&quot; |&quot;)&#xD;&#xA;&#9;&#9;}&#xD;&#xA;&#9;&#9;document.write(&quot;&lt;br/&gt;&quot;)&#xD;&#xA;&#9;}&#xD;&#xA;&#9;if ( a &lt; 2 ) document.write(&quot;-------+-------+-------&lt;br/&gt;&quot;)&#xD;&#xA;   }&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;function solve(a, b, c, d) {&#xD;&#xA;&#9;if ( d == 3 ) return solve(a, b, c+1, 0)&#xD;&#xA;&#9;if ( c == 3 ) return solve(a, b+1, 0, 0)&#xD;&#xA;&#9;if ( b == 3 ) return solve(a+1, 0, 0, 0)&#xD;&#xA;&#9;if ( a == 3 ) return true&#xD;&#xA;&#9;if ( s[a][b][c][d] != 0 ) return solve(a, b, c, d+1)&#xD;&#xA;&#9;outer: for ( var j = 1 ; j &lt;= 9 ; j++ ) {&#xD;&#xA;&#9;&#9;for ( var x = 0 ; x &lt; 3 ; x++ ) for ( var y = 0 ; y &lt; 3 ; y++ ) &#xD;&#xA;&#9;&#9;&#9;if ( s[a][b][x][y] == j || s[a][x][c][y] == j || s[x][b][y][d] == j )&#xD;&#xA;&#9;&#9;&#9;&#9;continue outer&#xD;&#xA;&#9;&#9;s[a][b][c][d] = j&#xD;&#xA;&#9;&#9;if ( solve(a, b, c, d+1) ) return true&#xD;&#xA;&#9;&#9;s[a][b][c][d] = 0&#xD;&#xA;&#9;}&#xD;&#xA;&#9;return false&#xD;&#xA;}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;display()&#xD;&#xA;document.write(&quot;&lt;br/&gt;solving...&lt;br/&gt;&lt;br/&gt;&quot;)&#xD;&#xA;if ( solve(0,0,0,0) ) display()&#xD;&#xA;{code}&#xD;&#xA;&#xD;&#xA;The solver outputs the puzzle, followed by its solution:&#xD;&#xA;&#xD;&#xA;{image:output.gif}&#xD;&#xA;&#xD;&#xA;&#xD;&#xA;You can find some solvers written in other languages linked from {link:lambda-the-ultimate|http://lambda-the-ultimate.org/node/view/772}.</s:content>
        <s:mTime>2006-01-01 18:23:14.586</s:mTime>
        <s:cTime>2005-12-25 14:34:35.345</s:cTime>
        <s:comments>
            <rdf:Bag>
                <rdf:li>
                    <s:Comment rdf:about='http://www.peerbox.com:8668/rdf#comment-start/2005-12-25/1-1'
                         s:name='comment-start/2005-12-25/1-1'
                         s:cUser='paul'
                         s:oUser='paul'
                         s:mUser='paul'>
                        <s:content>Nice one.&#xD;&#xA;&#xD;&#xA;Happy New Year !!!</s:content>
                        <s:mTime>2005-12-29 13:40:37.035</s:mTime>
                        <s:cTime>2005-12-29 13:40:36.96</s:cTime>
                        <s:commentedSnip rdf:resource='http://www.peerbox.com:8668/rdf#start/2005-12-25/1'/>
                    </s:Comment>
                </rdf:li>
                <rdf:li>
                    <s:Comment rdf:about='http://www.peerbox.com:8668/rdf#comment-start/2005-12-25/1-2'
                         s:name='comment-start/2005-12-25/1-2'
                         s:cUser='Christer'
                         s:oUser='Christer'
                         s:mUser='Christer'>
                        <s:content>Kevin,&#xD;&#xA;&#xD;&#xA;really good brute force solver, you&apos;ve made!&#xD;&#xA;&#xD;&#xA;Are you sure&#xD;&#xA;&#xD;&#xA;    return solve(a, b, c+1, 0) if d==3&#xD;&#xA;    return solve(a, b+1, 0, d) if c==3 &#xD;&#xA;    return solve(a+1, 0, c, d) if b==3  &#xD;&#xA;&#xD;&#xA;shouldn&apos;t be&#xD;&#xA;&#xD;&#xA;    return solve(a, b, c+1, 0) if d==3&#xD;&#xA;    return solve(a, b+1, 0, 0) if c==3 &#xD;&#xA;    return solve(a+1, 0, 0, 0) if b==3  &#xD;&#xA;&#xD;&#xA;?&#xD;&#xA;&#xD;&#xA;(I rewrote it in Ruby)&#xD;&#xA;&#xD;&#xA;regards&#xD;&#xA;Christer</s:content>
                        <s:mTime>2005-12-29 21:06:45.618</s:mTime>
                        <s:cTime>2005-12-29 21:06:45.551</s:cTime>
                        <s:commentedSnip rdf:resource='http://www.peerbox.com:8668/rdf#start/2005-12-25/1'/>
                    </s:Comment>
                </rdf:li>
                <rdf:li>
                    <s:Comment rdf:about='http://www.peerbox.com:8668/rdf#comment-start/2005-12-25/1-3'
                         s:name='comment-start/2005-12-25/1-3'
                         s:cUser='kgr'
                         s:oUser='kgr'
                         s:mUser='kgr'>
                        <s:content>Christer,&#xD;&#xA;&#xD;&#xA;   Good point.  The two versions are equivalent but yours avoids the variable lookups for values that we already know are zero anyway.&#xD;&#xA;&#xD;&#xA;Thanks</s:content>
                        <s:mTime>2005-12-30 22:34:37.926</s:mTime>
                        <s:cTime>2005-12-30 22:34:37.846</s:cTime>
                        <s:commentedSnip rdf:resource='http://www.peerbox.com:8668/rdf#start/2005-12-25/1'/>
                    </s:Comment>
                </rdf:li>
                <rdf:li>
                    <s:Comment rdf:about='http://www.peerbox.com:8668/rdf#comment-start/2005-12-25/1-4'
                         s:name='comment-start/2005-12-25/1-4'
                         s:cUser='kgr'
                         s:oUser='kgr'
                         s:mUser='kgr'>
                        <s:content>Here&apos;s a link to Christer&apos;s {link:Ruby Port|http://www.ruby-forum.com/topic/50188}.</s:content>
                        <s:mTime>2006-01-20 15:42:25.71</s:mTime>
                        <s:cTime>2006-01-20 15:00:18.498</s:cTime>
                        <s:commentedSnip rdf:resource='http://www.peerbox.com:8668/rdf#start/2005-12-25/1'/>
                    </s:Comment>
                </rdf:li>
                <rdf:li>
                    <s:Comment rdf:about='http://www.peerbox.com:8668/rdf#comment-start/2005-12-25/1-5'
                         s:name='comment-start/2005-12-25/1-5'
                         s:cUser='kgr'
                         s:oUser='kgr'
                         s:mUser='kgr'>
                        <s:content>Here&apos;s a list of solvers in other languages:&#xD;&#xA;&#xD;&#xA;* {link:J|http://www.vector.org.uk/archive/v214/sudoku.htm}&#xD;&#xA;* {link:Scheme|http://schemely.blogspot.com/2006/02/scheme-sudoku-solver.html}&#xD;&#xA;* {link:Lisp|http://www.jalat.com/blogs/lisp?id=4}&#xD;&#xA;* {link:APL|http://www.vector.org.uk/archive/v214/sudoku2.htm}&#xD;&#xA;* K: {link:#1|http://www.nsl.com/k/sudoku/rh.k} {link:#2|http://www.nsl.com/k/sudoku/aw.k}&#xD;&#xA;* {link:SQL!!!|http://www.vsj.co.uk/articles/display.asp?id=540}&#xD;&#xA;* {link:Python|http://www.norvig.com/sudoku.html}&#xD;&#xA;* {link:Smalltalk|http://blog.laubach.at/smalltalk/blogView?showComments=true&amp;entry=3347782296}&#xD;&#xA;* {link:Factor|http://factor-language.blogspot.com/2007/02/sudoko-solver-in-factor.html}&#xD;&#xA;</s:content>
                        <s:mTime>2007-02-26 09:18:19.37</s:mTime>
                        <s:cTime>2006-01-30 13:19:03.11</s:cTime>
                        <s:commentedSnip rdf:resource='http://www.peerbox.com:8668/rdf#start/2005-12-25/1'/>
                    </s:Comment>
                </rdf:li>
                <rdf:li>
                    <s:Comment rdf:about='http://www.peerbox.com:8668/rdf#comment-start/2005-12-25/1-6'
                         s:name='comment-start/2005-12-25/1-6'
                         s:cUser='kgr'
                         s:oUser='kgr'
                         s:mUser='kgr'>
                        <s:content>More short solutions: {link:Java|http://blogs.asman-it.com.au/dasman/index.php/20060724/java-sudoku-solver-in-6-lines}, {link:Perl|http://www.ecclestoad.co.uk/blog/2005/06/02/sudoku_solver_in_three_lines_explained.html}, {link:Ruby + Others|http://markbyers.com/moinmoin/moin.cgi/ShortestSudokuSolver}</s:content>
                        <s:mTime>2006-07-26 10:11:09.875</s:mTime>
                        <s:cTime>2006-07-26 10:11:09.782</s:cTime>
                        <s:commentedSnip rdf:resource='http://www.peerbox.com:8668/rdf#start/2005-12-25/1'/>
                    </s:Comment>
                </rdf:li>
            </rdf:Bag>
        </s:comments>
        <s:snipLinks>
            <rdf:Bag>
                <rdf:li rdf:resource='#snipsnap-search'/>
                <rdf:li rdf:resource='http://www.peerbox.com:8668/rdf#2005'/>
                <rdf:li rdf:resource='http://www.peerbox.com:8668/rdf#start/2006-03-31/1'/>
                <rdf:li rdf:resource='http://www.peerbox.com:8668/rdf#start/2006-05-16/1'/>
                <rdf:li rdf:resource='http://www.peerbox.com:8668/rdf#start/2005-12-08/1'/>
                <rdf:li rdf:resource='#snipsnap-index'/>
            </rdf:Bag>
        </s:snipLinks>
        <s:attachments>
            <rdf:Bag>
                <rdf:li>
                    <s:Attachment rdf:about='http://www.peerbox.com:8668/space/start/2005-12-25/1/output.gif'
                         s:fileName='output.gif'
                         s:contentType='image/gif'
                         s:size='7084'>
                        <s:date>Mon Dec 26 19:53:24 EST 2005</s:date>
                    </s:Attachment>
                </rdf:li>
            </rdf:Bag>
        </s:attachments>
    </s:Snip>
</rdf:RDF>
