Dada uma sequência de números, encontre o número mínimo de saltos para ir da posição inicial até o final e volte à posição inicial.
Cada elemento da sequência indica o número máximo de movimentos que se pode mover a partir dessa posição.
Em qualquer posição, você pode saltar no máximo de k movimentos, em que k é o valor armazenado nessa posição. Depois de chegar ao fim, você pode usar apenas as posições para pular que não foram usadas anteriormente para pular.
A entrada será dada como uma sequência de números separados por espaços simples. A saída deve ser um número único, que é o número mínimo de saltos usados. Se não for possível ir até o fim e voltar à posição inicial, imprima -1
Entrada:
2 4 2 2 3 4 2 2
Resultado:
6 (3 para chegar ao fim e 3 para voltar)
Entrada
1 0
Resultado
-1
Nota
- Suponha que todos os números da sequência não sejam negativos
EDIT 1
A linha "Assim, deve ficar claro que sempre se pode pular da última posição". pode ser confuso, então eu o removi da pergunta. Não terá efeito sobre a questão.
Critérios de vencimento:
O vencedor será aquele com o código mais curto.
fonte
Thus, it should be clear that one can always jump from the last position.
- não é1 0
um contra-exemplo?Respostas:
APL (Dyalog), 116
Casos de teste
Abordagem
A abordagem é uma pesquisa de força bruta usando uma função recursiva.
A partir da posição 1, defina o valor na posição atual como 0 e gere uma matriz das posições que podem ser saltadas para a partir da posição atual. Passe a nova posição e a matriz modificada para si mesma. Os casos básicos são quando o valor na posição atual é 0 (não é possível pular) ou está chegando ao fim.
Em seguida, para cada matriz gerada, inverta-a e faça a pesquisa novamente. Como as posições saltadas estão definidas como 0, não podemos pular de lá novamente.
Para os vetores que atingimos o final, encontre os que possuem o número mínimo de 0's. Subtraindo dele o número de 0 na matriz inicial fornece o número real de saltos executados.
fonte
Mathematica,
197193 caracteresForça bruta.
fonte
Mathematica 351
[Nota: isto ainda não está totalmente jogado; Além disso, a entrada precisa ser ajustada para se ajustar ao formato necessário. E a regra de não pular na mesma posição duas vezes precisa ser implementada. Há também alguns problemas de formatação de código que precisam ser resolvidos. Mas é um começo.]
Um gráfico é construído com nós correspondentes a cada posição, ou seja, cada dígito de entrada representando um salto.
DirectedEdge[node1, node2]
significa que é possível pular do nó1 para o nó 2. Os caminhos mais curtos são encontrados do início ao fim e do fim ao início.Uso
fonte
Python 304
Eu acho que essa nova abordagem resolve (espero!) Todos os problemas relacionados ao caso [2,0] e similares:
Nesta versão, a sequência de entrada é percorrida (se possível) até o final e, em seguida, iniciamos o processo novamente com a sequência invertida. Agora podemos garantir que, para cada solução válida, um dos saltos caia no último elemento.
Estas são as versões golfed:
E alguns exemplos:
fonte
R - 195
Simulação:
De-golfe:
fonte
Python 271
esta é a minha solução:
Exemplos:
E estas são as versões (parcialmente até agora) do golfe:
Alguns exemplos:
fonte
Ruby - 246
Simulação:
fonte
Ruby - cerca de 700 jogadores de golfe. Comecei uma versão golf, com nomes de caracteres únicos para variáveis e métodos, mas depois de um tempo fiquei mais interessado no algoritmo do que no golf, então parei de tentar otimizar o comprimento do código. Também não me preocupei em obter a string de entrada. Meu esforço está abaixo.
Para ajudar você a entender como funciona, incluí comentários que mostram como uma string específica (u = "2 1 4 3 0 3 4 4 3 5 0 3") é manipulada. Enumero combinações de "rochas no fluxo" que estão disponíveis para saltar. Estes são representados com uma cadeia binária. Dou o exemplo 0b0101101010 nos comentários e mostro como ele seria usado. Os 1s correspondem às posições das rochas disponíveis para a viagem inicial; os 0 para a viagem de volta. Para cada alocação, uso a programação dinâmica para determinar o número mínimo de saltos necessários em cada direção. Também realizo algumas otimizações simples para eliminar algumas combinações desde o início.
Eu o executei com as strings fornecidas em outras respostas e obtenho os mesmos resultados. Aqui estão alguns outros resultados que obtive:
Eu estaria interessado em saber se outras pessoas obtêm os mesmos resultados para essas strings. O desempenho é bom razoável. Por exemplo, levou menos de um minuto para obter uma solução para essa sequência:
"3 4 3 0 4 3 4 4 5 3 5 3 0 4 3 3 0 3 4 5 3 2 0 3 4 1 6 3 2 0 4 5 3 2 0 3 4 1 6 3 0 4 3 4 4 5 0 1"
O código segue.
fonte
Haskell,
173166 bytes, 159 bytes em GHCiAqui está a versão normal:
importar Data.List
Aqui está a resposta do GHCi (coloque a linha uma de cada vez):
Apenas uma força bruta. Gere a resposta possível. (ou seja, permutação de [0..n-1] com zero e o elemento seguinte eliminado. Em seguida, verifique se a resposta está correta. Obtenha o comprimento mínimo e adicione um. (Como os zeros à esquerda e à direita são excluídos).
Como usar:
j[3,4,0,0,6]
->3
fonte
Data.List.permutations
não funciona no GHC, mas apenas no GHCi. De acordo com o nosso Guia de regras de golfe em Haskell , você deve adicionar a importação ou marcar sua resposta como "Haskell GHCi". A primeira opção é geralmente preferida pelos golfistas Haskell neste site.a<-permutations[0..t l-1],let f=takeWhile(/=0)a
, você pode escreverf<-map(takeWhile(/=0))(permutations[0..t l-1])
, o que pode ser jogado novamentef<-fst.span(>0)<$>permutations[0..t l-1]
. Com isso, você volta a 166 bytes, mesmo adicionando a importação: Experimente online!