Orde Baru # 5: di mana Fibonacci dan Beatty bertemu di Wythoff

16

pengantar (dapat diabaikan)

Menempatkan semua angka positif dalam urutan regulernya (1, 2, 3, ...) agak membosankan, bukan? Jadi di sini adalah serangkaian tantangan seputar permutasi (perombakan) dari semua bilangan positif. Ini adalah tantangan kelima dalam seri ini (tautan ke tantangan pertama , kedua , ketiga dan keempat ).

Dalam tantangan ini, kita akan bertemu dengan array Wythoff, yang merupakan longsoran terjalin dari urutan Fibonacci dan urutan Beatty!

The angka Fibonacci mungkin untuk sebagian besar dari Anda urutan terkenal. Diberi dua angka awal F0 dan F1 , Fn berikut diberikan oleh: Fn=F(n1)+F(n2) untuk n>2 .

The Beatty urut , mengingat parameter r adalah: Bnr=rn untuk n1 . Salah satu sifat dari urutan Beatty adalah bahwa untuk setiap parameter r , ada tepat satu parameter s=r/(r1) , sehingga urutan Beatty untuk parameter tersebut dipisahkan dan digabungkan bersama-sama, mereka merentang semua bilangan alami tidak termasuk 0 (mis: BrBr/(r1)=N{0} ).

Sekarang inilah bagian mindblowing: Anda dapat membuat array, di mana setiap baris adalah urutan Fibonacci dan setiap kolom adalah urutan Beatty. Array ini adalah array Wythoff . Bagian terbaiknya adalah: setiap angka positif muncul tepat sekali dalam array ini! Array terlihat seperti ini:

   1    2    3    5    8   13   21   34   55   89  144 ...
   4    7   11   18   29   47   76  123  199  322  521 ...
   6   10   16   26   42   68  110  178  288  466  754 ...
   9   15   24   39   63  102  165  267  432  699 1131 ...
  12   20   32   52   84  136  220  356  576  932 1508 ...
  14   23   37   60   97  157  254  411  665 1076 1741 ...
  17   28   45   73  118  191  309  500  809 1309 2118 ...
  19   31   50   81  131  212  343  555  898 1453 2351 ...
  22   36   58   94  152  246  398  644 1042 1686 2728 ...
  25   41   66  107  173  280  453  733 1186 1919 3105 ...
  27   44   71  115  186  301  487  788 1275 2063 3338 ...
  ...

Elemen pada baris m dan kolom n didefinisikan sebagai:

Am,n={mφφ if n=1mφφ2 if n=2Am,n2+Am,n1 if n>2

dengan φ adalah rasio emas: φ=1+52 .

Jika kita mengikuti anti-diagonal array ini, kita mendapatkan A035513 , yang merupakan urutan target untuk tantangan ini (perhatikan bahwa urutan ini ditambahkan ke OEIS oleh Neil Sloane sendiri!). Karena ini adalah tantangan "urutan murni", tugasnya adalah mengeluarkan a(n) untuk n diberikan sebagai input, di mana a(n) adalah A035513 .

Ada strategi yang berbeda yang dapat Anda ikuti untuk sampai ke a(n) , yang membuat tantangan ini (menurut saya) benar-benar menarik.

Tugas

Diberikan input integer n , output a(n) dalam format integer, di mana a(n) adalah A035513 .

Catatan: pengindeksan berbasis 1 diasumsikan di sini; Anda dapat menggunakan pengindeksan berbasis 0, jadi a(0)=1;a(1)=2 , dll. Sebutkan ini dalam jawaban Anda jika Anda memilih untuk menggunakan ini.

Uji kasus

Input | Output
---------------
1     |  1
5     |  7
20    |  20
50    |  136
78    |  30
123   |  3194
1234  |  8212236486
3000  |  814
9999  |  108240
29890 |  637

Mungkin menyenangkan untuk mengetahui bahwa terbesar a(n) untuk 1n32767 adalah a(32642)=512653048485188394162163283930413917147479973138989971=F(256)2φ+F(255).

Aturan

  • Input dan output adalah bilangan bulat
  • Program Anda setidaknya harus mendukung input dalam kisaran 1 hingga 32767). Perhatikan bahwa a(n) naik ke 30 digit angka dalam kisaran ini ...
  • Input yang tidak valid (0, float, string, nilai negatif, dll.) Dapat mengakibatkan output yang tidak terduga, kesalahan atau (tidak) perilaku yang didefinisikan.
  • Standar I / O aturan berlaku.
  • Celah default dilarang.
  • Ini adalah , jadi jawaban tersingkat dalam byte menang
agtoever
sumber
2
Jadi apa rujukan Orde Baru di sini?
Luis Mendo
2
@LuisMendo: longsoran sekuens Fibonacci dan Beatty, yang membentuk array Wythoff ...
agtoever
Ah, aku benar-benar merindukan itu! Sekarang saya merasa menyesal ...
Luis Mendo
1
Apakah representasi floating point dari phi (atau rt (5)) dan penerapan perulangan akan memenuhi persyaratan rentang?
Jonathan Allan
1
Harap perbaiki kotak uji ke-9: 999tidak9999
J42161217

Jawaban:

4

Jelly , 27 24 byte

