100 baytın altındaki en yavaş büyüyen işlevi oluşturun


23

İşiniz en fazla 100 baytta yapabileceğiniz en yavaş büyüyen işlevi oluşturmaktır.

Programınız, negatif olmayan bir tamsayı girişi olarak alır ve negatif olmayan bir tamsayı verir. Programınızı P olarak adlandıralım.

Bu iki kriteri karşılamalıdır:

  • Kaynak kodunun 100 bayttan küçük veya ona eşit olması gerekir.
  • Her K için bir N vardır, öyle ki her n> = N, P (n)> K. Başka bir deyişle, lim (n-> ∞) P (n) = ∞ . ("Büyümek" için anlamı budur.)

"Puanınız", programınızın temel işlevinin büyüme oranıdır.

Daha spesifik olarak, tüm n> = N, P (n) <= Q (n) için bir N varsa ve P (n) olacak şekilde en az bir n> = N varsa, P programı Q'dan daha yavaş büyür. ) <Q (n). Her iki program da diğerinden daha iyi değilse, bunlar bağlı olacaktır. (Temel olarak, hangi programın daha yavaş olduğu lim (n-> ∞) P (n) -Q (n) değerine dayanır .)

En yavaş büyüyen işlev, önceki paragraftaki tanıma göre, diğer işlevlerden daha yavaş büyüyen işlev olarak tanımlanır.

Bu , bu yüzden en yavaş büyüyen program kazanır!

Notlar:

  • Puanlamaya yardımcı olmak için, programınızın cevabında hangi işlevi hesapladığını koymaya çalışın.
  • Ayrıca, insanlara ne kadar yavaş gidebileceğiniz konusunda bir fikir vermelerine yardımcı olmak için bazı (teorik) girdi ve çıktılar koyun.


3
Etkili bir strateji hızlı büyüyen bir fonksiyon yazmak ve tersini almaktır, yani en azından gerekli değeri üreten ona en küçük girdiyi bulmaktır. Belki de bu bir dupe?
xnor

"Daha spesifik olarak" paragrafının üçte biri eksikti çünkü Markdown <bir harfin ardından bir HTML etiketinin başlangıcı olduğunu düşünüyor . Lütfen sorularınızı göndermeden önce önizleyin: P
ETHproductions

1
Hangi büyük kardinal aksiyomları varsayabiliriz?
Peter Taylor

1
Cevaplarımızı test etmek için zaman makinesi var mı?
Magic Octopus Urn

Yanıtlar:


13

Haskell, 98 bayt, puan = f ε 0 −1 ( n )

