Inspirado por esta pergunta SO
Como entrada, você receberá uma lista não vazia de números inteiros, onde o primeiro valor é garantido como diferente de zero. Para construir a saída, caminhe desde o início da lista, produzindo cada valor diferente de zero ao longo do caminho. Quando você encontrar um zero, repita o valor que você adicionou mais recentemente à saída.
Você pode escrever um programa ou função e fazer com que a entrada / saída assuma qualquer formato conveniente que não codifique informações extras, desde que ainda seja uma sequência ordenada de números inteiros. Se estiver produzindo a partir de um programa, você poderá imprimir uma nova linha à direita. Exceto por esta nova linha à direita, sua saída deve ser uma entrada aceitável para o envio.
O código mais curto em bytes vence.
Casos de teste
[1, 0, 2, 0, 7, 7, 7, 0, 5, 0, 0, 0, 9] -> [1, 1, 2, 2, 7, 7, 7, 7, 5, 5, 5, 5, 9]
[1, 0, 0, 0, 0, 0] -> [1, 1, 1, 1, 1, 1]
[-1, 0, 5, 0, 0, -7] -> [-1, -1, 5, 5, 5, -7]
[23, 0, 0, -42, 0, 0, 0] -> [23, 23, 23, -42, -42, -42, -42]
[1, 2, 3, 4] -> [1, 2, 3, 4]
[-1234] -> [-1234]
fonte
[0,0]
?[1,01]
? Usando, a resposta Pyth do issac, compare isso e isso .01
não é um número inteiro válido na entrada Pyth, portanto o isaac não precisa dar conta disso. Outras respostas pode aceitar a entrada como que se eles querem, contanto que eles são consistentes (como a forma como a resposta de isaac nunca produzirá essa lista como saída)Respostas:
Pitão, 6 bytes
Demonstração
m ... Q
significa que isso mapeia uma função sobre a entrada. A função que está sendo mapeada éJ|dJ
. Isso significaJ = d or J
em Python, já queJ
é implícito atribuído ao seguinte valor no primeiro uso. Diferentemente do Python, as expressões de atribuição retornam o valor atribuído em Pyth, portanto, o mapa retorna cada valor sucessivo deJ
, conforme desejado.fonte
Gelatina , não concorrente
3 bytes Esta resposta não é concorrente, pois usa recursos que pós-datam o desafio.
Experimente online!
Como funciona
fonte
Ruby, 25 bytes
Isso é realmente muito ruim.
Especificamente, o trecho
x==0 ? a : (a=x)
.Se eu tivesse usado outro nome de variável para
a
(o valor diferente de zero anterior) - digamosy
- eu teria que declará-lo fora domap
(porquey=x
só teria um escopo dentro dessamap
iteração única ). Isso usaria mais quatro caracteres (y=0;
).Mas se eu usar o nome da variável
a
... sim, você adivinhou. Na verdade, estou reatribuindo ao argumento que recebemos como entrada (a matriz original).map
não se importa, porque se importa apenas com o valor original da coisa que está sendo chamada, então isso realmente funciona.fonte
Haskell, 21 bytes
A função (anônima) que criamos está na última linha. As duas primeiras linhas definem uma função auxiliar.
A função binária
%
gera o segundo argumento, a menos que seja0
, nesse caso, gera o primeiro argumento.scanl1
itera essa função na lista de entrada, exibindo o resultado a cada etapa.fonte
J, 8 bytes
Esta é uma função unária, invocada da seguinte maneira.
Explicação
fonte
{:@(#~|)\
, então, um byte a mais.Sed, 8
/^0$/
corresponde a zero em uma linha - se sim,g
copia o espaço de espera para o espaço do padrãoh
copia o espaço do padrão para o espaço de esperaOs números inteiros são separados por nova linha. por exemplo:
fonte
Javascript ES6, 19 bytes
Solução simples, faça um loop na entrada, atribua
p
ao elemento atuali
ou ap
ifi
is0
e faça a saída.Exemplo de execução (atribuindo função anônima a
f
):fonte
Retina , 15 bytes
Experimente online.
Substitui repetidamente um número seguido de um zero por duas vezes esse número até que a string pare de mudar.
fonte
Dyalog APL,
12109 bytesInspirado pela resposta J de @ Zgarb.
Experimente aqui .
fonte
Pitão, 8 bytes
Usa
.u
(redução cumulativa) por|
(Pythonor
), com o caso base 0.fonte
.u
é mais longo, mesmo seJ
eK
são amarrados. É sempre ideal?Python 2, 29 bytes
Recebe a entrada como números dados um por linha e sai no mesmo formato. Termina com erro após o término.
Usando a natureza de curto-circuito de
or
, a variávelx
é atualizada para a entrada, a menos que essa entrada seja 0 (que é Falsey), caso em que permanece seu valor atual. Então,x
é impresso. Observe que, como o primeiro valor da lista é diferente de zero,x
não é avaliado no lado direito antes de ser atribuído.fonte
#\nJ|EJ
Mathematica 38 bytes
A correspondência de padrões substitui repetidamente
...a,0,...
por...a,a...
fonte
Matlab, 41
46bytesIsso é inspirado na minha resposta original , com as seguintes diferenças:
nonzeros
.0
.Agradecemos a Tom Carpenter pelo item 4 e por sua sugestão de usar um programa em vez de uma função; juntos, eles permitiram uma redução de 5 bytes.
Exemplo:
fonte
x=input('')
vez da declaração da função e emdisp(u(t)
vez doy=
bit. Além disso, você pode salvar mais quatro bytes, livrando-se dat
variável, resultandox=input('');u=x(~~x);disp(u(cumsum(~~x)))
em 41.@(x)x(~~x)(cumsum(~~x))
funciona no Octave.Gol> <> , 8 bytes
Entrada e saída são números separados por nova linha.
Explicação:
Experimente online aqui.
fonte
Japonês,
87 bytesBem simples. Separa a entrada por vírgulas. Experimente online!
Ungolfed e explicação
Versão não concorrente de 4 bytes : (
å
comando e!
-auto-function adicionados após o desafio)Explicação:
Experimente online!
fonte
ª
é OR, em vez deº
?º
E é por acaso?º
é((
. Eles foram designados pelo valor Unicode como eu encontrei a necessidade para eles: Pª
nd eº
r é um gênio, porém, eu poderia usar isso para Japt 2.0 ...Java, 78
Aqui, apenas controlamos o último diferente de zero e o inserimos onde for apropriado. Parece a maneira óbvia de fazê-lo.
fonte
Prolog (SWI) , 54 bytes
Experimente online!
Explicação
Estou muito feliz com esta resposta.
Primeiro, dizemos que a lista vazia é a solução da lista vazia:
Então dizemos que
[X,X|Y]
é a solução de[X,0|T]
, se removendo a segunda entrada de cada uma das soluções restantes.Por fim, dizemos que qualquer coisa restante é válida se começarem com o mesmo valor e o restante das duas listas coincidirem.
Se essa explicação não estiver funcionando para você, aqui está o código traduzido para Haskell:
Experimente online!
fonte
GolfScript, 10 bytes
Este programa recebe a entrada de stdin, na forma de uma matriz GolfScript literal (por exemplo
[1 0 2 0]
), e grava sua saída em stdout no mesmo formato (por exemplo[1 1 2 2]
).Experimente online.
Uma função (obtendo e retornando uma matriz GolfScript) teria três bytes a mais, devido à necessidade de envolvê-la em um bloco e atribuí-la a um símbolo:
Obviamente, se apenas o corpo da função (ou seja
[{1$or}*]
) for contado, então eu posso salvar um byte em comparação com o programa independente.fonte
Minkolang 0.14 ,
1210 bytesExperimente aqui. A entrada pode ser fornecida como na pergunta, mas sem colchetes .
Explicação
Minkolang é toroidal, então isso faz um loop até o início e continua até que ele atinja
.
e pare.fonte
, 7 caracteres / 12 bytes
Try it here (Firefox only).
Explicação
fonte
O , 31 bytes
Isso leva uma entrada separada por
,
e gera a mesma lista em[]
.Explicação:
17 bytes
Recebe a entrada como uma lista de números separados por espaços usando a notação postfix e pode lidar apenas com números hexadecimais de um dígito. Os negativos são postfixados com
_
.Explicação:
fonte
I~]{n.{:V}{;V}?}d
. Gostaria de saber sed
deve apenas colocar o valor na pilha em vez den
...-42
, mas adiciona colchetes ao redor da saída.R,
393733 bytesEsta é uma função sem nome que aceita um vetor e retorna um vetor. Requer que o
zoo
pacote esteja instalado. Observe que ele não precisazoo
ser anexado ao espaço para nome, pois estamos fazendo referência direta a ele.O nome para esta operação no mundo das estatísticas é imputação LOCF, em que LOCF significa Última Observação Realizada. Para fazer isso em R, podemos usar
na.locf
ozoo
pacote, que substituiNA
valores pelo último nãoNA
valor conhecido . Nós apenas temos que substituir os zeros na entrada porNA
s primeiro.Para fazer isso, usamos
x|NA
, que seráTRUE
quandox != 0
e deNA
outra forma. Se multiplicarmos porx
, osTRUE
elementos serão substituídos pelos elementos correspondentes dex
eNA
s permanecemNA
, substituindo todos os zeros. Isso é passado para ozoo::na.locf
que nos dá exatamente o que queremos.Economizou 4 bytes graças ao flodel!
fonte
Ferrugem, 100 bytes
Tropecei nesse desafio, e pensei em tentar no meu idioma favorito. Tentei usar
[T]::windows_mut()
primeiro, antes de descobrir que não existe . E pode ter sido realmente mais longo do que isso. De qualquer forma, acontece que o Rust jogado no golfe é muito feio e não é competitivo (especialmente com todos aqueles esotéricos malditos!) 1A nova linha não está incluída no bytecount; está lá apenas para que você não precise rolar para o lado. Não altera o significado do código.
Ungolfed:
[1] Pelo menos não é tão ruim quanto o Java.
fonte
public static void main
clichê ...Via Láctea 1.2.1 , 33 bytes
Isso pressupõe que a lista de números inteiros esteja apenas na pilha.
Explicação
fonte
Julia, 33 bytes
Esta é uma função
g
que aceita uma matriz e retorna uma matriz. Iniciamos uma variável temporáriaa
em 0. Para cada elementoi
da entrada, sei
não for 0, atribuímosa
ai
. Sei
for 0,a
não muda nessa iteração. Nós usamosa
como valor nessa posição na matriz de saída.fonte
Perl 6 , 21 bytes
uso:
fonte
R, 36 bytes
Vamos ver como isso funciona usando
x=
como um exemplo. Aqui,
!!x
será o vetor lógico (Verdadeiro / Falso):Além disso,
seq(a=x)
fornece um vetor de índices desde quex
:Multiplicamos ambos, dando:
Tomamos o máximo cumulativo:
Por fim, usamos esse último vetor como índices para extrair de
x
:fonte
CJam, 11 bytes
Experimente online.
Como funciona
fonte
PowerShell, 32 bytes
$x|%{...}
faz o bloco de scripts para cada elemento em$x
.($_,$t)
é uma matriz do elemento atual e$t
, e[!$_]
significa que usamos!$_
para indexar a matriz. O índice será0
(falso) para elementos diferentes de zero e1
(verdadeiro) quando o elemento atual for zero, também$t
será o elemento atual ou$t
. Os parênteses cercam a expressão de atribuição para que seu valor seja emitido. Sem parênteses, seria apenas uma tarefa "silenciosa"$t
.fonte
param($x)
que transforma isso em um programa. A saída é uma coleção de números inteiros que você pode enviar como um parâmetro para o programa, por exemplo,$a = .\program.ps1 1,2,3,4,0,0,5
e depois.\program.ps1 $a
funciona como esperado.$args|%{($p=($_,$p)[!$_])}
- 26 bytes usando $ args.Japonês , 3 bytes
Tente
fonte