Qbasic - "Herausforderungsfrage"

Hallo Jonas,

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.

Hallo Josef,

habe ich die Spielregeln so rchtig verstanden, dass ich jeden Würfel auch mehrmals nehmen kann, so wie im Beispiel. Muss ich jeden Würfel mindestens einmal verwenden?

Also mit der Bedingung, jeden Würfel genau einmal zu verwenden, wäre die Aufgabe recht einfach machbar.
Mit der Möglichkeit, einen Würfel mehrmals zu nehen, sieht das alles etwas komplizierter aus. Habe da auch schon ne Idee, die ich aber erstmal selbst durchproberiern will. Werde mich aber nochmal melden, sobald ich dazu genaueres sagen kann.

Nebenbei möchte ich noch erwähnen, dass ich, da ich nun Win7 64bit verwende auf FreeBasic umgestiegen bin. Es ist sehr ähnlich zu QBasic, hat aber ein erheblich größeren Funktionsumfabg und ist auch besser mit den Windowseigenen Funktionen komnpatiebel. Ich werde mein Versuch mal in FreeBasic programmieren.

Liebe Grüße
Jonas

qbasic - Herausforderungsfrage
Hallo Jonas,

schade, schade, dass Du sicherlich nicht in der Brliner Ecke wohnst, sonst hätte ich Dich spontan zu einem Bier oder Abendessen eingeladen! - Denn nach den vielen Jahrzehnten, als damals BASIC, COBOL und FORTRAN überhaupt aufkamen, findet „man“ bestimmt ganz, ganz wenige Spezialisten, die in QBasic oder ähnlichen Sprache programmieren!

Zunächst zu dieser Würfelsache. Es handelt sich zwar „nur“ um ein Spiel, doch auch 1997 „spielte“ der damals amtierende Schachweltmeister Kasparow gegen einen IBM - Computer und verlor eine komplette Turnierserie gegen die Maschine, war mental so ko, dass er das Schachspielen aufgab. Und dabei kann man Schach als das „menschlichste“ aller Denkspiele nennen, da logisches, strategisches Denken eigentlich nur Menschen vorbehalten sein sollte. Doch die Maschine gewann unbarmherzig.

Da es nicht soooo einfach ist, den Hintergrund meiner Anfrage auf Anhieb zu erklären, mache ich’s mal anders:

Du und ich sitzen nebeneinander. Wir haben einen Würfelbecher und 3 Würfel. Jeder schreibt jeweils 10 beliebige Ziffern zwischen 1 und 100 auf ein Stück Papier. - Wer mit dem Würfeln beginnt, ist unerheblich, ebenso ist es nicht wichtig, ob wir mit Deiner 1. Zahl beginnen oder meinen.

Die von Dir als erste notierte Zahl ist die 48, und Du würfelst (nur ein Mal), und es bleiben die 4, die 5 und die 2 liegen.

Es sind nur die 4 Grundrechenarten erlaubt, mit denen ich auch die „Augen“ der 3 Würfel verbinden darf. Also
4 : 2 = 2 x 5 = 10. Oder 2 x 4 = 8 * 5 = 40. Lediglich Divisionen mit ungeraden Resultaten sind verboten, somit 5 : 2.