_#[]=0
k#(0:a)=k#a
k#(a:b)=1+(k#(([1..k]>>fst(span(>=a)b)++[a-1])++b))
f n=[k|k<-[0..],k#[k]>n]!!0

Nasıl çalışır

Bu, Beklemişev'in solucan oyunu ile ilgili çok hızlı büyüyen bir fonksiyonun tersini hesaplar . Bu büyüme oranı ile karşılaştırılabilir f ε 0 , f α olan hızlı büyüyen hiyerarşisi ve e 0 ilk epsilon numarası .

Diğer cevaplarla karşılaştırmak için

  • üs ile karşılaştırılabilir f 2 ;
  • tekrarlanan üs ( tetrasyon veya ↑↑ ) ile karşılaştırılabilir f 3 ;
  • ↑↑ ⋯ ↑↑ ile m oklar ile karşılaştırılabilir f m + 1 ;
  • Ackermann fonksiyonu ile karşılaştırılabilir f w ;
  • Ackermann fonksiyonunun tekrarlanan yinelemelerinde ( Graham sayısı gibi yapılar ) hala f 1 + 1 ;
  • ve ε 0 , ω ω ω ω kulelerinin sınırıdır .

Buradaki açıklamayı daha çok seviyorum .
PyRulez

Googology Wiki'nin hızlı büyüyen hiyerarşisine girişine bir link verebilirsiniz
MilkyWay90

18

Brachylog , 100 bayt

llllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll

Çevrimiçi deneyin!

Bu muhtemelen diğer bazı süslü cevapların yavaşlığına yakın bir yerde değil, ama kimsenin bu basit ve güzel yaklaşımı denemediğine inanamadım.

Basitçe, giriş sayısının uzunluğunu, ardından bu sonucun uzunluğunu, daha sonra bu diğer sonucun uzunluğunu hesaplıyoruz ... toplam 100 kez.

Bu, günlük sayısı kadar hızlı büyür (log (log ... log (x), 100 base-10 log).

Numaranızı bir dize olarak girerseniz , bu deneyebileceğiniz herhangi bir girişte çok hızlı çalışır, ancak 1: D'den daha yüksek bir sonuç görmeyi beklemeyin.


8
+1 sadece saf delilik için: o Eğlenceli gerçek: Her şeyi kapak yaparsanız Jelly'de de çalışır. : P
HyperNeutrino

5
2 veren ilk sayı 10 ↑↑ 99'dur.
Buğday Sihirbazı,

11

JavaScript (ES6), Ters Ackermann İşlevi *, 97 bayt

* doğru yaptıysam

A=(m,n)=>m?A(m-1,n?A(m,n-1):1):n+1
a=(m,n=m,i=1)=>{while(A(i,m/n|0)<=Math.log2(n))i++;return i-1}

İşlev A, Ackermann işlevidir . İşlev Ters Ackermann işlevia olmalıydı . Doğru uygularsam, Wikipedia eşit oluncaya kadar vurulmayacağını söylüyor . Ben etrafta dolaşırım .5m2^2^2^2^16StackOverflow1000

Kullanımı:

console.log(a(1000))

açıklamalar:

Ackermann İşlevi

A=(m,n)=>                           Function A with parameters m and n
         m?                   :n+1  If m == 0, return n + 1; else,
           A(m-1,n?        :1)       If n == 0, return A(m-1,1); else,
                   A(m,n-1)          return A(m-1,A(m,n-1))

Ters Ackermann İşlevi

a=(m,n=m,i=1)=>{                                                Function a with parameter m, with n preinitialized to m and i preinitialized to 1
                while(A(i,m/n|0)<=Math.log2(n))                 While the result of A(i, floor(m/n)) is less than log₂ n,
                                               i++;             Increment i
                                                   return i-1}  Return i-1

2
Yığın Taşması olsa iyi değil mi?
NoOneIsHere

M = 2 ^^ 7 yanlış olana kadar 5'e vurmayacağına dair ifaden. M, 2 ^^ 7-3, fakat 2 ^^ 7-1 de, bu = gelene kadar 5 girmeyecektir olan I olduğu -3 bilmek 5. çok 2 ^^ 7, ama 5A5 = 2 ile karşılaştırıldığında küçük ^^ 7-3 <2 ^^ 7. (^^, tetrasyonu temsil eder)
user75200,

8

Saf Kötülük: Eval

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 içindeki deyim uzunluğu 7 * dizesi oluşturur 10 10 10 10 10 10 8.57 şey ama oluşur lambda işlevine daha aramaların bir dizi inşa edecek, her biri benzer sonunda kadar bu şekilde devam uzunluğunda y0. görünürde olur bu, aşağıdaki Eschew yöntemiyle aynı karmaşıklığa sahiptir, ancak eğer ve-veya-kontrol mantığına dayanmak yerine, sadece dev dizeleri bir araya getirir (ve net sonuç daha fazla yığın alıyor ... muhtemelen?).

yPython hata vermeden sağlayabildiğim ve hesaplayabildiğim en büyük değer 2'dir, ki bu bir maksimum-yüzdürme girişini 1'e geri döndürmek için yeterlidir.

Uzunluğunda 7.625.597.484.987 bir dize sadece çok büyük: OverflowError: cannot fit 'long' into an index-sized integer.

Durmalıyım.

Kaçınmak Math.log: (sorunun) (10th-) kök giderek, skor: fonksiyonu etkili bir şekilde ayırt y = 1 den.

Matematik kitaplığını içe aktarmak bayt sayısını kısıtlıyor. Bunu kaldıralım ve log(x)işlevi kabaca eşdeğer bir şeyle değiştirelim : x**.1bu yaklaşık olarak aynı sayıda karaktere mal olur, ancak içe aktarılmasını gerektirmez. Her iki fonksiyon da girişe göre alt çizgi çıkışa sahiptir, ancak x 0.1 daha yavaş büyür . Bununla birlikte, çok fazla umursamıyoruz, yalnızca çok sayıda sayıyla aynı temel büyüme modeline sahip olmasına dikkat ediyoruz (örneğin x**.9, aynı sayıda karakter tüketiyor , ancak daha hızlı büyüyor; aynı büyümeyi sergileyebilecek bir değerdir).

Şimdi, 16 karakterle ne yapmalı. Lambda fonksiyonumuzu Ackermann Sequence özelliklerine sahip olacak şekilde genişletmeye ne dersiniz? Çok sayıda bu cevap bu çözüme ilham verdi.

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

Bu z**zbölüm, bu işlevi aklı başında girdilere yakın herhangi bir yerde çalıştırmamı engelliyor yve zkullanabileceğim en büyük değerler 9 ve 3'tür ; bunun için en büyük kayan Python desteği için bile 1.0 değerini geri alırım (not: 1.0 sayısal olarak 6.77538853089e-05'ten büyük olduğunda, artan özyineleme seviyeleri, bu fonksiyonun çıktısını 1'e yaklaştırırken, 1'den büyük kalırken, önceki fonksiyon, 0'dan büyük kalırken değerleri 0'a yaklaştırdı; kayan nokta sayısı tüm önemli bitlerini kaybedecek kadar çok işlemle sonuçlanır .

Özgün lambda çağrısının 0 ve 2 özyineleme değerlerine sahip olacak şekilde yeniden yapılandırılması ...

>>>1.7976931348623157e+308
1.0000000071

Karşılaştırma, "1 dengeleme" yerine "0 dengeleme" ile yapılırsa, bu işlev 7.1e-9kesinlikle daha küçük olana döner 6.7e-05.

Gerçek programın temel özyinelemesi (z değeri) 10 10 10 10 10 1.97 , derinlemesine başlar tükenmez, 10 10 10 10 10 1.97 ile sıfırlanır (9'un başlangıç ​​değeri yeterlidir), Oluşan toplam yinelemelerin sayısını doğru bir şekilde hesaplamayı bile bilmiyorum: Matematiksel bilgimin sonuna geldim. Benzer şekilde **nüslerinden birinin ilk girdiden ikinciye taşınmasının z**zözyineleme sayısını iyileştirip iyileştirmeyeceğini bilmiyorum (tersine çevirmek).

Daha fazla özyineleme ile daha da yavaşlayalım

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 bayttan fazla tasarruf sağlar int(n)
  • import math, math.1 bayttan tasarruf sağlarfrom math import*
  • a(...) toplamda 8 bayt tasarruf m(m,...)
  • (y>0)*x Bir bayt kaydeder overy>0and x
  • 9**9**99bayt sayısını 4 artırır ve yineleme derinliğini yaklaşık olarak eski derinliğin 2.8 * 10^xolduğu yerde artırır x(veya bir googolplex'e yaklaşan bir derinlik: 10 10 94 ).
  • 9**9**9e9bayt sayısını 5 artırır ve yineleme derinliğini artırır ... delice bir miktar. Özyineleme derinliği şimdi 10 10 10 9,93 , referans için bir googolplex 10 10 10 2'dir .
  • lambda beyanı fazladan adım Özyinelemeyi artırır: m(m(...))için a(a(a(...)))maliyetlerin 7 bayt

Yeni çıktı değeri (9 özyineleme derinliğinde):

>>>1.7976931348623157e+308
6.77538853089e-05

Özyineleme derinliği, aynı girdi değerlerini kullanan önceki sonuçlarla karşılaştırıldığında , bu sonucun kelimenin tam anlamıyla anlamsız olduğu noktaya patladı :

  • Orijinal log25 kez aradı
  • İlk gelişme 81 kez diyor
    • Gerçek programı 1e99 çağırır 2 veya 10 yaklaşık 10 2.3 kat
  • Bu sürüm 729 kez arar
    • Gerçek bir program tarafından (9 çağırır 9 99 ) 3 ya da biraz az 10 10 95 kez).

Lambda Başlangıç, skor: ???

Lambdaları sevdiğini duydum, yani ...

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))

Hatta bu koşamam, ben sadece bile taşma yığını 99 özyinelemenin katmanları.

Eski yöntem (aşağıda) döndürür (dönüşümü bir tamsayıya atlayarak):

>>>1.7976931348623157e+308
0.0909072713593

Yeni yöntem, yalnızca 9 kat saldırı bildirimi kullanarak (tam googol yerine) döndürür :

>>>1.7976931348623157e+308
0.00196323936205

Bunun Ackerman dizisine benzer bir karmaşıklığa sahip olduğunu düşünüyorum, sadece büyük yerine küçük.

Ayrıca ETHproductions sayesinde mekanlarda 3-byte tasarruf sağladığımı fark etmedim.

Eski cevap:

Fonksiyon günlüğünün tamsayı kesmesi (i + 1) lambda'd lambdas kullanarak 20 25 kez (Python) yinelenmiştir.

PyRulez'in cevabı, ikinci bir lambda tanıtılarak ve istiflenerek sıkıştırılabilir:

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 karakter kullanılmış.

Bu , orijinal 12'nin üzerinde 20 25'lik bir yinelemeye neden olur . Ayrıca , ek bir yığın için izin vermek int()yerine, kullanarak 2 karakter kaydeder . Lambda'dan sonraki boşluklar kaldırılabiliyorsa (şu anda kontrol edemiyorum), o zaman 5. bir eklenebilir. Mümkün!floor()x()y()

from mathTamamen nitelikli bir ad kullanarak (örneğin x=lambda i: math.log(i+1))) içe aktarmayı atlamanın bir yolu varsa , bu daha fazla karakter kaydeder ve başka bir yığına izin verir, x()ancak Python'un bu gibi şeyleri destekleyip desteklemediğini bilmiyorum (sanmıyorum). Bitti!

