Tomado de esta pregunta en Stack Overflow. Gracias también a @miles y @Dada por sugerir entradas de prueba que abordan algunos casos de esquina.
El reto
Dada una matriz de valores enteros, elimine todos los ceros que no estén flanqueados por algún valor distinto de cero.
De manera equivalente, una entrada debe mantenerse si es un valor distinto de cero o si es un cero que está inmediatamente cerca de un valor distinto de cero.
Las entradas que se mantienen deben mantener en la salida el orden que tenían en la entrada.
Ejemplo
Dado
[2 0 4 -3 0 0 0 3 0 0 2 0 0]
Los valores que deben eliminarse están marcados con x
:
[2 0 4 -3 0 x 0 3 0 0 2 0 x]
y entonces la salida debería ser
[2 0 4 -3 0 0 3 0 0 2 0]
Reglas
La matriz de entrada puede estar vacía (y luego la salida también debería estar vacía).
Los formatos de entrada y salida son flexibles como de costumbre: matriz, lista, cadena o cualquier cosa que sea razonable.
Código de golf, el menos mejor.
Casos de prueba
[2 0 4 -3 0 0 0 3 0 0 2 0 0] -> [2 0 4 -3 0 0 3 0 0 2 0]
[] -> []
[1] -> [1]
[4 3 8 5 -6] -> [4 3 8 5 -6]
[4 3 8 0 5 -6] -> [4 3 8 0 5 -6]
[0] -> []
[0 0] -> []
[0 0 0 0] -> []
[0 0 0 8 0 1 0 0] -> [0 8 0 1 0]
[-5 0 5] -> [-5 0 5]
[50 0] -> [50 0]
fuente
_2
lugar de-2
? Muchos idiomas usan ese formato.-0
?[010 0 0 01 1]
?Respuestas:
JavaScript (ES6), 35 bytes
Funciona también en flotantes para dos bytes adicionales.
fuente
Python, 50 bytes
Una función recursiva que toma una tupla. Incluye el primer elemento si hay un valor distinto de cero entre los dos primeros elementos o el valor anterior almacenado desde la última vez. Luego, elimina el primer elemento y vuelve a aparecer. El elemento anterior se almacena en la lista singleton
p
, que se empaqueta automáticamente en la lista y comienza como vacío (gracias a Dennis por 3 bytes con esto).55 bytes:
Genera todos los fragmentos de longitud 3 de la lista, primero coloca ceros al inicio y al final, y toma los elementos medios de aquellos que no son todos cero.
Un enfoque iterativo resultó más largo (58 bytes)
Esto no funciona exactamente porque
b,*l
necesita Python 3, pero Python 3input
da una cadena. La inicialización también es fea. Tal vez un enfoque recursivo similar funcionaría.Desafortunadamente, el método de indexación de
no funciona porque
l[-1:2]
interpreta-1
como el final de la lista, no un punto antes de su inicio.fuente
Haskell,
5548 bytesEjemplo de uso:
h [0,0,0,8,0,1,0,0]
->[0,8,0,1,0]
.scanr
reconstruye la lista de entradax
con un adicional0
al principio y al final. En cada paso, modelamos 3 elementos y mantenemos el medio si hay al menos un elemento distinto de cero.Gracias @xnor por 7 bytes cambiando de
zip3
ascanr
.fuente
h x=[snd t|t<-zip3(0:x)x$tail x++[0],(0,0,0)/=t]
, pero supongo que no hay una forma corta de obtener el segundo elemento de una tupla de 3.scan
de unzip3
:h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]]
.Matlab,
2927 bytesLa entrada debe consistir en una
1*n
matriz (donden=0
sea posible). (Lanzará un error para las0*0
matrices).fuente
's'
en lugar de'same'
<- :-D'UniformOutpout'
(comprensiblemente). Pero no sabía sobre esto~~a
lugar dea.*a
?logical
matrices. Esto a menudo es un problema para las incorporaciones que no están escritas en Matlab. De lo contrario, las matrices lógicas se comportan de manera muy parecida a las numéricas. Podría funcionar en el pensamiento de Octave, pero no lo tengo instalado en este momento.J,
1714 bytesGuardado 3 bytes con ayuda de @ Zgarb.
Uso
Explicación
Pruébalo aquí
fuente
0<
Funcionaría en lugar de0~:
?MATL , 8 bytes
La salida es una cadena con números separados por espacios. Una matriz vacía en la salida se muestra como nada (ni siquiera una nueva línea).
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
El código convierte la entrada al tipo lógico, es decir, las entradas distintas de cero se convierten en
true
(o1
) y las entradas de cero se convierten enfalse
(o0
). Esto luego está relacionado con el núcleo[1 2 3]
. Un valor distinto de cero provoca un resultado distinto de cero en esa posición y en sus posiciones vecinas. La conversión atrue
valores lógicos da valores que deben mantenerse, por lo que indexar la entrada con eso produce la salida deseada.fuente
Jolf, 14 bytes
Ahora que lo pienso, Jolf es el Java de los lenguajes de golf. suspiros Pruébalo aquí.
Explicación
fuente
Python 3, 55 bytes
fuente
Jalea , 9 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
fuente
Perl, 34 + 1 (
-p
bandera) = 35 bytesNecesita la bandera -p para ejecutarse. Toma una lista de números como imput. Por ejemplo :
fuente
5
si ingreso50 0
.Haskell, 48 bytes
Mira el elemento anterior
p
, el primer elementoh
y el elemento posterior (si lo hay), y si alguno no es cero, antepone el primer elementoh
.La condición
any(/=0)$p:h:take 1t
es larga, en particular latake 1t
. Buscaré una forma de acortarlo, tal vez por coincidencia de patrones.fuente
Retina ,
423533 bytes7 bytes gracias a Martin Ender.
La última línea es necesaria.
Verifique todas las cajas de prueba a la vez.(Ligeramente modificado para ejecutar todos los casos de prueba a la vez).
Parece el lenguaje perfecto para hacer esto ... todavía fue derrotado por la mayoría de las respuestas.
fuente
Mathematica, 43 bytes
fuente
C, 96 bytes
Llame
f()
con un puntero a la lista de enteros y un puntero al tamaño de la lista. La lista y el tamaño se modifican en el lugar.Pruébalo con ideone .
fuente
f(int*p,int*n)
guarda un byte. O defínalos
como un tercer parámetro (eso no se pasa. Está bastante bien).Brachylog ,
4438 bytesPruébalo en línea!
Este lenguaje es bueno para probar cosas, que es lo que usaremos.
Predicado 0 (predicado principal)
Predicado 1 (predicado auxiliar)
fuente
Matlab con caja de herramientas de procesamiento de imágenes, 27 bytes
Esta es una función anónima.
Ejemplo de uso:
fuente
imerode
también, pero mis versiones seguían siendo más largas que la actual, buen trabajo =)Bash + GNU utils, 25
Acepta entradas como una lista separada por una nueva línea.
Ideone : con código de controlador de prueba agregado para ejecutar todos los casos de prueba juntos mediante la conversión a / desde espacios separados y separados por líneas nuevas.
fuente
Cheddar , 78 bytes
Banco de pruebas.
Cheddar no tiene filtro, por lo que el filtrado se realiza envolviendo los elementos que queremos y transformando los elementos que no queremos en matrices vacías, y luego concatena todo.
Por ejemplo, se
[0,0,0,8,0,1,0,0]
convierte[[],[],[0],[8],[0],[1],[0],[]]
, y luego la matriz concatenada sería[0,8,0,1,0]
.fuente
.reduce((+))
->.sum
APL, 14 bytes
Prueba:
Explicación:
0,⍵,0
: agregue un cero al principio y al final de ⍵×3∨/
: encuentre el signo del MCD de cada grupo de tres números adyacentes (de lo contrario, será 0 si todos son cero y 1).⍵/⍨
: seleccione todos los elementos de ⍵ para los que el resultado fue 1.fuente
Ruby 2.x, 63 bytes
Crédito donde es debido, esto es esencialmente un puerto de la respuesta superior ES6 de Neil.
También es mi primera presentación de PCG. Hurra.
fuente
Brain-Flak 142 bytes
Pruébalo en línea!
Explicación
fuente