Fundo:
Jack é uma abóbora que gosta de assustar os cidadãos das aldeias perto de seu canteiro de abóboras todo Halloween. No entanto, todos os anos depois que alguém acende a vela dentro dele, ele tem um tempo limitado para assustar a todos antes que a vela se queime, sendo incapaz de assustar mais os moradores porque ninguém pode vê-lo. Nos últimos anos, ele só conseguiu assustar uma pequena quantidade de aldeias devido à sua má tomada de decisões, mas agora que ele tem você para ajudá-lo, ele poderá assustar o maior número possível de aldeias!
Tarefa:
Dada uma lista dos locais das aldeias e o tempo de vida das velas, produza o número máximo de aldeias que Jack pode visitar. Você não precisa imprimir o caminho em si.
Entrada:
A vida útil da vela e uma lista de localidades da vila em um sistema de coordenadas cartesianas. O canteiro de abóboras das quais Jack se origina sempre será 0,0. Você pode formatar a entrada da maneira que desejar. Para simplificar os movimentos de Jack, ele só pode se mover horizontalmente, verticalmente ou diagonalmente, o que significa que sua vela perderá 1 ou 1,5 (ele demora um pouco mais na diagonal) unidades de vida a cada movimento. A vela queima quando a vida útil é menor ou igual a 0.
Saída:
Um número inteiro igual ao número máximo de aldeias que Jack pode visitar antes que a vela se apague.
Regras:
Isso é código-golfe , então o código mais curto em bytes vence. As brechas padrão não são permitidas.
Casos de teste:
// Format [lifespan] [list of village coordinates] -> [maximum visit-able villages]
4 -1,0 1,0 2,0 3,0 4,0 5,0 -> 3
4 1,1 2,2 3,3 -> 2
5 1,1 2,1 3,1 4,1 5,0 5,1 -> 4
fonte
Respostas:
Geléia,
30292725 bytesExperimente online!
Aparentemente, o produto escalar de Jelly ignora uma incompatibilidade de tamanho de lista e não multiplica os elementos extras da outra matriz, apenas os adiciona. Raspa 2 bytes.
Explicação
fonte
Java 7,
206201 bytesObrigado a @KevinCruijssen por salvar 5 bytes
Ungolfed
fonte
i-x
duas eb[c]-y
duas vezes, para poder adicionar,t
às entradas e depois usar: emMath.sqrt((t=i-x)*t+(t=b[c]-y)*t)*1
vez deMath.sqrt((i-x)*(i-x)+(b[c]-y)*(b[c]-y))*1
.Scala, 196 bytes
Ungolfed:
Explicação:
fonte
JavaScript (ES6), 145
Função recursiva anônima, parâmetro
s
é a vida útil da vela, parâmetrol
é a lista de coordenadas da vila.Uma busca em profundidade , parando quando a distância atinge a vida útil da vela
Menos jogadores de golfe, veja o trecho abaixo
Teste
fonte
MATL , 27 bytes
EDIT (26 nov 2016): devido a alterações na
Xl
função, ela deve ser substituída no código acima por2$X>
. Os links abaixo incorporam essa modificação.Experimente online! Ou verifique todos os casos de teste .
Explicação
A distância da abóbora entre duas cidades separadas Δ x e Δ y em cada coordenada pode ser obtida como (| Δ x | + | Δ y | + max (| Δ x |, | Δ y |)) / 2.
O código segue estas etapas:
Código comentado:
fonte
Python 2.7 , 422 bytes
obrigado a NoOneIsHere por apontar melhorias adicionais!
obrigado ao edc65 por não ter salvo a lista, mas sim usando iteradores!
Experimente online!
Explicação:
A função calcula a distância entre dois pontos de acordo com as regras fornecidas, o loop percorre todas as permutações geradas pelo gerador da entrada e calcula a distância, se a distância for menor que a vida útil da vela, subtrai-a e adiciona o local ao contador, se esse contador for maior que o máximo atual, ele o substituirá.
ungolfed:
fonte
current
c
, ell
m
.PHP, 309 bytes
Força absolutamente bruta e nem muito curta. Use como:
Com mais espaço em branco e salvo em um arquivo:
fonte
Python, 175 bytes
c
é a vida útil da vela,l
é uma lista de tuplas - coordenadas da vila,v
é o número de aldeias visitadas,(x,y)
é o par de coordenadas da vila na qual Jack está atualmente.r(t)
é uma função que calcula a distância da posição atual e é usada para classificar a lista para que o mais próximo se tornel[0]
. A fórmula usada é | Δx | + | Δy | - min (| Δx |, | Δy |) / 2.Experimente aqui!
fonte
Raquete
Teste:
Saída:
No entanto, o código acima não funciona para valores negativos de x e y.
fonte