Bu esasen XCKD'nin blog yazısında büyük sayılarda kullanılan aynı numaradır , ancak lambda ilan etmenin ek yükü üçüncü bir yığını engellemektedir:

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()))))

Bu, 2 lambda'nın hesaplanan yığın yüksekliğini aşan 3 lambda ile mümkün olan en küçük özyinelemedir (herhangi bir lambdayı iki çağrıya düşürmek, yığın yüksekliğini 2 lambda sürümünün altına 18'in altına düşürür), ancak ne yazık ki 110 karakter gerektirir.


Bilginize, en iyi programda 103 byte sayıyorum
ETHproductions

@ETHproductions oh ayyerler. Muhtemelen intdönüşüm olmadan bir sayım yaptım ve bazı yedeklerim olduğunu düşündüm.
Draco18,

Ben düşünüyorum Eğer sonra boşluk kaldırabilir importve sonra boşluk y<0. Çok fazla Python bilmiyorum, bu yüzden emin değilim
ETHproductions

Ayrıca, belki de y<0and x or m(m,m(m,log(x+1),y-1),y-1)(varsayarak başka byte kaydetmek için xasla 0zaman y<0)
ETHproductions

2
Peki ... log(x)HERHANGİ BİR pozitif gücünden x(büyük değerler için x) daha yavaş büyür ve L'Hopital'in kuralını kullanarak bunu göstermek zor değildir. Şu anki sürümünüzün (...(((x**.1)**.1)**.1)** ...)birçok kez çalıştığından eminim . Fakat bu güçler sadece çoğalırlar, bu nedenle etkilidir x**(.1** (whole bunch)), ki bu (çok küçük) pozitif bir güçtür x. Bu aslında günlük fonksiyonunun TEK yinelemesinden daha hızlı büyüdüğü anlamına gelir (buna rağmen, xfarkına varmadan önce ÇOK büyük değerlere bakmak zorunda kalacaksınız ... ama "sonsuza kadar gitmek" ile kastettiğimiz budur) ).
mathmandan

