Neuer Auftrag Nr. 5: Hier treffen sich Fibonacci und Beatty bei Wythoff

16

Einleitung (kann ignoriert werden)

Es ist ein bisschen langweilig, alle positiven Zahlen in der regulären Reihenfolge (1, 2, 3, ...) anzuordnen, nicht wahr? Hier ist also eine Reihe von Herausforderungen im Zusammenhang mit Permutationen (Umformungen) aller positiven Zahlen. Dies ist die fünfte Herausforderung in dieser Reihe (Links zur ersten , zweiten , dritten und vierten Herausforderung).

Bei dieser Herausforderung treffen wir auf das Wythoff-Array, eine Lawine aus Fibonacci-Sequenzen und Beatty-Sequenzen!

Die Fibonacci-Zahlen sind für die meisten von Ihnen wahrscheinlich eine bekannte Folge. Bei zwei gegebenen Startnummern F0 und F1 sind die folgenden Fn gegeben durch: Fn=F(n1)+F(n2) für n>2 .

Die Beatty-Sequenz bei gegebenem Parameter r lautet: Bnr=rn für n1 . Eine der Eigenschaften der Beatty-Sequenz ist, dass es für jeden Parameter r genau einen Parameter s=r/(r1) , sodass die Beatty-Sequenzen für diese Parameter disjunkt und miteinander verbunden sind und alle natürlichen Zahlen außer umfassen 0 (zB: BrBr/(r1)=N{0}).

Jetzt kommt der überwältigende Teil: Sie können ein Array erstellen, in dem jede Zeile eine Fibonacci-Sequenz und jede Spalte eine Beatty-Sequenz ist. Dieses Array ist das Wythoff-Array . Das Beste daran ist: Jede positive Zahl kommt in diesem Array genau einmal vor! Das Array sieht folgendermaßen aus:

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

Ein Element in Zeile m und Spalte n ist wie folgt definiert:

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

wobei φ der goldene Schnitt ist: φ=1+52 .

Wenn wir den Antidiagonalen dieses Arrays folgen, erhalten wir A035513 , die Zielsequenz für diese Herausforderung (beachten Sie, dass diese Sequenz von Neil Sloane selbst zum OEIS hinzugefügt wurde !). Da dies eine „reine Sequenz“ Herausforderung ist, die Aufgabe zu Ausgang ist a(n) für eine gegebene n als Eingabe, wobei a(n) ist A035513 .

Es gibt verschiedene Strategien, um zu a(n) , was diese Herausforderung (meiner Meinung nach) wirklich interessant macht.

Aufgabe

Bei einem gegebenen ganzzahligen Eingangs n , Ausgabe a(n) im Ganzzahlformat, wobei a(n) ist A035513 .

Hinweis: Hier wird eine 1-basierte Indizierung angenommen. Sie können eine 0-basierte Indizierung verwenden, also a(0)=1;a(1)=2 usw. Bitte erwähnen Sie dies in Ihrer Antwort, wenn Sie dies verwenden möchten.

Testfälle

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

a(n)1n32767a(32642)=512653048485188394162163283930413917147479973138989971=F(256)2φ+F(255).

Regeln

  • Eingabe und Ausgabe sind Ganzzahlen
  • ein(n) in diesem Bereich bis zu 30 Ziffern umfasst ...
  • Ungültige Eingaben (0, Gleitkommazahlen, Zeichenfolgen, negative Werte usw.) können zu unvorhergesehenen Ausgaben, Fehlern oder (un) definiertem Verhalten führen.
  • Es gelten die Standard- E / A-Regeln .
  • Standardlücken sind verboten.
  • Das ist , also gewinnt die kürzeste Antwort in Bytes
wie auch immer
quelle
2
Also, was ist die New Order Referenz hier?
Luis Mendo
2
@LuisMendo: Die Lawine der Fibonacci und Beatty Sequenzen, die das Wythoff Array bilden ...
seit dem
Ah, das habe ich völlig verpasst! Jetzt fühle ich bereue ...
Luis Mendo
1
Wird eine Gleitkommadarstellung von phi (oder rt (5)) und die Anwendung der Wiederholung die Bereichsanforderung erfüllen?
Jonathan Allan
1
Bitte beheben Sie den 9. Testfall: Es ist 999nicht9999
J42161217

