No meu desafio de código anterior , pedi que você escrevesse uma função que informa qual de suas linhas foi removida.
As instruções foram:
Escreva uma função que contenha cinco linhas.
Se você executar a função como ela é, ela deve retornar 0.
Se você remover qualquer uma das cinco linhas e executar a função, deverá informar qual das linhas foi removida (por exemplo, se você remover a linha final, ela retornará 5).
Agora, vamos tentar algo um pouco mais difícil.
Siga as mesmas regras acima, mas desta vez, a função retornará uma matriz informando que DUAS linhas foram removidas.
Assim, por exemplo, se eu remover as linhas 1 e 5, o valor de retorno deverá ser [1,5] e, se eu remover as linhas 3 e 4, o valor de retorno deverá ser [3,4].
Novamente, se nenhuma linha for removida, a função retornará 0. Pontos de bônus se você também puder lidar com o caso removido por uma linha, mas não é estritamente necessário que você faça isso.
Você pode fazer uso das funções auxiliares? Sim, mas somente se você precisar. Uma única função independente que realiza isso é o ideal.
Como no último desafio, a solução mais votada ganha. Escolherei o vencedor em uma semana ou mais cedo se nenhum novo envio foi recebido em 24 horas.
fonte
Respostas:
Perl
Na verdade, isso funciona para qualquer número de linhas removidas (desde que não sejam todas as linhas), e pode ser estendido trivialmente para mais de 5 linhas. Nenhuma função auxiliar é usada e ele usa apenas uma instrução por linha. Ele se baseia no fato de que, na ausência de uma
return
instrução explícita , o valor de retorno de uma função Perl é o valor da última instrução nela.Observe que (no contexto da lista) esse código retorna uma lista vazia em vez do número 0 se nenhuma linha foi excluída. Isso poderia ser corrigido (por exemplo, acrescentando "
@a ? @a : 0;
" a última linha), mas tornaria o código mais feio. Em qualquer caso, em escalar contexto, faz retornar o número de linhas removidas, o que irá ser 0 se não há linhas de ter sido removido. ;-)fonte
Rubi
Semelhante à versão Perl, mas em Ruby. Retorno 0 se nenhuma linha for excluída conforme solicitado, mas concordo que torna o código mais feio e não faz muito sentido como um valor de retorno.
Se uma matriz vazia for aceitável como o valor de retorno quando nenhuma linha for excluída, o código será semelhante a este:
Ambos os métodos funcionam para qualquer número de linhas excluídas entre 0 e 5.
fonte
JavaScript, 152 caracteres jogados
Golfe:
Independente (mas feio):
Explora basicamente a função
toString
numerando cada linha. Observe que você realmente precisa remover a linha por causa disso (comentar não funcionará).Isso realmente funciona para qualquer número de linhas removidas ! Ele retornará uma matriz das linhas removidas ou uma matriz vazia se nenhuma tiver sido removida. (Eu poderia facilmente mudar isso para retornar zero (substituindo
return ra
porreturn ra || 0
), mas eu gosto da solução de matriz vazia, pois seria mais útil no mundo real.)Por exemplo, remover a primeira linha retorna
[1]
e remover tudo, exceto a primeira linha[2,3,4,5]
. (Obviamente, não funcionará se você remover todas as linhas;-)
)fonte
Rubi
Como isso funciona: minha ideia foi: criar uma matriz e, em cada linha, remover um valor específico. Então, na primeira linha, eu tenho o array
[ 1, 2, 3, 4, 5]
, com o elemento1
removido. Na segunda linha, sea
já estiver definida, remova o elemento2
. Caso contrário, crie uma nova matriz com o elemento2
removido. Faça o mesmo para a linha 3. Na linha 4, você pode ter certeza de que já existe uma matriz criada; portanto, basta remover o elemento4
. Na linha 5, primeiro remova o elemento5
e, sea
for uma matriz vazia, retorne0
. Caso contrário, retornea
.fonte
Pitão
Retorna 0 se nenhuma linha for removida, caso contrário, retorna as linhas removidas. Você pode remover 1 a 5 linhas, exceto a 0ª e a 6ª linha ;-).
fonte
JavaScript, independente, funciona para 0, 1, 2 linhas removidas (
607315186 caracteres)→ demonstração ao vivo ←
Abuso de elevação variável de JS e vazamento global, como no outro desafio :)
para ser chamado com o array [1,2,3,4,5] como parâmetro.
315 caracteres
para ser chamado com uma matriz vazia como parâmetro.
versão sem golfe
(também funciona para 3 e 4 linhas removidas):
para ser chamado com uma matriz vazia como parâmetro.
fonte
JavaScript:
violino
fonte
Javascript
Chame como quiser, mas acho bonito .
Permite saber quais linhas foram removidas (1 ou mais) ou 0 se nenhuma linha foi removida. Todas as 5 linhas podem ser removidas.
EDITAR:
Como soube que meu código na verdade consiste em 6 linhas e viola as regras, ajustei-o da seguinte maneira:
O mesmo se aplica - ele retornará uma matriz de linhas removidas que variam de 1 - Todas ou 0, se nenhuma.
fonte
function(){
e}
(e quaisquer funções auxiliares). Conte o número de linhas.Lisp comum
Funciona para remoção de 1-4 linhas. Se você remover todas as linhas, ele retornará o mesmo que se você remover nenhuma.
NB: Ter parênteses finais em sua própria linha é considerado um estilo ruim, mas como outros idiomas têm
end
e}
eu presumo que seja permitido.fonte
Pitão
Funciona para todas as linhas - mas apenas se duas forem excluídas. Se apenas uma linha for excluída, ela imprimirá a linha e a linha 5. Se houver muitas linhas excluídas, não será impresso nada.
Isso usa uma função auxiliar porque a palavra-chave del não pode ser usada em uma linha com a; (tanto quanto eu sei)
Basicamente, cada linha se exclui na matriz que é declarada no construtor, se linhas suficientes foram excluídas, a matriz é impressa.
Essa função perde as especificações de duas maneiras:
print
ereturn
são intercambiáveisfonte
print ''
não gerar um caractere de nova linha extra, porém?Déjà Vu
Funciona para remover qualquer número de linhas (desde que você deixe pelo menos uma linha)
fonte
R
Eu tenho outra versão no R que eu acho que é melhor (mas usa uma função auxiliar):
Ou pode-se evitar o uso da função auxiliar definindo-a como um argumento padrão (funciona de forma idêntica, mas é menos legível - no entanto, ela não usa uma função auxiliar "definida separadamente"):
Ambos
reportRemovedLines()
efunnyVersion()
funcionam com qualquer número de linhas removidas - exceto se você remover todas as linhas (nesse caso, elas retornarãoNULL
). Na verdade, eles retornam os números de linha, não apenas os imprimem - como em R, o valor da última expressão avaliada em uma função será retornado automaticamente.Como funciona? O truque está no
trick
função que pega todos os objetos de seu "ambiente pai" (ou seja, ambiente da função que o chama), reúne seus valores em um vetor e retorna, cujos valores de 1 a 5 não são representados.fonte
JavaScript (136/166 caracteres)
Uma versão menor com alguns valores declarados no início:
Uma versão independente (você não precisa passar nada - o argumento b está lá para que eu possa verificar se b está definido com
||
)Sim, ambos têm
return
declarações, mas isso é justo se eu estiver competindo com idiomas com retorno implícito.fonte
R
Uma versão simples (não é infalível, pois você receberá um erro se remover a linha 5):
E uma versão infalível:
Ele funciona com qualquer número de linhas removidas (exceto se você remover todas as linhas) e pode ser facilmente estendido para mais de 5 linhas. Executá-lo "como está" retornará, o
integer(0)
que é conceitualmente semelhante a retornar apenas0
. Retornar um 0 real tornaria mais feio e mais longo, mas não seria complicado.Finalmente, uma versão usando mágica:
Função auxiliar:
A função real:
fonte
C ++
Como usar: chame a função com ie use func2 para entender o que a função está dizendo.
Se você alterar a linha int arr [] = {0,0} para int arr [] = {0,0,0,0,0}, ela também funcionará para todas as cinco linhas, também será handline uma linha remover caso de teste automaticamente, o que estou fazendo é simplesmente usar bits de uma variável como uma bandeira para cada linha ....
fonte
function
tem seis linhas, não cinco?