Utilisons les quatre opérations de base, addition +
, multiplication *
, soustraction -
et division /
(flottant, pas entier).
La séquence de Stewie est définie comme suit:
x = [x(1), x(2)] // Two initial numbers (one indexed)
x(3) = x(1) + x(2)
x(4) = x(2) * x(3)
x(5) = x(3) - x(4)
x(6) = x(4) / x(5)
x(7) = x(5) + x(6)
... and so on.
Défi:
Prenez deux entiers non négatifs ( x(1), x(2)
) et un entier positif N
comme entrée.
x(1)
et x(2)
sera les deux premiers nombres de votre séquence, et N
sera la longueur de la séquence que vous devez sortir. (Vous pouvez choisir d'avoir la liste sur la base de 0, auquel casN
elle sera inférieure de un à la longueur).
- Vous ne pouvez pas supposer que
x(2) >= x(1)
. N
sera toujours>2
si basé sur 1, (>1
si basé sur 0).- Vous n'avez pas à gérer la division par zéro erreur.
- Notez le 2ème cas de test. Vous n'obtiendrez pas
0, 1
, etN=6
en entrée, car cela entraînera une division par zéro, mais vous devez prendre en charge0, 1
etN=5
.
- Notez le 2ème cas de test. Vous n'obtiendrez pas
- Supposons que seule une entrée valide sera donnée.
- L'entrée et la sortie peuvent être dans n'importe quel format pratique, mais vous devez prendre en charge au moins 3 chiffres après les décimales si la sortie n'est pas entière.
Cas de test:
1 3
8
1, 3, 4, 12, -8, -1.5, -9.5, 14.25
0 1
5
0, 1, 1, 1, 0 // N=6 would give division by zero error. You don't need to handle that case.
1 0
9
1, 0, 1, 0, 1, 0, 1, 0, 1
6 3
25
6, 3, 9, 27, -18, -1.5, -19.5, 29.25, -48.75, -0.6, -49.35, 29.61, -78.96, -0.375, -79.335, 29.7506, -109.086, -0.272727, -109.358, 29.825, -139.183, -0.214286, -139.398, 29.8709, -169.269
N
être basé sur 0? Prenez donc en entrée 1 de moins que le N indiqué dans vos exemples. Je suppose que prendre N-2 est trop demander ... :-PRéponses:
MATL ,
191817 octetsL'entrée est au format:
N
(basé sur 0)x(1)
,,x(2)
(sous forme de chaînes); tous séparés par des retours à la ligne.Essayez-le en ligne! Ou vérifiez tous les cas de test (code légèrement modifié; séquences de sortie séparées par une ligne vierge).
Explication
MATL n'a pas de
eval
fonction appropriée , maisU
(str2num
) peut évaluer des expressions numériques avec des opérateurs d'infixe.Chaque nouveau terme est calculé et poussé dans la pile, en conservant les termes précédents. La pile entière est imprimée à la fin.
la source
Haskell,
696864 octetsx1
etx2
sont considérés comme une liste. Exemple d'utilisation:[1,3] # 8
->[1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]
.La paresse permet de définir une liste récursive infinie où l'on prend les n premiers éléments.
Haskell, 66 octets
Approche différente, légèrement plus longue. Ordre argument est
N
,x2
,x1
. Exemple d'utilisation:( (.a).(.).take ) 8 3 1
->[1.0,3.0,4.0,12.0,-8.0,-1.5,-9.5,14.25]
.Définit 4 fonctions
a
,b
,c
etd
qui prennent deux argumentsy
,x
et faire une liste en mettantx
en face d'un appel à la fonction suivante avecy
comme second argument etx op y
que le premier. Par exemplea
est:a y x = x : (b (x+y) y)
,b
fait la multiplication:b y x = x : (c (x*y) y)
, etc.Edit: @Michael Klein a enregistré un octet dans la 1ère variante (
#
). Heureusement, j'ai également trouvé un octet pour la deuxième variante, donc les deux ont à nouveau la même longueur.Edit II: @Zgarb a trouvé 2 octets dans la deuxième version à enregistrer, et I 4 dans la première, ils ne sont donc plus de la même longueur.
la source
(.)
est composé avec d'autres fonctions: pg x=(`take`f)where
ne sauvegarde pas un octet: - /(h%g)y x=x:g(h x y)y
ES6 (Javascript),
79,67, 65 octetsMISE À JOUR
Golfé
Tester
la source
++i
pour éviter d'avoir à ajouter 1 ài
deux fois??S(n,a,i+1,a.push(...)):a
peut vous faire économiser quelques octets.a.push
renvoie la nouvelle longueur,S=(n,a,i=2)=>i<n?S(n,a,a.push(...)):a
i=2
bien.S=(n,a,i=2)=>i<n?S(n,a,a.push(eval(a[i-2]+"+*-/"[i%4]+a[i-1]))):a
pour économiser 2 octets.Python 3,
908074 octetsxnor va probablement venir détruire cette solution ...
La fonction modifie la liste qui lui est transmise. Utilisez comme ceci:
Essayez repl.it!
-6 octets grâce au cuivre
la source
O
qu'une seule fois, vous pouvez enregistrer quelques octets en faisant'-/+*'[i%4]
et en supprimant la déclaration deO
. De plus, vous pourrez peut-être contourner les appels répétés àstr
en faisant quelque chose commeeval('%s'*3%(s[-2],'-/+*'[i%4],s[-1]))
.s+=[...]
peut être remplacé pars+=...,
(notez la virgule de fin).i
en entrée, vous n'avez donc pas besoin de la valeur par défaut (i=2
peut être justei
). Deux octets éteints.n
e élément de la séquence, c'est 1 octet plus court avec la récursivité:f=lambda x,n:n<2and x[n-1]or eval('%s'*3%(f(x,n-2),'*-/+'[n%4],f(x,n-1)))
Perl 6 ,
75 7161 octetsEssaye-le
Essaye-le
Essaye-le
Étendu:
la source
Mathematica, 68 octets
À peine glissé en 3e place! Fonction sans nom de trois arguments, qui utilise un opérateur unaire auxiliaire
±
tel que±n
c'est exactement le nième élément x (n) de la séquence de Stewie. Les deux premiers arguments sont x (1) et x (2), et le troisième argument est le N indiquant quel x (N) nous produisons.Implémentation directe, en utilisant un calcul mod-4 pour choisir la fonction binaire à appliquer aux deux termes précédents. Choisir la bonne fonction binaire, ce qui est
1##[#-#2,#/#2,+##]
utile, utilise quelques-unes de ces amusantes astuces de golf Mathematica .la source
05AB1E ,
211918 octetsL'entrée est prise dans l'ordre N (basé sur 0), x (2) , x (1) .
1 octet enregistré grâce à carusocomputing .
Essayez-le en ligne!
Explication
Nous construisons de manière itérative la pile avec le dernier élément de la séquence en haut, tout en gardant tous les éléments précédents en ordre.
Ensuite, nous enveloppons la pile dans une liste à la fin pour afficher toutes les valeurs à la fois.
la source
XY
etUV
peut vous faire économiser des octets.UX
:)Lisp commun, 158
Pas vraiment compétitif, mais j'aime comment cela s'exprime tout naturellement:
Nous ignorons les erreurs lors du calcul de R, ce qui fait que R (puis B) peut éventuellement prendre la valeur NIL. Cela permet de sortir le résultat actuel même si la valeur suivante n'est pas définie. Ensuite, la boucle finira par échouer, mais c'est dans les règles.
Les tests
Nous nommons la fonction
F
et vérifions que les valeurs attendues sont approximativement égales à celle testée.La raison du test approximatif est que les valeurs calculées sont un peu plus précises que nécessaire; ici, pour
(f 6 3 25)
:la source
cc,
112110108 octetsparfois
dc
réponses peuvent être super longues, et parfois elles peuvent être super courtes. Tout dépend du défi à relever, comme c'est le cas avec de nombreuses autres langues. Quoi qu'il en soit, cela invite à une entrée de ligne de commande à un index séparé par un espace de 3 entiers,x(1), x(2), N
lors de l'appel, et génère chaque élément de la séquence sur des lignes distinctes avec des sorties non entières contenant 5 chiffres après la virgule décimale.Par exemple, l'entrée
6 3 25
donne la sortie suivante:la source
Perl, 62 + 3 (
-pla
indicateur) = 65 octetsEn utilisant:
la source
Rubis, 79 octets
Je soupçonne que c'est très loin d'être optimal (et je n'ai pas encore regardé les autres réponses), mais c'est quand même amusant.
Je voulais m'amuser
Enumerable#cycle
, mais malheureusement, c'est 4 caractères de moins à utiliser%4
.la source
C ++ 14, 118 octets
Comme lambda sans nom modifiant son entrée. Nécessite
v
d'être unvector<double>
ouvector<float>
.Non golfé et utilisation:
la source
code machine x86-64, 34 octets
Convention d'appel = x86-64 System V x32 ABI (registre args avec pointeurs 32 bits en mode long).
La signature de la fonction est
void stewie_x87_1reg(float *seq_buf, unsigned Nterms);
. La fonction reçoit les valeurs de départ x0 et x1 dans les deux premiers éléments du tableau et étend la séquence à au moins N éléments supplémentaires. Le tampon doit être complété à 2 + N-arrondi au multiple de 4 suivant. (c'est à dire2 + ((N+3)&~3)
- , ou juste N + 5).L'assemblage de tampons rembourrés est normal en assemblage pour les fonctions haute performance ou vectorisées SIMD, et cette boucle déroulée est similaire, donc je ne pense pas que cela déforme trop les règles. L'appelant peut facilement (et devrait) ignorer tous les éléments de remplissage.
Passer x0 et x1 en tant que fonction arg ne se trouvant pas déjà dans le tampon ne nous coûterait que 3 octets (pour a
movlps [rdi], xmm0
oumovups [rdi], xmm0
), bien que ce soit une convention d'appel non standard puisque System V passestruct{ float x,y; };
dans deux registres XMM distincts.Ceci est
objdump -drw -Mintel
produit avec un peu de mise en forme pour ajouter des commentairesCette implémentation de référence C compile (avec
gcc -Os
) un code quelque peu similaire. gcc choisit la même stratégie que moi, de garder une seule valeur précédente dans un registre.J'ai expérimenté d'autres façons, y compris une version x87 à deux registres qui a du code comme:
Vous le feriez de cette façon si vous optez pour la vitesse (et SSE n'était pas disponible)
Mettre les charges de la mémoire à l'intérieur de la boucle au lieu d'une fois à l'entrée aurait pu aider, car nous pouvions simplement stocker les résultats sub et div dans le désordre, mais il a toujours besoin de deux instructions FLD pour configurer la pile à l'entrée.
J'ai également essayé d'utiliser les mathématiques scalaires SSE / AVX (en commençant par les valeurs de xmm0 et xmm1), mais la plus grande taille d'instruction est mortelle. L'utilisation
addps
(puisque c'est 1B plus court queaddss
) aide un tout petit peu. J'ai utilisé les préfixes AVX VEX pour les instructions non commutatives, car VSUBSS n'est qu'un octet de plus que SUBPS (et la même longueur que SUBSS).Testé avec ce harnais de test:
Compiler avec
nasm -felfx32 -Worphan-labels -gdwarf2 golf-stewie-sequence.asm &&
gcc -mx32 -o stewie -Og -g golf-stewie-sequence.c golf-stewie-sequence.o
Exécutez le premier cas de test avec
./stewie 8 1 3
Si vous n'avez pas de bibliothèques x32 installées, utilisez
nasm -felf64
et laissez gcc en utilisant la valeur par défaut-m64
. J'ai utilisé à lamalloc
place defloat seqbuf[seqlen+8]
(sur la pile) pour obtenir une adresse basse sans avoir à construire en tant que x32.Fait amusant: YASM a un bug: il utilise un jcc rel32 pour la branche de boucle, lorsque la cible de branche a la même adresse qu'un symbole global.
s'assemble pour ...
11f: 0f 8f db ff ff ff jg 100 <stewie_x87_1reg>
la source
05AB1E , 12 octets
Essayez-le en ligne!
la source
Japt , 20 octets
Essayez-le
la source
Bash, 224 octets (PAS DE CONCOURS)
Une implémentation extrêmement importante dans BASH .
Prend la tâche tout à fait littéralement et fait tout dans un tuyau continu, sans aucune structure de flux de contrôle impie ou récursivité.
Contribution
Golfé
Moins de golf
Tester
Étapes du pipeline
Générez un tableau d'indices d'élément + op, pour chaque élément de séquence de sortie (un par ligne):
Utilisez sed pour le convertir en un programme bc linéaire :
alimenter cela à bc et le laisser faire tout le travail
la source
Pyth - 20 octets
Sortir tout
n
me coûte.Ne fonctionne pas en ligne cuz d'eval.
la source
Ceylan, 195 octets
Formaté et commenté:
Exemple d'utilisation:
Exemple de sortie:
Le deuxième exemple montre comment cela gérerait la division par zéro. Le dernier exemple montre que les résultats divergent un peu selon le type d'arithmétique (et d'arrondi) que l'on utilise ... Je pense que l'arithmétique à virgule flottante 64 bits de Ceylan est un peu plus proche de ce qu'elle devrait être que de ce qui a été publié dans la question .
la source
Clojure, 99 octets
Cette version est plus agréable à utiliser dans la pratique mais a 110 octets:
J'ai eu du mal à fusionner la fonction itérée et une séquence cyclique d'opérations, j'ai donc dû utiliser un compteur à la place. A également essayé d'utiliser une table de transition FSM comme
{+ * * - - / / +}
J'ai mais je n'ai pas pu la compresser en moins de code.Pourrait être exprimé comme une fonction anonyme
Non-golfé:
Doit être appelé avec des flotteurs comme
(f 6.0 3.0 25)
sinon vous obtenez des nombres rationnels. Alternativement, l'itération peut être démarrée à partir de[a (float b) 0]
laquelle apporte quelques caractères supplémentaires.la source
Octave , 91 octets
Essayez-le en ligne!
Quelques golfs:
eval
appeleval
appel*-/+
(impossible dans MATLAB)'
et"
pour éviter d'échapper aux apostrophes (impossible dans MATLAB)n=@num2str
car il est utilisé deux fois (pas possible dans MATLAB)la source