introduction
Une file d'attente est un type de données abstrait où des éléments sont ajoutés à l'avant (mise en file d'attente) et supprimés à l'arrière ( retrait de file d'attente ). Il s'agit également du principe FIFO (First In First Out) .
Il est mieux illustré par un exemple:
Défi
Etant donné un non-vide tableau qui contient des nombres entiers positifs et des éléments qui indiquent une dequeue (suppression d' un élément de sortie), la liste finale de la file d' attente.
Disons que cela X
dénote une file d'attente dans cet exemple. Jetons un œil à la liste suivante:
[45, X, X, 37, 20, X, 97, X, 85]
Cela peut être traduit dans le pseudo-code de file d'attente suivant:
Queue
Enqueue 45 -> 45
Dequeue ->
Dequeue -> (dequeue on an empty queue is a no-op)
Enqueue 37 -> 37
Enqueue 20 -> 20 37
Dequeue -> 20
Enqueue 97 -> 97 20
Dequeue -> 97
Enqueue 85 -> 85 97
Vous pouvez voir qu'à la fin, le résultat est [85, 97]
, qui est la sortie de cette séquence.
Cas de test
Notez que vous pouvez choisir n'importe quel autre symbole ou caractère X
, tant qu'il ne s'agit pas d'un entier positif.
[1, X, 2, X, 3, X] -> []
[1, 2, X] -> [2]
[1, 2, 3] -> [3, 2, 1]
[1, 2, X, X, X, 3] -> [3]
[1, 2, X, 3, X, 4] -> [4, 3]
C'est du code-golf , donc la soumission avec le moins d'octets gagne!
Réponses:
Gelée , 8 octets
Utilise n'importe quelle valeur falsifiée ( 0 ou vide itérable) pour retirer la file d'attente .
Essayez-le en ligne!
Comment ça marche
la source
Python 2,
565350 octetsEssayez-le en ligne!
La file d'attente est
-1
. Cette astuce permet un découpage pythonique facile de la file d'attente.la source
Mathematica, 102 octets
Certainement pas la solution la plus courte, mais je n'ai pas pu résister car c'est un peu pervers.
Après quelques fonctions d'assistance, cela définit une fonction pure qui prend une chaîne en entrée: dans la chaîne, les nombres sont séparés par des virgules (les espaces sont facultatifs); le caractère de file d'attente est
"]"
; et la liste n'a pas de délimiteurs à l'avant ou à l'arrière. Par exemple, le premier exemple dans l'OP serait entré comme chaîne"45,],],37,20,],97,],85"
. La sortie de la fonction est une liste de nombres.La fonction compte le nombre de files d'attente
"]"
dans la chaîne d'entrée, ajoute ce nombre de copies"f["
à l'avant de la chaîne, puis entoure le tout par"r[...]"
. Dans l'exemple ci-dessus, cela produit"r[f[f[f[f[45,],],37,20,],97,],85]"
; remarquez que les crochets sont équilibrés.Ensuite,
ToExpression
interprète la chaîne résultante comme un morceau de code Mathematica et l'exécute. La fonctionf
est définie de manière pratique pour conserver tous ses arguments, sauf le premier (et ignore également les virgules de fin; cela est nécessaire pour gérer la file d'attente vide de toute façon) etr
convertit la séquence de nombres résultante en une liste de nombres dans le bon ordre.la source
b___,
censée être là? Cela fonctionne , mais la virgule devient rouge à cause de cela. (aussi, quelle est la différence entre les lignes 2 et 3?)f[a_,b___]:=b
(sans la virgule), tandis que la ligne 3 est équivalente àf[a_,b___,Null]:=b
. Dans les deux cas,b___
fait référence à n'importe quel nombre d'arguments (y compris aucun). La ligne 3 est plus spécifique, elle est donc toujours utilisée avant la ligne 2 lorsque cela est approprié. Ainsi, la fonctionf
ignore son premier argument, et ignore également son dernier argument si cet argument l'estNull
. Cela était nécessaire pour gérer la mise en file d'attente d'une file d'attente vide. Notez qu'une entrée typique donnera une expression commer[f[f[f[5,3,],2,],],11]
, où chaque virgule avant]
indique à nouveau unNull
.Rétine , 30 octets
Essayez-le en ligne!
Supprime à plusieurs reprises le premier nombre qui (pas nécessairement immédiatement) suivi d'un
X
ensemble avec celaX
, ou d'unX
au début de la chaîne. Inverse ensuite les chiffres restants.la source
JavaScript,
7063535043 octetsMerci @Neil pour avoir joué 10 octets avec x.map au lieu de pour l'expression en boucle et ternaire
Merci @Arnauld d'avoir joué au golf sur 3 octets
Merci @ETHproductions pour avoir joué au golf sur 7 octets
Essayez-le en ligne!
La mise en file d'attente peut être toute valeur non numérique autre que true.
la source
if
instruction, et encore plus court si vous utilisiezmap
au lieu d'une boucle, et encore plus court si vous utilisiez une expression au lieu d'un bloc. Voir les astuces .x=>(t=[],x.map(a=>a>0?t.unshift(a):t.pop()),t)
pour économiser pas mal d'octets sur lereturn
x=>x.map(a=>a>0?t.unshift(a):t.pop(),t=[])&&t
est encore plus court.a?
suffit-il, je suppose?)Mathematica,
4645 octetsMerci à ngenisis pour avoir économisé 1 octet.
Fondamentalement, la même chose que ma réponse Retina, en utilisant la correspondance de motifs. Nous faisons correspondre à plusieurs reprises le premier
X
et le supprimons avec le premier numéro (s'il en existe un). Une fois que nous avons terminé, nous inversons la liste.la source
Pure Bash, 72
Entrée donnée comme paramètres de ligne de commande.
Essayez-le en ligne .
la source
Haskell, 41 octets
la source
x&(y:z)
MATL ,
1312 octetsL'entrée est un tableau de nombres, avec
0
pour "dequeue".La sortie est des nombres séparés par des espaces. Un résultat vide est affiché comme rien.
Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
Haskell,
4140 octetsLa fonction est
foldl(#)[]
(également incluse dans le nombre d'octets avec un octet de séparation entre les deux)Essayez-le en ligne!
X est un entier non positif
EDIT: -1 octet grâce à nimi
la source
|l>[]=init l|1>0=l
Julia,
78767357 octetsMerci à Harrison Grodin pour ses excellentes suggestions de golf Julia. Remplacé if / else par ternaire et for / end par compréhension de liste pour une économie de 16 octets.
Suppression de certains espaces inutiles pour une économie de 3 octets.
Avant que les nombres négatifs ou zéro ne soient autorisés:
Non golfé:
Je suis assez nouveau pour Julia; il peut y avoir une meilleure façon. Utilise
:X
X, qui est un symbole dans Julia. Mise à jour: Maintenant que 0 est autorisé, utilise 0 (ou tout nombre négatif) pour X, enregistrant deux caractères. Mis à jour à nouveau pour supprimer certains espaces dont je ne savais pas qu'ils n'étaient pas nécessaires.la source
05AB1E ,
1211 octetsUn octet enregistré grâce à Riley
Essayez-le en ligne!
Explication
Les files d'attente sont indiquées par n'importe quelle lettre .
la source
GNU Sed, 43
Le score inclut +2 pour l'utilisation des drapeaux
-r
et-n
.Essayez-le en ligne .
Explication
la source
PHP, 85 octets
-8 octets
$v
au lieu deis_int($v)
si chaque valeur de mise en file d'attente appartient à falsela source
Python 3 ,
9594 octetsEssayez-le en ligne!
Aussi 94 octets:
la source
Perl 5 , 28 + 1 = 29 octets
28 octets de code +
-p
indicateur.Essayez-le en ligne!
Il utilise une chaîne (
$\
) comme file d'attente: lorsque l'entrée contient un entier (/\d/?
, nous l'ajoutons au début de$\
($\=$_.$\
), et sinon, nous supprimons le dernier avecs/.*\n$//
. À la fin,$\
est implicitement imprimé grâce à-p
flag (et ceux inégalés}{
).Autres approches:
33 octets , en utilisant un tableau comme file d'attente (c'est le moyen le plus naturel de le faire en Perl je pense, mais pas le plus court):
Essayez-le en ligne!
52 octets , en utilisant regex et
reverse
(il se trouve que c'est exactement la même chose que la réponse Retina de Martin Ender - grâce à qui j'ai économisé 2 octets dessus). Inverser la liste prend beaucoup de caractères cependant, car pour préserver les entiers, je dois convertir la chaîne en un tableau pour l'inverser, puis revenir à une chaîne pour l'imprimer. (say for
au lieu de$_=join$",
peut économiser 2 octets, mais cela nécessite-E
ou-M5.010
et ce n'est pas si intéressant).Essayez-le en ligne!
la source
Python 3, 107 octets
Dequeuer peut être n'importe quelle valeur non numérique.
Essayez-le en ligne
la source
Lot, 160 octets
C'était plus difficile que nécessaire.
Cela signifie que j'ai a) besoin d'un marqueur de fin de file d'attente, qui ne soit pas supprimé, et b) que je doive manipuler la file d'attente en arrière, de sorte que de nouveaux éléments soient insérés juste avant le marqueur de fin, afin que les anciens éléments puissent être retirés de l'avant, ce qui signifie alors que je c) dois inverser la file d'attente avant de l'imprimer.
la source
PHP, 70 octets
la source
C #, 115 octets +33 octets pour l'utilisation
Méthode anonyme qui renvoie une liste d'entiers après avoir effectué les opérations de mise en file d'attente et de mise en file d'attente. Les entiers négatifs sont utilisés pour supprimer des éléments de la file d'attente.
Programme complet avec méthode non golfée et cas de test:
la source
Scala, 97 octets
En entrée,
f
prend une liste avec0
comme élément "dequeue". Il utilise la récursivité de queue avec un second paramètre (b
), agissant comme un accumulateur. Initialement,b
c'est le emptySeq
(Nil
).Explications:
Note:
b dropRight 1
est utilisé au lieub.tail
d'éviter exception:tail of empty list
.Cas de test:
f
peut également fonctionner avec d' autres types (String
,char
, ..., même liste hétérogène de ces types!):la source
REXX, 115 octets
Prend une chaîne séparée par des espaces, imprime une chaîne séparée par des espaces
la source
C ++,
122119 octets0 indique une file d'attente.
Essayez-le en ligne!
la source
Swift 3, 70 octets
En supposant que nous ayons un tableau d'Ints comme
let x = [1, 2,-1,3,-1,4]
Notez que
[].prefix(0)
c'est un moyen sournois d'obtenir un ArraySlice videla source