無限の力の塔


22

チャレンジ

とてもシンプルで、入力が与えられxたら、無限のパワータワーを計算してください!

x^x^x^x^x^x...

あなたの数学愛好家にとって、これはx無限の四分割です。

次のことに注意してください。

x^x^x^x^x^x... = x^(x^(x^(x^(x...)))) != (((((x)^x)^x)^x)^x...)

驚いたことに、これに関連する「単純な」数学の挑戦はありませんでした!*

仮定

  • x、常に収束します。
  • 負の複素数を処理できる必要があります
  • これはなので、最低バイトが勝ちです!
  • あなたの答えは、少なくとも小数点以下5桁まで正しいはずです

Input >> Output

1.4 >> 1.8866633062463325
1.414 >> 1.9980364085457847
[Square root of 2] >> 2
-1 >> -1
i >> 0.4382829367270323 + 0.3605924718713857i
1 >> 1
0.5 >> 0.641185744504986
0.333... >> 0.5478086216540975
1 + i >> 0.6410264788204891 + 0.5236284612571633i
-i >> 0.4382829367270323 -0.3605924718713857i
[4th root of 2] >> 1.239627729522762

*(ここでのより複雑なチャレンジ以外)


1
このタワーは、x = −2またはx = −0.5で収束するとは思わない。
アンダースカセオルグ

@AndersKaseorg同意しますが、すべてのプログラムが同じ収束する答えを持っているようです。なぜ収束しないのですか?
グラビトン

2
x = −2は8サイクルに引き付けられ、x = −0.5は6サイクルに引き付けられます。(これらの場合でも私のプログラムは答えを出しますが、それはサイクルのポイントの1つであり、固定点ではありません。これは収束を示すものではありません。)
Anders Kaseorg

@AndersKaseorg Ahaとても興味深い。-2が「8」で-0.5が「6」である理由を知りませんか?もちろん好奇心から。
グラビトン

回答:




7

Haskell100 63バイト

収束しない入力(例えば-2)の場合、これは終了しません:

import Data.Complex
f x=until(\a->magnitude(a-x**a)<1e-6)(x**)x

@ØrjanJohansenに教えてuntilくれて37バイトを節約してくれてありがとう!

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


1
このuntil機能を使用すると、これを大幅に短縮できます。オンラインでお試しください!
Ørjanヨハンセン

きちんとした!知りませんuntilでした、どうもありがとう。
ბიმო

7

Pythonの340の39 35バイト

  • @ØrjanJohansenにバイトをありがとう:d>99代わりにd==99:バイトカウントを少なくするためにもう1回繰り返し
  • 4バイトの@Urielに感謝しますx**True。x inに評価される事実の賢明な利用x**(d>99or g(x,d+1))。用語内の式は、深度が99を超えるとTrueと評価されるため、渡された値を返します。

深さ100の最大深度100の再帰的ラムダは、同じ値を返します。実際には収束に依存しないため、関数の値が収束しない数値では予期しないことが予想されます。

g=lambda x,d=0:x**(d>99or g(x,d+1))

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


1
ョリンクでは、あなたは置き換えることができcomplex('j')1j
氏Xcoder

1
d>99もう1回反復し、短くなります。
Ørjanヨハンセン

1
4バイトの保存g=lambda x,d=0:x**(d>99or g(x,d+1))x**Trueと評価されたx
ウリエル

@Uriel、それは本当に賢い.....ありがとう!!!
officialaimm

6

Pythonの3、37の 30 27バイト

@FelipeNardiBatistaから-7バイト。
@xnorから-3バイト

Pythonのことはもうあまり覚えていませんが、Rubyの答えを移植して、他のPython 3の答えを打ち負かすことができました:D

lambda x:eval('x**'*99+'1')

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


1
参考までに、f-stringsはPython 3.6で初めて導入されたようです:python.org/dev/peps/pep-0498を参照してください。(これは、あなたのコードが3.5.2で私にとってうまくいかなかった理由を説明するでしょう。)他の誰かが混乱した場合に備えて、これについて言及すると思いました。
-mathmandan

1
の値を代入する必要はありませんxeval('x**'*99+'1')動作
-xnor

@xnor doh、もちろんそうです:)ありがとう
-daniero

@xnor Neat-同じことをRubyの回答に適用し、それを何らかの形で修正しました:)
daniero

+ 1、evalの存在を忘れて自分を平手打ちしています。...:D
officialaimm


4

J、5バイト

^^:_~

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

説明

最初に、~最後に構文解析した後にどのコマンドが実行されているかを示します。ウォークスルーは新しい動詞になります。

(^^:_~) x = ((x&^)^:_) x

