Da Roman und Rolf bereits zwei schoene Loesungsvorschlaege fuer das
"Eve did talk"-Problem unterbreitet haben, moechte ich nicht nachstehen und
nun auch meine Idee einreichen. Da Rolf die Geschwindigkeit als Kriterium
angesprochen hat, habe ich meine Loesung etwas getuned! Ich habe dabei
nochmal fast einen Faktor 2 herausgekitzelt. Ich hoffe, dass das zur
Ehrenrettung Mathematica's gegenueber Maple reicht. :-)
Markus van Almsick
Ansatz:
Ich spiele alle Moeglichkeiten fuer {e,v,d,i} durch.
Dabei beruecksichtige ich den Umstand, dass {e,v,d,i} nicht gleich sein
duerfen. Es gibt 5040 Moeglichkeiten, die ich in einem Array erstelle.
Needs["DiscreteMath`Combinatorica`"];
Map[Permutations, KSubsets[Range[0,9], 4]]
Sodann scanne ich dieses Array nach folgenden Kriterien (= Filter[]):
a) ist e < d? Wenn nicht, waere der Bruch eve/did = 1.talk.....
b) 9999 eve/did = talk gleich eine ganze Zahl.
c) {e,v,d,i,t,a,l,k} sind alle unterschiedlich.
Die Tuple {e,v,d,i}, die den Kriterien (a) - (c) genuegen, schiebe ich in eine
Loesungsmenge.
(Beachte: Ich benutze "reine" Funktionen. d.h.
statt f[x_] := x^2 und f[2] -> 4 schreibe ich
(#^2)&[2] -> 4.
Das bringt noch etwas an Zeitvorteil, da die Funktion f nicht definiert
werden muss.)
Timing[
Loesung = {};
Filter[{e_, v_, d_, i_}] :=
If[
IntegerQ[#],
If[
Length[Union[{e,v,d,i},#]] == 8,
AppendTo[Loesung, {{e,v,e},{d,i,d},#}]
]&[IntegerDigits[#]]
]&[(9999 (101 e + 10 v)) / (101 d + 10 i)] /; e < d ;
Scan[Filter, Map[Permutations, KSubsets[Range[0,9], 4]], {2}];
Loesung
]
{1.46667 Second,
{{{2, 1, 2}, {6, 0, 6}, {3, 4, 9, 8}}, {{2, 4, 2}, {3, 0, 3}, {7, 9, 8, 6}}}
}
---------------------------------------------------------
Max-Planck-Institut fuer Biophysik, Frankfurt am Main
Application Consultant, Wolfram Research Inc.
|