Mon réveil
Je suis américain, tout comme mon réveil (numérique). Pour régler l'alarme, elle démarre à l'heure qu'elle était précédemment. Appuyer sur le bouton des heures le fait monter d'une heure et appuyer sur le bouton des minutes le fait monter d'une minute. Appuyer sur les deux boutons en même temps le réinitialise à minuit (00h00) et compte comme deux pressions de bouton.
Lorsque les heures dépassent leur cap (12), il se remet à 1 et fait basculer la lumière AM / PM. Lorsque les minutes dépassent leur cap (59), elles se remettent à 0, sans affecter les heures.
La tâche
Votre tâche consiste, compte tenu d'une heure de début et d'une heure cible, à sortir le nombre optimal de pressions de boutons nécessaires pour régler mon alarme sur l'heure cible.
Vous pouvez saisir des informations dans le format qui vous convient le mieux. Les seules données dont votre programme devrait avoir besoin sont les heures et les minutes, pour les deux entrées. Cela signifie que vous, par exemple, pouvez prendre des données en millisecondes depuis l'époque et extraire les heures et les minutes, mais vous ne pouvez pas encoder quoi que ce soit en année, mois, seconde, etc. Notez que si vous pouvez, par exemple, saisir en utilisant "heure militaire" (ou heure régulière pour la plupart du monde), mais cela ne change pas le fonctionnement de mon horloge.
Exemples
1:15 pm -> 2:30 am
Vous pouvez appuyer sur les deux boutons pour réinitialiser à 12 h 00, puis augmenter à 2 h 30, ce qui correspond à des 2+2+30 = 34
pressions sur les boutons. Vous pouvez également augmenter jusqu'à 2 h 30, ce qui correspond à des 13+15 = 28
pressions sur des boutons. Par conséquent, votre sortie est 28
.
3:58 am -> 4:02 am
Vous pouvez réinitialiser et incrémenter, ce qui correspond à des 2+4+2 = 8
pressions sur des boutons. Vous pouvez également augmenter, ce qui serait des 1+4 = 5
appuis sur les boutons. Par conséquent, votre sortie est 5
.
10:55 pm -> 1:00 am
Vous pouvez réinitialiser et incrémenter, ce qui correspond à des 2+1 = 3
pressions sur des boutons. Vous pouvez également augmenter, ce qui serait des 3+5=8
appuis sur les boutons. Par conséquent, votre sortie est 3
.
1:00 am -> 1:59 pm
Vous pouvez réinitialiser et incrémenter, mais ce serait trois pressions de plus que l'incrémentation. Par conséquent, votre sortie est 12+59 =
71
.
Cas de test
Current Target = Output
1:15pm 2:30am = 28
3:58am 4:02am = 5
10:55pm 1:00am = 3
1:00am 1:59pm = 71
12:00am 12:00am = 0
6:51pm 12:00am = 2
2:01pm 11:00pm = 25
2:01pm 11:01pm = 9
12:59am 12:01am = 2
11:50am 12:00pm = 11
la source
Réponses:
Husk , 16 octets
Essayez-le en ligne!
Prend les arguments sous forme de deux listes [heures, minutes], pour les heures de début et de fin, au format 24h.
Je suis assez content de voir à quel point j'ai pu jouer à celui-ci, je trouve intéressant de voir comment les arguments sont gérés dans cette composition de fonctions.
La fonction qui calcule le nombre de touches dont nous avons besoin si la réinitialisation n'est pas autorisée est la suivante:
La partie intéressante est que, comme le reste de cette solution ne peut fonctionner qu'avec une seule liste comme argument, celui-ci est partiellement appliqué au premier argument de tout le programme, le "mangeant" et ne laissant que le deuxième argument visible à la fois pour lui-même et le reste du programme.
Ensuite, nous calculons le nombre d'appuis sur les touches dont nous avons besoin si nous remettons l'heure à 0:00.
Comme dit précédemment, cela ne fonctionne que sur le deuxième argument (la dernière fois), et calcule
hours+minutes+2
, juste de manière golfique.Enfin,
§▼
c'est la partie qui transmet le deuxième argument aux deux fonctions et renvoie le moindre des deux résultats.la source
JavaScript (ES6),
7356545250 octetsUtilise le format 24 heures. Prend l'entrée comme 4 entiers représentant les heures et les minutes de chaque fois.
Essayez-le
Entrez les heures au format 24 heures, avec le
:
séparateur.Explication
(À mettre à jour sous peu.)
Fonction anonyme en prenant les nombres entiers comme arguments au moyen des paramètres
g
,l
,h
etm
, le casg
&l
sont, respectivement, les heures et les minutes du temps courant eth
&m
sont les heures et les minutes du temps cible.Tout d'abord, nous calculons le nombre de pressions de bouton nécessaires si nous venons de réinitialiser l'horloge, qui est simplement 2 (pour la réinitialisation) plus l'heure cible et la minute cible.
Ensuite, nous calculons le nombre de pressions de bouton nécessaires pour atteindre l'heure cible. Nous faisons cela en soustrayant l'heure actuelle de l'heure cible. Cependant, si l'heure actuelle est inférieure à la cible, cela nous donnera un nombre négatif, nous rectifions donc cela en ajoutant 24 multiplié en vérifiant si
h<g
(qui renvoie un booléen mais est implicitement converti en entier1
, si vrai, ou0
si faux par le opérations mathématiques.Nous utilisons une formule similaire pour calculer le nombre de presses pour passer de la minute actuelle à la minute cible et l'ajouter aux presses horaires.
Enfin, nous obtenons le minimum des 2 nombres pour nous donner notre résultat.
la source
(h-g+24)%24+(m-l+60)%60
?Pyth , 29 octets
Ce défi ne profite évidemment pas aux langues de golf, c'est pourquoi il est si long. D'un autre côté, cela est amélioré par le fait que Pyth est basé sur Python, donc nous pouvons abuser de son module négatif.
Suite de tests. Les nombres en Pyth ne prennent pas en charge les zéros non significatifs.
la source
Gelée , 19 octets
Essayez-le en ligne!
Entrée sous forme de 4 entiers (heure de fin, minute de fin, heure de début, minute de début)
la source
C # (.NET Core) , 56 octets
Essayez-le en ligne!
Très similaire à la réponse Javascript. Les bogues en C # ne se convertissent pas facilement en nombres, donc au lieu de
[diff]+24*(H<h)
je l'ai fait,([diff]+24)%24
ce qui fait effectivement la même chose.la source
2+h+m
de -2 octets.(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
System.Math.Min
?Haskell, 41 octets
Assez simple. Prend l'entrée comme quatre arguments en utilisant une heure de 24 heures: heure de fin, minute de fin, heure de début, minute de début.
la source
Python 3 , 43 octets
Essayez-le en ligne!
Entrée sous forme de 4 entiers (heure de début, minute de début, heure de fin, minute de fin)
la source
2 01 11 00
? Dans votre réponse, comment déterminez-vous si l'heure estAM
ouPM
, si vous ne prenez pas cela en entrée?13
pour cette entrée en utilisant le TIO, qui est correct (reset + 11 <9 + 59).%
retourne toujours un nombre positif en Python?%
.1%24
=1
,1%-24
=-23
. C'est très utile pour cette question.Java 8,
5450 octetsPort de la réponse C # de @KamilDrakari (après avoir joué au golf
26 octets).Explication:
Essayez-le ici.
la source
Perl 5 , 71 +2 (-ap) = 73 octets
Essayez-le en ligne!
Prend les données au format 24 heures (heure militaire), séparées par des espaces, heure de début en premier, heure de fin en second: HH MM hh mm
la source
Rétine , 106 octets
Essayez-le en ligne! Le lien inclut des cas de test. Prend les entrées en tant qu'heures actuelles et souhaitées en 24 heures régulières avec un espace séparant les deux heures. Explication:
Convertissez en unaire.
Cela fait deux choses; il ajoute 24 heures et 60 minutes aux heures et minutes souhaitées, et il ajoute également 2 à la somme des heures et des minutes souhaitées d'origine, c'est-à-dire le nombre d'appuis sur les boutons à régler à l'aide d'une réinitialisation.
Soustrayez les heures actuelles des heures souhaitées et soustrayez les 24 que nous avons ajoutées si nous le pouvons.
De même pour les minutes. Cela ajoute également les deux résultats ensemble.
Si le nombre de pressions à régler à l'aide de l'heure actuelle est supérieur au nombre de pressions à régler à l'aide d'une réinitialisation, supprimez-le.
Convertissez le premier nombre restant en décimal.
la source