Patience, jeune "Padovan"


44

Tout le monde connaît la séquence de Fibonacci:
vous prenez un carré, vous y attachez un carré égal, puis vous attachez plusieurs fois un carré dont la longueur du côté est égale à la plus grande longueur du rectangle obtenu.
Le résultat est une belle spirale de carrés dont la suite de nombres est la suite de Fibonacci :

Mais si nous ne voulions pas utiliser de carrés?

Si nous utilisons les triangles équilatéraux - au lieu de carrés - de la même manière, nous obtenons une spirale de triangles tout aussi belle et une nouvelle séquence: la séquence de Padovan , alias A000931 :

Tâche:

Étant donné un entier positif, , la sortie , le ème terme de la séquence de Padoue OU les premiers termes.NaNNN

Supposons que les trois premiers termes de la séquence sont tous égaux à . Ainsi, la séquence commencera comme suit: 1

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

Contribution:

  • Tout entier positifN0

  • Une entrée invalide ne doit pas être prise en compte

Sortie:

  • Le ième terme de la suite Padovan OU les premiers termes de la séquence Padovan.NNN

  • Si les premiers termes sont imprimés, la sortie peut être celle qui convient (liste / tableau, chaîne multiligne, etc.)N

  • Peut être soit indexé ou indexé01

Cas de test:
(indexé 0, ème terme)N

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

(1 indexé, premiers termes)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

Règles:


2
14(0-indexé) est affiché en sortie 28alors que je crois que cela devrait céder37
Jonathan Allan

@ JonathanAllan oui, vous avez raison. J'ai corrigé les deux derniers cas tests pour le e trimestre mais pas celui-là. Le message a été édité. N
Tau

@ LuisMendo Je crois que oui. Je vais éditer le post.
Tau

1
@sharur cette définition de la séquence de Fibonacci est la définition visuelle . Chaque carré successif ajouté a une longueur de ce terme dans la séquence. La séquence que vous décrivez est le raisonnement numérique qui la sous-tend. Les deux séquences fonctionnent aussi bien que l'autre.
Tau

1
Notez que la séquence OEIS que vous avez liée est légèrement différente, car elle utilise a_0=1, a_1=0, a_2=0. Il finit par être décalé un peu parce a_5=a_6=a_7=1
qu'alors

Réponses:


59

Gelée , 10 octets

9s3’Ẓæ*³FṀ

Essayez-le en ligne!

1 indexé. Calcule le plus grand élément de: où la matrice binaire est commodément calculée comme :

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

(Ceci est une coïncidence totale.)

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
c'est clairement une sorte de vaudou
Pureferret

7
Cela devrait être publié.
YSC

6
@YSC Il a déjà été publié dans A000931 . Je ne l' aurais jamais deviner le truc de nombres premiers :)
flawr

