Kräfte vergleichen.

13

Vergleichen Sie zwei Zahlen N 1 = a b c , N 2 = d e f, indem Sie eine Funktion f (a, b, c, d, e, f) konstruieren, die:

  • gibt 1 zurück, wenn N 1 > N 2 ist
  • Gibt -1 zurück, wenn N 1 <N 2 ist

Anmerkung: Sie müssen keinen Wert für eine andere Beziehung zwischen N 1 und N 2 zurückgeben . zB wenn sie gleich sind oder wenn ihre Beziehung undefiniert ist (komplexe Zahlen).

andere Einschränkungen:

  • Alle Zahlen sind ganze Zahlen
  • a, b, c, d, e, f können positiv oder negativ sein, aber nicht Null.
  • | a |, | d | <1000
  • | b |, | c |, | e |, | f | <10 10
  • Laufzeit weniger als einige Sekunden

Beispiele:

f(100,100,100,50,100,100) = 1
f(-100,100,100,50,100,100) = 1
f(-100,99,100,50,100,100) = -1
f(100,-100,-100, -1, 3, 100) = 1
f(535, 10^9, 10^8, 443, 10^9, 10^9) = -1

Das ist Code Golf. Kürzester Code gewinnt.

Eelvex
quelle
3
Was ist, wenn sie gleich sind, sollte es 0 zurückgeben? Oder nehmen Sie an, dass N1 auf keinen Fall N2 entspricht?
Jonathan M Davis
Können wir einige Beispiele für Ein- / Ausgänge bekommen?
Dogbert
@ Jonathan: Ich gebe nicht absichtlich den Fall "Gleich sein" an. Mach was du willst. Sie können sogar davon ausgehen, dass sie niemals gleich sind.
Eelvex,
@Dogbert: fertig.
Eelvex,
| b |, | c |, | e |, | f | <10 ^ 10 scheint Ihrem letzten Beispiel zu widersprechen
Dr. belisarius

Antworten:

3

Mathematica, 110 Zeichen

z[a_,b_,c_,d_,e_,f_]:=With[{g=Sign[a]^(b^c),h=Sign[d]^(e^f)},If[g!=h,g,g*Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]]]
Peter Taylor
quelle
Welche Art von Mathematica verwenden Sie dort und welche magische Beschwörung muss verwendet werden, damit dies tatsächlich funktioniert? Wenn Sie das Obige in Mathematica 8 einfügen, erhalten Sie nur »Syntax :: bktwrn:" z (a_, b_, c_, d_, e_, f_) "steht für Multiplikation; Verwenden Sie "z [a_, b_, c_, d_, e_, f_]", um eine Funktion darzustellen. «und» Syntax :: sntxf: "z (a_" kann nicht gefolgt werden von ", b_, c_, d_, e_, f_ ): = sgn (ln (absa) b ^ c-ln (absd) e ^ f) ".
Joey
Schlägt den Testfall fehl 3,-3,3,-4,1,1, wenn ich mich nicht völlig irre (habe hier kein Mathematica, aber Wolfram Alpha scheint zuzustimmen ).
Ventero
Ok, hab es jetzt zum Laufen gebracht, z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]was aber erheblich länger ist als das, was du da hast. Mir fehlt hier wahrscheinlich etwas.
Joey
@Joey, ich habe eigentlich kein Mathematica, also habe ich mit der Wolfram Alpha-Oberfläche getestet. Es scheint, dass es mit dem, was es akzeptiert, viel großzügiger ist. Na ja - die Priorität ist, dass @Ventero einen Fehler in der Logik richtig anzeigt.
Peter Taylor
Wird es "in weniger als ein paar Sekunden laufen" z[535, 10^9, 10^8, 443, 10^9, 10^9]?
Eelvex
7

Ruby 1.9, 280 227 189 171 Zeichen

z=->a,b,c,d,e,f{l=->a{Math.log a}
u=->a,b{[a.abs,a][b&1]}
a=u[a,b=u[b,c]]
d=u[d,e=u[e,f]]
d*a<0?a<=>d :b*e<0?b<=>e :(l[l[a*q=a<=>0]/l[d*q]]<=>f*l[e*r=b<=>0]-c*l[b*r])*q*r}

Ich weiß, dass dies etwas länger ist als die anderen Lösungen, aber zumindest sollte dieser Ansatz funktionieren, ohne a b c , d e f , b c oder e f zu berechnen .

Bearbeiten:

  • (279 -> 280) Ein Fehler bei a**b**c < 0und wurde behoben d = 1.
  • (280 -> 227) Eine unnötige Prüfung für einen Sonderfall wurde entfernt.
  • (227 -> 192) Einige Überprüfungen, die für die angegebenen Kriterien nicht erforderlich sind, wurden entfernt (Ganzzahlen ungleich Null, keine Ausgabe für komplexe Werte erforderlich).
  • (192 -> 189) Aufgrund aller anderen Prüfungen kann ich sicher berechnen log(log(a)/log(d))statt log(log(a))-log(log(d)).
  • (189 -> 171) Vereinfachte Methode, um äquivalente Probleme ineinander umzuwandeln.

