Vamos jogar um jogo para um jogador chamado jump the array . Para jogar, você só precisa de uma matriz de números inteiros, digamos a
. Você começa em alguma posição i
e, em cada turno, salta para uma nova posição. Por sua vez n
,
- se
n
for par, você pula para a posição absolutaa[i] mod length(a)
, - se
n
for ímpar, você pula para a posição relativa(i + a[i]) mod length(a)
.
A indexação da matriz começa em zero. Você pode contar o primeiro salto como turno 0
ou turno 1
, o que dá um jogo diferente. Como o espaço de estado do jogo é finito (sua jogada é determinada pela sua posição e pela paridade do número do turno), é claro que você finalmente entrará em um loop de comprimento uniforme. Indique pela loop(a, i, b)
duração desse loop, quando o primeiro salto é contado como turno b
.
Entrada
Uma matriz não vazia a
de números inteiros para jogar.
Resultado
O número máximo p
que, ao iniciar em alguma posição i
e contar o primeiro turno como um 0
ou outro 1
, você eventualmente insere um loop de comprimento 2 * p
. Em outras palavras, sua saída é o número
max { loop(a, i, b)/2 : i in [0 .. length(a)-1], b in [0,1] }
Regras
Você pode atribuir uma função ou um programa completo. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
[0] -> 1
[-213] -> 1
[1,3,12,-1,7] -> 1
[2,3,5,7,9,11,13,17,19] -> 2
[-2,3,-5,7,-9,11,-13,17,-19,23,-27] -> 3
[0,2,5,4,-9,0,-1,1,-1,1,-6] -> 4
fonte
mod
seja definido como sempre positivo (-1 mod 5 == 4
), diferentemente de C. É esse o caso?mod
, que sempre fornece resultados não negativos.Respostas:
Pitão : 28 caracteres (caractere Python 2: 116)
Uso:
Experimente aqui: Pyth Compiler / Executor
Ele espera uma lista de números inteiros como entrada
[0,2,5,4,-9,0,-1,1,-1,1,-6]
Explicação:
Notei uma propriedade importante da função
loop
: para cada umai
existe umaj
, de modo queloop(a,i,0) == loop(a,j,1)
e vice-versa. Portanto, precisamos apenas calcular os valoresloop(a,i,b)
parab=0
.Prova: se o ciclo é
i -> j -> k -> ... -> z -> i
comb = 0
, então existe o cicloj -> k -> ... -> z -> i -> j
comb = 1
.Portanto, um script simples pode funcionar da seguinte maneira. Repita sobre todos
i
e tente alcançá-loi
computando iterativamentei = a[(i + a[i]) mod len(a)] mod len(a)
. Como esse cálculo pode ocorrer em um ciclo semi
, cancelamos o cálculo após aslen(a)
etapas. Em seguida, imprimimos o ciclo máximo.Uma implementação do Python 2 se parece com isso ( 125 caracteres }:
Para a implementação do pyth, usei uma abordagem um pouco diferente. Para cada
i
eu calculo a lista de posições e procuroi
nesta lista.editar: Python 2: 116 caracteres
A solução do @proud haskeller era alguns caracteres menor que a minha solução Python, portanto, 'tive' que abreviá-la um pouco.
A diferença é que eu calculo o número recursivamente em vez de iterativamente.
fonte
Python - 157
fonte
len(a)
uma variável e substituir alllen(a)
s pelo nome dessa variável, poderá salvar alguns caracteres.t+=1;t%=2
->t^=1
andif t: j=(j+a[j])%z else: j=a[j]%z
->j=(t*j+a[j])%z
while c not in s[:-1]:
poderia serwhile(c in s[:-1])-1:
.j
, pois esse loop atribui o conteúdo derange(z)
ao emi
vez de incrementá-lo. Basta substituirj
pori
para salvar 4 caracteres.Haskell,
120105isso gera uma lista infinita para cada ponto de partida (por razões de golfe, iteramos sobre todos os valores, em vez de todos os índices, que são equivalentes). depois calcula o ciclo de cada lista (a duração do ciclo
xs
éxs % []
).ele usa as observações de @ jakubes sobre ciclos. porque ele dá 2 passos por vez, não precisamos dividir por 2 no final.
Edit : agora usando o truque do @ MthViewMark de eliminar os primeiros
n
elementos para garantir um ciclo com o primeiro elemento. a propósito, eu consegui jogar seu algoritmo em112
caracteres:fonte
Haskell - 139 caracteres
Exemplos:
Isso faz uso da observação de @ jakube de que você só precisa verificar metade dos valores iniciais, enquanto executa 2 etapas por iteração.
fonte
where
para o anterior]
. Além disso, você tentou usar emcycle l!!i
vez del!!mod n(length l)
?b
e usar uma proteção de padrão|n<-l a
para eliminar owhere
.Python, 160
A função de resposta é
j
.A função recursiva
l
retorna o comprimento do loop para uma determinada matriz, início e primeiro turno, e a funçãoj
encontra o máximo.fonte
lambda
.Mathematica,
189 162161 bytesSe funções anônimas forem permitidas - 161 bytes:
Caso contrário - 163 bytes:
Executando isso em todos os casos de teste:
Resulta em:
Python 2, 202 bytes
DEMO
Esta é quase uma porta da minha resposta do Mathematica.
fonte
For
com 3 argumentos geralmente é menor queWhile
(já que você pode economizar um ponto e vírgula na frente doFor
).Mathematica,
113112 caracteresExemplo:
fonte
ised 82
O primeiro argumento não conta em tamanho (inicialização de array
$1
eb
inicialização em$2
- selecione o "jogo").fonte