Urutan Sylvester


32

Urutan Sylvester, OEIS A000058 , adalah urutan bilangan bulat yang didefinisikan sebagai berikut:

Setiap anggota adalah produk dari semua anggota sebelumnya ditambah satu. Anggota urutan pertama adalah 2.

Tugas

Buat program sekecil mungkin yang membutuhkan n dan hitung jangka waktu n dari Sylvester's Sequence. Input standar, output dan celah berlaku. Karena hasilnya tumbuh sangat cepat, Anda tidak diharapkan untuk mengambil istilah yang hasilnya akan menyebabkan meluapnya bahasa yang Anda pilih.

Uji Kasus

Anda dapat menggunakan nol atau satu pengindeksan. (Di sini saya menggunakan nol pengindeksan)

>>0
2
>>1
3
>>2
7
>>3
43
>>4
1807

Masukan apa yang diharapkan untuk ditangani? Outputnya tumbuh cukup cepat.
Geobits

1
@Geobits Anda diharapkan untuk menangani bahasa Anda sebanyak mungkin
Wheat Wizard

Apakah array yang ketika diindeks dengan nmengembalikan nthjumlah urutan diterima?
user6245072

@ user6245072 Tidak, Anda harus mengindeks array Anda sendiri
Wheat Wizard

Jawaban:


26

Brain-Flak , 76 68 58 52 46 byte

<>(()())<>{({}[()])<>({({}[()])({})}{}())<>}<>

Cobalah online!

Gunakan hubungan ini sebagai gantinya:

rumus

yang berasal dari hubungan ini dimodifikasi dari yang disediakan dalam urutan:

a(n+1) = a(n) * (a(n) - 1) + 1.

Penjelasan

Untuk dokumentasi tentang apa yang dilakukan setiap perintah, silakan kunjungi halaman GitHub .

Ada dua tumpukan di Brain-Flak, yang akan saya beri nama Stack 1 dan Stack 2.

Input disimpan di Stack 1.

<>(()())<>             Store 2 in Stack 2.

