Urutan terlalu meta

Leaky Nun 09/11/2017. 6 answers, 2.053 views
code-golf sequence

Kami bermula dengan jujukan 1-terindeks kosong:

_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,... 

Dalam langkah ke- n, kita mengisi setiap kosong (n) dengan bilangan bulat yang lebih besar dari 1 bermula pada baki yang pertama, dimana suatu (n) ialah entri ke- n dalam urutan tersebut.

Selepas langkah pertama:

2,_,3,_,4,_,5,_,6,_,7,_,8,_,9,_,10,_,11,_,12,_,13,_,... 

Perhatikan bahawa (1) harus 2 kerana integer pertama lebih besar daripada 1 ialah 2.

Dalam langkah kedua, kita mengisi setiap (2) kosong. Ia akan menjadi jelas bahawa (2) mestilah 2.

2,2,3,_,4,3,5,_,6,4,7,_,8,5,9,_,10,6,11,_,12,7,13,_,... 

Dalam langkah ketiga, kami mengisi setiap (3) kosong. Dari urutan, a (3) = 3.

2,2,3,2,4,3,5,_,6,4,7,_,8,5,9,3,10,6,11,_,12,7,13,_,... 

Dalam langkah keempat, kita mengisi setiap (4) kosong. Dari urutan, a (4) = 2.

2,2,3,2,4,3,5,2,6,4,7,_,8,5,9,3,10,6,11,3,12,7,13,_,... 

Akhirnya:

2,2,3,2,4,3,5,2,6,4,7,2,8,5,9,3,10,6,11,3,12,7,13,2,... 

Tugas

Memandangkan n, mengembalikan elemen n ke urutan tersebut.

10,000,000 segi urutan urutan pertama boleh didapati di sini .

Ini adalah . Jawapan ringkas dalam kemenangan bytes. Kelemahan standard dikenakan.

5 Comments
Leaky Nun 06/20/2017
@LuisMendo Terima kasih, saya telah menambahkannya.
Dead Possum 06/20/2017
Hanya ingin tahu, apa salahnya mr.One yang dikecualikan dari urutan?
Leaky Nun 06/20/2017
@DeadPossum dengan baik, jika anda mengisi setiap kosong, maka anda sudah selesai dalam satu langkah.
2 Leaky Nun 06/20/2017
@DeadPossum Jika satu (n) adalah 1, maka langkah n-ke akan mengisi setiap baki kosong, menamatkan generasi.
1 Leaky Nun 06/20/2017
@QBrute Saya menyediakan senarai 10,000,000 pertama yang dikaitkan dengan soalan; hanya plot mereka.

6 Answers


Anders Kaseorg 06/20/2017.

Haskell , 80 67 bait

 g~(a:b)|let k!l=k:take(a-1)l++(k+1)!drop(a-1)l=2!g b
m=g m
(!!)$0:m 

Cuba dalam talian!

Haskell adalah bahasa yang sempurna untuk menentukan senarai tak terbatas dari segi dirinya sendiri.

5 comments
1 Julian Wolf 06/20/2017
Memandangkan pautan TIO berfungsi seperti yang diharapkan, saya rasa persoalan saya sepatutnya: Bolehkah anda menambah penjelasan tentang bagaimana ini berfungsi?
2 Anders Kaseorg 06/20/2017
@JulianWolf Kedengarannya seperti anda tidak biasa dengan let pengawal corak. pattern1 | let pattern2 = expr2 = expr1 pattern1 | let pattern2 = expr2 = expr1 bermaksud perkara yang sama seperti pattern1 = let pattern2 = expr2 in expr1 (untuk sebab yang sama bahawa [expr1 | let pattern2 = expr2] bermaksud perkara yang sama seperti [let pattern2 = expr2 in expr1] ).
1 Ørjan Johansen 06/20/2017
Saya perlu ingat let pengawal corak (terutama sekali mereka boleh melakukan fungsi)! Juga, m=2:2:2`drop`g m adalah satu byte yang lebih pendek.
1 Ørjan Johansen 06/20/2017
(!!)$0:m ialah dua byte yang lebih pendek.
1 Ørjan Johansen 06/20/2017
Sebenarnya, anda boleh menggugurkan 2:2: semuanya dengan sedikit kemalasan: g ~(a:b)|... dan m=g m .

Doorknob 06/20/2017.

C, 123 bait

 f(n)NO 

Cuba dalam talian!

Walkthrough

 f(n)NO 

dengan litar pintas, dan kemudian oleh undang-undang De Morgan dan fakta bahawa 0 adalah falsy di C:

 if (p[j] == 0 && ((k++) % p[i]) == 0) {
    p[j] = k / p[i] + 2;
} 

Ini pada dasarnya menyatakan: "jika ruang ini kosong, kenaikan k Dan jika k sebelum ini adalah pelbagai ukuran langkah, jalankan pernyataan berikut." Oleh itu, kami menjalankan pernyataan pada setiap elemen step size , iaitu bagaimana urutan dijelaskan. Kenyataan itu sendiri adalah mudah; semua itu menghasilkan 2 , 3 , 4 , ....

 n=p[n-1];} 

Dengan menggunakan return-tanpa-return yang rumit yang berfungsi dengan gcc , kita "kembali" elemen terakhir bagi istilah n pertama dalam urutan, yang menjadi istilah nth.


Anders Kaseorg 06/20/2017.

Pyth, 29 bait

M?tH?eJ.DtHg1GghG-tHhJ+2hJ2g1 

Cuba dalam talian

Bagaimana ia berfungsi

Daripada menggodam dengan senarai, ini menggunakan formula rekursif biasa.

