Fungsi setengah-eksponensial adalah fungsi yang ketika disusun dengan dirinya sendiri memberikan fungsi eksponensial. Misalnya, jika f(f(x)) = 2^x
, maka f
akan menjadi fungsi setengah-eksponensial. Dalam tantangan ini, Anda akan menghitung fungsi setengah-eksponensial tertentu.
Secara khusus, Anda akan menghitung fungsi dari bilangan bulat non-negatif ke bilangan bulat non-negatif dengan properti berikut:
Meningkat secara monoton: jika
x < y
, makaf(x) < f(y)
Setidaknya setengah eksponensial: Untuk semua
x
,f(f(x)) >= 2^x
Leksikografis terkecil: Di antara semua fungsi dengan properti di atas, output yang diminimalkan
f(0)
, yang diberi pilihan yang diminimalkanf(1)
, kemudianf(2)
, dan seterusnya.
Nilai awal dari fungsi ini, untuk input 0, 1, 2, ...
adalah:
[1, 2, 3, 4, 8, 9, 10, 11, 16, 32, 64, 128, 129, 130, 131, 132, 256, 257, ...]
Anda dapat menampilkan fungsi ini melalui salah satu metode berikut, baik sebagai fungsi atau sebagai program lengkap:
Ambil
x
sebagai input, outputf(x)
.Ambil
x
sebagai input, output nilai pertamax
darif
.Keluarkan semua
f
.
Jika Anda ingin mengambil x
dan output f(x)
, x
harus diindeks nol.
Ini adalah kode golf - kode terpendek dalam byte yang menang. Celah standar dilarang, seperti biasa.
Jawaban:
JavaScript (ES7),
5148 byteDisimpan 3 byte berkat @Arnauld
Mengambil n dan mengeluarkan item ke - n dalam urutan.
JavaScript (ES7),
706864 byteFungsi rekursif yang menerima
x
dan mengembalikanx
item pertama dari urutan sebagai array.Bagaimana itu bekerja
Array a secara prosedural dihasilkan, satu item pada satu waktu, hingga mencapai panjang yang diinginkan. (Port teknik infinite yang digunakan dalam jawaban Python xnor yang sangat baik kemungkinan akan lebih pendek.)
Kita dapat melakukan pengamatan berikut untuk setiap indeks i (diindeks 0):
Ini benar karena f (f (j)) harus setidaknya 2 j , dan f (f (j)) setara dengan [a [j]] , yang pada gilirannya setara dengan [i] .
Biasanya opsi yang benar adalah tepat 2 j . Namun, untuk kasus tunggal i = 2 , 2 ada dalam array di index j = 1 , yang berarti bahwa 2 j akan menjadi 2 - tetapi ini berarti bahwa kita akan memiliki 2 pada a [1] dan a [2] . Untuk menyiasatinya, kami mengambil maksimum 2 j dan [i-1] + 1 (satu lebih dari item sebelumnya), yang memberikan 3 untuk i = 2 .
Teknik ini juga terjadi untuk mengurus memutuskan apakah atau tidak j ada-jika tidak, JS ini
.indexOf()
kembali metode -1 , yang mengarah ke mengambil maks sebuah [i-1] + 1 dan 2 -1 = 0,5 . Karena semua item dalam urutan setidaknya 1 , ini akan selalu mengembalikan item sebelumnya ditambah satu.(Saya menulis penjelasan ini larut malam, jadi tolong beri tahu saya jika ada sesuatu yang membingungkan atau saya melewatkan sesuatu)
sumber
272
dan up memberikan jawaban yang salah karena masalah overflow integer. Ini baik-baik saja, karena berfungsi hingga batas datatype.2**
bukannya1<<
semoga memperbaiki masalah..99
bunuh solusinya. Tapi mengapa menggunakan+.99
dan tidak adil+.9
? Apa bedanya?Math.log2(...)
dan harus menghitung plafon. Sekarang tidak diperlukan sama sekali. Terima kasih! Saya akan melihat ke dalam2**
hal - saya menggunakan2**...+.99|0
awalnya, tetapi1<<
lebih pendek karena saya tidak membutuhkannya|0
. Sekarang saya pikir tidak ada perbedaan ...Python 2 , 60 byte
Cobalah online!
Mencetak selamanya.
Python , 61 byte
Cobalah online!
Sebuah fungsi. Output
True
di tempat1
.sumber
Perl 5, 53 + 1 (
-p
) = 54 byteCobalah online
sumber
Bash, 66 byte
Cobalah online
sumber
Jelly , 14 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Python 2 , 111 byte
Cobalah online!
Ini adalah modifikasi signifikan dari jawaban user202729 . Saya akan memposting peningkatan ini sebagai komentar, tetapi jawabannya dihapus dan komentar dinonaktifkan.
sumber
x**2
adalah terlalu kecil.x=1000
. Anda mungkin ingin mencoba2**x
- sangat besar, tetapi codegolf adalah codegolf.2**x
menciptakan jangkauan Python yang terlalu besar untuk melanjutkan.Swift , 137 byte
Mengambil input sebagai
Int
(integer) dan mencetak sebagai[Int]
(integer array).Versi tidak disatukan
sumber
?
?