Welcome to my collection of hobby software projects. This page catalogues various programming experiments and tools I’ve developed in my spare time. The Sudoku solver and Noughts and Crosses now have their own write-ups, with more detailed explanations of the code and methodology, linked below. The source code isn’t published. You can explore each project by following the links below, which will take you to interactive demonstrations.

Hosting Infrastructure

Each project is containerised and hosted using Docker images running on a dedicated server. While I make these available for demonstration purposes, please note:

  • These projects are hosted on modest hardware with no uptime guarantees
  • Functionality may occasionally change, typically to fix issues or improve the user experience
  • The original code is generally preserved when creating new versions, allowing for comparison between iterations

Update (5 February 2024): Due to increasing popularity, all tools have been migrated to a dedicated server running a reverse proxy system. This infrastructure upgrade means all projects now use secure connections (HTTPS) and are served from my domain rather than direct IP addresses.

Project Catalogue

Magic Eight Ball

Magic Eight Ball

I built this one just for fun: a light-hearted toy, and the simplest of the projects.

  • A simple fortune-telling toy: type a question, press Ask and the ball answers
  • It has the 20 classic answers: 10 positive, 5 neutral and 5 negative
  • It never repeats either of the last two answers. That memory is shared by every visitor, so it is the last two answers given to anyone, not just to you
  • Your question is shown back on the answer page but plays no part in choosing the answer

Sudoku Solver Evolution

My Sudoku solver has gone through several iterations, each improving upon the previous version. The full story, with measurements on six puzzles, is in Sudoku Solver in Python and Flask: from brute-force backtracking to fewest-candidates-first. Below is the short version of each.

Sudoku Solver v1

Write-up: Sudoku Solver v1

  • Initial proof-of-concept built with Flask and Python
  • Extremely basic user interface with minimal styling
  • Plain backtracking: the first empty cell, then each digit in turn
  • Copes with an impossible puzzle, but two of my hardest test puzzles didn’t finish within 60 seconds

Sudoku Solver v1.1

Write-up: Sudoku Solver v1.1

  • Maintains the same core solving algorithm as v1
  • Features an improved web interface that better visualises the puzzle
  • Makes exactly the same number of solve calls as v1 on every test puzzle, so it shares the same limitations

Sudoku Solver v2

Write-up: Sudoku Solver v2

  • Same solver as v1 with two additions: a check that rejects a puzzle with repeated givens, and a set of candidates for each cell so it only tries digits that can still fit
  • Explores exactly the same search tree as v1, so it makes the same number of solve calls (335,638 on my Hard test puzzle). Each call is cheaper, but the search is no shorter

Sudoku Solver v2 (January 2024 Update)

Write-up: Sudoku Solver v2 (January 2024 update)

  • A new solving method:
    • Picks the empty cell with the fewest possible candidates
    • After each placement, checks that no other cell has been left with no candidates
    • Is still a backtracking search when no move is forced
  • Finds out much sooner that a puzzle has no solution: 4 solve calls against 349 on my test puzzle
  • On the Hard test puzzle, v2 made 91.5 times as many solve calls (335,638 against 3,670)
  • On the two hardest test puzzles, v1, v1.1 and v2 didn’t finish within 60 seconds and this version solved them

Noughts and Crosses v1

Noughts and Crosses v1

Write-up: Noughts and Crosses v1

  • Slightly fuller implementation of Noughts and Crosses than the other projects
  • More like a mini-site with better formatting and the starts of a user system
  • The computer plays minimax, so in a fair game you can’t beat it
  • Pretend you are in the 80’s and do a little bit of Wargaming!

Technical Implementation Details

The write-ups go into detail; the short version is that these projects share some common technical characteristics:

  • Backend development primarily in Python
  • Web interfaces built with Flask
  • Containerisation using Docker for consistent deployment
  • Reverse proxy setup for secure HTTPS access
  • Modular design allowing for iterative improvements

Future Developments

The documentation, performance comparison and design rationale are now written for the Sudoku solver and Noughts and Crosses. What’s still to come:

  • Additional projects currently in development

Check back periodically for updates, as I’ll be adding new projects and enhancing documentation for existing ones.