Qbasic - "Herausforderungsanfrage"

Hallo von Michendorf bei Beelitz nach Leipzig,

von 1987 - 1989 entwickelte ich nebenberuflich (unter QuickBasic, also unter DOS) ein komplettes Branchenpaket für
Fleisch verarbeitende Betriebe und vertrieb dies von 1989 - etwa 2004; es läuft noch heute bei 3 Fleischereien unter
XP und WIN 7. - Insgesamt 43 Einzelprogramme mit anspruchsvollen Bereichen wie komplettes Warenwirtschaftssystem
samt Laden- und Versandwaagenanbindung, Rezepturoptimierung, verschiedensten Kalkulationen, HACCP etc. etc.

Allerdings kamen hier nur die Grundrechenarten, was den mathematischen Teil betrifft, zum Einsatz, selbst bei der
linearen Rezepturoptimierung nach dem Simplexverfahren.

Ich habe mir nun programmtechnisch im Privatbereich, um meiner Frau zu helfen, etwas in den Kopf gesetzt, wäre jedoch
ZUVOR für einen Tipp dankbar, ob eine Programmiersprache folgendes lösen kann, nachdem die Möglichkeiten der auftretenden
Fälle selbst unendlich sind.

Insofern gibt es keine Lösungsmöglichkeit à la „if - then“, „while - wend“, „loop“ etc.

Hintergrund: meine Frau ist in der Einzeltherapie von Senioren in einer Einrichtung tätig, dazu gehört auch Gedächtnistraining.
Sie hat für den privaten Bereich eine schlicht gehaltene Homepage: reger-geist.de (Dort findest Du auch mich unter (6) Mobilmarkt
für Seniorenheime). Das nachfolgend beschriebene Würfelspiel ist bei den geistig total fitten Senioren extrem beliebt, da es um ein
Vielfaches beliebter ist als das allgemein gespielte „Bingo“, welches ja nur auf Zufall basiert und die Grauen Zellen nicht anstrengt, eben
im Gegensatz zu folgendem. Und hierzu bitte ich Dich eben um Hilfe:

A.
Drei normale Würfel.

Es gelten nur die 4 Grundrechenarten.

Diese können in beliebiger Form miteinander verknüpft werden: (3 x 6) - 1

An jede der 6 Zahlen können beliebig viele Nullen angehängt werden, in der Praxis jedoch meist ausnahmslos nur 2:

(3x100) - (2x100) - 5 = 95

B.
Eine Zahl zwischen 1 und 100 wird bestimmt, z.B. 72.

C.
Durch die optimalste Rechenweise soll die Punktezahl 72 erreicht bzw. so nahe wie möglich erreicht werden.

D.
Die Würfel sind beispielsweise 2, 3 und die 5.

E.
(5+„0“) x 2 = 100
minus (3+„0“) = 70
plus 2 = 72

andere Variante

(5+„0“) = 50
plus (2+„0“) = 70
plus 3 = 73


Es ist unglaublich, welches Spektrum an Kombinationsmöglichkeiten bei nur 4 Grundrechenarten und gerade mal drei Würfeln
hier möglich ist. Und neben Schach gegen den PC möchte ich versuchen, mich in meiner Freizeit hier mal zu testen. Allerdings
nur mit der Gewissheit, dass die Aufgabe auch lösbar ist und ich nicht im Begriff bin zu versuchen, mit einem 10 - Liter - Eimer
den Bodensee zu leeren …

Damals beim aktiven Programmieren hatte ich auch „Iteration“, doch diese Methode war nicht mal bei der Rezepturoptimierung
erforderlich, da die Laboranalysenwerte der Wurstware nicht „annähernd“ den Leitsätzen zu entsprechen hatten, sondern genau.

Für Deine Mail wäre ich sehr dankbar, wenn machbar so, dass ich das das auch verstehe. In Qbasic war ich perfekt und hab’ das bis
heute nicht verlernt, doch das Programmieren in Maschinensprache hab ich nie gelernt.

