[LAMBDA] SUDOKU Generator
#11
Hallo,

ginge natürlich es auch so zu modifizieren, dass Margin weg kommt und vnMargin auf 1 gesetzt wird.
Oder, Argumente können auch leer gelassen werden, z.B. (3;;), aber das ; muss dann ja trotzdem rein.

Das mit dem Sortieren würde ich jetzt als nicht so einfach empfinden, müsste ich mal gucken;
weil ja z.B. auch wieder eine Matrix iterativ dupliziert werden müsste.

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
Antworten Top
#12
Schau nochmal den zweiten Codeblock in meinem #10 an. Der reicht vollkommen zum "Lösen" der durch die Ausgangsvariante erzeugten Sudokus aus.

(Ich hatte anscheinend noch 35 Minuten weitergeschrieben, während Du schon #11 gepostet hast)
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#13
Hallo,

ich hab's gerade nicht zu Hand, aber das Phänomen (2er Codeblock) wird wohl dadurch verursacht, wie die Ursprungsmatrix (fnInitialize) zustande kommt.
Diese ist eben eine Verschiebung von Zahlen und das Muster von Dir ist sehr ähnlich. Ich stimme absolut zu: Mischen und/oder ggf. zustz. eine andere
Basismatrix erzeugen sollte gemacht werden. Ich werde das mal ausprobieren.

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
Antworten Top
#14

.xlsx   210712 Sudoku maninweb.xlsx (Größe: 22,29 KB / Downloads: 3)

In der Datei permutiere ich nun - ZUFÄLLIG! - vom Ergebnisteil

a) die 3 3er-Zeilen mit allen 9 Einträgen (!)
b) die 3 3er-Spalten mit allen 9 Einträgen (!)
c) die 3 3er-Zeilen mit allen 9 Einträgen (!) erneut
d) die 3 3er-Spalten mit allen 9 Einträgen (!) erneut

In AL12 oder BF12 muss die Summe möglichst minimal werden. Der kleinste Wert war 108. Dann ist das Sudoku anscheinend wirklich gut gemischt.

__________
Nee, "2er-Codeblock" ist schon überholt. Es sind zeilenweise 9er-Codeblocks. Es gibt also nur eine einzige Reihenfolge der Zahlen überhaupt, im Kreis beobachtet!

Spalten hingegen sind halb-permutiert.
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#15
Hier (Foto) ist ein 9x9-SUDOKU, bei dem nur 4 Felder leer sind (77 sind besetzt), und es hat trotzdem nicht nur 1 Lösung.

Nebenbei ist die Konstruktion dort übrigens NICHT so, dass sich 3 Felder entweder in einem 3er-Zeilen- oder -Spaltenblock immer aus den gleichen Werten zusammensetzen (also: 9 Mal), wie wir beide es momentan aber leider nicht anders können.

Hier noch etwas: https://www.kompf.de/sudoku/algo.html
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#16
Moin,

ich denke mal, ich werde mal wie folgt vorgehen und ein paar neue LAMBDAs der Formel hinzufügen: ein LAMBDA zur Extraktion der Teilmatrizen für
das Summenprodukt, ein LAMBDA für die Permutationen und ein rekursives LAMBDA welches als Abbruchkriterium < 144 = Summe(Summenprodukt)
hat. Ob das so klappen wird und/oder Excel nicht aussteigt, keine Ahnung.

Das wäre ja jetzt mal aus Neugierde, denn ich schätze mal, einfacher wäre es vielleicht ein bestehendes Sudoku zu nehmen, Zahlen zu vertauschen
und Lücken zu generieren. Obwohl, ob dann wiederum Kombinationen entstehen, die eben dieselbe Problematik haben wie oben, könnte sein.

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
Antworten Top
#17
Moin,

die Formel mit dem SUMMENPRODUKT zur Ermittlung der Anzahl der Pärchen finde ich derzeit schwierig hinzubekommen.
Eben halt weil ich eigentlich eine weitere Dimension benötigen würde. Aber vielleicht bin ich gerade auf dem Holzweg.

Das LAMBDA für das spätere Permutieren der Zeilen/Spalten steht dann aber schon mal. Dabei wird dann fnRandomList
das fnList aus der Sudoku-Formel später ersetzen, denn fnRandomList ist flexibler. Die Formel hier erstellt dann eine Liste
der Positionen (z.B. 1 bis 9) per Zufall.

PHP-Code:
=LAMBDA(Size;LET(
 
fnRandomList;LAMBDA(This;Min;Max;LET(M;EINDEUTIG(ZUFALLSMATRIX((Max-Min+1)^2;1;Min;Max;WAHR));WENN(WENNFEHLER(ZEILEN(M);0)<Max-Min+1;This(This;Min;Max);M)));
 
vnResult;LAMBDA(This;Matrix;Size;Iterations;WENN(Iterations>0;This(This;LET(S;SEQUENZ(Size^2);n;Size*Iterations;A;
 
fnRandomList(fnRandomList;n-Size+1;n);Matrix+WENN((S>n-Size)*(S<n+1);INDEX(A;S-n+Size;1);0));Size;Iterations-1);Matrix));
 
Result;vnResult(vnResult;SEQUENZ(Size^2;1;0;0);Size;Size);Result))(3

Bei Size = 3 kommt hier dann beispielsweise per Zufall raus: 2-3-1-5-4-6-8-7-9. Also blockweise (3er-Blöcke) vertauschte Positionen.

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
Antworten Top
#18
1) SUMMENPRODUKT: Vielleicht irgendwie auch anders lösbar, z.B. über Teilstringersetzungen. Je kürzer die resultierende Textkette, desto schlechter das SUDOKU.

2) Das Permutieren allein lässt je nach Stufe entweder zeilen- oder spaltenweise eine leichtere Lösung zu als klassisches SUDOKU-Ermitteln. Also muss ein solches eingeschränkt designtes SUDOKU auch nicht so viele Informationen für eine eindeutige Lösung aufweisen, wie ein auf prozedurale Weise hergestelltes SUDOKU (bspw. über JAVA oder VBA, also mit Schleifen und Bedingungen zusätzlich zur Rekursion). Das Permutieren tauscht also tatsächlich nur die 3er-Folgen von nur 1  in 6 mögliche.
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top
#19
Moin,

habe nun eine Lösung, um die Matrix für das SUMMENPRODUKT per LAMBDA zu generieren. Das sieht dann so aus:

PHP-Code:
=LAMBDA(Matrix;LET(
 
fnPairs;LAMBDA(Matrix;LET(S;SEQUENZ(ZEILEN(Matrix);SPALTEN(Matrix)-1);R;AUFRUNDEN(S/(SPALTEN(Matrix)-1);0);C;
 
WENN(REST(S;SPALTEN(Matrix)-1)<1;SPALTEN(Matrix)-1;REST(S;SPALTEN(Matrix)-1));M;INDEX(Matrix;R;C)&INDEX(Matrix;R;C+1);--M));
 
fnPairsCount;LAMBDA(This;Pairs;Matrix;Iteration;WENN(Iteration>0;This(This;Pairs;Matrix*LET(M;SEQUENZ(ZEILEN(Matrix);SPALTEN(Matrix));R;
 
AUFRUNDEN(M/(SPALTEN(M));0);C;WENN(REST(M;SPALTEN(M))<1;SPALTEN(M);REST(M;SPALTEN(M)));T;"."&TEXTVERKETTEN(".";1;Pairs)&".";
 
V;"."&INDEX(Pairs;R;C)&".";WENN(M=Iteration;(LÄNGE(T)-LÄNGE(WECHSELN(T;V;"")))/LÄNGE(V);1));Iteration-1);Matrix));
 
fnPairsCount(fnPairsCount;fnPairs(Matrix);SEQUENZ(ZEILEN(Matrix);SPALTEN(Matrix)-1;1;0);ZEILEN(Matrix)*SPALTEN(Matrix))))(K2:S10

Eine andere Möglichkeit, als aus der Matrix zu den Pärchen eine Textkette zu machen, den aktuellen Wert dann zu ersetzen
und über die Längeberechnung die Anzahl zu bestimmen, habe ich nicht gefunden. Das hatte ich bei meinen LAMBDAs für
große Zahlen auch schon mal so gemacht und keine andere Lösung gefunden. Dachte jetzt, es würde doch irgendwie gehen.
Von meiner Logik her hätte ja nämlich auch das funktionieren müssen ...

PHP-Code:
WENN(M=Iteration;SUMMENPRODUKT(--(Pairs=INDEX(Pairs;R;C)));1

Normalerweise würde ich ja die Variable Pairs zu den Pärchen als statisch sehen. LAMBDA scheint aber trotzdem durch alle
durch zu iterieren, was dann als Ergebnis überall 72 liefert. Finde ich unerwartet.

Nächste Schritte wären dann mal eine rekursive Funktion zum Permutieren mit der Abbruchbedingung SP < 144

Ich denke, solange das Sudoku nicht allzu einfach zu erraten ist, wäre das dann ja ausreichend, Insofern mal schauen,
wie sich das Permutieren umsetzen lässt. Und über LAMBDA & Excel lernt man auch was dabei. Zum Beispiel ist es bei
mir jedenfalls so, wenn ich zwei Dateien in Excel offen habe, die beide die Sudoku-Formel haben, Excel dann schon
langsamer wird. Nicht bei einer Datei, sondern zwei.

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
Antworten Top
#20
Vielleicht kannst Du noch mal angeben, wie der Code (bei diesem Zwischenstand, der sicher noch besser wird) insgesamt einzugeben ist, da Du zuletzt jetzt Teilaspekt-Codes gepostet haben dürftest.

Text ist ja so unvergleichlich viel sparsamer, als jede Datei oder gar jedes Bild Smile
WIN/MSO schicken angeblich alle 5 Sekunden Deinen Screen heim zu Papa (recall-Klausel). 
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste