Poteri a confronto.


13

Confronta due numeri N 1 = a b c , N 2 = d e f costruendo una funzione f (a, b, c, d, e, f) che:

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

Nota: non è necessario restituire alcun valore per qualsiasi altra relazione tra N 1 e N 2 . ad es. quando sono uguali o quando la loro relazione non è definita (numeri complessi).

altri vincoli:

  • tutti i numeri sono numeri interi
  • a, b, c, d, e, f possono essere positivi o negativi ma non zero.
  • | Un |, | d | <1000
  • | B |, | c |, | e |, | F | <10 10
  • tempo di esecuzione meno di pochi secondi

Esempi:

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

Questo è il codice golf. Il codice più corto vince.


3
Che dire se sono uguali, dovrebbe restituire 0? O stai assumendo che non c'è modo che N1 sia uguale a N2?
Jonathan M Davis,

Possiamo ottenere alcuni input / output di esempio?
Wile E. Coyote,

@Jonathan: non sto specificando il caso "essere uguale" apposta. Fai come ti pare. Puoi anche supporre che non siano mai uguali.
Eelvex,

@Dogbert: fatto.
Eelvex,

| B |, | c |, | e |, | F | <10 ^ 10 sembra contraddire il tuo ultimo esempio
Dr. Belisarius,

Risposte:


3

Mathematica, 110 caratteri

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

Che tipo di Mathematica usi lì e quale incantesimo magico deve essere usato per farlo funzionare davvero? Mettere quanto sopra in Mathematica 8 produce solo »Sintassi :: bktwrn:" z (a_, b_, c_, d_, e_, f_) "rappresenta la moltiplicazione; usa "z [a_, b_, c_, d_, e_, f_]" per rappresentare una funzione. «e» Sintassi :: sntxf: "z (a_" non può essere seguito da ", b_, c_, d_, e_, f_ ): = sgn (ln (abs a) b ^ c-ln (abs d) e ^ f) ".«
Joey

Non riesce la testcase 3,-3,3,-4,1,1, se non sbaglio completamente (non ho Mathematica qui, ma Wolfram Alpha sembra essere d'accordo ).
Ventero,

Ok, ora funziona con un z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]tempo considerevolmente più lungo di quello che hai lì. Probabilmente mi manca qualcosa qui.
Joey,

@Joey, in realtà non ho Mathematica, quindi stavo testando con l'interfaccia Wolfram Alpha. Sembra che sia molto più generoso con ciò che accetta. Ah bene - la priorità è che @Ventero evidenzi correttamente un bug con la logica.
Peter Taylor,

"Funzionerà in meno di pochi secondi" per z[535, 10^9, 10^8, 443, 10^9, 10^9]?
Eelvex,

7

Ruby 1.9, 280 227 189 171 caratteri

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}

So che questo è un po ' più lungo rispetto alle altre soluzioni, ma almeno questo approccio dovrebbe funzionare senza calcolare a b c , d e f , b c o e f .

Modificare:

  • (279 -> 280) Risolto un bug quando a**b**c < 0e d = 1.
  • (280 -> 227) Rimosso un controllo non necessario per un caso speciale.
  • (227 -> 192) Rimossi alcuni controlli che non sono necessari con i criteri indicati (numeri interi diversi da zero, nessun output necessario per valori complessi)
  • (192 -> 189) A causa di tutti gli altri controlli, posso calcolare in sicurezza log(log(a)/log(d))invece di log(log(a))-log(log(d)).
  • (189 -> 171) Modo semplificato per trasformare problemi equivalenti l'uno nell'altro.

Casi test:

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 byte

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

L'implementazione non è esattamente quella descritta, ma funziona.

Questa risposta non è competitiva, poiché ShortScript è stato pubblicato dopo questa sfida.


0

Python 2.6 (in realtà non funziona)

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)

oggi ho imparato che Python ha una complessa funzione di registro. quindi, doppio cieco log su entrambi i lati e guardare il componente reale. funziona per 4 dei 5 test. non sono sicuro di quello che sta succedendo con il 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

Bene, è che ho incasinato l'esempio che è sbagliato: / Scusa ...
risolvendolo

il mio codice restituisce ancora -1 per il quarto esempio errato quando a = 100
ruba il

Confrontare solo la parte reale non è corretto.
Eelvex,

sì, quella parte era una pugnalata nel buio. è qui che rimpiango di aver saltato quel corso in analisi complesse
ruba il

-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
Fallisce i negativi.
JB,

-2

Haskell, 44 caratteri

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

Funziona in meno di un secondo per tutti gli esempi di test sulla mia macchina.


Ho una supermacchina dal futuro.
Thomas Eding,

Anche il codice macchina è altamente ottimizzato. Ispezionando il codice compilato, esegue logaritmi e altre operazioni. Il THC (Trinithis Haskell Compiler) è un compilatore intelligente !!! Chi ha detto che dovevo usare GHC o Hugs? In effetti, posso fornire un vero codice sorgente per il mio compilatore che ha una dipendenza GHC. Produrrà codice veloce per questo codice sorgente anche su / your / machine. Inoltre, compilerà QUALSIASI programma Haskell con lo stesso grado di precisione del GHC (GHC è il backend).
Thomas Eding,

@downvoters: fornirò l'intero codice sorgente questo fine settimana (non sarò a casa per un po ') per il mio compilatore per dimostrarti che funziona velocemente. Parlare di velocità del linguaggio è una sciocchezza, in quanto tutto si riduce al compilatore / interprete.
Thomas Eding,

E non stavo nemmeno parlando della velocità / efficienza delle cazzate. Mi riferivo a come (PRIMA di aver modificato il post e cambiato la funzione bin n) il tipo di funzione f è stata data da f :: (Ord a, Num a, Integral b2, Integral (Bool -> t), Integral b, Integral b1) => a -> (Bool -> t) -> b -> a -> b1 -> b2 -> tcose abbastanza strane, eh?
eternalmatt,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.