|
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. |