Há uma pergunta neste site que é semelhante a essa pergunta, mas eu adicionei uma reviravolta.
Você tem três entradas, o número de pessoas no círculo n , a k- ésima pessoa contada em cada etapa e a q-é a pessoa que sobrevive. As pessoas no círculo são numeradas de 1 a n .
Por exemplo, em um círculo de 20 pessoas, a 20ª pessoa a sobreviver é a primeira pessoa removida, o 19º sobrevivente é a segunda pessoa removida e assim por diante. Normalmente, o problema de Josephus é determinar a última pessoa removida, aqui chamada de primeiro sobrevivente.
Escreva o programa ou a função mais curta que, com essas três entradas, retorne o número da q- ésima pessoa a sobreviver.
Se houver algum problema com clareza, entre em contato.
Alguns exemplos:
>>> josephus(20, 3, 9)
4
>>> josephus(4, 3, 1)
1
>>> josephus(100, 9, 12)
46
Editar: Assuma que todas as entradas são válidas. Ou seja, ninguém pedirá zero ou nenhum número negativo e ninguém pedirá o vigésimo sobrevivente em um círculo de 5 pessoas (ou seja, 1 ≤ q ≤ n)
Edit: Aceito uma resposta à meia-noite UTC + 7 no início de 2 de dezembro.
q=1
isso é exatamente o mesmo que a questão de Josephus, certo?Respostas:
Pitão, 16 bytes
Experimente on-line: Demonstration or Test Suite
Entrada é da forma
k<newline>n<newline>q
.Explicação:
fonte
Piet,
280273 codéisEdit: Eu joguei isso um pouco mais, e acho que posso jogar ainda mais, mas isso ainda está por vir. Por enquanto, estou feliz que funcione e que eu tenha espaço para assiná-lo no canto inferior esquerdo. Duas idéias que tenho para salvar mais codelos são: a) alterar as instruções finais
pop, push 1, add, out num
(pop n, saída r + 1) eb) duplicar novamente no canto inferior esquerdo para salvar codels na manipulação de pilha posteriormente no loop.A imagem acima é o meu código de 8 pixels por codel. Em geral, é o mesmo algoritmo da minha resposta Python, mas com as entradas na ordem de k , q , n . Na prática, há também uma grande quantidade de manipulação de pilha. Você pode tentar aqui , abrindo a imagem e executando o código com ele.
Explicação
Esta é uma descrição passo a passo da solução.
fonte
CJam,
222019 bytesIsso lê a entrada como
q k n
. Experimente online no intérprete CJam .Como funciona
fonte
Golfscript,
585655353130 bytesSupondo que as três entradas já estejam na pilha, na ordem n , k , q
Essa solução pressupõe que eu preciso me livrar de tudo, exceto a resposta final.
Como funciona
Veja
j(n,k,q)
na minha solução Python 3 para mais detalhes.Edit 1: Used @ Doorknob's sugestão (Adicionado um + para obter todas as entradas na matriz)
Anteriormente,
Editar 2: Adicionado ~, de acordo com as regras do wiki, e reduziu o código. Obrigado @Dennis
Anteriormente,
Edit 3: Implementado um algoritmo mais curto.
Anteriormente,
Edit 4: Descobri que eu poderia usar
%
como mapa.Anteriormente,
Edição 5: Edição secundária. Mudou
2$
para@
fazer[0..q-1]
e3$
para2$
recuperark
. Salvo uma mordidaAnteriormente,
fonte
\;\;\;\;
pode ser substituído por])\;
(agrupar na matriz, desconectar à direita, trocar e pop).JavaScript (ES6), 56 bytes
Ungolfed
Basicamente, uma adaptação em JavaScript da resposta Python do @ Sherlock9 .
Teste
fonte
Mathematica, 50 bytes
Uma função anônima. Recebe entradas na ordem
q,n,k
.fonte
C,
8173 bytesBaseado na implementação Javascript de @ user81655 da minha resposta em Python.
Editar: Removido i
Teste
fonte
int
nome dos parâmetros antes.Python 3,
726662 bytesUma função de programação dinâmica em 62 bytes. Adaptado do algoritmo na Wikipedia. Costumava haver uma implementação direta desse algoritmo quando q = 1 (ie i = 1, r = 0) nessa página, mas vejo que foi removido agora.
Editar 1: removi
i
para salvar 4 bytes. A explicação permanece inalterada.Editar 2: Erro de cálculo na contagem de bytes. Eu estava usando o
\r\n
EOL e não percebi quando isso adicionou 3 bytes. Reduzi minha contagem de bytes de acordo.Como isso funciona
Agradeço ao @Dennis por me lembrar que eu deveria explicar meu código (mesmo que implicitamente, porque ele incluiu um em sua resposta). Se alguma coisa não estiver esclarecida, comunique-me por favor.
Editar:
Anteriormente,
Uma função iterativa que é adaptada de Concrete Mathematics por Graham, Knuth e Patashnik. Embora este algoritmo é mais longo, é mais rápido para grandes n e pequenas k .
fonte
+
.PHP, 71 bytes
Com base nas respostas de @ Sherlock9. Veja sua resposta em Python para o algoritmo.
Como alternativa, aqui está minha abordagem ingênua original, sem o algoritmo. Isso usa uma matriz para marcar quais pessoas são encontradas.
91 bytes
fonte
Haskell,
484743 bytesBaseado no algoritmo Haskell na página Código Rosetta da função Josephus com duas entradas. Sugestões de golfe são bem-vindas.
Edit: Meus agradecimentos a nimi pela ajuda com o golfe no primeiro algoritmo, sugerindo uma versão sem pontos, e pela ajuda com o golfe no segundo algoritmo, informando que a
until
palavra - chave existe.Uma versão do algoritmo no final da minha resposta em Python adaptada de Concrete Mathematics por Graham, Knuth e Patashnik. Embora esse algoritmo tenha mais de 62 bytes e não tenha atingido o máximo do primeiro, é mais rápido para grandes
n
e pequenosk
.Ungolfed:
Primeiro algoritmo
Segundo algoritmo
fonte
until
para uma tradução (mais ou menos) direto da versão Python do 2º algoritmo:(n#k)q|m<-k-1=1+n*k-until(>n*m)(\z-> -div(-z*k)m)(q*k-mod m q)
.foldl
e listas infinitas e todo tipo de coisa. Obrigado pela ajuda!Linguagem GameMaker (GML), 88 bytes
Com base na resposta de @ user81655
fonte
Geléia ,
1413 bytesTryItOnline!
Quão?
fonte
Ruby,
5348 bytesUma lambda.
Como funciona
fonte