Ceci est mon premier code de golf, alors faites-le moi savoir s'il est trop large ou s'il manque des informations pour un bon puzzle!
Défi
En Ontario et peut-être dans d'autres régions du monde, l'électricité est facturée en fonction de la tarification horaire (TOU) , qui fait varier le coût par kilowattheure selon le moment où vous utilisez l'électricité.
Étant donné une date et une heure, je veux savoir si je suis dans une période de pointe (rouge), moyenne (jaune) ou hors pointe (verte).
Contribution
Supposons que l'entrée est fournie dans un format de date-heure ISO 8601 sans fuseau horaire acceptable avec la précision minimale des heures: YYYY-MM-DDThh[:mm[:ss]]
(le T est littéral).
Exemples
- 2014-09-01T14
- 2014-09-01T17: 30
- 2014-09-01T17: 30: 02
Production
La sortie doit être une chaîne On
, Mid
ou Off
.
Règles
- Victoires de code les plus courtes
- Aux fins de ce défi, ignorez les jours fériés
- Supposons les informations trouvées dans ce post. Les règles actuelles de tarification en fonction du temps d'utilisation pourraient changer à l'avenir par le ministère de l'Énergie de l'Ontario.
Information
Jours de semaine d'été (1er mai au 31 octobre)
- Hors pointe: 19h00 - 07h00
- Mi-pic: 07h00 - 11h00 et 17h00 - 19h00
- En pointe: 11h00 - 17h00
En semaine en hiver (du 1er novembre au 30 avril)
- Hors pointe: 19h00 - 07h00
- Mi-pic: 11h00 - 17h00
- En période de pointe: 07h00 - 11h00 et 17h00 - 19h00
Fins de semaine
- Hors pointe: toute la journée
YYYY-MM-DDThh[:mm[:ss]]
puisque les secondes ne peuvent être appliquées que si des minutes sont appliquées?Réponses:
Rubis -
147 144 143 141 141 137135Cela représente une fonction qui prend une chaîne en paramètre et renvoie une chaîne.
Voici une démo en ligne avec quelques cas de test: http://ideone.com/wyIydw
la source
Python 2 - 164
Si nécessaire, voici une explication de la logique dans la dernière ligne:
La ligne finale imprime une tranche en
'OMOfinfd'
fonction de l'évaluation de ses conditions.Évaluez d'abord l'opération
1+((10<t<17)==(4<m<11))
.Si le XNOR entre les conditions
10<t<17
et4<m<11
estFalse
, cela sera évalué à1+False => 1+0 => 1
. Sinon, l'opération sera évaluée à1+True => 1+1 => 2
.Enfin, multipliez ce résultat de l'opération ci-dessus par si le jour est un jour de semaine et si l'heure est comprise entre 6 heures-19 heures.
Si c'est le cas
False
, le jour est un week-end ou le temps est entre 19 heures-6 heures, et le résultat sera(1|2)*0 => 0
. Sinon, le résultat sera(1|2)*1 => 1|2
.Un résultat de
0
sera impriméOff
,1
imprimeraMid
et2
imprimeraOn
.la source
C # -
240220 caractèresRien de spécial. Codage simple.
Merci à w0lf :)
la source
s.Length==13?s+":00:00":s.Length==16?s+":00":s
à(s+":00:00").Substring(0,19)
Rubis - 135
Abuse le module Temps. Entrée par argument de ligne de commande.
Edit: Merci w0lf pour le temps qui a permis de raccourcir et de résoudre un bug.
la source
2014-09-01T17:30
il sort correctement"Mid"
, mais pour2014-09-01T17
il sort"Off"
.Groovy -
621534524491 caractèresUn peu plus de golf à faire, mais assez simple quand on utilise Joda-Time
échantillons:
Non golfé:
la source
java.time.*
, qui est très similaire à Joda Time mais fait partie du JRE. Cela pourrait peut-être raccourcir un peu le code.'2014-01-05T08:08'
, le 5 janvier 2014 est un dimanche. Ainsi, il devrait être'Off'
java.time.*
. a lamentablement échoué. L'analyseur est trop sacrément strict. UtilisationDateParser
de nashorn (également partie du JRE8) qui est indulgente, et avec un peu de piratage abusif, même assez indulgente pour sauter les minutes et les secondes.R,
243204 caractèresIndenté et commenté:
Exemples:
la source
Bash, 286
ceci est une réponse bash simple en utilisant le programme de date
la source
En voici un autre!
JavaScript,
175171Non minifié:
Fonctionne uniquement sur les interprètes où une chaîne de date ISO8601 peut être passée dans le
Date
constructeur.CoffeeScript,
192189Étonnamment, il est plus long dans CoffeeScript car il n'y a pas d'opérateur ternaire dans ce langage (comme vous pouvez le voir sur mon JavaScript, je me suis beaucoup appuyé).
la source
ES6 - 146
Ceci est sous forme de fonction, utilise quelques hacks méchants.
Expliqué:
la source
Python 3 - 352 caractères
la source
s=['high','mid','off']
pours=['on','mid','off']
- non seulement cela enregistre 2 caractères, mais la spécification indique de sortir "on".Java -
426309/301? (voir les commentaires)Exemple de sortie:
J'ai utilisé la même astuce EXOR que la soumission Python.
J'ai également utilisé un+
comme une fonction OU, pour quand c'estweekend OR night
.Mon autre gros truc: les masques à mors.
Par exemple, pour voir si un nombre est compris entre 2 et 6 (du lundi au vendredi), créez d'abord un motif binaire où les valeurs intéressantes sont 1:
Ensuite, utilisez le décalage de bit pour obtenir le bit intéressant vers le LSB et extrayez-le:
De même, j'ai fait des motifs binaires pendant des mois et des heures:
Malheureusement, il s'avère tout simplement
x>y&x<z
plus court dans la plupart des cas, donc je ne l'ai pas utilisé à certains endroits.Et enfin, un peu de piratage (très dépendant de l'implémentation) avec
jdk.nashorn.internal.parser.DateParser
: QuandparseEcmaDate()
pas complètement une date (comme quand il lit l'heure et frappe la fin de la chaîne), il retourne false.Integer[]
(ftw auto-unboxing), avec le mois fixé à base-0 (comme les autres classes Java).-(c?0:1)
.la source
.parse()
pourrait aussi fonctionner (raser 8 caractères), mais je ne l'ai pas testé à fond avec différentes entrées.parse
appelle en interneparseEcmaDate
et s'il échoue, appelleparseLegacyDate
. Ce dernier peut visser le tableau, mais cela ne s'est pas produit avec quelques cas que j'ai testés.Rien ne m'empêche d'entrer dans le mien, et il y en a d'autres de toute façon ici, donc ...
PHP 5.4+, 194
Non minimisé et commenté:
Notez également que la
date.timezone
directive dans php.ini doit être définie, sinon une exception sera levée.la source