Nuovo ordine n. 5: dove Fibonacci e Beatty si incontrano a Wythoff


16

Introduzione (potrebbe essere ignorata)

Mettere tutti i numeri positivi nel suo ordine regolare (1, 2, 3, ...) è un po 'noioso, no? Quindi ecco una serie di sfide intorno alle permutazioni (rimpasto) di tutti i numeri positivi. Questa è la quinta sfida di questa serie (collegamenti alla prima , seconda , terza e quarta sfida).

In questa sfida, incontreremo l'array Wythoff, che è una valanga intrecciata di sequenze di Fibonacci e sequenze di Beatty!

I numeri di Fibonacci sono probabilmente per molti di voi una sequenza ben nota. Dati due numeri iniziali F0 e F1 , i seguenti Fn sono dati da: Fn=F(n1)+F(n2) per n>2 .

La sequenza di Beatty , dato un parametro r è: Bnr=rn per n1 . Una delle proprietà della sequenza di Beatty è che per ogni parametro r , esiste esattamente un parametro s=r/(r1) , in modo tale che le sequenze di Beatty per quei parametri siano disgiunte e unite insieme, si estendono su tutti i numeri naturali escludendo 0 (ad es .: BrBr/(r1)=N{0}).

Ora ecco che arriva la parte strabiliante: puoi creare un array, in cui ogni riga è una sequenza di Fibonacci e ogni colonna è una sequenza Beatty. Questo array è l' array Wythoff . La parte migliore è: ogni numero positivo appare esattamente una volta in questo array! L'array è simile al seguente:

   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 ...
  ...

Un elemento alla riga m colonna n è definito come:

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

dove φ è il rapporto aureo: φ=1+52 .

Se seguiamo le anti-diagonali di questo array, otteniamo A035513 , che è la sequenza target per questa sfida (nota che questa sequenza viene aggiunta all'OEIS dallo stesso Neil Sloane !). Poiché si tratta di una sfida "sequenza pura", il compito è quello di produrre a(n) per un dato n come input, dove a(n) è A035513 .

Ci sono diverse strategie che si possono seguire per arrivare a un'(n) , il che rende questa sfida (a mio parere) davvero interessante.

Compito

Dato un input intero n , output a(n) in formato intero, dove a(n) è A035513 .

Nota: qui si assume l'indicizzazione basata su 1; puoi utilizzare l'indicizzazione basata su 0, quindi a(0)=1;a(1)=2 , ecc. Indicare questo nella risposta se si sceglie di utilizzarlo.

Casi test

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

Potrebbe essere divertente sapere che il più grande a(n) per 1n32767 è a(32642)=512653048485188394162163283930413917147479973138989971=F(256)2φ+F(255).

Regole

  • Input e output sono numeri interi
  • Il tuo programma dovrebbe almeno supportare input nell'intervallo da 1 a 32767). Nota che a(n) arriva fino a 30 cifre in questo intervallo ...
  • Input non validi (0, float, stringhe, valori negativi, ecc.) Possono causare output non previsti, errori o comportamenti (non) definiti.
  • Si applicano le regole I / O predefinite .
  • Sono vietate le scappatoie predefinite .
  • Questo è , quindi vince la risposta più breve in byte

2
Quindi qual è il riferimento al Nuovo Ordine qui?
Luis Mendo,

2
@LuisMendo: la valanga di sequenze di Fibonacci e Beatty, che formano l'array Wythoff ...
agtoever

Ah, l'ho perso del tutto! Ora mi dispiace ...
Luis Mendo,

1
Una rappresentazione in virgola mobile di phi (o rt (5)) e l'applicazione della ricorrenza soddisferanno i requisiti di intervallo?
Jonathan Allan,

1
Si prega di correggere il banco di prova 9 °: è 999non9999
J42161217

Risposte:


4

Gelatina , 27 24 byte

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

Provalo online!

Collegamento monadico utilizzando l'indicizzazione basata su 1. Grazie a @JonathanAllan per un modo migliore per ottenere la riga e le colonne ne salvare 3 byte. Nella sua forma più breve è troppo lento per N più grande su TIO, quindi quanto segue Provalo online! riduce la dimensione dell'elenco iniziale di righe e colonne al costo di tre byte.

Spiegazione

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

Nota che si basa sulla descrizione del codice Python nella pagina OEIS.


1
...×⁹r‘ÆḞ¤Sð/ne salva uno nella tua versione di fusione ( 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]}

Provalo online!

Usa la formula T(n,-1)=n-1;T(n,0)=nφ;T(n,K)=T(n,K-1)+T(n,K-2)per costruire l'array (trasposto), quindi splitsl'array lungo gli antidiagonali. kesiste semplicemente per impedire di forzare una drop=Fdiscussione nel m[-1:-2,]caso n=1.

Grazie a Neil per aver segnalato un golf da 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]}

Provalo online!

Implementa la formula T(n,K)=FioB(K+1)nφ+FioB(K)(n-1)per generare l'array, quindi splitslungo gli antidiagonali ed estrae l' nthelemento.

Grazie a Robin Ryder per il T[2]=1trucco per generare la sequenza di Fibonacci.


Entrambe le soluzioni sono altamente inefficienti, creando una nxnmatrice di (molto probabilmente) doubles, poiché R promuove integer(con segno a 32 bit) doubleautomaticamente quando trabocca, ma la seconda dovrebbe essere molto più veloce. Prendere ncome un bignum dovrebbe funzionare automaticamente, usando la chiamata gmp::as.bigz(n), se la perdita di precisione sotto doubles fosse preoccupante, e quindi la lingua sarebbe R + gmp.


Puoi usare (1+5^.5)/2invece di (.5+5^.5/2)?
Neil,

@Neil ... sì, posso. Grazie! Ho intenzione di modificarlo solo in alto a meno che non riesca a trovare un modo per giocare a golf sul secondo molto di più.
Giuseppe,


2

Gelatina , 30 byte

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

Provalo online!
Questo è un po 'lento, ma viene apportato un enorme miglioramento con un prefisso diḤ½Ċ(doppio, radice quadrata, soffitto) come in questa suite di test .


2
hai ragione! 740496902è il risultato per999
J42161217

Combinando la prima parte della tua e la seconda parte della mia si ottengono 25 byte . Non sono sicuro di chi di noi dovrebbe avere la versione combinata!
Nick Kennedy,

@NickKennedy - bello, provaci!
Jonathan Allan,

2

Carbone , 54 byte

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

Provalo online!Il collegamento è alla versione dettagliata del codice. 0-indicizzati. Utilizza solo l'aritmetica intera, quindi funziona per valori arbitrari di grandi dimensioni. Spiegazione:

Nθ

Ingresso q .

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

Calcola l'antidiagonale sottraendo numeri sempre crescenti da q , che finisce con il numero di riga di destinazione m.

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

Calcola i primi m+1termini di A019446 , anche se ci interessa solo il mth.

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

Calcola i primi n+4termini della serie generalizzata di Fibonacci che inizia con [a(m), m]. I termini di questa sequenza sono i mtermini di A019446 , A001477 , A000201 , A003622 , A035336 ; queste ultime due sono le prime due colonne dell'array Wythoff, e quindi questa sequenza continua con il resto della mquinta riga dell'array.

I⊟υ

Emette il termine desiderato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.