哪个真正大的数字更大?


11

对于喜欢更具挑战性难题的人来说,这个问题很棘手(特别是比哪个更大更难)。

输入值

整数a1,a2,a3,a4,a5,b1,b2,b3,b4,b5均在1到10的范围内。

输出量

True if a1^(a2^(a3^(a4^a5))) > b1^(b2^(b3^(b4^b5))) and False otherwise.

^是这个问题的幂。

规则

这是代码高尔夫球。对于TIO上的任何有效输入,您的代码必须在10秒内正确终止。如果您的语言不在TIO上,则代码应在计算机上在10秒内完成。

您可以输出True或True,False和False。

测试用例

回想一下,根据指数规则,a1 ^(a2 ^(a3 ^(a4 ^ a5)))== a1 ^ a2 ^ a3 ^ a4 ^ a5。

10^10^10^10^10 > 10^10^10^10^9
1^2^3^4^5 < 5^4^3^2^1
2^2^2^2^3 > 10^4^3^2^2
6^7^8^9^10 is not bigger than 6^7^8^9^10
10^6^4^2^2 < 10^6^2^4^2
2^2^2^2^10 > 2^2^2^10^2
10^9^8^7^6 < 6^7^8^9^10 
3^1^10^10^10 > 2^1^10^10^10 
9^10^10^10^10 < 10^9^10^10^10

Kevin Cruijssen的新测试用例

[10,10,10,10,10, 10,10,10,10,9] #true
[2,2,2,2,3,      10,4,3,2,2]    #true
[2,2,2,2,10,     2,2,2,10,2]    #true
[10,10,10,10,10, 9,10,10,10,10] #true
[3,2,2,1,1,      2,5,1,1,1]     #true
[2,2,3,10,1,     2,7,3,9,1]     #true
[7,9,10,10,10,   6,9,10,10,10]  #true
[3,2,2,2,2,      2,2,2,2,2]     #true
[8,3,1,2,1,      2,2,3,1,1]     #true
[2,4,2,1,1,      3,3,2,1,1]     #true
[5,4,3,2,1,      1,2,3,4,5]     #true

[1,2,3,4,5,      5,4,3,2,1]     #false
[6,7,8,9,10,     6,7,8,9,10]    #false
[10,6,4,2,2,     10,6,2,4,2]    #false
[10,9,8,7,6,     6,7,8,9,10]    #false
[1,10,10,10,10,  1,10,10,10,9]  #false
[2,4,1,1,1,      2,2,2,1,1]     #false
[2,2,2,1,1,      2,4,1,1,1]     #false
[2,5,1,1,1,      3,2,2,1,1]     #false
[4,2,1,1,1,      2,4,1,1,1]     #false
[2,4,1,1,1,      4,2,1,1,1]     #false
[2,3,10,1,1,     8,3,9,1,1]     #false
[8,3,9,1,1,      2,3,10,1,1]    #false
[2,4,1,1,1,      3,3,1,1,1]     #false
[2,2,1,9,9,      2,2,1,10,10]   #false
[2,2,1,10,10,    2,2,1,9,9]     #false
[1,1,1,1,1,      1,2,1,1,1]     #false

5
我正在VTC上,尽管这不是骗子。这与您在4个小时前发布的挑战非常接近,并且显示您缺乏思考独特挑战的努力。
魔术章鱼缸

3
我感到有9个人同意我的观点;但是,正如您所说,即使它有9个否决票,也可以保留它。只是阐明了为什么会有投票的原因。
魔术章鱼缸

3
老实说,只是我的两分钱人。我们不需要在这里详细介绍。遗憾,我什至没说什么。我最后想要的是一个辩论性的回应。我只是在说为什么我给-1。
魔术章鱼缸

7
我投票重开这篇文章,因为它的难度参数不同,解决该问题所需的方法也大不相同。元发布
user202729 '19

3
建议的测试用例(针对Python,Ruby,Java和05AB1E答案遇到的边缘情况)
Kevin Cruijssen

Answers:


8

Ruby,150个字节

有关以前的字节数,请参见修订

->a,b,c,d,e,f,g,h,i,j{l=->s,t=c{Math.log(s,t)};y,z=l[l[g,b]]-d**e+l[h]*i**=j,l[l[a,f]*b**c,g];a>1?f<2?1:b<2||g<2?z>h:c<2||d<2?l[z,h]>i:y==0?a>f:y<0:p}

-10个字节,感谢@ValueInk

+16个字节,感谢@RosLuP的错误。

在线尝试

比较不同的基本功率塔(“高度”五)?

取消程式码:

