Geduld, junger „Padovan“


44

Jeder kennt die Fibonacci-Folge:
Man nimmt ein Quadrat, fügt ein gleiches Quadrat hinzu und fügt dann wiederholt ein Quadrat hinzu, dessen Seitenlänge der größten Seitenlänge des resultierenden Rechtecks ​​entspricht.
Das Ergebnis ist eine wunderschöne Spirale aus Quadraten, deren Zahlenfolge die Fibonacci-Folge ist :

Was aber, wenn wir keine Quadrate verwenden wollten?

Wenn wir in ähnlicher Weise gleichseitige Dreiecke anstelle von Quadraten verwenden, erhalten wir eine ebenso schöne Dreiecksspirale und eine neue Folge: die Padovan-Folge , auch bekannt als A000931 :

Aufgabe:

Bei einer positiven ganzen Zahl wird ausgegeben , der te Term in der Padovan-Sequenz ODER die ersten Terme.NaNNN

Angenommen, die ersten drei Terme der Sequenz sind alle . Die Sequenz beginnt also wie folgt: 1

1,1,1,2,2,3,...

Eingang:

  • Beliebige positive ganze ZahlN0

  • Ungültige Eingaben müssen nicht berücksichtigt werden

Ausgabe:

  • Der te Term in der Padovan-Sequenz ODER die ersten Terms der Padovan-Sequenz.NNN

  • Wenn die ersten Terme ausgedruckt werden, kann die Ausgabe nach Belieben erfolgen (Liste / Array, mehrzeilige Zeichenfolge usw.).N

  • Kann entweder indiziert oder indiziert sein01

Testfälle:
(0-indiziert, ter Term)N

Input | Output
--------------
0     | 1
1     | 1
2     | 1
4     | 2
6     | 4
14    | 37
20    | 200
33    | 7739

(1-indiziert, erste Begriffe)N

Input | Output
--------------
1     | 1
3     | 1,1,1
4     | 1,1,1,2
7     | 1,1,1,2,2,3,4
10    | 1,1,1,2,2,3,4,5,7,9
12    | 1,1,1,2,2,3,4,5,7,9,12,16

Regeln:


2
14(0-indiziert) wird als Ausgabe angezeigt, 28während ich glaube, dass es ergeben sollte37
Jonathan Allan

@ JonathanAllan ja, du bist richtig. Ich habe die letzten beiden Testfälle für das te Semester behoben, aber nicht für dieses. Der Beitrag wurde bearbeitet. N
Tau

@ LuisMendo Ich glaube schon. Ich werde den Beitrag bearbeiten.
Tau

1
@sharur Diese Definition für die Fibonacci-Sequenz ist die visuelle Definition. Jedes aufeinanderfolgende hinzugefügte Quadrat hat eine Länge dieses Terms in der Sequenz. Die Sequenz, die Sie beschreiben, ist die numerische Begründung dahinter. Beide Sequenzen funktionieren genauso gut wie die andere.
Tau

1
Beachten Sie, dass die von Ihnen verknüpfte OEIS-Sequenz etwas anders ist, da sie verwendet wird a_0=1, a_1=0, a_2=0. Es verschiebt sich ein bisschen, weil danna_5=a_6=a_7=1
Carmeister

Antworten:


59

Gelee , 10 Bytes

9s3’Ẓæ*³FṀ

Probieren Sie es online!

1-indiziert. Berechnet das größte Element von: wobei die binäre Matrix wie folgt berechnet wird:

[001101010]n
[isprime(0)isprime(1)isprime(2)isprime(3)isprime(4)isprime(5)isprime(6)isprime(7)isprime(8)]

(Dies ist ein totaler Zufall.)

9s3         [[1,2,3],[4,5,6],[7,8,9]]    9 split 3
   ’        [[0,1,2],[3,4,5],[6,7,8]]    decrease
    Ẓ       [[0,0,1],[1,0,1],[0,1,0]]    isprime
     æ*³    [[0,0,1],[1,0,1],[0,1,0]]^n  matrix power by input
        FṀ                               flatten, maximum

33
Dies ist eindeutig eine Art von Voodoo
Pureferret

7
Dies sollte veröffentlicht werden.
YSC

