Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Rekursive Programmierung
Gehe zu Seite Zurück  1, 2, 3 ... 10, 11, 12, 13, 14  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 178

BeitragVerfasst am: 06.01.2025, 20:45    Titel: Antworten mit Zitat

Genau so schwer tue ich mir im Umgang mit Indizes.
Ein Sudoku besteht bekanntlich aus 81 Zellen.
Um diese Zellen korrekt ansprechen zu können, werden sie als zweidimensionales Feld mit den Indizes z für die Zeile und s für die Spalte definiert.

Nach meinem Verständnis gilt also für die Zelle(1, 1) folgendes: z=1 und s=1.
Entsprechend für die Zelle(9, 9) z=9 und s=9.
So ist es für mich logisch nachvollziehbar.

Um eine Zelle korrekt anzusprechen, braucht man bekanntlich zwei ineinander verschachtelte Schleifen.
Die eine läuft von z=1 bis z=9, und die andere von s=1 bis s=9.
For z=1 to 9
For s=1 to 9
.
.
.
next s
next z

In der Lektüre wird aber empfohlen, die Schleifen jeweils
von 0 bis 10 laufen zu lassen. Also :
For z=0 to 10
For s=0 to 10
.
.
.
next s
next z

Warum?
Zu Beginn würde ich auf z=0 und s=0 treffen, eine Zelle(0, 0) gibt es im Sudoku aber nicht.

Am Ende würde ich auf z=10 und s=10 treffen, eine Zelle(10, 10) gibt es im Sudoku aber auch nicht.

Weshalb macht diese Schleifen-Definition dennoch Sinn?
Was macht den Unterschied?
Nach meinem Verständnis ist es doch sinnvoller, eine Schleife von 1 bis 9
laufen zu lassen, wie logisch naheliegend, statt von 0 bis 10.

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4698
Wohnort: ~/

BeitragVerfasst am: 07.01.2025, 00:21    Titel: Antworten mit Zitat

Wenn du Zeile(9,9) definierst, macht eine Schleife bis 10 keinen Sinn, denn der Feldeintrag Zeile(10, x) bzw. Zeile(x, 10) sind ja gar nicht definiert. Anders sieht es mit den Einträgen Zeile(0, x) bzw. Zeile(x, 0) aus (wenn x im Bereich von 0 bis 9 liegt) - diese sind definiert (solange du nicht OPTION BASE 1 einsetzt ...), du willst sie aber nicht verwenden.

Um zu beurteilen, warum die Schleife von 0 bis 10 empfohlen wird, müste man wissen, warum der Autor es empfiehlt. Möglicherweise behandelt er ja einen ganz anderen Fall, wo das durchaus Sinn ergibt (ich z. B. habe früher meine Spiele-Level, etwa beim Laserspiel, mit einer Mauer umgeben, damit man das Spielfeld nicht versehentlich am Rand verlassen kann - dazu war das Feld aber dann auch passend dimensioniert). Das heißt nicht, dass sich der Fall auf das Sudoku übertragen lassen muss.

Um es kurz zu machen: Ich sehe beim Sudoku gerade keinen Grund, eine andere Schleifenlaufweite als "1 TO 9" zu verwenden.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 178

BeitragVerfasst am: 07.01.2025, 06:29    Titel: Antworten mit Zitat

Ich habe mich mal etwas im Internet umgeschaut.
Dabei stieß ich auf ein Lehr-Video zum Thema Backtrackíng.
Dort wurde es als zweckmäßig dargelegt, Lauf-Variablen entsprechend festzulegen. Allerdings war dieses Video auf eine Programmierung in Python ausgelegt. Auch wenn ich von Python keine Ahnung habe, kam mir manches im Syntax als etwas bekannt vor. Es gibt dort z.B. auch eine If-Abfrage,
aber es gibt generell kein "Endif", wie man es aus Q-Basic kennt.
Woher soll man denn wissen, wann eine If-Abfrage eigentlich beendet ist?

Wie dem auch sei, hierbei wurde als erster Index jeweils die 0 empfohlen.
Intern würde daraus eh eine 1 gemacht werden.

Eine Zelle(0, 0) würde offenbar automatisch als Zelle(1, 1) interpretiert werden. Sorry, wie kann das gehen? Ein schwarzes Schaf wird doch auch nicht automatisch weiß, nur weil man halt festlegt, dass ein schwarzes Schaf
gefälligst ein weißes zu seien hat.

In diesem Video gehen die Laufvariablen bis zur 10.
Es wird aber extra darauf hingewiesen, dass die 10 ausschließlich ist, die Schleife also eh bloß bis zur 9 läuft.

Aus 0 wird also offenbar 1 und aus 10 offenbar 9.
Könnt Ihr das kapieren??? Sorry, aber ich kann es definitiv nicht.

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 07.01.2025, 09:13    Titel: Antworten mit Zitat

in diesen Fällen hilft es meist nicht über einzelne Zeilen zu spekulieren, Kontext ist in der Programmierung zu wichtig.

Daher schlage ich vor, dass du uns dieses Beispiel hier verlinkst, also die Adresse der Seite hier reinkopierst.

Andererseits kann man nur vermuten, und das bringt keinem was.

In meinem Programm verwende auch ein zweidimensionales Array. Bei mir gehen die Indizes dort auch von 1 bis 9, allerdings je nach Geschmack könnte ich sie auch von 0 bis 8 laufen lassen.
Ich habe noch ein anderes Array, bei dem ich von 0 beginne, da ich damit aus Gewohnheit besser rechnen kann (mit Divisionen und Modulo, um die "Häuser"/"9x9 Blöcke" zu berechnen, in denen sich ein Sudokufeld befindet).

In vielen Sprachen werden If-Blöcke mit {} umschlossen, damit man weiß, wann sie beendet sind.
In einigen Sprachen (auch Python) werden If-Blöcke durch Einrückungen markiert.
Und in einigen Sprachen wie QBasic gibt es ein Extra Schlüsselwort wie "END IF".


Wenn über die Parameter deiner SUBs gemeckert wird, dann prüfe zunächst die DECLARE SUB-Anweisung, die automatisch von QBasic hinzugefügt wird, ob die Parameter auch wirklich den gewünschten Datentyp haben, dann in der SUB selber die erste Zeile, ob dort in den Klammern - also der Parameterliste - die Variablen den gewünschten Datentyp haben, und drittens beim Aufruf deiner SUB, ob die Variablen stimmen.
In meinem Programm verwende ich am Anfang des Programms DEFINT A-Z, das bedeutet, dass alle Variablen automatisch Integer werden, sofern ich keine explizite Endung wie % oder ! oder $ angebe.
_________________
Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 07.01.2025, 09:41    Titel: Antworten mit Zitat

Revilo hat Folgendes geschrieben:
Da frage ich mich natürlich, warum es überhaupt beide Varianten gibt?
Das ist historisch bedingt. Die ersten BASIC-Varianten kannten nur die implizite Variablendeklaration, also ohne DIM. Aber wenn du einmal in einem längeren Programm 2 Wochen lang hinter einem Fehler hergesucht hast, der nur sporadisch auftritt und sich schließlich als Tippfehler in einem Variablennamen entpuppt, verzichtest du in Zukunft gerne auf diese Bequemlichkeit. Deshalb wurde irgendwann die Möglichkeit der expliziten Deklaration (also mit DIM) eingeführt. Aus Gründen der Abwärtskompatibilität, also damit nicht alle bisherigen Programme neu geschrieben werden müssen, hat man die Möglichkeit der impliziten Deklaration beibehalten. Ich empfehle aber dringend, darauf zu verzichten.

Dein beschriebenes Problem kann ich hier allerdings nicht nachvollziehen. Ich habe alle Kombinationen durchprobiert, alles funktioniert problemlos.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4698
Wohnort: ~/

BeitragVerfasst am: 07.01.2025, 16:35    Titel: Antworten mit Zitat

Nochmal schnell zu Python (um Python-Codes besser zu verstehen):
Wie SpionAtom bereit schrieb, markiert Python Blöcke über Einrückungen. Wenn du eine z. B. for-Schleife baust, muss der Schleifenrumpf eingerückt werden (sonst meckert der Compiler). Alles, was gleich weit eingerückt ist, gehört in dieselbe Blockebene, und wenn du die Schleife verlässt, verlässt du dazu einfach die Einrückungstiefe.