4

Haskell , 100 bayt

f 0 a b=a^b
f c a b=foldr(f$c-1)a$[0..b]>>[a]
i=length.show
0#x=i x
y#x=i$(y-1)#x
g=(f(f 9 9 9)9 9#)

Çevrimiçi deneyin!

Bu çözüm hızlı büyüyen bir fonksiyonun tersini almaz, bunun yerine yavaş yavaş büyüyen bir fonksiyonu alır ve bu işlemi birkaç length.showkez uygular.

İlk önce bir fonksiyon tanımlarız f. fbiraz daha hızlı büyüyen Knuth'un en tepeli notasyonunun piç kurusu (hafif bir miktar hafiftir, ancak uğraştığımız rakamlar o kadar büyüktür ki, olayların büyük şemasında…). Temel olayı f 0 a bolmak a^bya ada onun gücüne göre tanımlarız b. Daha sonra örneklerine (f$c-1)uygulanacak genel durumu tanımlarız . Yapı gibi bir Knuth tepesi gösterimini tanımlıyor olsaydık, bunu örneklerine uygulardık , ama aslında golfçüdür ve daha hızlı büyümek olma avantajına sahiptir.b+2abab+2

Daha sonra operatörü tanımlarız #. zamanlara uygulanacak şekilde a#btanımlanmıştır . Her bir uygulama yaklaşık 10 kütüğüne eşittir , bu da çok hızlı büyüyen bir işlev değildir.length.showb alength.show

Daha sonra gtam sayıya giren ve tam sayı yapan ve tam sayı yapan fonksiyonumuzu tanımlamaya devam ediyoruz length.show. Daha açık olmak gerekirse length.showgirdi için geçerlidir f(f 9 9 9)9 9. Bunun ne kadar büyük olduğunu anlamadan önce bakalım f 9 9 9. f 9 9 9olan daha büyük 9↑↑↑↑↑↑↑↑↑9 bir büyük farkla, (dokuz oklar). 9↑↑↑↑↑↑↑↑↑9(Dokuz ok) ve 9↑↑↑↑↑↑↑↑↑↑9(on ok) arasında bir yerde olduğuna inanıyorum . Şimdi, bu, düşünülemez derecede büyük bir sayıdır, var olan herhangi bir bilgisayarda (ikili gösterimde) depolanacak kadar büyüktür. Sonra o alıp kızımız ilk argüman olarak koymak fbizim değer daha büyüktür demektir 9↑↑↑↑↑↑...↑↑↑↑↑↑9ilef 9 9 9aradaki oklar. Bu numarayı tarif etmeyeceğim çünkü çok büyük çünkü adaleti yapabileceğimi sanmıyorum.

Her biri length.show, tamsayının 10 tabanını almaya yaklaşık olarak eşittir. Bu, sayıların çoğunun fonlara uygulandığında 1 değerini döndüreceği anlamına gelir . 1'den başka bir şey döndürmek için en küçük sayı 2 10↑↑(f(f 9 9 9)9 9)döndürür. Bu bir an için düşünelim. Daha önce tanımladığımız sayı kadar büyükse, 2 döndüren en küçük sayı kendi gücüne göre 10'dur. Thats 1 ardından 10↑(f(f 9 9 9)9 9)sıfırlar.

En nküçük girişin genel durumu için verilen herhangi bir n olmalıdır (10↑(n-1))↑↑(f(f 9 9 9)9 9).

Bu programın küçük n için bile çok fazla zaman ve bellek gerektirdiğini unutmayın (evrende olduğundan daha fazla), bunu test etmek istiyorsanız, f(f 9 9 9)9 9çok daha küçük bir sayıyla değiştirmenizi öneririm , isterseniz 1 veya 2'yi deneyin. 1 dışında herhangi bir çıktı almak.


Meh, kimsenin programın bu tür sorular üzerinde çalışması için ne kadar süreceği veya ne kadar hafıza gerektiğiyle ilgilendiğini sanmıyorum.
Simply Beautiful Art,

3

APL, Uygula log(n + 1), e^9^9...^9kez, zincirin e^9^9...^9uzunluğu zincir eksi 1 kez vb.

⌊((⍟1+⊢)⍣((*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣(*⍣⊢)))))))))))))))))))))9))⊢

