Retirado desta pergunta no Stack Overflow. Agradecemos também a @miles e @Dada por sugerirem entradas de teste que abordam alguns casos de canto.
O desafio
Dada uma matriz de valores inteiros, remova todos os zeros que não são flanqueados por algum valor diferente de zero.
De maneira equivalente, uma entrada deve ser mantida se for diferente de zero ou se for um zero imediatamente próximo a um valor diferente de zero.
As entradas mantidas devem manter na saída a ordem em que estavam na entrada.
Exemplo
Dado
[2 0 4 -3 0 0 0 3 0 0 2 0 0]
os valores que devem ser removidos são marcados com um x
:
[2 0 4 -3 0 x 0 3 0 0 2 0 x]
e assim a saída deve ser
[2 0 4 -3 0 0 3 0 0 2 0]
Regras
A matriz de entrada pode estar vazia (e a saída também deve estar vazia).
Os formatos de entrada e saída são flexíveis, como de costume: matriz, lista, sequência ou qualquer coisa que seja razoável.
Código de golfe, o menor número possível.
Casos de teste
[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]
fonte
_2
vez de-2
? Muitos idiomas usam esse formato.-0
?[010 0 0 01 1]
?Respostas:
JavaScript (ES6), 35 bytes
Também funciona em carros alegóricos para dois bytes extras.
fonte
Python, 50 bytes
Uma função recursiva que leva uma tupla. Inclui o primeiro elemento se houver um valor diferente de zero entre os dois primeiros ou o valor anterior armazenado da última vez. Em seguida, remove o primeiro elemento e se repete. O elemento anterior é armazenado na lista singleton
p
, que é compactada automaticamente para listar e começa como vazia (graças a Dennis por 3 bytes com isso).55 bytes:
Gera todos os pedaços de tamanho 3 da lista, primeiro colocando zeros no início e no final e pega os elementos intermediários daqueles que nem todos são zero.
Uma abordagem iterativa ficou mais longa (58 bytes)
Isso não funciona exatamente porque
b,*l
precisa do Python 3, mas o Python 3input
fornece uma string. A inicialização também é feia. Talvez uma abordagem recursiva semelhante funcione.Infelizmente, o método de indexação de
não funciona porque
l[-1:2]
interpreta-1
como o final da lista, não um ponto antes do início.fonte
Haskell,
5548 bytesExemplo de uso:
h [0,0,0,8,0,1,0,0]
->[0,8,0,1,0]
.scanr
reconstrói a lista de entradax
com um adicional0
no início e no final. Em cada etapa, combinamos 3 elementos e mantemos o do meio, se houver pelo menos um elemento diferente de zero.Obrigado @xnor por 7 bytes, alternando de
zip3
parascanr
.fonte
h x=[snd t|t<-zip3(0:x)x$tail x++[0],(0,0,0)/=t]
, mas acho que não há uma maneira curta de obter o segundo elemento de uma tupla de três.scan
do que umzip3
:h x=[b|a:b:c:_<-scanr(:)[0]$0:x,any(/=0)[a,b,c]]
.Matlab,
2927 bytesA entrada deve consistir em uma
1*n
matriz (sempre quen=0
possível). (Irá gerar um erro para0*0
matrizes.)fonte
's'
em vez de'same'
<- :-D'UniformOutpout'
(compreensivelmente). Mas eu não sabia sobre este~~a
vez dea.*a
?logical
matrizes. Isso geralmente é um problema para os built-ins que não são escritos no próprio Matlab. Caso contrário, as matrizes lógicas se comportam muito como as numerosas. Pode funcionar no pensamento da Oitava, mas não o tenho instalado no momento.J,
1714 bytesSalvou 3 bytes com a ajuda do @ Zgarb.
Uso
Explicação
Experimente aqui.
fonte
0<
trabalhar no lugar de0~:
?MATL , 8 bytes
Saída é uma sequência com números separados por espaços. Uma matriz vazia na saída é exibida como nada (nem mesmo uma nova linha).
Experimente online! Ou verifique todos os casos de teste .
Explicação
O código converte a entrada no tipo lógico, ou seja, entradas diferentes de zero se tornam
true
(ou1
) e zero entradas se tornamfalse
(ou0
). Isso é convolvido com o kernel[1 2 3]
. Um valor diferente de zero causa um resultado diferente de zero nessa posição e em suas posições vizinhas. A conversão para lógico fornecetrue
valores que devem ser mantidos; portanto, indexar a entrada com isso produz a saída desejada.fonte
Jolf, 14 bytes
Agora que penso nisso, Jolf é o Java das linguagens de golfe. suspiros Experimente aqui.
Explicação
fonte
Python 3, 55 bytes
fonte
Geléia , 9 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
fonte
Perl, 34 + 1 (
-p
sinalizador) = 35 bytesPrecisa de sinalizador -p para executar. Leva uma lista de número como imput. Por exemplo :
fonte
5
se eu inserir50 0
.Haskell, 48 bytes
Examina o elemento anterior
p
, o primeiro elementoh
e o elemento depois (se houver) e se algum for diferente de zero, precede o primeiro elementoh
.A condição
any(/=0)$p:h:take 1t
é longa, em particular atake 1t
. Vou procurar uma maneira de reduzi-lo, talvez por correspondência de padrões.fonte
Retina ,
423533 bytes7 bytes graças a Martin Ender.
A última linha é necessária.
Verifique todos os casos de teste de uma só vez. (Ligeiramente modificado para executar todos os casos de teste de uma vez.)
Parece que a linguagem perfeita para fazer isso ... ainda foi derrotada pela maioria das respostas.
fonte
Mathematica, 43 bytes
fonte
C, 96 bytes
Ligue
f()
com um ponteiro para a lista de números inteiros e um ponteiro para o tamanho da lista. A lista e o tamanho são modificados no local.Experimente em ideone .
fonte
f(int*p,int*n)
salva um byte. Ou definas
como um terceiro parâmetro (isso não é passado. É meio que OK).Braquilog ,
4438 bytesExperimente online!
Essa linguagem é boa para provar as coisas, e é isso que vamos usar.
Predicado 0 (predicado principal)
Predicado 1 (predicado auxiliar)
fonte
Matlab com Image Processing Toolbox, 27 bytes
Esta é uma função anônima.
Exemplo de uso:
fonte
imerode
também, mas minhas versões manteve ser mais longo do que o meu atual, bom trabalho =)Utilitários Bash + GNU, 25
Aceita entrada como uma lista separada por nova linha.
Ideona - com o código do driver de teste adicionado para executar todos os casos de teste juntos, convertendo para / do espaço e da nova linha.
fonte
Cheddar , 78 bytes
Suíte de teste.
O Cheddar não tem filtro; portanto, a filtragem é feita envolvendo os elementos que queremos e transformando os elementos que não queremos em matrizes vazias e concatenando tudo.
Por exemplo,
[0,0,0,8,0,1,0,0]
torna-se[[],[],[0],[8],[0],[1],[0],[]]
e, em seguida, a matriz concatenada seria[0,8,0,1,0]
.fonte
.reduce((+))
->.sum
APL, 14 bytes
Teste:
Explicação:
0,⍵,0
: adicione um zero no início e no final de ⍵×3∨/
: encontre o sinal do MDC de cada grupo de três números adjacentes (será 0 se todos forem zero e 1 caso contrário).⍵/⍨
: selecione todos os itens de ⍵ para os quais o resultado foi 1.fonte
Ruby 2.x, 63 bytes
Crédito, onde é devido, este é essencialmente um porto da resposta ES6 superior de Neil.
É também a minha primeira submissão pcg. yay.
fonte
Brain-Flak 142 bytes
Experimente online!
Explicação
fonte