Keluarkan istilah N dari Urutan Van Eck.
Urutan Van Eck didefinisikan sebagai:
- Mulai dengan 0.
- Jika istilah terakhir adalah kejadian pertama dari istilah itu maka istilah berikutnya adalah 0.
- Jika istilah terakhir telah terjadi sebelumnya istilah berikutnya adalah berapa banyak langkah mundur adalah kejadian terbaru.
https://www.youtube.com/watch?v=etMJxB-igrc
https://www.youtube.com/watch?v=8VrnqRU7BVU
Urutan: 0,0,1,0,2,0,2,2,1,6,0,5,0,2, ...
Tes:
Masukan | Keluaran
- 1 | 0
- 8 | 2
- 19 | 5
- 27 | 9
- 52 | 42
- 64 | 0
EDIT
1 diindeks lebih disukai, 0 diindeks dapat diterima; yang mungkin mengubah beberapa solusi yang sudah dikirimkan.
Tolong, istilah Nth saja.
Sama (kecuali untuk melihat itu sudah diposting bagian), tampaknya pegolf kode dan pengamat numberphile memiliki tumpang tindih yang layak.
n
persyaratan pertama ?Jawaban:
JavaScript (ES6),
46 4137 byteCobalah online!
Bagaimana?
Kami tidak perlu menyimpan urutan lengkap. Kita hanya perlu melacak posisi terakhir setiap bilangan bulat yang muncul dalam urutan. Kami menggunakan objek yang mendasari fungsi rekursif untuk tujuan itu.g
Untuk istilah diberikan , kita tidak perlu mengatur ke posisi absolut aktualnya dalam urutan karena kita hanya tertarik pada jarak dengan posisi saat ini. Itu sebabnya kita bisa menyimpan nilai input , yang digunakan sebagai penghitung penurunan kode.hal g[ p ] n
Oleh karena itu, jarak diberikan oleh . Mudahnya, ini mengevaluasi ke NaN jika ini adalah kejadian pertama dari , yang dapat dengan mudah diubah menjadi diharapkan .g[ p ] - n p 0hal 0
Berkomentar
sumber
Python 3 ,
696362 byteCobalah online!
Catatan: seperti yang disebutkan Erik the Outgolfer, kode ini juga berfungsi dengan baik di Python 2.
Diindeks 0 (walaupun, hanya untuk benar-benar menyimpang, Anda dapat membuatnya -1-diindeks dengan mengubah
if n
keif~n
: P)Manfaatkan "operator bintang" Python yang cantik membongkar, untuk secara rekursif membangun seri, hingga
n
mencapai nol.Fungsi membangun seri dalam urutan terbalik, untuk menghindari keharusan membalikkannya untuk pencarian. Selain itu, ia sebenarnya menyimpan negasi dari semua elemen, karena mengonversinya kembali pada akhirnya adalah gratis (kalau
-
tidak harus ada spasi) dan menghemat kita satu byte di sepanjang jalan, dengan menggunakan~s.index(l)
alih-alih-~s.index(l)
.Bisa jadi 51 byte jika Python tuple memiliki
find
fungsi string yang sama (mengembalikan -1 jika tidak ditemukan, alih-alih memunculkan kesalahan), tetapi tidak ada keberuntungan ...sumber
s
untuk panggilan rekursif?def func(f, *args): f(*args)
; membongkar panggilan fungsi di dalam adalah py2 yang valid. Apa py3-hanya membongkar dalam daftar / dict comprehensions (yaitu[1, 2, *s]
) atau membongkar variabel:a, *b = [1,2,3,4]
.R , 62 byte
Cobalah online!
Buat daftar secara terbalik;
match
mengembalikan indeks pertamaF[1]
(nilai sebelumnya) diF[-1]
(sisa daftar), kembali0
jika tidak ditemukan kecocokan.F
diinisialisasi keFALSE
dan dipaksa untuk0
pada lintasan pertamawhile
loop.sumber
match
untuk masalah ini ketika Anda membangunnya dengan cara ini. Sangat bersih.F
untuk0
saatn==1
yang lain itu akan kembaliFALSE
.Perl 6 ,
4742 byte-5 byte berkat nwellnhof
Cobalah online!
Codeblock anonim yang menampilkan elemen 0-diindeks dalam urutan.
Penjelasan:
sumber
Bourne shell, 102 byte
coba online
sumber
Stax ,
109 byteJalankan dan debug itu
Jika pengindeksan berbasis 0 diizinkan:
Stax , 8 byte
Jalankan dan debug itu
sumber
J ,
2923 byteCobalah online!
Pekerjaan nyata dilakukan dalam kata kerja iterasi dari kata kerja kekuatan
^:
, yang berulang sebanyak argumen[
, mulai iterasi dengan nilai konstan 0&0
...(#|1+}.i.{.)
Ini adalah apa yang diulang. Memecahnya ...}.i.{.
Temukan indeksi.
kepala daftar{.
dalam daftar ekor}.
. Ini akan mengembalikan indeks berbasis 0, jadi jika item saat ini ditemukan 1 sebelumnya akan kembali 0. Jika tidak ditemukan, itu akan mengembalikan panjang daftar, yaitu, panjang ekor.1+
Tambahkan satu ke nilai untuk memperbaiki pengindeksan berbasis 0, karena Ven Eck "seberapa jauh" adalah berbasis 1. Perhatikan bahwa jika tidak ditemukan, nilainya akan menjadi panjang dari daftar lengkap.#|
Kembalikan sisa nilai yang dihitung pada langkah sebelumnya, ketika dibagi dengan panjang daftar lengkap. Perhatikan bahwa ini mengubah "tidak ditemukan" menjadi 0, tetapi membiarkan semua nilai lainnya tidak berubah.,~
Tambahkan nilai baru ke depan daftar. Kami menggunakan front daripada bertahan hanya untuk kenyamanan.1{
kembalikan item ke-2 dalam daftar, karena kami menghitungnya terlalu banyak karena lebih pendek.sumber
Python , 51 byte
Cobalah online!
Output
False
untuk0
. Implements spec cukup harfiah, mencari bilangan bulat positif terendahi
sehinggaf(n-1)==f(n-i-1)
. Jika pencarian seperti itu mengarah kei>=n
, elemen sebelumnya tidak muncul sebelumnya dan kami menghasilkan0
.Alih-alih melakukan sesuatu yang masuk akal seperti menyimpan nilai sebelumnya dalam daftar, fungsi tersebut hanya menghitung ulang secara rekursif dari awal kapan pun diperlukan, dan kadang-kadang saat tidak diperlukan. Ini membuat fungsi berjalan sangat lambat untuk input di atas 10 atau lebih.
sumber
APL (Dyalog Unicode) ,
1917 byte SBCSTerima kasih banyak kepada ngn, Adám, Richard Park dan H.PWiz atas bantuan mereka dalam menulis dan bermain golf jawaban ini di The APL Orchard , tempat yang bagus untuk belajar APL dan mendapatkan bantuan APL.
Edit: -2 byte dari Adám.
Cobalah online!
Penjelasan
sumber
Bahasa Wolfram (Mathematica) , 48 byte
Cobalah online!
Nilai bukan nol dikembalikan sebagai daftar tunggal .
sumber
05AB1E , 8 byte
Penjelasan:
sumber
F¯Rćk
? ;)Java,
968076 byteTidak dikaburkan:
sumber
int[]
dalamint
deklarasi, dan juga menggunakan<1
alih-alih==0
. Contoh:int f(int n){int l[]=new int[n],i=0,j,v=0;while(++i<n){j=l[v];l[v]=i;v=j<1?0:i-j;}return v;}
n->{int l[]=new int[n],i=0,j,v=0;for(;++i<n;l[v]=i,v=j<1?0:i-j)j=l[v];return v;}
Arang , 23 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Penjelasan:
Setel istilah pertama ke 0.
n-1
Waktu loop . (Jika pengindeksan 0 dapat diterima,⊖
dapat dihapus untuk penghematan 1 byte.)Istilah berikutnya adalah indeks yang meningkat dari istilah saat ini dalam daftar terbalik dari istilah sebelumnya.
Tambahkan istilah saat ini ke daftar istilah sebelumnya.
Tetapkan istilah saat ini ke istilah berikutnya.
Cetak istilah saat ini di akhir loop.
sumber
Jelly , 7 byte
Cobalah online!
Diindeks 0.
sumber
Jelly , 8 byte
Cobalah online!
Bagaimana?
Perhatikan bahwa tanpa final,
Ḣ
kami sudah benar-benar mengumpulkan[a(n), a(n-1), ..., a(2), a(1), n]
sumber
C (gcc) , 63 byte
Cobalah online!
Diindeks 0.
sumber
Haskell ,
68 6766 byteImplementasi yang cukup mudah (menggunakan pengindeksan berbasis 0).
Cobalah online!
sumber
Haskell, 61 byte
Pengindeksan berbasis 0.
Cobalah online!
sumber
Japt
-h
, 11 byteCobalah
sumber
C # (Visual C # Interactive Compiler) , 77 byte
Cobalah online!
Cukup banyak port jawaban Java pada saat ini.
sumber
Python 3 ,
12811411110299 byte102 -> 99 byte, terima kasih kepada Jonathan Frech
Cobalah online!
sumber
-
alih-alih!=
menyimpan byte.Perl 5 (
-p
), 42 byteCobalah online!
sumber
Python 3 , 112 byte
Cobalah online!
-3 byte terima kasih kepada mypetlion
sumber
for _ in a*int(input()):k=a[-1];a+=k in a[:-1]and[a[::-1].index(k)+~a[-2::-1].index(k)]or[0]
menghemat 3 byte.Merah ,
10695 byteCobalah online!
sumber
CJam (15 byte)
Demo online . Ini adalah program lengkap dan 0-diindeks.
Pembedahan
sumber
Clojure, 69 byte
Sayangnya pendekatan yang lebih fungsional tampaknya lebih lama.
sumber
DC,
949190 byteMasukan diambil selama program. Simpan ini ke file dan kemudian lakukan "dc" untuk menjalankan. Jelas bukan yang terpendek, tapi saya bersenang-senang dengan tantangan seperti ini di dc. Input adalah indeks berbasis-1, sesuai keinginan.
sumber
C ++ (dentang) ,
241235234219197189 byte197 -> 189 byte, terima kasih kepada ceilingcat
Cobalah online!
sumber
Pyth , 18 byte
Cobalah online!
Membangun urutan secara terbalik dan mencetak elemen pertama (istilah terakhir dari urutan).
sumber