Membandingkan kekuatan.

13

Bandingkan dua angka N 1 = a b c , N 2 = d e f dengan membangun fungsi f (a, b, c, d, e, f) yang:

  • mengembalikan 1 jika N 1 > N 2
  • mengembalikan -1 jika N 1 <N 2

Catatan: Anda tidak diharuskan mengembalikan nilai apa pun untuk hubungan apa pun lainnya antara N 1 dan N 2 . misalnya ketika mereka sama atau ketika hubungan mereka tidak ditentukan (bilangan kompleks).

kendala lain:

  • semua angka adalah bilangan bulat
  • a, b, c, d, e, f mungkin positif atau negatif tetapi tidak nol.
  • | a |, | d | <1000
  • | b |, | c |, | e |, | f | <10 10
  • waktu berjalan kurang dari beberapa detik

Contoh:

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

Ini golf kode. Kode terpendek menang.

Eelvex
sumber
3
Bagaimana jika mereka sama, haruskah mengembalikan 0? Atau Anda mengasumsikan bahwa tidak mungkin N1 akan sama dengan N2?
Jonathan M Davis
Bisakah kita mendapatkan sampel input / output?
Wile E. Coyote
@ Jonathan: Saya tidak menentukan kasus "menjadi sama" dengan sengaja. Lakukan sesukamu. Anda bahkan dapat berasumsi bahwa mereka tidak pernah sama.
Eelvex
@Dogbert: selesai.
Eelvex
| b |, | c |, | e |, | f | <10 ^ 10 tampaknya bertentangan dengan contoh terakhir Anda
Dr. belisarius

Jawaban:

3

Mathematica, 110 karakter

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
sumber
Apa jenis Mathematica yang Anda gunakan di sana dan mantra sihir apa yang harus digunakan untuk benar-benar membuatnya bekerja? Menempatkan di atas ke dalam Mathematica 8 hanya menghasilkan »Sintaks :: bktwrn:" z (a_, b_, c_, d_, e_, f_) "mewakili multiplikasi; gunakan "z [a_, b_, c_, d_, e_, f_]" untuk mewakili fungsi. «dan» Sintaks :: sntxf: "z (a_" tidak dapat diikuti oleh ", b_, c_, d_, e_, f_ ): = sgn (ln (abs a) b ^ c-ln (abs d) e ^ f) ".«
Joey
Gagal testcase 3,-3,3,-4,1,1, jika saya tidak sepenuhnya salah (tidak punya Mathematica di sini, tetapi Wolfram Alpha tampaknya setuju ).
Ventero
Ok, mulai bekerja sekarang dengan z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]yang jauh lebih lama dari apa yang Anda miliki di sana. Saya mungkin kehilangan sesuatu di sini.
Joey
@ Joey, saya sebenarnya tidak memiliki Mathematica, jadi saya menguji dengan antarmuka Wolfram Alpha. Tampaknya jauh lebih murah hati dengan apa yang diterimanya. Ah well - prioritasnya adalah bahwa @Ventero dengan benar menunjukkan bug dengan logika.
Peter Taylor
Apakah akan "berjalan dalam waktu kurang dari beberapa detik" z[535, 10^9, 10^8, 443, 10^9, 10^9]?
Eelvex
7

Ruby 1.9, 280 227 189 171 karakter

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}

Saya tahu ini sedikit lebih lama daripada solusi lain, tetapi setidaknya pendekatan ini harus bekerja tanpa menghitung a b c , d e f , b c atau e f .

Edit:

  • (279 -> 280) Memperbaiki bug saat a**b**c < 0 dand = 1 .
  • (280 -> 227) Menghapus cek yang tidak perlu untuk kasus khusus.
  • (227 -> 192) Menghapus beberapa pemeriksaan yang tidak perlu dengan kriteria yang diberikan (bilangan bulat tidak nol, tidak diperlukan keluaran untuk nilai kompleks)
  • (192 -> 189) Karena semua cek lainnya, saya dapat menghitung dengan aman log(log(a)/log(d))alih-alihlog(log(a))-log(log(d)) .
  • (189 -> 171) Cara sederhana untuk mengubah masalah yang setara menjadi satu sama lain.

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
Ventero
sumber
1

ShortScript , 89 byte

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

Implementasinya tidak persis seperti yang dijelaskan, tetapi berhasil.

Jawaban ini tidak bersaing, karena ShortScript telah diterbitkan setelah tantangan ini.

YourDeathIsComing
sumber
0

Python 2.6 (ini tidak benar-benar berfungsi)

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)

hari ini saya belajar python memiliki fungsi log yang kompleks. jadi, double log secara membabi buta kedua sisi dan lihat komponen yang sebenarnya. bekerja untuk 4 dari 5 tes. tidak yakin apa yang terjadi dengan yang keempat.

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
gelandangan
sumber
Yaa, saya mengacaukan contoh yang salah: / Maaf ... memperbaikinya ...
Eelvex
kode saya masih mengembalikan -1 untuk contoh keempat yang salah ketika a = 100
roobs
Membandingkan hanya bagian yang sebenarnya tidak benar.
Eelvex
ya, bagian itu adalah tikaman dalam gelap. ini adalah di mana saya menyesal melewatkan kursus itu dalam analisis yang kompleks
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
sumber
8
Gagal pada hal negatif.
JB
-2

Haskell, 44 karakter

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

Berjalan di bawah satu detik untuk semua contoh pengujian pada mesin saya .

Thomas Eding
sumber
Saya punya supermachine dari masa depan.
Thomas Eding
Kode mesin juga sangat dioptimalkan. Memeriksa kode yang dikompilasi, itu logaritma dan operasi lainnya. THC (Trinithis Haskell Compiler) adalah salah satu kompiler pintar !!! Siapa bilang saya harus menggunakan GHC atau Hugs? Bahkan, saya dapat memberikan kode sumber nyata untuk kompiler saya yang memiliki ketergantungan GHC. Ini akan menampilkan kode cepat untuk kode sumber ini bahkan di / mesin / Anda. Terlebih lagi, ini akan mengkompilasi program APAPUN Haskell dengan tingkat akurasi yang sama dengan GHC (GHC adalah backend).
Thomas Eding
@ downvoters: Saya akan memberikan seluruh kode sumber akhir pekan ini (saya tidak akan pulang sebentar) untuk kompiler saya untuk membuktikan kepada Anda bahwa itu berjalan dengan cepat. Berbicara tentang kecepatan bahasa adalah omong kosong, karena semuanya bermuara pada kompiler / juru bahasa.
Thomas Eding
Dan saya bahkan tidak berbicara tentang kecepatan / efisiensi omong kosong. Saya mengacu pada bagaimana (SEBELUM Anda mengedit posting dan berubah fungsi buntuk n) jenis fungsi f diberikan oleh f :: (Ord a, Num a, Integral b2, Integral (Bool -> t), Integral b, Integral b1) => a -> (Bool -> t) -> b -> a -> b1 -> b2 -> tCukup aneh hal, ya?
eternalmatt