Ein Freund hat dieses Puzzle geteilt:
Wie mache ich 21 aus den Zahlen 1, 5, 6, 7?
Sie können die Operationen Addition, Subtraktion, Multiplikation und Division sowie Klammern verwenden. Sie müssen jede Nummer einmal verwenden.
Ich habe es schließlich auf Papier gelöst - zwei Tage später. Kein Zweifel, ein Computer könnte alle Lösungen in einer Sekunde erzwingen.
Wie auch? Ich habe versucht, alle Zeichenketten a.b.c.d
zu erzeugen, die die Zahlen für Buchstaben und Operationen für Punkte einfügen, aber es verfehlte meine Lösung.
Bonusrätsel:
Ein naheliegender Ansatz wäre folgender:
S
von vier Zahlen: S = ( 1, 5, 6, 7 )
a
und b
von S
, entferne sie aus S
a
und b
an und erhalten Sie so eine neue Zahl c
(achten Sie darauf, Division durch Null zu vermeiden und genaue Division zu überprüfen, falls das Problem es erfordert) c
in S
ein und erhalten Sie so S'
S'
anstelle von S
Brute-Force-Verzweigung wird in Schritt 2 (Auswählen von zwei Zahlen) und Schritt 3 (Auswählen von Operationen) durchgeführt. Der Zyklus sollte wiederholt werden, bis sich S
auf nur 1 Element reduziert, was das Ergebnis für diesen speziellen Brute-Force-Zweig ist.
Klammern werden nicht explizit verwendet, aber sie sind implizit vorhanden.
Wenn eine Verzweigung mit 21
in S
endet, haben Sie eine Lösung, an der Sie entweder verzweigen oder die Verzweigung fortsetzen können, um nach anderen Lösungen zu suchen.
Hier ist der Algorithmus "pop two, combine, recurse" wie von AnT vorgeschlagen, in Python kodiert. Der schwierigste Teil war das Zusammenstellen der Ausdrücke nach der Rekursion. Ich habe Suchen und Ersetzen verwendet.
%Vor%Lösungen für die drei Rätsel:
%Vor%(Das dritte Puzzle ist unmöglich)