Autor Beitrag
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 27.12.08 21:35 
Unter anderem Permutationen, und noch einiges andere. Ich habe einiges ausprobiert.
XUDO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Win-98SE, Win-XP/1
Delphi-7P, Turbo-Pascal-6
BeitragVerfasst: So 28.12.08 10:36 
[quote="user profile iconHidden"(540965)]
user profile iconHidden hat folgendes geschrieben Zum zitierten Posting springen:

Im Prinzip meinen wir beide das Gleiche; reiben tun wir uns nur an eindeutig lösbar :beer: .


Hallo Hidden,
so ist es; das Wikipedia-Sudoku von Thorsten83 ist hierbei ein gutes Beispiel: Nur 17 Ziffern vorgegeben erweckt den Eindruck, es könnte mehrdeutig sein, also keine eindeutige Lösung haben.
Geht man numerisch aufsteigend bei der Suche vor, so ergeben sich die Einsen in J5,, G9, A7, A3, F4 und E2 zwingend logisch eindeutig.
(Spalten A bis J ohne I, Zeilen 1 bis 9.)
Weiter durch die Ziffern nach oben ist dann erst die 5 in F7 eindeutig.
Alle weiteren ergeben sich dann nach und nach und führen zu einer logischen eindeutigen Lösung - es gibt keine andere; wird eine nicht eindeutige Ziffer falsch eingetragen, führt das ins Chaos.
XUDO
Einloggen, um Attachments anzusehen!
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: So 28.12.08 12:56 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Unter anderem Permutationen, und noch einiges andere. Ich habe einiges ausprobiert.

Und die Dinger waren entweder zu leicht oder zu schwer?


wikipedia hat folgendes geschrieben:

Alle lösbaren n-feldrigen Sudokus mit mehr als n - 4 vorbelegten Feldern (z. B. 81 - 4 = 77 Felder bei der Standardvariante) sind eindeutig lösbar. Es lassen sich Sudokus konstruieren, bei denen anfänglich n - 4 Felder vorbelegt sind, die aber trotzdem nicht eindeutig lösbar sind. Wenn nämlich vier freie Felder ein Rechteck bilden, so dass jeweils zwei Ecken in zwei verschiedenen Blöcken liegen und in beide Blöcke etwa die Zahlen 1 und 2 oder ein beliebiges anderes Zahlenpaar eingetragen werden kann, gibt es zwei Möglichkeiten, diese Zahlen einzutragen, da beide Zahlen vertauscht werden können.
XUDO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Win-98SE, Win-XP/1
Delphi-7P, Turbo-Pascal-6
BeitragVerfasst: So 28.12.08 13:19 
user profile iconThorsten83 hat folgendes geschrieben Zum zitierten Posting springen:
Hey,
ich habe mich vor längerer Zeit auch mal an solch eine Lösungsstrategie gesetzt, auch mit dem Ergebnis, dass schwere Sudokus damit nicht lösbar waren...Z.B. das hier: de.wikipedia.org/w/i...stamp=20070318111345

Hallo Thorsten83,
Die ersten Lösungsschritte (alle 1 + eine 5) stehen bereits in meinem Beitrag; weiter geht es mit 8 in A8, 8 in F6, 8 in H4, 8 in J7, 9 in F8, 9 in H5, 9 in J9, 9 in C7 und dann je nach Geschmack 5 in H9 oder 6 in C8 und 4 in C9, oder auch erst 7 in E7; warum da die 7?
Weil E8 und E9 durch 2 und 3 belegt sind, auch wenn sie dort noch nicht
stehen, bzw nur klein in den Ecken als Vormerkung von zwei(!) möglichen Positonen.
Trägt man nun ebenso die 7 und die 2 als Vormerkung in Minischrift in die Ecken von A9 und B9 ein, kann man sofort 2 in E8 und 3 in E9 eintragen. Und weiter schaffst Du es bestimmt selbst.
Jedenfalls ist das Ding nicht nur mit meinem Programm sondern auch per Hand lösbar.
XUDO
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: So 28.12.08 14:15 
Hey,