Bunu yönetebileceğim bir yol var mı?
Draco18,

7
@ Draco18'ler neredeyse sonsuz belleğe sahip bir kuantum bilgisayar elde eder, düzgün bir APL dağıtımı kurar ve yaşlanmayı önleyen serum oluşturmak için beklediğiniz süreyi harcar, çünkü birkaç yüzyıl boyunca sıkı oturmanız gerekir.
Uriel

Haha. Tamam ozaman. : p
Draco18,

Bunun sonsuzluğa yaklaştığına emin misin?
PyRulez

@PyRulez, sadece günlükte daha fazla yineleme ile, diğer çözümler ile aynı. fakat daha fazla yineleme hala aynı kapanıştır - bu kadar çok üsse dayanarak dayatılabilir. Bölümden emin e^n^n...^ndeğildim, o yüzden sürekli hale getirdim, ama doğru olabilir
Uriel

3

MATL , 42 bayt

iXI:`2*.]X{oXH1H/16L+XKxI:`Yl.]K+XKXdXzXGx

Çevrimiçi deneyin!

Bu program Euler-Mascheroni sabitinin kullanımıyla harmonik serilere dayanmaktadır. MATL dilinde @LuisMendo belgelerini okurken (büyük harflerle, bu yüzden önemli görünüyor) bu sabiti farkettim. Yavaş büyüme fonksiyonu ifadesi aşağıdaki gibidir: görüntü tanımını buraya girin

