Mein lieber Kollege Aron stellte mir eine trügerisch simpel klingende mathematische Aufgabe:

Man hat die Zahlen 1, 3, 4, 6 zur Verfügung.

Erstelle eine Gleichung, in der jede dieser Zahlen genau einmal vorkommt und das Ergebnis 24 ist.

Dabei können beliebig oft die Rechenoperationen Addieren, Subtrahieren, Multiplizieren und Dividieren, sowie beliebige Klammersetzung verwendet werden.

Er warnte mich vor, dass es gar nicht so einfach wäre – und da ich im Gegensatz zu ihm kein Mathematiker bin, musste ich auch recht bald aufgeben. Zu viele Kombinationen!
Aber wozu gibt es Maschinen? Denn wenn ich schon nicht rechnen kann, dann wenigstens delegieren ?
Wir haben es mit vier Zahlen zu tun, dazwischen drei Rechenoperationen und mögliche Klammern (ich bin im ersten Schritt übrigens von keiner verschachtelten Klammerung ausgegangen – wir werden sehen, dass wir dies auch nicht benötigen).

D.h die möglichen Kombinationen sehen so aus:

Stelle 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Objekt ( x ) o ( x ) o ( x ) o ( x )
Kombinationen 3 4 3 4 3 3 3 4 3 2 3 4 3 1 3 10.077.696

Hierbei steht „x“ für eine der vier Zahlen und „o“ für eine Rechenoperation. Aus dem Produkt der Kombinationen ergibt sich eine recht hohe Zahl – allerdings sind in diesem einfachen Modell auch unnötige und sogar fehlerhafte Klammerungen nicht herausgerechnet, da es so einfacher ist zu modellieren und das System uns die Fehler herausfischt.

Meine Idee ist es nun, die Kombinationen in entsprechend vielen verschachtelten Schleifen alle durchzugehen und aus den Ergebnissen eine Formel zu bauen, die dann probeweise ausgeführt wird. Wenn das Ergebnis keinen Syntaxfehler enthält (wegen der erwähnten Klammerung) und die Zahl 24 ergibt, wird es am Bildschirm ausgegeben.
Hierbei werden mehrere identische Ergebnisse ermittelt, die sich nur in der Reihenfolge unterscheiden, da natürlich Kommutativgesetz und Assoziativgesetz gelten. Aber auch dies sei in dieser einfachen Rechnung mal akzeptiert.
Die eigentliche Lösung lässt sich in vielen Sprachen umsetzen – ich habe mich für Tcl in Verbindung mit dem Cubeware Importer entschieden – einerseits, weil ich da drin fit bin, andererseits besitzt Tcl den großen Vorteil, dass man dort Strings, als Funktionen ausführen kann. D.h. wie geplant baue ich mir einen Formel-String zusammen und kann ihn dann ausführen und vom System direkt auch auf mögliche Fehler testen.

Ich arbeite mit drei Listen (vier Zahlen, vier Operationen, drei Klammermöglichkeiten) und bilde von allen quasi das Kreuzprodukt. Weiterhin sorge ich dafür, dass jede Zahl nur einmal vorkommt. Der String wird dann aus den Variablen zusammengebaut und mit dem praktischen Kommando „subst“ als Formel ausgeführt. Dabei muss wie in Tcl nötig das Kommando „expr“ davor geschrieben werden. Außerdem sind die Zahlen als Kommazahl formatiert, da sonst Tcl bei der Division nur ganze Zahlen als Ergebnis ausgibt. (1 durch 4 wäre dann z.B. 0). Die Prüfung auf Fehler ist mit „catch“ möglich.
Der Code dafür sieht folgendermaßen aus (nicht einschüchtern lassen von den vielen Schleifen, die eigentliche Arbeit ist sehr überschaubar…).

Nach weniger als sechs Minuten sind über 10 Millionen Kombinationen durch (!) und wir erhalten das Resultat.

Wenn Sie gerade Zeit haben, versuchen Sie sich doch auch mal an der Lösung. Es ist im Kopf möglich!

 

Und für alle die es nicht mehr erwarten können:

Wie bereits oben erwähnt sind hierbei unnötige Klammerungen zur Einfachheit nicht herausgefiltert worden, sodass es nur ein sinnvolles Resultat ergibt:

Die Lösung ist also 6 / (1 – 3/4) – oder schöner als Bruch: