PUPU Solver mit Python

There are 95 replies in this Thread which has previously been viewed 7,882 times. The latest Post (February 6, 2025 at 2:29 PM) was by 2049.

  • Zum Generieren von Levels könnte man andersherum vorgehen: Mauern erzeugen, dann Blockgruppen erzeugen und die dann nach "inversen Regeln" verschieben und "nach oben fallen" lassen. Muss man aber etwas Überlegung investieren, wie das genau geht (z.B. dürfen die erst erzeugten Blockgruppen sich nicht berühren falls sie gleichen Typs sind, etc.), dafür ist das Erstellen eines lösbaren Levels von der Rechenzeit her dann super-fix.

    Please login to see this link. - Please login to see this link.

  • Kann es sein, dass der Solver folgendes Puzzle nicht lösen kann?

    Please login to see this attachment.

    Es ist das Level 25 von Lynx siehe Please login to see this link.

    Seine d64 im Anhang.

    Hier die txt des Levels:

    Und so sieht der Solver nach 2h aus (arbeitet immer noch):

    Please login to see this attachment.

  • Plötzlich hing mein Linux. Der Solver war bei über 4.5 Mio (3. Zahl).

    Nach Reboot nun wieder über 5.63 Mio.

    Aber Lösung kommt keine.

    Kein Wunder. Eines der 3 Herzen ist immer zu unterst im rechten tiefen Kanal.

    Auch ein Kreiz ist immer links ganz unten.

    Dort wird's nie eine Lösung geben!

    Für Elektronik oder LTspice Fragen klar bei Please login to see this link. nachschauen!

    Ansonsten:

    "Ich weiß nicht, mit welchen Waffen wir im 3. Weltkrieg kämpfen werden, aber im 4. werden wir uns wieder mit Keulen prügeln."

    (Albert Einstein)

    Edited 2 times, last by treki (January 5, 2025 at 7:57 AM).

  • Dort wird's nie eine Lösung geben!

    64erGruftis Pupu Solver hab ich mir bisher nicht genauer angesehen, aber die Kernkompetenz des Solvers ist wohl "brute force", da kann es tricky werden, wenn Steine erst auf bestimmte Positionen geschoben und/oder Brücken gebaut werden müssen, damit andere Steine zusammenfinden. Zu erkennen, ob "Reihe" oder "Winkel" die zielführende Lösung ist, wäre auch ein Faktor.

    Alle anderen Level hat der Solver geschafft? Cool, dann hab ich wenigstens mit einem Level gegen die Maschine, bzw. gegen 64erGruftis Code gewonnen. :D

    Daher ist "LAST ONE" der verdiente letzte Level.

  • Da gibt es beim Solver wohl noch Optimierungspotential. ;) Der Level ist lösbar.

    Please login to see this link.

    Please login to see this link.

    Please login to see this link.

    Hier liegen die aktuellsten Versionen: Please login to see this link.

  • Da gibt es beim Solver wohl noch Optimierungspotential. ;) Der Level ist lösbar.

    Das hab ich auch nie bestriten. Die Frage ist nur, wie kann man das optimieren? Ich schrieb ja schon, ich habe keine Ahnung, wie ich meine Vorgehensweise in einen Algorithmus stecken soll.

  • ... kann es sein, daß das Laden einer Solution (.sol) noch einen Fehler hat?

    Bash
    pupu_solver % python3 pupu_solver.py -s level015.sol
    pygame 2.6.1 (SDL 2.28.4, Python 3.13.0)
    Hello from the pygame community. https://www.pygame.org/contribute.html
    usage: pupu_solver.py [-h] [-z FACTOR] [-s FILE] [-d] [-f] puzzle
    pupu_solver.py: error: the following arguments are required: puzzle


    Das File level015.sol existiert, auch das Lösen (-f) ist möglich.

    Danke fürs Nachschauen... :smile:

  • ... kann es sein, daß das Laden einer Solution (.sol) noch einen Fehler hat?

    Bash
    pupu_solver % python3 pupu_solver.py -s level015.sol
    pygame 2.6.1 (SDL 2.28.4, Python 3.13.0)
    Hello from the pygame community. https://www.pygame.org/contribute.html
    usage: pupu_solver.py [-h] [-z FACTOR] [-s FILE] [-d] [-f] puzzle
    pupu_solver.py: error: the following arguments are required: puzzle


    Das File level015.sol existiert, auch das Lösen (-f) ist möglich.

    Danke fürs Nachschauen... :smile:

    Hänge doch bitte noch die Datei an, nur damit man selber damit auch herumspielen kann :smile:

    PABasicPlease login to see this link.Please login to see this link.Please login to see this link.Please login to see this link.Please login to see this link.

  • Hänge doch bitte noch die Datei an, nur damit man selber damit auch herumspielen kann :smile:

    ... ich kann gar kein Solutionfile öffnen, auch nicht das originale puzzle.sol .... evtl Bedien-/ Installationsfehler meinerseits?

    ... an der verwendeten OSX-Shell liegt's wohl auch nicht, hab von zsh auf bash gewechselt: gleiches Ergebnis.

  • pupu_solver.py: error: the following arguments are required: puzzle

    Die Fehlermeldung sagt es schon. Du brauchst auch noch das Puzzle dazu. In der SOL stehen lediglich die Züge drin. Aber welche Steine überhaupt initial im Puzzle wo stehen, ist dort nicht gespeichert. Die SOL ist immer in Verbindung mit dem Puzzle zu sehen. Also:

    Code
    python pupu_solver.py -s level015.sol level015.seq

    Edit:

    Theoretisch kann man eine SOL mit einem völlig anderen Puzzle starten. Kommt natürlich nur Quatsch raus und könnte sogar zum Absturz führen.

  • Die Fehlermeldung sagt es schon. Du brauchst auch noch das Puzzle dazu. In der SOL stehen lediglich die Züge drin. Aber welche Steine überhaupt initial im Puzzle wo stehen, ist dort nicht gespeichert. Die SOL ist immer in Verbindung mit dem Puzzle zu sehen. Also:

    Code
    python pupu_solver.py -s level015.sol level015.seq

    ... das erklärt es natürlich, danke! Und wenn das jetzt noch im GitHub-README stünde... :wink:

  • Und wenn das jetzt noch im GitHub-README stünde... :wink:

    Tut es eigentlich. Der Parameter "puzzle" ist nicht als optionaler Parameter deklariert, sondern positional. Das bedeutet, dass er an dieser Position stehen muss, wobei die meisten Systeme optionale Parameter auch an anderen Stellen akzeptieren. Desweiteren sagt er es einem ja, wenn man ihn vergisst.

    Aber ich werde es nochmal explizit rein schreiben. Beim nächsten Update wird es dann mit drin stehen. Ich habe noch eine kleine Optimierung geplant. Zumindest denke ich, dass das nochmal ein kleines Bißchen Zeit ausmachen dürfte.

  • Und wenn das jetzt noch im GitHub-README stünde... :wink:

    Meine geplante Optimierung bringt leider nix. Die Funktion, die ich verwense, ist bereits gut genug optimiert. Die Readme wurde ergänzt.

  • ... noch eine Frage: gibt es einen Grund, warum der Solver unverschiebbare (da kein leeres Feld vorhanden) Glasbausteine doch offenbar versucht zu verschieben?
    Zumindest sieht das während der Lösungsversuche so aus:

    Please login to see this attachment.

    Die Fläche im konkreten Beispiel ist eigentlich komplett mit Glasbausteinen ausgefüllt:

    Please login to see this attachment.

    Wo schiebt er die denn hin? Vielleicht lässt sich hier unnötiges Verschieben reduzieren und damit insgesamt laufzeittechnisch optimieren?

  • ... noch eine Frage: gibt es einen Grund, warum der Solver unverschiebbare (da kein leeres Feld vorhanden) Glasbausteine doch offenbar versucht zu verschieben?
    Zumindest sieht das während der Lösungsversuche so aus:

    Please login to see this attachment.

    Die Fläche im konkreten Beispiel ist eigentlich komplett mit Glasbausteinen ausgefüllt:

    Please login to see this attachment.

    Wo schiebt er die denn hin? Vielleicht lässt sich hier unnötiges Verschieben reduzieren und damit insgesamt laufzeittechnisch optimieren?

    Schick mir mal das Puzzle. Sollte eigentlich nicht passieren. Wobei man natürlich auch sagen könnte, sollte in einem Puzzle gar nicht vorkommen, weil unsinnig.

  • Schick mir mal das Puzzle. Sollte eigentlich nicht passieren. Wobei man natürlich auch sagen könnte, sollte in einem Puzzle gar nicht vorkommen, weil unsinnig.

    .. benutze sowas gern als "künstlerisches Element"... :smile:

    Passiert immer, wenn die Glasbausteine ohne Bewegungsmöglichkeit eingegrenzt sind. Eine Begrenzung ist der Spielfeldrand - also keine richtige Mauer.
    Unten offen passiert es offenbar nicht, rechts schon.
    Anbei ein Dummy-Level-File, bei welchem man das beobachten kann.

    (aber kein Stress, war mir nur beim abschliessenden Testdurchlauf meiner fertigen Level aufgefallen).