M                                def g(G, H):
 ?tH                                 if H - 1:
      J.DtHg1G                           J = divmod(H - 1, g(1, G))
    ?e                                   if J[-1]:
              ghG-tHhJ                       return g(G + 1, H - 1 - J[0])
                                         else:
                      +2hJ                   return 2 + J[0]
                                     else:
                          2              return 2
                           g1Q   print(g(1, eval(input()))) 

xnor 06/20/2017.

Haskell , 67 bait

 0%j=2
i%j|d<-div i$f j=last$d+2:[(i-d-1)%(j+1)|d*f j 

Cuba dalam talian!

Penyelesaian aritmetik rekursif yang pada asasnya sama dengan kaedah Python Anders Kaseorg .

Kod ini diliputi oleh ketuat - bahagian hodoh yang kelihatan seperti mereka boleh beraksi, tetapi saya tidak melihat bagaimana.

Fungsi i%j benar-benar mahu menggunakan pengawal untuk memeriksa sama ada mod i(f j)>0 dan menilai salah satu daripada dua ungkapan yang sepadan. Tetapi, kedua-dua ungkapan menggunakan div i(f j) . Mengikat bahawa dalam pengawal tidak akan dikenakan kepada kedua belah pihak. Sejauh yang saya tahu, pengawal tidak boleh dibuat untuk "mengedarkan" ke atas pengawal lain. let dan where terlalu lama. Oleh itu, kod menggunakan last untuk memilih salah satu daripada dua ungkapan sementara pengawal mengikat pembolehubah. Ugh.

Sebaiknya kami menggunakan divMod kerana kedua-dua div dan mod digunakan, tetapi (d,m)<-divMod ... adalah ungkapan panjang. Kita bukan sahaja memeriksa mod adalah bukan nada dengan melihat jika nilai div kali pembahagi jatuh pendek daripada nilai asal.

0%j=2 kes tidak diperlukan sekiranya Haskell div 0 diversi pendek div 0 , yang tidak. .pred menukar input yang diindeks 1 ke indeks sifar, atau jika ada -1 koreksi di mana-mana.

4 comments
Ørjan Johansen 06/21/2017
Jika anda menghidupkan index % 1, maka anda memerlukan pembetulan lima byte - yang hanya ikatan. However , anda boleh menyusun % tanpa kos, dan kemudian f menjadi tanpa nama supaya anda menyimpan dua bita secara keseluruhan.
xnor 06/21/2017
@ ØrjanJohansen Apa maksud kamu di sini dengan inline? Saya tidak melihat bagaimana untuk mengubah rujukan kepada f tanpa kehilangan bait.
Ørjan Johansen 06/21/2017
divMod nampaknya satu byte lebih murah, kerana ia membolehkan cawangan dengan !!(0^m) . Setakat ini saya mendapat: 1%j=2;i%j|(d,m)<-divMod(i-1)$j%1=[(i-d-1)%(j+1),d+2]!!(0^m);‌​(%1)
Ørjan Johansen 06/21/2017
Seperti yang anda lihat, inlining mengandaikan 1 reindexing, yang menghilangkan .pred .

Arnauld 06/20/2017.

JavaScript (ES6), 98 93 91 bait

Fungsi rekursi yang berhenti sebaik sahaja hasilnya tersedia.

 f=(n,p,a=[...Array(n)])=>a[n-1]||f(n,-~p,a.map(c=>c?c:i?i++%(a[p]||2)?c:++v:(i=1,v=2),i=0)) 

Versi alternatif, 90 bait

Suggested by Shaggy for -1 byte

Yang satu ini mesti dipanggil dengan f(n)() . Walaupun jawatan yang sepadan dalam meta kini memberikan skor positif, sintaks ini nampaknya dipertikaikan.

 n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%(a[p]||2)?c:++v:(i=1,v=2),i=0)) 

Demo

 f=(n,p,a=[...Array(n)])=>a[n-1]||f(n,-~p,a.map(c=>c?c:i?i++%(a[p]||2)?c:++v:(i=1,v=2),i=0))

for(n = 1; n <= 50; n++) {
  console.log('a[' + n + '] = ' + f(n));
} 

2 comments
Shaggy 06/20/2017
n=>g=(p,a=[...Array(n)])=>a[n-1]||g(-~p,a.map(c=>c?c:i?i++%k‌​?c:++v:(i=1,v=2),i=0‌​,k=a[p]||2)) harus berfungsi untuk 92 bait. Panggil ia dengan f(n)() .
Arnauld 06/20/2017
@Shaggy Terima kasih! Ditambah sebagai versi alternatif.

Xanderhall 06/20/2017.

Java 8, 124 bytes

(i)->{int j=1,a[]=new int[i+1],k,s,n;for(;a[i]<2;){for(k=0,n=2;a[++k]>0;);for(s=a[j++]|2*k;k<=i;k+=s)a[k]=n++;}return a[i];} 

Ekspresi Lambda.

Mewujudkan pelbagai integer dan teruskan populates sehingga nilai nth dihuni.

Pra-mengisytiharkan pemboleh ubah di bahagian atas untuk mengurangkan sebanyak mungkin int kerana setiap int kos 4 bait ruang bertentangan dengan menambah ,n yang 2.

Pada lelaran pengiraan, bilangan 'kosong' yang perlu dilangkau adalah sama dengan a[j] (atau 2, jika kosong). Ia berfungsi bahawa jika ruang kosong pertama yang perlu kita isi berada pada kedudukan k , k * a[j] memberi kita 'langkah' ( s ).

Related questions

Hot questions

Language

Popular Tags