21, 21, 23, 20, 5, 25, 31, 24,?
Inspiré par ce puzzle , étant donné un entier , imprimez la séquence suivante jusqu'à ce que vous atteigniez un non-entier (gâté, au cas où vous voudriez résoudre le puzzle vous-même en premier)
ou plus intuitivement: * 1, +2, -3, / 4, * 5, +6, -7, / 8, ...
TestCases:
1: 1, 1, 3, 0, 0, 0, 6, -1
2: 2, 2, 4, 1
3: 3, 3, 5, 2
4: 4, 4, 6, 3
5: 5, 5 , 7, 4, 1, 5, 11, 4
6: 6, 6, 8, 5
9: 9, 9, 11, 8, 2, 10, 16, 9
21: 21, 21, 23, 20, 5, 25, 31, 24, 3, 27, 37, 26
L'entrée et la sortie peuvent être prises dans n'importe quel format raisonnable, les failles standard sont aussi interdites que d'habitude.
Dans l'esprit du code-golf , la réponse la plus courte en octets gagne!
Sandbox: https://codegolf.meta.stackexchange.com/a/18142/59642
Réponses:
05AB1E (hérité) ,
1817 octetsEssayez-le en ligne ou vérifiez tous les cas de test .
Explication:
J'utilise la version héritée de 05AB1E ici, et je calcule d'abord le nombre suivant avant de l'imprimer, car la boucle est basée sur 0 et elle fera un
/0
dans la toute première itération. Cela a sauvé un octet par rapport aux précédentsN>
et"*+-/"
. Cela ne fonctionne que parce que dans la version héritée, un nombre divisé par 0 reste le même; alors que dans la nouvelle version, il deviendrait 0; et en mathématiques réelles, cela donnerait une division par zéro erreur.la source
Scratch 3.0 39 blocs / 323 octets
Essayez-le en
ligne!Alternativement, comme syntaxe SB:
Regardez-vous les gars, amusez-vous avec votre fantaisie
eval
déclarations ! Enfin pas moi! Non ... Scratch n'a pas d'éval, alors j'ai dû faire les choses à la dure ... si les déclarations.Au moins ce n'est pas
goto
s ...la source
goto
s et une boucle de soustraction pour vérifier si nous pouvons diviser, dans un langage basé sur la pile . ; p (Sérieusement, belle réponse, +1 de ma part! Je n'ai pas pu m'empêcher de vous citer dans ma réponse tout juste terminée .)Whitespace ,
251227202 octetsLettres
S
(espace),T
(tabulation) etN
(nouvelle ligne) ajoutées uniquement en surbrillance.[..._some_action]
ajouté à titre d'explication uniquement.Essayez-le en ligne (avec des espaces bruts, des tabulations et des nouvelles lignes uniquement).
-24 octets après un commentaire de @JoKing suggérant
n%i > 0
. Bien que seulsif(x < 0)
etif(x == 0)
disponibles dans l'espace blanc, la simple vérificationif(x*-1 < 0)
est fondamentalement la même chose queif(x > 0)
.-25 octets supplémentaires grâce à @JoKing .
Explication:
Citation de la réponse Scratch :
Quelqu'un a dit
goto
? L'espace blanc n'a rien d'autre quegoto
de créer des boucles et des instructions if. xD De plus, c'est un langage basé sur la pile, donc je dois permuter / supprimer / copier assez souvent. Et pour couronner le tout: l'espace blanc n'a même pas de virgule flottante et seulement une division entière, donc j'ai utilisén % i * -1 < 0
de quitter le programme si l'entier ne peut pas diviser le nombre actuel.Pseudo-code:
la source
if(n == 0)
ouif(n < 0)
disponible. Malheureusement nonif(n > 0)
ouif(n != 0)
. Mais je suis sûr que certains aspects peuvent être simplifiés. Cette solution actuelle était un essai et une erreur de débogage, mais je devrais peut-être prendre un peu de recul et repenser une approche plus courte. Quand j'ai encore le temps. Et corrigé le pseudo-code, vous aviez en effet raison j'ai changéi
/n
dans la plupart des endroits ..m = n%i; n = n/i; if (m == 0) jump to LOOP; exit program
?swap top two, copy second item
dans la boucle globale plutôt que de le copier dans chaque section?Haskell ,
75 7473 octets-1 octet grâce à Will Ness -1 octet grâce à nimi
Essayez-le en ligne!
Évite l'utilisation d'entiers fractionnaires pour économiser sur les octets
la source
JavaScript (V8) , 52 octets
Imprime des groupes de 4 termes. Inspiré par la réponse Ruby de GB .
Essayez-le en ligne!
JavaScript (V8) , 54 octets
Imprime les termes de la séquence.
Essayez-le en ligne!
JavaScript (ES6),
5958 octetsRenvoie un tableau.
Essayez-le en ligne!
la source
Perl 6 , 44 octets
Essayez-le en ligne!
Bloc de code anonyme qui prend un nombre et renvoie une séquence. Si nous pouvions ignorer le premier élément (qui est toujours le même que le deuxième élément de toute façon), nous pourrions économiser 3 octets en supprimant le
$_,
la source
Python 3 , 60 octets
Essayez-le en ligne!
la source
Piet ,
297190144 codels (432 octets)J'ai essayé une nouvelle approche en utilisant un
pointer
commande comme commutateur (k mod 4) pour unifier le code de sortie, résultant en une image de code 10x19 plus dense. Ensuite, j'ai joué au golf d'une rangée et de deux colonnes à 8x18.Voici une trace, pour voir comment ça marche:
La première ligne pousse un 0 sur la pile comme index de départ (puisque nous ne pouvons
push
des nombres naturels, nous poussons 2 uns puis soustrayons), puis lit l'entrée en tant que nombre.La colonne la plus à gauche a le code partagé de duplication du nombre et d'en insérer un dans la sortie, puis de déplacer l'index au-dessus de la pile, de l'incrémenter puis de le dupliquer trois fois. Nous entrons ensuite dans le bloc en forme de R rouge pastel à travers le codel cyan foncé pour une
pointer
commande qui nous donne différents chemins pour le reste de notre index mod 4.Mod 1, on sort par le haut pour se multiplier. Nous mélangeons d'abord une copie de notre index pour plus tard, puis effectuons la multiplication. Après avoir traversé le blanc pour un noop, nous entrons dans la colonne ci-dessus pour fixer la parité cc (elle doit être retournée un nombre pair de fois pour maintenir la boucle stable), suivie d'un
pointer (1)
pour entrer dans la barre magenta: il agit comme un attraper nos quatre chemins et nous renvoyer dans la boucle.Mod 2, nous sortons à l'envers pour résumer. La forme du bloc de code pastel signifie que nous sortons d'une ligne au-dessus de l'endroit où nous sommes entrés, et nous utilisons les 3 que nous poussons sur la pile en sortant par le codel rouge vers
pointer (3)
nous vers le haut. Cette colonne a l'espace blanc avant l'arithmétique et un ordre légèrement différent de pousser et de commuter cc, car sinon nous aurions un chevauchement de couleur avec des codels à valeur entière dans la colonne voisine.Le module 3 nous envoie vers le bas pour la soustraction. Même chose que la multiplication, sauf que nous traversons le chemin de division en montant (comme le cc a une parité différente en entrant dans la barre verte pastel, les deux exécutions sortent de cette barre à des extrémités différentes). Ce faisant, nous prenons une
duplicate
commande indésirable , nous lapop
reculant donc avec le codel vert foncé avant d'entrer dans la barre de correction et de collecte cc.Mod 4, nous allons tout droit de diviser. Ici, nous devons d'abord réorganiser la pile plus sévèrement pour obtenir deux paires de n et a pour effectuer des opérations, car nous devons tester si elle est entière. Nous faisons ce que je fais
mod
sur la première paire, puisnot
sur le résultat, puis utilisons cela pour unpointer
- si ce n'est pas divisible, nous continuons tout droit, ce qui nous envoie avec deuxpointer
commandes dans le coin opposé dans le bloc incontournable et termine ainsi le programme. Sinon, nous tournons à droite et obtenons unedivide
commande d'entrer dans la barre magenta.Ancienne version
Code très simple: pousse un 1 et l'entrée sur la pile, puis effectue une boucle à travers les quatre opérations en: mélangeant l'index au-dessus de la pile, l'incrémentant de 1, le dupliquant, en mélangeant une copie vers le bas, en effectuant l'opération arithmétique, dupliquer le nombre et en insérer un dans la sortie.
Pour la division, qui est la seule où la séquence peut se terminer, elle crée une pile plus compliquée pour d'abord vérifier si n mod index == 0, sinon elle entre dans le codel incontournable et se termine. Sinon, il utilise sa deuxième copie de i et n pour effectuer la division.
la source
push (1) pointer
ou pour une cellule noire au-dessus d'une couleur.C # (Visual C # Interactive Compiler) ,
72,70, 69 octetsEssayez-le en ligne!
la source
Rubis ,
56 5452 octetsEssayez-le en ligne!
Après une tentative (infructueuse) avec
eval
, j'ai découvert que la solution la plus heureuse était de construire le tableau avec 4 éléments à la fois, au moins en rubis.Merci à Arnauld pour -2 octets.
la source
R ,
90 octets ,73 octets87 octets85 octets80 octets74Une mise en œuvre simple des règles:
Essayez-le en ligne!
avec ce qui
T<13
suit d'une analyse plus approfondie du puzzle. En effet il n'y a que trois sortes de séquences: celles de longueur 4, lorsque a⁰ n'est pas congru à 1 modulo 8; ceux de longueur 12 lorsque a⁰ est congru à 21 modulo 32; et ceux de longueur 8 pour les autres cas.Un code alternatif évitant les boucles finit par être plus long avec 87 octets:
Essayez-le en ligne!
la source
{}
pour -2 octets.length
.Haskell ,
1048685 octetsEssayez-le en ligne!
Le
h=
peut être omis car il n'est utilisé que pour les tests.Ah, le golf de code, où une augmentation quadratique de la complexité temporelle en vaut la peine pour la réduction d'un caractère.
104 octets
Essayez-le en ligne!
J'aime mieux cette réponse, mais hélas elle est plus longue.
la source
Japt ,
2524 octetsUne autre adaptation de la solution Ruby de GB .
Essayez-le
L'astuce principale ici est la surcharge de la
c
méthode pour les tableaux. Passez-lui un autre tableau comme argument et il le concatène au tableau d'origine. Passez-lui un nombre comme argument, comme cela se produit lors du dernier appel récursif, et il aplatit le tableau d'origine de ce nombre de niveaux -1
dans ce cas, après l'arrondi. Mais, comme la matrice n'a qu'un niveau de profondeur, l'aplatissement n'a aucun effet.la source
Java 8, 84 octets
Essayez-le en ligne.
La création d'un tableau avec les quatre valeurs est inspirée de la réponse Ruby de @GB , bien que je remarque maintenant que l'utilisation d'une instruction if ternaire est la même quantité d'octets:
Essayez-le en ligne.
la source
Perl 5 , 53 octets
Essayez-le en ligne!
la source
Rouge , 102 octets
Essayez-le en ligne!
la source
AWK , 57 octets
Essayez-le en ligne!
la source
Rutger , 310 octets
Essayez-le en ligne!
Il est temps que j'utilise à nouveau Rutger. Malheureusement, ce n'est peut-être pas le meilleur langage pour la tâche, car il n'a aucune forme
eval
, ce qui m'oblige à utiliser quatre instructions ifComment ça marche
Comment fonctionne Rutger
Un bref avant-propos sur le fonctionnement du langage: tout est soit une affectation, soit une fonction, et chaque fonction prend exactement un argument. Pour les opérations qui nécessitent plus d'un argument (par exemple la multiplication), le premier appel renvoie une fonction partielle qui, lorsqu'elle est appelée à nouveau avec le deuxième argument, renvoie le résultat attendu. Par exemple:
imprimera 30: Essayez-le en ligne!. Bien que cela soit généralement plus long que l'alternative habituelle, il peut parfois économiser des octets, si une fonction est appelée à plusieurs reprises avec un argument constant et un argument changeant, par exemple lors de l'impression de tables de temps.
Cette règle à un argument s'applique à tout ce qui n'est pas une constante ou une variable, y compris les boucles et les conditions. Cependant, les boucles et conditionals (
For
,Each
,While
,DoWhile
,If
etIfElse
) sont faisables , ce qui signifie que pour les exécuter en fait, laDo
fonction doit être appelée (voir la dernière ligne dans la réponse). Encore une fois, cela peut économiser des octets lors de l'exécution répétée de la même boucle, ou vous permettre d'exécuter du code arbitraire entre la définition et l'exécution des boucles.Enfin, il existe trois façons de se référer aux variables, qui sont toutes utilisées dans ce programme. Le premier est le référencement direct , où le nom de la variable est préfixé par un
$
symbole. Cela accède directement à la valeur de la variable et la renvoie. Le second est le référencement fonctionnel , qui n'a pas de caractère de préfixe. Cela permet au code de faire la distinction entre les fonctions (potentiellement partielles) attribuées aux variables et les variables réelles contenant une valeur spécifique. Enfin, le référencement indirect , préfixé d'un@
symbole, crée une variable (si elle n'existe pas déjà) et renvoie l'objet variable dans une portée donnée. Cela vous permet de créer une variable de boucle (par exemplei
dansfor i in range(...)
).Fonctionnement de la solution réelle
Voici le code non golfé:
Essayez-le en ligne!
Comme vous pouvez le voir, il commence par attribuer des trois variables
n
,e
eta
qui représentent l'entrée, l'élément de modification de la séquence, et le numéro de modification pour chaque nouvel élément , respectivement. Nous créons ensuite une boucle while:{
}
m
e % m
Nous arrivons ensuite à la monstruosité absolue constituée du corps de la boucle while:
La partie principale de cette boucle est une boucle for, qui itère4
x
La première instruction imprime chaque itération de la séquence avant de la modifier. Nous créons ensuite une fonction partielle pour vérifier l'égalité avec la variable de boucle
x
et rencontrons quatre instructions if. Chaque instruction suivante vérifie six
est égal à 1, 2, 3 ou 4 respectivement, puis attribuek
à chacune des fonctions dans*
,+
,-
et/
, puis le transforme en une fonction partielle avece
comme argument. Enfin, nous assignonse
àk
exécuter aveca
comme deuxième argument, et à incrémentera
.la source
Rubis , 52 octets
Essayez-le en ligne!
la source
i=0
et utilisez un flotteur comme argument de la fonction.C (clang) , 80 octets
Essayez-le en ligne!
Merci aux nombreuses améliorations de @ceilingcat.
la source
dzaima / APL,
3433 octetsEssayez-le en ligne!
-1 grâce à ngn
la source
TI83 / 84 BASIC, 69 octets
Nous avons configuré un compteur en A et effacé L1 afin de pouvoir l'utiliser pour suivre la séquence. Nous répétons ensuite jusqu'à ce que l'étape de division provoque une fraction. À l'intérieur de la boucle, nous stockons d'abord N dans la liste. Le stockage sur un élément après la fin d'une liste ou une liste vide crée cet élément, donc celui-ci ajoute à la fois le résultat de la division quand il ne provoque pas de fraction et initialise la liste lors de la première passe. Nous utilisons ensuite l'augmentation pour ajouter les 3 termes suivants de la séquence. Le calcul se réduit de quelques octets en calculant le terme A4k + 3 dans la variable O puis en basant A4k + 2 et A4k + 4 sur O. Ensuite, nous faisons la division séparément pour réinitialiser N pour la vérification de répétition et ajouter 4 à A.
J'ai mis un Disp L1 à la fin, mais je ne sais pas à quel point c'est idéal car il n'y a pas de bon moyen pour adapter tous les termes à l'écran. De manière réaliste, l'utilisateur exécuterait L1 après l'exécution manuelle du programme pour faire défiler les résultats.
la source
Fusain , 29 octets
Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Saisissez la valeur initiale.
Répétez jusqu'à ce que la valeur ne soit plus un entier.
Imprimez la valeur sur sa propre ligne.
Calculez les quatre opérations arithmétiques disponibles et sélectionnez la bonne en fonction du numéro de ligne de sortie actuel.
la source
Python 3 ,
7876 octetsEssayez-le en ligne!
Prend l'entrée comme une liste de 1 élément et ajoute récursivement l'élément suivant de la séquence jusqu'à ce qu'il ne soit pas un entier.
Dans le cas où la prise d'entrée en tant que liste n'est pas autorisée, voici une version corrigée très rapidement qui prend l'entrée en tant qu'int.
Entrée sous forme d'entier, 102 octets
Essayez-le en ligne!
+2 octets grâce à moi en oubliant de nommer la fonction récursive ...
-4 octets grâce à Jitse
la source
f=
dans votre code principal. Cependant, vous pouvez également enregistrer 4 octets depuisn[-1]
etlen(n)
n'avez pas besoin d'être entre accolades. Essayez-le en ligne!n[:-(n[-1]%1>0)]or f...
économiserait un octetBrindille , 164 octets
D'accord, c'était vraiment horrible à écrire.
Limites:
returns
! Vous sortez ou ne sortez paswhile
boucles. Vous devez utiliser la récursivité ou rienset
balisebreak
,continue
,goto
ou similaire. Cela rend une boucle impossible à utiliser.for ... in ....
et elle boucle sur tous les éléments d'un tableau, sans aucun moyen de s'arrêter.Tous ceux-là ont rendu le code massif!
Hé, je l'ai même rendu plus long que la réponse Java!
C'est aussi long que la réponse JavaScript de @ Arnauld ! ... Avec les 3 alternatives combinées.
Voici le code:
Vous pouvez l'essayer sur https://twigfiddle.com/zw5zls
Comment utiliser:
Importez simplement le fichier et appelez la première macro.
Pour avoir un tableau utilisable, vous pouvez le faire
a.a(21)|split(',')
.Non golfé:
Doit être facile à lire.
Cette réponse non golfée ne donnera PAS la sortie correcte, car elle jettera des espaces blancs aléatoires.
Il existe simplement pour être humainement lisible.
la source