Dada uma matriz de números inteiros não negativos, sua tarefa é manter apenas alguns elementos, conforme descrito abaixo.
Digamos que a matriz seja
[1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1]
.Primeiro, obtenha o primeiro elemento da matriz
n
,. Mantenha os primeirosn
elementos e descarte o próximo (descarte o dian+1
). A nova matriz é[1, 2, 4, 11, 5, 2, 0, 13, 10, 1]
.Então, você pega o elemento após o removido e faz exatamente a mesma coisa. Reaplicando o processo, obtemos
[1, 2, 11, 5, 2, 0, 13, 10, 1]
Você repete o processo até chegar fora dos limites da matriz / não há elementos restantes na matriz. Paramos porque
11
é maior que o comprimento da matriz.Agora você deve gerar o resultado.
A entrada / saída pode ser obtida / fornecida em qualquer formato padrão. A matriz nunca estará vazia e conterá apenas números inteiros não negativos. Todas as brechas padrão são proibidas.
Isso é código-golfe, então o código mais curto em bytes vence!
Casos de teste
Entrada -> Saída [1, 2, 3, 4, 5] -> [1, 3, 4] [6, 1, 0, 5, 6] -> [6, 1, 0, 5, 6] [1, 3, 2, 4, 11, 5, 2, 0, 13, 10, 1] -> [1, 2, 11, 5, 2, 0, 13, 10, 1] [2, 2, 2, 2, 2, 2] -> [2, 2] [1, 2, 3, 1, 2, 3, 1, 2, 3] -> [1, 2] [3, 1, 2, 4, 0] -> [] *
* O último caso de teste envolve 0
, então decidi postar o processo para que fique mais claro:
[3, 1, 2, 4, 0] --> [3, 1, 2, 0] --> [1, 2, 0] --> [1, 0] --> [0] --> [] )
2
removido na primeira etapa em vez de3
?[1, 2, 3, 1, 2, 3, 1, 2, 3]
n
", você sempre começa do início da matriz para manter osn
elementos? Não (como eu pensava à primeira vista) mantern
elementos onde o primeiro elemento é o quen
você está avaliando?Respostas:
Pitão, 18 bytes
Experimente aqui.
fonte
JavaScript (ES6), 45 bytes
Casos de teste
Mostrar snippet de código
fonte
Haskell , 50 bytes
g.pure.(0:)
é uma função anônima que recebe e retorna uma lista deInt
s, use como(g.pure.(0:))[1,2,3,4,5]
.Experimente online!
Como funciona
g
usa um argumento de tupla representando uma lista dividida.a
é a lista de elementos iniciais mantidos na etapa anterior,_
é o elemento a ser descartado,b
é o próximo elemento a ser usado como um comprimento ec
os elementos restantes.b
, uma nova divisão será executada eg
ocorrerá novamente. Caso contrário, ele será interrompidoa
como resultado.g.pure.(0:)
inicia tudo chamandog
com a tupla([],0:l)
, ondel
está a entrada e0
é imediatamente descartada porg
.pure
aqui usa aApplicative
instância para tuplas (binárias) e, com o tipo de resultado,([Int],[Int])
coloca convenientemente seu argumento como o segundo elemento em uma tupla com[]
o primeiro elemento.fonte
Python 3 , 59 bytes
Experimente online!
fonte
Haskell , 51 bytes
Experimente online! Exemplo de utilização:
f [1,2,3,4,5]
.fonte
Java 8, 68 bytes
Este lambda aceita um mutável
List<Integer>
(suportaremove(int)
, por exemploArrayList
). Saída com entrada mutada. Atribuir aConsumer<List<Integer>>
.Experimente Online
O fluxo de controle para esse problema é muito irritante. A cada iteração, precisamos remover um elemento e colocá-lo na próxima posição, e ambas as operações requerem uma verificação de alcance (e podem acionar a conclusão do programa). Uma estratégia é realizar as duas operações em uma iteração de loop único, com a atualização do índice protegida por sua própria verificação de intervalo. Outra estratégia, que acabou sendo mais curta, é alternar entre as operações de cada iteração de loop, que é o que esta solução faz.
fonte
APL (Dyalog Classic) , 32 bytes
Explicação
Experimente online!
fonte
Perl 5 , 38 + 1 (-a) = 39 bytes
Experimente online!
fonte
Haskell, 99 bytes (88 sem recuo)
fonte
VI,
3125 bytes<C-?>
corresponde aControl + ?
, e<Esc>
paraEscape
, obviamente. Cada um deles conta com 1 byte (consulte meta ).Entrada
O arquivo de entrada deve conter 1 número inteiro por linha + 1 linha em branco no final, exemplo:
Podemos ver cada linha do arquivo de entrada como um elemento de matriz
1 :: 2 :: 3 :: 4 :: 5 :: []
, como em alguns idiomas (caml, por exemplo).Lançamento
Você pode iniciar o vi com o seguinte comando e digitar o traço da solução por traço:
Você também pode usar este one-liner:
Isso deve produzir um arquivo
output
com o resultado correto de um arquivo de entradainput
.Explicações
Para apresentar a solução, apresentarei primeiro uma solução de 19 bytes que funciona apenas para matrizes sem 0. Essa solução usa uma macro recursiva, usada com poucas modificações na solução final:
Explicação de uma solução parcial
O truque aqui é usar o
"0
registrador para armazenar o número inteiro atual (e a quebra de linha, muito importante). Portanto, o comando@0
permite pularn
linhas (chamen
o valor de"0
). Se o salto exceder o número de linhas no arquivo, a macro falhará e o programa será interrompido (fora dos limites da matriz, conforme necessário).Mas esta solução não funciona se a entrada contiver
0
. De fato, se o"0
valor do registro for igual0
, então@0
pulará uma linha (devido à quebra de linha), não0
como gostamos. Portanto, o próximo comando (dd
) não excluirá o 0º número inteiro, mas o 1º (não correto).Uma solução válida para lidar com o
0
é sempre incrementar o número inteiro antes de puxá-lo e diminuí-lo logo depois. Assim, o@0
comando irá pularn+1
linhas (n
é o número inteiro atual que foi incrementado). Ék
necessário um comando para ir para a linhan
(linha anterior). Usando esse truque, é necessária uma linha em branco no final do arquivo de entrada, para evitar pular fora da matriz (encerrando o programa), já que agora sempre pulamos asn+1
linhas antes de pular para a linha anterior.Explicação da solução final
Escrever o conteúdo da macro dentro do arquivo antes de registrá-lo permite salvar alguns bytes:
qa...q
e desfazer todas as alterações após o registro:let @a="..."
)Editar% s
# 1
fonte
Pitão, 32 bytes
Experimente online
fonte
#VlQ.(Q@QN;Q
faz o trabalho em 12 bytes, e eu tenho certeza que ele pode ser golfed ainda maisW<Zl=Q+<Q@QZ>Qh@QZ=Z@QZ)Q
(25). A abordagem da pizzakingme é muito melhor.#VlQ .(Q@QN)%;Q
. O feedback dos golfistas de Pyth seria bem-vindo, ainda estou aprendendo também!C # (.NET Core) , 74 bytes
Experimente online!
Isso pega uma lista de entradas e a modifica. Eu vi algumas respostas Java que contornam as importações usando o nome completo na definição de argumento Lambda. Se isso não for permitido, posso remover esta resposta.
fonte
System.Collections.Generic.List<int>
vez deusing System.Collections.Generic
e adicionando isso à contagem de bytes. Mas acho que não é diferente de usar uma matriz.using
se quiser; contanto que o lambda em si não dependa da declaração, você não precisará incluí-lo na contagem de bytes. Pessoalmente, eu sempre uso nomes totalmente qualificados no código de teste, para que fique claro e facilmente verificável o que importa o lambda.R ,
6453 bytesFunção recursiva. Possui uma entrada obrigatória,,
a
a lista a ser pulada.i
é o índice do número de itens a serem saltados (o padrão é1
) ed
é o índice do próximo item após a remoção do valor necessário, que também é o índice do item a ser removido. Retornanumeric(0)
, um vetor vazio, para saída vazia.Experimente online!
Ungolfed:
fonte