R-Packages rund um das japanische Logikrätsel

Einen Algorithmus in R zu programmieren, der ein Sudoku löst, ist machbar, aber aufwendig. Doch im Package-Repository finden sich zwei Packages, die einem diese Arbeit abnehmen.
Im Cran Package Repository für R finden sich immer wieder kleine Perlen, die sich um ein bestimmtes Aufgabengebiet kümmern. Die beiden Packages sudoku und sudokuAlt sind solche Perlen. Damit lassen sich Sudokus einlesen, mit beliebiger Schwierigkeit neu erzeugen, ausdrucken und – wenn man mal nicht weiterkommt – lässt sich die Löung berechnen.

Sudoku erstellen

Zunächst werden die beiden Packages sudoku und sudokuAlt eingebunden. Die Funktion fetchSudokuUK() holt das tagesaktuelle Sudoku von der Webseite www.sudoku.org.uk. Die Ausgabe in der Konsole erfolgt mit printSudoku(). Zusammen also:

library(sudoku)
library(sudokuAlt)
su <- fetchSudokuUK() # www.sudoku.org.uk/
printSudoku(su)

Das Erfebnis sieht dann so aus:

  +-------+-------+-------+
  | 6     |   8   |     2 |
  |       |     4 |       |
  |   2 5 |   6 1 | 9     |
  +-------+-------+-------+
  |       |     8 |     9 |
  |   5   |       |       |
  | 9     | 4     |     7 |
  +-------+-------+-------+
  |     4 | 5 1   |   8   |
  |       | 3     |       |
  | 2     |       |   1 3 |
  +-------+-------+-------+

Komfortabler und schöner ist es aber mit den Funktionen aus dem Package sudokuAlt. Die Zeile au <- fetchAUGame() %>% plot holt das schwierige Sudoku des Tages von der Webseite www.sudoku.com.au und erstellt einen Plot wie im Titelbild zu sehen. Dieser lässt sich als Bild oder PDF-Datei abspeichern und ausdrucken. Die Funktion fetchUKGame() holt ein Rätsel von einer britischen Seite. Eine weitere Möglichkeit besteht darin, zunächst einen Seed zu setzen mit set.seed(54321) und dann mit sg <- makeGame() %>% solve %>% plot ein Rätsel zu erzeugen, wobei hier gleich die Lösung mit ausgegeben wird. Ohne Lösung geht es mit plot(originalGame(makeGame() %>% solve). Derselbe Seed erzeugt stets dasselbe Sudoku. Die Funktion makeGame() kennt einige Parameter. So erzeugt die Zeile plot(makeGame(n = 4, gaps = 111)) ein Rätsel in der Größe 16x16 mit 111 freien Feldern von insgesamt 256. Ab n>3 kommen dann statt Zahlen Buchstaben zum Einsatz, im Beispiel die Buchstaben von A bis P.

Sudoku einlesen

Um ein Rätsel einzulesen, muss es als TXT-Datei vorliegen in der nachlogenden Form und dann einlesen mit dem Befehl z <- readSudoku("sudoku_read.TXT").

-6-1-4-5-
--83-56--
2-------1
8--4-7--6
--6---3--
7--9-1--4
5-------2
--72-69--
-4-5-8-7-
Sudoku lösen

Mit R lässt sich auch die Lösung eines Sukokus berechnen. Um das oben in der Variablen su gespeicherte Sudoku zu lösen, genügt der Befehl solveSudoku(su, verbose=TRUE). Die Ausgabe der Lösung erfolgt in Form einer Matrix.

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]    6    3    7    9    8    5    1    4    2
 [2,]    1    8    9    2    3    4    6    7    5
 [3,]    4    2    5    7    6    1    9    3    8
 [4,]    7    4    2    1    5    8    3    6    9
 [5,]    8    5    3    6    9    7    4    2    1
 [6,]    9    6    1    4    2    3    8    5    7
 [7,]    3    9    4    5    1    2    7    8    6
 [8,]    5    1    8    3    7    6    2    9    4
 [9,]    2    7    6    8    4    9    5    1    3

Das obige in der Variablen au gespeicherte Beispiel lässt sich mittels der Befehlszeile au <- fetchAUGame() %>%solve %>%plot lösen und plotten oder mit solve(au) die Lösung in der Konsole ausgeben. Das eingelesene Beispiel in der Variablen z lässt sich alternativ auch mit solve(as.sudoku(z)) lösen.