p`SÞ⁸ịð’;×ØpḞ¥×⁹r‘ÆḞ¤Sð/

Cobalah online!

Tautan monadik menggunakan pengindeksan berbasis 1. Terima kasih kepada @JonathanAllan untuk cara yang lebih baik untuk mendapatkan baris dan kolom dari ndan menghemat 3 byte. Dalam bentuk terpendek, ini terlalu lambat untuk n yang lebih besar di TIO, jadi yang berikut Coba online! mengurangi ukuran daftar awal baris dan kolom dengan biaya tiga byte.

Penjelasan

p`                       | Cartesian product of the range from 1..input with itself   
  SÞ                     | Sort by sum
    ⁸ị                   | Find the tuple at the position indicated by the input - this is the row and column
      ð               ð/ | Start a new dyadic chain using the row as the left and column as the right argument
       ’                 | Increase the row by 1
        ;    ¥           | Concatenate to:
         ×Øp             |   row × φ
            Ḟ            |   rounded down
              ×     ¤    | Multiply this pair by
                  ÆḞ     |   the Fibonacci numbers at positions
               ⁹         |   column index and
                r‘       |   column index plus one
                     S   | sum

Catatan ini didasarkan pada deskripsi kode Python pada halaman OEIS.

Nick Kennedy
sumber
1
...×⁹r‘ÆḞ¤Sð/simpan satu dalam versi penggabungan Anda ( TIO )
Jonathan Allan
6

R , 143 130 124 123 byte

function(n){k=0:n+1
`~`=rbind
m=k-1~(k*(1+5^.5)/2)%/%1
for(i in k)m=m~m[i,]+m[i+1,]
m=m[-1:-2,]
m[order(row(m)+col(m))][n]}

Cobalah online!

T(n,-1)=n-1;T(n,0)=nϕ;T(n,k)=T(n,k-1)+T(n,k-2)untuk membangun array (dialihkan), maka splitsarray di sepanjang antidiagonals. khanya ada untuk mencegah pemaksaan drop=Fargumen dalam m[-1:-2,]kasus ini n=1.

Terima kasih kepada Neil untuk menunjukkan golf 1 byte.

R , 150 138 132 byte

function(n){T[2]=1
for(j in 2:n-1)T=c(T,T[j]+T[j+1])
m=T[-1]%o%((1:n*(.5+5^.5/2))%/%1)+T[-1-n]%o%(1:n-1)
m[order(row(m)+col(m))][n]}

Cobalah online!

Menerapkan formula T(n,k)=Fsayab(k+1)nϕ+Fsayab(k)(n-1)untuk mendapatkan menghasilkan array, lalu splitssepanjang antidiagonals dan mengekstrak nthelemen.

Terima kasih kepada Robin Ryder untuk T[2]=1trik menghasilkan urutan Fibonacci.


Both solutions are highly inefficient, creating an nxn matrix of (most likely) doubles, as R promotes integer (32-bit signed) to double automatically when overflowing, but the second one should be quite a lot faster. Taking n as a bignum should work automatically, using the call gmp::as.bigz(n), should loss of precision under doubles be worrisome, and then the language would be R + gmp.

Giuseppe
sumber
Can you use (1+5^.5)/2 instead of (.5+5^.5/2)?
Neil
@Neil ...yes, I can. Thank you! Only going to edit it into the top one unless I can find a way to golf down the second one quite a lot more.
Giuseppe
2

Jelly, 30 bytes

p`SÞ⁸ịð;Øp,²;\¤×Ḟ¥/;+ƝQƊ⁹¡ị@ð/

Try it online!
This is a little slow, but a huge improvement is made with a prefix of Ḥ½Ċ (double, square-root, ceiling) like in this test-suite.

Jonathan Allan
sumber
2
kamu benar! 740496902adalah hasil untuk999
J42161217
Menggabungkan bagian pertama dari Anda dan bagian kedua dari saya memberikan 25 byte . Tidak yakin siapa di antara kita yang harus memiliki versi gabungan!
Nick Kennedy
@NickKennedy - bagus, lakukanlah!
Jonathan Allan
2

Arang , 54 byte

Nθ≔⁰ηW‹ηθ«≦⊕η≧⁻ηθ»⊞υ¹Fθ⊞υ⁻⁺³ι§υ⊖§υι⊞υθF⁺²⁻θη⊞υΣ…⮌υ²I⊟υ

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Diindeks 0. Hanya menggunakan bilangan bulat aritmatika sehingga berfungsi untuk nilai besar yang arbitrer. Penjelasan:

Nθ

Masukan q.

≔⁰ηW‹ηθ«≦⊕η≧⁻ηθ»

Hitung antidiagonal dengan mengurangi angka yang semakin meningkat dari q , yang berakhir dengan nomor baris target m.

⊞υ¹Fθ⊞υ⁻⁺³ι§υ⊖§υι

Hitung m+1ketentuan pertama A019446 , meskipun kami hanya tertarik pada mth.

⊞υθF⁺²⁻θη⊞υΣ…⮌υ²

Hitung n+4syarat pertama dari seri Fibonacci umum yang dimulai dengan [a(m), m]. Ketentuan urutan ini adalah mketentuan th A019446 , A001477 , A000201 , A003622 , A035336 ; dua yang terakhir ini adalah dua kolom pertama dari array Wythoff, dan dengan demikian urutan ini berlanjut dengan sisa mbaris th dari array.

I⊟υ

Keluarkan istilah yang diinginkan.

Neil
sumber