比较能力。


13

通过构造一个函数f(a,b,c,d,e,f)比较两个数字N 1 = a b c,N 2 = d e f

  • 如果N 1 > N 2返回1
  • 如果N 1 <N 2返回-1

注意:不需要为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?
乔纳森·M·戴维斯

我们可以得到一些样本输入/输出吗?
Wile E. Coyote

@乔纳森:我不是故意指定“平等”的情况。随便你。您甚至可以假设它们永远不相等。
Eelvex

@Dogbert:完成了。
Eelvex

| b |,| c |,| e |,| f | <10 ^ 10似乎与您的最后一个例子相矛盾
belisarius博士2011年

Answers:


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 2011年

好的,现在就可以使用z[a_,b_,c_,d_,e_,f_]:=Sign[Log[Abs[a]]b^c-Log[Abs[d]]e^f]它了,但是比您现在拥有的要长得多。我可能在这里错过了一些东西。
Joey

@Joey,我实际上没有Mathematica,所以我正在使用Wolfram Alpha界面进行测试。看起来它接受的东西要宽裕得多。很好-优先事项是@Ventero正确指出了逻辑错误。
Peter Taylor

它会“在不到几秒钟的时间内运行” z[535, 10^9, 10^8, 443, 10^9, 10^9]吗?
Eelvex

7

Ruby 1.9, 280227189 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}

我知道这是一个有点比其他解决方案更长时间,但至少这种方法应该不计算工作b Ç,d ē ˚F,B ç或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具有复杂的日志功能。因此,请盲目地将日志双方都记录下来,并查看实际组件。在5个测试中有4个有效。不知道第四件事是怎么回事。

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

当a = 100时,我的代码仍然为错误的第四个示例返回-1
roobs 2011年

仅比较真实部分是不正确的。
Eelvex

是的,那部分是黑暗中的刺伤。这是我后悔在复杂分析中跳过该课程的地方
roobs 2011年

-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

我的机器上所有测试示例的运行时间不到一秒钟。


我有未来的超级机器。
Thomas Eding

机器代码也高度优化。检查编译后的代码,它执行对数和其他运算。THC(Trinithis Haskell编译器)是一种智能编译器!!!谁说我必须使用GHC或拥抱?实际上,我可以为具有GHC依赖关系的编译器提供真实的源代码。即使在/ your /机器上,它将为该源代码输出快速代码。更重要的是,它将编译任何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 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.