Je ne peux pas croire que nous ne l'ayons pas déjà. C'est l'une des structures de données les plus importantes en programmation, et pourtant assez simple pour l'implémenter dans un code-golf :
Défi
Votre tâche consiste à implémenter une pile permettant de pousser et d'afficher des nombres, de tester votre implémentation et de maintenir les E / S simples. Nous utiliserons la configuration suivante:
- L'entrée sera une liste d'entiers non négatifs
Chaque nombre entier positif indique un \ texttt {push (} n \ texttt {)} et chaque 0 indique un \ texttt {pop ()} - rejet de l'élément supérieur.push ( n ) 0 pop ()
- La sortie sera la pile résultante
Exemple
Par exemple, si on nous donne :
La sortie sera:
Règles
- L'entrée sera une liste d'entiers non négatifs dans n'importe quel format d'E / S par défaut
- vous pouvez utiliser un entier négatif pour indiquer la fin d'un flux d'entiers
- Le résultat sera une liste / matrice / .. de la pile résultante
- votre choix où l'élément du haut sera (au début ou à la fin), la sortie doit juste être cohérente
- la sortie est flexible (par exemple, des entiers séparés par des lignes-nouvelles iraient bien), la seule chose qui compte est l’ordre
- vous pouvez utiliser un entier négatif pour indiquer le bas de la pile
- Vous êtes assuré qu'il n'y aura jamais de lorsque la pile est vide
Exemples
[] -> []
[1] -> [1]
[1,0,2] -> [2]
[4,0,1,12] -> [12,1]
[8,3,1,2,3] -> [3,2,1,3,8]
[1,3,7,0,0,0] -> []
[13,0,13,10,1,0,1005,5,0,0,0] -> [13]
[12,3,0,101,11,1,0,0,14,0,28] -> [28,101,12]
Réponses:
MATL , 6 octets
L'entrée est un vecteur ligne de nombres.
La pile finale est affichée à l’envers, l’élément le plus récent se trouvant en dessous.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
Java (JDK 10) , 42 octets
Etant donné que "[la] sortie est flexible [...], la seule chose qui compte, c'est l'ordre", le tableau d'entrée devient un
0
tableau terminé. Exemple:[1,0,2]
retournera[2,0,2]
ce qui doit être interprété comme = .[2
,0,2
]
[2]
Essayez-le en ligne!
Versions précédentes:
Java (JDK 10) , 60 octets
Essayez-le en ligne!
Crédits:
Si je peux terminer le programme avec des erreurs: 55 octets
(bien que tout soit correctement modifié)
Essayez-le en ligne!
la source
>0
car il n'y aura jamais de zéro au début de la liste (cela impliquerait que le haut de la pile était à-1
).Sed, 17 octets
:;s/[0-9]\+,0//;t
-3 octets grâce à @ OMᗺ, -1 grâce à @eggyal
Parce que vous êtes assuré de ne jamais faire apparaître une liste vide, vous n'avez besoin de rien de plus qu'une machine à états finis itérée. Les expressions régulières sont un outil de construction de machines à états finis et
sed
peuvent effectuer des itérations. C'est un match fait au paradis.Prend les entrées de stdin, comme ceci:
echo '[12,3,0,101,11,1,0,0,14,0,28]' | sed ':;s/[0-9]\+,0,//;t'
Sort la pile en sens inverse:
[12,101,28]
Pourrait être plus petit de deux octets si mon local
sed
comprenait de manière inhérente les classes de caractères\d
, mais pas pour une raison quelconque.la source
g
est redondant - vous économisez 4 octets: essayez-le en ligne!PowerShell ,
464140 octetsEssayez-le en ligne!
Prend une entrée via splatting, par exemple,
$z=@(12,3,0,101,11,1,0,0,14,0,28); .\implement-stack.ps1 @z
qui sur TIO se manifeste sous forme d'arguments séparés.-5 octets grâce à mazzy.
-1 octet permuter
$_
en1
la source
$agrs
? :)$args|%{$x,$a=&({$_,$_+$a},{$a})[!$_]};$a
?.\implement-stack.ps1 @z
(non$z
), sinon vous ne faites que passer un tableau en tant que premier / seul argumentC (gcc) ,
62605655 octets-2-6 octets grâce à l4m2-1 octet grâce à ceilingcat .
Utilise la notion autorisée de -1 tableaux terminés.
f()
s’appelle récursivement jusqu’à ce qu’elle soit complètement enroulée, puis fait un retour en arrière dans la liste.r
garde la trace du nombre de numéros à supprimer avant d’imprimer quelque chose. Augmente si l'élément actuel est 0, diminue sinon. Si 0, nous n'avons pas besoin de nous en défaire et pouvons imprimer le numéro.Essayez-le en ligne!
la source
f(l)int*l;
=>f(int*l)
?r=0
semble inutileHaskell, 28 octets
Essayez-le en ligne!
la source
R , 45 octets
Essayez-le en ligne!
la source
F
conduira également à 48 octets mais c'est plus propre à mon goûtR+pryr
et laReduce
solution est 44 octetsPython 2 ,
595751 octetsEssayez-le en ligne!
la source
Gelée , 6 octets
Essayez-le en ligne!
Comment ça marche
la source
[1,3,7,0,0,0]
, par exemple, se scinde en[[1,3,7],[],[],[]]
, et chaque étape de l’élément de réduction de gauche apparaît sur l’élément du tableau de gauche.Brain-Flak ,
40 à36 octetsEssayez-le en ligne!
Merci à @Nitrodon pour -4 octets.
Puisque Brain-Flak utilise déjà des piles, ceci est un bon casse-tête pour Brain-Flak.
la source
{{}<>{}<>}
peut être raccourci à{{}<>}
.Wolfram Language (Mathematica) , 28 octets
Essayez-le en ligne!
la source
b
n'est pas zéro.)a___
. On peut voir cela en essayantReplaceList[#, {a___, b_, 0, c___} :> {a, c}] &
. Sur une note connexe,StringReplace
est en fait gourmand, donc cette soumission ne fonctionnerait pas avecStringReplace
(avec un motif commea___~~b_~~"0"~~c___
)Python 2 , 48 octets
Essayez-le en ligne!
la source
2*0**x
toujours être0
. Je manque évidemment quelque chose.x=0
, auquel cas c'est 2.Espaces blancs , 89 octets
Lettres
S
(espace),T
(tabulation) etN
(nouvelle ligne) ajoutées uniquement en surbrillance.[..._some_action]
ajouté comme explication seulement.Prend la nouvelle ligne de la liste d'entrées séparée avec
-1
pour indiquer que nous en avons terminé avec les entrées.Essayez-le en ligne .
Explication en pseudo-code:
la source
Python 2 ,
60595756 octetsEssayez-le en ligne!
Enregistré:
la source
0
etin
JavaScript, 40 octets
Sorties dans l'ordre inverse.
Essayez-le en ligne
1 octet enregistré grâce à Herman L .
la source
a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&o
est un octet plus court(un)shift
avant que je repéré la sortie pourrait être inversée.o
est référencé dans le rappel après avoir été défini dans le second argument.05AB1E , 9 octets
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
Alternative de 9 octets :
Essayez-le en ligne pour vérifier tous les cas de test .
Explication:
PS: Si la sortie a dû être inversée pour correspondre aux tests élémentaires dans la description du challenge, nous pouvons ajouter une fin
R
à la seconde version (soit 10 octets ), ce qui inversera la liste. Essayez-le en ligne ou vérifiez tous les cas de test .la source
Retina 0.8.2 , 18 octets
Essayez-le en ligne! Le lien inclut des cas de test. Explication:
Préfixe un extra
,
.Traiter toutes les opérations pop.
Retirer le
,
si c'est toujours là.Inverser les nombres coûterait 8 octets supplémentaires:
la source
<number>, 0
sous-liste par rien.Ruby , 36 octets
Essayez-le en ligne!
Lambda anonyme. Sorties dans l'ordre inverse.
la source
Brain-Flak , 36 octets
Essayez-le en ligne!
la source
Brain-Flak , 32 octets
Essayez-le en ligne!
Utilisé
-1
pour signifier la fin du tableau (mais n'importe quel nombre le fera vraiment).la source
V , 10 octets
Essayez-le en ligne!
Explication
Équivalent en Vim , 16 octets
Essayez-le en ligne!
Explication
À peu près la même chose, sauf enregistrer une macro
q
et l'appeler de manière récursive:la source
Java 10,
7572 octetsLes sorties sont séparées par une virgule. Le sommet de la pile est le dernier. Essayez-le en ligne ici .
Merci à Olivier Grégoire pour avoir joué au golf 2 octets.
S'il vous plaît vérifier Kevin Cruijssen et les réponses à Java de Olivier Grégoire . Ils adoptent plutôt une approche basée sur des listes, cette dernière battant la mienne par une marge nette.
Ungolfed:
la source
Stack
. +1 de moi.n->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0$","");return s;}
(73 octets), mais met les,
nombres avant, pas après.n->{var s=""+n;for(int x:n)s=s.replaceFirst("\\d+, 0,? ?","");return s;}
(72 octets), utilise une liste plutôt qu'un tableau et perturbe la sortie car il peut renvoyer des choses comme "[, 2]"$
pour enregistrer un octet supplémentaire, car chaque0
ajout est immédiatement supprimé.GolfScript ,
1412 octetsEssayez-le en ligne!
la source
Perl 5
-p
, 17 octetsMerci @sundar et @DomHastings
Essayez-le en ligne!
la source
> <> , 25 octets
Essayez-le en ligne! (les entrées doivent être écrites en ascii. sinon utilisez celui-ci )
Comment ça marche
i:?\~~
vérifie pour 0, continue~~
à supprimer l'entrée précédente. sinon descendre à:(0:/:^?
qui vérifie -1 (plus d’entrée), puis se termine pour supprimer -1 et boucle:!?l:!<oan;
qui sort chaque numéro avec une nouvelle ligne, puis se termine lorsque la pile est vidéela source
Décortiquer , 6 octets
Comme il n'y a pas encore de réponse Husk et que c'est mon golfing-lang préféré:
Essayez-le en ligne!
Explication
Solution alternative, 6 octets
Au lieu de retourner, nous pouvons aussi simplement inverser la liste, puis utiliser un pli à droite:
Ḟ?:tø↔
la source
brainfuck ,
214150 octetsLit les entrées sous forme de nombres séparés par des nouvelles lignes. Cela doit inclure une seule nouvelle ligne. N'attend également aucun zéros à gauche sur chaque nombre. Sortie sous forme de liste similaire séparée par une nouvelle ligne
Essayez-le en ligne!
Explication
qui n'est pas vraiment une explication mais qui est en fait juste la version sur laquelle je travaillais, avec des commentaires et des choses qui pourraient ne pas être utiles à quiconquela source
Brachylog , 21 octets
Essayez-le en ligne!
-1 octet, et plus important encore, cela semble être une façon beaucoup moins maladroite de le faire.
Alternate 21 byter:
∋0∧ℕ₁;0;P↺c;Qc?∧P,Q↰|
Essayez-le en ligne!Ancien code:
22 octets
Essayez-le en ligne!
la source
Avertissement: beaucoup de lignes s'ensuivent. Tu étais prévenu.
CJam , 17 octets
Code le plus dangereux
(en supposant que les éléments de la pile ne peuvent être séparés que par des espaces dans la sortie et que le tableau en entrée peut être de la forme de notre choix)
Essayez-le en ligne!
Explication
Code alternatif n ° 1, 27 octets
(en supposant que les éléments de pile doivent être générés dans le format indiqué dans la question et que le tableau en entrée peut être de la forme que nous souhaitons)
Essayez-le en ligne!
Explication
Code alternatif n ° 2, 24 octets
(en supposant que les éléments de la pile puissent être assemblés dans la sortie et que le tableau en entrée doit être au format exact indiqué dans la question)
Essayez-le en ligne!
Explication
Le code le plus sûr pour cela, 34 octets
(en supposant que les éléments de pile doivent être sortis dans le format indiqué dans la question et que le tableau en entrée doit être dans le format exact indiqué dans la question)
Essayez-le en ligne!
Explication
Merci à @Jo King d’ avoir fait remarquer que ceux avec la sortie assemblée ne sont pas valides car des choses comme
[12]
et[1,2]
seraient impossibles à distinguer.Merci également à @Jo King, qui offre une alternative très appropriée pour les sorties assemblées et coupe 9 octets!
la source
[12]
et[1,2]
. Cependant, la version à 27 octets semble correcte, bien que vous puissiez vous débarrasser des espaces et des crochets pour 18 octets]S*
(3), tandis que les virgules utilisent]',*
(4)Rouge , 64 octets
Essayez-le en ligne!
la source