-> a, b, c, d, e, f, g, h, i, j {
    l =-> s, t = c {Math.log(s, t)}
    i **= j
    y = l[l[g, b]] - d ** e + l[h] * i
    z = l[l[a, f] * b ** c, g]
    if a == 1
        return p
    elsif f == 1
        return 1
    elsif b == 1 || g == 1
        return z > h
    elsif d == 1 || c == 1
        return l[z, h] > i
    elsif y == 0
        return a > f
    else
        return y < 0
    end
}

代码细目:

l =-> s, t = c {Math.log(s, t)}

这是基本t对数,将用于减小我们正在比较的数字的大小。c仅给出一个参数时,默认为base 。

i **= j
y = l[l[g, b]] - d ** e + l[h] * i
z = l[l[a, f] * b ** c, g]

这将更新,i = i ** j因为i永远不会单独使用它,并且yb^c^d^e == g^h^i(^j)两次登录并将所有内容移到一侧的结果。然后,我们让z = l[a, f] * b ** c作为底数g日志基地fa ** b ** c

if a == 1
    return p
elsif f == 1
    return 1

1^b^c^d^e = 1从不大于f^g^h^i^j,同样地,a^b^c^d^e总是大于1^g^h^i^j = 1如果a != 1。请注意,return preturns nil是虚假的,return 1returns 1是真实的。

elsif b == 1
    return z > h

如果b == 1或者g == 1,那么这降低了比较a ** b ** cf ** g ** h,这与两个日志双方完成。

elsif d == 1 || c == 1
    return l[z, h] > i

与此相比,a ** b ** cf ** g ** h ** i重新安排它log[log[b ** c * log[a, f], g], h]相比i。(回想一下i **= j开头和z = log[b ** c * log[a, f], g]。)

elsif y == 0
    return a > f
else
    return y < 0
end

两次登录两次后,将比较这四个最高功率。如果它们相等,则比较基数。


5

Python 2中,671个 612 495 490 611 597字节

lambda a,b:P(S(a,b))>P(S(b,a))if P(a)==P(b)else P(a)>P(b)
def S(a,b):
  if a and a[-1]==b[-1]:
    a.pop()
    b.pop()
    return S(a,b)
from math import*
L=log
E=exp
N=lambda m,n,x:N(m,n+1,L(x))if x>=1else N(m,n-1,E(x))if x<0else(m+n,x)
A=lambda a,n,x:(0,1)if a==1else(1,R(x,n)*L(a))if a<1else N(2,*C(L(L(a)),x,n-1))if n else(1,x*L(a))
def C(c,x,n):
 if c*n==0:return(0if c else n,x+c)
 z=R(x,n-1)
 if z<=L(abs(c)):return(0,E(z)+c)
 return N(1,*C(L(1-E(L(-c)-z)if c<0else 1+E(L(c)-z)),x,n-1))
def R(x,n):
 try:exec'x=E(x)'*n
 except:x=float('inf')
 return x
P=lambda b:b and N(0,*A(b[0],*P(b[1:])))or(0,1)

@EmbodimentOfIgnorance -59字节,@ Neil,
117字节,+121
字节,约五个错误修复,全部由@ngn找到

将输入作为两个列表。注意:也适用于较大的列表或长度不等的列表。编辑:不再正确;如果P(a)P(b)导致不同的元组,它仍然可以工作,但是如果它们相同,则上面的更新代码仅适用于现在固定大小为5的列表。

在线尝试。

说明:

这个答案的高尔夫球版本在math.stackexchange.com上,因此所有功劳归@ThomasAhle

引用他的答案:

n(xn):=expn(x)x[0,1)

a(xn)aapow

22220<2222(1/2)2222

我会对其他类型的反例,尤其是整数反例的建议感兴趣。

在我看来,要使问题在P中,我们需要使用非数值方法。似乎根本不可能,某些分析案例比P难。

例子:

powtow([2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,2,2]) = (0.1184590219613409, 18)
powtow([9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9]) = (0.10111176550354063, 18)

powtow([2,2,5,2,7,4,9,3,7,6,9,9,9,9,3,2]) = (0.10111176550354042, 17)
powtow([3,3,6,3,9,4,2,3,2,2,2,2,2,3,3,3]) = (0.19648862015624008, 17)

反例:

powtow([2,2,2,2,2,2,2]) = (0.8639310719129168, 6)
powtow([3,2,2,2,2,2,2]) = (0.8639310719129168, 6)

关于反例,他在评论部分中提到以下内容:

1<a<100

