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.


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

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

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.


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

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)

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.