Já faz um tempo desde que você matou aquela hidra , você se deliciou com a glória por anos, mas agora as pessoas estão chamando você de lavada, um tem sido. Bem, é hora de você provar que estão errados. Você já ouviu o paradeiro de outra hidra. Basta matá-lo e você receberá toda a glória que você merece.
Você chega ao arsenal para receber suas espadas, mas todas elas estão fora das espadas regulares, tudo o que resta são os setores. Um setor n dividirá o número de cabeças em uma Hydra por n, mas só poderá ser usado se o número de cabeças for divisível por n.
Mais uma vez, você escreverá um código para ajudá-lo a matar a hidra. Seu código terá como entrada o número de cabeças da hidra, começa a briga, o número de cabeças que a hidra cresce a cada turno e uma lista de n setores que você pode usar. Seu código produzirá um padrão ideal de movimentos para matar a hidra o mais rápido possível
A cada turno da luta, você pode selecionar uma única espada para usar, se após uma fatia a hidra tiver apenas uma cabeça que você ganhar, se não, ela crescerá. Você nunca pode fazer nenhum movimento, e se não houver movimentos possíveis disponíveis, você perde.
Se nenhuma solução for possível, você poderá produzir outra coisa senão uma solução, por exemplo, uma lista vazia, nada, o número zero, etc.
Isso é código-golfe, então as respostas serão pontuadas conforme a contagem de bytes, com menos sendo melhores.
Casos de teste
Aqui estão alguns casos de teste super básicos, mais casos de teste serão adicionados mediante solicitação.
24 heads, 1 heads per turn, [2,3] -> [3,3,2,3]
25 heads, 2 heads per turn, [2,3] -> No solutions
4 heads, 2 heads per turn, [2] -> No solutions
4 heads, 3 heads per turn, [2,5] -> [2,5]
10 heads, 17 heads per turn, [2, 3, 7, 19] -> No solutions
10 heads, 6 heads per turn, [1,16] -> [1,16]
6 heads, 2 heads per turn, [2, 3, 5] -> [2, 5]
125 heads, 1 head per turn, [1, 2, 3, 127] -> [1, 1, 127]
Respostas:
JavaScript (ES6),
111105 bytesGuardado 4 bytes graças a @ThePirateBay
Abaixei a recursão em profundidade que estava tentando usar para os loops de largura em primeiro lugar, muito mais seguros. Produz a solução como uma matriz, se existir, é executada para sempre, se não existir. Se isso não for permitido, aqui está um que acaba por parar (na maioria dos casos, de qualquer maneira):
fonte
JavaScript,
191190 bytesGuardou um byte graças a Step Hen
fonte
Python 2 ,
169195222 bytes+26 bytes para lidar adequadamente com a regeneração cíclica da cabeça em más escolhas de armas. (Obrigado a @ThePirateBay por apontar isso)
+27 bytes para corrigir certos casos de borda que causam erros.
Experimente online!
fonte
VB.NET (.NET 4.5), 439 + 35 (importações) = 474 bytes
Requer
Imports System.Collections.Generic
A função
Z
usa doisInt64
(número de cabeças e taxa de regeneração da cabeça) e umaList(Of Int64)
(Setores), e retorna umList(Of Int64) (the ordered choice of Sectors). Returns
Nothing` se não houver solução.Assume que os setores são apresentados em ordem classificada do maior para o menor.
Os
Optional
parâmetros são para as chamadas recursivas para salvar o estado. Eles rastreiam a ordem atual dos setores em uso, a ordem mais curta dos setores e o número de cabeças encontradas. Se encontrarmos o mesmo número de cabeças novamente, deve haver uma maneira mais curta de alcançá-lo.A única ordem dos setores que importa é que preciso
1
ser o último, se existir. Caso contrário, a hidra poderá crescer sem limites, porque eu poderia, a cada passo, usar o1
Setor e nunca tentar outro.Declarei uma constante
N
para representarNothing
, cortando 6 bytes cada vez que desejava usarNothing
.And
/Or
não estão em curto-circuito, portanto, uso o operador condicional nulo (?.
) para evitar erros nulos no objeto. Em código real, eu usariaAndAlso
/OrElse
que faz curto-circuito.Experimente online!
Z
sem golfe para facilitar a leiturafonte