Это мой первый гольф-код, поэтому, пожалуйста, дайте мне знать, если он слишком широкий или мне не хватает информации для хорошей головоломки!
Вызов
В Онтарио и, возможно, в других регионах мира счета за электроэнергию выставляются по времени использования (TOU) , которое зависит от стоимости киловатт-часа в зависимости от того, когда вы используете электроэнергию.
Учитывая дату и время, я хочу знать, нахожусь ли я в пиковый (красный), средний пиковый (желтый) или непиковый (зеленый) период времени.
вход
Предположим, что ввод осуществляется в приемлемом формате даты-времени ISO 8601 без часового пояса с минимальной точностью часов: YYYY-MM-DDThh[:mm[:ss]]
(T буквально).
Примеры
- 2014-09-01T14
- 2014-09-01T17: 30
- 2014-09-01T17: 30: 02
Выход
Вывод должен быть строкой On
, Mid
или Off
.
правила
- Самый короткий код выигрывает
- Для целей этого вызова игнорировать установленные законом праздники
- Предположим, информация найдена в этом посте. Фактические правила ценообразования по времени использования могут измениться в будущем Министерством энергетики Онтарио.
Информация
Летние будни (с 1 мая по 31 октября)
- Вне пик: с 19:00 до 07:00
- Середина пика: с 07:00 до 11:00 и с 17:00 до 19:00
- На пике: 11:00 - 17:00
Зимние будни (с 1 ноября по 30 апреля)
- Вне пик: с 19:00 до 07:00
- Середина пика: 11:00 - 17:00
- В часы пик: с 07:00 до 11:00 и с 17:00 до 19:00
Выходные дни
- Вне пик: весь день
YYYY-MM-DDThh[:mm[:ss]]
поскольку секунды могут быть применены, только если применяются минуты?Ответы:
Рубин -
147 144 143 141 137135Это представляет функцию, которая принимает строку в качестве параметра и возвращает строку.
Вот онлайн-демонстрация с некоторыми тестами: http://ideone.com/wyIydw
источник
Python 2 - 164
При необходимости ниже приводится объяснение логики в последней строке:
В последней строке печатается срез в
'OMOfinfd'
зависимости от оценки его условных выражений.Сначала оцените операцию
1+((10<t<17)==(4<m<11))
.Если XNOR между условиями
10<t<17
и4<m<11
естьFalse
, это будет оцениваться до1+False => 1+0 => 1
. В противном случае операция будет оценена как1+True => 1+1 => 2
.Наконец, умножьте этот результат вышеупомянутой операции на то, является ли день рабочим днем, и является ли время между 6:00 и 19:00.
Если это так
False
, то либо выходной, либо время между 19:00 и 6:00, и результат будет(1|2)*0 => 0
. В противном случае результат будет(1|2)*1 => 1|2
.Результат
0
будет распечатанOff
,1
распечатанMid
и2
распечатанOn
.источник
C # -
240220 символовНичего особенного. Прямое кодирование.
Спасибо w0lf :)
источник
s.Length==13?s+":00:00":s.Length==16?s+":00":s
до(s+":00:00").Substring(0,19)
Рубин - 135
Злоупотребляет модулем времени. Ввод аргументом командной строки.
Изменить: Спасибо w0lf за время, которое помогло сократить и решить ошибку.
источник
2014-09-01T17:30
он правильно выводит"Mid"
, а для2014-09-01T17
него выводит"Off"
.Groovy -
621534524491 символЕще немного игры в гольф, но довольно просто, используя Joda-Time
пробные прогоны:
Ungolfed:
источник
java.time.*
, которая очень похожа на Joda Time, но является частью JRE. Возможно, это может немного сократить код.'2014-01-05T08:08'
5 января 2014 года - воскресенье. Таким образом, это должно быть'Off'
java.time.*
. с треском провалился. Парсер слишком чертовски строг. ИспользуйтеDateParser
из Nashorn (также часть JRE8), который снисходительный, и с небольшим количеством оскорбительного хакерства, даже достаточно снисходительный, чтобы пропустить минуты и секунды.R,
243204 символаОтступы и комментарии:
Примеры:
источник
Баш, 286
это простой ответ bash с использованием программы date
источник
Здесь идет еще один!
JavaScript,
175171Unminified:
Работает только на интерпретаторах, где строка даты ISO8601 может быть передана в
Date
конструктор.CoffeeScript,
192189Удивительно, но он больше в CoffeeScript, потому что в этом языке нет троичного оператора (на который я, как вы можете видеть из моего JavaScript, я очень полагался).
источник
ES6 - 146
Это в функциональной форме, использует пару неприятных хаков.
Разъяснение:
источник
Python 3 - 352 символа
источник
s=['high','mid','off']
наs=['on','mid','off']
- не только это сохраняет 2 символа, но и спецификация говорит, что для вывода нужно включить.Ява -
426309/301? (см. комментарии)Пример вывода:
Я использовал тот же трюк EXOR, что и представление Python.
Я также использовал+
в качестве функции ИЛИ, когда этоweekend OR night
.Мой другой большой трюк: битовые маски.
Например, чтобы увидеть, находится ли число от 2 до 6 (с понедельника по пятницу), сначала создайте битовую комбинацию, в которой интересные значения равны 1:
Затем используйте битовое смещение, чтобы получить интересующий бит в LSB и извлечь его:
Точно так же я делал битовые паттерны месяцами и часами:
К сожалению,
x>y&x<z
в большинстве случаев получается просто короче, поэтому я не использовал его в некоторых местах.И, наконец, немного хакерства (сильно зависит от реализации) с
jdk.nashorn.internal.parser.DateParser
: КогдаparseEcmaDate()
не полностью анализируется дата (например, когда она читает час и достигает конца строки), она возвращает false.Integer[]
(автоматическом распаковывании ftw) с фиксированным месяцем равным base-0 (как и другие классы Java).-(c?0:1)
.источник
.parse()
могло бы также сработать (сбрить 8 символов), но я не проверил это тщательно с разными входами.parse
внутренне звонкиparseEcmaDate
и, если это не удается, звонкиparseLegacyDate
. Последний может испортить массив, но этого не произошло с несколькими случаями, которые я тестировал.Ничто не мешает мне войти в свой собственный, и в любом случае здесь есть и другие, более короткие, так что ...
PHP 5.4+, 194
Unminified и прокомментировал:
Также обратите внимание, что
date.timezone
директива в php.ini должна быть установлена, в противном случае будет сгенерировано исключение.источник