Dada uma lista / matriz não vazia contendo apenas números inteiros não negativos como este:
[0, 0, 0, 8, 1, 4, 3, 5, 6, 4, 1, 2, 0, 0, 0, 0]
Saída da lista com os zeros à direita e à esquerda removidos.
A saída para isso seria:
[8, 1, 4, 3, 5, 6, 4, 1, 2]
Alguns outros casos de teste:
[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]
O código mais curto vence
code-golf
array-manipulation
Lamaro
fonte
fonte
Nil
()
/[]
slip()
/Empty
Any
{}
algumas delas são indefinidas, algumas definidas, mas singulares, outras que se inserem em outras listas e não aumentam o número de elementos. (Existem tantas variações diferentes emAny
como existem classes / tipos e papéis)"0,4,1,2,0,1,2,4,0" => "4,1,2,0,1,2,4"
EDIT: Acabei de notar que muitos idiomas já fazem isso.Respostas:
Geléia , 2 bytes
Código:
Explicação:
Experimente online!
fonte
JavaScript (ES6) 43
Menos golfe
Teste
fonte
f=(a,r=f(a,a))=>r.reverse().filter(x=>a|=x)
também é 43 bytes.CJam, 13 bytes
Com a matriz inserida.
Versão mais longa:
fonte
Pitão, 4 bytes
Demo:
De Pyth's
rev-doc.txt
:fonte
05AB1E , 4 bytes
Código:
Experimente online!
Explicação:
Usa a codificação CP-1252.
fonte
Retina, 12 bytes
O avanço de linha à direita é significativo.
Agradecemos a @Martin Büttner e @FryAmTheEggman por salvar alguns bytes.
Experimente online
fonte
R, 43 bytes
ou como leitura / gravação STDIN / STDOUT
Este encontra o máximo cumulativo desde o início e a sequência final (invertida). O
&
operador converte esses dois vetores em um lógico do mesmo tamanho quex
, (os zeros serão sempre convertidos emFALSE
e tudo o mais emTRUE
), dessa forma, é possível fazer o subconjunto dex
acordo com as condições atendidas.fonte
Haskell , 29 bytes
fonte
Mathematica
3427 bytesIsso se aplica repetidamente às regras de substituição até que essa ação não forneça uma nova saída. 7 bytes salvos graças a Alephalpha.
A primeira regra exclui um zero no início; a segunda regra exclui um zero no final da matriz.
fonte
#//.{0,a___}|{a___,0}:>{a}&
05AB1E, 4 bytes
Aparar basicamente à esquerda e depois zeros à direita da entrada, dados como uma matriz.
Experimente online!
fonte
Perl, 19 + 1 = 20 bytes
Requer
-p
sinalizador:fonte
s/^0 | 0$//&&redo
?
como no exemplo - mas isso não vai reduzir"0"
..Gelatina, 10 bytes
Isso não usa o builtin.
Experimente aqui .
fonte
Perl, 38 bytes
Execute com
perl -p
, (3 bytes adicionados para-p
).Aceita números no STDIN, um por linha; emite números no STDOUT, um por linha, como um utilitário unix bem comportado.
Apenas trata números representados exatamente por '0' como zeros; seria possível oferecer suporte a outras representações com mais alguns bytes no regex.
Versão mais longa, ainda a ser executada com
-p
:Versão expandida, mostrando interações com o sinalizador -p:
fonte
perl -E
, o-p
sinalizador geralmente é contado apenas como um byte, pois há apenas um byte extra diferente entre esse eperl -pE
.Elixir, 77 bytes
l é a matriz.
Edit: wah! cópia / pasta falhar. é claro que é preciso importar o Enum, que aumenta a contagem de bytes em 12 (ou use Enum.function_name, que aumentará ainda mais).
fonte
Vitsy, 13 bytes
Vitsy está lentamente melhorando ... (Estou indo atrás de você Jelly. ಠ_ಠ)
Isso sai com a matriz na pilha. Para facilitar a leitura, o TryItOnline! O link que forneci abaixo da explicação produzirá uma lista formatada.
Explicação:
Note that this will throw a StackOverflowException for unreasonably large inputs.
TryItOnline!
fonte
R, 39 bytes
Four bytes shorter than David Arenburg's R answer. This implementation finds the first and last index in the array which is greater than zero, and returns everything in the array between those two indices.
fonte
MATL, 9 bytes
Try it online!
Explanation
fonte
Dyalog APL, 15 bytes
Try it here.
fonte
{⌽⍵/⍨×+\⍵}⍣2
?Ruby,
4944 bytesThanks to manatwork for chopping off 5 bytes with a completely different method!
This just
drop
s the first element of the arraywhile
it's 0, reverses the array, repeats, and finally reverses the array to return it to the proper order.fonte
.drop_while()
based solution would be shorter (if using 2 functions):f=->a{a.drop_while{|i|i<1}.reverse};->a{f[f[a]]}
eval
ugliness:->a{eval ?a+'.drop_while{|i|i<1}.reverse'*2}
.<1
, anyway. Thanks!Vim 16 Keystrokes
The input is to be typed by the user between
i
andesc
, and does not count as a keystroke. This assumes that there will be at least one leading and one trailing zero. If that is not a valid assumption, we can use this slightly longer version: (18 Keystrokes)fonte
i
and<esc>
). In vim golf the golfer starts with the input already in a file loaded the buffer and the cursor in the top left corner, but the user also has to save and exit (ZZ
is usually the fastest way). Then you could do something liked[1-9]<enter>$NlDZZ
(13 keystrokes). NoteN
/n
instead of/<up><enter>
ES6, 51 bytes
t
is set to the index after the last non-zero value, whilef
is incremented as long as only zeros have been seen so far.fonte
Perl 6, 23 bytes
Usage:
fonte
Retina, 11 bytes
Quite simple. Recursively replaces zeroes at beginning and end of line.
Try it online!
fonte
JavaScript (ES6), 47 bytes
Where
a
is the array.fonte
a=>a.join(a="")...
.[14]
will return[1, 4]
.Python, 84 characters
fonte
for i in-1,0:
JavaScript (ES6), 34 bytes
Input and output are in the form of a space-delimited list, such as
"0 4 1 2 0 1 2 4 0"
.fonte
Javascript (ES6) 40 bytes
fonte
PHP,
565452 bytesUses Windows-1252 encoding
String based solution
Run like this:
If your terminal is set to UTF-8, this is the same:
Tweaks
fonte
Python 2,
6967 bytesfonte
for i in-1,0:
[space][space]while
with[tab]while
. And==0
can be<1
. mothereff.in/…PowerShell, 49 bytes
Takes input
$args[0]
and-join
s them together with commas to form a string. We then use the.Trim()
function called twice to remove first the trailing and then the leading zeros and commas. We then-split
the string on commas back into an array.Alternate version, without using conversion
PowerShell, 81 bytes
Since PowerShell doesn't have a function to trim arrays, we define a new function
f
that will do half of this for us. The function takes$a
as input, then loops through each item with a foreach loop|%{...}
. Each iteration, we check a conditional for$_ -or $b
. Since non-zero integers are truthy, but$null
is falsey (and$b
, being not previously defined, starts as$null
), this will only evaluate to$true
once we hit our first non-zero element in the array. We then set$b=1
and add the current value$_
onto the pipeline. That will then continue through to the end of the input array, with zeros in the middle and the end getting added onto the output, since we've set$b
truthy.We encapsulate and store the results of the loop all back into
$a
. Then, we index$a
in reverse order (i.e., reversing the array), which is left on the pipeline and thus is the function's return value.We call the function twice on the
$args[0]
input to the program in order to "trim" from the front, then the front again (which is the back, since we reversed). The order is preserved since we're reversing twice.This version plays a little loose with the rules for an input array of all zeros, but since ignoring STDERR is accepted practice, the program will spit out two (verbose)
Cannot index into a null array
errors to (PowerShell's equivalent of) STDERR and then output nothing.fonte