Eine weitere Besonderheit ist, dass es keine FOR-Schleife exakt wie in BASIC gibt, sondern dass for über ein Objekt iteriert (vereinfacht gesagt: dass es nacheinander alle Elemente des Objekts durchläuft). Die "klassische" for-Schleife lässt sich mit einem range-Objekt realisieren. Dabei ist z. B. range(10) ein Objekt, das über 10 Elemente läuft, allerdings beginnend bei 0. range(10) läuft also von 0 bis 9, oder allgemein: range(n) läuft von 0 bis n-1.
Man kann auch einen anderen Startwert statt 0 nehmen (und auch eine andere Schrittweite, aber die lasse ich mal beiseite). Dazu gibt man zwei Parameter an, der erste ist der Startwert. range(5, 12) durchläuft dann also alle Objekte von 5 bis ... richtig, bis 11. Oder allgemein: range(a, b) läuft von a bis b-1.
Das ist eine Design-Entscheidung, die in sich konsequent ist, aber nicht unbedingt intuitiv.



Zitat:
Aus 0 wird also offenbar 1 und aus 10 offenbar 9.
Könnt Ihr das kapieren??? Sorry, aber ich kann es definitiv nicht.

Entschuldigung, dieses Zitat kann ich mir jetzt doch nicht verkneifen. grinsen
Johann Wolfgang hat Folgendes geschrieben:
Und Neun ist Eins,
Und Zehn ist keins.
Das ist das Hexen-Einmal-Eins!

_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Berkeley



Anmeldungsdatum: 13.05.2024
Beiträge: 91

BeitragVerfasst am: 07.01.2025, 22:07    Titel: Antworten mit Zitat

Revilo hat Folgendes geschrieben:

Aber wenn ich diese SUB dann tatsächlich mit diesen Parametern
(z%, s%, w%) aufrufe, wird "gemeckert" --- "Parameter passt nicht".

Wahrscheinlich benutzt deine SUB andere Integer. Es gibt u.a. 16 Bit, 32 Bit, mit und ohne Vorzeichen...

"DECLARE SUB meineSub(a%, b%, c%)" statt "AS INTEGER" sollte auch funktionieren. - Poste einfach besser mal deinen Code...

Grund ist Geschichte. Ursprünglich gab's nur Gleitkommazahlen, vielleicht sogar nur Ganzzahlen(Integer) und Zeichenketten(Strings) - wie "a$". "a" ist ne Gleitkommazahl, "a$" eine Zeichenkette. Da man mit Ganzzahlen schneller arbeiten kann hat man weitere Endungen eingeführt wie zumeist % für Ganzzahlen. Für Arrays hat man DIM eingeführt, wobei man mit "DIM a$(10)" eben Stringarrays, mit "DIM a(10)" Zahlenarrays angelegt hat. Später kamen immer mehr Datentypen dazu und konnte das nicht mehr mit Satzzeichen bewältigen, "DIM" wurde dann zweckentfremdet um Variablen auch als längst vorhandene Datentypen zu deklarieren. Und letztlich hat man die Unterstützung für Endungen sowie implizite Deklaration abgeschafft.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4698
Wohnort: ~/

BeitragVerfasst am: 07.01.2025, 23:49    Titel: Antworten mit Zitat

Zitat:
Wahrscheinlich benutzt deine SUB andere Integer. Es gibt u.a. 16 Bit, 32 Bit, mit und ohne Vorzeichen...

