Comparación de poderes.

13

Compare dos números N 1 = a b c , N 2 = d e f construyendo una función f (a, b, c, d, e, f) que:

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

Nota: No es necesario que devuelva ningún valor para ninguna otra relación entre N 1 y N 2 . por ejemplo, cuando son iguales o cuando su relación es indefinida (números complejos).

otras restricciones:

  • todos los números son enteros
  • a, b, c, d, e, f pueden ser positivos o negativos pero no cero.
  • | a |, | d | <1000
  • | b |, | c |, | e |, | f | <10 10
  • tiempo de ejecución de menos de unos segundos

Ejemplos:

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

Este es el código de golf. El código más corto gana.

Eelvex
fuente
3
¿Qué pasa si son iguales, debería devolver 0? ¿O suponiendo que no hay forma de que N1 sea igual a N2?
Jonathan M Davis
¿Podemos obtener algunas entradas / salidas de muestra?
Wile E. Coyote
@ Jonathan: No estoy especificando el caso de "ser igual" a propósito. Haz lo que quieras. Incluso puede suponer que nunca son iguales.
Eelvex
@Dogbert: hecho.
Eelvex
| b |, | c |, | e |, | f | <10 ^ 10 parece contradecir su último ejemplo
Dr. belisarius

Respuestas:

3

Mathematica, 110 caracteres

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
fuente
¿Qué tipo de Mathematica usas allí y qué conjuro mágico tiene que usarse para que esto funcione? Poner lo anterior en Mathematica 8 solo produce »Sintaxis :: bktwrn:" z (a_, b_, c_, d_, e_, f_) "representa la multiplicación; use "z [a_, b_, c_, d_, e_, f_]" para representar una función. «y» Sintaxis :: sntxf: "z (a_" no puede ser seguido por ", b_, c_, d_, e_, f_ ): = sgn (ln (abs a) b ^ c-ln (abs d) e ^ f) ".«
Joey
Falla el caso de prueba 3,-3,3,-4,1,1, si no estoy completamente equivocado (no tengo Mathematica aquí, pero Wolfram Alpha parece estar de acuerdo ).
Ventero
Ok, ahora funcionó, z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]que es considerablemente más largo que el que tienes allí. Probablemente me estoy perdiendo algo aquí.
Joey
@Joey, en realidad no tengo Mathematica, así que estaba probando con la interfaz Wolfram Alpha. Parece que es mucho más generoso con lo que acepta. Ah, bueno, la prioridad es que @Ventero señala correctamente un error con la lógica.
Peter Taylor
¿Se "ejecutará en menos de unos segundos" durante z[535, 10^9, 10^8, 443, 10^9, 10^9]?
Eelvex
7

Ruby 1.9, 280 227 189 171 caracteres

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}

Sé que esto es un poco más largo que las otras soluciones, pero al menos este enfoque debería funcionar sin calcular a b c , d e f , b c o e f .

Editar:

  • (279 -> 280) Se corrigió un error cuando a**b**c < 0y d = 1.
  • (280 -> 227) Se eliminó un cheque innecesario para un caso especial.
  • (227 -> 192) Se eliminaron algunas comprobaciones que no son necesarias con los criterios dados (enteros distintos de cero, no se necesitan resultados para valores complejos)
  • (192 -> 189) Debido a todos los demás controles, puedo calcular de forma segura en log(log(a)/log(d))lugar de log(log(a))-log(log(d)).
  • (189 -> 171) Forma simplificada de transformar problemas equivalentes entre sí.

Casos de prueba:

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
fuente
1

ShortScript , 89 bytes

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

La implementación no es exactamente la descrita, pero funciona.

Esta respuesta no es competitiva, ya que ShortScript se ha publicado después de este desafío.

YourDeathIsComing
fuente
0

Python 2.6 (esto en realidad no funciona)

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)

Hoy aprendí que Python tiene una función de registro compleja. entonces, doble ciegamente log ambos lados y mire el componente real. funciona para 4 de las 5 pruebas. No estoy seguro de lo que está pasando con el cuarto.

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
fuente
Bueno, es que me equivoqué con el ejemplo que está mal: / Lo siento ... arreglándolo ...
Eelvex
mi código aún devuelve -1 para el cuarto ejemplo incorrecto cuando a = 100
roobs
Comparar solo la parte real no es correcto.
Eelvex
Sí, esa parte fue una puñalada en la oscuridad. esto es donde Lamento saltarse que curso de análisis complejos
roobs
-1

Pitón (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
fuente
8
Falla en los negativos.
JB
-2

Haskell, 44 personajes

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

Se ejecuta en menos de un segundo para todos los ejemplos de prueba en mi máquina.

Thomas Eding
fuente
Tengo una supermáquina del futuro.
Thomas Eding
Además, el código de la máquina está altamente optimizado. Al inspeccionar el código compilado, realiza logaritmos y otras operaciones. ¡El THC (Trinithis Haskell Compiler) es un compilador inteligente! ¿Quién dijo que tenía que usar GHC o Hugs? De hecho, puedo proporcionar un código fuente real para mi compilador que tiene una dependencia de GHC. Producirá un código rápido para este código fuente incluso en / su / máquina. Además, compilará CUALQUIER programa Haskell con el mismo grado de precisión que el GHC (GHC es el backend).
Thomas Eding
@downvoters: proporcionaré el código fuente completo este fin de semana (no estaré en casa por un tiempo) para que mi compilador te demuestre que se ejecuta rápidamente. Hablar sobre la velocidad del lenguaje no tiene sentido, ya que todo se reduce al compilador / intérprete.
Thomas Eding
Y ni siquiera estaba hablando de velocidad / eficiencia de mierda. Me refería a cómo (ANTES de editar la publicación y cambiar la función ba n) el tipo de función f fue dada por f :: (Ord a, Num a, Integral b2, Integral (Bool -> t), Integral b, Integral b1) => a -> (Bool -> t) -> b -> a -> b1 -> b2 -> tcosas bastante extrañas, ¿eh?
eternalmatt