DMUG-Archiv 2008

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Aufgabe::Gib mir Hundert

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/


Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html