nerede εk ~ 1 / 2k

10000 iterasyona kadar test ettim (Matlab'da, çünkü TIO için çok büyük) ve 10'un altında kalıyor, bu yüzden çok yavaş.

görüntü tanımını buraya girin

açıklamalar:

 iXI      % ask user input (number of iterations)

:`2*.]    % do...while loop, multiply by 2

X{        % convert numeric array into cell array

o         % convert to double precision array 

XH1H/     % copy to clipboard H and divide by 1: now we have an array of 1/2k

16L       % Euler–Mascheroni constant 

+         % addition (element-wise, singleton expansion)

XKxI:`    % save, clear the stack, do...while loop again

  Yl      % logarithm 

  .]      % break, ends the loop

K+XK      % paste from clipboard K, sum all

Xd        % trim: keep the diagonal of the matrix 

Xz        % remove all zeros

XG        % plot (yes it plots on-line too!)

x         % clear the stack
          % (implicit) display

Deneysel kanıt: (ln k ) + 1 kırmızı, her zaman ln k + γ + εk mavi renklerin üzerinde.

görüntü tanımını buraya girin

(Ln için program) k ) + 1 yapıldı.

Matlab, 47 18 14 bayt

n=input('')
A=(1:n)
for k=1:n
A(k)=log(k)+1
end

N = 100 için geçen sürenin dizüstü bilgisayarımda 0.208693, ancak yalnızca 0.121945 d=rand(1,n);A=d*0; ve hatta daha az olduğunu not etmek ilginç A=zeros(1,n). Eğer sıfırlar bir alan kaybıysa, hız kazandırır! Ancak konudan ayrılıyorum (muhtemelen çok yavaş).

Düzenleme: Bu Matlab ifadesini azaltmaya yardımcı olduğu için Stewie'ye teşekkür ederiz :

 @(n)log(1:n)+1

Sadece hızlı bir fonksiyonun tersi olmamak için +1
PyRulez

1
İlginç notunuz hakkında ilginç bir SO-posta . :)
Stewie Griffin,

: Bu arada, (eğer bayt sayısı dahil beri) alt komut golf: Geçen MATLAB komut basitçe n=input('');A=log(1:n)+1veya isimsiz bir anonim fonksiyon olarak (14 bayt): @(n)log(1:n)+1. MATLAB konusunda emin değilim, ama A=log(1:input(''))+1Octave'da çalışıyor ...
Stewie Griffin

