Comparaison des pouvoirs.

13

Comparez deux nombres N 1 = a b c , N 2 = d e f en construisant une fonction f (a, b, c, d, e, f) qui:

  • renvoie 1 si N 1 > N 2
  • renvoie -1 si N 1 <N 2

Remarque: Vous n'êtes pas tenu de renvoyer de valeur pour toute autre relation entre N 1 et N 2 . par exemple quand ils sont égaux ou quand leur relation n'est pas définie (nombres complexes).

autres contraintes:

  • tous les nombres sont des entiers
  • a, b, c, d, e, f peuvent être positifs ou négatifs mais pas nuls.
  • | a |, | d | <1000
  • | b |, | c |, | e |, | f | <10 10
  • durée de fonctionnement inférieure à quelques secondes

Exemples:

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

C'est le golf de code. Le code le plus court gagne.

Eelvex
la source
3
Et s'ils sont égaux, devrait-il retourner 0? Ou vous supposez qu'il n'y a aucun moyen que N1 soit égal à N2?
Jonathan M Davis
Pouvons-nous obtenir des exemples d'entrées / sorties?
Wile E. Coyote,
@Jonathan: Je ne spécifie pas exprès le cas "à égalité". Fais comme tu veux. Vous pouvez même supposer qu'ils ne sont jamais égaux.
Eelvex
@Dogbert: c'est fait.
Eelvex
| b |, | c |, | e |, | f | <10 ^ 10 semble contredire votre dernier exemple
Dr. belisarius

Réponses:

3

Mathematica, 110 caractères

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
la source
Quel genre de Mathematica utilisez-vous là-bas et quelle incantation magique doit être utilisée pour que cela fonctionne réellement? Mettre ce qui précède dans Mathematica 8 donne juste »Syntaxe :: bktwrn:" z (a_, b_, c_, d_, e_, f_) "représente la multiplication; utilisez "z [a_, b_, c_, d_, e_, f_]" pour représenter une fonction. «et» Syntaxe :: sntxf: "z (a_" ne peut pas être suivi de ", b_, c_, d_, e_, f_ ): = sgn (ln (abs a) b ^ c-ln (abs d) e ^ f) ".«
Joey
Échec du testcase 3,-3,3,-4,1,1, si je ne me trompe pas complètement (ne pas avoir Mathematica ici, mais Wolfram Alpha semble d'accord ).
Ventero
Ok, ça fonctionne maintenant, z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]ce qui est considérablement plus long que ce que vous avez là-bas, cependant. Il me manque probablement quelque chose ici.
Joey
@Joey, je n'ai pas réellement Mathematica, donc je testais avec l'interface Wolfram Alpha. Il semble qu'il soit beaucoup plus généreux avec ce qu'il accepte. Ah bien - la priorité est que @Ventero signale correctement un bug avec la logique.
Peter Taylor
Sera-t-il "exécuté en moins de quelques secondes" pour z[535, 10^9, 10^8, 443, 10^9, 10^9]?
Eelvex
7

Ruby 1.9, 280 227 189 171 caractères

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}

Je sais que c'est un peu plus long que les autres solutions, mais au moins cette approche devrait fonctionner sans calculer a b c , d e f , b c ou e f .

Éditer:

  • (279 -> 280) Correction d'un bug quand a**b**c < 0et d = 1.
  • (280 -> 227) Suppression d'une vérification inutile pour un cas spécial.
  • (227 -> 192) Suppression de certaines vérifications qui ne sont pas nécessaires avec les critères donnés (entiers non nuls, aucune sortie nécessaire pour les valeurs complexes)
  • (192 -> 189) En raison de tous les autres contrôles, je peux calculer en toute sécurité log(log(a)/log(d))au lieu de log(log(a))-log(log(d)).
  • (189 -> 171) Manière simplifiée de transformer des problèmes équivalents entre eux.

Testcases:

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
la source
1

ShortScript , 89 octets

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

L'implémentation n'est pas exactement celle décrite, mais elle fonctionne.

Cette réponse n'est pas concurrente, puisque ShortScript a été publié après ce défi.

YourDeathIsComing
la source
0

Python 2.6 (cela ne fonctionne pas réellement)

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)

aujourd'hui, j'ai appris que python a une fonction de journal complexe. ainsi, doublez aveuglément les deux côtés et regardez le vrai composant. fonctionne pour 4 des 5 tests. ne sais pas ce qui se passe avec le quatrième.

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
la source
Eh bien, c'est que j'ai foiré l'exemple qui est faux: / Désolé ... le réparer ...
Eelvex
mon code retourne toujours -1 pour le quatrième exemple erroné quand a = 100
roobs
Comparer uniquement la partie réelle n'est pas correct.
Eelvex
oui, cette partie était un coup de couteau dans le noir. c'est là que je regrette de ne pas avoir suivi ce cours dans une analyse complexe
roobs
-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
la source
8
Échoue sur les négatifs.
JB
-2

Haskell, 44 caractères

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

Fonctionne en moins d'une seconde pour tous les exemples de test sur ma machine.

Thomas Eding
la source
J'ai une super machine du futur.
Thomas Eding
Le code machine est également hautement optimisé. Inspectant le code compilé, il effectue des logarithmes et d'autres opérations. Le THC (Trinithis Haskell Compiler) est un compilateur intelligent !!! Qui a dit que je devais utiliser GHC ou Hugs? En fait, je peux fournir un vrai code source pour mon compilateur qui a une dépendance GHC. Il affichera un code rapide pour ce code source même sur / votre / machine. De plus, il compilera TOUT programme Haskell avec le même degré de précision que le GHC (GHC est le backend).
Thomas Eding du
@downvoters: Je fournirai tout le code source ce week-end (je ne serai pas à la maison pendant un certain temps) pour que mon compilateur vous prouve qu'il fonctionne rapidement. Parler de la vitesse du langage est un non-sens, car tout se résume au compilateur / interprète.
Thomas Eding du
Et je ne parlais même pas de vitesse / efficacité de conneries. Je faisais allusion à la façon dont (avant d'éditer le poste et a changé la fonction bà n) le type de fonction f a été donné par des f :: (Ord a, Num a, Integral b2, Integral (Bool -> t), Integral b, Integral b1) => a -> (Bool -> t) -> b -> a -> b1 -> b2 -> tchoses étranges assez, hein?
eternalmatt