6
@YSC Es wurde bereits in A000931 veröffentlicht . Ich hätte nie
gedacht,

1
... machen Sie das "es sei denn, jemand kann zwei Bytes von diesem Golf" :) (jetzt, wo ich ein 9-Byte haben )
Jonathan Allan

1
Ich bin es so gewohnt, hier absurd kleine Antworten zu sehen, dass ich dachte, das Komma nach 'Jelly' sei tatsächlich der Code für dieses Problem
Tasos Papastylianou


26

Jelly ,  10 9  8 Bytes

ŻṚm2Jc$S

Eine monadische Linkannahme n(0-indiziert), die ergibt P(n).

Probieren Sie es online!

Wie?

ImplementiertP(n)=i=0n2(i+1n2i)

ŻṚm2Jc$S - Link: integer, n       e.g. 20
Ż        - zero range                  [0, 1, 2, 3, 4, ..., 19, 20]
 Ṛ       - reverse                     [20, 19, ..., 4, 3, 2, 1, 0]
  m2     - modulo-slice with 2         [20, 18, 16, 14, 12, 10,  8,  6,  4,  2,  0]  <- n-2i
      $  - last two links as a monad:
    J    -   range of length           [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]  <- i+1
     c   -   left-choose-right         [ 0,  0,  0,  0,  0,  0,  0, 28,126, 45,  1]
       S - sum                         200

Und hier ist ein "Twofer"
... eine völlig andere Methode auch für 8 Bytes (diese ist 1-indiziert, aber viel langsamer):

3ḊṗRẎ§ċ‘ - Link: n
3Ḋ       - 3 dequeued = [2,3]
   R     - range = [1,2,3,...,n]
  ṗ      -   Cartesian power         [[[2],[3]],[[2,2],[2,3],[3,2],[3,3]],[[2,2,2],...],...]
    Ẏ    - tighten                   [[2],[3],[2,2],[2,3],[3,2],[3,3],[2,2,2],...]
     §   - sums                      [ 2,  3,   4,    5,    5,    6,     6,...]
       ‘ - increment                 n+1
      ċ  - count occurrences         P(n)

18

Haskell , 26 Bytes

(l!!)
l=1:1:1:2:scanl(+)2l

Probieren Sie es online! Gibt den n-ten Term mit dem Index Null aus.

Ich dachte, dass die "offensichtliche" rekursive Lösung unten unschlagbar wäre, aber dann fand ich das. Es ähnelt dem klassischen Golf-Ausdruck l=1:scanl(+)1lfür die unendliche Fibonacci-Liste, aber hier ist der Unterschied zwischen benachbarten Elementen der Begriff 4 Positionen zurück. Wir können direkter schreiben l=1:1:zipWith(+)l(0:l), aber das ist länger.

Wenn diese Herausforderung eine unendliche Listenausgabe erlaubt, könnten wir die erste Zeile abschneiden und 20 Bytes haben.

27 Bytes

f n|n<3=1|1>0=f(n-2)+f(n-3)

Probieren Sie es online!




6

Oktave / MATLAB, 35 33 Bytes

@(n)[1 filter(1,'cbaa'-98,2:n<5)]

Gibt die ersten n Terme aus.

Probieren Sie es online!

Wie es funktioniert

Anonyme Funktion, die einen rekursiven Filter implementiert .

'cbaa'-98ist eine kürzere Form zu produzieren [1 0 -1 -1].

2:n<5ist eine kürzere zu erzeugende Form [1 1 1 0 0 ··· 0]( n −1 Terme).

filter(1,[1 0 -1 -1],[1 1 1 0 0 ··· 0])leitet die Eingabe [1 1 1 0 0 ··· 0]durch ein zeitdiskretes Filter, das durch eine Übertragungsfunktion mit Zähler- 1und Nennerkoeffizienten definiert ist [1 0 -1 -1].


6

J , 22 Bytes

-2 Bytes dank ngn und Galen

geschlossene Form, 26 Bytes

0.5<.@+1.04535%~1.32472^<:

Probieren Sie es online!

iterativ 22 Bytes

(],1#._2 _3{ ::1])^:[#

Probieren Sie es online!


