15 February 2006

Re-use of existing Java code (Sudoku engine)

Re-use of existing Java code (Sudoku engine)

This isn't so much about systems interop, as it is about code re-use and language interop.

You've seen Sudoku, the "number place" puzzle. Wikipedia says that it was created by a US puzzle magazine, but popularized (and given its recognized name) by the Japanese.

Last year during the summer holiday my wife gave me a book of Sudoku puzzles to do on the beach with my kids. The first one we tried was a real challenge, but gradually we caught on to the technique. Now we do the puzzles that come in the daily paper, regularly. They started to get a little too easy for us, so our thought was, maybe we could generate puzzles ourselves?

I thought - this is a nice little programming project. The next thought was: to generate a valid Sudoku, you have to solve it, to verify there is only one solution. The simple brute force solver method I imagined would be easy to code, but wouldn't be very fast. And I hadn't thought about sudoku generation algorithms. This was getting messy. Maybe somebody has already done this for me?

In short order I found lots of Sudoku sites and an abundance of algorithms and code implementations for generators and solvers. I tried a couple and found one that looked good and fast - implemented in Java by Rolf Sandberg, based on a C implementation by Günter Stertenbrink, which was based on the Dancing Links algorithm described by Donald Knuth.

As a port from C, the Java code is not the most object-oriented or elegant, but I didn't care about that. I wanted a toy to generate Sudoku puzzles. It worked great, but there was one big drawback. The generated puzzles looked like this:

 . . 8 1 . . . . .
 . 9 1 . . . . . 7
 . . . . 5 . 3 . 2
 6 . . 3 . 2 8 . 4
 3 . 9 . . . 5 . .
 . . . . . 6 . . .
 . 1 . . . . . 2 8
 . . 6 . . . . . .
 . 5 . . 7 . . . .

It was a command line tool, and it generated string output. What I really wanted was a puzzle I could print out, easily, and hand to my sons and say "have at it!"

I had previously fiddled with itextsharp, a library for creating PDFs from within .NET. (This is a port of iText, which is a Java library with the same purpose). PDF generation would seem to be a good fit.

Here Comes the Part About Interop

The cool thing was, I didn't have to do anything to the Java code to get it to work with my C# WinForms code. I just compiled it with VJ#, and BAM! it's ready to go. So no changes were required, but I did actually make a few changes in Sandberg's Java code. I added a DTO class for the puzzle. I added a few helper methods like solve() and generate() and rate(). But I left most everything intact. (re-factoring was tempting but I didn't want to spend the time understanding the code)

So.... I built a Winform app in C#, to wrap around that generator engine. I added in the PDF generation, and added a print button. Boom, a Sudoku generation toy. Its pedigree includes Java source code, C# code, and an activeX control from 2000. All seamlessly connected.

Grab the finished binary (with a Windows Installer) if you want to use the toy. It will run on Windows XP, requires .NET 1.1 and Adobe Acrobat Reader. Grab the VS 2003 Solution if you want to examine or tweak the code.

This is just one small illustration, but it shows: if you have source code repositories in your shop, or even if you have existing Java apps, and you want to update or extend them, you may be able to re-use that code very simply in .NET.

-Dino

Filed under: , ,
 

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

# Prakash said:
Would it have helped to export/display result as a CSV or Tab delimited file? It would have opened in excel for easy online play.
15 February 06 at 10:36 AM
# Prakash said:
Have you come across any code that solves a Sudoku puzzle?
15 February 06 at 10:37 AM
# DotNetInterop said:
Prakash - interesting idea to export to CSV for Excel.  Once open in Excel you'd ideally want it to look a little like a printed Sudoku, with a grid limited to 9x9.  I don't know if I can do that in CSV, but I am sure I can do it in Excel-ML.  Will look into it.

about tools that solve sudokus - this toy solves them, but the problem is, you cannot enter the sudoku.  The toy, in its current guise, only solves sudoku that the toy itself has generated.  Adding that feature is left as an exercise for the reader!

But there are plenty of tools out there that solve sudoku.  This one is based on the DancingLinksEngine which itself is based on C-code implementations known as suexg and suexk, the former is a generator and the latter a solver.