Schönen Gruß und einen guten Start in die Neue Woche!

Josef.

Die Aufgabe ist das, was wir als „berechenbar“ bezeichnen, d.h., dass sie mit jeder Programmiersprache der Welt gelöst werden kann, also auch in QBasic.

Ich habe nicht bis ins letzte Detail verstanden, welche Regeln alle erlaubt sind. Oder sagen wir mal, ich hab es jetzt so verstanden: Das Programm generiert mir eine Zufallszahl zw. 1 und 100 sowie 3 zufällige Würfe, z.B. wie in deinem Beispiel 2, 3, 5. Der Spieler Darf jetzt wahlweise an jede der 3 Zahlen eine oder zwei Nullen anhängen und die Zahlen mit den 4 Grundrechenarten verknüpfen.

Also z.B. wäre 20 + 3 * 500 (wäre jetzt 1520) oder auch einfach nur 3+5-2.

In dem oberen Teil von E wird die 2 irgendwie doppelt verwendet, da blick ich gerade nicht ganz durch. Ich glaube aber, das macht für das Programm momentan auch keinen Unterschied. Und es scheint schon, dass man das mit ein paar If-Schleifen lösen kann. Iteration braucht es vermutlich zunächst nicht.

Mein Ansatz wäre:
* Du erzeugst 4 Zufallszahlen: X, W1, W2, W3. X ist dabei die Zahl zwischen 1 und 100 und W1, W2 und W3 sind die 3 Würfe, also Zufallszahlen zwischen 1 und 6.
* Den Rest muss ja ohnehin der Spieler erledigen, d.h., der Spieler muss nun eine geeignete Kombination finden. Hat er sie, gibt er sie in dem Programm ein.
* Meine QBasic-Zeit ist leider viele Jahre her. Ich weiß nicht, ob man den Eingabestring, bspw. 50*2-1 direkt in eine Zahl umwandeln kann (das wäre dann leicht). Das Programm muss natürlich in jedem Fall die Eingabe des Spielers in einen Wert umwandeln, in dem Fall 99, und mit der Zufallszahl X abgleichen. Ist das Umwandeln des Inputs in einen arithmetischen Wert nicht möglich, wird es kompliziert, da du dann die Eingabe „parsen“, d.h. Zeichen für Zeichen auswerten und ausrechnen musst.

Wenn du an der Stelle nicht weiter kommst, würde ich empfehlen, noch einmal jemanden im Forum zu fragen, der sich dort besser auskennt. Die Frage wäre dann etwa „Wie kann ich eine arithmetische Eingabe wie ‚8+4‘ in eine Zahl umwandeln?“

Natürlich müsste dein Programm auch testen, ob der Spieler überhaupt eine gültige Eingabe gemacht hat. Sonst gibt der Spieler bspw. 70 + 2 ein und hat die korrekte Lösung, obwohl das gar nicht seine Würfe waren. Ein solches Auswerten erfordert das bereits erwähnte Parsen der Eingabe, und das ist dann schon etwas aufwendiger. Du musst den String Schritt für Schritt auswerten, die enthaltenen Zahlen extrahieren und abgleichen, dass diese auch den Würfen entsprechen (oder dem Zehnfachen, Hundertfachen etc. der Würfe) und dass sie jeweils nur einmal verwendet werden. Dazu sind zahlreiche Split-String Operationen nötig. Das können dann schnell sehr viele verschachtelte While-Schleifen mit vielen einzelnen If-Schleifen werden.

Ich hoffe, dass ich etwas weiter helfen konnte. Aber die Aufgabe hat schon einen mittleren Umfang, ich schätze mal selbst bei guten Programmierkenntnissen wird man mindestens einen ganzen Tag daran sitzen.

Viele Grüße von Leipzig zurück nach Michendorf
Patrick