thank you @Stewie n=input('');A=log(1:n)+1işe yaramıyor @(n)log(1:n)+1(gerçekten de Matlab'da geçerli olan bir fonksiyondur, ancak girdi istenmez), A=log(1:input(''))+1çalışır ve kısaltılabilirlog(1:input(''))+1
J Doe

Ne anonim fonksiyonu ile geliyordu bu . Girdiyi gerektirerek baytları (en azından bu sitede) kaydetmenin "normal" yolu komut satırı yerine işlev argümanları (meta-post) olarak verilir . Ayrıca, f=sayılması gerekmez, çünkü sadece şunları yapmak mümkündür: ilk 10 rakamı almak için @(n)log(1:n)+1bunu takip ans(10)edin.
Stewie Griffin,

2

Python 3 , 100 bayt

Fonksiyon günlüğünün tabanı (i + 1) 99999999999999999999999999999999999 kez yinelenmiştir.

Bir kişi yukarıdaki sayıyı daha da büyütmek için üstleri kullanabilir ...

from math import *
s=input()
exec("s=log(s+1);"*99999999999999999999999999999999999)
print(floor(s))

Çevrimiçi deneyin!


2
Çözümler gerçekten çalışmak zorunda mı? Bu bir OverflowError atar.
ETHproductions

2
Bu gibi sorunlarda @ETHroductions, sonsuz bellek ve CPU ile bir makinede çözümler sadece teorik olarak uygulanabilir olması gerektiği yaygın olarak kabul edilir. Bunu denemek istiyorsanız, 99999 ... 999'u 999'a kadar kesin
Sparr

3
Peki neden kullanmıyorsun 9**9**9**...**9**9e9?
Hesap MakinesiFeline

2

Fonksiyon günlüğünün tabanı (i + 1) 14 kez yinelenmiştir (Python)

import math
x=lambda i: math.log(i+1)
print int(x(x(x(x(x(x(x(x(x(x(x(x(x(x(input())))))))))))))))

Bunun çok iyi olmasını beklemiyorum, ama bunun iyi bir başlangıç ​​olduğunu düşündüm.

Örnekler:

  • e ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n ^ n - n ~ n (n)

intBunun yerine kullanırsanız floorbaşka birine sığabilirsinizx(
Beta Decay

@BetaDecay Tamam Ben güncelledim.
PyRulez

1
İfade olmalı e^e^e^e...^nmı? Ayrıca, neden sonra bir boşluk var :?
Hesap MakinesiFeline

@CalculatorFeline Bu kod golf olmadığı için, sadece 100 baytın altında olması gerekiyor.
Cyoce

Yani? Bir baytı kaydetmenin nesi kötü, başka bir x()arama ekleyebiliyor musunuz?
CalculatorFeline

2

Ruby, 100 bayt, puan -1 = f ω ω + 1 (n 2 )

Temelde En Büyük Basılabilir Numaramdan ödünç alınmış , işte programım:

->k{n=0;n+=1 until(H=->z,a=[0]*z{b,*c=a;z.times{z+=b ?H[z,b==1?c:[b>1?b-1:z]*z+c]:z};z};H[n*n]>k);n}

Çevrimiçi deneyin

Temel olarak hızlı büyüyen hiyerarşideki f ω + 1 (n 2 ) tersini hesaplar . İlk birkaç değer

x[0] = 1
x[1] = 1
x[2] = 1
x[3] = 1
x[4] = 2

Ve sonra 2çok uzun süre çıktı vermeye devam ediyor . Hatta x[G] = 2, GGraham'ın numarası nerede .


Peki ya FGH nerede g (f <sub> 0019001CK </sub> 3)?
user75200

@ user75200, fgh hesaplanamayan sıralamalar için iyi tanımlanmadı.
Simply Beautiful Art,

FGH , temel sekanslara sahip oldukları için, hesaplanmamış sıralamalar için iyi tanımlanmıştır. Sadece hesaplanamaz.
user75200

@ user75200 Hayır. Temel diziler çok keyfidir. Ben ω9001CK tanımlayabiliriz [x] = x uzunluk ω9001CK, temel dizisini sahip olan sonlu x için hesaplanabilir, ama çok olası değildir ne istediğini. "İyi tanımlanmış" derken, herkesin aynı fikirdeyeceği hesaplanamayan sıralar için standart bir temel dizilim yoktu.
Simply Beautiful Art,

Temel dizilerin benzersiz olmadığı doğru olsa da, sayılabilir bir sıra için temel bir dizinin uzunluğu ω olması gerekiyordu.
Anders Kaseorg

0

Mathematica, 99 bayt

(± 1 bayt alır)

0±x_=1±(x-1);y_±0=y+1;x_±y_:=(y-1)±x±(x-1);(i=0;NestWhile[(++i;#±#±#±#±#±#±#±#)&,1,#<k&/.k->#];i)&

İlk 3 komut x±ydeğerlendirmeyi tanımlar Ackermann(y, x).

İşlevin sonucu f(#)=#±#±#±#±#±#±#±#, değer parametre değerine ulaşmadan önce 1'e uygulanması gereken sayıdır . As f(#)=#±#±#±#±#±#±#±#(olduğunu, f(#)=Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[#, #], #], #], #], #], #], #]) çok hızlı büyür, işlev çok yavaş büyür.


0

Clojure, 91 bayt

(defn f (apply +(for[n(range %)](/(loop[r 1 v n](if(< v 1)r(recur(* r v)(Math/log v))))))))

Buradansum 1/(n * log(n) * log(log(n)) * ...) bulduğum şeyi hesaplar . Ancak işlev 101 bayta kadar uzadı, bu yüzden açık iterasyon sayısını bırakmak zorunda kaldım ve sayı birden fazla olduğu sürece tekrar ediyorum. Girişler için örnek çıktılar :10^i

0 1
1 3.3851305685279143
2 3.9960532565317575
3 4.232195089969394
4 4.370995106860574
5 4.466762285601703
6 4.53872567524327
7 4.595525574477128
8 4.640390570825608

Bu değiştirilmiş dizinin hala farklılaştığını ama şimdi nasıl kanıtlanacağını biliyorum.

Üçüncü seri, kısmi terimlerin 10'u geçmeden önce bir googolplex terim sayısına ihtiyacı vardır.


0

Javascript (ES6), 94 bayt

(p=j=>i=>h=>g=>f=>x=>x<2?0:1+p(p(j))(j(i))(i(h))(h(g))(g(f))(f(x)))(_=x=>x)(_)(_)(_)(Math.log)

Açıklama :

Idaşağıda ifade eder x => x.

İlk önce şuna bir bakalım:

p = f => x => x < 2 ? 0 : 1 + p(p(f))(f(x))

p(Math.log)yaklaşık olarak eşittir log*(x).

p(p(Math.log))yaklaşık olarak eşittir log**(x)( log*değer en fazla 1 olana kadar sürebilir ).

p(p(p(Math.log)))yaklaşık olarak eşittir log***(x).

Ters Ackermann işlevi alpha(x), pdeğer en fazla 1 olana kadar oluşturmanız gereken minimum sayıya yaklaşık olarak eşittir .

Eğer kullanırsak:

p = g => f => x => x < 2 ? 0 : 1 + p(p(g))(g(f))(f(x))

o zaman yazabiliriz alpha = p(Id)(Math.log).

Ancak bu oldukça sıkıcı, bu yüzden seviye sayısını arttıralım:

p = h => g => f => x => x < 2 ? 0 : 1 + p(p(h))(h(g))(g(f))(f(x))

Bu bizim nasıl yaptığımıza benziyor alpha(x), yapmak yerine log**...**(x)şimdi yapıyoruz alpha**...**(x).

Neden burada duruyorsun?

p = i => h => g => f => x => x < 2 ? 0 : 1 + p(p(i))(i(h))(h(g))(g(f))(f(x))

Önceki işlev ise f(x)~alpha**...**(x), bu şimdi ~ f**...**(x). Son çözümümüzü elde etmek için bunun bir seviyesini daha yapıyoruz.


msgstr " p(p(x => x - 2)) yaklaşık olarak eşittir log**(x)( log*değer en çok 1 olana kadar alabileceğiniz sayı )." Bu ifadeyi anlamıyorum. Bana öyle geliyor ki p(x => x - 2), " 2değer en fazla 1 olana kadar çıkarmanın sayısı" olmalı . Yani, p (x => x - 2) `" 2'ye böl "fonksiyonu olmalıdır. Bu nedenle p(p(x => x - 2))"değer en fazla 1 olana kadar 2'ye bölme sayısı" olmalı, yani, logişlev değil log*ya da olmalıdır log**. Belki bu açıklığa kavuşturulabilir?
mathmandan

O hat üzerinde bir yazım hatası yapmış gibi @mathmandan görünüyor, olması gerektiği p = f => x => x < 2 ? 0 : 1 + p(p(f))(f(x))yerde, pgeçirilir p(f), diğer hatlarında gibi değil f.
es1024
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.