Subject: Re: [xsl] A new Sudoku xslt implementation (Was: Re: [xsl] Sudoku - A solution in XSLT 2) From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx> Date: Sat, 11 Mar 2006 21:29:27 +1100 |
Hi Andrew, > Hi Dimitre, > > I have made a couple of improvements to the version you used there - I > found if you tackle the center cells first, followed by the top-middle > group the time can be greatly reduced. > > I've also improved the test boards to be genuinely hard (taken from > the newspaper :) > > Use this function instead of the old one to get a better result: That's good news! I tested your new stylesheet on the following "fiendish" board, and it performs almost 5 times better than the previous one: <board> <row>0,0,0,0,0,5,0,0,0</row> <row>0,0,0,0,2,0,9,0,0</row> <row>0,8,4,9,0,0,7,0,0</row> <row>2,0,0,0,9,0,4,0,0</row> <row>0,3,0,6,0,2,0,8,0</row> <row>0,0,7,0,3,0,0,0,6</row> <row>0,0,2,0,0,9,8,1,0</row> <row>0,0,6,0,4,0,0,0,0</row> <row>0,0,0,5,0,0,0,0,0</row> </board> The results: AW1 AW2 ============================= 113016 14.8MB 24407 35MB My results on this board are: 6688 10MB The fiendish board can be found here: http://www.fiendishsudoku.com/sudoku.html It's great you've started a blog! Can you publish there some of the most interesting and hardest board configuarations you're dealing with? Cheers, Dimitre. > > <xsl:function name="fn:solveSudoku" as="xs:integer+"> > <xsl:param name="startBoard" as="xs:integer+"/> > > <!-- First process the center cells, then the top, then the rest of the board. > This should give better performance than starting top-left and > working from there. --> > <xsl:variable name="theRest" select="for $x in 1 to 81 return > $x[not($x = $center)][not($x = $topGroup)]" as="xs:integer+"/> > > <xsl:variable name="emptyCells" select="for $x in ($center, > $topGroup, $theRest) return if ($startBoard[$x] = 0) then $x else ()" > as="xs:integer*"/> > > <xsl:variable name="endBoard" select="fn:populateValues($startBoard, > $emptyCells)" as="xs:integer*"/> > > <xsl:choose> > <xsl:when test="empty($endBoard)"> > <xsl:message>! Invalid board - The starting board is not > correct</xsl:message> > <xsl:sequence select="$startBoard"/> > </xsl:when> > <xsl:otherwise> > <xsl:sequence select="$endBoard"/> > </xsl:otherwise> > </xsl:choose> > </xsl:function> > > > The entire stylesheet can be found at the blog I've started (yesterday): > > http://www.ajwelch.blogspot.com/ > > cheers > andrew > > -- Cheers, Dimitre Novatchev --------------------------------------- A writer is a person for whom writing is more difficult than it is for other people.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] A new Sudoku xslt impleme, andrew welch | Thread | Re: [xsl] A new Sudoku xslt impleme, andrew welch |
Re: [xsl] A new Sudoku xslt impleme, andrew welch | Date | Re: [xsl] A new Sudoku xslt impleme, andrew welch |
Month |