Порівняння повноважень.


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 можуть бути позитивними або негативними, але не нульовими.
  • | a |, | d | <1000
  • | b |, | c |, | e |, | f | <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: Я не конкретизую випадки "рівних" випадково. Роби як хочеш. Ви навіть можете припустити, що вони ніколи не рівні.
Єнадцять

@Dogbert: зроблено.
Єнадцять

| b |, | c |, | e |, | f | <10 ^ 10, здається, суперечить вашому останньому прикладу
д-р belisarius

Відповіді:


3

Математика, 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 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, але Вольфрам Альфа, схоже, згоден ).
Вентеро

Гаразд, змусив його працювати зараз, z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]але це значно довше, ніж те, що у тебе там. Я, мабуть, щось тут пропускаю.
Джої

@Joey, у мене фактично немає математики, тому я тестував інтерфейс Wolfram Alpha. Здається, що набагато щедріше з тим, що приймає. Ну добре - пріоритет у тому, що @Ventero правильно вказує на помилку з логікою.
Пітер Тейлор

Чи "він запуститься менше ніж за кілька секунд" z[535, 10^9, 10^8, 443, 10^9, 10^9]?
Ельвакс

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}

Я знаю, що це трохи довше, ніж інші рішення, але принаймні такий підхід повинен працювати без обчислення a b c , d e f , b c або e f .

Редагувати:

  • (279 -> 280) Виправлено помилку, коли a**b**c < 0і d = 1.
  • (280 -> 227) Видалено непотрібний чек на особливий випадок.
  • (227 -> 192) Видалено деякі перевірки, які не потрібні для заданих критеріїв (ненульові цілі числа, вихід складних значень не потрібен)
  • (192 -> 189) Через всі інші перевірки я можу сміливо розрахувати log(log(a)/log(d))замість log(log(a))-log(log(d)).
  • (189 -> 171) Спрощений спосіб перетворення еквівалентних задач одна в іншу.

Тести:

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

Короткий сценарій , 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)

сьогодні я вивчив python має складну функцію журналу. тож сліпо подвійно записуйте обидві сторони та дивіться на реальну складову. працює на 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

Ну, це те, що я зіпсував неправильний приклад: / Вибачте ... виправляючи це ...
Eelvex

мій код все ще повертає -1 для четвертого прикладу неправильно, коли a = 100
roobs

Порівнювати лише реальну частину - не правильно.
Енадцять

так, ця частина була ударом у темряві. тут я шкодую пропустивши цей курс у складному аналізі
roobs

-1

Пітон (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
Невдача щодо негативів.
JB

-2

Haskell, 44 символи

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

Працює за секунду для всіх тестових прикладів на моїй машині.


У мене є супермашина з майбутнього.
Томас Едінг

Також машинний код дуже оптимізований. Перевіряючи складений код, він робить логарифми та інші операції. THC (Trinithis Haskell Compiler) - один розумний компілятор !!! Хто сказав, що я повинен використовувати GHC або Hugs? Насправді я можу надати реальний вихідний код для мого компілятора, який має залежність від GHC. Він виведе швидкий код для цього вихідного коду навіть на / вашому / машині. Більше того, вона складе будь-яку програму Haskell з такою ж точністю, як і GHC (GHC - це вихідний).
Томас Едінг

@downvoters: Я надам увесь вихідний код цим вихідним (я не буду вдома деякий час) для мого компілятора, щоб довести вам, що він працює швидко. Говорити про швидкість мови - це нісенітниця, оскільки все це зводиться до компілятора / інтерпретатора.
Томас Едінг

І я навіть не говорив про швидкість / ефективність фігня. Я мав на увазі, як (ДО того, як ви відредагували пост і змінили функцію 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Досить дивним матеріалом, так?
forevermatt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.