因此,要证明的主要问题是,一旦塔的顶部超过某个点,并且其余指数有界(并且同样很多),我们可以简单地查看不同的最高值。这有点反直觉,但是从您得到的简单不平等看来,这很有可能。

由于计划A和计划B与该挑战无关,由于我们输入的两个动力塔的高度均为5,因此计划C为。所以,我已经改变P(a)>P(b),以P(S(a,b))>P(S(b,a))if P(a)==P(b)else P(a)>P(b)与递归函数S(a,b)。如果P(a)P(b)导致相同的元组,P(S(a,b))>P(S(b,a))则将首先删除在相同索引处相等的尾随值,然后再P(A)>P(B)对这些现在较短的列表进行相同的检查。


1
我也很喜欢用python打高尔夫球,但这是612 BYTER
无知的体现


2
失败[10,10,10,10,10]>[9,10,10,10,10]
无知的体现

1
您只使用R一次该函数,所以也许您可以内联它?
无知的体现,

1
@EmbodimentofIgnorance R在第5行还有一个出色的电话...
Neil

4

05AB1E96个 104 字节

3èI4èmU8.$`m©I7èI2è.n*I6èI1è.nI2è.n+Vнi0ë5èi1ë2ô1èßi¦2£`mIнI5è.n*I6è.nDI7èDi\1›·<žm*ë.n}®›ëXYQiнI5è›ëXY›

@SimplyBeautifulArt的Ruby答案的端口,因此请确保对他进行投票

log1(x)POSITIVE_INFINITYx>1NEGATIVE_INFINITYx<10.0[3,2,2,1,1,2,5,1,1,1]POSITIVE_INFINITE[2,4,1,1,1,3,3,1,1,1]NEGATIVE_INFINITY

输入为十个整数的列表:[a,b,c,d,e,f,g,h,i,j]

在线尝试验证所有测试用例

说明:

3èI4èm         # Calculate d**e
      U        # And pop and store it in variable `X`
8.$`m          # Calculate i**j
     ©         # Store it in variable `®` (without popping)
I7èI2è.n       # Calculate c_log(h)
 *             # Multiply it with i**j that was still on the stack: i**j * c_log(h)
I6èI1è.nI2è.n  # Calculate c_log(b_log(g))
 +             # And sum them together: i**j * c_log(h) + c_log(b_log(g))
  V            # Pop and store the result in variable `Y`

нi             # If `a` is 1:
 0             #  Push 0 (falsey)
ë5èi           # Else-if `f` is 1:
 1             #  Push 1 (truthy)
ë2ô1èßi        # Else-if the lowest value of [c,d] is 1:
 ¦2£`m         #  Calculate b**c
 IнI5è.n       #  Calculate f_log(a)
  *            #  Multiply them together: b**c * f_log(a)
   I6è.n       #  Calculate g_log(^): g_log(b**c * f_log(a))
 D             #  Duplicate it
  I7è          #  Push h
     Di        #  Duplicate it as well, and if h is exactly 1:
       \       #   Discard the duplicated h
       1      #   Check if the calculated g_log(b**c * f_log(a)) is larger than 1
               #   (which results in 0 for falsey and 1 for truthy)
         ·<    #   Double it, and decrease it by 1 (it becomes -1 for falsey; 1 for truthy)
           žm* #   Multiply that by 9876543210 (to mimic POSITIVE/NEGATIVE INFINITY)
      ë        #  Else:
       .n      #   Calculate h_log(g_log(b**c * f_log(a))) instead
      }        #  After the if-else:
       ®›      #  Check whether the top of the stack is larger than variable `®`
ëXYQi          # Else-if variables `X` and `Y` are equal:
     нI5è›     #  Check whether `a` is larger than `f`
ë              # Else:
 XY           #  Check whether `X` is larger than `Y`
               # (after which the top of the stack is output implicitly as result)

如果有人想进一步尝试它,这是一个我用来从输入列表中获取正确变量的帮助程序


1
令人印象深刻的是,这个分数已经低于100!非常感谢您添加赏金。
阿努什

2
@Anush实际上我觉得96很长,考虑到非高尔夫语言Ruby得到151。; p关于赏金的问题。它主要用于@SimplyBeautifulArt的方法,但同时要给挑战一些注意。它被否决的原因是因为您在使用3次幂的较早答案之后数小时发布了它。我个人喜欢这个挑战,并且是第一个投票并回答它的人,但是我仍然可以在挑战时发表的第一篇评论中看到真相。希望赏金将使您的挑战成为0或正面:)
Kevin Cruijssen

我梦想得到0!:)
阿努什

1
[2,1,1,1,1,3,1,1,1,1,1]结果1必须改为结果0
RosLuP