Was lediglich erlaubt ist, und dann sind wir schon am Schluss angelangt: aus der „Augenzahl“ 4 kann ich 40 oder 400 machen (weitere zusätzliche wären zwar erlaubt, doch die durch das Würfeln zu erreichende Zahl soll ja zwischen 1 und 100 liegen, somit würden Multiplikationen im Bereich von „Tausend“ zu keinem Ergebnis führen.
Wäre also die Zahl, der man am nähesten kommen soll, etwa 98, so:

5*100 = 500
minus
4*100 = 100
minus 2 = 98.

So, nun „kämpfen“ wir gegeneinander!

Vor uns liegen also 3 Würfel mit „4“, „5“ und der „2“, und durch egal welche mathematischen Kombinationen
versuchen Du und ich, so nahe an die „48“ zu gelangen oder gar diese Zahl zu erreichen. Eben nur als Beispiel.

Du überlegst, ich auch. Dann tauschen wir die Ergebnisse aus: Du sagst, Du erreichst 46, ich komme nur auf 52. Somit bist Du 2 Punkte näher an der 48 als ich mit meinen 52. „Guthaben“ für Dich von 2 Punkten.

Wir machen 20 solcher Runden (also Deine 10 notierten Zahlen und meine) und addieren dann. Wer weniger Abweichungen hat, ist Sieger, da derjenige im Schnitt stets näher am „Ziel“ war als der andere.

Dieses simple Spiel mit 3 Würfeln erscheint beim ersten Betrachten irgendwie kindisch oder reizlos. Doch spielten meine Frau und ich das am vergangenen Samstag über ca. 2 Std., und danach rauchten die Köpfe, denn jeder versuchte natürlich, durch andere mathematische Kombinationen, an die zu erreichende Zahl zu kommen, und die Lösungsmöglichkeiten waren echt irre!!!

Was eben wohl erschwerend ist: die Tatsache, dass aus einer gewürfelten „2“ eine „20“ oder maximal „200“ gemacht werden kann. Sonst gäbe es bei den Würfeln
1, 4 und 6 ja keinerlei Chance, die zufällig auf dem Zettel stehende Zahl „98“ zu erreichen!

Das PROGRAMM als solches soll nun ermitteln, ob es neben Deiner und meiner Lösung, die beide 4 bzw. 6 Punkte von der „Zielzahl“ abwichen, eine mathematische Möglichkeit gegeben hätte, noch dichter an die Ziel - Punktezahl ranzukommen oder diese gar perfekt zu erreichen.

Soweit zum Thema „Würfel“.

Dann begegnete mir in Sachen Qbasic ein Phänomen, das Du ja selbst angeschnitten hast: mein QBasic - Compiler aus 1990 (damals DM 2.200 + MwSt.) macht auf meinem Rechner (Win 7 32 Bit) lauffähige Programme. Meine Frau hat jedoch Windows 7 64 Bit, und so gerne ich ihr das eine oder andere Programm geschrieben hätte: wir haben nun mal 2 Rechner, und es bringt nichts wenn „ihre“ Programme auf meinem PC laufen, während ihr Laptop Compatibilitätsproblem meldet, also nicht damit vor Ort arbeiten kann. - Das jedoch eine andere Sache.

Nur im Vorab eine Frage, wenn ich darf: würde ein anderer für WIN 7 / 64 Bit konzipierter Compiler die Originalsprache von Qbasic „verstehen“, akzeptieren, oder müsste ich total umdenken, auch wenn sich beide „Basic - Dialekte“ offensichtlich sehr ähneln?

Herzlichen Gruß von

Josef

Hallo Josef,

ja, die Sprache QBasic ist leider schon so gut wie ausgestorben.

FreeBasic ist sehr ähnlich zu QBasic. Die Befehle sind nahezu identisch. er größte unterschied besteht darin, dass Du alle Variablen immer erst als solche Deklarieren musst, was in QBasic ja nicht nötig war.
Also ich habe mir FreeBasic nur mithilfe von dem Wissen über QBasic und der Homepage von Freebasic recht schnell angeeignet. Was leider nicht ganz so einfach möglich ist, wäre ein alten qbasic-code 1zu1 in FreeBasic zu übernehmen.

Also das mit dem Würfelspiel werde ich mal versuchen…

Liebe Grüße
Jonas

Hallo Josef,

Dein Problem ließ mir grad keine Ruhe.

Also ich habe mal nen kleines Programm geschrieben.
Die fertige Exe kannst Du unter „http://dl.dropbox.com/u/53242457/Wurfel/Wurfel.exe“ herunterladen.

Ich hoffe, das Programm entspricht so ungefähr Deinen Vortsellnungen.

So bald ich etwas Zeit habe, kenn ich Dir auch gerne den Code dazu erklären.

Liebe Grüße
Jonas

qbasic - Herausforderungsfrage
Hi Jonas,

danke für Deine Mail mit Programm!

Wir kennen uns ja nicht, aber in einem Punkt sind wir uns sehr ähnlich: wenn ein Problem lösbar erscheint, geben wir keine Ruhe bevor es nicht geschafft ist. ;.-))

Zunächst: wäre es möglich, statt „nächste Zahl ist …“ die vom Programm ermittelte Zahl einzublenden? - Also statt (bei Ziel 44)und einer Abweichung von 2 entweder
42 oder 46 aufführen?

Nun kommt aber der schwierigste Teil: wie erwähnt, sitzen wir uns gegenüber, jeder von uns beiden hat zunächst je 10 zufällige Zahlen zwischen 1 und 100 auf einem Zettel notiert, und nun geht es darum, durch mathematisches Denken bei zwei Rechenoperationen am nähesten an die „Zielzahl“ heranzukommen.

ABER:

