การเปรียบเทียบอำนาจ


13

เปรียบเทียบตัวเลขสองตัว N 1 = a b c , N 2 = d e fโดยสร้างฟังก์ชัน f (a, b, c, d, e, f) ที่:

  • ส่งคืน 1 ถ้า N 1 > N 2
  • ส่งคืน -1 ถ้า N 1 <N 2

หมายเหตุ:คุณไม่จำเป็นต้องส่งกลับค่าใด ๆ สำหรับความสัมพันธ์อื่น ๆ ระหว่าง N 1และ N 2 เช่นเมื่อพวกเขาเท่ากันหรือเมื่อความสัมพันธ์ของพวกเขาไม่ได้กำหนด (จำนวนเชิงซ้อน)

ข้อ จำกัด อื่น ๆ :

  • ตัวเลขทั้งหมดเป็นจำนวนเต็ม
  • a, b, c, d, e, f อาจเป็นค่าบวกหรือลบ แต่ไม่เป็นศูนย์
  • | คุณ |, | d | <1,000
  • | ข |, | C |, | E |, | ฉ | <10 10
  • ใช้เวลาน้อยกว่าไม่กี่วินาที

ตัวอย่าง:

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

นี่คือรหัสกอล์ฟ รหัสที่สั้นที่สุดชนะ


3
แล้วถ้าพวกมันเท่ากันมันจะคืนค่า 0 ได้ไหม หรือคุณสมมติว่าไม่มีทางที่ N1 จะเท่ากับ N2?
Jonathan M Davis

เราจะได้รับตัวอย่างอินพุต / เอาท์พุตได้ไหม?
Wile E. Coyote

@ โจนาธาน: ฉันไม่ได้ระบุกรณี "ถูกเท่ากัน" ในวัตถุประสงค์ ทำที่คุณพอใจ. คุณอาจสันนิษฐานว่าพวกเขาไม่เคยเท่าเทียมกัน
Eelvex

@Dogbert: เสร็จแล้ว
Eelvex

| ข |, | C |, | E |, | ฉ | <10 ^ 10 ดูเหมือนจะขัดแย้งตัวอย่างสุดท้ายของคุณ
ดร. เบลิซาเรียส

คำตอบ:


3

Mathematica, 110 ตัวอักษร

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

Mathematica แบบใดที่คุณใช้ที่นั่นและคาถาวิเศษที่ต้องใช้เพื่อให้มันใช้งานได้จริง การใส่ค่าข้างต้นลงใน Mathematica 8 เพียงแค่ให้ผลลัพธ์»ไวยากรณ์ :: bktwrn: "z (a_, b_, c_, d_, e_, f_)" หมายถึงการคูณ ใช้ "z [a_, b_, c_, d_, e_, f_]" เพื่อเป็นตัวแทนของฟังก์ชัน«และ»ไวยากรณ์ :: sntxf: "z (a_" ไม่สามารถตามมาด้วย ", b_, c_, d_, e_, f_ ): = sgn (ln (abs a) b ^ c-ln (abs d) e ^ f) ". «
Joey

ล้มเหลวในการทดสอบ3,-3,3,-4,1,1ถ้าฉันไม่ผิดพลาดอย่างสมบูรณ์ (ไม่มี Mathematica ที่นี่ แต่ Wolfram Alpha ดูเหมือนจะเห็นด้วย )
Ventero

ตกลงให้มันทำงานตอนนี้z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]ซึ่งยาวกว่าที่คุณมีอยู่มาก ฉันอาจจะพลาดอะไรบางอย่างที่นี่
Joey

@ โจอี้ฉันไม่มี Mathematica ดังนั้นฉันจึงทำการทดสอบด้วยส่วนต่อประสาน Wolfram Alpha ปรากฏว่ามันใจกว้างมากขึ้นกับสิ่งที่ยอมรับ อ่า - ความสำคัญคือ @Ventero ชี้จุดบกพร่องของตรรกะอย่างถูกต้อง
Peter Taylor

มันจะ "ทำงานในไม่กี่วินาที" z[535, 10^9, 10^8, 443, 10^9, 10^9]หรือไม่?
Eelvex

7

ทับทิม 1.9 280 227 189 171 ตัวอักษร

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}

ฉันรู้ว่านี้เป็นบิตนานกว่าโซลูชั่นอื่น ๆ แต่อย่างน้อยวิธีนี้ควรจะทำงานได้โดยไม่ต้องคำนวณหรือ e ฉ

