Introducción
Una cola es un tipo de datos abstractos donde los elementos se agregan al frente (en cola) y se eliminan de la parte posterior (cola). Esto también se conoce como el principio FIFO (Primero en entrar, primero en salir) .
Se muestra mejor con un ejemplo:
Reto
Dada una matriz no vacía que contiene enteros positivos y elementos que indican una cola (eliminar un elemento), genera la lista final de la cola.
Digamos que X
denota una dequeue en este ejemplo. Echemos un vistazo a la siguiente lista:
[45, X, X, 37, 20, X, 97, X, 85]
Esto se puede traducir al siguiente seudocódigo de cola:
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
Puede ver que al final, el resultado es [85, 97]
, que es la salida para esta secuencia.
Casos de prueba
Tenga en cuenta que puede elegir cualquier otro símbolo o carácter X
, siempre que no sea un número entero positivo.
[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]
Este es el código golf , por lo que gana el envío con la menor cantidad de bytes
Respuestas:
Jalea , 8 bytes
Utiliza cualquier valor falso ( 0 o vacío iterable) para quitar.
Pruébalo en línea!
Cómo funciona
fuente
Python 2,
565350 bytesPruébalo en línea!
Dequeue es
-1
. Este truco permite un fácil corte pitónico de la cola.fuente
Mathematica, 102 bytes
Definitivamente no es la solución más corta, pero no pude resistirme porque es algo perverso.
Después de algunas funciones auxiliares, esto define una función pura que toma una cadena como entrada: en la cadena, los números están separados por comas (el espacio en blanco es opcional); el personaje dequeue es
"]"
; y la lista no tiene delimitadores en la parte frontal o posterior. Por ejemplo, el primer ejemplo en el OP se ingresaría como la cadena"45,],],37,20,],97,],85"
. La salida de la función es una lista de números.La función cuenta cuántas dequeues
"]"
hay en la cadena de entrada, agrega muchas copias"f["
al frente de la cadena y luego rodea todo"r[...]"
. En el ejemplo anterior, esto produce"r[f[f[f[f[45,],],37,20,],97,],85]"
; Observe que los soportes están equilibrados.Luego,
ToExpression
interpreta la cadena resultante como un fragmento de código de Mathematica y la ejecuta. La funciónf
se define convenientemente para retener todos sus argumentos, excepto el primero (y también ignora las comas finales; de todos modos, esto es necesario para manejar la eliminación de colas vacías) yr
convierte la secuencia resultante de números en una lista de números en el orden correcto.fuente
b___,
destinada a estar allí? Se trabaja , pero la coma se vuelve rojo a causa de ella. (también, ¿cuál es la diferencia entre las líneas 2 y 3?)f[a_,b___]:=b
(sin la coma), mientras que la línea 3 es equivalente af[a_,b___,Null]:=b
. En ambos casos, seb___
refiere a cualquier número de argumentos (incluido ninguno). La línea 3 es más específica, por lo que siempre se usa antes de la línea 2 cuando corresponde. Entonces la funciónf
ignora su primer argumento, y también ignora su último argumento si ese argumento esNull
. Esto fue necesario para manejar la extracción de una cola vacía. Tenga en cuenta que una entrada típica producirá una expresión comor[f[f[f[5,3,],2,],],11]
, donde cada coma antes]
denota nuevamente aNull
.Retina , 30 bytes
Pruébalo en línea!
Repetidamente elimina el primer número que (no necesariamente inmediatamente) seguido de un
X
junto con eseX
, o unX
al comienzo de la cadena. Luego invierte los números restantes.fuente
JavaScript,
7063535043 bytesGracias @Neil por jugar 10 bytes con x.map en lugar de bucle y expresión ternaria
Gracias @Arnauld por jugar 3 bytes
Gracias @ETHproductions por jugar golf en 7 bytes
Pruébalo en línea!
Dequeue puede ser cualquier valor no numérico que no sea verdadero.
fuente
if
declaración, y aún más corto si usara enmap
lugar de un bucle, e incluso más corto si usara una expresión en lugar de un bloque. Mira los consejos .x=>(t=[],x.map(a=>a>0?t.unshift(a):t.pop()),t)
para ahorrar bastantes bytes en elreturn
x=>x.map(a=>a>0?t.unshift(a):t.pop(),t=[])&&t
Es aún más corto.a?
suficiente, supongo?)Mathematica,
4645 bytesGracias a ngenisis por guardar 1 byte.
Básicamente lo mismo que mi respuesta Retina, usando la coincidencia de patrones. Emparejamos repetidamente el primero
X
y lo eliminamos junto con el primer número (si existe). Una vez que terminamos, revertimos la lista.fuente
Pure Bash, 72
Entrada dada como parámetros de línea de comando.
Pruébalo en línea .
fuente
Haskell, 41 bytes
fuente
x&(y:z)
MATL ,
1312 bytesLa entrada es una matriz de números, con
0
"dequeue".La salida es números separados por espacios. Un resultado vacío se muestra como nada.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Haskell,
4140 bytesLa función es
foldl(#)[]
(también incluida en el bytecount con un byte de separación en el medio)Pruébalo en línea!
X es cualquier número entero no positivo
EDITAR: -1 byte gracias a nimi
fuente
|l>[]=init l|1>0=l
Julia,
78767357 bytesGracias a Harrison Grodin por algunas excelentes sugerencias de golf de Julia. Reemplazado if / else con ternary y for / end con comprensión de lista para un ahorro de 16 bytes.
Se eliminaron algunos espacios innecesarios para un ahorro de 3 bytes.
Antes de que se permitieran números negativos o cero:
Sin golf:
Soy bastante nuevo para Julia; Puede haber una mejor manera. Utiliza
:X
para X, que es un símbolo en Julia. Actualizado: ahora que 0 está permitido, usa 0 (o cualquier número negativo) para X, guardando dos caracteres. Se actualizó nuevamente para eliminar algunos espacios en blanco que no sabía que no eran necesarios.fuente
05AB1E ,
1211 bytesSalvó un byte gracias a Riley
Pruébalo en línea!
Explicación
Los retrasos se denotan con cualquier letra .
fuente
GNU Sed, 43
La puntuación incluye +2 por el uso de las banderas
-r
y-n
.Pruébalo en línea .
Explicación
fuente
PHP, 85 bytes
-8 bytes en
$v
lugar deis_int($v)
si cada valor de la cola pertenece a falsofuente
Python 3 ,
9594 bytesPruébalo en línea!
También 94 bytes:
fuente
Perl 5 , 28 + 1 = 29 bytes
28 bytes de código +
-p
bandera.Pruébalo en línea!
Utiliza una cadena (
$\
) como cola: cuando la entrada contiene un número entero (/\d/?
, lo agregamos al principio de$\
($\=$_.$\
), y de lo contrario, eliminamos el último cons/.*\n$//
. Al final,$\
se imprime implícitamente gracias a-p
flag (y los inigualables}{
)Otros enfoques:
33 bytes , usando una matriz como la cola (creo que es la forma más natural de hacerlo en Perl, pero no la más corta):
Pruébalo en línea!
52 bytes , usando expresiones regulares y
reverse
(resulta ser exactamente lo mismo que la respuesta Retina de Martin Ender, gracias a quien guardé 2 bytes en él). Sin embargo, invertir la lista requiere muchos caracteres, porque para preservar los enteros, tengo que convertir la cadena en una matriz para invertirla, luego volver a una cadena para imprimirla. (ensay for
lugar de$_=join$",
puede guardar 2 bytes, pero requiere-E
o-M5.010
y no es tan interesante).Pruébalo en línea!
fuente
Python 3, 107 bytes
Dequeuer puede ser cualquier valor no numérico.
Pruébalo en línea
fuente
Lote, 160 bytes
Esto fue más difícil de lo necesario.
Esto significa que yo a) necesito tener un marcador de fin de cola, que no se elimine, yb) tengo que manipular la cola de atrás hacia adelante, para que se inserten nuevos elementos justo antes del marcador de fin, para que los elementos antiguos se puedan quitar desde el frente, lo que significa que c) tengo que invertir la cola antes de imprimirla.
fuente
PHP, 70 bytes
fuente
C #, 115 bytes +33 bytes para usar
Método anónimo que devuelve una lista de enteros después de realizar las operaciones de puesta en cola y retirada de cola. Los enteros negativos se usan para eliminar elementos de la cola.
Programa completo con método no protegido y casos de prueba:
fuente
Scala, 97 bytes
Como entrada,
f
toma una lista con0
el elemento "dequeue". Utiliza la recursividad de cola con un segundo parámetro (b
), que actúa como un acumulador. Inicialmente,b
es el vacíoSeq
(Nil
).Explicaciones:
Nota:
b dropRight 1
se utiliza en lugar deb.tail
a excepción evite:tail of empty list
.Casos de prueba :
f
También puede funcionar con otros tipos (String
,char
, ..., incluso heterogénea lista de esos tipos!):fuente
REXX, 115 bytes
Toma una cadena separada por espacios, imprime una cadena separada por espacios
fuente
C ++,
122119 bytes0 indica una cola.
Pruébalo en línea!
fuente
Swift 3, 70 bytes
Asumiendo que tenemos una serie de Ints como
let x = [1, 2,-1,3,-1,4]
Tenga en cuenta que
[].prefix(0)
es una forma furtiva de obtener un ArraySlice vacíofuente