1
... faites cela "à moins que quelqu'un ne puisse jouer au golf deux octets plus loin que celui-ci" :) (maintenant que j'ai un 9 octets )
Jonathan Allan

1
Je suis tellement habitué à voir des réponses absurdement petites ici, que je pensais que la virgule après «Jelly» était en fait le code de ce problème
Tasos Papastylianou


26

Gelée ,  10 9  8 octets

ŻṚm2Jc$S

Un lien monadique acceptant n(indexé sur 0) qui cède P(n).

Essayez-le en ligne!

Comment?

ImplémenteP(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

Et voici un "twofer"
... une méthode totalement différente également pour 8 octets (celui-ci est indexé sur 1, mais beaucoup plus lent):

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 octets

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

Essayez-le en ligne! Affiche le nième terme indexé à zéro.

Je pensais que la solution "évidente" récursive ci-dessous serait imbattable, mais ensuite j'ai trouvé ceci. Cela ressemble à l'expression classique de Golfy l=1:scanl(+)1lpour la liste infinie de Fibonacci, mais ici la différence entre les éléments adjacents est le terme 4 positions en arrière. Nous pouvons écrire plus directement l=1:1:zipWith(+)l(0:l), mais c'est plus long.

Si ce défi permettait la sortie d'une liste infinie, nous pourrions couper la première ligne et avoir 20 octets.

27 octets

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

Essayez-le en ligne!




6

Octave / MATLAB, 35 33 octets

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

Affiche les n premiers termes.

Essayez-le en ligne!

Comment ça marche

Fonction anonyme qui implémente un filtre récursif .

'cbaa'-98est une forme plus courte à produire [1 0 -1 -1].

2:n<5est une forme plus courte à produire [1 1 1 0 0 ··· 0]( n −1 termes).

filter(1,[1 0 -1 -1],[1 1 1 0 0 ··· 0])passe l'entrée à [1 1 1 0 0 ··· 0]travers un filtre à temps discret défini par une fonction de transfert avec coefficient de numérateur 1et coefficient de dénominateur [1 0 -1 -1].


6

J , 22 octets

-2 octets grâce à ngn et Galen

formulaire fermé, 26 octets

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

Essayez-le en ligne!

itératif, 22 octets

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

Essayez-le en ligne!


1
Une autre solution de 24 octets (ennuyeux): (1 # .2 3 $: @ - ~]) `1: @. (3 &>) Essayez-le en ligne!
Galen Ivanov Le

23 octets grâce à ngn 1:-> #: Essayez-le en ligne!
Galen Ivanov

@GalenIvanov tyvm, c'est un bon truc.
Jonah

2
1:-> 1. "adverse" fonctionne avec un nom à droite, apparemment
ngn

@ngn TIL ... encore une fois!
Jonah

5

Retina , 47 42 bytes

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

Essayez-le en ligne! Affiche les premiers ntermes sur des lignes séparées. Explication:

K`0¶1¶0

Remplacez l'entrée par les termes pour -2, -1et 0.

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

Générez les ntermes suivants à l'aide de la relation de récurrence. *_voici short pour $&*_lequel convertit le (premier) chiffre du match en unaire, alors que $1*short est utilisé pour $1*_convertir le nombre du milieu en unaire. Le $.(renvoie la somme décimale de ses arguments unaires, c'est-à-dire la somme des premier et deuxième nombres.

6,G`

Jeter les six premiers caractères, c’est-à-dire les trois premières lignes.


5

Cubix , 20 octets

Ceci est 0 indexé et sort le N ème terme

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

Essayez-le en ligne!

S'enroule sur un cube de côté 2

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

Regarde le courir

  • I010 - Initie la pile
  • +p? - Ajoute le haut de la pile, tire le compteur du bas de la pile et teste
  • /;UO@ - Si le compteur est 0, réfléchissez sur la face supérieure, supprimez le TOS, faites demi-tour, sortez et arrêtez
  • \(sqq;W - Si le compteur est positif, réfléchissez, décrémentez le compteur, échangez le TOS, appuyez deux fois de haut en bas, supprimez le TOS et replacez la voie dans la boucle principale.


4

Perl 6 , 24 octets

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

Essayez-le en ligne!

Une jolie séquence standard générée, avec chaque nouvel élément généré par l'expression * + * + !*. Cela ajoute le troisième élément précédent, le deuxième élément précédent et la négation logique de l'élément précédent, qui est toujours False, numériquement nul.


Pourquoi ce wiki de communauté?
Jo King

@JoKing me bat. Si je l'ai fait d'une manière ou d'une autre, ce n'était pas fait exprès.
Sean

4

05AB1E , 8 octets

1Ð)λ£₂₃+

Essayez-le en ligne!

Ours avec moi, je n'ai pas joué au golf depuis un moment. Je me demande s’il existe un substitut plus court 1Ð)qui fonctionne dans ce cas (j’ai essayé 1D), 3Å1etc., mais aucun d’entre eux ne sauvegarde des octets). Affiche les premiers termes de la séquence. Ou, sans le , cela produirait un flux infini de termes de la séquence.n£

Comment?

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

Je ne pense pas que ce 1Ð)soit 2 octets tbh. Je peux penser à six alternatives différentes de 3 octets , mais pas de 2 octets.
Kevin Cruijssen le

4

APL (Dyalog Unicode) , 20 18 17 octets SBCS

Ce code est indexé 1. C'est le même nombre d'octets pour obtenir les néléments de la séquence Padovan, car vous devez supprimer les derniers membres supplémentaires. C'est également le même nombre d'octets pour obtenir l'indexation 0.

Edit: -2 octets grâce à ngn. -1 octet grâce à ngn

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

Essayez-le en ligne!

Explication

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 octets

-4 octets grâce à ngn!

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

Essayez-le en ligne!

0 indexé, premiers N termes


1
f[x-2]+f[x-3]-> +/o'x-2 3( oest "se reproduit")
ngn

@ngn Merci! Je l'ai essayé (sans succès) en J; c'est élégant ici.
Galen Ivanov

@ngn En fait, voici comment il se présente dans J: (1 # .2 3 $: @ - ~]) `1: @. (3 &>)
Galen Ivanov

ah, à droite, le décodage en base-1 est une façon de résumer facile pour le train :)
ngn

2
1:-> #dans la solution j
ngn

4

Code machine x86 32 bits, 17 octets

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

Démontage:

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

Il est indexé par 0. L’initialisation est obtenue de manière commode en calculant eax * 0. Le résultat de 128 bits est 0 et le résultat est edx: eax.

Au début de chaque itération, l'ordre des registres est ebx, eax, edx. Je devais choisir le bon ordre pour tirer parti du codage de l' xchg eaxinstruction - 1 octet.

J'ai dû ajouter 4 au compteur de boucle afin de laisser la sortie atteindre eax, qui contient la valeur de retour de la fonction dans la fastcallconvention.

Je pourrais utiliser une autre convention d'appel, qui n'exige ni sauvegarde ni restauration ebx, mais qui fastcallest amusante quand même :)


2
J'aime voir les réponses de code machine sur PP & CG! +1
Tau


3

Lua 5.3,49 48 octets

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

Essayez-le en ligne!

Vanilla Lua ne contraint pas les booléens aux chaînes (même les tonumber(true)retours nil), vous devez donc utiliser un opérateur pseudo-ternaire. Cette version est indexée 1, comme l’ensemble de Lua. La 1orpartie doit être changée 1 oren Lua 5.1, ce qui a une manière différente d’exprimer les nombres.



3

JavaScript (ES6), 23 octets

Implémente la définition récursive de A000931 , mais avec , comme spécifié dans le challenge.a(0)=a(1)=a(2)=1

Retourne le ème terme, indexé par 0.N

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

Essayez-le en ligne!


Je ne pense pas qu'il soit raisonnable de dire que le retour truerevient au même que 1si le reste du résultat est en chiffres.
Nit le


Je pense qu'il vous manque certaines exigences: Regardez ma modification (version en Java) ici .
Shaq

@Shaq Le défi spécifie clairement que les trois premiers termes de la séquence sont tous 1 . Donc, ce n'est pas la séquence définie dans A000931 (mais la formule est la même).
Arnauld le

@Arnauld ouais je peux le voir maintenant. Désolé!
Shaq


2

TI-BASIC (TI-84), 34 octets

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

0-indexé ième terme de la suite.N

L'entrée est en Ans.
La sortie est Ansentrée et est automatiquement imprimée.

Je pensais que suffisamment de temps s'était écoulé et que plusieurs réponses avaient été postées, parmi lesquelles de nombreuses autres ont dépassé cette réponse.

Exemple:

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

Explication:

[[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 octets

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

Ceci définit la fonction y. Essayez-le ici!

Voici une solution plus amusante, bien que sa longueur soit de 9 octets. les octets pourraient être rasés cependant.

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

Ceci utilise la définition donnée par David Callan à la page OEIS: "a (n) = nombre de compositions de n en parties impaires et> = 3." Essayez-le ici! Il prend directement les entrées au lieu de définir une fonction.


y-b2y-b3pourrait peut-être être refactored avec soit bifurcate ou L? Bien que déclarer un tableau de 2 éléments soit coûteux. yL-Lb2,3est plus long :(
Ven

@ Ven j'ai pu remplacer +y-b2y-b3avec smy-bdhB2ce qui est la même quantité d'octets; hB2résultats dans le tableau[2, 3]
RK.

Bien fait hB2. Dommage que ce soit le même nombre d'octets.
Ven

Oui, bien que je me demande s'il y a un moyen de se débarrasser de dla carte.
RK.

2

Java, 41 octets

Impossible d'utiliser un lambda (erreur d'exécution). Port de cette réponse Javascript

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

TIO


Je pense qu'il vous manque certaines exigences: regardez ma modification ici .
Shaq

Ne tenez pas compte du commentaire de Shaq: votre réponse est correcte et constitue la réponse la plus courte possible sur Java (à partir de Java 12).
Olivier Grégoire Le

Alors ok. Je ne suis pas sûr de ce que j'ai "manqué" mais ok. Edit: nvm j'ai lu la réponse de JS.
Benjamin Urquhart






En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.