OEIS memiliki variasi (A111439) pada urutan Golomb . Seperti dalam urutan Golomb, A(n)
jelaskan seberapa sering n
muncul dalam urutan. Tetapi di samping itu, tidak ada dua angka yang berurutan yang identik. Saat membangun urutan, A(n)
selalu dipilih sebagai bilangan bulat positif terkecil yang tidak melanggar dua properti ini. Karena nomor identik yang tidak diizinkan berturut-turut, seri bergetar sedikit naik dan turun saat tumbuh. Inilah 100 istilah pertama:
1, 2, 3, 2, 3, 4, 3, 4, 5, 6, 5, 6, 5, 6, 7, 6, 7, 8, 7, 8, 9, 8, 9, 8, 9,
10, 9, 10, 9, 10, 11, 10, 11, 10, 11, 10, 11, 12, 11, 12, 13, 12, 13, 12,
13, 12, 13, 12, 13, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 14, 15, 16, 15,
16, 17, 16, 17, 16, 17, 16, 17, 16, 17, 18, 17, 18, 17, 18, 19, 18, 19, 18,
19, 18, 19, 18, 19, 18, 19, 20, 19, 20, 21, 20, 21, 20, 21, 20, 21, 20
Daftar lengkap angka 10.000 pertama dapat ditemukan di OEIS .
Tantangannya adalah untuk menulis program atau fungsi yang menghitung A(n)
, diberikan n
. n
adalah 1
berbasis untuk memastikan bahwa properti self-describing bekerja.
Aturan
Anda dapat menulis sebuah program atau fungsi dan menggunakan salah satu metode standar kami untuk menerima input dan memberikan output.
Anda dapat menggunakan bahasa pemrograman apa pun , tetapi perhatikan bahwa celah ini dilarang secara default.
Ini adalah kode-golf , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.
Uji Kasus
n A(n)
1 1
4 2
10 6
26 10
100 20
1000 86
1257 100
10000 358
N
muncul setelah kejadian terakhirN-1
yang mengukur jumlah goyangan hinggaN
.)Jawaban:
Haskell , 67 byte
Menentukan fungsi
f
. Cobalah online!Sangat lambat,f 15
waktu komputasi keluar pada TIO.Penjelasan
Sesuai dengan definisi: pada setiap tahap, pilih angka positif minimal
n
yang memenuhi batasan (tidak sama dengan entri sebelumnya, dan belum terjadif n
kali).sumber
Mathematica,
6968 byteTerima kasih kepada Martin Ender karena menemukan ekstra –1 byte untuk saya!
Fungsi tanpa nama mengambil integer positif
n
sebagai input dan mengembalikan integer positif. Kami membangun seluruh daftarn
elemen pertama dari urutan ini, lalu mengambilLast
elemen tersebut. Daftar ini dibangun dengan memulai dengan daftar kosong{}
dan mengoperasikannya dengan fungsin
kali berturut-turut (viaNest
).Fungsi yang dimaksud adalah
{##&@@#,1//.x_/;x==Last@#||#~Count~x==#[[x]]->x+1}&
, yang mengambil daftar sebagian dari nilai urutan (pada dasarnya##&@@#
) dan menambahkan nilai berikutnya. Nilai berikutnya dihitung dengan memulai denganx=1
, kemudian berulang kali menggantix
denganx+1
selama kondisix==Last@#||#~Count~x==#[[x]]
terpenuhi-kata lain, jika salahx
adalah elemen sebelumnya, ataux
sudah dalam daftar nomor yang benar kali. Fungsi ini meludah beberapa kesalahan, karena (misalnya) kita tidak boleh memanggilx
elemen th dari daftar awal{}
; Namun, semua nilainya benar.sumber
Python 2,
9986 byteTerima kasih kepada @Dennis untuk beberapa peningkatan total sebesar 13 byte!
Program ini berlangsung dengan sangat naif: Program ini melacak daftar nilai yang telah ditentukan sejauh ini, dan terlihat menambahkan nilai berikutnya. Mencoba untuk menambahkan
1
ke akhir daftar jika itu bisa; jika tidak, maka ia mencoba2
dan seterusnya sampai sesuatu diizinkan.Sekarang, kita mulai dengan penyemaian hasil untuk
1,2,3
menjadi1,2,3
. Hal ini dilakukan untuk menghindari masalah dengan daftar nilai yang sudah dihitung terlalu pendek: Saya menduga bahwa jikan
paling tidak4
makaa(n)
sangat kurang darin
. (Dalam program ini,s[n]
sama dengana(n)
. Daftar kami sebenarnya diinisialisasi[0,1,2,3]
karena daftar0
-indexed dengan Python. Jadi misalnyaa(1)=s[1]=1
, dana(2)=s[2]=2
.)Jadi, katakanlah kita sedang berusaha menentukan
s[m]
, artinya daftar kami sudah termasuks[0], s[1], ..., s[m-1]
. Kami akan mulait=1
dan mencoba mengaturs[m]=1
. Ketika itu tidak berhasil, kami pergi ket=2
dan mencoba untuk mengaturs[m]=2
. Setiap kali kami menambaht
, kami memeriksa apakahs.count(t)==s[t]
... tetapi sisi kanan tidak akan menghasilkan kesalahan selama kami tidak pernah harus mencapai setinggit=m
. Dugaan tersebut mengatakan bahwa kita tidak perlu melakukannya, karena nilai pertama yang kita hitung sebenarnyas[4]
.Implementasi ini menghitung 3 nilai lebih dari urutan daripada yang dibutuhkan. Sebagai contoh jika
n
adalah8
, itu akan menghitung melaluis[11]
sebelum mengembalikan nilais[8]
.Saya akan senang melihat bukti dugaan itu. Saya percaya itu bisa dibuktikan dengan induksi (kuat?).
Sunting: Ini adalah bukti dugaan tersebut . Kami benar-benar membuktikan bentuk pernyataan yang sedikit lebih kuat, karena tidak melibatkan pekerjaan tambahan.
Teorema: Untuk semua yang
n
lebih besar dari atau sama dengan4
, istilahnyaa(n)
kurang dari atau sama dengan(n-2)
.Bukti (dengan Induksi Kuat): (Basis
n=4
): Pernyataan ini berlaku untukn=4
, sejaka(4) = 2 = 4-2
.Sekarang asumsi
a(k)
kurang dari atau sama dengank-2
untuk semuak
dari4
mulain
, inklusif (dan anggapn
setidaknya4
). Secara khusus, ini berarti bahwa semua ketentuan urutan sebelumnya paling banyak(n-2)
. Kita perlu menunjukkan itua(n+1)
paling banyak(n-1)
. Sekarang, menurut definisi,a(n)
adalah bilangan bulat positif terkecil yang tidak melanggar kondisi apa pun, jadi kita hanya perlu menunjukkan bahwa nilainya(n-1)
tidak akan melanggar salah satu kondisi.Nilai
(n-1)
tidak akan melanggar kondisi "tanpa pengulangan berurutan", karena dengan hipotesis induksi entri sebelumnya paling banyak(n-2)
. Dan itu tidak akan melanggar kondisi "a(m)
adalah berapa kalim
muncul", kecuali(n-1)
sudah tercapaia(n-1)
kali. Tetapi dengan asumsi induksi yang kuat,(n-1)
sebelumnya telah mencapai0
waktu, dana(n-1)
tidak sama dengan0
karenaa(m)
positif untuk semuam
.Karena
a(n+1)
itu kurang dari atau sama dengann-1 = (n+1)-2
, seperti yang diinginkan. QED.sumber
Jelly , 17 byte
Tiga kasus tes terakhir terlalu banyak untuk TIO. Saya telah memverifikasi 1000 dan 1257 secara lokal.
Cobalah online! atau verifikasi 100 syarat pertama .
Bagaimana itu bekerja
sumber
Python 2 ,
7774 byteIni adalah implementasi algoritma @ mathmandan secara rekursif .
Implementasinya adalah O (gila) : input 9 membutuhkan 2 detik secara lokal, input 10 52 detik, dan input 11 17 menit dan 28 detik. Namun, jika dinyatakan sebagai fungsi reguler daripada lambda, memoisasi dapat digunakan untuk memverifikasi kasus uji.
Cobalah online!
Perhatikan bahwa bahkan dengan memoisasi, TIO tidak dapat menghitung f (1257) atau f (10000) (keduanya diverifikasi secara lokal).
sumber
05AB1E ,
3231 byteCobalah online!
Penjelasan
Secara teknis kami berada di loop
G
ketika kami menambahkan N ke daftar global, tetapi semua loop di 05AB1E menggunakan variabel N yang sama dengan indeks, sehingga loop batin[...]
telah menimpa N dariG
makna yang kami dapat menambahkannya di luar loop.Masalah dengan loop dan kondisi bersarang mencegah kita dari melakukan ini di dalam loop.
sumber
Befunge,
141136 byteCobalah online!
Karena keterbatasan memori Befunge, tidak praktis untuk melacak semua entri entri sebelumnya dalam urutan, sehingga solusi ini menggunakan algoritma dengan jejak memori yang lebih rendah yang menghitung nilai lebih langsung.
Yang mengatakan, kita masih dibatasi oleh ukuran sel, yang dalam penerjemah referensi Befunge-93 adalah nilai 8-bit yang ditandatangani, sehingga angka genap tertinggi yang didukung dalam urutannya adalah
A(1876) = 126
, dan angka ganjil yang didukung tertinggi adalahA(1915) = 127
.Jika Anda ingin menguji nilai yang lebih besar, Anda harus menggunakan juru bahasa dengan ukuran sel yang lebih besar. Itu harus mencakup sebagian besar implementasi Befunge-98 ( Coba online! ).
sumber
Python 2, 117 byte
Ah. Tidak sesingkat itu. Solusi berulang sederhana.
Cobalah online
Berikut adalah upaya yang sangat buruk pada solusi rekursif (129 byte):
sumber
-1
daripadan-1
menyimpan byte, saya kira tidak.