Escreva uma função (como placeAt
) que use uma matriz de números inteiros não negativos e um índice que seja um número inteiro não negativo. Ele deve colocar um 1 no índice fornecido, possivelmente alterando outras entradas por um ponto para desocupar esse ponto, com 0s para lugares vazios.
- Se a entrada no índice desejado for 0, preencha-a com 1.
- Caso contrário, procure o 0 mais próximo à esquerda do índice. Desloque as entradas um ponto à esquerda nesse 0 para liberar espaço e preencha o índice com 1.
- Se não houver 0 à esquerda, faça o mesmo indo para a direita.
- Se nenhum dos dois for possível (por exemplo, se não houver 0), retorne a matriz inalterada.
Os itens são indexados em 0. O nome da função pode ser o que você quiser.
Exemplos:
(As letras representam quaisquer valores inteiros positivos.)
[a, b, 0, c, d, 0] placeAt 2 // output [a, b, 1, c, d, 0] place 2 is 0, just fill
[a, b, 0, c, d, 0] placeAt 3 // output [a, b, c, 1, d, 0] place 3 is filled, shift items left
[a, b, 0, c, d, 0] placeAt 0 // output [1, a, b, c, d, 0] place 0 is filled, can't shift left, shift items right
[a, b, 0, c, d, 0] placeAt 1 // output [a, 1, b, c, d, 0] place 1 is filled, can't shift left, shift items right
[0, a, b, 0, c, d, 0] placeAt 2 // output [a, b, 1, 0, c, d, 0] place 2 is filled, shift items left
[0, a, b, 0, c, d, 0] placeAt 4 // output [0, a, b, c, 1, d, 0] place 4 is filled, shift items left (notice you keep shifting up until a 0)
[0, 2, 0, 2] placeAt 3 // output [0, 2, 2, 1] place 3 is filled, shift items left
Este é um desafio de código de golfe. A entrada mais curta no final de 9 dias vence.
0
?[0, 2, 0, 2] placeAt 3
, é legal produzir[2, 0, 2, 1]
? O código é necessário para realmente ser uma função chamadaplaceAt
? Observe que alguns idiomas não possuem exatamente funções. "Lançar uma exceção" também pode não se aplicar a alguns idiomas; Eu sugiro permitir uma saída indicando um erro.[2, 0, 2, 1]
não é uma saída legal, pois você sempre deve mudar o menor número possível de elementos e pode nomear a função como desejar.Respostas:
JavaScript (ES6), 85
Teste a execução do snippet em qualquer navegador compatível com EcmaScript 6 (principalmente o Chrome, não o MSIE. Eu testei no Firefox, o Safari 9 poderia ir)
(Encontrei isso sem olhar para nenhuma das outras respostas, agora vejo que é muito parecido com o da pista. Ainda bem mais curto. Provavelmente não vou receber muitos votos positivos por essa)
fonte
splice
é melhor do que a minha vírgulaJulia, 122 bytes
Apenas uma implementação ingênua das especificações para começar.
Ungolfed:
fonte
JavaScript (ES6), 98 bytes
Praticamente a mesma abordagem da minha resposta do CoffeeScript, mas estou em curto-circuito ao extremo para salvar uma
return
declaração:Explicação
Para facilitar a explicação, reorganizei meu código um pouco:
Aqui estão algumas informações sobre a avaliação de curto-circuito do JS.
Demo
No momento, esta demonstração só funciona no Firefox e Edge devido ao uso do ES6:
fonte
f(['a', 'b', 0, 'c', 'd', 0], 2)
[a..b]
.f(['a', 'b', 0, 'c', 'd', 0], 1)
Ruby, 208 bytes
fonte
.rindex 0
, salvar um byte de cada vez. Você pode também poupar alguns bytes usando uma proc em vez de um método, que não tem sequer a ser nomeado:->a,i{...}
. O if / elsif / elsif provavelmente pode ser reduzido com um operador ternário aninhado...?...:...?...:...
.Haskell, 119 bytes
Exemplo de uso:
Como funciona: divida a lista de entrada na posição especificada na parte esquerda
a
, o elemento na própria posiçãox
e a parte direitab
. Se há um0
noa++x
quarto, completar o primeiro0
no reversoa++x
. Se há um0
nox++b
, dar espaço lá. Se não houver0
, combine todas as partes inalteradas para obter a lista original novamente.fonte
CoffeeScript, 96 bytes
fonte
Python 2, 102 bytes
Calcula o índice do zero a ser removido concatenando a lista revertida até o índice de inserção com a parte após o índice na ordem normal e localizando o índice do primeiro zero. Um zero é adicionado ao final para evitar
ValueError
exceções quando nenhum zero é encontrado. Em seguida, basta excluir, inserir e retornar.fonte
R, 87 bytes
Explicação
Testes
fonte
C #, 265 bytes
Golfe (265 caracteres)
Com espaços em branco e recuos
Programa completo
Casos de teste
fonte
([0, 'a', 'b', 0, 'c', 'd'], 2)
String[] Q, int P
paraString[]Q,int P
.C, 154 bytes
Passa nos casos de teste fornecidos, a é o ponteiro para a matriz, l é o comprimento da matriz (espero que isso não seja um resumo), i é o índice da inserção ec é usado internamente. Pode ser melhorado combinando a pesquisa esquerda e direita por loops.
Exemplo
Ungolfed
Simples e sem truques além da declaração do estilo K&R.
fonte