![]() |
Lösungsweg für Denkaufgabe
Moin moin,
bei folgender Aufgabe sind die Operatoren zwischen den Zahlen so zu setzen, dass sich eine mathematisch korrekte Lösung ergibt:
Code:
Die Lösung ist mir bekannt. Ich habe sie durch durchprobieren rausgefunden.
7 5 3 8 4 = 31
Meine Frage ist nun, gibt es hier oder besser allgemein für diese Art von Aufgaben einen Algorithmus um auf die Lösung zu kommen? |
AW: Lösungsweg für Denkaufgabe
"brute force" wäre ein Ansatz. aka "alles durchprobieren"
|
AW: Lösungsweg für Denkaufgabe
Mit der Aufgabe hat mich mal mein Kollege eines morgens überrascht. Er hat nur 3,5 Minuten dafür gebraucht, hielt sich deshalb für klug. Ich habe 30 Sekunden gebraucht. Und was habe ich davon? Er hat heute meinen Job :stupid:
|
AW: Lösungsweg für Denkaufgabe
Ja Bruteforce! Und ich würde es NICHT mit Delphi machen sondern mit Prolog.
|
AW: Lösungsweg für Denkaufgabe
Hm schade, ich war der Meinung, dass es hierbei einen mathemetischen "Trick" gibt.
|
AW: Lösungsweg für Denkaufgabe
[OT]
Ist 9live nicht Pleite gegangen? [/OT] |
AW: Lösungsweg für Denkaufgabe
Zitat:
Ist natürlich auch etwas Glück dabei gleich am Anfang schon mal richtig gelegen zu haben. |
AW: Lösungsweg für Denkaufgabe
Zitat:
|
AW: Lösungsweg für Denkaufgabe
Um sich das Problem genauer anzuschauen, fehlen einige Informationen:
Das Problem sieht imho (<- hab aber keine Ahnung) schwer aus, vielleicht schafft es ja jemand zu zeigen, das es NP-vollständig ist (oder eben nicht) :wink: |
AW: Lösungsweg für Denkaufgabe
Zitat:
Zitat:
Zitat:
|
AW: Lösungsweg für Denkaufgabe
Zitat:
Zwei oder mehr gleiche Operatoren hintereinander würde ich als unwahrscheinlich bezeichnen. Die Reihenfolge wie ein Operator getestet wird hängt also vom Vorgängeroperator ab.
Delphi-Quellcode:
Ausserdem kann man Divisionen ausschliesen bei denen ein ganzzahliger Rest übrigbleiben würde.
function CalcNextOperators(previousOp:char):string;
begin case preOp of '+': Result := '-*/+'; '-': Result := '+*/-'; '*': Result := '+-/*'; '/': Result := '+-*/; else Result := '+-*/'; end; end; Jede Division, die man ausschliesen kann, reduziert die Anzahl der Tests um den Faktor 3/4. Bei deinem Beispiel wäre nur 8 /4 möglich; also kann man 3 Divisionen ausschliesen. |
AW: Lösungsweg für Denkaufgabe
Einfach geht nicht, trotz Brute Force, denn das kleine Beispiel ist zwar ok, beachtet aber kein Punkt vor Strich. Deshalb führt es nicht zum Erfolg. Letztendlich kommt man um einem Mathparser der die Komplettformel richtig berechnet nicht herum.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
function r(x, y: Double; z: Char): Double; begin case z of '+': Result := x + y; '-': Result := x - y; '*': Result := x * y; '/': Result := x / y; else Result := x; end; end; const o = '+-*/'; var a, b, c, d: Char; begin repeat a := o[Random(4) + 1]; b := o[Random(4) + 1]; c := o[Random(4) + 1]; d := o[Random(4) + 1]; until r(r(r(r(7, 5, a), 3, b), 8, c), 4, d) = 31; ShowMessage(a+b+c+d); end; //7 5 3 8 4 = 31 |
AW: Lösungsweg für Denkaufgabe
Mir würde da eine Systematik anstatt des <Random> besser gefallen ;-)
|
AW: Lösungsweg für Denkaufgabe
a.) ist letztendlich egal, denn irgendwann kommt alles dran
b.) wäre mehr Schreibarbeit im Quellcode gewesen ;) |
AW: Lösungsweg für Denkaufgabe
Zitat:
Prolog auch nicht, mMn. Lösung in Python, hat ca. 2 Minuten gedauert.
Code:
Liebe Grüße,
e = 31
s = ["7.0", "5.0", "3.0", "8.0", "4.0"] o = [" + ", " - ", " * ", " / "] for a in o: for b in o: for c in o: for d in o: t = s[0] + a + s[1] + b + s[2] + c + s[3] + d + s[4] if eval(t) == e: print t.replace(".0", "") + " = " + str(e) Valentin |
AW: Lösungsweg für Denkaufgabe
Zitat:
Zitat:
Zitat:
Wenn du hart drauf bist, dann kannst'e es auch gerne mit Potenzen und Wurzeln rumspielen und noch ein zusätzliches - (negieren) der Werte Zitat:
Und da nur die Operatoren fehlen, sind alle Klammern vorhanden, bzw. es gibt keine. Theoretisch müßte man doch den Formelparser der neuen XE2-LiveBindings nutzen können? |
AW: Lösungsweg für Denkaufgabe
Liste der Anhänge anzeigen (Anzahl: 1)
Ich hab mal was zusammengefrickelt.
Etwas umständlich das Ganze, weil ich den größten Teil aus einem Parserprogramm übernommen habe. Es scheint aber zu funktionieren und auch mit angemessener Laufzeit. Wie gehts? 1) In das Editfeld die Aufgabe eingeben, wie in #1 gezeigt, also z.B. 7 5 3 8 4 = 31 2) Start klicken. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz