Eliminar ceros iniciales y finales

31

Dada una lista / matriz no vacía que contiene solo enteros no negativos como este:

[0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 0, 0, 0]

Salida de la lista con ceros a la izquierda y al final eliminados.

El resultado para esto sería:

[8, 1, 4, 3, 5, 6, 4, 1, 2]

Algunos otros casos de prueba:

[0, 4, 1, 2, 0, 1, 2, 4, 0] > [4, 1, 2, 0, 1, 2, 4]
[0, 0, 0, 0, 0, 0] > nothing
[3, 4, 5, 0, 0] > [3, 4, 5]
[6] > [6]

El código más corto gana

Lamaro
fuente
¿Son los números enteros no negativos solamente? Le sugiero que aclare eso o agregue casos de prueba con otros números
Luis Mendo
1
¿Podemos suponer que habrá al menos un 0 inicial y uno posterior?
DJMcMayhem
44
¿Qué no constituye nada? Puedo pensar en varias cosas diferentes que son variaciones de nada en Perl 6. Nil ()/ [] slip()/ Empty Any {}algunas de ellas son indefinidas, algunas definidas pero singulares, algunas que se incluyen en otras listas para que no aumenten el número de elementos. (Hay tantas variaciones diferentes Anycomo clases / tipos y roles)
Brad Gilbert b2gills
77
¿Es una coincidencia que no haya enteros superiores a 10 o podemos suponer que todos los números serán de un solo dígito?
Un Simmons
1
¿Podemos ingresar / emitir la lista como una cadena delimitada? Por ejemplo: "0,4,1,2,0,1,2,4,0" => "4,1,2,0,1,2,4"EDITAR: Acabo de notar que muchos idiomas ya hacen esto.
Mwr247

Respuestas:

25

Jalea , 2 bytes

Código:

t0

Explicación:

t   # Trim off...
 0  #  zero at both sides

Pruébalo en línea!

Adnan
fuente
10
¿Esto funciona? Dios. Pensé que las respuestas de MATL eran una locura.
Skyl3r
44
wut y no don do dis jelly
Addison Crump
Por supuesto, Jelly supera a todos los demás por ahí casi todas las veces ...
Erik the Outgolfer
¿Se utiliza Jelly en negocios reales?
Chromozorz el
Hombre, espero que no
Caleb Paul
10

JavaScript (ES6) 43

a=>(f=a=>a.reverse().filter(x=>a|=x))(f(a))

Menos golf

a=>{
  f=a=>a.reverse().filter(x=>a|=x) // reverse and remove leading 0
  // leverage js cast rules: operator | cast operands to integer
  // an array casted to integer is 0 unless the array is made of
  // a single integer value (that is ok for me in this case)
  return f(f(a)) // apply 2 times
}

Prueba

F=a=>(f=a=>a.reverse().filter(x=>a|=x))(f(a))

function test(){
  var l=(I.value.match(/\d+/g)||[]).map(x=>+x)
  O.textContent=F(l)
}

test()
#I { width:90%}
<input id=I oninput='test()' value='0 0 1 3 7 11 0 8 23 0 0 0'>
<pre id=O></pre>

edc65
fuente
1
Agradable. f=(a,r=f(a,a))=>r.reverse().filter(x=>a|=x)también es de 43 bytes.
Neil
6

CJam, 13 bytes

l~{_{}#>W%}2*

Con la matriz ingresada.

Versión más larga:

l~             Puts input on the stack and parse as array
  {       }    Code block
   _           Duplicate the first thing on the stack
    {}#        Finds the index of the first non-0 value in the array, puts it on the stack
       >       Slices the array from that index
        W%     Reverses the array
           2*  Does the code block twice in total
Angela Xu
fuente
Desearía poder usar el hecho de que convertir hacia y desde una base eliminaría los ceros a la izquierda, pero parece que es demasiado largo.
Esolanging Fruit
5

Pyth, 4 bytes

.sQ0

Manifestación:

llama@llama:~$ pyth -c .sQ0
[0, 0, 0, 1, 2, 0, 3, 4, 0, 0, 5, 0, 0, 0, 0]
[1, 2, 0, 3, 4, 0, 0, 5]

De Pyth'srev-doc.txt :

.s <seq> <any>
    Strip from A maximal prefix and suffix of A consisting of copies of B.
Pomo de la puerta
fuente
5

05AB1E , 4 bytes

Código:

0Û0Ü

Pruébalo en línea!

Explicación:

0Û    # Trim off leading zeroes
  0Ü  # Trim off trailing zeroes

Utiliza la codificación CP-1252.

Adnan
fuente
5

R, 43 bytes

function(x)x[cummax(x)&rev(cummax(rev(x)))]

o como lectura / escritura STDIN / STDOUT

x=scan();cat(x[cummax(x)&rev(cummax(rev(x)))])

Esto encuentra el máximo acumulativo desde el principio y la cadena final (invertida). El &operador convierte estos dos vectores en uno lógico del mismo tamaño que x, (los ceros siempre se convertirán a FALSEy todo lo demás a TRUE), de esta manera hace posible el subconjunto de xacuerdo con las condiciones cumplidas.

David Arenburg
fuente
5

Haskell , 29 bytes

t=f.f;f=reverse.dropWhile(<1)
Itai Bar-Natan
fuente
4

Mathematica 34 27 bytes

#//.{0,a___}|{a___,0}:>{a}&

Esto aplica repetidamente reglas de reemplazo hasta que dicha acción no proporcione una nueva salida. 7 bytes guardados gracias a Alephalpha.

La primera regla elimina un cero al principio; la segunda regla elimina un cero al final de la matriz.

DavidC
fuente
3
#//.{0,a___}|{a___,0}:>{a}&
alephalpha
4

05AB1E, 4 bytes

0Û0Ü

Básicamente, recortar los ceros iniciales y finales de la entrada, dados como una matriz.

Pruébalo en línea!

Paul Picard
fuente
3

Perl, 19 + 1 = 20 bytes

s/^(0 ?)+|( 0)+$//g

Requiere -pbandera:

$ perl -pE's/^(0 )+|( 0)+$//g' <<< '0 0 0 1 2 3 4 5 6 0 0 0'
1 2 3 4 5 6
andlrc
fuente
@ MartinBüttner Pensé en lo mismo justo después de presionar [Agregar comentario], ahora solo necesito averiguar ahora para dejar que Markdown guarde mi nueva línea en un bloque de código
andlrc
A través de malvados hacks HTML. ;)
Martin Ender
1
17 + 1 bytes:s/^0 | 0$//&&redo
Kenney
@Kenney Eso es hermoso :-) ¡Deberías publicar eso como respuesta!
andlrc
¡Gracias! Mi original también tenía 19 + 1 bytes, pero luego vi tu respuesta, lo que me dio la idea de eliminar 2 más, así que es tuyo si lo deseas. Por cierto, su respuesta es 18 + 1 si se le cae el ?como en el ejemplo - pero eso no va a reducir "0"..
Kenney
3

Jalea, 10 bytes

Uo\U,o\PTị

Esto no usa el incorporado.

Uo\U            Backward running logical OR
    ,           paired with
     o\         Forward running logical OR
       P        Product
        T       All indices of truthy elements
         ị      Index the input at those values.

Probarlo aquí .

lirtosiast
fuente
3

Perl, 38 bytes

$\.=$_}{$\=~s/^(0\n)*|(0\n)*\n$//gs

Ejecutar con perl -p, (3 bytes agregados para-p ).

Acepta números en STDIN, uno por línea; emite números en STDOUT, uno por línea, como debería hacerlo una utilidad Unix con buen comportamiento.

Solo trata los números representados exactamente por '0' como ceros; sería posible soportar otras representaciones con unos pocos bytes más en la expresión regular.

Versión más larga, aún por ejecutar con -p:

    # append entire line to output record separator
    $\.=$_
}{
    # replace leading and trailng zeroes in output record separator
    $\ =~ s/^(0\n)*|(0\n)*\n$//gs
    # output record separator will be implicitly printed

Versión ampliada, que muestra interacciones con el indicador -p:

# implicit while loop added by -p
while (<>) {
    # append line to output record separator
    $\.=$_
}{ # escape the implicit while loop
    # replace leading and traling 
    $\=~s/^(0\n)*|(0\n)*\n$//gs
    # print by default prints $_ followed by
    # the output record separator $\ which contains our answer
    ;print # implicit print added by -p
} # implicit closing brace added by -p
David Morris
fuente
Suponiendo que esté ejecutando perl -E, la -pbandera generalmente solo se cuenta como un byte, ya que solo hay un byte adicional diferente entre eso y perl -pE.
Chris
3

Elixir, 77 bytes

import Enum
z=fn x->x==0 end
reverse(drop_while(reverse(drop_while(l,z)),z))

l es la matriz.

Editar: wah! copia / pasta falla. por supuesto, uno tiene que importar Enum, que aumenta el recuento de bytes en 12 (o usar Enum.function_name, lo que lo hará aún más largo).

srecnig
fuente
3

Vitsy, 13 bytes

Vitsy está mejorando lentamente ... (Voy por ti, Jelly. ಠ_ಠ)

1mr1m
D)[X1m]

Esto sale con la matriz en la pila. Para facilitar la lectura, el TryItOnline! El enlace que he proporcionado debajo de la explicación generará una lista formateada.

Explicación:

1mr1m
1m      Do the second line of code.
  r     Reverse the stack.
   1m   I'ma let you figure this one out. ;)

D)[X1m]
D       Duplicate the top item of the stack.
 )[   ] If the top item of the stack is zero, do the stuff in brackets.
   X    Remove the top item of the stack.
    1m  Execute the second line of code.

Tenga en cuenta que esto generará una StackOverflowException para entradas excesivamente grandes.

TryItOnline!

Addison Crump
fuente
2
Vitsy recibirá a Jelly algún día.
Conor O'Brien
Agregar coincidencia automática de paréntesis en EOL / EOF
Cyoce
3

R, 39 bytes

function(x)x[min(i<-which(x>0)):max(i)]

Cuatro bytes menos que la respuesta R de David Arenburg . Esta implementación encuentra el primer y el último índice en la matriz que es mayor que cero, y devuelve todo en la matriz entre esos dos índices.

rturnbull
fuente
3

MATL , 9 bytes

2:"PtYsg)

Pruébalo en línea!

Explicación

2:"     % For loop (do the following twice)
  P     %   Flip array. Implicitly asks for input the first time
  t     %   Duplicate
  Ys    %   Cumulative sum
  g     %   Convert to logical index
  )     %   Apply index
        % Implicitly end for
        % Implicitly display stack contents
Luis Mendo
fuente
2

Dyalog APL, 15 bytes

{⌽⍵↓⍨+/0=+\⍵}⍣2

               ⍣2     Apply this function twice:
{             }       Monadic function:
           +\⍵        Calculate the running sum.
       +/0=           Compare to zero and sum. Number of leading zeroes.
   ⍵↓⍨               Drop the first that many elements from the array.
 ⌽                   Reverse the result.

Probarlo aquí .

lirtosiast
fuente
¿Qué tal {⌽⍵/⍨×+\⍵}⍣2?
lstefano
2

Rubí, 49 44 bytes

->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}

Gracias a manatwork por cortar 5 bytes con un método completamente diferente!

Este dropes solo el primer elemento de la matriz while, es 0, invierte la matriz, se repite y finalmente invierte la matriz para devolverla al orden correcto.

Perilla de la puerta
fuente
Ay. Ahora, incluso una .drop_while()solución basada sería más corta (si usa 2 funciones):f=->a{a.drop_while{|i|i<1}.reverse};->a{f[f[a]]}
manatwork
Doh No hay necesidad de 2 funciones, sólo algunas evalfealdad: ->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}.
manatwork
@manatwork No estoy seguro de por qué no pensé <1, de todos modos. ¡Gracias!
Pomo de la puerta
2

Vim 16 pulsaciones de teclas

i<input><esc>?[1-9]<enter>lD0d/<up><enter>

El usuario debe escribir la entrada entre iy esc, y no cuenta como una pulsación de tecla. Esto supone que habrá al menos un cero inicial y uno posterior. Si esa no es una suposición válida, podemos usar esta versión un poco más larga: (18 pulsaciones de teclas)

i <input> <esc>?[1-9]<enter>lD0d/<up><enter>
DJMcMayhem
fuente
1
No creo que necesite incluir código para permitir que el usuario ingrese los números ( iy <esc>). En vim golf, el golfista comienza con la entrada ya cargada en el archivo del búfer y el cursor en la esquina superior izquierda, pero el usuario también tiene que guardar y salir ( ZZgeneralmente es la forma más rápida). Entonces podrías hacer algo como d[1-9]<enter>$NlDZZ(13 pulsaciones de teclas). Nota N/ en nlugar de/<up><enter>
daniero
2

ES6, 51 bytes

f=a=>a.map(x=>x?t=++i:f<i++||++f,f=i=0)&&a.slice(f,t)

tse establece en el índice después del último valor distinto de cero, mientras que fse incrementa siempre que solo se hayan visto ceros hasta ahora.

Neil
fuente
2

Perl 6 , 23 bytes

{.[.grep(?*):k.minmax]}
{.[minmax .grep(?*):k]}

Uso:

# replace the built-in trim subroutine
# with this one in the current lexical scope
my &trim = {.[.grep(?*):k.minmax]}

say trim [0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 0, 0, 0];
# (8 1 4 3 5 6 4 1 2)
say trim [0, 4, 1, 2, 0, 1, 2, 4, 0];
# (4 1 2 0 1 2 4)
say trim [0, 0, 0, 0, 0, 0];
# ()
say trim [3, 4, 5, 0, 0];
# (3 4 5)
say trim [6];
# (6)
Brad Gilbert b2gills
fuente
2

Retina, 11 bytes

+`^0 ?| 0$
<empty>

Bastante sencillo. Reemplaza recursivamente ceros al principio y al final de la línea.

Pruébalo en línea!

Mama Fun Roll
fuente
2

JavaScript (ES6), 47 bytes

a=>a.join(a="").replace(/(^0+|0+$)/g,a).split(a)

¿Dónde aestá la matriz?

usuario2428118
fuente
44
Creo que se necesita para hacer una función anónima a la entrada de la toma: a=>a.join(a="")....
andlrc
2
Esto solo maneja enteros correctamente cuando son un solo dígito
Aross
@ dev-null Hecho.
user2428118
Todavía regresa mal para enteros de varios dígitos. [14]devolverá [1, 4].
Mwr247
En realidad, todavía estaba (y estoy) esperando una respuesta a este comentario . De todos modos, desafortunadamente no veo una manera de manejar enteros de varios dígitos usando la misma técnica que usé para mi respuesta y no creo que pueda superar esta respuesta de todos modos. Sin embargo, puedo intentarlo cuando tenga tiempo.
user2428118
2

Python, 84 caracteres

def t(A):
 if set(A)<={0}:return[]
 for i in(0,-1):
  while A[i]==0:del A[i]
 return A
pafcjo
fuente
Tu puedes hacer for i in-1,0:
mbomb007
Cuento 86 bytes.
Erik the Outgolfer
2

JavaScript (ES6), 34 bytes

a=>a.replace(/^(0 ?)*|( 0)*$/g,'')

La entrada y la salida tienen la forma de una lista delimitada por espacios, como "0 4 1 2 0 1 2 4 0".

Mwr247
fuente
2

Javascript (ES6) 40 bytes

a=>/^(0,)*(.*?)(,0)*$/.exec(a.join())[2]
Shaun H
fuente
2

PHP, 56 54 52 bytes

Utiliza la codificación de Windows-1252

Solución basada en cadenas

<?=preg_replace(~ÜÒ×ßÏÖÔƒ×ßÏÖÔÛÜ,"",join($argv,~ß));

Corre así:

echo '<?=preg_replace(~ÜÒ×ßÏÖÔƒ×ßÏÖÔÛÜ,"",join($argv,~ß));' | php -- 0 0 123 234 0 500 0 0 2>/dev/null;echo

Si su terminal está configurado en UTF-8, esto es lo mismo:

echo '<?=preg_replace("#-( 0)+|( 0)+$#","",join($argv," "));' | php -- 0 0 123 234 0 500 0 0 2>/dev/null;echo

Ajustes

  • Ahorró 2 bytes al negar cadenas y quitar delimitadores de cadena
  • Se guardaron 2 bytes mediante el uso de una etiqueta de impresión corta
aross
fuente
1
¿Puede proporcionar una solución ASCII? ¡Nadie puede leer esto!
Titus
1
@Titus Claro. Sin embargo, hay muchos esolangs ilegibles por ahí ... no es que mi respuesta no se sienta como en casa.
aross
¿Una matriz como primer parámetro de unión?
Jörg Hülsermann
1
@ JörgHülsermann Sí. Está documentado al revés, pero acepta ambos.
aross
Tienes razón, no me he dado cuenta
Jörg Hülsermann
2

Python 2, 69 67 bytes

def f(a):
 for i in(0,-1):
  while a and a[i]==0:a.pop(i)
 return a
SumnerHayes
fuente
Puede eliminar el espacio antes de su tupla en la segunda línea.
Zach Gates
Tu puedes hacer for i in-1,0:
mbomb007
Además, es posible que desee contar sus bytes. Cuento 67 como es. También puede reemplazar [space][space]whilecon [tab]while. Y ==0puede ser <1. mothereff.in/…
mbomb007
Cuento 67 bytes.
Erik the Outgolfer
1

PowerShell, 49 bytes

($args[0]-join',').trim(',0').trim('0,')-split','

Toma entrada $args[0] y -joinlos une con comas para formar una cadena. Luego usamos el.Trim() función llamada dos veces para eliminar primero el final y luego los ceros y las comas iniciales. Luego, -splitla cadena de comas vuelve a una matriz.


Versión alternativa, sin usar conversión
PowerShell de , 81 bytes

function f{param($a)$a=$a|%{if($_-or$b){$b=1;$_}};$a[$a.Count..0]}
f(f($args[0]))

Como PowerShell no tiene una función para recortar matrices, definimos una nueva función fque hará la mitad de esto por nosotros. La función toma $acomo entrada, luego recorre cada elemento con un bucle foreach |%{...}. Cada iteración, verificamos un condicional para $_ -or $b. Como los enteros distintos de cero son verdaderos, pero $nullfalsey (y$b , al no estar previamente definidos, comienzan como $null), esto solo se evaluará $trueuna vez que alcancemos nuestro primer elemento no cero en la matriz. Luego establecemos $b=1y agregamos el valor actual $_en la tubería. Eso continuará hasta el final de la matriz de entrada, con ceros en el medio y el final se agregará a la salida, ya que hemos establecido la $bverdad.

Encapsulamos y almacenamos los resultados del bucle de nuevo en $a . Luego, indexamos $aen orden inverso (es decir, invirtiendo la matriz), que queda en la tubería y, por lo tanto, es el valor de retorno de la función.

Llamamos a la función dos veces en el $args[0] entrada del programa para "recortar" desde el frente, luego el frente nuevamente (que es el reverso, ya que invertimos). El orden se conserva porque estamos invirtiendo dos veces.

Esta versión juega un poco flojo con las reglas para una matriz de entrada de todos los ceros, pero dado que ignorar STDERR es una práctica aceptada, el programa escupirá dos Cannot index into a null arrayerrores (detallados) a STDERR (el equivalente de PowerShell) y luego no emitirá nada.

AdmBorkBork
fuente