Monday Mini-Golf: Une série de courts défis de golf à code , affichés (espérons-le!) Tous les lundis.
Une séquence de type Fibonacci est obtenue en utilisant la même méthode que la célèbre séquence de Fibonacci ; c'est-à-dire que chaque nombre F (n) est trouvé en ajoutant les deux nombres précédents dans la séquence ( F (n) = F (n-1) + F (n-2) ), ou en soustrayant les deux nombres suivants ( F (n) = F (n + 2) - F (n + 1) ). La principale différence est que ces séquences peuvent commencer par deux nombres quelconques. L'indexation zéro de ces séquences est contestable, mais pour l'instant, nous allons utiliser cette règle:
- Le 0ème nombre dans une séquence de type Fibonacci est le dernier nombre qui est plus petit que le nombre précédent.
À titre d'exemple, la séquence de Fibonacci pourrait être écrite ainsi 1, 0, 1, 1, 2, 3, 5...
, donc le 0ème numéro de la séquence est le seul 0
.
Défi
L'objectif du défi est d'écrire un programme ou une fonction qui accepte trois entiers, dans n'importe quel format:
- A et B , les deux nombres avec lesquels commencer à générer une séquence.
- N , la longueur de la séquence résultante à émettre.
Et sort les N premiers nombres de la séquence, en commençant au 0e.
Détails
- A , B et N peuvent être pris dans n'importe quel ordre et format, tant qu'ils sont visiblement séparés. Si vous utilisez un ordre / format différent, veuillez préciser de quoi il s'agit.
- Vous pouvez supposer que A , B et N sont toujours des entiers positifs.
- Vous pouvez supposer que N n'est pas supérieur à 100 et que la séquence résultante ne contiendra pas
x >= 2^31
. - Si A est plus grand que B , alors B est le numéro 0 de la séquence.
- La sortie doit être séparée par des espaces, des virgules et / ou des retours à la ligne.
- Un espace de fin ou une nouvelle ligne est autorisé, mais pas une virgule de fin.
Cas de test
Exemple 1:
8 13 10
En travaillant en arrière 8 13
jusqu'à ce que nous trouvions un nombre plus grand que le précédent, nous obtenons 13 8 5 3 2 1 1 0 1
. Ainsi, 0
est le 0e nombre dans cette séquence. À partir de là, nous imprimons 0
et les 9 membres suivants:
0 1 1 2 3 5 8 13 21 34
Exemple 2:
23 37 5
Encore une fois en arrière pour trouver le numéro 0, nous trouvons 37 23 14 9 5 4 1 3
. Le 0ème numéro est cette fois 1
, donc nous l'imprimons avec les 4 membres suivants:
1 4 5 9 14
Exemple 3:
4 3 8
Avec celui-ci, nous n'avons pas besoin de travailler en arrière pour trouver le numéro 0, car il 3
est plus petit que 4
:
3 7 10 17 27 44 71 115
Exemple 4:
29 47 11
Résultat:
1 3 4 7 11 18 29 47 76 123 199
Notation
Il s'agit de code-golf , donc le code valide le plus court en octets l'emporte. Tiebreaker revient à une soumission publiée plus tôt. Le gagnant sera choisi lundi 28 septembre prochain. Bonne chance!
Edit: Félicitations à votre gagnant, @Jakube, en utilisant Pyth pour un incroyable 23 octets!
[8, 13, 10]
)?Réponses:
Pyth, 23 octets
Essayez-le en ligne: démonstration ou suite de tests
Style assez inhabituel de programmation Pyth. Parfois, la programmation fonctionnelle a ses inconvénients.
Explication:
la source
Rétine ,
6554 octetsIci,
<empty>
représente une ligne de fin vide. Exécutez le code en tant que fichier unique avec l'-s
indicateur.Le format d'entrée est
où les nombres sont représentés en unaire . La sortie est une liste séparée par des virgules, également en unaire. Par exemple:
serait
et rendement
Explication
Tout d'abord, nous réduisons
A
etB
au 0ème et -1ème élément. Le+
dit à Retina de continuer à répéter cette substitution d'expression régulière jusqu'à ce que l'expression régulière cesse de correspondre ou que la substitution ne modifie pas la chaîne. Le regex captureA
dans le groupe 1 avec(1*)
, puis s'assure qu'ilB
est au moins aussi grand queA
lors de la captureB-A
avec\1(1*)
dans le groupe 2. Cela garantit que cette boucle se termine une foisA>B
.La substitution se transforme simplement
A,B
enB-A,A
définissant la correspondance sur$2,$1
.Maintenant, nous avons déjà le premier numéro de la sortie requise dans la chaîne (ainsi que celui précédent, dont nous devrons nous débarrasser plus tard). Cette substitution ajoute maintenant un autre nombre comme la somme des deux derniers nombres tout en prenant un
1
deN
. Parce que nous avons déjà un numéro, nous voulons que cela se produise uniquementN-1
. Nous faisons cela en veillant à ce\B
qu'il y ait encore au moins;11
à la fin de la chaîne. Si nous appelons les deux dernières valeurs de la séquenceC
etD
, alors l'expression rationnelle captureC
dans le groupe 1 et,D
dans le groupe deux. Nous les réécrivons avec$1$2
. Ensuite, nous écrivons également$2$1
ce qui se traduit par,D+C
. Notez que nous ne réécrivons pas le single1
dans lequel nous avons fait correspondreN
, le décrémentant ainsi.Enfin, il faut se débarrasser de l' élément -1er de la séquence, ainsi les restes
;1
deN
, que nous faisons tout simplement en faisant correspondre soit de ceux -ci et de le remplacer par la chaîne vide.la source
Python 2,
9387676160 octetsObtient l'entrée (sous forme de liste python littérale
[8,10,13]
)Élabore le 0e mandat
Imprime ensuite la séquence des ajouts jusqu'à ce que la longueur soit atteinte
la source
for _ in[1]*l:
, c'est un peu plus court à faireexec"stuff;"*l
for _ in[1]*l:stuff
avecexec"stuff;"*l
. @xnor n'a pas mis la partie stuff dans la boucle for. Oufor _ in[1]*l:
jusqu'àexec";"*l
j>=i
parj/i
. Je viens de découvrir ça! (Parce que vous pouvez supposer que A, B et N sont toujours des entiers positifs )CJam,
2623 octetsMerci à Dennis d'avoir économisé 3 octets.
Prend les entrées dans l'ordre
N B A
(séparées par tout type d'espace blanc). Imprime le résultat sous forme de liste séparée par des sauts de ligne et se termine par une erreur .Testez-le ici.
Explication
Cela va encore plus loin lors de la recherche du 0ème élément. Autrement dit, il se termine une fois que l'une des valeurs est négative.
la source
q~{_@\-_g)}g\@{_@+_p}*t
(N B A
) enregistre trois octets.B>A
il faut vérifierB not smaller than A
ou quelque chose, mais je ne peux pas comprendre comment le faire dans CJam. EDIT: la solution de Dennis imprime la sortie correcte.<!
place de>
.!
dans tout ça. J'en ai simplement ajouté un pour le faire fonctionner;)Labyrinthe ,
5854494644 octetsMerci à Sp3000 d'avoir suggéré l'utilisation de la négation au niveau du bit, ce qui a permis d'économiser deux octets.
Le format d'entrée est
B A N
. Le résultat est une liste séparée par des sauts de ligne.Explication
(Légèrement dépassé. L'idée de base est toujours la même, mais la disposition du code est différente maintenant.)
Cela utilise la même idée que ma réponse CJam (donc les crédits vont toujours à Dennis): lors du retour en arrière de la séquence, nous ne nous arrêtons pas jusqu'à ce que nous obtenions une valeur négative (ce qui nous laisse avec les éléments -1er et -2nd de la séquence). Ensuite, nous commençons à les ajouter avant d' imprimer la première valeur.
Cela utilise quelques astuces de golf astucieuses dans le Labyrinthe. Passons en revue le code dans les sections:
L'IP commence à
?
droite (qui litA
). Sur le"
(un no-op), il frappe une impasse, donc il se retourne, exécutant à?
nouveau (lectureB
). Enfin,}
passeB
à la pile auxiliaire. L'impasse sauve un octet sur les naïfsMaintenant la boucle qui trouve le début de la séquence:
Le
)(
(incrément-décrément) est un no-op, mais il est nécessaire de s'assurer que le haut de la pile est positif sur la jonction (de sorte que l'IP tourne vers l'est).:
doublonsA
,{
se déplaceB
Retour à la pile principale,-
calculeA-B
. Ce que nous voulons vraimentB-A
, c'est que`
la valeur est annulée.Il s'agit maintenant d'une jonction à quatre voies. Pour les résultats négatifs, l'IP prend un virage à gauche vers le
?
, lisantN
et se déplaçant vers la partie suivante du programme. Si le résultat est nul, l'IP continue de se déplacer vers le sud, prend un virage dans le coin et reste dans la boucle. Si le résultat est positif, l'IP prend un virage à droite (ouest), tourne dans le coin et prend un autre virage à droite (ouest à nouveau) afin qu'il reste également dans la boucle. Je pense que cela pourrait devenir un modèle courant pour distinguer les valeurs négatives des valeurs non négatives (ou positives des valeurs non positives):Au moins, je n'ai pas encore pu trouver une disposition plus compacte / utile pour ce cas.
Quoi qu'il en soit, alors qu'elle
A
n'est pas négative, la boucle continue,}
se déplaceA
vers la pile auxiliaire et=
échangeA
etB
.Une fois
A
est négatif,?
litN
et nous entrons dans la deuxième boucle:Nous savons que
N
c'est positif, nous pouvons donc compter sur l'IP en tournant à gauche (nord). Le corps de la boucle est maintenant simplement:En mots: se déplace à la fois
N
etA
sur la pile auxiliaire. DupliquezB
, échangez la copie avecA
et ajoutezA
à l'autre copie deB
. Dupliquez-le à nouveau pour imprimer la valeur actuelle deB
. Imprimez une nouvelle ligne. DéplacerB
etN
revenir à la pile principale et décrémenterN
.Bien que
N
positif, l'IP prendra un virage à droite (nord) en continuant la boucle. Une fois qu'ilN
atteint zéro, le code se termine de manière plutôt fantaisiste:L'IP continue d'avancer tout droit (ouest). Le
?
tente de lire un autre entier, mais nous avons déjà atteint EOF, il pousse donc à la0
place.`
essaie de nier cela, mais c'est toujours zéro. Ainsi, l'IP se déplace toujours vers l'ouest, prend un virage dans le coin, puis continue de se déplacer vers le bas sur le@
qui termine le programme.Je me demande si je pourrais placer le
@
dans une position encore moins chère (il coûte actuellement 3 espaces blancs) en transformant les trois"
autour du`
no-op composé (comme)(
), mais je n'ai pas encore pu faire fonctionner cela.la source
C,
105102100 octetsMerci à @ C0deH4cker d'avoir joué au golf sur 2 octets!
Essayez-le en ligne sur Ideone .
la source
Matlab / Octave, 115
125bytesLa fonction doit être appelée comme
f([8 13],10)
.Exemple (Matlab):
Ou essayez-le en ligne (Octave) .
la source
f([a b],n)
devrait être autorisé.x=f(x,n)
dans l'en-tête de la fonction ça compte ...Haskell,
67 6556 octetsMerci à @nimi pour ses suggestions
Ceci définit une fonction d'infixation ternaire
%
, qui est invoquée au format(n%a)b
, par exemple:Explication
La fonction de infix binaire
#
, définie sur la première ligne, prend en deux entiersa
etb
et renvoie l'infini séquence de type Fibonacci oùa
etb
se produit comme éléments consécutifs.La fonction
%
prend simplement les premiersn
éléments dea#b
.la source
let f=a:scanl(+)(a+b)f in f
(-> full#
:a#b|a>b=let f=a:scanl(+)(a+b)f in f|1>0=(b-a)#a
et enregistrer deux octets.> <>,
3331 + 1 pour -v = 32 octetsL'entrée doit être poussée sur la pile en utilisant -v car l'analyse des nombres décimaux n'est pas triviale dans> <>.
Explication:
Je représenterai la pile après chaque (groupe de) opération. Il commence par [F (n), F (n + 1), N]
Les premières lignes descendent la série jusqu'à son 0ème terme:
La deuxième ligne monte la série jusqu'à ce qu'elle ait imprimé N termes:
la source
00.
sur la première ligne en&
. Théoriquement, cela!
devrait fonctionner mais je pense que> <> remplit la largeur des lignes pour correspondre à la largeur de la plus longue (modifier: c'est pourquoi je pense que vous en aviez00.
en premier lieu).!
ou?
(à la fin de la ligne) s'il est sur la ligne la plus longue. Vous pouvez l'essayer avec quelque chose comme1n!
et ça va faire une erreur, mais s'il y a une ligne en dessous avec quelque chose de plus long que ça, commelorumipsum
ça ne le sera pas.Java,
1137876 octetsNous remercions ETHproduction d'avoir fourni l'algorithme que j'utilise dans cette réponse.
Essayez ici .
Explication:
Approche originale,
11393 octetsSemble plus golfique;)
Essayez-le ici .
Explication:
la source
b=b-a
àb-=a
, et la même chose aveca=b+a
. Il économisera 2 octetsJavascript (ES6),
837363 octetsCela aurait pu être joué au maximum. Nous verrons.
Non golfé:
la source
Mathematica 112
Va-t-il finir par jouer au golf
la source
CJam, 40 octets
Pas de bébé. Il s'agit de mon premier programme CJam, donc je suis fier que cela fonctionne.
Il prend la saisie sous la même forme que dans les exemples.
J'ai maintenant vu que je pouvais le réduire à 33 octets en utilisant la
{ ... }*
construction.Et je pourrais même le réduire d'une unité de plus en utilisant l'opérateur ternaire pour nettoyer la pile et produire une erreur.
la source
Rubis, 141 octets
Exécution
La fonction f produit la sortie souhaitée, les noms d'arguments correspondent aux noms de variables de la question
Rien d'intelligent:
la source
Mathematica, 59 octets
la source
Rubis,
817573Raccourci de 6 octets lors du remplacement de for-loop par range.map
Enregistré encore 2 octets en déplaçant l'instruction d'impression
la source
Pyke, 24 octets (non concurrent)
Essayez-le ici!
la source
Gelée , 14 octets
Essayez-le en ligne!
la source
Lisp commun, 91 octets
Essayez-le en ligne!
la source