O desafio
Escreva uma função que leva dois inteiros positivos n e k como argumentos e retorna o número da última pessoa remanescente de n após a contagem a cada k pessoa -ésimo.
Este é um desafio do código-golfe, portanto o código mais curto vence.
O problema
n pessoas (numeradas de 1 a n ) estão em pé em círculo e cada k- ésimo é contado até que uma única pessoa permaneça (consulte o artigo correspondente da wikipedia ). Determine o número dessa última pessoa.
Por exemplo, para k = 3, duas pessoas serão puladas e a terceira será contada. Ou seja, para n = 7, os números serão contados na ordem 3 6 2 7 5 1 (em detalhes 1 2 3 4 5 6 7 1 2 4 5 7 1 4 5 1 4 1 4 ) e, portanto, a resposta é 4 .
Exemplos
J(7,1) = 7 // people are counted out in order 1 2 3 4 5 6 [7]
J(7,2) = 7 // people are counted out in order 2 4 6 1 5 3 [7]
J(7,3) = 4 // see above
J(7,11) = 1
J(77,8) = 1
J(123,12) = 21
{k block}
para[0..n-1]
vocêg(0,k) 0 k
começar? Desculpe, se estou postando essas perguntas no lugar errado.0 1 block
. Muito convenientemente, isso aconteceg(1, k) (2-1) block
. Então está começando emg(1,k) 1
vez deg(0,k) 0
. Depois de executar o bloco, ele empurra o próximo item da matriz (2
) e executa o bloco novamente etc.Minsky Register Machine (25 estados sem interrupção)
Não é tecnicamente uma função, mas está em um paradigma de computação que não possui funções em si ...
Essa é uma pequena variação no caso de teste principal do meu primeiro desafio de interpretação de MRM :
Entrada em registros
n
ek
; saída no registror
; assume-se quer=i=t=0
na entrada. As duas primeiras instruções de interrupção são casos de erro.fonte
k=1
entãor=0
. Hmm, eu tenho que pensar sobre esta uma vez ...i
é simplesmente contar a partir2
den
quandor
é o registro que acumula o resultado.Python, 36
Eu também usei a fórmula da wikipedia:
Exemplos:
fonte
Mathematica,
3836 bytesMesma fórmula da Wikipedia:
fonte
If[#<2,1,Mod[#0[#-1,#2]+#2,#,1]]&
C, 40 caracteres
Essa é basicamente a fórmula que o artigo da Wikipedia acima fornece:
Para variedade, aqui está uma implementação que realmente executa a simulação (99 caracteres):
fonte
j(n,k){return--n?(j(n,k)+k-1)%-~n+1:1;}
.dc, 27 bytes
Usa a recorrência do artigo da Wikipedia. Explicação:
fonte
J, 45 caracteres
Executa a simulação.
Como alternativa, usando a fórmula (31 caracteres):
Espero que Howard não se importe de ter ajustado um pouco o formato de entrada para se adequar a um verbo diádico em J.
Uso:
fonte
GolfScript,
3224 bytesUso: espera que os dois parâmetros n e k estejam na pilha e deixe o valor de saída.
(obrigado a Peter Taylor por sugerir uma abordagem iterativa e muitas outras dicas)
A abordagem antiga (recursiva) de 32 caracteres:
Este é o meu primeiro GolfScript, então, por favor, deixe-me saber suas críticas.
fonte
1-
tem opcode especial(
. Da mesma forma1+
é)
. Você não precisa usar caracteres alfabéticos para armazenamento; portanto, você pode usar, por exemplo, em^
vez de,J
e não precisar de um espaço depois dele. Você tem muito mais programas$
do que o habitual em um programa bem disputado: considere se você pode reduzi-los usando alguma combinação de\@.
.$
referências.g
do artigo da Wikipedia e use,
e/
.{,{\2$+\)%}*)\;}:f;
Certifique-se de entender por que ele funciona;)k
dentro do loop e mais 2 para descartá-lo no final, podemos puxá-lo para dentro usando+
até 17 caracteres:{{@+\)%}+\,*)}:f;
duvido que possa ser melhorado.R, 48
Versão em execução com exemplos: http://ideone.com/i7wae
fonte
Groovy, 36 bytes
fonte
Haskell, 68
Faz a simulação real. Demonstração:
fonte
Scala, 53 bytes
fonte
C, 88 caracteres
Faz a simulação, não calcula a fórmula.
Muito mais longo que a fórmula, mas mais curto que a outra simulação C.
Notas:
1. Aloca memória e nunca libera.
2. Aloca em
n*8
vez den*4
, porque eu usop[n]
. Pode alocar(n+1)*4
, mas são mais caracteres.fonte
C ++, 166 bytes
Golfe:
Ungolfed:
fonte
J
função, usando o operador ternário.intn
na sua versão Golfed não irá compilar#include <list>
J, 8 bytes
fonte
Ruby, 39 bytes
Versão em execução com casos de teste: http://ideone.com/pXOUc
fonte
Q, 34 bytes
Uso:
fonte
Ruby, 34 bytes
fonte
Haskell, 29
Usando a fórmula da wikipedia.
fonte
JavaScript (ECMAScript 5), 48 bytes
Usando o ECMAScript 5, já que essa era a versão mais recente do JavaScript no momento em que essa pergunta foi feita.
Versão ES6 (não concorrente), 33 bytes
Explicação
Não há muito a dizer aqui. Estou apenas implementando a função que o artigo da Wikipedia me fornece.
fonte
05AB1E , 11 bytes
Experimente online!
fonte
Oitavo , 82 bytes
Código
O SED (diagrama de efeito de pilha) é:
n k -- m
Uso e explicação
O algoritmo usa uma matriz de números inteiros como este: se o valor das pessoas for 5, a matriz será [1,2,3,4,5]
fonte
J , 24 bytes
Experimente online!
Uma abordagem iterativa baseada na solução de programação dinâmica.
Explicação
fonte
J , 19 bytes
Experimente online!
Como funciona
fonte
Dardo , 33 bytes
Experimente online!
fonte
Japonês , 15 bytes
Experimente online!
Um byte pode ser salvo pela indexação 0 k , mas, na verdade, não é um índice, então decidi contra isso.
Explicação:
fonte
Japonês
-h
, 10 bytesTente
fonte
PowerShell, 56 bytes
Importante! O script se chama recursivamente. Então salve o script como
f.ps1
arquivo no diretório atual. Além disso, você pode chamar uma variável de bloco de script em vez de arquivo de script (consulte o script de teste abaixo). Isso chama tem o mesmo comprimento.Script de teste:
Saída:
fonte