Liebe Freundinnen und Freunde der Unterhaltungsarithmetik,
1/2 + 3 * 4 * 7 + 8 + 5 * 9/6 = 100 oder
2 * 5 * 6 * 7/4 - 8 + 9/3 = 100
sind auch nicht im Getippsel enthalten. Es gibt eine einfache Zahlenpumpe
Clear[zahlenPumpe]; (* Zahlenpumpe ohne Klammern *)
zahlenPumpe[Z_Integer , nov_Integer] :=
Module[{lZ, l, lR = {}, i, j, k, o, p, r},
lZ = {Subscript[x, 1], Subscript[x, 2], Subscript[x, 3], Subscript[
x, 4], Subscript[x, 5], Subscript[x, 6], Subscript[x, 7],
Subscript[x, 8], Subscript[x, 9]};
For[i = 0, i < nov, i++,
l = lZ;
r = 0;
o = 0;
While[Length[l] > 0,
j = RandomInteger[{1, Length[l]}];
(* exclude for search efficiency division by 1 and \
multiplication by 1 *)
k = If[Length[l] == Length[lZ] ||
StringMatchQ[ToString[l[[j]]], ToString[lZ[[1]]]],
RandomInteger[{1, 2}], RandomInteger[{1, 4}]];
o = Which[k == 1, o + l[[j]], k == 2, o - l[[j]], k == 3,
o /. p -> p l[[j]], k == 4, o /. p -> p/l[[j]]];
If[r = (o /. Thread[Rule[lZ, Range[1, Length[lZ]]]]); r == Z,
Break[]];
p = l[[j]];
l = Drop[l, {j}];
];
(* Print[i, ": ", o, ", ", r]; *)
If[r == Z,
AppendTo[lR, o]
]
];
(* Print["Lösungen auf " <> ToString[Z] <> ": ", Length[Union[
lR]]]; *)
Union[lR] (* is this an arithmetical Union *)
] /; nov > 0
die noch dazu die Division durch 1 oder die Multiplikation mit 1
unterdrückt (um ein solches Glied kann man letztendlich allen Lösungen
erweitern, die keine 1 enthalten (und damit weitere Lösungen erzeugen)).
Wenn man die Zahlenpumpe simpel (und ineffizient) laufen lässt, um
Anschauungsmaterial zu gewinnen für einen vernünftigen Algorithmus und die
Vorstellung verwendet, dass man aufhören will, wenn ein Durchlauf von 100
000 Versuchen keine weiteren Ergebnisse bringt,
(* Run until a big shot does not deliver new instances.
If a shot runs empty, the While stops in error!
If it nothing new, completeness is not ensured *)
a = {}; c = {}; n = 0;
While[c = Union[a, zahlenPumpe[100, 100000]]; c != a,
a = c;
Print["Run: ", n++, " LengthU: ", Length[a]];
];
a
dann erlebt man eine Überraschung: nach 191 Durchläufen hat der
Formalismus 3771 Lösungen gefunden und immer noch nicht gehalten:
Run: 0 LengthU: 111
Run: 1 LengthU: 181
Run: 2 LengthU: 255
Run: 3 LengthU: 325
Run: 4 LengthU: 378
Run: 5 LengthU: 451
<snip>
Run: 182 LengthU: 3706
Run: 183 LengthU: 3715
Run: 184 LengthU: 3721
Run: 185 LengthU: 3730
Run: 186 LengthU: 3736
Run: 187 LengthU: 3741
Run: 188 LengthU: 3750
Run: 189 LengthU: 3754
Run: 190 LengthU: 3766
Run: 191 LengthU: 3771
$Aborted
dann wurde abgebrochen, um über die Effizienz nachzudenken. Jedenfalls, um
die Aufgabe behandelbar zu halten, sollten nur Lösungen in Betracht
gezogen werden, die nach einer Anwendung von Union[] erhalten bleiben. Das
folgende Beispiel enthält also nur 2 verschiedene Ausdrücke:
In[1]:= Union[{x1 + x2 + x3, x2 + x1 + x3, x2 * x3 + x1,
x1 + x3 * x2}]
Out[1]= {x1 + x2 + x3, x1 + x2 x3}
Union[] beachtet die Rechenregeln und stellt eine kanonische
lexikographische Ordnung her, trotzdem gibt es anscheinend mindestens 3771
Lösungen.
Da man das Klammerverbot hat (Bedingung (iii)) könnte ein sinnvoller
Algorithmus darin bestehen, die Addition bzw. Subtraktion als Trennzeichen
zu verwenden und den verbleibenden Termen, die dann Produkte und
Quotienten sind, mit Faktorisierungen zu Leibe zu rücken - mit anderen
Worten, mit der Verteilung der Strichrechnung die Zahlen und die
Punktrechnung zu steuern.
Gruss
Udo.
On Mon, 10 Mar 2008 17:10:30 +0100, Stefan Welke <spwelke@XXXXXXX.com> wrote:
petsie@XXXXXXX.de wrote:
Das kann doch geradewegs getippselt werden:
In[1]:=
test[n_]:=Block[{ziffern=Subsets[ToString/@Range[9],{n}],
operatoren=Tuples[{"+","-","*","/"},n-1]},
Select[
Flatten[Outer[StringJoin@@Flatten[{Transpose[{Most[#1],#2}],Last[#1]}]&,
ziffern,operatoren,1]],ToExpression[#]==100&]]
In[2]:=
Union@Flatten[test/@Range[3,9]]
Out[2]=
{"1*2+3*4+5*6+7*8", "1-2*3+4*5*6*7/8",
"1-2*3+4*5*6-7-8", "1+2*3*4*5-6-7-8",
"1*2*3*4+5+6-7+8*9", "1*2*3*4+5+6+7*8+9",
"1*2*3-4*5+6*7+8*9", "1*2*3+4+5+6+7+8*9",
"1-2*3-4-5+6*7+8*9", "1-2*3-4+5*6+7+8*9",
"1-2*3+4*5+6+7+8*9", "1-2+3*4*5-6+7*8-9",
"1-2+3*4*5+6*7+8-9", "1+2*3*4*5/6+7+8*9",
"1+2*3+4*5-6+7+8*9", "1+2-3*4-5+6*7+8*9",
"1+2-3*4+5*6+7+8*9", "1+2+3-4*5+6*7+8*9",
"1+2+3+4+5+6+7+8*9", "1-2-3+4*5*6-7-9",
"1-2+3-4+5*6+8*9", "1-2+3+4*5+6+8*9",
"1+2*3*4*5*6/8+9", "1*2*3*4/6*7+8*9",
"1+2+3*4+6+7+8*9", "1/2/3*4*6*7+8*9",
"1-2+3*4*7+8+9", "1+2-3+4*7+8*9",
"1+2+3*5*6+7", "1*2+3*5*6+7-8+9",
"1*2+3+5*6-7+8*9", "1*2+3+5*6+7*8+9",
"1+2/3*5*6+7+8*9", "1+2*3*5+6+7*9",
"1+2*3+5*6+7*9", "1*2+3*5*6+8",
"1+2+3*5*7-8", "1*2/3*6*7+8*9",
"1+2+3*6+7+8*9", "1+2*3*6+7*9",
"1+2*4*5-6-7+8*9", "1+2*4*5-6+7*8+9",
"1+2*4*5+6*7+8+9", "1+2+4+5*6+7*9",
"1*2-4+5*6+8*9", "1*2+4*5+6+8*9",
"1-2*4+5*7+8*9", "1+3+4*5*6*7/8-9",
"1+3+4*5*6-7-8-9", "1*3+4+5*6+7*9",
"1+3*4*5+6*8-9", "1+3+4*6*7-8*9",
"1+3+4*6+8*9", "1*3*5*6-7+8+9",
"1*3*5+6+7+8*9", "1-3*5+6*7+8*9",
"1-3+5*6+8*9", "1+3*5*6+9",
"1+4+5*6-7+8*9", "1+4+5*6+7*8+9",
"1+4*5+7+8*9", "1*4*7+8*9",
"2+3*4+5*6+7*8", "2*3*4+5+6-7+8*9",
"2*3*4+5+6+7*8+9", "2*3-4*5+6*7+8*9",
"2*3+4+5+6+7+8*9", "2*3*4/6*7+8*9",
"2+3*5*6+7-8+9", "2+3+5*6-7+8*9",
"2+3+5*6+7*8+9", "2+3*5*6+8",
"2/3*6*7+8*9", "2-4+5*6+8*9",
"2+4*5+6+8*9", "3+4+5*6+7*9",
"3*5*6-7+8+9", "3*5+6+7+8*9", "4*7+8*9"}
In[3]:=
Length@%
Out[3]=
79
viele Grüße,
Peter
Udo und Susanne Krause schrieb:
Liebe Freundinnen und Freunde der Unterhaltungsarithmetik,
man gebe alle Kombinationen aus den neun Ziffern 1, 2, 3, 4, 5, 6, 7,
8, 9
und den vier Grundrechenarten (Addition, Multiplikation, Subtraktion,
Division) an, die unter folgenden Bedingungen 100 ergeben:
(i) jede Ziffer kommt höchstens einmal vor
(ii) die Operatoren können mehrfach vorkommen in einer Lösung
(iii) Klammern werden nicht gesetzt
(iv) nicht alle Operatoren kommen in jeder Lösung vor,
beispielsweise 4 * 7 + 8 * 9 = 100
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 * 9 = 100.
Gruss und Dank an M. Engelskirchen für die Anregung
Udo.
Hallo,
ich vermisse aber einige Lösungen aus der Menge mit vier Zahlen
{"4+2*6*8", "4+2*8*6", "4+6*2*8", "4+6*8*2", "4+8*2*6", "4+8*6*2", \
"4*7+8*9", "4*7+9*8", "7*4+8*9", "7*4+9*8", "8*9+4*7", "8*9+7*4", \
"9*8+4*7", "9*8+7*4", "2*6*8+4", "2*8*6+4", "6*2*8+4", "6*8*2+4", \
"8*2*6+4", "8*6*2+4", "2*6*9-8", "2*9*6-8", "3*4*9-8", "3*9*4-8", \
"4*3*9-8", "4*9*3-8", "6*2*9-8", "6*9*2-8", "9*2*6-8", "9*3*4-8", \
"9*4*3-8", "9*6*2-8"},
wovon einige Doppelungen entbehrlich sind.
MfG
Stefan Welke
--
Using Opera's revolutionary e-mail client: http://www.opera.com/mail/