แก้ไข:

  • (279 -> 280) แก้ไขข้อผิดพลาดเมื่อและa**b**c < 0d = 1
  • (280 -> 227) นำการตรวจสอบที่ไม่จำเป็นออกสำหรับกรณีพิเศษ
  • (227 -> 192) ลบการตรวจสอบบางอย่างที่ไม่จำเป็นกับเกณฑ์ที่กำหนด (จำนวนเต็มไม่เป็นศูนย์ไม่จำเป็นต้องใช้เอาต์พุตสำหรับค่าที่ซับซ้อน)
  • (192 -> 189) ครบทุกการตรวจสอบอื่น ๆ ผมได้อย่างปลอดภัยสามารถคำนวณแทนlog(log(a)/log(d))log(log(a))-log(log(d))
  • (189 -> 171) วิธีที่ง่ายกว่าในการแปลงปัญหาที่เทียบเท่ากันให้เป็นปัญหาแบบอื่น

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

1

ShortScript , 89 ไบต์

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

การใช้งานไม่ตรงตามที่อธิบายไว้ แต่ใช้ได้ผล

คำตอบนี้ไม่ใช่การแข่งขันเนื่องจาก ShortScript ได้รับการเผยแพร่หลังจากความท้าทายนี้


0

Python 2.6 (มันใช้งานไม่ได้จริง)

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)

วันนี้ฉันเรียนรู้หลามมีฟังก์ชั่นบันทึกที่ซับซ้อน ดังนั้นสุ่มสี่สุ่มห้าล็อกทั้งสองด้านและดูองค์ประกอบจริง ใช้งานได้ 4 จาก 5 การทดสอบ ไม่แน่ใจว่าเกิดอะไรขึ้นกับอันที่สี่

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

ดีก็คือว่าผม messsed ขึ้นตัวอย่างเช่นที่เป็นธรรม: / ขอโทษ ... แก้ไขมัน ...
Eelvex

โค้ดของฉันยังคงส่งกลับ -1 สำหรับตัวอย่างที่สี่ผิดเมื่อ a = 100
roobs

การเปรียบเทียบเพียงส่วนที่แท้จริงนั้นไม่ถูกต้อง
Eelvex

ใช่ส่วนนั้นคือแทงในความมืด นี่คือที่ผมเสียใจข้ามแน่นอนว่าในการวิเคราะห์ที่ซับซ้อน
roobs


-2

Haskell, 44 ตัวอักษร

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

ทำงานภายใต้หนึ่งวินาทีสำหรับตัวอย่างทดสอบทั้งหมดในเครื่องของฉัน


ฉันมี supermachine จากอนาคต
Thomas Eding

นอกจากนี้รหัสเครื่องยังได้รับการปรับให้เหมาะสมที่สุด การตรวจสอบโค้ดที่คอมไพล์จะทำลอการิทึมและการทำงานอื่น ๆ THC (Trinithis Haskell Compiler) เป็นคอมไพเลอร์อัจฉริยะหนึ่งตัว !!! ใครบอกว่าฉันต้องใช้ GHC หรือกอด? ในความเป็นจริงฉันสามารถให้ซอร์สโค้ดที่แท้จริงสำหรับคอมไพเลอร์ของฉันซึ่งมีการพึ่งพา GHC มันจะเอาท์พุทรหัสที่รวดเร็วสำหรับซอร์สโค้ดนี้แม้ใน / ของคุณ / เครื่อง ยิ่งไปกว่านั้นมันจะรวบรวมโปรแกรม ANY Haskell ในระดับความแม่นยำเช่นเดียวกับ GHC (GHC เป็นแบ็กเอนด์)
Thomas Eding

@downvoters: ฉันจะให้ซอร์สโค้ดทั้งหมดในสุดสัปดาห์นี้ (ฉันจะไม่กลับบ้านซักพักหนึ่ง) เพื่อให้คอมไพเลอร์ของฉันพิสูจน์ให้คุณเห็นว่ามันทำงานได้อย่างรวดเร็ว การพูดเกี่ยวกับความเร็วของภาษานั้นเป็นเรื่องไร้สาระเพราะทุกอย่างจะไหลลงสู่คอมไพเลอร์ / ล่าม
Thomas Eding

และฉันก็ไม่ได้พูดถึงความเร็ว / ประสิทธิภาพพล่าม ฉันหมายถึง (ก่อนที่คุณจะแก้ไขโพสต์และเปลี่ยนฟังก์ชั่นbเป็นn) ประเภทของฟังก์ชั่น f ที่ได้รับจากf :: (Ord a, Num a, Integral b2, Integral (Bool -> t), Integral b, Integral b1) => a -> (Bool -> t) -> b -> a -> b1 -> b2 -> tสิ่งแปลก ๆ น่ารักเหรอ?
eternalmatt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.