1
log1(x)

3

C,168180字节

C端口来自Kevin Cruijssen的回答。

#define l(a,b)log(a)/log(b)
z(a,b,c,d,e,f,g,h,i,j){float t=pow(i,j),y=l(l(g,b),c)-pow(d,e)+l(h,c)*t,z=l(l(a,f)*pow(b,c),g);return~-a&&f<2|(b<2|g<2?z>h:c<2|d<2?l(z,h)>t:y?y<0:a>f);}

在线尝试


2
嗯...一个港口*港口*
简单美丽的艺术

也无法3,1,10,10,10,2,1,10,10,10像我以前的Java回答那样失败。它实际上是的@ SimplyBeautifulArt的Ruby回答一个端口,因为他是谁的一切上前和修复的错误之一..
凯文Cruijssen

2

APL(NARS),字符118,字节236

{p←{(a b c d)←⍵⋄a=1:¯1⋄b=1:⍟⍟a⋄(⍟⍟a)+(c*d)×⍟b}⋄(=/(a b)←{p 1↓⍵}¨⍺⍵)∧k←(∞ ∞)≡(m n)←{p(3↑⍵),*/3↓⍵}¨⍺⍵:(↑⍺)>↑⍵⋄k:a>b⋄m>n}

如果a中的数字大于w中的数字,则在“ az w”中调用z的函数将返回1,否则将返回0。

如果我有

f(a,b,c,d,e)=a^b^c^d^e

当且仅当(如果a>的a> 1和bb的a> 1)log(log(f(aa)))> log( log(f(bb)))必须使用log()法则:

log(A*B)=log(A)+log(B)
log(A^B)=B*log(A)

对于构建v(aa)= log(log(aa))= v(a,b,c,d,e)= log(log(a))+ log(b)(c ^(d ^ e))= {p(3↑⍵), / 3↓⍵}函数,因此当v(aa)> v(bb)时可以找到运动。

但是在某些情况下,v(aa)和v(bb)都是无限的(APL结束了浮动空间),在这种情况下,我将使用不安全的函数

s(a,b,c,d,e)=log(log(b))+log(c)*(d^e)={p 1↓⍵}

我不完全了解是否可以,也不能计算一个参数...测试:

  z←{p←{(a b c d)←⍵⋄a=1:¯1⋄b=1:⍟⍟a⋄(⍟⍟a)+(c*d)×⍟b}⋄(=/(a b)←{p 1↓⍵}¨⍺⍵)∧k←(∞ ∞)≡(m n)←{p(3↑⍵),*/3↓⍵}¨⍺⍵:(↑⍺)>↑⍵⋄k:a>b⋄m>n}
  10 10 10 10 10 z 10 10 10 10 9
1
  1 2 3 4 5 z 5 4 3 2 1
0
  2 2 2 2 3 z 10 4 3 2 2
1
  10 6 4 2 2 z 10 6 2 4 2
0
  2 2 2 2 10 z 2 2 2 10 2
1
  10 9 8 7 6 z 6 7 8 9 10
0
  10 10 10 10 10 z 10 10 10 10 9
1      
  2 2 2 2 3   z    10 4 3 2 2
1
  2 2 2 2 10   z   2 2 2 10 2
1
  10 10 10 10 10 z 9 10 10 10 10
1
  3 2 2 1 1   z    2 5 1 1 1
1
  2 2 3 10 1  z    2 7 3 9 1
1
  7 9 10 10 10 z   6 9 10 10 10
1
  3 2 2 2 2    z   2 2 2 2 2
1
  3 10 10 10 10 z  2 10 10 10 10
1
  8 3 1 2 1    z   2 2 3 1 1
1
  2 4 2 1 1    z   3 3 2 1 1
1
  5 4 3 2 1    z   1 2 3 4 5
1
  1 2 3 4 5    z   5 4 3 2 1
0
  6 7 8 9 10    z  6 7 8 9 10
0
  10 6 4 2 2 z     10 6 2 4 2
0
  10 9 8 7 6  z   6 7 8 9 10
0
  1 10 10 10 10 z 1 10 10 10 9
0
  2 4 1 1 1 z     2 2 2 1 1
0
  2 2 2 1 1    z  2 4 1 1 1
0
  2 5 1 1 1   z   3 2 2 1 1
0
  4 2 1 1 1   z   2 4 1 1 1
0
  2 4 1 1 1   z   4 2 1 1 1
0
  2 3 10 1 1  z   8 3 9 1 1
0
  8 3 9 1 1   z   2 3 10 1 1
