Introdução
Neste desafio, sua tarefa é simular um certo tipo de jogo de eliminação. No jogo, os participantes ficam em círculo e todos estão segurando um número inteiro. Em cada rodada do jogo, cada participante aponta para a pessoa n
que se afasta, se n
é o número que está segurando. Se n
é positivo, conta à direita, se n
é negativo, conta à esquerda e, se n
for zero, aponta para si. Todo participante que tem alguém apontando para eles é eliminado e sai do círculo; isso termina a rodada. As rodadas continuam até que não haja mais participantes.
Entrada
Sua entrada é uma lista não vazia de números inteiros, em qualquer formato razoável. Representa os números que os participantes do jogo estão segurando.
Resultado
Sua saída é o número de rodadas necessárias até o final do jogo.
Exemplo
Considere a lista de entrada [3,1,-2,0,8]
. Na primeira rodada, acontece o seguinte:
- A pessoa que está segurando
3
aponta diretamente para a pessoa que está segurando0
. - A pessoa que está segurando
1
aponta diretamente para a pessoa que está segurando-2
. - A pessoa que mantém
-2
pontos deixados na pessoa que está segurando3
. - A pessoa que
0
aponta para si mesma. - A pessoa que está segurando
8
aponta diretamente para a pessoa que está segurando-2
(a lista representa um círculo, de modo que envolve as extremidades).
Isso significa que 0
, -2
e 3
são eliminados, a segunda rodada é feita com a lista [1,8]
. Aqui, 1
aponta para 8
, e 8
aponta para si mesmo, então 8
é eliminado. A terceira rodada é feita com a lista [1]
, onde 1
simplesmente aponta para si mesma e é eliminada. Foram necessárias três rodadas para eliminar todos os participantes, portanto a saída correta é 3
.
Regras e pontuação
Você pode escrever um programa completo ou uma função. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.
Casos de teste
[3] -> 1
[0,0,0] -> 1
[-2,-1,0,1,2,3,4,5,6,7] -> 2
[5,5,5,6,6,6] -> 2
[3,-7,-13,18,-10,8] -> 2
[-7,5,1,-5,-13,-10,9] -> 2
[4,20,19,16,8,-9,-14,-2,17,7,2,-2,10,0,18,-5,-5,20] -> 3
[11,2,7,-6,-15,-8,15,-12,-2,-8,-17,6,-6,-5,0,-20,-2,11,1] -> 4
[2,-12,-11,7,-16,9,15,-10,7,3,-17,18,6,6,13,0,18,10,-7,-1] -> 3
[18,-18,-16,-2,-19,1,-9,-18,2,1,6,-15,12,3,-10,8,-3,7,-4,-11,5,-15,17,17,-20,11,-13,9,15] -> 6
fonte
n
é o número que a pessoa está segurando?Respostas:
Pitão, 15 bytes
Suíte de teste graças a Kirby
Usa o mesmo mecanismo de iteração que o @orlp, mas detecta o número de iterações usando
f
a função "Repetir até falsidade", para detectar a[]
vez que terminarmos.fonte
Matlab,
9177 bytesVersão antiga:
Esse é um desafio no qual o matlab brilha, o coração desse código é a exclusão das entradas da matriz: o
a(mod((1:l)+a-1,l)+1)=[]
que é bastante elegante, eu acho.fonte
CJam, 21 bytes
Suíte de teste.
Recebe entrada como uma lista de estilos CJam, mas a suíte de testes cuida da conversão do formato no desafio.
Explicação
fonte
ee
é quase exatamente o que eu estava procurando ontem para uma pergunta diferente.C #,
251219211197193 bytesA linguagem não esotérica mais ingovernável ataca novamente.
Este programa espera a sequência de entrada como argumentos da linha de comandos. Por exemplo, para inserir a lista
[5,5,5,6,6,6]
, chame-a com argumentos de linha de comando5 5 5 6 6 6
.Obrigado a Martin Büttner por algumas dicas.
Aumentou para 197 ao perceber que eu posso reutilizar a
args
matriz, mesmo que seja uma série de seqüências de caracteres. Eu só preciso analisá-los em um número inteiro em um só lugar.Golfou para 193 ao perceber que
.Where(...==x).Any()
é menor que.Select(...).Contains(x)
.Ungolfed
fonte
Pitão, 21 bytes
Demonstração ao vivo com casos de teste.
fonte
R, 105 bytes
código
destroçado
fonte
Pitão, 17 bytes
Coincidentemente muito semelhante à resposta de Kirbyfan.
fonte
Mathematica, 71 bytes
fonte
(i=0;#//.l:{__}:>l~Delete~Mod[++i;Plus~MapIndexed~l,Length@l,1];i)&
Plus~MapIndexed~#
é realmente inteligente, mas gostaria de saber se não há uma maneira mais curta de usarl+Range@Length@l
.STATA, 146 bytes
Usa a versão paga do STATA. Supõe que a entrada esteja em um arquivo separado por nova linha chamado
a.
. Limitado a situações em que não são necessárias mais de 1023 rodadas devido a um número máximo de variáveis permitido (pode ser corrigido ao custo de 10 bytes). Ele lê os dados e executa um loop até que não haja mais observações. Em cada iteração, faça uma variável com o valor do índice para o qual aponta. Para cada observação, se outra observação apontar para ela, defina um indicador para descartar a variável. Em seguida, descarte todas as observações com esse indicador e aumente o contador. Após o loop, imprima o contador.fonte
Ruby,
7874 bytesfonte
awk, 66 bytes
Simplesmente usa
mod length array
para mantê-lo dentro da matriz. Na entrada, os números precisam ser separados por espaços.Exemplo de uso
Aqui estão todos os exemplos de entrada no formato apropriado
fonte
Python 2, 122 bytes
fonte