But I don't believe those are GUI tools.
15 February 06 at 1:12 PM
# Craig said:
I'm using VS2005 and grabbed the source code, but the project cannot resolve references to AxPdfLib
and PdfLib ... where can I get these ActiveX components?

Very cool tool (if I can get it working).
15 February 06 at 5:00 PM
# DotNetInterop said:
To resolve the reference to the Acrobat PDF component, you need to add it to your VS toolbox.  This is how it worked in VS2003:
Within VS, ensure that the Win forms designer is showing.  Hover over the toolbox.  Be sure the "Windows Forms" tab is open on the
Left hand side.  Right click, then select "Add Items..."  you get the "Customize Toolbox" dialog.

Select the COM tab.
check the box for Adobe Acrobat control for ActiveX
OK

You have now added the Adobe Acrobat ActiveX control to the VS toolbox. It should appear at the bottom of the list.  From that toolbox, You can now drag an instance of that control onto a Windows Form, as with any other Windows Forms control.

Since this project already has the activeX control there, you may have to add a reference to the library.  In the solution explorer, explode the references node.  If you don't see AxPdfLib, you need to add it.  you should be able to implicitly add it by dragging-and-dropping the PDF control from the toolbox to the form.  

good luck!
21 February 06 at 8:52 PM
# Grille de Sudoku said:
I love Sudoku !
07 March 06 at 11:27 AM
# scott said:
How do you determine the difficulty rating of the puzzles?
08 March 06 at 5:52 PM
# DotNetInterop said:
it's part of the generation and solving algorithm.  I don't understand Knuth's DLX algorithm enough to explain it.  but of course you can look at the code!
08 March 06 at 10:15 PM
# zachary wolff said:
Any one know seen the java engines that allow you to play online?  I havnet had time to look at it yet but I dont think it would be that hard.  
16 March 06 at 2:06 PM
# Tuan Duong said:
Dino,

I would love to get this Sudoku Toy to work on my computer. Unfortunately, it requires Acrobat reader 6 which I have uninstalled from my computer. Now Acrobat reader 6 refused to install (newer functional version exist) and I'm having trouble removing Acrobat reader 7 completely.
Install Acrobat reader 7 will not overwrite a botched installation of Acrobat reader 7 which cannot be uninstalled. I tried to delete every file and folder related to Acrobat, search and delete all the acrobat entries in the registry. Adobe would not give me e-mail support on this predicament.

I hope somebody can tell me where the Acrobat reader 6 setup program find out that Acrobat reader 7 existed.

Acrobatically challenged,
Tuan
tuanmd@scn.org
24 March 06 at 10:05 PM
# Pat Patterson said:
Can I use binary JARs 'as is' or do they need to be recompiled in VJ#?
03 April 06 at 5:58 PM
# DotNetInterop said:
Pat, no, you cannot directly reference Java archives (JARs) from J#.  You can: (a) convert them with jbimp.exe (see http://msdn2.microsoft.com/en-us/library/y9teabc2(VS.80).aspx); (b) re-compile the Java classes with vjc.exe; or (c) bridge via something like jnbridge (see www.jnbridge.com).  

-Dino
03 April 06 at 6:58 PM
# DotNetInterop said:
Sorry, I do not know how to do this. Seems like you are on the right path (filesystem and registry sweep).  if you are savvy, try regmon.exe, a free download from www.sysinternals.com.   Run regmon, then install Acrobat 7 on a new machine, then regmon will tell you what registry entries have been created.  There is also a companion filemon.exe from the same source.  you can then remove these entries from *your* machine.  That ought to work, but no guarantees.  I would advise trying this only if you are pretty savvy.  And of course you need a new (clean) machine to install Acrobat7 on.  
-Dino
03 April 06 at 7:02 PM
# Pat Patterson said:
Thanks, Dino. (a) and (b) look like they might work for me.
04 April 06 at 12:58 AM
# Veeravijayarangarajaraghava Reddiar said:

http://alumni.cs.ucsb.edu/~vijay/Sudoku.html is a neat solution for Sudoku solving code.

It is command line though and well broken.

17 December 08 at 2:55 PM

Leave a Comment

Comment Policy: No HTML allowed. URIs and line breaks are converted automatically. Your e–mail address will not show up on any public page.

(required) 
(optional)
(required) 

  
Enter Code Here: Required
Page view tracker