1
Eine weitere 24-Byte-Lösung (langweilig): (1 # .2 3 $: @ - ~]) `1: @. (3 &>) Probieren Sie es online!
Galen Ivanov

23 Bytes dank ngn 1:-> #: Probieren Sie es online!
Galen Ivanov

@GalenIvanov Tyvm, das ist ein toller Trick.
Jonah

2
1:-> 1. "nachteilig" funktioniert mit einem Nomen auf der rechten Seite, anscheinend
ngn

@ngn Bis ... bis wieder!
Jonah,

5

Retina , 47-42 Bytes

K`0¶1¶0
"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*
6,G`

Probieren Sie es online! Gibt die ersten nTerme in separaten Zeilen aus. Erläuterung:

K`0¶1¶0

Ersetzen Sie die Eingabe durch die Begriffe -2, -1und 0.

"$+"+`.+¶(.+)¶.+$
$&¶$.(*_$1*

Generieren Sie die nächsten nTerme mit der Wiederholungsrelation. *_Hier ist kurz, für $&*_die die (erste) Zahl in der Übereinstimmung in unär konvertiert wird , während $1*kurz ist, für $1*_die die mittlere Zahl in unär konvertiert wird. Der $.(liefert die dezimale Summe seiner unären Argumente, also die Summe der ersten und mittleren Zahlen.

6,G`

Verwerfen Sie die ersten sechs Zeichen, dh die ersten drei Zeilen.


5

Cubix , 20 Bytes

Dies ist 0-indiziert und gibt den N- ten Term aus

;@UOI010+p?/sqq;W.\(

Probieren Sie es online!

Wickelt sich auf einen Würfel mit Seitenlänge 2

    ; @
    U O
I 0 1 0 + p ? /
s q q ; W . \ (
    . .
    . .

Schau es dir an

  • I010 - Initiiert den Stapel
  • +p? - Fügt die Oberseite des Stapels hinzu, zieht den Zähler von der Unterseite des Stapels ab und testet
  • /;UO@ - Wenn der Zähler auf 0 steht, reflektieren Sie auf die Oberseite, entfernen Sie den TOS, wenden Sie ihn, geben Sie ihn aus und halten Sie ihn an
  • \(sqq;W - Wenn der Zähler positiv ist, reflektieren Sie ihn, verringern Sie den Zähler, tauschen Sie die TOS aus, drücken Sie zweimal von oben nach unten, entfernen Sie die TOS und verschieben Sie die Spur zurück in die Hauptschleife.


4

Perl 6 , 24 Bytes

{(1,1,1,*+*+!*...*)[$_]}

Probieren Sie es online!

Eine ziemlich standardmäßige generierte Sequenz, bei der jedes neue Element vom Ausdruck generiert wird * + * + !*. Das fügt das drittvorhergehende Element, das zweitvorhergehende Element und die logische Negation des vorherigen Elements hinzu, die immer Falsenull ist.


Warum ist dieses Community-Wiki?
Jo King

@JoKing schlägt mich. Wenn ich es irgendwie getan habe, war es nicht absichtlich.
Sean

4

05AB1E , 8 Bytes

1Ð)λ£₂₃+

Probieren Sie es online!

Halten Sie mit, ich habe eine Weile nicht mehr Golf gespielt. Ich frage mich , ob es ein kürzerer Ersatz ist für 1Ð)die in diesem Fall funktioniert (ich habe versucht 1D), 3Å1etc. , aber keiner von ihnen speichern Bytes). Gibt die ersten Terme der Sequenz aus. Oder ohne würde es einen unendlichen Strom der Terme der Sequenz ausgeben.n£

Wie?

1Ð)λ£₂₃+ | Full program.
1Ð)      | Initialize the stack with [1, 1, 1].
   λ     | Begin the recursive generation of a list: Starting from some base case,
         | this command generates an infinite list with the pattern function given.
    £    | Flag for λ. Instead of outputting an infinite stream, only print the first n.
     ₂₃+ | Add a(n-2) and a(n-3).

Ich glaube nicht, 1Ð)dass 2 Bytes tbh sein können. Ich kann mir sechs verschiedene 3-Byte-Alternativen vorstellen, aber keine 2- Byte-Alternativen .
Kevin Cruijssen

4

APL (Dyalog Unicode) , 20 - 18 - 17 Byte SBCS

Dieser Code ist 1-indiziert. Es ist die gleiche Anzahl von Bytes, um nElemente der Padovan-Sequenz abzurufen, da Sie die letzten zusätzlichen Elemente löschen müssen. Es ist auch die gleiche Anzahl von Bytes, um eine 0-Indizierung zu erhalten.

Edit: -2 Bytes dank ngn. -1 Byte dank ngn

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

Probieren Sie es online!

Erläuterung

4⌷2(⊢,⍨2⌷+/)⍣⎕×⍳3

  ⍺(. . . .)⍣⎕⍵   This format simply takes the input ⎕ and applies the function
                   inside the brackets (...) to its operands (here marked ⍵ and ⍺).
  2(. . .+/)⍣⎕×⍳3  In this case, our ⍵, the left argument, is the array 1 1 1,
                   where we save our results as the function is repeatedly applied
                   and our ⍺, 2, is our right argument and is immediately applied to +/,
                   so that we have 2+/ which will return the pairwise sums of our array.
       2⌷          We take the second pairwise sum, f(n-2) + f(n-3)
    ⊢,⍨            And add it to the head of our array.
4⌷                 When we've finished adding Padovan numbers to the end of our list,
                   the n-th Padovan number (1-indexed) is the 4th member of that list,
                   and so, we implicitly return that.

4

K (NGN / k) , 24 20 Bytes

-4 Bytes dank ngn!

{$[x<3;1;+/o'x-2 3]}

Probieren Sie es online!

0-indiziert, erste N Terme


1
f[x-2]+f[x-3]-> +/o'x-2 3( oist "wiederkehrend")
ngn

@ngn Danke! Ich habe es versucht (ohne Erfolg) in J; Hier ist es elegant.
Galen Ivanov

@ngn In der Tat ist hier eine Möglichkeit, wie es in J aussieht: (1 # .2 3 $: @ - ~]) `1: @. (3 &>)
Galen Ivanov

Ah, richtig, Basis-1-Dekodierung ist eine
zugfreundliche

2
1:-> #in der j-lösung
ngn

4

x86-32-Bit-Computercode, 17 Byte

53 33 db f7 e3 43 83 c1 04 03 d8 93 92 e2 fa 5b c3

Demontage:

00CE1250 53                   push        ebx  
00CE1251 33 DB                xor         ebx,ebx  
00CE1253 F7 E3                mul         eax,ebx  
00CE1255 43                   inc         ebx  
00CE1256 83 C1 04             add         ecx,4  
00CE1259 03 D8                add         ebx,eax  
00CE125B 93                   xchg        eax,ebx  
00CE125C 92                   xchg        eax,edx  
00CE125D E2 FA                loop        myloop (0CE1259h)  
00CE125F 5B                   pop         ebx  
00CE1260 C3                   ret

Es ist 0-indiziert. Die Initialisierung wird bequem durch Berechnen von eax * 0 erreicht. Das 128-Bit-Ergebnis ist 0 und geht in edx: eax.

Zu Beginn jeder Iteration lautet die Reihenfolge der Register ebx, eax, edx. Ich musste die richtige Reihenfolge wählen, um die Kodierung für den xchg eaxBefehl zu nutzen - 1 Byte.

Ich musste dem Schleifenzähler 4 hinzufügen, damit der Ausgang erreicht wird eax, der den Rückgabewert der Funktion in der fastcallKonvention enthält.

Ich könnte eine andere Aufrufkonvention verwenden, die kein Speichern und Wiederherstellen erfordert ebx, aber fastcalltrotzdem Spaß macht :)


2
Ich mag es, Maschinencode-Antworten auf PP & CG zu sehen! +1
Tau


3

Lua 5.3,49 48 Bytes

function f(n)return n<4 and 1or f(n-2)+f(n-3)end

Probieren Sie es online!

Vanilla Lua hat keine Nötigung von Booleschen Werten zu Zeichenfolgen (sogar zu tonumber(true)Rückgaben nil), daher müssen Sie einen pseudo-ternären Operator verwenden. Diese Version ist wie alle Lua 1-indiziert. Das 1orTeil muss 1 orin Lua 5.1 geändert werden , das eine andere Art hat, Zahlen zu lexieren.



3

JavaScript (ES6), 23 Byte

a(0)=a(1)=a(2)=1

N

f=n=>n<3||f(n-2)+f(n-3)

Probieren Sie es online!


Ich denke nicht, dass es vernünftig ist zu sagen, dass das Zurückgeben truedasselbe ist wie das Zurückgeben, 1wenn der Rest der Ausgabe Zahlen sind.
Nit

2
@Nit Relevanter Metapost .
Arnauld

Ich denke, Ihnen fehlen einige Voraussetzungen: Schauen Sie sich hier meine Modifikation (Version in Java) an .
Shaq

@Shaq Die Herausforderung gibt eindeutig an, dass die ersten drei Terme der Sequenz alle 1 sind . Es ist also nicht die in A000931 definierte Sequenz (aber die Formel ist dieselbe).
Arnauld

@ Arnauld yep Ich kann es jetzt sehen. Es tut uns leid!
Shaq


2

TI-BASIC (TI-84), 34 Byte

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1

N

Eingang ist in Ans.
Die Ausgabe erfolgt in Ansund wird automatisch ausgedruckt.

Ich nahm an, dass genug Zeit vergangen war und mehrere Antworten gepostet worden waren, von denen es viele gab, die diese Antwort übertroffen hatten.

Beispiel:

0
               0
prgmCDGFD
               1
9
               9
prgmCDGFD
               9
16
              16
prgmCDGFD
              65

Erläuterung:

[[0,1,0][0,0,1][1,1,0]]^(Ans+5:Ans(1,1      ;full program (example input: 6)

[[0,1,0][0,0,1][1,1,0]]                     ;generate the following matrix:
                                            ; [0 1 0]
                                            ; [0 0 1]
                                            ; [1 1 0]
                       ^(Ans+5              ;then raise it to the power of: input + 5
                                            ; [4  7 5]
                                            ; [5  9 7]
                                            ; [7 12 9]
                               Ans(1,1      ;get the top-left index and leave it in "Ans"
                                            ;implicitly print Ans

2

Pyth, 16 Bytes

L?<b3!b+y-b2y-b3

Dies definiert die Funktion y. Probieren Sie es hier aus!

Hier ist eine Lösung, die mehr Spaß macht, obwohl sie 9 Byte länger ist. Bytes könnten allerdings rasiert werden.

+l{sa.pMf.Am&>d2%d2T./QY!

Dies verwendet die Definition von David Callan auf der OEIS-Seite: "a (n) = Anzahl der Kompositionen von n in ungerade Teile und> = 3." Probieren Sie es hier aus! Es werden Eingaben direkt übernommen, anstatt eine Funktion zu definieren.


y-b2y-b3könnte vielleicht entweder mit Gabel oder umgestaltet werden L? Das Deklarieren eines Arrays aus 2 Elementen ist jedoch teuer. yL-Lb2,3ist mehr :(
Ven

@Ven konnte ich ersetzen +y-b2y-b3mit smy-bdhB2die die gleiche Menge von Bytes; hB2ergibt das Array[2, 3]
RK.

Gut gemacht am hB2. Schade, dass es die gleiche Byteanzahl ist.
Ven

Ja, obwohl ich mich frage, ob es eine Möglichkeit gibt, das din der Karte loszuwerden .
RK.

2

Java, 41 Bytes

Lambda kann nicht verwendet werden (Laufzeitfehler). Port dieser Javascript-Antwort

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

TIO


Ich denke, Ihnen fehlen einige Voraussetzungen: Sehen Sie sich hier meine Modifikation an .
Shaq

Bitte ignorieren Sie Shaqs Kommentar: Ihre Antwort ist korrekt und die kürzestmögliche Java-Antwort (ab Java 12).
Olivier Grégoire

OK dann. Ich bin mir nicht sicher, was ich "vermisst" habe, aber ok. Edit: nvm Ich habe die JS-Antwort gelesen.
Benjamin Urquhart






Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.