introduction
Bien sûr, nous avons beaucoup de défis de séquence , alors voici un autre.
La séquence de Kimberling ( A007063 ) se présente comme suit:
1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28, 22, ...
Ceci est produit en mélangeant l'itération normale:
[1] 2 3 4 5 6 7 8
Le premier terme de la séquence est 1
. Après cela, nous remanions la séquence jusqu'à ce que tous les termes à gauche soient utilisés. Le mélange a le motif right - left - right - left - ...
. Puisqu'il n'y a pas de termes à gauche de la 1
, il n'y a pas de mélange. Nous obtenons ce qui suit:
2 [3] 4 5 6 7 8 9
À la i ème itération, nous jetons le i ème élément et le mettons dans notre séquence. Ceci est la 2ème itération, nous jetons donc le 2ème élément. La séquence devient: 1, 3
. Pour notre prochaine itération, nous allons mélanger l'itération actuelle avec le modèle ci-dessus. Nous prenons le premier article inutilisé à droite du i ème article. Cela se trouve être 4
. Nous ajouterons ceci à notre nouvelle itération:
4
Nous allons maintenant prendre le premier élément inutilisé à gauche du i ème élément. C'est ça 2
. Nous ajouterons ceci à notre nouvelle itération:
4 2
Puisqu'il ne reste aucun élément à gauche du i ème élément, nous allons simplement ajouter le reste de la séquence à la nouvelle itération:
4 2 [5] 6 7 8 9 10 11 ...
Ceci est notre 3ème itération, nous allons donc jeter le 3ème élément, qui est 5
. Ceci est le troisième élément de notre séquence:
1, 3, 5
Pour obtenir la prochaine itération, répétez simplement le processus. J'ai fait un gif si ce n'est pas clair:
Le gif m'a pris plus de temps que d'écrire le message
Tâche
- Étant donné un entier non négatif n , sortez les n premiers termes de la séquence
- Vous pouvez fournir une fonction ou un programme
- C'est du code-golf , donc la soumission avec le moins d'octets gagne!
Cas de test:
Input: 4
Output: 1, 3, 5, 4
Input: 8
Output: 1, 3, 5, 4, 10, 7, 15, 8
Input: 15
Output: 1, 3, 5, 4, 10, 7, 15, 8, 20, 9, 18, 24, 31, 14, 28
Remarque: les virgules dans la sortie ne sont pas nécessaires. Vous pouvez par exemple utiliser des sauts de ligne, ou afficher une liste, etc.
Réponses:
Pyth, 22 octets
Essayez-le en ligne: Démonstration
Effectue simplement la technique de brassage décrite dans le PO.
Explication:
la source
Julia,
7871 octetsIl s'agit d'une fonction sans nom qui accepte un entier et renvoie un tableau d'entiers. Pour l'appeler, affectez-le à une variable.
L'approche ici est la même que celle décrite sur OEIS.
Non golfé:
7 octets économisés grâce à Mauris!
la source
Mathematica 130 octets
Nous commençons par une liste comprenant la plage de
1
à3x
, oùx
est le nombre souhaité de termes de séquence de Kimberling.A chaque étape,
n
,TakeDrop
rompt la liste actuelle dans une liste avant de2n+1
termes (où le travail est effectué) et la liste arrière (qui sera plus tard rejoint la liste avant retravaillé). La première liste correspond au modèle suivant,{t___,z,r___}
où z est le terme de Kimberling au centre de la première liste.r
estRiffle
avec l'inverse det
puis la liste arrière est ajoutée.z
est supprimé et ajouté à (AppendTo
) la séquence de Kimberling croissante.n
est incrémenté de1
et la liste actuelle est traitée par la même fonction viaNest.
Exemple
la source
Python 2, 76 octets
Explication
C'est la formule OEIS après de nombreuses transformations golfiques! Cela a fonctionné magnifiquement . Le code d'origine était
Je me suis d'abord débarrassé de
i
, en le remplaçant para+1
partout et en développant les expressions:Ensuite, récrit
b<2*a-1
comme-~b<2*a
pour sauver un octet d'espaces, et déplacé le+1
dans la sélection, la division par 2, et la négation:Alors,
-b-1
c'est juste~b
, alors on peut écrire(b,~b)[b%2]
. Cela équivaut àb^0 if b%2 else b^-1
utiliser l'opérateur XOR, ou à défautb^b%-2
.la source
Pyth,
2925 octetsJakube a enregistré 4 octets, mais je ne sais plus comment lire le code.
Voici l'ancienne solution:
Traduction de ma réponse Python. Je ne suis pas très bon en Pyth, alors peut-être qu'il y a encore des moyens de raccourcir cela.
la source
.W
le golf de 4 octets:VQ+.W<hHyN-~tN/x%Z_2Z2hNN
..W
a la forme:.W<condition><apply><start-value>
. J'ai utilisé la valeur de départhN
, comme vous l'avez fait dansKhN
..W
change cette valeur tant que le<condition>
est vrai. J'ai utilisé la même condition que toi<hHyN
. La condition est une fonction lambda avec le paramètreH
, donc la valeur actuelle (dans votre codeK
) estH
. Et j'ai également utilisé la même<apply>
instruction que vous, je l'ai seulement remplacéeK
parZ
, car l'<apply>
instruction est une fonction lambda avec paramètreZ
. Nous pouvons ignorer le=K
,.W
gère cela. Il remplace l'ancienne valeur par celle calculée. À la fin de l'impression+...N
APL,
5644 octetsIl s'agit d'un train monadique sans nom qui accepte un entier à droite et renvoie un tableau. C'est à peu près la même approche que ma réponse Julia .
La fonction la plus interne est une fonction dyadique récursive qui renvoie le n ème terme dans la séquence de Kimberling, donné n comme arguments identiques à gauche et à droite.
Avec cela en main, nous pouvons obtenir des termes individuels de la séquence. Cependant, le problème devient alors qu'il s'agit d'une fonction dyadique , ce qui signifie qu'elle nécessite des arguments des deux côtés. Entrez l'
⍨
opérateur! Étant donné une fonctionf
et une entréex
,f⍨x
est identique àx f x
. Donc dans notre cas, en faisant référence à la fonction susmentionnéef
, nous pouvons construire le train monadique suivant:Nous appliquons
f
à chaque entier de 1 à l'entrée, ce qui donne un tableau.Enregistré 12 octets grâce à Dennis!
la source