Dass es in QBasic Unsigned Integer gäbe, wäre mir neu. Meines Wissens gibt es da als Ganzzahl-Datentypen nur INTEGER (16 Bit, Symbol %) und LONG (32 Bit, Symbol &), und dann noch SINGLE (!), DOUBLE (#) und STRING ($).

Probleme vermute ich eher, wenn ein proc(z) aufgerufen wird, es aber als proc(z%) deklariert wurde. Ein fehlendes Symbol müsste meines Wissens standardmäßig ein SINGLE definieren.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 08.01.2025, 00:57    Titel: Antworten mit Zitat

OK, QBasic in der Dosbox ist arschlahm missbilligen

Mein Bruteforce-Algorithmus würde ewig brauchen um einfach alle Möglichkeiten einzugeben, dabei prüft er noch nichtmal, ob die momentante Konfiguration des Sudokus eine gültige ist... (ca. 40 leere Felder, mit je durchschnittlich 4 Kandidaten = 4^40)

Mit dem Backtracking komme ich dann hoffentlich auf akzeptable Laufzeiten.
_________________
Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 08.01.2025, 08:30    Titel: Antworten mit Zitat

Ich konnte nicht widerstehen und bastele auch gerade an einem Sudoku-Löser. Allerdings in freeBasic, QBasic möchte ich mir in dem Zusammenhang denn doch nicht antun.

Naked Singles und Hidden Singles lassen sich recht einfach implementieren und führen sehr oft schon zu einer Lösung. Wenn nicht, kann ich (im Augenblick noch) per Hand die übriggebliebenen Kandidaten einsetzen (einfach der Reihe nach alle durchprobieren), und es ist mir bis jetzt noch kein Sudoku untergekommen, bei dem nicht das probeweise Einsetzen nur eines (!) der übriggebliebenen Kandidaten zu einer Lösung geführt hätte.

Erst Naked Singles, dann Hidden Singles, dann brute force scheint mir also durchaus eine praktikable Vorgehensweise zu sein.

Gruß
grindstone

EDIT:
Ich sollte vielleicht noch dazusagen, daß die Suche nach Naked + Hidden Singles in einer Dauerschleife läuft, auch während der Eingabe.
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 395

BeitragVerfasst am: 08.01.2025, 12:40    Titel: Antworten mit Zitat

Dann löse man das:

Code:
S6:
DATA 0, 0, 7, 0, 0, 3, 0, 0, 1
DATA 0, 0, 5, 1, 2, 0, 0, 4, 0
DATA 2, 0, 0, 0, 0, 6, 0, 0, 0
DATA 0, 0, 0, 0, 0, 2, 0, 0, 0
DATA 0, 0, 4, 0, 0, 0, 9, 0, 0
DATA 5, 0, 0, 7, 8, 0, 0, 0, 6
DATA 8, 0, 0, 5, 1, 0, 0, 0, 7
DATA 0, 7, 0, 0, 0, 0, 0, 6, 0
DATA 0, 0, 0, 3, 0, 0, 0, 0, 0


Da kommste mit Naked und Hidden Singles nur bedingt weit.
Da baucht man irgendwann die sogenannte x-wing Methode.
Was ich vorher implementieren will, ist die Methode zum erkennen von Paaren oder Triples oder vielleicht auch Quadrupels. Die gibts auch als Naked und Hidden.
_________________
Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 178

BeitragVerfasst am: 08.01.2025, 16:20    Titel: Antworten mit Zitat

Hallo nemored,
Zitat:
Wenn du Zeile(9,9) definierst, macht eine Schleife bis 10 keinen Sinn, denn der Feldeintrag Zeile(10, x) bzw. Zeile(x, 10) sind ja gar nicht definiert. Anders sieht es mit den Einträgen Zeile(0, x) bzw. Zeile(x, 0) aus (wenn x im Bereich von 0 bis 9 liegt) - diese sind definiert (solange du nicht OPTION BASE 1 einsetzt ...), du willst sie aber nicht verwenden.

Um zu beurteilen, warum die Schleife von 0 bis 10 empfohlen wird, müste man wissen, warum der Autor es empfiehlt. Möglicherweise behandelt er ja einen ganz anderen Fall, wo das durchaus Sinn ergibt (ich z. B. habe früher meine Spiele-Level, etwa beim Laserspiel, mit einer Mauer umgeben, damit man das Spielfeld nicht versehentlich am Rand verlassen kann - dazu war das Feld aber dann auch passend dimensioniert). Das heißt nicht, dass sich der Fall auf das Sudoku übertragen lassen muss.

Um es kurz zu machen: Ich sehe beim Sudoku gerade keinen Grund, eine andere Schleifenlaufweite als "1 TO 9" zu verwenden.


Der Befehl OPTION BASE ist mir in QBasic schon begegnet. Bisher konnte ich damit aber nichts anfangen. Ich bastele nicht an Dingen, von denen ich nichts verstehe. Jetzt habe ich zumindest eine Vermutung zu dem Zweck dieses Befehls zu Beginn einer Schleife.
OPTION BASE 0 heißt: Indizes (0,x) sind erlaubt.
OPTION BASE 1 heißt: Indizes (0,x) sind nicht erlaubt.
Es geht also tatsächlich erst bei (1,x) los. Richtig?
Am Ende einer Schleife, ist es mir schon oft passiert, dass sie "über das Ziel hinausschoss", mit entsprechender Fehlermeldung.
Ich glaube, dass ich meinem Rechner diese Faxen abgewöhnen konnte.
for i=1 to 9
.
.
next i

'Ich lege einfach fest, was maximal für i gelten darf:
IF i>9 THEN i=9 Funktioniert zumindest sauber.

Der Autor bot einen komplett durchprogrammierten Backtracking-Algorithmus an, leider in Python, wovon ich nichts verstehe.

Er verwies ausdrücklich darauf, dass Berechnungen zur Lage der jeweiligen Zellen also (z, s) bei dem Lauf einer Schleife von 0 - 10 leichter durchzuführen seien, (Stichwort - Ganzahldivision, was immer das auch heißen mag). Vielleicht kannst du damit etwas anfangen, ich kann es nicht.

Index der ersten Zeile : Bei ihm: 0 bei mir: 1
Index der zweiten Zeile: Bei ihm: 1 bei mir: 2
Index der dritten Zeile : Bei ihm: 2 bei mir: 3

Bei ihm muss ich gedanklich also immer noch +1 hinzuzählen, während sich bei meiner Programmierweise der Zeilen-Index sofort korrekt ergibt.
Seine Programmierweise muss ja dennoch einen gewissen Vorteil bieten,
sonst würde er sie ja nicht öffentlich präsentieren. Aber welchen?
Ich sehe jedenfalls keinen und werde also erst mal bei einer Schleifen-Laufweite von 1 - 9 bleiben, zumal du ja auch keinen Grund siehst, dies zu ändern.

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 178

BeitragVerfasst am: 08.01.2025, 18:25    Titel: Antworten mit Zitat

Hallo grindstone,
Zitat:
Ich konnte nicht widerstehen und bastele auch gerade an einem Sudoku-Löser. Allerdings in freeBasic, QBasic möchte ich mir in dem Zusammenhang denn doch nicht antun.


Habe ich dich mit meinem Ehrgeiz etwa "angesteckt"?
Was du zu Naked + Hidden Singles schreibst entspricht exakt meiner "klassischen" Vorgehens-Strategie. Zielstellung ist es erst mal, die Anzahl noch möglicher Einträge durch klassische Lösungsverfahren so weit wie möglich zu verringern.
Problem: Es gibt über 40 derartige Lösungsverfahren, z.B. X-Wing.
Jedes kann irgendwie, irgendwo, irgendwann (Nena lässt grüßen) mal nötig und dann auch zielführend sein. Aber jedes zu implementieren, kann zu einer Lebensaufgabe werden.

Du kämpfst in FreeBasic, ich in QBasic ok., aber auf jeden Fall kämpfen wir
als Partner auf derselben Seite der Front.

Ich suche zuerst nach Solos (Turm-, Zeilen-, Spalten,- und Blocksolos),
also nach Werten, die dort nur noch ein einziges mal vorkommen können.
Wenn ich auf einen solchen Wert treffe, trage ich ihn ins Sodoku-Schema ein
und schließe ihn (wegen der Sudoku-Regeln) in der ganzen Zeile, in der ganzen Spalte, im ganzen Block aus.

Wenn die Solosuche keine Fortschritte mehr liefert, suche ich nach exakten
Zwillingen. Exakte Zwillinge erlauben nur noch 2 mögl. Werte w1 und w2.
Der Ursprungs-Zwilling steht in der Zelle (z1,s1)
Den exakten Partner-Zwilling gibt es, wenn es ihn gibt, entweder in der
Zeile, der Spalte oder dem Block des eben gefundenen Zwillings.
Wenn es einen Partner-Zwilling gibt, steht er in Zelle (z2, s2).

Je nach dem, wo z1,s1 und z2,s2 liegen, wird w1 und w2 für alles andere ausgeschlossen. Man weiß zwar noch nicht, ob w1 bei (z1, s1) und w2 bei (z2, s2) liegt oder umgekehrt. Aber man weiß auf jeden Fall, dass w1 und w2 nirgends woanders mehr liegen können.

Wenn sowohl die Solosuche als auch die Zwillingssuche keinen Fortschritt mehr liefern, könnte man ein zusätzliches Lösungsverfahren wie etwa
X-Wing implementieren, um einen weiteren Fortschritt zu erreichen, aber wie gesagt, derer gibt es über 40, besagte Lebensaufgabe.

Spätestens jetzt ist es offenbar zweckmäßiger, zu probieren.
Auf Papier wäre das die Bleistift-Radiergummi-Phase.
Bei der computermäßigen Umsetzung scheint der Backtracking -Algorithmus als sehr geeignet, wenn man ihn denn begriffen hat.
Ich habe ihn noch nicht begriffen. Genau deshalb komme ich momentan auch nicht wirklich weiter.
Ich verstricke mich in computerinternen Verarbeitungs-Feinheiten, sauge also quasi unnötiges Fachwissen in mich auf, ohne dass es mir wirklich weiterhilft. traurig
Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 178

BeitragVerfasst am: 08.01.2025, 19:11    Titel: Antworten mit Zitat

Hallo nemored,
mit "anderer Schrittweise" nimmst du offenbar Bezug auf den step- Befehl.
Ist mir bereits bekannt, also nichts geheimnisvolles mehr.
Vielen Dank für den Hinweis und deine Erinnerung an das "Hexen-Einmaleins".
War aber nicht nötig. Der "Faust" war auch beim DDR-Abi Pflichtlektüre. zwinkern

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 178

BeitragVerfasst am: 08.01.2025, 19:20    Titel: Antworten mit Zitat

Hallo Berkeley,

Zitat:
Grund ist Geschichte. Ursprünglich gab's nur Gleitkommazahlen, vielleicht sogar nur Ganzzahlen(Integer) und Zeichenketten(Strings) - wie "a$". "a" ist ne Gleitkommazahl, "a$" eine Zeichenkette. Da man mit Ganzzahlen schneller arbeiten kann hat man weitere Endungen eingeführt wie zumeist % für Ganzzahlen. Für Arrays hat man DIM eingeführt, wobei man mit "DIM a$(10)" eben Stringarrays, mit "DIM a(10)" Zahlenarrays angelegt hat. Später kamen immer mehr Datentypen dazu und konnte das nicht mehr mit Satzzeichen bewältigen, "DIM" wurde dann zweckentfremdet um Variablen auch als längst vorhandene Datentypen zu deklarieren. Und letztlich hat man die Unterstützung für Endungen sowie implizite Deklaration abgeschafft.


Vielen Dank für den historischen Einblick, aber was bedeutet das jetzt konkret für mich bei meinem konkreten Vorhaben, ein Sudoku per Computer lösen zu wollen?

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 178

BeitragVerfasst am: 08.01.2025, 19:52    Titel: Antworten mit Zitat

Hallo SpionAtom,

Zitat:

Da kommste mit Naked und Hidden Singles nur bedingt weit.
Da baucht man irgendwann die sogenannte x-wing Methode.
Was ich vorher implementieren will, ist die Methode zum erkennen von Paaren oder Triples oder vielleicht auch Quadrupels. Die gibts auch als Naked und Hidden.


Du verweist zurecht auf die X-Wing-Methode.
Um ein schweres Sudoku zu lösen gibt es aber immerhin noch mehr als 40 weitere. X-Wing ist eine davon, aber längst nicht die alleinige, ultimative.
Eine Suche nach Singles oder Paaren (als klassische Lösungstechniken) kann man vielleicht noch effektiv programmieren, aber bei Tripels, oder gar Quadrupeln ist der Aufwand zu groß. Bevor man sich das antut, sollte man wohl doch eher probieren, z.B. mit dem Backtracking-Algorithmus.
Ich empfehle ihn, obwohl ich ihn noch nicht so wirklich verstanden habe.
Aber auf jeden Fall dürfe er effektiver sein, als erst mal 40 verschiedene Lösungsverfahren zu implementieren, nur damit man sie im Bedarfsfall hat, ohne sie eventuell jemals nutzen zu müssen.

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 08.01.2025, 23:29    Titel: Antworten mit Zitat

SpionAtom hat Folgendes geschrieben:
Dann löse man das:

Code:
S6:
DATA 0, 0, 7, 0, 0, 3, 0, 0, 1
DATA 0, 0, 5, 1, 2, 0, 0, 4, 0
DATA 2, 0, 0, 0, 0, 6, 0, 0, 0
DATA 0, 0, 0, 0, 0, 2, 0, 0, 0
DATA 0, 0, 4, 0, 0, 0, 9, 0, 0
DATA 5, 0, 0, 7, 8, 0, 0, 0, 6
DATA 8, 0, 0, 5, 1, 0, 0, 0, 7
DATA 0, 7, 0, 0, 0, 0, 0, 6, 0
DATA 0, 0, 0, 3, 0, 0, 0, 0, 0


Kein Problem:
    9 4 7 8 5 3 6 2 1
    6 8 5 1 2 9 7 4 3
    2 3 1 4 7 6 8 5 9
    3 6 8 9 4 2 1 7 5
    7 1 4 6 3 5 9 8 2
    5 9 2 7 8 1 4 3 6
    8 2 6 5 1 4 3 9 7
    1 7 3 2 9 8 5 6 4
    4 5 9 3 6 7 2 1 8
Schon der 2. brute force - Versuch war erfolgreich. Nach Eintippen der Vorgabe blieben im oberen linken Kästchen nur 4 und 9 als mögliche Zahlen über. 4 --> Fehler / 9 --> Lösung. lächeln

Gruß
grindstone

EDIT:
Bei näherem Nachdenken ist das, was ich als brute force bezeichnet habe, eigentlich Backtracking, wenn auch manuell ausgeführt. Nach Eingabe der Vorgabezahlen speichere ich den aktuellen Stand ab, probiere eine Zahl, wenn das kein regelgerechtes Ergebnis bringt, lade ich den abgespeicherten Status und probiere die nächste Zahl. Die Frage ist jetzt nur, ob diese Vorgehensweise immer zu einer Lösung führt.
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!


Zuletzt bearbeitet von grindstone am 08.01.2025, 23:50, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 178

BeitragVerfasst am: 08.01.2025, 23:49    Titel: Antworten mit Zitat

Hallo grindstone,

Zitat:
Nach Eintippen der Vorgabe blieben im oberen linken Kästchen nur 4 und 9 als mögliche Zahlen über. 4 --> Fehler / 9 --> Lösung. lächeln


Sorry, das verstehe ich nicht. Nach meiner Auffassung müsste in der
Zelle (1,1), also ganz links oben nach Eingabe der Vorgaben, auch eine 6 möglich sein, und eben nicht nur eine 4 oder 9.
Warum fällt die 6 bei dir raus? Habe ich da etwas übersehen?

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 09.01.2025, 00:00    Titel: Antworten mit Zitat

Revilo hat Folgendes geschrieben:
Habe ich da etwas übersehen?
Ja. Bei meinem Programm läuft die Schleife, die nach Singles sucht, ständig, auch während der Eingabe. Sobald ein Single gefunden wurde, wird der gesamte Zahlenbestand entsprechend aktualisiert und die Suche geht von vorne los. Wird kein neuer Single gefunden, gibt es keine Änderung, aber gesucht wird trotzdem ununterbrochen.

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Revilo



Anmeldungsdatum: 26.12.2022
Beiträge: 178

BeitragVerfasst am: 09.01.2025, 00:20    Titel: Antworten mit Zitat

Hallo grindstone,
vom Ansatz her hast du natürlich recht.
Warum sollte man sich mit 3 noch mögl. Einträgen herumquälen, wenn es eine Zelle mit nur noch zwei mögl. Einträgen gibt?

Zelle (1,1) kommt dafür aber eigentlich nicht in Frage, weil eben nicht nur 4 und 9 möglich sind sondern auch noch eine 6 möglich wäre.
Dass es mit der 9 geklappt hat, war also ein Glückstreffer.
Ebenso gut hätte sich auch die 6 als richtig erweisen können. Und dann???
Es wäre ein Fehler aufgetreten, weil du die 6 gar nicht betrachtet hast.

Sorry, aber soweit zu meinem Verständnis der Sache.

Gruß Revilo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite Zurück  1, 2, 3 ... 10, 11, 12, 13, 14  Weiter
Seite 11 von 14

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz