Comparando poderes.

13

Compare dois números N 1 = a b c , N 2 = d e f construindo uma função f (a, b, c, d, e, f) que:

  • retorna 1 se N 1 > N 2
  • retorna -1 se N 1 <N 2

Nota: Você não é obrigado a retornar nenhum valor para qualquer outra relação entre N 1 e N 2 . por exemplo, quando são iguais ou quando sua relação é indefinida (números complexos).

outras restrições:

  • todos os números são inteiros
  • a, b, c, d, e, f podem ser positivos ou negativos, mas não zero.
  • | a |, | d | <1000
  • | b |, | c |, | e |, | f | <10 10
  • tempo de execução menos de alguns segundos

Exemplos:

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

Isso é código de golfe. O menor código vence.

Eelvex
fonte
3
E se forem iguais, deve retornar 0? Ou você está assumindo que não há como N1 ser igual a N2?
Jonathan M Davis
Podemos obter algumas entradas / saídas de amostra?
314 Dogbert
@ Jonathan: Não estou especificando o caso "ser igual" de propósito. Faça como quiser. Você pode até assumir que eles nunca são iguais.
Eelvex
@Dogbert: pronto.
Eelvex
| b |, | c |, | e |, | f | <10 ^ 10 parece contradizer seu último exemplo
Dr. belisarius

Respostas:

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
fonte
Que tipo de Mathematica você usa lá e que encantamento mágico deve ser usado para que isso funcione? Colocar o exposto no Mathematica 8 apenas gera »Sintaxe :: bktwrn:" z (a_, b_, c_, d_, e_, f_) "representa multiplicação; use "z [a_, b_, c_, d_, e_, f_]" para representar uma função. «e» Sintaxe :: sntxf: "z (a_" não pode ser seguido por ", b_, c_, d_, e_, f_ ): = sgn (ln (abs a) b ^ c-ln (abs d) e ^ f) ".«
Joey
Falha na caixa de teste 3,-3,3,-4,1,1, se não me engano completamente (não tenha o Mathematica aqui, mas o Wolfram Alpha parece concordar ).
Ventero 27/03
Ok, consegui trabalhar agora com o z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]que é consideravelmente mais longo do que o que você tem por lá. Provavelmente estou perdendo alguma coisa aqui.
Joey
@ Joey, na verdade não tenho o Mathematica, então estava testando com a interface Wolfram Alpha. Parece que é muito mais generoso com o que aceita. Ah, bem - a prioridade é que o @Ventero aponte corretamente um erro com a lógica.
Peter Taylor
Será "executado em menos de alguns segundos" por z[535, 10^9, 10^8, 443, 10^9, 10^9]?
Eelvex 27/03
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}

Eu sei que isso é um pouco mais do que as outras soluções, mas pelo menos essa abordagem deve funcionar sem calcular a b c , d e f , b c ou e f .

Editar:

  • (279 -> 280) Corrigido um erro quando a**b**c < 0e d = 1.
  • (280 -> 227) Foi removida uma verificação desnecessária para um caso especial.
  • (227 -> 192) Removidas algumas verificações que não são necessárias com os critérios fornecidos (números inteiros diferentes de zero, nenhuma saída necessária para valores complexos)
  • (192 -> 189) Devido a todas as outras verificações, posso calcular com segurança em log(log(a)/log(d))vez de log(log(a))-log(log(d)).
  • (189 -> 171) Maneira simplificada de transformar problemas equivalentes um no outro.

Casos de teste:

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

ShortScript , 89 bytes

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

A implementação não é exatamente a descrita, mas funciona.

Esta resposta não é concorrente, pois o ShortScript foi publicado após esse desafio.

YourDeathIsComing
fonte
0

Python 2.6 (isso realmente não 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)

hoje eu aprendi python tem uma função de log complexa. portanto, faça um registro cego dos dois lados e observe o componente real. funciona para 4 dos 5 testes. não sei o que está acontecendo com o quarto.

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
fonte
Bem, é que eu errei o exemplo que está errado: / Desculpe ... consertando ...
Eelvex 14/02
meu código ainda retorna -1 para o quarto exemplo errado quando a = 100
roobs
Comparar apenas a parte real não está correto.
Eelvex 14/02/11
Sim, essa parte foi uma facada no escuro. este é o lugar onde eu lamento pular o referido curso na análise complexa
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
fonte
8
Falha em negativos.
JB
-2

Haskell, 44 caracteres

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

É executado em menos de um segundo para todos os exemplos de teste na minha máquina.

Thomas Eding
fonte
Eu tenho uma super-máquina do futuro.
Thomas Eding 21/07
Além disso, o código da máquina é altamente otimizado. Inspecionando o código compilado, ele faz logaritmos e outras operações. O THC (Trinithis Haskell Compiler) é um compilador inteligente !!! Quem disse que eu tinha que usar GHC ou abraços? Na verdade, eu posso fornecer código fonte real para o meu compilador, que possui uma dependência do GHC. Ele produzirá código rápido para esse código-fonte, mesmo em / your / machine. Além disso, ele compila QUALQUER programa Haskell com o mesmo grau de precisão do GHC (o GHC é o back-end).
Thomas Eding 22/07
@ downvoters: fornecerei todo o código-fonte neste fim de semana (não estarei em casa por um tempo) para que meu compilador prove que ele roda rapidamente. Falar sobre velocidade da linguagem é um absurdo, pois tudo se resume ao compilador / intérprete.
Thomas Eding 22/07
E eu nem estava falando sobre velocidade / eficiência de merda. Eu estava me referindo a como (ANTES de você editar a postagem e alterar a função bpara n) o tipo de função f foi dada por f :: (Ord a, Num a, Integral b2, Integral (Bool -> t), Integral b, Integral b1) => a -> (Bool -> t) -> b -> a -> b1 -> b2 -> tCoisas bem estranhas, hein?
eternalmatt 22/07