Antworten:

4

Jelly , 27 24 Bytes

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

Probieren Sie es online!

Monadischer Link mit 1-basierter Indizierung. Vielen Dank an @JonathanAllan für eine bessere Möglichkeit, die Zeilen und Spalten zu erhalten nund 3 Bytes zu sparen. In seiner kürzesten Form ist es zu langsam für ein größeres n auf TIO, also versuchen Sie es online! Reduziert die Größe der anfänglichen Liste von Zeilen und Spalten auf Kosten von drei Bytes.

Erläuterung

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

Beachten Sie, dass dies auf der Beschreibung des Python-Codes auf der OEIS-Seite basiert.

Nick Kennedy
quelle
1
...×⁹r‘ÆḞ¤Sð/Speichert einen in Ihrer Zusammenschlussversion ( TIO )
Jonathan Allan
6

R , 143 130 124 123 Bytes

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]}

Probieren Sie es online!

T(n,-1)=n-1;T(n,0)=nϕ;T(n,k)=T(n,k-1)+T(n,k-2)das Array zu konstruieren (transponiert), dann splitsdas Array entlang Antidiagonalen. kexistiert lediglich, um zu verhindern, dass ein drop=FArgument m[-1:-2,]für den Fall erzwungen wird n=1.

Vielen Dank an Neil für den Hinweis auf ein 1-Byte-Golf.

R , 150 138 132 Bytes

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]}

Probieren Sie es online!

Implementiert die Formel T(n,k)=Fichb(k+1)nϕ+Fichb(k)(n-1)um das Array zu generieren, dann splitsentlang der Antidiagonalen und extrahiert das nthElement.

Vielen Dank an Robin Ryder für den T[2]=1Trick zur Erzeugung der Fibonacci-Sequenz.


Beide Lösungen sind sehr ineffizient und erstellen eine nxnMatrix von (höchstwahrscheinlich) doubles, da R integer(32-Bit-Signed) doublebei Überlauf automatisch hochstufen soll, während die zweite Lösung wesentlich schneller sein sollte. Als nBignum nehmen sollte automatisch funktionieren, mit dem Anruf gmp::as.bigz(n), sollte der Präzisionsverlust unter doubles besorgniserregend sein, und dann wäre die Sprache R + gmp.

Giuseppe
quelle
Können Sie (1+5^.5)/2anstelle von verwenden (.5+5^.5/2)?
Neil
@ Neil ... ja, ich kann. Vielen Dank! Ich werde es nur in die oberste bearbeiten, es sei denn, ich kann einen Weg finden, die zweite noch viel weiter nach unten zu spielen.
Giuseppe
2

Gelee , 30 Bytes

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

Probieren Sie es online!
Dies ist ein wenig langsam, aber mit dem PräfixḤ½Ċ(doppelt, Quadratwurzel, Decke) wie in dieser Testsuite wird eine enorme Verbesserung erzielt .

Jonathan Allan
quelle
2
Sie haben Recht! 740496902ist das Ergebnis für999
J42161217
Wenn Sie den ersten und den zweiten Teil von mir kombinieren, erhalten Sie 25 Bytes . Nicht sicher, wer von uns die kombinierte Version haben sollte!
Nick Kennedy
@ NickKennedy - schön, machen Sie es!
Jonathan Allan
2

Kohle , 54 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. 0-indiziert. Verwendet nur Ganzzahlarithmetik und funktioniert daher für beliebig große Werte. Erläuterung:

Nθ

Eingabe q.

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

Berechnen Sie die Antidiagonale, indem Sie immer größere Zahlen von subtrahieren q, was zur Zielzeilennummer führt m.

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

Berechnen Sie die ersten m+1Terme von A019446 , obwohl wir nur am mth interessiert sind .

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

Berechnen Sie die ersten n+4Terme der verallgemeinerten Fibonacci-Reihe, die mit beginnen [a(m), m]. Die Ausdrücke dieser Sequenz sind die mth-Ausdrücke von A019446 , A001477 , A000201 , A003622 , A035336 ; Die letzten beiden Spalten sind die ersten beiden Spalten des Wythoff-Arrays. Diese Sequenz wird daher mit der restlichen mZeile des Arrays fortgesetzt .

I⊟υ

Geben Sie den gewünschten Begriff aus.

Neil
quelle