Dada a entrada de uma lista de números inteiros positivos com alguns substituídos por 0
, imprima a lista com os números ausentes que foram alterados para 0
substituídos.
Características da lista de entrada:
A lista sempre terá um comprimento de pelo menos 2.
Vamos definir a lista de entrada como
a
e a "lista original" (ou seja, a lista antes dos números serem substituídos por0
s) comob
. Para qualquern
,a[n]
éb[n]
ou0
.Para qualquer
n
,b[n]
éb[n-1] + 1
oub[n-1] - 1
. Ou seja, os números emb
sempre serão alterados1
em cada índice em relação ao anterior. O primeiro elemento é, obviamente, isento desta regra.Para cada corrida de zeros em
a
(isto é, elementos consecutivos substituídos com0
), comx
o que representa o índice de início do funcionamento ey
que representa o fim,a[x-1]
paraa[y+1]
irá sempre ser quer unicamente aumentando ou diminuindo exclusivamente. Portanto, haverá apenas uma maneira possível de preencher os zeros.- Isso também significa que nem o primeiro nem o último elemento da matriz pode ser zero.
Em termos mais simples, para preencher uma sequência de zeros, basta substituí-lo por um intervalo do número anterior ao número seguinte. Por exemplo, uma entrada de
1 2 0 0 0 6 7
deve produzir
1 2 3 4 5 6 7
Como esse é o código-golfe , o código mais curto em bytes será vencedor.
Casos de teste:
In Out
-----------------------------------------------------
1 0 0 0 5 6 0 4 0 0 1 | 1 2 3 4 5 6 5 4 3 2 1
7 6 0 0 3 0 0 0 7 0 5 | 7 6 5 4 3 4 5 6 7 6 5
1 0 3 0 5 0 3 0 5 0 7 | 1 2 3 4 5 4 3 4 5 6 7
14 0 0 0 0 0 0 0 0 23 | 14 15 16 17 18 19 20 21 22 23
fonte
0
nosso programa pode ter outro valor, comonull
?0
.Respostas:
JavaScript (ES6),
72 66 64 5453 bytesEconomizou 12 bytes graças a @Neil!
Guardado 1 byte graças a @IsmaelMiguel
Muito bom para JavaScript.
Experimente online (todos os navegadores funcionam)
Explicação
fonte
a.find((q,r)=>r>i&&q)>b?++b:--b
é o mesmo queb+=a.find((q,r)=>r>i&&q)>b||-1
MATL , 11
12bytesFunciona com a versão atual (13.0.0) do idioma / compilador.
Experimente online!
fonte
Haskell,
686158 bytesExemplo de uso:
g.filter(>0) $ [7,6,0,0,3,0,0,0,7,0,5]
->[7,6,5,4,3,4,5,6,7,6,5]
.Como funciona: remova zeros da entrada e ligue
g
. Sejaa
o primeiro e ob
segundo elemento da lista restante. Concatenar as listas dea
cima parab-1
e dea
baixo parab+1
(um deles estará vazia) e uma chamada recursiva coma
descartado.Edit: @Zgarb salvou 3 bytes. Obrigado!
fonte
Mathematica, 59 bytes
Caso de teste
fonte
Perl,
4745443937 bytesInclui +1 para
-p
Espera a lista em stdin. Exemplo: eco 1 0 3 0 1 | perl -p file.pl
fonte
Geléia,
1211 bytesExperimente online!
Versão alternativa, 8 bytes (não concorrente)
Infelizmente, o Jelly's
pop
não lançou para iterável, na versão mais recente que antecede esse desafio. Isso foi corrigido e o seguinte funciona na versão atual.Experimente online!
Como funciona
Na versão alternativa,
ḢWW;
torna-se desnecessário. No entanto, como o primeiro elemento é convertido em iterável antes do popping, ele não é realmente modificado. O finalḊ
remove a duplicata do primeiro elemento.fonte
Retina,
393431 bytes3 bytes salvos graças a @Martin.
Recebe entrada e dá saída em unário.
O código preenche iterativamente todos os lugares vazios (0s)
previous_number - 1 + 2 * if_next_nonzero_number_bigger
.previous_number - 1
é$1
eif_next_nonzero_number_bigger
é$3
.Com E / S decimal, o código tem 51 bytes, como você pode ver no interpretador online com todos os casos de teste .
fonte
1
na cabeça de impressão.GNU Sed (com
exec
extensão usando bash), 61A pontuação inclui +1 para a
-r
opção sed.0
s e substitua-as..
{1..4}
nos pontos de extremidade locais. A beleza das expansões de chaves bash aqui é que a sequência gerada sempre será executada na direção certa, independentemente de o início ou o fim ser maior.e
opção dos
comando para chamar o bash para avaliar essa expansão de chave0
s forem encontrados, volte ao início.Ideone.
fonte
Python 2,
195111 bytes (obrigado Alex !)Entrada: deve ser um
[list]
de intsSaída:
[list]
de intsfonte
Perl,
8582 bytesinclui +1 para
-p
Espera a lista em stdin. Exemplo:
echo 1 0 3 0 1 | perl -p file.pl
.Isso usa um regexp aninhado. Um pouco legível:
fonte
Python 2,
9288 bytes(Variável intermediária removida)
fonte
Pitão, 17 bytes
Como funciona:
Em outras palavras: todos os zeros são removidos da entrada e, em seguida, um intervalo exclusivo é inserido entre cada elemento. Esse intervalo é de comprimento zero em elementos separados apenas um.
fonte
05AB1E , 3 bytes (não concorrente)
Este foi um recurso adicionado após o desafio. Código:
Explicação:
Experimente online! ou Verifique todos os casos de teste!
fonte
Vim: 231 Comandos Chave
Observe que qualquer ^ que precede um caractere significa que você deve manter o controle enquanto digita esse caractere
Etapas para que você possa executar isso também!
:s/\^V/<Ctrl-V><Ctrl-V>/g
e pressione enter (os dois s devem fornecer um ^ V azul):s/\^R/<Ctrl-V><Ctrl-R>/g
e pressione enter (você deve ver azul ^ Rs agora):s/\^X/<Ctrl-V><Ctrl-X>/g
e pressione enter (você verá azul ^ Xs agora):s/\^O/<Ctrl-V><Ctrl-O>/g
e pressione enter:s/\^A/<Ctrl-V><Ctrl-A>/g
e pressione enter:s/\^\[/<Ctrl-V><Ctrl-[>/g
e pressione enter (este comando é um pouco diferente porque eu precisava escapar do [)0"yy$
. O comando agora está armazenado no registro y@y
Se alguém souber uma maneira melhor de compartilhar o comando, entre em contato. Eu sei que isso é demorado, mas é o melhor que eu poderia fazer.
Entrada / Saída
A sequência de entrada deve estar sozinha em qualquer linha do arquivo. 1 0 0 4 3 0 0 0 7
A saída simplesmente substituirá a sequência de entrada 1 2 3 4 3 4 5 6 7
Explicação
Algoritmo
Macros usadas
@e - Verifique se há fim. O último número terá um e anexado a ele. Se o número sob o cursor tiver um e no final, exclua ee interrompa a execução. Caso contrário, inicie um ciclo de interpolação com @b.
@b - Inicia o ciclo de interpolação. Salve o número sob o cursor para uma operação de subtração (@s) e encontre o próximo termo diferente de zero (@f)
@s - Armazena o comando de subtração para usar em @d. É simplesmente
(val)^X
onde(val)
está o número no início da etapa de interpolação. Isso é definido pelo comando @b.@f - Encontre o próximo termo diferente de zero. Escreva o valor atual no registro sem nome, depois escreva
@f @d
na próxima linha e execute @z. Isso repetirá esse comando se o número for zero e executará @d se não for.@z - Execução condicional se o registro sem nome for 0. Este comando espera dois comandos em uma nova linha no formato
command1 command2
. Se o registro sem nome for 0,command1
é executado, caso contrário,command2
é executado. Observe que nenhum dos comandos pode conter espaços.@t - Registro de comando temporário. Armazena vários comandos por um curto período de tempo antes de executá-los. Usado principalmente nas instruções if.
@d - Determina a direção da interpolação. Subtrai o primeiro número da sequência do número sob o cursor (usando @s). Se o resultado for negativo, a interpolação deve diminuir, para que ^ X seja salvo em @a. Caso contrário, devemos incrementar para que ^ A seja salvo em @a. Depois que isso for salvo, volte para o início desse ciclo de interpolação e execute @i para realmente interpolar
@a - Armazena
^A
ou^X
aumenta ou diminui durante a etapa de interpolação. Isso é definido pelo comando @d.@i - Interpolar. Copie o número no local atual para @x e passe para o próximo número. Se esse número for zero, substitua-o por @x e execute @a para modificá-lo corretamente para cima ou para baixo e repita este comando. Se o número não for zero, chegamos ao final desse ciclo de interpolação. Um novo deve ser iniciado com esse número como o início; portanto, execute @e para verificar o final e execute novamente.
@x - Registro de armazenamento temporário. Usado no comando interpolar (@i)
Quebrando as teclas digitadas
fonte
Python 3.5, 159 bytes
uma solução recursiva
Ungolfed
Na solução de golfe, substituo as condições usando o fato de que
h*True=h
eh*False=[]
Resultado
fonte
Perl 6 , 54 bytes
fonte
MATLAB,
393837 bytesFunção anônima que interpola linearmente entre os pontos em
a
.find(a)
é uma matriz de índices de elementos diferentes de zeroa
ea(a>0)
são os valores positivos. Economizei 1 byte graças à sugestão de um amigo, em>
vez de~=
.fonte