0
  2 4 1 1 1   z   3 3 1 1 1
0
  2 2 1 9 9   z   2 2 1 10 10
0
  2 2 1 10 10 z   2 2 1 9 9
0
  1 1 1 1 1   z   1 2 1 1 1
0
  1 1 1 1 2   z   1 1 1 1 1
0
  1 1 1 1 1   z   1 1 1 1 1
0
  9 10 10 10 10 z  10 9 10 10 10
1
  9 10 10 10 10 z  10 10 10 10 10
0
  10 10 10 10 10 z  10 10 10 10 10
0
  11 10 10 10 10 z  10 10 10 10 10
1

挑战说明中的测试缺少一些极端情况。您可以验证它也适用于所有这些测试用例吗?
凯文·克鲁伊森

1
@KevinCruijssen在这里进行测试,如果排除上述一项似乎还可以...
RosLuP

1
如果所有测试用例均正确,请向我+1。期待看到您的代码的解释。:)
凯文·克鲁伊森

1
您说您是通过来计算每个值的log(log()),但是对于该测试用例而言,之间的差值log(log(10^10^10^10^10))log(log(9^10^10^10^10))要求获得很高的准确性。您需要一个浮点数2e10,其精度约为10位数字。但这忽略了事实,即双方的大小都近似等于10^10^10,我很难相信您能够进行计算。
Simply Beautiful Art

1
也许它失败了9, 10, 10, 10, 10, 10, 9, 10, 10, 10,应该回来了1,但是s(9,10,10,10,10) < s(10,9,10,10,10)
Simply Beautiful Art

1

爪哇8,299个 288 286 252 210 208 224字节

Math M;(a,b,c,d,e,f,g,h,i,j)->{double t=M.pow(i,j),y=l(l(g,b),c)-M.pow(d,e)+l(h,c)*t,z=l(l(a,f)*M.pow(b,c),g);return a>1&&f<2|(b<2|g<2?z>h:c<2|d<2?l(z,h)>t:y==0?a>f:y<0);}double l(double...A){return M.log(A[0])/M.log(A[1]);}

@SimplyBeautifulArt的Ruby答案的端口,因此请确保对他进行投票
-14个字节感谢@SimplyBeautifulArt
+17个字节,用于与Ruby答案相同的错误修复。

在线尝试。

说明:

Math M;                      // Math M=null on class-level to save bytes

(a,b,c,d,e,f,g,h,i,j)->{     // Method with ten integer parameters and boolean return-type
  double t=M.pow(i,j),       //  Temp `t` = `i` to the power `j`
    y=l(l(g,b),c)            //  Temp `y` = `c`_log(`b`_log(`g`))
      -M.pow(d,e)            //  - `d` to the power `e`
      +l(h,c)*t,             //  + `c`_log(`h`) * `t`
    z=l(l(a,f)*M.pow(b,c),g);//  Temp `z` = `g`_log(`f`_log(`a`) * `b` to the power `c`)
  return a>1&&               //  If `a` is 1:
                             //   Return false
   f<2|(                     //  Else-if `f` is 1:
                             //   Return true
    b<2|g<2?                 //  Else-if either `b` or `g` is 1:
     z>h                     //   Return whether `z` is larger than `h`
    :c<2|d<2?                //  Else-if either `c` or `d` is 1:
     l(z,h)>t                //    Return whether `h`_log(`z`) is larger than `t`
    :y==0?                   //   Else-if `y` is 0:
      a>f                    //    Return whether `a` is larger than `f`
    :                        //   Else:
     y<0);}                  //    Return whether `y` is negative

// Separated method to calculate `B`_log(`A`) for inputs `A,B`
double l(double...A){return M.log(A[0])/M.log(A[1]);}

如果您使用x==y代替似乎工作正常M.abs(x-y)<1e-9
Simply Beautiful Art

@SimplyBeautifulArt等等,是吗?。当我使用非高尔夫版本时,它不适用于一个测试用例。字符串输出是相同的,但在内部却稍有不同。非高尔夫版本是您的非高尔夫版本,在我将其更改为您在Ruby答案中也拥有的三元高尔夫版本之前。愚蠢的浮点精度。将改变它,因为它确实适用于当前方法中的测试用例。谢谢。
凯文·克鲁伊森

大声笑,当您查看时,您可能想看看我的更新:^)
Simply Beautiful Art

1
t可以y像我一样将其删除以节省一个字节。蒂奥
只是美丽的艺术

1
@SimplyBeautifulArt Nvm关于使用相同的更改更新我的05AB1E答案。字节数将保持为
96。–凯文·克鲁伊森
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.