Tugas Anda adalah menciptakan fungsi dengan pertumbuhan paling lambat yang Anda dapat tidak lebih dari 100 byte.
Program Anda akan mengambil sebagai bilangan bulat nonnegatif, dan menghasilkan bilangan bulat nonnegatif. Mari kita panggil program Anda P.
Itu harus memenuhi dua kriteria ini:
- Kode sumbernya harus kurang dari atau sama dengan 100 byte.
- Untuk setiap K, ada N, sehingga untuk setiap n> = N, P (n)> K. Dengan kata lain, lim (n-> ∞) P (n) = ∞ . (Ini adalah apa artinya menjadi "tumbuh".)
"Skor" Anda adalah tingkat pertumbuhan dari fungsi dasar program Anda.
Lebih khusus, program P tumbuh lebih lambat dari Q jika ada N sedemikian rupa sehingga untuk semua n> = N, P (n) <= Q (n), dan setidaknya ada satu n> = N sedemikian rupa sehingga P (n ) <Q (n). Jika tidak ada program yang lebih baik dari yang lain, mereka terikat. (Pada dasarnya, program mana yang lebih lambat didasarkan pada nilai lim (n-> ∞) P (n) -Q (n).)
Fungsi pertumbuhan paling lambat didefinisikan sebagai fungsi yang tumbuh lebih lambat daripada fungsi lainnya, menurut definisi pada paragraf sebelumnya.
Ini adalah golf tingkat pertumbuhan , sehingga program yang paling lambat menang akan menang!
Catatan:
- Untuk membantu dalam penilaian, cobalah untuk menempatkan fungsi apa yang dihitung oleh program Anda dalam jawabannya.
- Masukkan juga beberapa input dan output (teoretis), untuk membantu memberi orang gagasan tentang seberapa lambat Anda bisa melangkah.
sumber
<
diikuti oleh surat adalah awal dari tag HTML. Tinjau pertanyaan Anda sebelum mempostingnya, silakan: PJawaban:
Haskell, 98 byte, skor = f ε 0 −1 ( n )
Bagaimana itu bekerja
Ini menghitung kebalikan dari fungsi yang tumbuh sangat cepat terkait dengan game cacing Beklemishev . Laju pertumbuhannya sebanding dengan f ε 0 , di mana f α adalah hierarki yang tumbuh cepat dan ε 0 adalah angka epsilon pertama .
Untuk perbandingan dengan jawaban lain, perhatikan itu
sumber
Brachylog , 100 byte
Cobalah online!
Ini mungkin tidak ada di dekat kelambanan beberapa jawaban mewah lainnya, tetapi saya tidak percaya tidak ada yang mencoba pendekatan yang sederhana dan indah ini.
Sederhananya, kami menghitung panjang nomor input, lalu panjang hasil ini, lalu panjang hasil lainnya ini ... 100 kali total.
Ini tumbuh secepat log (log (log ... log (x), dengan 100 basis-10 log).
Jika Anda memasukkan nomor Anda sebagai string , ini akan berjalan sangat cepat pada setiap input yang dapat Anda coba, tetapi jangan berharap untuk melihat hasil yang lebih tinggi dari 1: D
sumber
JavaScript (ES6), Fungsi Ackermann Invers *, 97 byte
* Jika saya melakukannya dengan benar
Fungsi
A
adalah fungsi Ackermann . Fungsia
seharusnya merupakan fungsi Inverse Ackermann . Jika saya menerapkannya dengan benar, Wikipedia mengatakan bahwa itu tidak akan mencapai5
sampaim
sama2^2^2^2^16
. Saya mendapatkanStackOverflow
sekitar1000
.Pemakaian:
Penjelasan:
Fungsi Ackermann
Fungsi Ackermann Terbalik
sumber
Pure Evil: Eval
Pernyataan di dalam eval menciptakan string dengan panjang 7 * 10 10 10 10 10 10 8.57 yang hanya terdiri dari panggilan ke fungsi lambda yang masing-masing akan membangun string dengan panjang yang sama , terus dan terus hingga akhirnya
y
menjadi 0. Seolah-olah ini memiliki kompleksitas yang sama dengan metode Eschew di bawah ini, tetapi daripada mengandalkan logika jika-dan-atau, itu hanya menghancurkan string raksasa bersama-sama (dan hasil bersihnya menjadi lebih banyak tumpukan ... mungkin?).Nilai terbesar yang
y
dapat saya berikan dan hitung tanpa Python melemparkan kesalahan adalah 2 yang sudah cukup untuk mengurangi input max-float menjadi pengembalian 1.Sebuah string panjang 7.625.597.484.987 terlalu besar:
OverflowError: cannot fit 'long' into an index-sized integer
.Saya harus berhenti.
Eschew
Math.log
: Pergi ke root (ke-10) (dari masalah), Score: berfungsi secara efektif tidak dapat dibedakan dari y = 1.Mengimpor perpustakaan matematika membatasi jumlah byte. Mari kita hilangkan itu dan ganti
log(x)
fungsinya dengan sesuatu yang kira-kira setara:x**.1
dan yang harganya kira-kira jumlah karakter yang sama, tetapi tidak memerlukan impor. Kedua fungsi memiliki output sublinear sehubungan dengan input, tetapi x 0,1 tumbuh lebih lambat . Namun kami tidak terlalu peduli, kami hanya peduli bahwa ia memiliki pola pertumbuhan basis yang sama sehubungan dengan jumlah besar sambil mengkonsumsi jumlah karakter yang sebanding (mis.x**.9
Jumlah karakter yang sama, tetapi tumbuh lebih cepat, jadi ada adalah beberapa nilai yang akan menunjukkan pertumbuhan yang sama persis).Sekarang, apa yang harus dilakukan dengan 16 karakter. Bagaimana kalau ... memperluas fungsi lambda kita untuk memiliki properti Sequence Ackermann? Jawaban untuk sejumlah besar ini menginspirasi solusi ini.
The
z**z
porsi disini mencegah saya dari menjalankan fungsi ini dengan di mana saja dekat dengan masukan waras untuky
danz
, nilai-nilai terbesar yang bisa saya gunakan adalah 9 dan 3 yang saya mendapatkan kembali nilai 1,0, bahkan untuk terbesar mendukung mengapung Python (catatan: sementara 1.0 secara numerik lebih besar dari 6,77538853089e-05, peningkatan level rekursi memindahkan output fungsi ini lebih dekat ke 1, sementara tetap lebih besar dari 1, sedangkan fungsi sebelumnya memindahkan nilai lebih dekat ke 0 sementara tetap lebih besar dari 0, sehingga bahkan rekursi moderat pada fungsi ini menghasilkan begitu banyak operasi sehingga angka floating point kehilangan semua bit signifikan).Mengkonfigurasi ulang panggilan lambda asli untuk memiliki nilai rekursi 0 dan 2 ...
Jika perbandingan dibuat untuk "offset dari 0" alih-alih "offset dari 1" fungsi ini kembali
7.1e-9
, yang pasti lebih kecil dari6.7e-05
.Rekursi dasar program aktual (nilai z) adalah 10 10 10 10 1,97 level, begitu y melelahkan, ia akan direset dengan 10 10 10 10 10 1,97 (itulah sebabnya nilai awal 9 cukup), jadi saya tidak bahkan tidak tahu bagaimana menghitung dengan benar jumlah rekursi yang terjadi: saya telah mencapai akhir dari pengetahuan matematika saya. Demikian pula saya tidak tahu apakah memindahkan salah satu
**n
eksponensial dari input awal ke sekunderz**z
akan meningkatkan jumlah rekursi atau tidak (ditto reverse).Mari kita lebih lambat dengan lebih banyak rekursi
n//1
- menghemat 2 byte lebihint(n)
import math
,math.
menghemat 1 byte lebihfrom math import*
a(...)
menghemat total 8 bytem(m,...)
(y>0)*x
menghemat satu byte lebihy>0and x
9**9**99
meningkatkan jumlah byte sebanyak 4 dan meningkatkan kedalaman rekursi sekitar kira-kira di2.8 * 10^x
manax
kedalaman yang lama (atau kedalaman yang mendekati ukuran googolplex: 10 10 94 ).9**9**9e9
meningkatkan jumlah byte sebesar 5 dan meningkatkan kedalaman rekursi sebesar ... jumlah yang gila. Kedalaman rekursi sekarang 10 10 10 9,93 , untuk referensi, googolplex adalah 10 10 10 2 .m(m(...))
dengana(a(a(...)))
biaya 7 byteNilai output baru (pada kedalaman 9 rekursi):
Kedalaman rekursi telah meledak ke titik di mana hasil ini benar - benar tidak berarti kecuali dibandingkan dengan hasil sebelumnya menggunakan nilai input yang sama:
log
25 kaliLambda Inception, skor: ???
Saya mendengar Anda suka lambdas, jadi ...
Saya bahkan tidak bisa menjalankan ini, saya menumpuk melimpah bahkan dengan 99 lapisan rekursi.
Metode lama (di bawah) mengembalikan (melewatkan konversi ke integer):
Metode baru kembali, menggunakan hanya 9 lapisan serangan (bukan googol penuh dari mereka):
Saya pikir ini bekerja dengan kompleksitas yang mirip dengan urutan Ackerman, hanya kecil, bukan besar.
Juga berkat produk ETH untuk penghematan 3 byte di ruang yang saya tidak sadari dapat dihapus.
Jawaban lama:
Pemotongan integer dari fungsi log (i + 1) iterasi
2025 kali (Python) menggunakan lambda'd lambdas.Jawaban PyRulez dapat dikompres dengan memperkenalkan lambda kedua dan menumpuknya:
99100 karakter digunakan.Ini menghasilkan iterasi
2025, di atas yang asli 12. Selain itu ia menyimpan 2 karakter dengan menggunakanint()
alih-alihfloor()
yang diizinkan untukx()
tumpukan tambahan .Jika spasi setelah lambda dapat dihapus (saya tidak dapat memeriksa saat ini) maka 5Mungkin!y()
dapat ditambahkan.Jika ada cara untuk melewatkan
from math
impor dengan menggunakan nama yang sepenuhnya memenuhi syarat (mis.x=lambda i: math.log(i+1))
), Itu akan menyimpan lebih banyak karakter dan memungkinkan setumpuk lagix()
tetapi saya tidak tahu apakah Python mendukung hal-hal seperti itu (saya curiga tidak). Selesai!Ini pada dasarnya adalah trik yang sama yang digunakan dalam posting blog XCKD dalam jumlah besar , namun biaya overhead dalam mendeklarasikan lambdas menghalangi tumpukan ketiga:
Ini adalah rekursi sekecil mungkin dengan 3 lambda yang melebihi tinggi tumpukan yang dihitung dari 2 lambdas (mengurangi setiap lambda menjadi dua panggilan menurunkan tinggi tumpukan menjadi 18, di bawah dari versi 2-lambda), tetapi sayangnya membutuhkan 110 karakter.
sumber
int
konversi dan berpikir saya memiliki beberapa suku cadang.import
dan setelah ruangy<0
. Saya tidak tahu banyak Python jadi saya tidak yakiny<0and x or m(m,m(m,log(x+1),y-1),y-1)
untuk menyimpan byte lain (dengan anggapanx
tidak pernah0
kapany<0
)log(x)
tumbuh lebih lambat daripada kekuatan positif APAPUNx
(untuk nilai besarx
), dan ini tidak sulit untuk menunjukkan menggunakan aturan L'Hopital. Saya cukup yakin versi Anda saat ini melakukan(...(((x**.1)**.1)**.1)** ...)
banyak kali. Tetapi kekuatan-kekuatan itu berlipat ganda, jadi itu efektifx**(.1** (whole bunch))
, yang merupakan kekuatan positif (sangat kecil) darix
. Itu berarti bahwa itu sebenarnya tumbuh lebih cepat daripada iterasi TUNGGAL dari fungsi log (meskipun, memang, Anda harus melihat nilai SANGAT besarx
sebelum Anda melihat ... tapi itulah yang kami maksud dengan "pergi hingga tak terbatas" ).Haskell , 100 byte
Cobalah online!
Solusi ini tidak mengambil kebalikan dari fungsi yang tumbuh cepat melainkan membutuhkan fungsi yang tumbuh agak lambat, dalam hal ini
length.show
, dan menerapkannya beberapa kali.Pertama kita mendefinisikan suatu fungsi
f
.f
adalah versi keparat dari notasi uparrow Knuth yang tumbuh sedikit lebih cepat (sedikit agak meremehkan, tetapi jumlah yang kita hadapi begitu besar sehingga dalam skema besar hal-hal ...). Kami mendefinisikan kasus dasarf 0 a b
menjadia^b
ataua
dengan kekuatanb
. Kami kemudian mendefinisikan kasus umum untuk(f$c-1)
diterapkan padab+2
contoha
. Jika kita mendefinisikan notasi uparrow Knuth seperti konstruk, kita akan menerapkannya padab
instancea
, tetapib+2
sebenarnya golfier dan memiliki keuntungan menjadi lebih cepat berkembang.Kami kemudian mendefinisikan operator
#
.a#b
didefinisikan untuklength.show
diterapkan keb
a
waktu. Setiap aplikasilength.show
kira-kira sama dengan log 10 , yang bukan merupakan fungsi yang berkembang sangat cepat.Kami kemudian mendefinisikan fungsi kami
g
yang mengambil dan integer dan berlakulength.show
untuk integer beberapa kali. Untuk lebih spesifik itu berlakulength.show
untuk inputf(f 9 9 9)9 9
. Sebelum kita masuk ke seberapa besar ini mari kita lihatf 9 9 9
.f 9 9 9
adalah lebih besar dari9↑↑↑↑↑↑↑↑↑9
(sembilan anak panah), dengan margin besar. Saya percaya itu berada di antara9↑↑↑↑↑↑↑↑↑9
(sembilan panah) dan9↑↑↑↑↑↑↑↑↑↑9
(sepuluh panah). Sekarang ini adalah jumlah yang sangat besar, jauh ke besar untuk disimpan di komputer mana pun yang ada (dalam notasi biner). Kami kemudian mengambil itu dan menempatkan itu sebagai argumen pertama kamif
yang berarti nilai kami lebih besar daripada9↑↑↑↑↑↑...↑↑↑↑↑↑9
denganf 9 9 9
panah di antara keduanya. Saya tidak akan menjelaskan angka ini karena jumlahnya sangat besar, saya tidak berpikir saya bisa melakukannya dengan adil.Masing
length.show
- masing kira-kira sama dengan mengambil basis log 10 dari integer. Ini berarti bahwa sebagian besar angka akan kembali 1 ketikaf
diterapkan padanya. Angka terkecil untuk mengembalikan sesuatu selain 1 adalah10↑↑(f(f 9 9 9)9 9)
, yang mengembalikan 2. Mari kita pikirkan sejenak. Sebesar apa pun angka yang kita tentukan sebelumnya, angka terkecil yang mengembalikan 2 adalah 10 ke kekuatannya sendiri yang berkali-kali. Thats 1 diikuti oleh10↑(f(f 9 9 9)9 9)
nol.Untuk kasus umum dari
n
input terkecil yang dikeluarkan maka n harus diberikan(10↑(n-1))↑↑(f(f 9 9 9)9 9)
.Perhatikan bahwa program ini membutuhkan sejumlah besar waktu dan memori untuk bahkan n kecil (lebih dari yang ada di alam semesta berkali-kali lipat), jika Anda ingin menguji ini saya sarankan mengganti
f(f 9 9 9)9 9
dengan jumlah yang jauh lebih kecil, coba 1 atau 2 jika Anda ingin pernah mendapatkan output selain 1.sumber
APL, Terapkan
log(n + 1)
,e^9^9...^9
kali, di mana panjang rantai adalahe^9^9...^9
panjang rantai minus 1 kali, dan sebagainya.sumber
e^n^n...^n
bagian itu jadi saya mengubahnya menjadi konstan, tetapi itu mungkin benarMATL , 42 byte
Cobalah online!
Program ini didasarkan pada seri harmonik dengan penggunaan konstanta Euler-Mascheroni. Ketika saya membaca dokumentasi @LuisMendo tentang bahasa MATL-nya (dengan huruf kapital, jadi ini terlihat penting) saya perhatikan konstanta ini. Ekspresi fungsi pertumbuhan yang lambat adalah sebagai berikut:
di mana εk ~ 1 / 2k
Saya menguji hingga 10.000 iterasi (di Matlab, karena terlalu besar untuk TIO) dan skornya di bawah 10, jadi sangat lambat.
Penjelasan:
Bukti empiris: (ln k ) + 1 berwarna merah selalu di atas ln k + γ + εk dengan warna biru.
Program untuk (ln k ) +1 dibuat di
Matlab,
471814 byteMenarik untuk dicatat bahwa waktu yang telah berlalu untuk n = 100 adalah 0,208693 pada laptop saya, tetapi hanya 0,121945 dengan
d=rand(1,n);A=d*0;
dan bahkan lebih sedikit, 0,112147 denganA=zeros(1,n)
. Jika nol adalah pemborosan ruang, itu menghemat kecepatan! Tapi saya menyimpang dari topik (mungkin sangat lambat).Sunting: terima kasih kepada Stewie untuk
membantumengurangi ekspresi Matlab ini menjadi, cukup:sumber
n=input('');A=log(1:n)+1
, atau sebagai fungsi anonim yang tidak disebutkan namanya (14 bytes):@(n)log(1:n)+1
. Saya tidak yakin tentang MATLAB, tetapiA=log(1:input(''))+1
bekerja di Oktaf ...n=input('');A=log(1:n)+1
bekerja,@(n)log(1:n)+1
jangan (memang fungsi yang valid dengan pegangan di Matlab, tetapi input tidak ditanyakan),A=log(1:input(''))+1
bekerja dan dapat dipersingkatlog(1:input(''))+1
f=
tidak perlu dihitung, karena dimungkinkan untuk hanya:@(n)log(1:n)+1
diikuti olehans(10)
untuk mendapatkan 10 angka pertama.Python 3 , 100 byte
Lantai log fungsi (i +1) iterasi 999999999999999999999999999999999999999 kali.
Seseorang dapat menggunakan eksponen untuk membuat angka di atas lebih besar ...
Cobalah online!
sumber
9**9**9**...**9**9e9
?Lantai log fungsi (i +1) iterasi 14 kali (Python)
Saya tidak berharap ini bekerja dengan sangat baik, tetapi saya pikir ini awal yang baik.
Contoh:
sumber
int
sebagai penggantifloor
, Anda dapat memasukkan yang lainx(
e^e^e^e...^n
? Juga, mengapa ada ruang setelah:
?x()
panggilan lain ?Ruby, 100 byte, skor -1 = f ω ω + 1 (n 2 )
Pada dasarnya meminjam dari Nomor Terbesar saya yang Dapat Dicetak , inilah program saya:
Cobalah online
Pada dasarnya menghitung kebalikan dari f ω ω + 1 (n 2 ) dalam hierarki yang berkembang cepat. Beberapa nilai pertama adalah
Dan kemudian terus menghasilkan
2
untuk waktu yang sangat lama. Bahkanx[G] = 2
, di manaG
nomor Graham.sumber
Mathematica, 99 byte
(dengan asumsi ± membutuhkan 1 byte)
3 perintah pertama menentukan
x±y
untuk mengevaluasiAckermann(y, x)
.Hasil dari fungsi ini adalah berapa kali
f(#)=#±#±#±#±#±#±#±#
harus diterapkan ke 1 sebelum nilai sampai ke nilai parameter. Karenaf(#)=#±#±#±#±#±#±#±#
(yaitu,f(#)=Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[Ackermann[#, #], #], #], #], #], #], #]
) tumbuh sangat cepat, fungsinya tumbuh sangat lambat.sumber
Clojure, 91 byte
Jenis menghitung
sum 1/(n * log(n) * log(log(n)) * ...)
, yang saya temukan dari sini . Tetapi fungsinya berakhir 101 byte jadi saya harus menjatuhkan jumlah iterasi yang eksplisit, dan sebaliknya iterasi selama angkanya lebih besar dari satu. Contoh output untuk input dari10^i
:Saya berasumsi seri yang dimodifikasi ini masih menyimpang tetapi sekarang tahu bagaimana membuktikannya.
sumber
Javascript (ES6), 94 byte
Penjelasan :
Id
mengacux => x
pada berikut ini.Mari kita lihat dulu:
p(Math.log)
kira-kira sama denganlog*(x)
.p(p(Math.log))
kira-kira sama denganlog**(x)
(berapa kali Anda dapat mengambillog*
sampai nilai paling banyak 1).p(p(p(Math.log)))
kira-kira sama denganlog***(x)
.Fungsi Ackermann terbalik
alpha(x)
kira-kira sama dengan jumlah minimum kali yang Anda butuhkan untuk menulisp
hingga nilainya paling banyak 1.Jika kita menggunakan:
maka kita bisa menulis
alpha = p(Id)(Math.log)
.Namun, itu cukup membosankan, jadi mari kita tingkatkan jumlah level:
Ini seperti bagaimana kita membangun
alpha(x)
, kecuali alih-alih melakukanlog**...**(x)
, kita sekarang lakukanalpha**...**(x)
.Kenapa berhenti di sini?
Jika fungsi sebelumnya adalah
f(x)~alpha**...**(x)
, yang ini sekarang~ f**...**(x)
. Kami melakukan satu level lagi untuk mendapatkan solusi akhir kami.sumber
p(p(x => x - 2))
kira-kira sama denganlog**(x)
(berapa kali Anda dapat mengambillog*
sampai nilainya paling banyak 1)". Saya tidak mengerti pernyataan ini. Menurut saya itup(x => x - 2)
harus "berapa kali Anda dapat mengurangi2
sampai nilainya paling banyak 1". Artinya, p (x => x - 2) `harus menjadi fungsi" bagi dengan 2 ". Oleh karena itup(p(x => x - 2))
harus "berapa kali Anda dapat membaginya dengan 2 sampai nilainya paling banyak 1" ... yaitu, itu haruslog
fungsi, bukanlog*
ataulog**
. Mungkin ini bisa diklarifikasi?p = f => x => x < 2 ? 0 : 1 + p(p(f))(f(x))
, di manap
dilewatkanp(f)
seperti di baris lain, tidakf
.