Moin,
hat mich aus reiner Neugierde interessiert, ob sich mit einer LAMBDA-Funktion ein Sudoku generieren lässt. Funktioniert.
Die Formel generiert allerdings Sudokus, die mehrere Lösungen haben können, was aber nicht weiter schlimm sein sollte.
In der Formel ist dann einiges drin, was so Lambas bieten: Rekursion, verschachtelte Lambdas, Iterationen :-)
Das Argument Size entspricht der Größe des Spielfeldes (zwischen 3 und 9) und das Argument Solution gibt an, ob neben
dem generierten Sudoku mit den leeren Feldern das vollständige Sudoku (also Lösung) angezeigt werden soll. Da nun mal
Formel, wird logischerweise bei jeder Änderung einer Zelle das Sudoku neu berechnet.
Wie funktioniert's? Es wird ein Basis-Sudoko bzw. eine Basis-Matrix als Zahlenfolge generiert, wo dann die Zahlen per MOD
und REST-Berechnungen verschoben werden. Danach werden dann die Zahlen per Zufall mehrfach vertauscht. Eigentlich
recht simpel. Am Ende werden dann die leeren Felder ebenfalls per Zufall bestimmt. Werde demnächst mal einen Artikel
dazu publizieren.
Ich versuche mich demnächst mal an einem Algorithmus zur Lösung eines beliebigen Sudokus. Kann aber gut sein, dass das
nicht oder nur unter Randbedingungen umsetzbar ist, da die Anzahl der Iterationen in LAMBDAs limitiert ist. Mal gucken.
Gruß
hat mich aus reiner Neugierde interessiert, ob sich mit einer LAMBDA-Funktion ein Sudoku generieren lässt. Funktioniert.
Die Formel generiert allerdings Sudokus, die mehrere Lösungen haben können, was aber nicht weiter schlimm sein sollte.
In der Formel ist dann einiges drin, was so Lambas bieten: Rekursion, verschachtelte Lambdas, Iterationen :-)
PHP-Code:
=LAMBDA(Size;Solution;LET(
fnList;LAMBDA(This;Size;LET(A;EINDEUTIG(ZUFALLSMATRIX(Size^4;1;1;Size^2;WAHR));WENN(WENNFEHLER(ZEILEN(A);0)<Size^2;This(This;Size);A)));
fnInitialize;LAMBDA(Size;LET(A;SEQUENZ(Size^2);M;SEQUENZ(Size^2;Size^2);R;AUFRUNDEN(M/Size^2;0);C;WENN(REST(M;Size^2)>0;REST(M;Size^2);Size^2);
REST(ABRUNDEN((R-1)/Size;0)+Size*REST(R-1;Size)+C-1;Size^2)+1));
fnRandomize;LAMBDA(Size;Matrix;LET(A;fnList(fnList;Size);INDEX(A;Matrix;1)));
fnRandomizeIterator;LAMBDA(This;Size;Matrix;Iterations;WENN(ZEILEN(Iterations)>1;This(This;Size;Matrix;INDEX(Iterations;SEQUENZ(ZEILEN(Iterations)-1)));Matrix));
fnArgument;LAMBDA(Value;Lower;Upper;Default;LET(X;WENN(ISTLEER(Value);Default;Value);Y;WENN(ZEILEN(X)*SPALTEN(X)>1;WENNFEHLER(--INDEX(X;1;1);Default);
WENNFEHLER(--X;Default));WENN((Y>Lower-1)*(Y<Upper+1);Y;Default)));
fnExpand;LAMBDA(Left;Right;LET(N;SPALTEN(Left)+SPALTEN(Right);A;SEQUENZ(ZEILEN(Left);N);R;AUFRUNDEN(A/N;0);C;WENN(REST(A;N)>0;REST(A;N);N);
WENN(C>SPALTEN(Left);INDEX(Right;R;C-SPALTEN(Left));Left)));
vnSolution;fnArgument(Solution;0;1;0);
vnSize;fnArgument(Size;3;9;3);
vnRemovals;LET(M;ZUFALLSMATRIX(vnSize^2;vnSize^2;0;1;WAHR);WENN(vnSolution>0;fnExpand(M;SEQUENZ(vnSize^2;vnSize^2;1;0));M));
vnValues;LET(M;fnRandomizeIterator(fnRandomizeIterator;vnSize;fnRandomize(vnSize;fnInitialize(vnSize));SEQUENZ(vnSize+1));WENN(vnSolution>0;fnExpand(M;M);M));
LET(M;vnValues*vnRemovals;WENN(M>0;M;""))))(3;1)
Das Argument Size entspricht der Größe des Spielfeldes (zwischen 3 und 9) und das Argument Solution gibt an, ob neben
dem generierten Sudoku mit den leeren Feldern das vollständige Sudoku (also Lösung) angezeigt werden soll. Da nun mal
Formel, wird logischerweise bei jeder Änderung einer Zelle das Sudoku neu berechnet.
Wie funktioniert's? Es wird ein Basis-Sudoko bzw. eine Basis-Matrix als Zahlenfolge generiert, wo dann die Zahlen per MOD
und REST-Berechnungen verschoben werden. Danach werden dann die Zahlen per Zufall mehrfach vertauscht. Eigentlich
recht simpel. Am Ende werden dann die leeren Felder ebenfalls per Zufall bestimmt. Werde demnächst mal einen Artikel
dazu publizieren.
Ich versuche mich demnächst mal an einem Algorithmus zur Lösung eines beliebigen Sudokus. Kann aber gut sein, dass das
nicht oder nur unter Randbedingungen umsetzbar ist, da die Anzahl der Iterationen in LAMBDAs limitiert ist. Mal gucken.
Gruß
Microsoft Excel Expert · Microsoft Most Valuable Professional (MVP) :: 2011-2019 & 2020-2022 :: 10 Awards
https://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner
https://de.excel-translator.de/translator :: Online Excel-Formel-Übersetzer :: Funktionen :: Fehlerwerte :: Argumente :: Tabellenbezeichner