Existem N portas e K macacos. Inicialmente, todas as portas estão fechadas.
Rodada 1: O primeiro macaco visita cada porta e alterna a porta (se a porta estiver fechada, ela será aberta; se estiver aberta, será fechada).
Rodada 2 : O 1º macaco visita todas as portas e alterna a porta. Então o segundo macaco visita cada segunda porta e alterna a porta.
. . .
. . .
Rodada k: O 1º macaco visita todas as portas e alterna a porta. . . . . . . . . . O k-ésimo macaco visita cada k-ésima porta e alterna a porta.
Entrada: NK (separado por um único espaço)
Saída: números de porta abertos, cada um separado por um único espaço.
Exemplo :
Entrada: 3 3
Saída: 1 2
Restrições :
0 <N <101
0 <= K <= N
Nota :
Suponha que N portas sejam numeradas de 1 a N e K macacos sejam numeradas de 1 a K
Aquele com o código mais curto vence. Além disso, exiba a saída para N = 23, K = 21
fonte
n=k=3
produziria1 2
tão ur errado ... e 5 saídas1 2 4
há um padrão, mas é muito menos óbvio que isso.Respostas:
APL,
322826Explicação
{+/0=⍺|⍨⍳⍵}
é uma função que retorna o número de vezes que a porta⍺
(argumento da esquerda) é alternada na rodada⍵
(argumento da direita), que é igual ao número de fatores⍺
que é ≤⍵
:⍳⍵
Gere um array numérico de 1 a⍵
⍺|⍨
Calcular o⍺
módulo para cada item dessa matriz0=
Mude para 1 onde havia 0 e 0 para todas as outras coisas+/
Soma a matriz resultanteA função externa:
(⍳⍺)
,⍳⍵
Gere matrizes de 1 a N e 1 a K∘.{...}
Para cada par de elementos das duas matrizes, aplique a função Isso fornece uma matriz de número de vezes alternada, cada linha representa uma porta e cada coluna representa uma rodada.+/
Soma as colunas. Isso fornece uma matriz do número de vezes que cada porta é alternada em todas as rodadas.2|
Módulo 2, portanto, se uma porta está aberta, é 1; se estiver fechado, é um 0.(...)/⍳⍺
Por fim, gere uma matriz de 1 a N e selecione apenas as que contêm 1 na matriz na etapa anterior./⎕
Por fim, insira a função entre os números da entrada.EDITAR
,↑⍳¨⍳⍵
Gere todos os "macacos" (se K = 4, então é isso1 0 0 0 1 2 0 0 1 2 3 0 1 2 3 4
)⍳⍵
Matriz de 1 a⍵
(K)⍳¨
Para cada um deles, gere uma matriz de 1 para esse número,↑
Converta a matriz aninhada em uma matriz (↑
) e desdobre-a em uma matriz simples (,
)(,↑⍳¨⍳⍵)∘.|⍳⍺
Para cada número de 1 a⍺
(N), modifique-o com cada macaco.0=
Mude para 1 onde havia 0 e 0 para todas as outras coisas. Isso fornece uma matriz de alternância: as linhas são cada macaco em cada rodada, as colunas são as portas; 1 significa uma alternância, 0 significa nenhuma alternância.+⌿
Soma as linhas para obter uma matriz de número de vezes que cada porta é alternadaOutras peças não são alteradas
EDITAR
Use XOR reduzir (
≠⌿
) em vez de soma e mod 2 (2|+⌿
)fonte
{}/
vez de apenas tomar N e K como argumentos para o dfn?i←⍳⍺
GolfScript, 33 caracteres
Se as portas forem numeradas começando com zero, serão salvos 3 caracteres.
Exemplos ( online ):
fonte
Mathematica, 104 caracteres
Exemplo:
fonte
{n,k}=%~Read~{Number,Number}
.Ruby, 88
Com base na resposta de @ manatwork.
Esses globos desonestos sempre quebram o destaque da sintaxe!
fonte
count
bit poderia ser melhorado ainda mais, eu gostaria que o ruby tivesse um#sum
método embutido para coisas assim:>Python 3,
9784Se um macaco aparecer em um número par de rodadas, isso não muda. Se um macaco aparecer várias vezes, é o mesmo que exatamente em uma rodada.
Assim, alguns macacos podem ficar de fora, e outros apenas precisam trocar de porta uma vez.
Saída para
23 21
:fonte
range(2-K%2,K+1,2)
pararange(K,0,-2)
.for
loop por umwhile
loop:while K>0:r^=set(range(K,N+1,K));K-=2
R - 74
Simulação:
fonte
javascript
148127aqui está uma versão legível (um pouquinho):
DEMO violino
devo observar que ele começa a contar a partir de 0 (tecnicamente um erro de um por um)
fonte
b=Array(n);
Isso inicializa sua matriz como n comprimento preenchido com indefinido. Como undefined é verdadeiro, o primeiro passe de macaco transformará tudo em verdade.+1
JavaScript, 153
Saída para N = 23, K = 21:
Testado no Chrome, mas não usa nenhum novo recurso sofisticado do ECMAScript, portanto, deve funcionar em qualquer navegador!
Eu sei que nunca vou ganhar contra as outras entradas e que @tryingToGetProgrammingStrainght já enviou uma entrada em JavaScript, mas eu não estava obtendo os mesmos resultados para N = 23, K = 21 que todo mundo estava recebendo com isso, então pensei que teria uma chance na minha própria versão.
Edit : fonte anotada (ao examinar isso novamente, vi lugares para salvar outros 3 caracteres, para que provavelmente possa ser melhorado ainda ...)
fonte
+1
Ruby - 65 caracteres
Aqui está o cálculo, em pseudo-código:
Se você não está convencido de que a expressão para s (d) está correta, observe-a desta maneira:
fonte
n
e de ondek
vem? E a saída parece ser separada por novas linhas, e não por espaços.PowerShell: 132
Código de golfe:
Código não comentado, comentado:
fonte
Powershell, 66 bytes
Script de teste:
Resultado:
fonte