La regla de Naismith ayuda a calcular el tiempo necesario para una caminata o caminata, dada la distancia y el ascenso.
Dada una lista no vacía de la altitud en puntos espaciados uniformemente a lo largo de un camino y la distancia total de ese camino en metros, debe calcular el tiempo necesario de acuerdo con la regla de Naismith.
La regla de Naismith es que debe permitir una hora por cada cinco kilómetros, más una hora adicional por cada 600 metros de ascenso.
La entrada debe tomarse en metros, que se garantiza que consisten en enteros no negativos, y la salida debe ser consistentemente de horas o minutos (pero no de ambos), y debe poder dar números decimales cuando corresponda (las inexactitudes de coma flotante están bien) .
Por ejemplo, dado:
[100, 200, 400, 200, 700, 400], 5000
Para los dos primeros elementos [100, 200]
tiene 100 metros de ascenso, que son 10 minutos. Con [200, 400]
usted tiene 200 metros de ascenso que son 20 minutos, [400, 200]
no asciende, por lo que no se agrega tiempo para eso. [200, 700]
Hay 500 metros de ascenso, que son 50 minutos, y finalmente [700, 400]
no asciende. Se agrega una hora adicional para la distancia de cinco kilómetros. Esto suma 140 minutos o 2.333 ... horas.
Casos de prueba
[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
o[10, 25, 55], 1000
válidas y deben manejarse?[10, 25, 55], 1000 -> 0.275 OR 16.5
Respuestas:
R ,
444342 bytesPruébalo en línea!
-1 byte usando
pmax
como múltiples otras respuestas hacenToma entradas como
A
aroma eD
isancia, y devuelve el tiempo en minutos.fuente
JavaScript (ES6), 50 bytes
Guardado 1 byte gracias a la respuesta de Giuseppe (dividido por 10 al final del proceso)
Toma entrada como
([altitudes])(distance)
. Devuelve el tiempo en minutos.Pruébalo en línea!
fuente
05AB1E , 15 bytes
Pruébalo en línea!
Devuelve el tiempo en minutos.
Explicación
fuente
₄12//
lugar de₄;6//
. Tan obvio +1 de mi parte.Haskell,
4746 bytesDevuelve el tiempo en horas.
Pruébalo en línea!
fuente
Python 2,
6260 bytesGuardado 2 bytes gracias a los ovs.
Pruébalo en línea!
Devuelve el tiempo en minutos.
fuente
Perl 6 ,
453937 bytes6 bytes guardados gracias a Jo King.
2 bytes guardados gracias a nwellnhof.
(Gracias a ambos, esto ya no se parece en nada a mi presentación original :—).)
Pruébalo en línea!
El primer argumento es la lista con elevaciones, el segundo argumento es la duración de la caminata.
Todo el asunto es un WhateverCode. Si una expresión se reconoce como tal, entonces cada
*
uno es un argumento.Entonces, en
*.&{sum (.skip Z-$_)Xmax 0}/600
, tomamos el primer argumento (la primera aparición de*
) y usamos un bloque con una construcción similar a un método.&{}
. El bloque toma un argumento (la lista), que entra$_
, así.skip
es esa lista sin el primer elemento. Restamos la matriz original, elemento por elemento, de eso, usandoZ-
. La compresión se detiene tan pronto como se agota la lista más corta, lo cual está bien.Luego usamos el operador de productos cruzados
X
.list X(op) list
crea todos los pares posibles donde el primer elemento es de la lista izquierda y el segundo de la derecha, y utiliza el operador(op)
en ellos. El resultado se devuelve como Seq (una lista de una sola vez). Sin embargo, la lista de la derecha tiene solo un elemento, 0, por lo que simplemente lo hace* max 0
, elemento por elemento. Eso asegura que solo contamos las partes ascendentes de la caminata. Luego lo sumamos y dividimos por 600.Luego agregamos
*/5e3
, donde*
ocurre por segunda vez, y entonces es el segundo argumento, y lo dividimos entre 5000. La suma es el tiempo en horas. (Esto es más eficiente que el tiempo en minutos, ya que tendríamos que multiplicar, y*
tendría que estar separado por un espacio del WhateverStar*
).fuente
X
X
¡gracias!X/
simplemente dividiendo la suma por 10. 39 bytes.&{}
(devuelve horas).ok , 21 bytes
Pruébalo en línea! Abusar de un error de análisis donde
.1.012
es lo mismo que.1 .012
.-1 gracias a streester .
k , 23 bytes
Pruébalo en línea!
fuente
{y+/0|1_-':x}..1.012*
por 21 bytes? iniciar acumulador cony
.:/
Jalea , 12 bytes
Pruébalo en línea!
-1 gracias al Sr. Xcoder .
fuente
×.12
funcionaPython 2 , 59 bytes
Pruébalo en línea!
devuelve horas como un decimal.
fuente
Pyth , 15 bytes
Programa completo, espera el conjunto de alturas como primer argumento, la distancia como segundo. Devuelve el tiempo en minutos.
Pruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .
fuente
APL (Dyalog Unicode) ,
21 2018 bytesPruébalo en línea!
Función tradicional tomando entrada (de derecha a izquierda) como
1st ⎕
= Alturas / Profundidades,2nd ⎕
= Distancia.Gracias a @ngn para
ser un mago unode tres bytes.Cómo funciona:
fuente
,0
es innecesario, la⍵
prueba problemática debería ser,604
, no604
⍺
y⍵
en el código anterior con⎕
y era demasiado vago para poner el encabezado / pie de página tradfn. El,0
bit de embargo? Oro.Java 8, 89 bytes
Pruébalo en línea.
Explicación:
fuente
Japt , 39 bytes
Pruébalo en línea!
Probablemente se puede jugar al golf un poco más.
fuente
Stax , 17 bytes
¡Ejecútelo y depúrelo en staxlang.xyz!
Toma todas las entradas como flotantes, aunque esto guarda un byte solo en la versión desempaquetada. Probablemente mejorable; justo ahora volviendo al golf de código, estoy algo oxidado.
Desempaquetado (20 bytes) y explicación:
0!012*s:-{0>f{A_:m|++
funciona para entradas integrales para 21 bytes sin empaquetar y aún con 17 paquetes.fuente