hab mir jetzt nicht en detail angeguckt was dein Programm macht, aber die prinzipielle Vorgehensweise ist mir schon klar...

Das alte Programm, das schwerere Sudokus nicht lösen konnte hab ich halt vor Jahren geschrieben, damals wusste ich gerade mal was eine Schleife ist und hab wohl schlicht und ergreifend nicht genügend Techniken implementiert...
Werd mal suchen ob ich den Mist noch irgendwo finde :)
XUDO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Win-98SE, Win-XP/1
Delphi-7P, Turbo-Pascal-6
BeitragVerfasst: So 28.12.08 14:20 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Es geht ja nicht nur um die Anzahl sondern auch darum welche Zahlen man z.B. wegnimmt um ein Sudoku schwerer zu machen.

Genau das ist das Problem, das ich beim Generieren von Sudokus hatte, und für das ich auch keine gute Lösung gefunden habe. Bei den von meinem Programm generierten schweren Sudokus kann ich nicht dafür garantieren, dass es nur eine Lösung gibt. Diese sind allerdings mit einfacher Logik teilweise nicht zu lösen.

Jedenfalls habe ich versucht mathematisch an das Generieren heranzugehen, aber die Lösungen waren alle nicht so wie ich sie mir vorgestellt hätte. :nixweiss:

Hallo jaenicke,
vielleicht gefällt dir das beiliegende Programm.
Ist lediglich eine EXE aber wegen 50% Ersparnis gezippt.
Es erstellt Aufgaben, die alle lösbar sind.
XUDO
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.12.08 14:41 
Bei mir bleiben maximal 27 Zahlen stehen (einfachste Schwierigkeitsstufe). :D
Da funktioniert das Generieren fast sofort. Du kannst es dir ja anschauen:
www.delphi-forum.de/viewtopic.php?p=291436
Wie bei allen meinen kostenlosen Programmen natürlich mit Quelltext. ;-)

Leider ist die Vorgehensweise zufallsbasiert, da ich leider wie gesagt mathematisch nicht zum Ziel gekommen bin. :(
Ach ja: bei dieser alten Version enthält der Löser nur einfachste Logiken.
XUDO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Win-98SE, Win-XP/1
Delphi-7P, Turbo-Pascal-6
BeitragVerfasst: So 28.12.08 19:19 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Ach ja: bei dieser alten Version enthält der Löser nur einfachste Logiken.

Hallo jaenicke,
das kann man an Deinem Beispiel 2 gut sehen, das nur über die Iteration lösbar ist; die Aufgabe ist allerdings "von Hand" und auch mit meinem Programm eindeutig und mit Deiner Lösung übereinstimmend zu erreichen -
ist also eindeutig.
Und zu meinem Beispiel 2 mit der ergänzten 9:
Sie kommt per Iteration korrekt heraus, wie die beiliegende JPG zeigt.
Gefällt mir aber sehr, Dein Programm, wenn es auch noch ein wenig intelligenter werden könnt.
Ich bin einen anderen Weg gegangen, habe dem Programm nach und nach(!) beigebracht, wie ich systematisch vorgehe - heute frage ich es manchmal um Rat per schrittweiser Lösung, wenn ich nicht weiterkomme ;-)
Gruß Xudo.
Einloggen, um Attachments anzusehen!
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: So 28.12.08 19:38 
Hm hab ganz vergessen zu erwähnen dass ich die hier gezeigten Programme auch ganz gut finde :)

Was halt noch fehlt ist ein Lösen in 2 Stufen: Erst ein intelligenter Ansatz, und wenn dieser nicht zum Ziel führt ein Umschalten auf einen "schlauen" Backtrackingalgorithmus, der die bisherigen Erkenntnisse weiterverwendet.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 28.12.08 19:58 
Das mache ich ja so. ;-)
Aber ich habe in dem alten von mir vorgestellten Programm noch keine besonderen Tricks zum Lösen verwendet.
XUDO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Win-98SE, Win-XP/1
Delphi-7P, Turbo-Pascal-6
BeitragVerfasst: Mo 29.12.08 10:41 
user profile iconThorsten83 hat folgendes geschrieben Zum zitierten Posting springen:

