Este es mi primer código de golf, así que avíseme si es demasiado amplio o si me falta información para un buen rompecabezas.
Desafío
En Ontario y posiblemente en otras áreas del mundo, la electricidad se factura utilizando el precio por tiempo de uso (TOU) , que varía el costo por kilovatio-hora según el uso de la energía.
Dada una fecha y hora, quiero saber si estoy en un período de tiempo pico (rojo), medio pico (amarillo) o fuera de pico (verde).
Entrada
Suponga que la entrada se proporciona en un formato de fecha y hora ISO 8601 sin zona horaria aceptable con la precisión mínima de horas: YYYY-MM-DDThh[:mm[:ss]]
(la T es literal).
Ejemplos
- 2014-09-01T14
- 2014-09-01T17: 30
- 2014-09-01T17: 30: 02
Salida
La salida debe ser una cadena On
, Mid
o Off
.
Reglas
- El código más corto gana
- Para los propósitos de este desafío, ignore las vacaciones legales
- Asume la información encontrada en esta publicación. Las reglas reales de fijación de precios por tiempo de uso pueden cambiar en el futuro por el Ministerio de Energía de Ontario.
Información
Días laborables de verano (del 1 de mayo al 31 de octubre)
- Fuera de horas punta: 19h00 - 07h00
- Pico medio: 07h00 - 11h00 y 17h00 - 19h00
- En horas pico: 11h00 - 17h00
Días laborables de invierno (del 1 de noviembre al 30 de abril)
- Fuera de horas punta: 19h00 - 07h00
- Pico medio: 11h00 - 17h00
- En horas pico: 07h00 - 11h00 y 17h00 - 19h00
Fines de semana
- Fuera de horas punta: todo el día
YYYY-MM-DDThh[:mm[:ss]]
ya que los segundos solo se pueden aplicar si se aplican minutos?Respuestas:
Ruby -
147 144 143 141 137135Esto representa una función que toma una cadena como parámetro y devuelve una cadena.
Aquí hay una demostración en línea con algunos casos de prueba: http://ideone.com/wyIydw
fuente
Python 2 - 164
Si es necesario, a continuación hay una explicación de la lógica en la línea final:
La línea final imprime una porción
'OMOfinfd'
dependiendo de la evaluación de sus condicionales.Primero, evalúe la operación
1+((10<t<17)==(4<m<11))
.Si el XNOR entre las condiciones
10<t<17
y4<m<11
esFalse
, esto se evaluará a1+False => 1+0 => 1
. De lo contrario, la operación evaluará a1+True => 1+1 => 2
.Finalmente, multiplique ese resultado de la operación anterior por si el día es un día de la semana y si la hora es entre las 6 am y las 7 pm.
Si es así
False
, o bien el día es un fin de semana o la hora es entre las 7 pm-6am, y el resultado será(1|2)*0 => 0
. De lo contrario, el resultado será(1|2)*1 => 1|2
.Un resultado de
0
imprimiráOff
,1
imprimiráMid
e2
imprimiráOn
.fuente
C # -
240220caracteresNada especial. Codificación directa.
Gracias a w0lf :)
fuente
s.Length==13?s+":00:00":s.Length==16?s+":00":s
a(s+":00:00").Substring(0,19)
Rubí - 135
Abusa del módulo Tiempo. Entrada por argumento de línea de comando.
Editar: Gracias w0lf por el tiempo que ayudó a acortar y resolver un error.
fuente
2014-09-01T17:30
sale correctamente"Mid"
, pero para2014-09-01T17
ella sale"Off"
.Groovy -
621534524491 caracteresUn poco más de golf para hacer, pero bastante simple al aprovechar Joda-Time
ejecuciones de muestra:
Sin golf:
fuente
java.time.*
, que es muy similar a Joda Time pero es parte del JRE. Quizás esto podría acortar un poco el código.'2014-01-05T08:08'
, el 5 de enero de 2014 es un domingo. Por lo tanto, debería ser'Off'
java.time.*
. falló miserablemente. El analizador es demasiado estricto. ÚseloDateParser
desde nashorn (también parte del JRE8) que es indulgente y con un poco de pirateo abusivo, incluso lo suficientemente indulgente como para saltear minutos y segundos.R,
243204caracteresSangrado y comentado:
Ejemplos:
fuente
Bash, 286
esta es una respuesta bash simple usando el programa de fecha
fuente
¡Aquí va otro!
JavaScript,
175171No minificado:
Solo funciona en intérpretes donde se puede pasar una cadena de fecha ISO8601 al
Date
constructor.CoffeeScript,
192189Sorprendentemente, es más largo en CoffeeScript porque no hay un operador ternario en ese lenguaje (que como puede ver en mi JavaScript, confié mucho).
fuente
ES6 - 146
Esto está en forma de función, utiliza un par de trucos desagradables.
Explicado:
fuente
Python 3 - 352 caracteres
fuente
s=['high','mid','off']
as=['on','mid','off']
: esto no solo ahorra 2 caracteres, sino que la especificación dice que salga "on".Java:
426309/301? (ver comentarios)Salida de ejemplo:
Usé el mismo truco EXOR que el envío de Python.
También usé a+
como una función OR, para cuando esweekend OR night
.Mi otro gran truco: máscaras de bits.
Por ejemplo, para ver si un número está entre 2 y 6 (de lunes a viernes), primero cree un patrón de bits donde los valores interesantes sean 1:
Luego, use bit shift para obtener el bit interesante para el LSB y extraerlo:
Del mismo modo, hice patrones de bits durante meses y horas:
Desafortunadamente, resulta que
x>y&x<z
es más corto en la mayoría de los casos, por lo que no lo usé en algunos lugares.Y finalmente, un poco de piratería (altamente dependiente de la implementación) con
jdk.nashorn.internal.parser.DateParser
: CuandoparseEcmaDate()
no analiza completamente una fecha (como cuando lee la hora y toca el final de la cadena), devuelve falso.Integer[]
(auto-unboxing ftw), con el mes fijado como base-0 (como otras clases de Java).-(c?0:1)
.fuente
.parse()
también podría funcionar (eliminar 8 caracteres), pero no lo he probado a fondo con diferentes entradas.parse
internamente llamaparseEcmaDate
y si falla, llamaparseLegacyDate
. Este último puede arruinar la matriz, pero esto no sucedió con algunos casos que probé.Nada me impide entrar por mi cuenta, y hay otras más cortas aquí de todos modos, así que ...
PHP 5.4+, 194
Sin minificar y comentado:
También tenga en cuenta que la
date.timezone
directiva en php.ini debe establecerse, de lo contrario se lanzará una excepción.fuente