((x&^)^:_) x  |  Input: x
      ^:_     |  Execute starting with y = x until the result converges
  x&^         |    Compute y = x^y

Jソリューションはここで本当に素晴らしいです。細かい粒内にあなたの最初の行を打破するために、それは次のことが起こると言うことは正しいです:(^^:_) パワーCONJを経由して、新たな二項動詞を作成し、その後、自己の副詞は~作ることモナド動詞なので、その引数与えられたとき、xそれが拡大していますがx (^^:_) x。左側xに「スティック」が続き((x&^)^:_) x、メモごとに与えられ、反復中に右側の引数のみが変更されますか?
ジョナ

1
@Jonah確かに、力を持つダイアドに2つの引数を与えるx u^:n yと、左の引数はダイアドと結合され、ネストn時間onのモナドを形成しyます。x u^:n y -> (x&u)^:n y -> (x&u) ... n times ... (x&u) y
マイル

4

C#(.NET Core)79 78バイト

x=>{var a=x;for(int i=0;i++<999;)a=System.Numerics.Complex.Pow(x,a);return a;}

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

i99 まで繰り返す場合、いくつかの例が必要な精度に達しなかったため、= 999 まで繰り返すことを選択しました。例:

Input:                      (0, 1)
Expected output:            (0.4382829367270323, 0.3605924718713857)
Output after 99 iterations: (0.438288569331222,  0.360588154553794)
Output after 999 iter.:     (0.438282936727032,  0.360592471871385)

ご覧のとおり、99回の反復後、虚数部は小数点第5位で失敗しました。

Input:                      (1, 1)
Expected output:            (0.6410264788204891, 0.5236284612571633)
Output after 99 iterations: (0.64102647882049,   0.523628461257164)
Output after 999 iter.:     (0.641026478820489,  0.523628461257163)

この場合、99回の反復の後、予想される精度が得られます。実際、i同じバイトカウントで= 1e9 まで繰り返すことができましたが、コードがかなり遅くなります

  • 匿名ユーザーのおかげで1バイトが節約されました。

1
+1複雑なクラスの場合、それが存在することすら知りませんでした。
TheLethalCoder

1
@TheLethalCoderは、グーグルで検索するまで私もしませんでした。:
チャーリー


2

ルビー、21 20バイト

->n{eval'n**'*99+?1}

免責事項:複素数を累乗する、Rubyは奇妙な値を返すようです。Rubyの数学モジュール全体を修正することはこの課題の範囲外であると思いますが、それ以外の場合、この関数の結果は正しいはずです。 編集:私の Python 3の答えから最新の変更を適用すると、突然、どういうわけか同じ、期待される結果が得られます:)

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


の後にスペースを取り出しevalます。
値のインク

あなたの元のバージョンは複雑なテストケースで失敗しました。なぜならそれは文字列"0+1i**0+1i**0+1i**..."を評価したから**です+
Ørjanヨハンセン

@ØrjanJohansenそうですね。異なる値#inspect#to_s返すという事実にだまされたと思います。最初の回答を提出する前に、irbでいくつかのテストを行い、たとえばComplex(1,2)、REPLに入力すると(1+2i)、かっこを含めてが得られることを確認しました。ただし、値を文字列化する場合、括弧は含まれないため、指摘するように、優先順位はそれを台無しにします。
ダニエロ

eval使用は禁止されていると思いました。
V.クルトワ

@ V.Courtois OK。しかし、そうではありません。
ダニエロ

2

TI-BASIC、16バイト

入力と出力はに保存されAnsます。

Ans→X
While Ans≠X^Ans
X^Ans
End



1

MATL20 10バイト

@LuisMendoのおかげで半分に削減

t^`Gw^t5M-

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

これは私の最初のあり、MATLを初めて使用するので、簡単にアウトゴルフできる可能性があります。


このサイトへようこそ、そして最初の回答がいいです!いくつかの提案:XIIはと同等tです。また、取り除くことができますXHし、H自動クリップボード使用してM、あります、ttt^`yw^t5M-]bb-x。最後の部分では、不要な値を削除する代わりに&、を使用して、暗黙的な表示機能に最上部のみを表示するように指示できます。そのttt^`yw^t5M-]&ため、数バイトを使用して保存できます。
ルイスメンドー

また、最初のものtは必要ありません。G別のものの代わりに使用すると、t回避できるため&]暗黙的に残すことができますt^`Gw^t5M-。ちょっと、バイト数を半分に減らしました!
ルイスメンドー

@LuisMendo素晴らしいヒントをありがとう!MATLについて学ぶことはたくさんありますが、本当に気に入っています。
シナスキ

それを聞いてうれしい!
ルイスメンドー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.