Was halt noch fehlt ist ein Lösen in 2 Stufen: Erst ein intelligenter Ansatz, und wenn dieser nicht zum Ziel führt ein Umschalten auf einen "schlauen" Backtrackingalgorithmus, der die bisherigen Erkenntnisse weiterverwendet.

Hallo Thorsten83,

Genau das macht ja das Programm von jaenicke.
Obwohl ich zu diesem Lösungsschritt 2 eine andere Auffassung habe:
Die Iterations-Arbeit, die das Programm dabei verrichtet, ist Konstruktion.
Es probiert, wie aus einigen vorgegebenen Ziffern ein vollständiges
Sudoku erstellt werden kann und geht dabei sämtliche (un)möglichen Kombinationen durch.
Ein Lösungsprogramm dagegen sollte ähnlich wie ein Mensch lediglich logisch vorgehen - wenn beide dann nicht zum Ergebnis kommen, ist das kein gutes Sudoku, weil mit logischem Denken nicht lösbar; vorausgesetzt natürlich, daß das Programm umfassend "denkt", weil der Mensch bei der Erstellung umfassend gedacht hat.

Darin liegt doch der Reiz der Lösungsprogrammerstellung:
Der blinde Geschwindigkeitsvorteil des Computers in Verbindung mit einem
sämtliche Möglichkeiten durchprobierende Eintragungen als ein Verfahren zur Lösung ist unfair - als Erstellungsverfahren aber völlig korrekt.
Was selbstverständlich nicht bedeutet, daß jaenicke unfair ist, und
außerdem ist das meine persönliche Ansicht zum Lösungsverfahren.
XUDO
XUDO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Win-98SE, Win-XP/1
Delphi-7P, Turbo-Pascal-6
BeitragVerfasst: Mo 29.12.08 13:18 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Aber ich habe in dem alten von mir vorgestellten Programm noch keine besonderen Tricks zum Lösen verwendet.

Hallo Jaenicke,
Was ist der (Trick?-)Unterschied zwischen Label.top und Label.explicittop?
Da besteht jeweils eine Differenz von 3 Pixeln, aber ... alles weitere auf dem beiliegenden Screenshot.
Gruß vom "bahnhofverstehenden" Xudo

PS: Falls das eine umfangreiche Diskussion wird, müssen wir vielleicht mit dem Thema "umziehen".
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von XUDO am Mo 29.12.08 13:22, insgesamt 2-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.12.08 13:19 
Das kannst du einfach ignorieren, das gab es in älteren Versionen nicht, aber es sollte normal alles funktionieren, wenn durch ignorieren diese Werte gelöscht werden.
XUDO Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 45

Win-98SE, Win-XP/1
Delphi-7P, Turbo-Pascal-6
BeitragVerfasst: Mo 29.12.08 13:28 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Das kannst du einfach ignorieren, das gab es in älteren Versionen nicht, aber es sollte normal alles funktionieren, wenn durch ignorieren diese Werte gelöscht werden.

Bist du aber schnell.
Ich habs auch ignoriert und alles klappt.
Aber das erklärt nicht, was die drei Pixel Differenz bedeuten bzw was der Sinn des expliziten Top ist.
Gruß XUDO
PS: Eine Vermutung:
Zwischen älteren und neueren Win-Versionen gibt es einen bei manchen Programmen störenden Unterschied: Der Kopfbalken ist ab XP oder schon früher einige Pixel breiter, was manchmal zu seltsamer Optik führt.
Nimmt sich das eine neuere Delphi-Version damit "zur Brust"?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 29.12.08 13:35 
Wenn ich mich richtig erinnere, dann werden darin explizite Werte von Left, Top, etc. gespeichert. Wenn du jetzt Align auf alClient und wieder auf alNone setzt, dann erhält das Control wieder die alten Angaben. Dafür stehen diese in den Explicit Eigenschaften (genauso wenn du Anchors änderst und wieder auf die Vorgabewerte setzt).