{                      while(Stack_1 != 0){
  ({}[()])                 Stack_1 <- Stack_1 - 1;
  <>                       Switch stack.
  ({({}[()])({})}{}())     Generate the next number in Stack 2.
  <>                       Switch back to Stack 1.
}

<>                     Switch to Stack 2, implicitly print.

Untuk algoritme pembangkitan:

({({}[()])({})}{}())      Top <- (Top + Top + (Top-1) + (Top-1) + ... + 0) + 1

(                  )      Push the sum of the numbers evaluated in the process:

 {            }               while(Top != 0){
  ({}[()])                        Pop Top, push Top-1    (added to sum)
          ({})                    Pop again, push again  (added to sum)
                              }

               {}             Top of stack is now zero, pop it.
                 ()           Evaluates to 1 (added to sum).

Alternatif versi 46-byte

Ini hanya menggunakan satu tumpukan.

({}<(()())>){({}<({({}[()])({})}{}())>[()])}{}

Cobalah online!


1
Hanya 10 byte lagi untuk menunjukkan bahwa pengembang java harus pergi ke brain flack
Rohan Jhunjhunwala

1
@RohanJhunjhunwala Aku khawatir itu tidak mungkin ...
Leaky Nun

@ LeakyNun masih menarik untuk dipikirkan. Brain Flak memiliki beberapa kekuatan, dan sangat mengejutkan
Rohan Jhunjhunwala

5
Versi satu tumpukan juga tumpukan bersih. Yang cenderung menjadi poin penting untuk modularitas kode di brain-flak.
Wheat Wizard

Wow. Ini adalah jawaban yang sangat mengesankan.
DJMcMayhem

12

Jelly , 5 byte

Ḷ߀P‘

Ini menggunakan pengindeksan berbasis 0 dan definisi dari spec tantangan.

Cobalah online! atau verifikasi semua kasus uji .

Bagaimana itu bekerja

Ḷ߀P‘  Main link. Argument: n

Ḷ      Unlength; yield [0, ..., n - 1].
 ߀    Recursively apply the main link to each integer in that range.
   P   Take the product. This yields 1 for an empty range.
    ‘  Increment.

Ah, saya lupa bahwa produk kosongnya adalah 1.
Leaky Nun

12

Hexagony , 27 byte

1{?)=}&~".>")!@(</=+={"/>}*

Dibuka:

    1 { ? )
   = } & ~ "
  . > " ) ! @
 ( < / = + = {
  " / > } * .
   . . . . .
    . . . .

Cobalah online!

Penjelasan

Mari kita perhatikan urutannya b(a) = a(n) - 1dan lakukan sedikit pengaturan ulang:

b(a) = a(n) - 1
     = a(n-1)*(a(n-1)-1) + 1 - 1
     = (b(n-1) + 1)*(b(n-1) + 1 - 1)
     = (b(n-1) + 1)*b(n-1)
     = b(n-1)^2 + b(n-1)

Urutan ini sangat mirip tetapi kita bisa menunda kenaikan sampai akhir, yang terjadi untuk menyimpan byte dalam program ini.

Jadi di sini adalah kode sumber beranotasi:

masukkan deskripsi gambar di sini
Dibuat dengan HexagonyColorer Timwi .

Dan di sini adalah diagram memori (segitiga merah menunjukkan posisi awal dan orientasi pointer memori):

masukkan deskripsi gambar di sini
Dibuat dengan EsotericIDE Timwi .

Kode dimulai pada jalur abu-abu yang membungkus sudut kiri, jadi bit linear awal adalah sebagai berikut:

1{?)(
1      Set edge b(1) to 1.
 {     Move MP to edge N.
  ?    Read input into edge N.
   )(  Increment, decrement (no-op).

Kemudian kode mengenai <yang merupakan cabang dan menunjukkan awal (dan akhir) dari loop utama. Selama tepi N memiliki nilai positif, jalur hijau akan dieksekusi. Jalan itu membungkus grid beberapa kali, tetapi sebenarnya seluruhnya linier:

""~&}=.*}=+={....(

The .tidak-ops, sehingga kode yang sebenarnya adalah:

""~&}=*}=+={(
""             Move the MP to edge "copy".
  ~            Negate. This is to ensure that the value is negative so that &...
   &           ...copies the left-hand neighbour, i.e. b(i).
    }=         Move the MP to edge b(i)^2 and turn it around.
      *        Multiply the two copies of b(i) to compute b(i)^2.
       }=      Move the MP back to edge b(i) and turn it around.
         +     Add the values in edges "copy" and b(i)^2 to compute
               b(i) + b(i)^2 = b(i+1).
          ={   Turn the memory pointer around and move to edge N.
            (  Decrement.

Setelah pengurangan ini berkurang Nmenjadi 0, jalur merah dijalankan:

")!@
"     Move MP back to edge b(i) (which now holds b(N)).
 )    Increment to get a(N).
  !   Print as integer.
   @  Terminate the program.

Bisakah Anda menjalankan bruteforcer Anda dalam hal ini?
CalculatorFeline

@ CalculatorFeline Brute forcer dapat melakukan paling banyak program 7-byte (dan bahkan itu hanya dengan banyak asumsi) dalam jumlah waktu yang wajar. Saya tidak melihat ini mungkin dari jarak jauh dalam 7 byte.
Martin Ender

Begitu? Apa yang salah dengan mencoba?
CalculatorFeline

@CalculatorFeline Laziness. Brute forcer selalu membutuhkan sedikit penyesuaian manual yang tidak dapat saya lakukan untuk kesempatan 0 praktis yang akan menemukan sesuatu. Beberapa versi skrip ada di GitHub, jadi orang lain bebas mencobanya.
Martin Ender

Dan bagaimana saya melakukannya?
CalculatorFeline

9

J, 18 14 12 byte

Versi ini berkat randomra. Saya akan mencoba menulis penjelasan terperinci nanti.

0&(]*:-<:)2:

J, 14 byte

Versi ini berkat mil. Gunakan adverbia ^:alih-alih agenda seperti di bawah ini. Penjelasan lebih lanjut akan datang.

2(]*:-<:)^:[~]

J, 18 byte

2:`(1+*/@$:@i.)@.*

Diindeks 0.

Contohnya

   e =: 2:`(1+*/@$:@i.)@.*
   e 1
3
   e 2
7
   e 3
43
   e 4
1807
   x: e i. 10
2 3 7 43 1807 3263443 10650056950807 113423713055421862298779648 12864938683278674737956996400574416174101565840293888 1655066473245199944217466828172807675196959605278049661438916426914992848    91480678309535880456026315554816
   |: ,: x: e i. 10
                                                                                                        2
                                                                                                        3
                                                                                                        7
                                                                                                       43
                                                                                                     1807
                                                                                                  3263443
                                                                                           10650056950807
                                                                              113423713055421862298779648
                                                    12864938683278674737956996400574416174101565840293888
165506647324519994421746682817280767519695960527804966143891642691499284891480678309535880456026315554816

Penjelasan

Ini adalah agenda yang terlihat seperti ini:

           ┌─ 2:
           │    ┌─ 1
       ┌───┤    ├─ +
       │   └────┤           ┌─ / ─── *
── @. ─┤        │     ┌─ @ ─┴─ $:
       │        └─ @ ─┴─ i.
       └─ *

(Dihasilkan menggunakan (9!:7)'┌┬┐├┼┤└┴┘│─'kemudian 5!:4<'e')

Membusuk:

       ┌─ ...
       │
── @. ─┤
       │
       └─ *

Menggunakan cabang atas sebagai gerund G, dan bagian bawah sebagai pemilih F, ini adalah:

e n     <=>     ((F n) { G) n

Ini menggunakan fungsi konstan 2:ketika 0 = * n, yaitu, ketika tanda nol (dengan demikian nadalah nol). Jika tidak, kami menggunakan garpu ini:

  ┌─ 1
  ├─ +
──┤           ┌─ / ─── *
  │     ┌─ @ ─┴─ $:
  └─ @ ─┴─ i.

Yang satu ditambah seri di atas berikut:

            ┌─ / ─── *
      ┌─ @ ─┴─ $:
── @ ─┴─ i.

Menguraikan lebih jauh, ini adalah produk ( */) lebih dari referensi-sendiri ( $:) lebih dari rentang ( i.).


2
Anda juga dapat menggunakan kata keterangan daya untuk mendapatkan 2(]*:-<:)^:[~]14 byte menggunakan rumus a(0) = 2dan a(n+1) = a(n)^2 - (a(n) - 1). Untuk menghitung nilai yang lebih besar, 2permulaan harus ditandai sebagai integer yang diperluas.
mil

Kedua solusi itu sangat bagus. Saya pikir saya tidak menyadari v`$:@.uformat rekursif. Saya selalu menggunakan ^:vformat yang seringkali lebih kompleks. @miles Saya juga tidak pernah menggunakan (]v)trik ini. Butuh 5 menit untuk mengerti.
randomra

1
Untuk kelengkapan, jenis perulangan ke-3 (14 byte menggunakan metode miles): 2(]*:-<:)~&0~](atau 2:0&(]*:-<:)~]). Dan menggabungkannya 13 byte ]0&(]*:-<:)2: .
randomra

12 byte: 0&(]*:-<:)2:. (Maaf, saya tidak boleh bermain golf di komentar.)
randomra

@randomra Itu adalah penggunaan ikatan yang sangat rapi. Saya harus membaca halaman untuk mencari tahu apa yang terjadi karena biasanya orang akan berpikir bahwa kata kerja tengah menerima tiga argumen.
mil

9

Perl 6 , 24 byte

{(2,{1+[*] @_}...*)[$_]}
{(2,{1+.²-$_}...*)[$_]}

Penjelasan

# bare block with implicit parameter 「$_」
{
  (
    # You can replace 2 with 1 here
    # so that it uses 1 based indexing
    # rather than 0 based
    2,

    # bare block with implicit parameter 「@_」
    {
      1 +

      # reduce the input of this inner block with 「&infix:<*>」
      # ( the input is all of them generated when using a slurpy @ var )
      [*] @_

      # that is the same as:
      # 「@_.reduce: &infix:<*>」
    }

    # keep calling that to generate more values until:
    ...

    # forever
    *

  # get the value as indexed by the input
  )[ $_ ]
}

Pemakaian:

my &code = {(2,{1+[*] @_}...*)[$_]}

say code 0; # 2
say code 1; # 3
say code 2; # 7
say code 3; # 43
say code 4; # 1807

# you can even give it a range
say code 4..7;
# (1807 3263443 10650056950807 113423713055421844361000443)

say code 8;
# 12864938683278671740537145998360961546653259485195807
say code 9;
# 165506647324519964198468195444439180017513152706377497841851388766535868639572406808911988131737645185443
say code 10;
# 27392450308603031423410234291674686281194364367580914627947367941608692026226993634332118404582438634929548737283992369758487974306317730580753883429460344956410077034761330476016739454649828385541500213920807

my $start = now;
# how many digits are there in the 20th value
say chars code 20;
# 213441

my $finish = now;
# how long did it take to generate the values up to 20
say $finish - $start, ' seconds';
# 49.7069076 seconds

Irisan array dengan $_? Sihir apakah ini?
Zaid

8

Haskell, 26 byte

f n|n<1=2|m<-f$n-1=1+m*m-m

Contoh penggunaan: f 4-> 1807.


7

Java 7, 46 42 byte

int f(int n){return--n<0?2:f(n)*~-f(n)+1;}

Menggunakan pengindeksan 0 dengan rumus biasa. Aku bertukar n*n-nuntuk n*(n-1)meskipun, karena Java tidak memiliki operator listrik berguna, dan f()panggilan mendapatkan panjang.


3
f(n)*~-f(n)harus bekerja.
Dennis

1
Bagaimana saya bisa melupakan trik itu setiap saat ? Jika itu tidak ada di halaman tips, pasti akan.
Geobits

2
return--n<0menghemat satu byte lagi.
Dennis





5

Brain-Flak , 158 154 byte

Leaky Nun membuatku mengalahkan di sini

({}<(()())>){({}[()]<<>(())<>([]){{}<>({}<<>(({}<>))><>)<>({<({}[()])><>({})<>}{})<>{}([])}{}<>({}())([]){{}({}<>)<>([])}{}<>>)}{}([][()]){{}{}([][()])}{} 

Cobalah secara Online!

Penjelasan

Letakkan dua di bawah input a (0)

({}<(()())>) 

Sementara input lebih besar dari nol kurangi satu dari input dan ...

{
({}[()]

Diam-diam ...

<

Letakkan satu di tumpukan lain untuk bertindak sebagai katalis untuk perkalian <> (()) <>

Sementara tumpukan tidak kosong

 ([])
 {
  {}

Pindahkan bagian atas daftar dan salin

  <>({}<<>(({}<>))><>)

Lipat gandakan katalis dengan salinannya

  <>({<({}[()])><>({})<>}{})<>{}
  ([])
 }
 {}

Tambahkan satu

 <>({}())

Pindahkan urutan kembali ke tumpukan yang tepat

 ([])
 {
 {}
 ({}<>)<>
 ([])
 }
 {}
 <>
>)
}{}

Hapus semua kecuali item bawah (yaitu nomor terakhir yang dibuat)

([][()])
{
{}
{}
([][()])
}
{}

5

C, 32 byte

f(n){return--n?f(n)*~-f(n)+1:2;}

Menggunakan pengindeksan berbasis 1. Uji di Ideone .



5

R, 44 42 41 byte

2 byte menghemat berkat JDL

Hemat 1 byte berkat pengguna5957401

f=function(n)ifelse(n,(a=f(n-1))^2-a+1,2)

1
Tidak jelas dari pernyataan masalah, tetapi selama ndijamin tidak negatif maka kondisinya bisa dikurangi dari n>0menjadi adil n.
JDL

@JDL Bagus! Terima kasih!
Mamie

f(n-1)adalah 6 byte. Saya pikir Anda menyimpan byte dengan menetapkannya untuk sesuatu. yaituifelse(n,(a=f(n-1))^2-a+1,2)
user5957401

5

Oasis , 4 byte (tidak bersaing)

Mungkin bahasa terakhir saya dari keluarga golf! Non-bersaing, karena bahasa tersebut mengungguli tantangan.

Kode:

²->2

Solusi alternatif berkat Zwei :

<*>2

Versi yang diperluas:

a(n) = ²->
a(0) = 2

Penjelasan:

²    # Stack is empty, so calculate a(n - 1) ** 2.
 -   # Subtract, arity 2, so use a(n - 1).
  >  # Increment by 1.

Menggunakan pengkodean CP-1252 . Cobalah online!


Bahasa golf terakhir? Anda tidak akan menghasilkan lagi? D:
Conor O'Brien

@ ConorO'Brien Mungkin, saya kehabisan ide sekarang :(
Adnan

Sebelum melihat tantangan ini, saya b<*>2menggunakana(n-1)*(a(n-1)+1)-1
Zwei

@ Zwei Sangat rapi! Anda benar-benar dapat meninggalkan bkarena itu akan secara otomatis diisi (daripada input) :).
Adnan

1
Yup, saya perhatikan itu setelah memposting. Saya terkejut seberapa baik bahasa ini bekerja untuk ini, meskipun ia dirancang untuk urutan.
Zwei

3

Python, 38 36 byte

2 byte berkat Dennis.

f=lambda n:0**n*2or~-f(n-1)*f(n-1)+1

Ide itu!

Menggunakan hubungan ini yang diubah dari yang disediakan dalam urutan sebagai gantinya:

a(n+1) = a(n) * (a(n) - 1) + 1

Penjelasan

0**n*2mengembalikan 2kapan n=0dan 0sebaliknya, karena 0**0didefinisikan berada 1dalam Python.


3

Cheddar , 26 byte

n g->n?g(n-=1)**2-g(n)+1:2

Cobalah online!

Idiomatik.

Penjelasan

n g ->    // Input n, g is this function
  n ?     // if n is > 1
    g(n-=1)**2-g(n)+1   // Do equation specified in OEIS
  : 2     // if n == 0 return 2

Sekarang 4 kali (hampir)
Leaky Nun

Mengapa Anda menghapus tautan TIO?
Leaky Nun

@ LeakyNun oh Anda harus mengedit saat saya
Downgoat


3

05AB1E , 7 byte

2sFD<*>

Dijelaskan

Menggunakan pengindeksan berbasis nol.

2         # push 2 (initialization for n=0)
 sF       # input nr of times do
   D<*    # x(x-1)
      >   # add 1

Cobalah online!




2

Jelly , 7 byte

²_’
2Ç¡

Cobalah online!

Menggunakan hubungan ini yang disediakan dalam urutan sebagai gantinya: a(n+1) = a(n)^2 - a(n) + 1

Penjelasan

2Ç¡   Main chain, argument in input

2     Start with 2
  ¡   Repeat as many times as the input:
 Ç        the helper link.


²_’   Helper link, argument: z
²     z²
  ’   z - 1
 _    subtraction, yielding z² - (z-1) = z² - z + 1

2

C, 46 byte

s(n,p,r){for(p=r=2;n-->0;p*=r)r=p+1;return r;}

Ide itu!

Penggunaan p sebagai penyimpanan sementara produk.

Pada dasarnya, saya mendefinisikan dua urutan p(n)dan r(n), di mana r(n)=p(n-1)+1danp(n)=p(n-1)*r(n) .

r(n) adalah urutan yang diperlukan.


1
Apa alasan Anda tidak menggunakan hubungan yang sama dari jawaban Python Anda di sini? Itu harusnya jauh lebih pendek ...
Dennis

@ Dennis Ini lebih menarik.
Leaky Nun

@ Dennis Dan jawaban ini bisa diangkut
Leaky Nun

2

R, 50 46 44 byte

    n=scan();v=2;if(n)for(i in 1:n){v=v^2-v+1};v

Daripada melacak seluruh urutan, kami hanya melacak produk, yang mengikuti aturan pembaruan kuadratik yang diberikan selama n> 1 n> 0. (Urutan ini menggunakan "mulai dari satu konvensi nol")

Menggunakan start at zero convention menghemat beberapa byte karena kita dapat menggunakan if (n) daripada if (n> 1)


2

Ubur-ubur , 13 byte

p
\Ai
&(*
><2

Cobalah online!

Penjelasan

Mari kita mulai dari bawah ke atas:

(*
<

Ini adalah pengait, yang mendefinisikan fungsi f(x) = (x-1)*x.

&(*
><

Ini menyusun kait sebelumnya dengan fungsi kenaikan sehingga memberi kita fungsi g(x) = (x-1)*x+1.

\Ai
&(*
><

Akhirnya, ini menghasilkan fungsi hyang merupakan iterasi dari fungsi sebelumnya g, sebanyak yang diberikan oleh input integer.

\Ai
&(*
><2

Dan akhirnya, kami menerapkan iterasi ini ke nilai awal 2. Itup di atas hanya mencetak hasilnya.

Alternatif (juga 13 byte)

p
>
\Ai
(*
>1

Ini mempertahankan kenaikan sampai akhir.


2

C, 43 , 34 , 33 byte

1-diindeks:

F(n){return--n?n=F(n),n*n-n+1:2;}

Tes utama:

int main() {
  printf("%d\n", F(1));
  printf("%d\n", F(2));
  printf("%d\n", F(3));
  printf("%d\n", F(4));
  printf("%d\n", F(5));
}


2

Mathematica, 19 byte

Nest[#^2-#+1&,2,#]&

Atau 21 byte:

Array[#0,#,0,1+1##&]&

The Arraysolusi ajaib. Sayang sekali, ##0bukan hal. ;)
Martin Ender


1

Sebenarnya , 14 12 byte

Ini digunakan pengindeksan 0. Saran golf diterima. Cobalah online!

2#,`;πu@o`nF

Tidak melakukan pelanggaran:

2#              Start with [2]
  ,`     `n     Take 0-indexed input and run function (input) times
    ;           Duplicate list
     πu         Take product of list and increment
       @o       Swap and append result to the beginning of the list
           F    Return the first item of the resulting list

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.