Testfälle:

z[100, 100, 100, 50, 100, 100] == 1
z[-100, 100, 100, 50, 100, 100] == 1
z[-100, 99, 100, 50, 100, 100] == -1
z[100, -100, -100, -1, 3, 100] == 1
z[535, 10**9, 10**8, 443, 10**9, 10**9] == -1
z[-1, -1, 1, 2, 2, 2] == -1
z[1, -5, -9, 2, -1, 2] == -1
z[1, -5, -9, 2, -1, 3] == 1
z[3, -3, 3, -4, 1, 1] == 1
z[-2, 1, 1, 1, 1, 1] == -1
z[1, 1, 1, -1, 1, 1] == 1
z[1, 1, 1, 2, 3, 1] == -1
z[1, 1, 1, 2, -3, 2] == -1
z[1, 1, 1, 2, -3, 1] == 1
z[-1, 1, 1, 1, 1, 1] == -1
z[2, 3, 1, 1, 1, 1] == 1
z[2, -3, 2, 1, 1, 1] == 1
z[2, -3, 1, 1, 1, 1] == -1
Ventero
quelle
1

ShortScript , 89 Bytes

{CP
$M^ η1 η2
$M^ ζ η3
↑Αζ
$M^ η4 η5
$M^ ζ η6
↔α>ζ↑Ζ1
↔α<ζ↑Ζ-1}

Die Implementierung ist nicht genau die beschriebene, aber es funktioniert.

Diese Antwort ist nicht konkurrierend, da ShortScript nach dieser Herausforderung veröffentlicht wurde.

YourDeathIsComing
quelle
0

Python 2.6 (das funktioniert nicht wirklich)

import cmath
g=cmath.log
f=lambda a,b,c,d,e,f:-1+2*((c*g(b)+g(g(a))-f*g(e)-g(g(d))).real>0)

Heute habe ich gelernt, dass Python eine komplexe Log-Funktion hat. also doppelt blind loggen beide seiten und schauen auf die reale komponente. funktioniert für 4 von 5 Tests. Ich bin mir nicht sicher, was mit dem vierten passiert.

print f(100,100,100,50,100,100) == 1
print f(-100,100,100,50,100,100) == 1
print f(-100,99,100,50,100,100) == -1
print f(100,-100,-100, -1, 3, 100) == 1 # failure, sadness.
print f(535, 10^9, 10^8, 443, 10^9, 10^9) == -1
roobs
quelle
Nun, es ist so, dass ich das Beispiel, das falsch ist, durcheinander gebracht habe: / Entschuldigung ... das
Problem zu
Mein Code gibt immer noch -1 für das vierte Beispiel falsch zurück, wenn a = 100
14.
Der Vergleich nur des Realteils ist nicht korrekt.
Eelvex,
Ja, dieser Teil war ein Stich in die Dunkelheit. Dies ist, wo ich das Überspringen dieses Kurses in der komplexen Analyse
bedauere
-1

Python (99)

from math import*
from numpy import*
l=log
def f(a,b,c,d,e,f):return sign(l(a)*l(b)*c-l(d)*l(e)*f)
Hoa Long Tam
quelle
8
Negative scheitern.
JB
-2

Haskell, 44 Zeichen

n True=1
n _=1-2
g a b c d e f=n$a^b^c>d^e^f

Läuft in weniger als einer Sekunde für alle Testbeispiele auf meinem Computer.

Thomas Eding
quelle
Ich habe eine Supermaschine aus der Zukunft.
Thomas Eding
Auch der Maschinencode ist stark optimiert. Beim Überprüfen des kompilierten Codes werden Logarithmen und andere Operationen ausgeführt. Der THC (Trinithis Haskell Compiler) ist ein kluger Compiler !!! Wer hat gesagt, dass ich GHC oder Hugs benutzen muss? Tatsächlich kann ich für meinen Compiler echten Quellcode bereitstellen, der eine GHC-Abhängigkeit aufweist. Es wird schneller Code für diesen Quellcode ausgegeben, sogar auf / Ihrem / Computer. Darüber hinaus wird JEDES Haskell-Programm mit der gleichen Genauigkeit wie der GHC kompiliert (der GHC ist das Backend).
Thomas Eding
@downvoters: Ich werde an diesem Wochenende den gesamten Quellcode zur Verfügung stellen (ich werde für eine Weile nicht zu Hause sein), damit mein Compiler Ihnen beweisen kann, dass er schnell läuft. Über Sprachgeschwindigkeit zu sprechen ist Unsinn, da alles auf den Compiler / Interpreter hinausläuft.
Thomas Eding
Und ich habe nicht mal über Geschwindigkeit und Effizienz geredet. Ich bezog mich auf , wie (BEVOR Sie den Beitrag bearbeitet und die Funktion geändert bzu n) die Art der Funktion f wurde durch gegeben f :: (Ord a, Num a, Integral b2, Integral (Bool -> t), Integral b, Integral b1) => a -> (Bool -> t) -> b -> a -> b1 -> b2 -> tziemlich seltsam Sachen, nicht wahr?
Eternalmatt