Сравнивая полномочия.

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 | <1000
  • | б |, | с |, | е |, | е | <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

Это код гольф. Самый короткий код выигрывает.

Eelvex
источник
3
А если они равны, должно ли оно вернуть 0? Или вы предполагаете, что N1 не будет равен N2?
Джонатан М Дэвис
Можем ли мы получить образец ввода / вывода?
Уайл Э. Койот
@Джонатан: Я не специально указываю случай «равных». Делай как пожелаешь. Вы можете даже предположить, что они никогда не равны.
двенадцать
@ Догберт: готово.
двенадцать
| б |, | с |, | е |, | е | <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, похоже, согласен ).
Вентеро
Хорошо, теперь он работает, z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]что значительно дольше, чем у вас там. Я, наверное, что-то здесь упускаю.
Джои
@ Джоуи, у меня нет Mathematica, поэтому я тестировал интерфейс Wolfram Alpha. Похоже, что он гораздо щедрее с тем, что принимает. Ну хорошо - приоритет в том, что @Ventero правильно указывает на ошибку с логикой.
Питер Тейлор
Будет ли он работать менее чем за несколько секунд 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}

Я знаю, что это немного дольше, чем другие решения, но по крайней мере этот подход должен работать без вычисления 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) Упрощенный способ преобразования эквивалентных задач друг в друга.

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
источник
1

ShortScript , 89 байт

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

Реализация не совсем описана, но работает.

Этот ответ не является конкурирующим, так как ShortScript был опубликован после этого испытания.

YourDeathIsComing
источник
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
roobs
источник
Ну, это то, что я испортил неправильный пример: / Извините ... исправляю это ...
Eelvex
мой код по-прежнему возвращает -1 для четвертого примера неправильно, когда = 100
roobs
Сравнение только с реальной частью не правильно.
Eelvex
да, эта часть была ударом в темноте. вот где я сожалею, что пропустил этот курс по комплексному анализу
Робс
-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

Хаскель, 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. Он выведет быстрый код для этого исходного кода даже на / your / machine. Более того, он скомпилирует ЛЮБУЮ программу на 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довольно странно, а?
Eternalmatt