Porównywanie mocy.

13

Porównaj dwie liczby N 1 = a b c , N 2 = d e f , konstruując funkcję f (a, b, c, d, e, f), która:

  • zwraca 1, jeśli N 1 > N 2
  • zwraca -1, jeśli N 1 <N 2

Uwaga: Nie musisz zwracać żadnej wartości dla jakiejkolwiek innej relacji między N 1 i N 2 . np. gdy są równe lub gdy ich relacja jest niezdefiniowana (liczby zespolone).

inne ograniczenia:

  • wszystkie liczby są liczbami całkowitymi
  • a, b, c, d, e, f mogą być dodatnie lub ujemne, ale nie zero.
  • | a |, | d | <1000
  • | b |, | c |, | e |, | f | <10 10
  • czas trwania mniej niż kilka sekund

Przykłady:

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

To jest kod golfowy. Najkrótszy kod wygrywa.

Eelvex
źródło
3
Co jeśli są równe, czy powinno zwrócić 0? A może zakładasz, że nie ma możliwości, aby N1 był równy N2?
Jonathan M Davis,
Czy możemy uzyskać przykładowe wejścia / wyjścia?
Dogbert
@Jathanathan: Nie podam celowo przypadku „bycia równym”. Rób co chcesz. Możesz nawet założyć, że nigdy nie są równe.
Eelvex
@Dogbert: gotowe.
Eelvex
| b |, | c |, | e |, | f | <10 ^ 10 wydaje się zaprzeczać waszemu ostatniemu przykładowi
dr Belisarius

Odpowiedzi:

3

Mathematica, 110 znaków

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
źródło
Jakiego rodzaju matematyki tam używasz i jakiej magicznej inkantacji należy użyć, aby faktycznie to zadziałało? Umieszczenie powyższego w Mathematica 8 daje po prostu »Składnia :: bktwrn:„ z (a_, b_, c_, d_, e_, f_) ”oznacza mnożenie; użyj „z [a_, b_, c_, d_, e_, f_]”, aby przedstawić funkcję. «i» Składnia :: sntxf: „z (a_ nie może nastąpić”, b_, c_, d_, e_, f_ ): = sgn (ln (abs a) b ^ c-ln (abs d) e ^ f) ".«
Joey
Nie udaje się testować 3,-3,3,-4,1,1, jeśli się nie mylę (nie mam tutaj Mathematiki, ale Wolfram Alpha wydaje się zgadzać ).
Ventero
Ok, mam teraz do pracy, z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]co jest znacznie dłuższe niż to, co masz. Prawdopodobnie coś tu brakuje.
Joey
@Joey, właściwie nie mam Mathematica, więc testowałem z interfejsem Wolfram Alpha. Wygląda na to, że jest dużo bardziej hojny w stosunku do tego, co akceptuje. Ach cóż - priorytetem jest to, że @Ventero poprawnie wskazuje błąd w logice.
Peter Taylor
Czy będzie działać przez mniej niż kilka sekund z[535, 10^9, 10^8, 443, 10^9, 10^9]?
Eelvex
7

Ruby 1.9, 280 227 189 171 znaków

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}

Wiem, że jest to nieco dłużej niż inne rozwiązania, ale przynajmniej to podejście powinno działać bez obliczania a b c , d e f , b c lub e f .

Edytować:

  • (279 -> 280) Naprawiono błąd, gdy a**b**c < 0i d = 1.
  • (280 -> 227) Usunięto niepotrzebne sprawdzenie specjalnego przypadku.
  • (227 -> 192) Usunięto niektóre kontrole, które nie są konieczne z podanymi kryteriami (niezerowe liczby całkowite, brak danych wyjściowych dla złożonych wartości)
  • (192 -> 189) Z powodu wszystkich innych kontroli mogę bezpiecznie obliczyć log(log(a)/log(d))zamiast log(log(a))-log(log(d)).
  • (189 -> 171) Uproszczony sposób przekształcania w siebie równoważnych problemów.

Przypadki testowe:

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
źródło
1

ShortScript , 89 bajtów

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

Implementacja nie jest dokładnie opisana, ale działa.

Ta odpowiedź nie jest konkurencyjna, ponieważ po tym wyzwaniu opublikowano ShortScript.

YourDeathIsComing
źródło
0

Python 2.6 (to nie działa)

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)

dzisiaj dowiedziałem się, że python ma złożoną funkcję dziennika. więc ślepo podwójnie zaloguj obie strony i spójrz na prawdziwy komponent. działa na 4 z 5 testów. nie jestem pewien, co się dzieje z czwartym.

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
źródło
No cóż, zepsułem przykład, który jest zły: / Przepraszamy ... naprawiam go ...
Eelvex
mój kod nadal zwraca -1 dla czwartego przykładu niepoprawnego, gdy a = 100
roobs
Porównywanie tylko rzeczywistej części jest nieprawidłowe.
Eelvex
tak, ta część była dźgnięciem w ciemności. tutaj żałuję pominięcia tego kursu w złożonej analizie
rooby
-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
źródło
8
Nie działa na negatywy.
JB
-2

Haskell, 44 znaki

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

Działa poniżej sekundy dla wszystkich przykładów testowych na moim komputerze.

Thomas Eding
źródło
Mam superkomputer z przyszłości.
Thomas Eding,
Również kod maszynowy jest wysoce zoptymalizowany. Sprawdzając skompilowany kod, robi logarytmy i inne operacje. THC (Trinithis Haskell Compiler) to jeden inteligentny kompilator !!! Kto powiedział, że muszę użyć GHC lub uścisków? W rzeczywistości mogę dostarczyć prawdziwy kod źródłowy dla mojego kompilatora, który jest zależny od GHC. Wyśle szybki kod dla tego kodu źródłowego nawet na / your / machine. Co więcej, skompiluje KAŻDY program Haskell z takim samym stopniem dokładności jak GHC (GHC to backend).
Thomas Eding
@downvoters: W ten weekend dostarczę cały kod źródłowy (nie będzie mnie przez chwilę w domu), aby mój kompilator udowodnił ci, że działa szybko. Mówienie o szybkości języka jest nonsensem, ponieważ wszystko sprowadza się do kompilatora / tłumacza.
Thomas Eding
I nawet nie mówiłem o bzdurnej szybkości / wydajności. Miałem na myśli to, w jaki sposób (PRZED edycją postu i zmianą funkcji bna n) typ funkcji f został nadany przez f :: (Ord a, Num a, Integral b2, Integral (Bool -> t), Integral b, Integral b1) => a -> (Bool -> t) -> b -> a -> b1 -> b2 -> tdość dziwne rzeczy, co?
eternalmatt