La règle de Naismith aide à déterminer la durée nécessaire pour une marche ou une randonnée, compte tenu de la distance et de l'ascension.
Étant donné une liste non vide de l'altitude à des points régulièrement espacés le long d'un chemin et la distance totale de ce chemin en mètres, vous devez calculer le temps nécessaire selon la règle de Naismith.
La règle de Naismith est que vous devez prévoir une heure pour tous les cinq kilomètres, plus une heure supplémentaire pour chaque 600 mètres de montée.
L'entrée doit être prise en mètres, ce qui est garanti d'être composé d'entiers non négatifs, et la sortie doit toujours être en heures ou en minutes (mais pas les deux), et doit pouvoir donner des nombres décimaux le cas échéant (les inexactitudes en virgule flottante sont OK) .
Par exemple, étant donné:
[100, 200, 400, 200, 700, 400], 5000
Pour les deux premiers éléments, [100, 200]
vous avez 100 mètres de montée soit 10 minutes. Avec [200, 400]
200 mètres de dénivelé soit 20 minutes, [400, 200]
pas de montée donc pas de temps ajouté pour ça. [200, 700]
est de 500 mètres de montée qui est de 50 minutes, et enfin [700, 400]
n'est pas ascendant. Une heure supplémentaire est ajoutée pour la distance de cinq kilomètres. Cela totalise 140 minutes ou 2,333 ... heures.
Cas de test
[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
valides et doivent-elles être traitées?[10, 25, 55], 1000 -> 0.275 OR 16.5
Réponses:
R ,
444342 octetsEssayez-le en ligne!
-1 octet en utilisant
pmax
comme le font plusieurs autres réponsesPrend les entrées comme
A
parfum etD
distance, et renvoie le temps en minutes.la source
JavaScript (ES6), 50 octets
1 octet enregistré grâce à la réponse de Giuseppe (division par 10 à la fin du processus)
Prend l'entrée comme
([altitudes])(distance)
. Renvoie le temps en minutes.Essayez-le en ligne!
la source
05AB1E , 15 octets
Essayez-le en ligne!
Renvoie le temps en minutes.
Explication
la source
₄12//
au lieu de₄;6//
. +1 si évident de ma part.Haskell,
4746 octetsRenvoie l'heure en heures.
Essayez-le en ligne!
la source
Python 2,
6260 octetsEnregistré 2 octets grâce aux ovs.
Essayez-le en ligne!
Renvoie le temps en minutes.
la source
Perl 6 ,
453937 octets6 octets économisés grâce à Jo King.
2 octets économisés grâce à nwellnhof.
(Merci à tous les deux, cela ne ressemble plus à ma soumission originale :—).)
Essayez-le en ligne!
Le premier argument est la liste des élévations, le deuxième argument est la longueur du trek.
Le tout est un WwhatCode. Si une expression est reconnue comme telle, alors chacun
*
est un argument.Donc, dans
*.&{sum (.skip Z-$_)Xmax 0}/600
, nous prenons le premier argument (la première occurrence de*
), et utilisons un bloc dessus avec une construction de type méthode.&{}
. Le bloc prend un argument (la liste), qui entre$_
, tout.skip
comme cette liste sans le premier élément. Nous soustrayons le tableau d'origine, élément par élément, de celui-ci en utilisantZ-
. Le zip s'arrête dès que la liste la plus courte est épuisée, ce qui est OK.Nous utilisons ensuite l'opérateur de produits croisés
X
.list X(op) list
crée toutes les paires possibles où le premier élément est de la liste de gauche et le second de la droite, et utilise l'opérateur(op)
sur elles. Le résultat est renvoyé sous forme de Seq (une liste unique). Cependant, la liste de droite n'a qu'un seul élément, 0, donc c'est le cas* max 0
, élément par élément. Cela garantit que nous ne comptons que les parties ascendantes du trek. Ensuite, nous additionnons et divisons par 600.Ensuite, nous ajoutons
*/5e3
, où le*
se produit pour la deuxième fois, et c'est donc le deuxième argument, et le divisons par 5000. La somme est alors le temps en heures. (C'est plus efficace que le temps en minutes car nous aurions besoin de nous multiplier, et le*
devrait être séparé par un espace du WwhatStar*
.)la source
X
X
, merci!X/
en divisant simplement la somme par 10. 39 octets.&{}
(renvoie des heures).oK , 21 octets
Essayez-le en ligne! Abuser d'un bug d'analyse où
.1.012
est le même que.1 .012
.-1 grâce à streester .
k , 23 octets
Essayez-le en ligne!
la source
{y+/0|1_-':x}..1.012*
pour 21 octets? démarrer l'accumulateur avecy
.:/
Gelée , 12 octets
Essayez-le en ligne!
-1 merci à M. Xcoder .
la source
×.12
marche pas ?Python 2 , 59 octets
Essayez-le en ligne!
renvoie les heures sous forme décimale.
la source
Pyth , 15 octets
Programme complet, attend l'ensemble des hauteurs comme premier argument, la distance comme second. Renvoie le temps en minutes.
Essayez-le en ligne ici ou vérifiez tous les cas de test en même temps ici .
la source
APL (Dyalog Unicode) ,
21 2018 octetsEssayez-le en ligne!
Fonction traditionnelle prenant l'entrée (de droite à gauche) comme
1st ⎕
= Hauteurs / Profondeurs,2nd ⎕
= Distance.Merci à @ngn d'
être un assistant unoctet.Comment ça fonctionne:
la source
,0
n'est pas nécessaire, le⍵
test problématique devrait être,604
, non604
⍺
et⍵
dans l'ancien code par⎕
et j'étais trop paresseux pour mettre l'en-tête / pied de page tradfn. Le,0
bit bien? Or.Java 8, 89 octets
Essayez-le en ligne.
Explication:
la source
Japt , 39 octets
Essayez-le en ligne!
Probablement peut être joué un peu plus.
la source
Stax , 17 octets
Exécutez-le et déboguez-le sur staxlang.xyz!
Prend toutes les entrées sous forme de flottants, bien que cela n'économise un octet que dans la version décompressée. Probablement améliorable; revenant tout juste au code golf, je suis un peu rouillé.
Déballé (20 octets) et explication:
0!012*s:-{0>f{A_:m|++
fonctionne pour les entrées intégrales pour 21 octets déballés et encore 17 emballés.la source