Ini harus menjadi tantangan sederhana.
Dengan diberi nomor n >= 0
, keluarkan logaritma super-log (atau log *, log-star, atau logaritma iterated , yang setara karena n
tidak pernah negatif untuk tantangan ini.) Dari n
.
Ini adalah salah satu dari dua fungsi terbalik untuk tetrasi . Yang lainnya adalah super-root , yang ada dalam pertanyaan terkait .
Contohnya
Input Output
0 0
1 0
2 1
3 2
4 2
...
15 2
16 3
...
3814279 3
3814280 4
Aturan
- Anda tidak perlu mendukung desimal, meskipun Anda bisa.
- Setidaknya Anda perlu mendukung input
3814280 = ceiling(e^e^e)
. - Anda mungkin tidak memberikan kode seperti pada nilai
3814280
. (Program Anda secara teoritis harus mendukung angka yang lebih tinggi.) Saya ingin algoritma diterapkan. - Kode terpendek menang.
code-golf
math
code-golf
array-manipulation
sorting
code-golf
math
arithmetic
matrix
code-golf
string
kolmogorov-complexity
code-golf
string
code-golf
math
sequence
arithmetic
recursion
code-golf
math
ascii-art
sequence
code-golf
math
array-manipulation
code-golf
code-golf
kolmogorov-complexity
code-golf
string
code-golf
string
decision-problem
code-golf
array-manipulation
tips
javascript
json
code-golf
math
string
number
number-theory
code-golf
math
sequence
fibonacci
number
arithmetic
fastest-code
integer
code-golf
math
sequence
code-golf
string
file-system
tips
golfscript
code-golf
string
code-golf
string
natural-language
code-golf
string
file-system
code-golf
math
array-manipulation
code-challenge
image-processing
compression
code-golf
math
number
sequence
code-golf
math
combinatorics
regular-expression
code-golf
sequence
pi
code-golf
ascii-art
code-golf
string
array-manipulation
sorting
code-golf
string
graph-theory
code-golf
string
code-golf
string
ascii-art
code-challenge
compression
code-golf
code-golf
math
sequence
number-theory
code-golf
maze
graph-theory
code-golf
math
sequence
mbomb007
sumber
sumber
Jawaban:
Jelly , 8 byte
Cobalah online! atau verifikasi semua kasus uji .
Latar Belakang
Kami mulai dengan mengambil logaritma natural dari input dan hasil selanjutnya hingga hasilnya tidak lagi berubah. Ini berfungsi karena ekstensi logaritma natural ke bidang kompleks memiliki titik tetap ; jika z = e -W (-1) ≈ 0.318 + 1.337i - di mana W menunjukkan fungsi Lambert W - kita memiliki log (z) = z .
Untuk input n , setelah menghitung [n, log (n), log (log (n)), ..., z] , pertama-tama kita menerapkan fungsi plafon untuk setiap hasil. Implementasi Jelly (
Ċ
) sebenarnya menghitung bagian imajiner dari bilangan kompleks † , tetapi kami tetap tidak tertarik dengan ini.Setelah k th penerapan log menghasilkan nilai kurang dari atau sama dengan 1 ,
Ċ
akan kembali 1 untuk pertama kalinya. Indeks berbasis 0 dari yang pertama 1 adalah hasil yang diinginkan.Implementasi langsung (menghitung indeks berbasis 1, penurunan) gagal karena tepi kasus 0 , yang tidak memiliki 1 dalam daftar logaritma. Bahkan, untuk input 0 , urutan logaritma adalah
Ini karena logaritma Jelly (
Æl
) kelebihan beban; pertama kali mencobamath.log
(logaritma nyata), kemudiancmath.log
(logaritma kompleks), dan akhirnya "menyerah" dan kembaliNone
. Untungnya,Ċ
kelebihannya juga sama dan hanya mengembalikan argumen jika tidak dapat mengambil atau mengambil bagian imajiner.Demikian juga, input 1 kembali
yang dapat menciptakan masalah dalam pendekatan lain yang melibatkan atau tidak melibatkan
Ċ
.Salah satu cara untuk memperbaiki masalah ini adalah menerapkan
Ḋ
(dequeue; menghapus elemen pertama) ke array logaritma. Peta inijadi daftar tidak memiliki 1 sekarang. Dengan cara ini, menemukan indeks dari 1 pertama akan mengembalikan 0 (tidak ditemukan), yang merupakan output yang diinginkan untuk input 0 dan 1 .
Bagaimana itu bekerja
† Ini adalah satu dari hanya tiga atom dalam Jelly yang kelebihan muatan secara tidak jelas.
sumber
Jelly , 9 byte
Cobalah online!
Suite uji. (Sedikit dimodifikasi.)
Penjelasan
sumber
C, 38 byte
Cukup jelas.
Cobalah di ideone.
sumber
Javascript,
452726 byteBerikut ini adalah test suite (putaran ke-3)
Terima kasih @LeakyNun untuk menyimpan 1 byte dengan kondisional dan kemudian mengkonversi fungsi ke lambda, dan @Nil untuk menunjukkan false adalah nilai pengembalian ok untuk <= 1 (tes yang diubah menjadi == alih-alih ===)
sumber
false
bukan 0 (karena konversi otomatis ke 0 dalam ekspresi integer) dalam hal ini Anda dapat menghapus|0
.Mathematica, 21 byte
Fungsi anonim rekursif. Mengambil integer sebagai input dan mengembalikan super-logaritma sebagai output. Cukup gunakan definisi yang diberikan.
sumber
Dyalog APL , 13 byte
Terjemahan langsung OP:
TryAPL online!
sumber
Pyth, 10 byte
Suite uji.
Ini mendefinisikan suatu fungsi.
sumber
tl.u?>N1.l
;-)Haskell, 23 byte
Contoh penggunaan:
l 3814280
->4
.sumber
Python 3, 45 byte
Sebab
x <= 1
, ini mengembalikanFalse
(yang== 0
dalam Python).sumber
False
bisa digunakan untuk0
.and
daripadaif else
). Terima kasih.05AB1E,
1613 bytePenjelasan
Cobalah online
sumber
MATL ,
1512 byteCobalah online! Atau verifikasi semua kasus uji (versi yang sedikit dimodifikasi untuk menangani beberapa input).
Bagaimana itu bekerja
Mulai dengan 0, terapkan iterasi eksponensial hingga melebihi input. Outputnya adalah jumlah iterasi minus 1.
sumber
J ,
21191816 byteDisimpan 2 byte ke Leaky Nun, 1 byte ke Galen Ivanov, dan 2 byte ke FrownyFrog!
Cobalah online!
Uji kasus
sumber
2#@}.^.^:(0<])^:a:
(Saya mulai menemukan apa yang ternyata merupakan dup dari masalah ini.)2#@}.(0>.^.)^:a:
sepertinya berhasil.Julia, 17 byte
Cobalah online!
sumber
MATLAB / Oktaf, 44 byte
function a=g(n);a=0;if n>1;a=1+g(log(n));end
Mencoba melakukan semuanya sebagai satu fungsi anonim, tapi saya lupa bahwa MATLAB / Oktaf terus mengevaluasi ekspresi bahkan jika mereka dikalikan dengan nilai false (nol) boolean:
f=@(n)(n>1)*(1+f(log(n)))
sumber
R,
3837 byteTerima kasih @ user5957401 untuk byte ekstra!
Kasus uji:
sumber
if(x>1)1+f(log(x))else 0
satu byte lebih pendek.R , 34 byte
Cobalah online!
Pendekatan non-rekursif dimungkinkan: 36 byte dan mengambil input dari stdin.
sumber
Java 7, 47 byte
Cobalah online.
Metode Java 7 style rekursif di atas adalah 2 byte lebih pendek dari iterasi Java 8 style lambda:
Cobalah online.
Penjelasan:
sumber
Emacs Lisp, 38 byte
Testcases:
sumber
Jelly , 8 byte
Implementasi langsung dari definisi. Cobalah online! atau verifikasi semua kasus uji .
Bagaimana itu bekerja
sumber
Perl 5, 35 byte
Sangat sederhana, membutuhkan
-M5.016
(yang gratis) untuk mengaktifkan__SUB__
kata kunci untuk rekursi anonim.Alternatif lain adalah
yaitu 34 byte, dan memberikan output yang sama untuk semua input> 1, tetapi mengembalikan nilai false khusus untuk input <= 1. False secara numerik sama dengan nol, tetapi dicetak sebagai "" (string kosong), jadi mungkin tidak t memenuhi syarat.
sumber
sub{($_=pop)>1?1+__SUB__->(log):0}
olahCJam (16 byte)
Demo online
Simpel sambil loop dengan pra-kondisi. (Yang benar-benar saya inginkan di sini adalah operasi buka Golfscript-style, tetapi CJam tidak memilikinya, dan floating point dalam GolfScript berantakan dan sama sekali tidak golfy).
sumber
PARI / GP , 24 byte
Hanya rekursi langsung.
sumber
Racket, 61 byte
sumber
Maple,
32,3029 byteKasus uji:
sumber
R, 36 byte
Pendekatan yang sedikit berbeda dari Plannapus
Menggunakan hak untuk menjalankan kode - jadi nomor yang diinginkan harus mendahuluinya. yaitu
sumber
Mathematica, 29 byte
Sederhana sekali, dan bekerja untuk input yang besar dan juga negatif:
sumber
Ruby, 29 byte
sumber
n<=1?a:b
sebagain>1?b:a
dan -1 byte lebih dengan fungsi lambda anonim .Perl 6 , 21 byte
Cobalah online!
Ekspresi kurung adalah urutan.
$_
, argumen ke fungsi, adalah elemen pertama.*.log
menghasilkan setiap elemen berturut-turut dengan mengambil log dari elemen sebelumnya. Urutan berlanjut hingga kondisi akhir,,1 >= *
benar: 1 lebih besar dari atau sama dengan elemen saat ini. Mengurangkan 1 dari urutan memaksa ke nomor: panjangnya.sumber