abwechselnd w ü r f e l n wir ja.

So können die 5, die 3 und die 4 auf dem Tisch liegen.

Die Zielzahl ist 23.

Hier sehe ich 2 Lösungsmöglichkeiten, eine exakt, eine etwas von der „23“ entfernt:

5*4 = 20 +3 = 23 und dann

50 - 30 = 20 + 4 = 24 (es ist ja erlaubt, an jede Würfelzahl eine anzuhängen, auf Wunsch auch 2 Nullen.

(Vielleicht gibt es noch eine weitere Möglichkeit(en) außer 5*4+3 genau die 23 zu erreichen, doch das soll eben das Programm herausfinden).

Das Programm soll nun durch die Eingaben

Zielzahl?

Zahl Würfel 1?
Zahl Würfel 2?
Zahl Würfel 3?

unter der Berücksichtigung der 4 Grundrechenarten (Division nur dann wenn das Ergebnis eine gerade Zahl ergibt) und der Möglichkeit der Hinzufügung einer oder 2 „Nullen“ pro Würfelauge die Zahl herausfinden, die bei der Vorgabe dieser 4 Eingaben der Zielzahl am nähesten kommt oder identisch ist.

So dürfte es bei der notierten „94“ und bei den
gewürfelten
1
2
6

nur folgende Möglichkeit geben:

200 - 100 = 100 - 6 = 94

Und eben die zufällige Vorgabe von 3 „Würfelaufgaben“
als auch das mögliche Hinzufügen von einer oder 2 „Nullen“ pro Augenwert machen das Ganze so tricky!!

Ich hab nicht die geringste Ahnung, ob Du Lust hast, das Ganze auf dieser Basis zu versuchen bzw. ob Dir eine generelle Lösung vorschwebt.

Schönen Gruß aus „Klein - Sibirien“ von

Josef

Hallo Josef,

also Dein erster Wunsch, dass die tatsächlich gefundene Zahl angezeigt wird, hatte ich so eigentlich auch geplant. War nur nen kleiner Tipfehler, weshalb ne falsche Variable angezeigt wurde. Habe ich aber nun behoben und unter dem alten Link hoch geladen.

Nun verstehe ich Dein 2tes Problem/Wunsch nicht so ganz.

  • Willst Du die Würfelzahlen selbst eingeben, anstatt sie von dem PC zu „erwürfeln“?

  • Wenn eine richtige Lösung gefunden wurde, soll das Programm die anzahl aller möglichkeiten angeben?

  • Das Programm soll alle Möglichkeiten anzeigen?

  • Im Moment rechnet das Program mit bis zu 5 Nullen. Es bricht aber die Suche ab, sobald es eine exakte Lösung gefunden hat.

Allso kannst Du mir bitte nochmal genau erklären, was das Programm können soll…

Liebe Grüße aus dem (totzdem kalten) Süden,
Jonas

Hallo Josef,

ich hab mein Programm mal überarbeitet.

Es hatte einige Fehler in der Berechnung.
Nun habe ich diese alle korrigiert und via eines Kontrollprogrammes auch überprüft. Sollte also jetz alles Stimmen.

Das Programm läuft jetzt wie folgt ab:

Eingabe der Zielzahl:
automatische ermittlung von 3 Zufälligen Würfelzahlen
— klick —
ermittlung der Lösungen
Anzeige, ob das Ziel erreicht wurde, bzw die nächste Zahl
Anzeige der gefundenen Lösungen
— klick —
Anzeige aller Lösungen
— klick —
ENDE

ich hoffe, so ein Stuck näher an Dein Wunschprogramm gekommen zu sein.

Liebe Grüße
Jonas

das neue Programm ist noch immer unter dem Link erreichbar

http://dl.dropbox.com/u/53242457/Wurfel/Wurfel.exe

Hallo Jonas,

leider rechnet die Formel nicht korrekt. Ich hab mal 2 Hardcopies gemacht, die ich jedoch nicht hier an die Antwort anhängen kann.

Zielzahl 67

4
6
3

Ziel erreicht durch

(10/400) + 3

Fall Nr. 2:

Zielzahl 55

1
4
6

Ziel erreicht durch

(6-1)-40

und

(6-4)-10

Solltest Du weiterhin Lust haben Dich hier nochmals zu versuchen, dann entspräche es der Realität des Spielablaufs wenn Du statt Randomize 3 Zufalls - Würfelzahlen ermitteln lasst, den Spielern ermöglichen könntest, diese selbst gewürfelten Zahlen direkt einzugeben.

Tschüss

Josef

Hallp Josef,

die Würfeleingabe habe ich jetzt wahlweiße gestaltet. Einfach eine Würfelzahl eingeben, oder nichts eingeben, dann generiert das System eine Zahl.

Die falschen Lösungen waren nur indirekt falsch. Die Interne Rechnung hat gestimmt. Ich habe bei der Ausgabe in Textform ein Fehler bei der Anzeige der „Zusatznullen“ gemacht. Danke, dass es jetzt besser sein sollte.

Liebe Grüße
Jonas

Hallo und Danke für Deine Mail!

bist Du noch so nett und schickst mir den Downloadlink?

Die ganze Sache war ziemlich kompliziert, nicht?

Lieben Gruß von

Josef, … der sich erst mal durch den Schnee kämpfen muss.

Hallo Josef,

der Link ist

http://dl.dropbox.com/u/53242457/Wurfel/Wurfel.exe

Lieb eGrüße
Jonas

Schönen guten Abend!

Hast Du in Deinem Ahnenkreis etwa Albert Einstein? - Das Programm ist nun perfekt, und damals war die „Rezepturoptimierung“ für das Wurstbrät (lineare Optimierung nach dem Simplex - Verfahren) für mich schon eine enorme Herausforderung. Das Wurstbrät kostet meinetwegen für Wiener € 2,45. Die Wurst jedoch wird für z.B. € 12,00 verkauft. Somit waren (als ich diese Software für Fleischereien entwickelte und vertrieb, zwischen 1989 - 2002 etwa) jede „5 Pfennige“, die man an der Wurstmasse sparen konnte, ein unglaublicher Multiplikator für den Endpreis.
Und für jede Wurstkategorie gibt es 2 Minimal- und 2 Maximalwerte, die nicht unter- bzw. überschritten werden durften. Dazu kamen die Faktoren „Eis“, also Fremdwasser, und Produktionsverlust durch Brühen, Kochen, Räuchern.

Ich brauchte für diese Formel etwa 1/2 Jahr.
Für dieses „Würfelprogramm“, das meine Frau und ich neben „Scrabble“ an jedem Wochenende spielen, hätte ich programmiertechnisch keinerlei Lösungsansatz gefunden.

Eine wirklich klitzekleine Bitte vielleicht noch?
Wäre es möglich, am Programmende das BASIC - „RUN“ einzufügen, so dass es sich wieder aufruft, man es nicht stets neu starten muss?

Und noch eine Frage, wenn Du möchtest: was mich ärgert: ich schrieb unter GW - Basic für meine Frau ein Programm, das auf ihrem Laptop laufen sollte. Ich habe auf meinem PC WIN 7 32 Bit, sie WIN 7 64 Bit, und trotz aller versuchten Optionen bezüglich Kompatibilität läuft es in der 64-Bit-Version nicht, noch kann ich den Compiler zum Laufen bringen.

Auch wenn es sich um DOS - Programme handelt, ich dachte bis eben jetzt, Maschinensprache ist Maschinensprache, und meine Programme laufen ja bei einigen Fleischern nach wie vor unter WIN der verschiedensten Versionen.

Dir ein schönes Wochenende. Solltest Du Fleischereien in Deiner Bekanntschaft oder Verwandtschaft haben, lass mich dies bitte wissen. Bekämst die komplette Software kostenlos.

CU von

Josef

Hallo Josef,

ich habe nie mit GW-Basic gearbeitet, sondern nur mit Q(uick)-Basic.
Und da hatt ich eben auch das Problem von Win 64bit. Es ist so, dass Win32bit auch 16bit Programme verabrbeiten kann (z.B. Q-Basic). Win 64bit kann programme nur an 32Bit verarbeitet. Dabei ist es total egal, welches Windos Du verwendest (Win7, Vista, XP…)
Daher musste ich (und ich bereuhe es nicht) auf FreeBasic umsteigen. Das Programm arbeitet vollständig in 32bit und ist somit auch Win64bit kompatibel.

Als alternative gibt es das Programm DOSBox. Damit kannst Du eine 16bit-Umgebung simulieren. Habe es mal kurzzeitig verwendet, war mir aber dann zu umständlich und hatte einige Einschränkungen beim Hardwarezugriff. Wie genau das Programm funktioniertm kann ich Dir aber leider nicht mehr sagen. War aber recht umständlich, bis es gelaufen ist.

Liebe Gr+üße
Jonas