A regra de Naismith ajuda a calcular o tempo necessário para uma caminhada ou caminhada, dada a distância e a subida.
Dada uma lista não vazia da altitude em pontos uniformemente espaçados ao longo de um caminho e a distância total desse caminho em metros, você deve calcular o tempo necessário de acordo com a regra de Naismith.
A regra de Naismith é que você deve permitir uma hora a cada cinco quilômetros, mais uma hora adicional a cada 600 metros de subida.
A entrada deve ser calculada em metros, que é garantido consistir em números inteiros não negativos, e a saída deve consistentemente ser horas ou minutos (mas não os dois) e deve poder fornecer números decimais onde aplicável (as imprecisões de ponto flutuante são aceitáveis) .
Por exemplo, dado:
[100, 200, 400, 200, 700, 400], 5000
Para os dois primeiros elementos, [100, 200]
você tem 100 metros de subida, ou seja, 10 minutos. Com [200, 400]
você tem 200 metros de subida, ou seja, 20 minutos, [400, 200]
não está subindo, então não há tempo para isso. [200, 700]
é de 500 metros de subida, que é de 50 minutos, e finalmente [700, 400]
não está subindo. Uma hora extra é adicionada pela distância de cinco quilômetros. Isso totaliza 140 minutos ou 2,333 ... horas.
Casos de teste
[0, 600] 2500 -> 1.5 OR 90
[100, 200, 300, 0, 100, 200, 300] 10000 -> 2.8333... OR 170
[40, 5, 35] 1000 -> 0.25 OR 15
[604] 5000 -> 1 OR 60
[10, 10, 10] 2000 -> 0.4 OR 24
[10, 25, 55] 1000 -> 0.275 OR 16.5
[10], 5125
ou[10, 25, 55], 1000
válidas e precisam ser manuseadas?[10, 25, 55], 1000 -> 0.275 OR 16.5
Respostas:
R ,
444342 bytesExperimente online!
-1 byte usando
pmax
como várias outras respostasToma as entradas como
A
perfume eD
istance e retorna o tempo em minutos.fonte
JavaScript (ES6), 50 bytes
Economizou 1 byte graças à resposta de Giuseppe (dividindo por 10 no final do processo)
Toma entrada como
([altitudes])(distance)
. Retorna o tempo em minutos.Experimente online!
fonte
05AB1E , 15 bytes
Experimente online!
Retorna o tempo em minutos.
Explicação
fonte
₄12//
vez de₄;6//
. Um +1 tão óbvio de mim.Haskell,
4746 bytesRetorna o tempo em horas.
Experimente online!
fonte
Python 2,
6260 bytesEconomizou 2 bytes graças a ovs.
Experimente online!
Retorna o tempo em minutos.
fonte
Perl 6 ,
4539.37 bytes6 bytes salvos graças a Jo King.
2 bytes salvos graças ao nwellnhof.
(Graças a ambos, isso não se parece mais com o meu envio original: --).)
Experimente online!
O primeiro argumento é a lista com elevações, o segundo argumento é a duração da caminhada.
A coisa toda é um WhateverCode. Se uma expressão for reconhecida como tal, cada
*
um será um argumento.Então, em
*.&{sum (.skip Z-$_)Xmax 0}/600
, pegamos o primeiro argumento (a primeira ocorrência de*
) e usamos um bloco nele com uma construção semelhante a um método.&{}
. O bloco aceita um argumento (a lista), que entra$_
, assim.skip
como essa lista sem o primeiro elemento. Subtraímos a matriz original, elemento a elemento, disso, usandoZ-
. O zíper pára assim que a lista mais curta é esgotada, o que é bom.Em seguida, usamos o operador de produto cruzado
X
.list X(op) list
cria todos os pares possíveis em que o primeiro elemento é da lista da esquerda e o segundo da direita e usa o operador(op)
neles. O resultado é retornado como uma Seq (uma lista única). No entanto, a lista correta possui apenas um elemento, 0, portanto* max 0
, elemento a elemento. Isso garante que contemos apenas partes ascendentes da jornada. Depois, somamos e dividimos por 600.Em seguida, adicionamos
*/5e3
onde*
ocorre pela segunda vez e, portanto, é o segundo argumento, e o dividimos por 5000. A soma é então o tempo em horas. (Isso é mais eficiente que o tempo em minutos, já que precisaríamos nos multiplicar e*
precisaria ser separado por um espaço do WhateverStar*
.)fonte
X
X
, obrigado!X/
por apenas dividindo a soma por 10. 39 bytes.&{}
(retorna horas).OK , 21 bytes
Experimente online! Abusar de um bug de análise onde
.1.012
é o mesmo que.1 .012
.-1 graças a streester .
k , 23 bytes
Experimente online!
fonte
{y+/0|1_-':x}..1.012*
por 21 bytes? inicie o acumulador comy
.:/
Gelatina , 12 bytes
Experimente online!
-1 graças ao Sr. Xcoder .
fonte
×.12
funciona?Python 2 , 59 bytes
Experimente online!
retorna horas como um decimal.
fonte
Pitão , 15 bytes
Programa completo, espera que o conjunto de alturas seja o primeiro argumento, a distância como o segundo. Retorna o tempo em minutos.
Experimente on-line aqui ou verifique todos os casos de teste de uma vez aqui .
fonte
APL (Dyalog Unicode) ,
21 2018 bytesExperimente online!
Função tradicional recebendo entrada (da direita para a esquerda) como
1st ⎕
= Alturas / profundidades,2nd ⎕
= Distância.Graças a @ngn para
ser um assistente de umde três bytes.Como funciona:
fonte
,0
é desnecessário, o⍵
para o teste problemática deve ser,604
, não604
⍺
e⍵
no código antigo por⎕
e fiquei com preguiça de colocar o cabeçalho / rodapé do tradfn. O,0
pouco embora? Ouro.Java 8, 89 bytes
Experimente online.
Explicação:
fonte
Japonês , 39 bytes
Experimente online!
Provavelmente pode ser jogado um pouco mais.
fonte
Stax , 17 bytes
Execute e depure-o em staxlang.xyz!
Toma todas as entradas como flutuantes, embora isso economize um byte apenas na versão descompactada. Provavelmente improvável; Agora, voltando ao código de golfe, estou um pouco enferrujado.
Descompactado (20 bytes) e explicação:
0!012*s:-{0>f{A_:m|++
trabalha para entradas integrais para 21 bytes descompactados e ainda 17 compactados.fonte