Terinspirasi oleh pertanyaan sebelumnya .
Urutan penggambaran diri Golomb g (n) adalah urutan di mana bilangan alami n
diulang dalam urutan g (n) kali.
Beberapa angka pertama dalam urutan adalah:
n 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
g(n) 1 2 2 3 3 4 4 4 5 5 5 6 6 6 6 7 7 7 7 8
Anda dapat melihat bahwa g (4) = 3, dan "4" diulang 3 kali dalam urutan.
Diberikan input n
, output g(n)
.
Keterbatasan: n <100000.
Kode terkecil menang.
n
alih-alih2 - n % 1
. Apakah Anda punya alasan untuk mengharapkan jawaban berbeda secara signifikan?golomb=1:2:2:concat(zipWith replicate(drop 2 golomb)[3..])
Jawaban:
GolfScript (31 karakter)
Demo
sumber
Jelly , tidak bersaing
10 byte Jawaban ini tidak bersaing, karena tantangan mendahului pembuatan Jelly.
Ini menggunakan rumus rekursif a (1) = 1, a (n + 1) = 1 + a (n + 1 - a (a (n))) dari halaman OEIS.
Cobalah online!
Bagaimana itu bekerja
sumber
PHP - 63 Chars
Cepat DAN pendek.Tampaknya saya memiliki urutan yang salah dalam pikiran. Derp.
Ini BENAR, cepat, dan pendek.
Akurasi mungkin lebih tinggi dari tanda 100.000 yang diperlukan, tetapi saya benar-benar memenuhi tanda itu.
sumber
PHP
Versi rekursif ini lebih pendek (60) tetapi tidak efisien secara komputasional:
Ini jauh lebih cepat tetapi lebih lama (78):
Jauh lebih cepat, tetapi pada 89 karakter adalah:
Yaitu O (n)
sumber
Haskell,
3027 Charssumber
Oasis , 7 byte (tidak bersaing)
Kode:
Cobalah online!
Oasis adalah bahasa yang dirancang oleh Adnan yang memiliki spesialisasi dalam urutan.
Saat ini, bahasa ini dapat melakukan rekursi dan formulir tertutup.
Pada
T
akhirnya adalah singkatan untuk10
, yang menunjukkan itua(0) = 0
dana(1) = 1
. Untuk menambahkan lebih banyak testcases, cukup tambahkan ke daftar di akhir.Sekarang kami pada dasarnya menghitung
a(n-a(a(n-1))+1
.sumber
Perl, 48 karakter
Input pada stdin, output ke stdout. Perlu Perl 5.10+ dan
-M5.010
untuk mengaktifkansay
fitur. Membutuhkan waktu sekitar O ( n 2 ) karena manipulasi array yang tidak efisien, tetapi masih cukup cepat untuk dengan mudah menghitung hingga jangka waktu ke-100.000.sumber
Julia - 28
Dengan cara rekursif :
Keluaran:
sumber
Python - 64 karakter
sumber
[i]*g[i-1]
akan terjadi, jadi saya membungkuk ke belakang untuk melakukannya dengan cara lain; Saya pikir itu akan berperilaku lebih seperti mengalikan matriks dengan skalar untuk beberapa alasan ...Javascript, 93 karakter
sumber
J, 43 karakter
Menentukan fungsi menggunakan ekspresi asimptotik yang diberikan pada halaman wikipedia.
Annoyingly 9 karakter digunakan hanya pembulatan ke bilangan bulat terdekat.
sumber
Prelude ,
695554 byteJika juru bahasa yang memenuhi standar digunakan, ini mengambil input dan output sebagai nilai byte . Untuk benar-benar menggunakan angka desimal pada STDIN / STDOUT, Anda memerlukan interpreter Python dengan
NUMERIC_OUTPUT = True
dan opsi tambahanNUMERIC_INPUT = True
.Penjelasan
Kerangka program adalah
Kami membaca input
N
ke suara pertama dan menurunkannya untuk mendapatkanN-1
. Kami juga menginisialisasi suara kedua1
. Kemudian kita putarN-1
satu kali, setiap iterasi yang mendapatkan nilai urutan berikutnya pada tumpukan kedua. Pada akhirnya kami mencetakN
nomor th.Gagasan dari program ini adalah untuk menempatkan setiap elemen dari urutan dalam antrian pada suara ketiga, dan untuk mengurangi kepala antrian itu di setiap iterasi. Saat head mencapai
0
, kami menambah nilai urutan dan menghapusnya0
.Sekarang masalahnya adalah Prelude menggunakan tumpukan dan bukan antrian. Jadi kita perlu menggeser tumpukan itu sedikit untuk menggunakannya seperti antrian.
Ini menyalin nilai urutan saat ini ke suara pertama (sebagai salinan sementara), mendorong a
0
ke suara kedua (untuk menandai akhir antrian). Dan kemudian melakukan loop untuk menggeser (dan dengan demikian membalikkan) tumpukan ketiga ke tumpukan kedua. Setelah loop, kami meletakkan salinan nilai urutan saat ini di atas tumpukan kedua (yang merupakan ekor dari antrian kami).Ini terlihat agak jelek, tetapi pada dasarnya itu adalah loop yang menggeser tumpukan kembali ke suara ketiga. Karena
)
berada di kolom yang sama dengan instruksi pemindahan gigi,0
kita menempatkan suara kedua sebelumnya juga akan berakhir pada suara ketiga, jadi kita harus menghapusnya dengan yang lain#
. Kemudian kurangi bagian atas suara ke-3, yaitu kepala antrian.Sekarang jadi sedikit menjengkelkan - kami ingin menjalankan beberapa kode ketika nilainya
0
, tetapi satu-satunya struktur kontrol Prelude (loop) hanya merespon nilai-nilai yang tidak nol.Perhatikan bahwa bagian atas suara kedua adalah benar (karena urutan Golomb tidak mengandung
0
s). Jadi beban kerja masuk ke suara itu (sepasang kurung terakhir). Kita hanya perlu mencegah hal itu terjadi jika kepala antrian0
belum. Jadi pertama-tama kita memiliki "loop" pada suara ketiga yang mendorong a0
ke suara kedua jika kepala antrian masih nol. Kami juga menggunakan0
suara ketiga untuk segera keluar dari loop. The#
pada suara ketiga maka baik menghapus yang0
, atau menghilangkan kepala antrian jika itu sudah nol. Sekarang loop kedua hanya dimasukkan jika kepala antrian adalah nol (dan0
pada suara kedua tidak pernah didorong). Dalam hal ini kami menambah nilai saat ini dari urutan dan mendorong0
untuk keluar dari loop. Terakhir, akan selalu ada0
tumpukan di atas, yang harus kita buang.Saya katakan bahwa negasi logis mengganggu di Prelude ...
sumber
Mathematica, 27 byte
Solusi rekursif lain.
sumber
CJam, 14 byte
CJam jauh lebih muda dari tantangan ini, jadi jawaban ini tidak memenuhi syarat untuk tanda centang hijau. Namun, sangat jarang Anda bisa menggunakannya
j
dengan baik, jadi saya tetap ingin mempostingnya.Uji di sini.
Penjelasan
j
pada dasarnya adalah "operator rekursi memoised". Dibutuhkan integerN
, array, dan blokF
. Array digunakan untuk menginisialisasi memoisation: elemen pada indexi
akan dikembalikanF(i)
.j
kemudian menghitungF(N)
, baik dengan melihatnya, atau dengan menjalankan blok (dengann
di stack) jika nilainya belum memoised. Fitur yang sangat bagus adalah bahwa di dalam blok,j
hanya membutuhkan integeri
, dan panggilanF(i)
secara rekursif. Jadi inilah kodenya:sumber
J, 16 byte
Solusi ini sangat didasarkan pada solusi algoritme hiu untuk masalah serupa. Anda dapat menemukan penjelasan tentang metode ini di sana.
J, 33 byte
Dalam pendekatan ini saya membangun urutan
h(k)
dengan nilai-nilai indeks pertama dii
manag(i)=k
begituh = 1 2 4 6 9 12 16...
. Kita bisa mendapatkanh(k)
cukup hanyah(1..k-1)
dengan ekspresi di({:+1+[:+/#<:])
mana input beradah(1..k-1)
.Menghitung output dari
h
sangat mudah.h ([:+/]>:[) input
sumber
Brachylog , 13 byte (tidak bersaing)
Cobalah online!
Penjelasan
sumber
Python - 76 karakter
sumber
None
s. Tampaknya jumlah "benar" dariNone
s :) :)None
tipe. Saya hanya menggunakan pemahaman daftar bersarang untuk mencapai loop bersarang. Satu-satunya tujuan dari pemahaman daftar di sini adalah untuk menyebabkan kode untuk mengulang jumlah yang tepat - mereka membuang nilaiJavaScript - 48 Karakter
Membuat array 1-diindeks
g
berisi nilai-nilai urutan.Edit - JavaScript - 46 Karakter
Membuat array 1-diindeks
v
berisi nilai-nilai urutan.Sunting 2 - ECMAScript 6 - 27 Karakter
Dua yang pertama cukup cepat - yang ketiga sangat lambat
sumber
Haskell, 63 byte
Ini adalah pendekatan yang naif, saya tidak menyadari tentang pengulangan yang sangat singkat ketika saya menulis ini, tetapi saya pikir saya akan tetap mempostingnya, bahkan lebih sulit daripada implementasi Haskell lainnya, seperti misalnya
Hitung suku ke-9 dari urutan penggambaran diri Golomb
dan
/codegolf//a/23979/24877
sumber