純粋な悪:評価
a=lambda x,y:(y<0)*x or eval("a("*9**9**9+"x**.1"+",y-1)"*9**9**9)
print a(input(),9**9**9**9**9)//1
eval内のステートメントは、長さが7 * 10 10 10 10 10 10 8.57の文字列を作成します。これは、それぞれが同様の長さの文字列を構築するラムダ関数への呼び出しだけで構成され、最終的に0 になります。これは、以下のEschewメソッドと同じ複雑さを持ちますが、if-or-or制御ロジックに依存するのではなく、巨大な文字列を一緒に壊します(そして、最終的な結果はより多くのスタックを取得しています...おそらく?)。y
y
Pythonがエラーをスローすることなく提供および計算できる最大値は2です。これは、max-floatの入力を1に戻すのに十分です。
長さ7,625,597,484,987の文字列は大きすぎます:OverflowError: cannot fit 'long' into an index-sized integer
。
停止する必要があります。
避けるにはMath.log
:(問題の)(10th-)ルートに行く、スコア:Y = 1から効果的に区別できない機能。
数学ライブラリをインポートすると、バイト数が制限されます。それをやめて、log(x)
関数をほぼ同等のものに置き換えましょう:x**.1
ほぼ同じ文字数ですが、インポートを必要としません。どちらの関数も入力に対して準線形出力を持ちますが、x 0.1はさらにゆっくりと成長します。しかし、私たちはあまり気にせず、同じ数の文字を消費しながら大きな数に対して同じ基本成長パターンを持っていることだけを気にします(たとえばx**.9
、同じ数の文字ですが、より速く成長するので、まったく同じ成長を示す値です)。
さて、16文字でどうするか。どうでしょう...私たちのラムダ関数を拡張してアッカーマンシーケンスプロパティを持たせますか 多数の回答がこのソリューションに影響を与えました。
a=lambda x,y,z:(z<0)*x or y and a(x**.1,z**z,z-1)or a(x**.1,y-1,z)
print a(input(),9,9**9**9**99)//1
ここでのz**z
部分は、との正しい入力に近い場所でこの関数を実行できないようにします。使用できる最大値は9と3で、Pythonがサポートする最大の浮動小数点数であっても、1.0の値を返します(注:while 1.0数値が6.77538853089e-05より大きい場合、再帰レベルを上げると、この関数の出力が1に近づき、1を超えたままになります。一方、前の関数は0に近づき、0を超えたまま値を移動しました。浮動小数点数がすべての重要なビットを失うほど多くの操作が発生します)。y
z
0と2の再帰値を持つように元のラムダ呼び出しを再構成します...
>>>1.7976931348623157e+308
1.0000000071
比較は、この関数が返す「1からのオフセット」の代わりに「0からのオフセット」に言及されている場合7.1e-9
よりも確実に小さくなっています、6.7e-05
。
実際のプログラムの基本再帰(z値)は10 10 10 10 1.97レベルの深さで、yが使い果たされるとすぐに10 10 10 10 10 1.97にリセットされるため(初期値9で十分です)発生する再帰の総数を正確に計算する方法すら知りません。数学的知識の終わりに達しました。同様に、**n
累乗の1つを初期入力から2 次に移動z**z
することで、再帰の数が改善されるかどうか(逆も同様)かどうかはわかりません。
さらに多くの再帰を使用してさらに遅くすることができます
import math
a=lambda x,y:(y<0)*x or a(a(a(math.log(x+1),y-1),y-1),y-1)
print a(input(),9**9**9e9)//1
n//1
-2バイトを節約 int(n)
import math
、math.
1バイトを節約from math import*
a(...)
合計8バイトを節約 m(m,...)
(y>0)*x
バイトを節約しますy>0and x
9**9**99
4によるカウントバイト増加し、約によって再帰の深さを増加させる2.8 * 10^x
場合には、x
古い深さ(または大きさグーゴルプレックスに近づい深さ:10 10 94)。
9**9**9e9
バイト数を5増やし、再帰深さを非常に大きくします。再帰の深さは10 10 10 9.93になりました。参照のため、googolplexは10 10 10 2です。
- ラムダ宣言により、追加のステップで再帰が増加
m(m(...))
しa(a(a(...)))
ます。コストは7バイトです
新しい出力値(9再帰深度):
>>>1.7976931348623157e+308
6.77538853089e-05
再帰の深さは、同じ入力値を使用した以前の結果と比較した場合を除き、この結果が文字通り意味をなさないレベルまで爆発しました。
log
25回と呼ばれるオリジナル
- 最初の改善はそれを81回と呼びます
- 実際のプログラムでは、1e99それを呼ぶだろう2または10について10 2.3倍
- このバージョンは729回呼び出します
- 実際のプログラムでは、(9呼び出すであろう9 99)3または弱10 10 95倍)。
ラムダインセプション、スコア:???
ラムダが好きだと聞いたので...
from math import*
a=lambda m,x,y:y<0and x or m(m,m(m,log(x+1),y-1),y-1)
print int(a(a,input(),1e99))
私はこれを実行することさえできません。たった99層の再帰でもオーバーフローをスタックします。
古いメソッド(以下)は(整数への変換をスキップして)戻ります:
>>>1.7976931348623157e+308
0.0909072713593
新しいメソッドは、(完全なgoogolではなく)9層の侵入を使用して戻ります:
>>>1.7976931348623157e+308
0.00196323936205
これは、アッカーマンシーケンスと同様の複雑さで、大きなものではなく小さなものになると思います。
また、ETHproductionsのおかげで、スペースを3バイト節約できたので、これは削除できないことに気づきました。
古い答え:
関数log(i + 1)の整数切り捨ては、ラムダ処理されたラムダを使用して20 25回(Python)繰り返されました。
PyRulezの答えは、2番目のラムダを導入してスタックすることで圧縮できます。
from math import *
x=lambda i:log(i+1)
y=lambda i:x(x(x(x(x(i)))))
print int(y(y(y(y(y(input()))))))
99使用される100文字。
これにより、元の12に対して20 25の反復が生成されます。さらに、スタックを追加するint()
代わりに使用することで2文字を節約floor()
できx()
ます。ラムダの後のスペースを削除できる場合(現時点では確認できません)、5番目y()
を追加できます。可能!
from math
完全修飾名(例:)を使用してインポートをスキップする方法がある場合x=lambda i: math.log(i+1))
、さらに多くの文字が保存され、別のスタックが可能になりますがx()
、Pythonがそのようなことをサポートしているかどうかはわかりません(そうではないと思います)。できた!
これは、本質的にXCKDのブログ投稿で使用されている大きな数字と同じトリックですが、ラムダ宣言のオーバーヘッドにより3番目のスタックが排除されます。
from math import *
x=lambda i:log(i+1)
y=lambda i:x(x(x(i)))
z=lambda i:y(y(y(i)))
print int(z(z(z(input()))))
これは、計算されたスタックの高さ2ラムダを超える3ラムダで可能な最小の再帰です(ラムダを2呼び出しに減らすと、スタックの高さが2ラムダバージョンのスタックの高さより18低くなります)が、残念ながら110文字が必要です。