本当に大きい数は大きいですか?


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の場合はTruthy、Falseの場合はFalseyを出力できます。

テストケース

指数の規則により、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
正直なところ、私の2セントの男だった。ここで詳しく説明する必要はありません。後悔は何でも言った。私が欲しかった最後のものは、議論の的だった反応でした。私はなぜ私が-1を与えたのかを述べていました。
マジックタコの壷

7
難易度パラメータが異なり、解決に必要なアプローチが非常に異なるため、この投稿を再度開くことに投票します。メタ投稿
user202729

3
推奨されるテストケース(Python、Ruby、Java、05AB1Eの回答で発生したエッジケースの場合)
Kevin Cruijssen

回答:


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}

@ValueInkのおかげで-10バイト

バグの@RosLuPのおかげで+16バイト。

オンラインでお試しください

(「高さ」の5つの)異なるベースパワータワーを比較しますか?

Ungolfedコード:

-> 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引数が1つしか指定されていない場合、デフォルトはbase です。

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

この更新はi = i ** jiそれ自体で使用されることはないyため、b^c^d^e == g^h^i(^j)2回ログを記録し、すべてを片側に移動した結果です。私たちは、その後、聞かせて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。はfalseであるを返し、は真実であるをreturn p返すことnilに注意してください。return 11

elsif b == 1
    return z > h

b == 1またはの場合g == 1、これはに比べa ** b ** cて減少しf ** g ** hます。これは、両側に2つのログを使用して行われます。

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

これは、両側を2回記録した後の4つの最高出力を比較します。それらが等しい場合、ベースを比較します。


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)

-59は、おかげバイト@EmbodimentOfIgnorance
へ-117バイトおかげ@Neil
約5バグフィックス、で見つかったすべてのために121バイト@ngnを

入力を2つのリストとして受け取ります。注:より大きなリストや長さが異なるリストでも機能します。編集:もはや真実ではありません。それはまだかの作品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でゴルフをするのも苦手
無知の


2
失敗[10,10,10,10,10]>[9,10,10,10,10]
無知の

1
この関数はR1回しか使用しないので、インライン化できますか?
無知の

1
@EmbodimentofIgnorance R5行目にはまだ未解決の呼び出しがあります...
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

10個の整数のリストとして入力します[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そして賞金についてはnpです。これは主に@SimplyBeautifulArtのアプローチのためですが、同時に課題に注意を向けます。それが反対票を投じた理由は、あなたが以前の回答の3時間後に数時間後に投稿したためです。私はこのチャレンジを個人的に気に入っており、最初に賛成投票して回答しましたが、チャレンジポストの下の最初のコメントでも真実を確認できます。うまくいけば、賞金があなたの挑戦を0またはポジティブにすることを願っています:)
Kevin Cruijssen

私は0になることを夢見ています!:)
アヌッシュ、

1
[2、1、1、1、1、3、1、1、1、1]結果1は、代わりに結果0でなければなりません
RosLuP

1
log1(x)

3

C、168 180バイト

Kevin Cruijssenの回答のCポート。

#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
うーん...ポートのポート* thonks *
Simply Beautiful Art

3,1,10,10,10,2,1,10,10,10私のJavaの回答も以前と同じように失敗します。彼はすべてのものを思い付いたとバグを修正1だから、それは...、実際に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}

上記の関数は、 "az w"でzを呼び出し、aの数値がwの数値より大きい場合は1を返し、そうでない場合は0を返します。

私が持っている場合

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

これは、f(aa)> f(bb)であり、aaとbbの両方に5つの正の数の配列が含まれます(a>がaaとbbのうちの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

チャレンジの説明のテストには、いくつかのエッジケースが欠けています。これらすべてのテストケースでも機能することを確認できますか?
Kevin Cruijssen、

1
@KevinCruijssenここで、上記のテストを除外しても問題ないと思われる場合のテスト
RosLuP

1
すべてのテストケースが正しい場合は、+ 1してください。コードの説明を楽しみにしています。:)
Kevin Cruijssen

1
あなたが取ることによって、各計算言っlog(log())たが、そのテストケースのために、との違いlog(log(10^10^10^10^10))とは、log(log(9^10^10^10^10))上でピックアップする精度の不合理な量を必要とします。約2e1010桁の精度の浮動小数点が必要です。そして、これは両側がとほぼ同じ大きさ10^10^10であるという事実を無視しています。これは、あなたが計算できたとは信じがたいことです。
単に美しい芸術

1
おそらくそれは失敗しますが9, 10, 10, 10, 10, 10, 9, 10, 10, 10、戻るはずです1s(9,10,10,10,10) < s(10,9,10,10,10)
単に美しい芸術

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回答のポートです。そのため、必ず彼に賛成票を投じてください。@SimplyBeautifulArtの
おかげで-14バイト。 Rubyの回答と同じバグ修正には+17バイト。

オンラインでお試しください。

説明:

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
単に美しい芸術

@SimplyBeautifulArt待って、それはしますか?.. Wtf。ゴルフしていないバージョンを持っていると、1つのテストケースで機能しませんでした。文字列の出力は同じでしたが、内部的には少し異なっていました。非ゴルフバージョンはあなたの非ゴルフバージョンでしたが、Rubyの回答にも含まれているゴルフの3値に変更しました。ばかげた浮動小数点精度..確かに現在のアプローチのテストケースで機能するため、変更されます。ありがとう。
Kevin Cruijssen、

笑、あなたがそれにいる間、あなたは私のアップデートを見たいかもしれません:^)
単に美しいアート

1
ty私がしたようにそれを置くことによって1バイトを節約するために削除することができます。TIO
Simply Beautiful Art

1
@SimplyBeautifulArt Nvm私の05AB1E回答を同じ変更で更新することについて。バイト数は96のままで
ケビンCruijssen
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.