No puedo creer que aún no tengamos esto ... Es una de las estructuras de datos más importantes en la programación, pero aún así es lo suficientemente simple como para implementarlo en un código de golf :
Desafío
Su tarea es implementar una pila que permita empujar y reventar números, para probar su implementación y mantener la E / S simple. Usaremos la siguiente configuración:
- La entrada será una lista de enteros no negativos
Cada entero positivo indica un y cada indica un , descartando el elemento superior.push ( n ) 0 pop ()
- La salida será la pila resultante
Ejemplo
Por ejemplo, si se nos da :
La producción será:
Reglas
- La entrada será una lista de enteros no negativos en cualquier formato de E / S predeterminado
- puede usar un entero negativo para indicar el final de una secuencia de enteros
- La salida será una lista / matriz / ... de la pila resultante
- Si elige dónde estará el elemento superior (al principio o al final), la salida solo debe ser coherente
- la salida es flexible (por ejemplo, los enteros separados por nuevas líneas estarían bien), lo único que importa es el orden
- puedes usar un número entero negativo para indicar la parte inferior de la pila
- Tienes la garantía de que nunca habrá un cuando la pila esté vacía
Ejemplos
[] -> []
[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]
Respuestas:
MATL , 6 bytes
La entrada es un vector fila de números.
La pila final se muestra al revés, con el elemento más reciente a continuación.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Java (JDK 10) , 42 bytes
Como "[la] salida es flexible [...], lo único que importa es el orden", esto cambia la matriz de entrada en una
0
matriz terminada. Ejemplo:[1,0,2]
devolverá[2,0,2]
lo que debe interpretarse como = .[2
,0,2
]
[2]
Pruébalo en línea!
Versión anterior:
Java (JDK 10) , 60 bytes
Pruébalo en línea!
Créditos
Si puedo finalizar el programa con errores: 55 bytes
(aunque todo está modificado correctamente)
Pruébalo en línea!
fuente
>0
ya que nunca habrá un cero al comienzo de la lista (lo que implicaría que la parte superior de la pila estaba en-1
).Sed, 17 bytes
:;s/[0-9]\+,0//;t
-3 bytes gracias a @ OMᗺ, -1 gracias a @eggyal
Como se garantiza que nunca aparecerá una lista vacía, no necesita nada más que una máquina de estados finitos iterada. Las expresiones regulares son una herramienta para construir máquinas de estados finitos y
sed
pueden iterar. Es un partido hecho en el cielo.Toma información de stdin, así:
echo '[12,3,0,101,11,1,0,0,14,0,28]' | sed ':;s/[0-9]\+,0,//;t'
Emite la pila en reversa:
[12,101,28]
Podría ser más pequeño en dos bytes si mis
sed
clases de caracteres locales entendían inherentemente\d
, pero por alguna razón no lo hace.fuente
g
es redundante, lo que le ahorra 4 bytes: ¡ Pruébelo en línea!PowerShell ,
464140 bytesPruébalo en línea!
Toma información a través de salpicaduras, por ejemplo
$z=@(12,3,0,101,11,1,0,0,14,0,28); .\implement-stack.ps1 @z
, que en TIO se manifiesta como argumentos separados.-5 bytes gracias a mazzy.
-1 byte intercambiando
$_
a1
fuente
$agrs
? :)$args|%{$x,$a=&({$_,$_+$a},{$a})[!$_]};$a
?.\implement-stack.ps1 @z
(no$z
), si no estás de paso una matriz como la primera único argumento /C (gcc) ,
62605655 bytes-2-6 bytes gracias a l4m2-1 byte gracias a ceilingcat .
Utiliza la noción permitida de arrays terminados en -1.
f()
se llama recursivamente, hasta que está completamente enrollado, y luego retrocede en la lista.r
realiza un seguimiento de cuántos números descartar antes de imprimir algo. Aumenta si el elemento actual es 0, disminuye de lo contrario. Si es 0, no necesitamos descartar, y podemos imprimir el número.Pruébalo en línea!
fuente
f(l)int*l;
=>f(int*l)
?r=0
parece inútilHaskell, 28 bytes
Pruébalo en línea!
fuente
R , 45 bytes
Pruébalo en línea!
fuente
F
también lo llevará a 48 bytes, pero esto es más limpioR+pryr
y laReduce
solución es de 44 bytesPython 2 ,
595751 bytesPruébalo en línea!
fuente
Jalea , 6 bytes
Pruébalo en línea!
Cómo funciona
fuente
[1,3,7,0,0,0]
, por ejemplo, se divide en[[1,3,7],[],[],[]]
, y cada paso de la reducción izquierda aparece en el elemento de la matriz izquierda.Brain-Flak ,
4036 bytesPruébalo en línea!
Gracias a @Nitrodon por -4 bytes.
Como Brain-Flak ya usa pilas, este es un buen rompecabezas para Brain-Flak.
fuente
{{}<>{}<>}
se puede acortar a{{}<>}
.Wolfram Language (Mathematica) , 28 bytes
Pruébalo en línea!
fuente
b
es distinto de cero.)a___
primero intenta hacer coincidir el más corto posible . Uno puede ver eso al intentarloReplaceList[#, {a___, b_, 0, c___} :> {a, c}] &
. En una nota relacionada, enStringReplace
realidad es codicioso, por lo que esta presentación no funcionaríaStringReplace
(con un patrón similara___~~b_~~"0"~~c___
)Python 2 , 48 bytes
Pruébalo en línea!
fuente
2*0**x
siempre lo será0
. Obviamente me estoy perdiendo algo.x=0
, en cuyo caso son 2.Espacio en blanco , 89 bytes
Se agregaron letras
S
(espacio),T
(tabulación) yN
(nueva línea) solo como resaltado.[..._some_action]
agregado solo como explicación.Toma la lista de entrada nueva línea separada con
-1
para indicar que hemos terminado con las entradas.Pruébalo en línea .
Explicación en pseudocódigo:
fuente
Python 2 ,
60595756 bytesPruébalo en línea!
Salvado:
fuente
0
yin
JavaScript, 40 bytes
Salidas en orden inverso.
Pruébalo en línea
1 byte salvó gracias a Herman L .
fuente
a=>a.map(x=>x?o.push(x):o.pop(),o=[])&&o
es un byte más corto(un)shift
antes de detectar que la salida podría revertirse.o
se hace referencia en la devolución de llamada después de que se define en el segundo argumento.05AB1E , 9 bytes
Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
Alternativa de 9 bytes :
Pruébelo en línea de verificar todos los casos de prueba .
Explicación:
PD: Si la salida debería haberse invertido para que coincida con los casos de prueba en la descripción del desafío, podemos agregar un seguimiento
R
a la segunda versión (por lo tanto, 10 bytes ), que invierte la lista. Pruébelo en línea o verifique todos los casos de prueba .fuente
Retina 0.8.2 , 18 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Prefijar un extra
,
.Procesar todas las operaciones pop.
Retire el
,
si todavía está allí.Invertir los números costaría 8 bytes adicionales:
fuente
<number>, 0
sublista por nada.Ruby , 36 bytes
Pruébalo en línea!
Lambda anónima. Salidas en orden inverso.
fuente
Brain-Flak , 36 bytes
Pruébalo en línea!
fuente
Brain-Flak , 32 bytes
Pruébalo en línea!
Se utiliza
-1
para significar el final de la matriz (pero cualquier número lo hará realmente).fuente
V , 10 bytes
Pruébalo en línea!
Explicación
Equivalente en Vim , 16 bytes.
Pruébalo en línea!
Explicación
Más o menos lo mismo, excepto grabar una macro
q
y llamarla recursivamente:fuente
Java 10,
7572 bytesSalidas separadas por una coma. La parte superior de la pila es la última. Pruébelo en línea aquí .
Gracias a Olivier Grégoire por jugar al golf 2 bytes.
Consulte también las respuestas Java de Kevin Cruijssen y Olivier Grégoire . En su lugar, adoptan un enfoque basado en listas, y este último supera al mío por un margen ordenado.
Sin golf:
fuente
Stack
. +1 de mi parten->{var s="";for(int i:n)s=(s+","+i).replaceAll(",\\d+,0$","");return s;}
(73 bytes), pero pone los,
números antes, no después.n->{var s=""+n;for(int x:n)s=s.replaceFirst("\\d+, 0,? ?","");return s;}
(72 bytes), usa una lista en lugar de una matriz y se mete con la salida porque puede devolver cosas como "[, 2]"$
para guardar un byte adicional, ya que cada uno0
que agregamos se elimina de inmediato.GolfScript ,
1412 bytesPruébalo en línea!
fuente
Perl 5
-p
, 17 bytesGracias @sundar y @DomHastings
Pruébalo en línea!
fuente
> <> , 25 bytes
Pruébalo en línea! (la entrada debe estar escrita en ascii. de lo contrario, use esta )
Cómo funciona
i:?\~~
comprueba 0, continúa~~
eliminando la entrada anterior. de lo contrario, vaya a:(0:/:^?
que comprueba -1 (no más entradas), luego termina para eliminar -1 y repite:!?l:!<oan;
que genera cada número con una nueva línea, luego termina cuando la pila se vacíafuente
Casco , 6 bytes
Ya que no hay respuesta de Husk y es mi golf-lang favorito:
Pruébalo en línea!
Explicación
Solución alternativa, 6 bytes.
En lugar de voltear, también podemos revertir la lista y luego usar un doblez derecho:
Ḟ?:tø↔
fuente
brainfuck ,
214150 bytesLee la entrada como números separados por nuevas líneas. Esto debe incluir una nueva línea final. También no espera ceros a la izquierda en cada número. Salida como una lista separada de nueva línea similar
Pruébalo en línea!
Explicación
que no es realmente una explicación, pero en realidad es solo la versión en la que estaba trabajando con los comentarios y cosas que pueden o no ser útiles para cualquierafuente
Brachylog , 21 bytes
Pruébalo en línea!
-1 byte, y lo más importante, esto se siente como una forma mucho menos torpe de hacer esto.
Alterno 21 byter: ¡
∋0∧ℕ₁;0;P↺c;Qc?∧P,Q↰|
Pruébelo en línea!Código anterior:
22 bytes
Pruébalo en línea!
fuente
Advertencia: muchas líneas siguen. Usted ha sido advertido.
CJam , 17 bytes
Código más peligroso
(Asume que los elementos de la pila pueden estar separados solo por espacios en la salida y que la matriz de entrada puede tener la forma que deseemos)
Pruébalo en línea!
Explicación
Código alternativo n. ° 1, 27 bytes
(se supone que los elementos de la pila deben enviarse en el formato que se muestra en la pregunta y que la matriz de entrada puede tener la forma que deseemos)
Pruébalo en línea!
Explicación
Código alternativo n. ° 2, 24 bytes
(se supone que los elementos de la pila se pueden clasificar en la salida y que la matriz de entrada debe estar en el formato exacto que se muestra en la pregunta)
Pruébalo en línea!
Explicación
El código más seguro para esto es de 34 bytes
(se supone que los elementos de la pila deben enviarse en el formato que se muestra en la pregunta y que la matriz de entrada debe estar en el formato exacto que se muestra en la pregunta)
Pruébalo en línea!
Explicación
Gracias a @Jo King por señalar que los que tienen la salida clasificada no son válidos, ya que cosas como
[12]
y[1,2]
serían indistinguibles.¡Gracias también a @Jo King por proporcionar una alternativa muy adecuada para las salidas clasificadas y cortar 9 bytes!
fuente
[12]
y[1,2]
. Sin embargo, la versión de 27 bytes parece estar bien, aunque puede deshacerse del espacio en blanco y los corchetes para 18 bytes]S*
(3) mientras que las comas usan]',*
(4)Rojo , 64 bytes
Pruébalo en línea!
fuente