Австралийцы любят праздничные дни и пьют. Вчера, 26 января, был день Австралии, который является выходным днем. Я был рад, что вчера не был на работе, и хотел знать, когда в следующий раз у меня будет выходной день! К сожалению, я выпил слишком много, и я не могу решить это для себя.
Напишите программу, которая будет принимать дату в австралийской записи даты / времени (дд / мм) в качестве входных данных и выводить количество дней до следующего государственного праздника. Поскольку я являюсь резидентом Квинсленда (Квинсленд), меня интересуют только праздничные дни, которые затрагивают жителей Квинсленда :
25/03 | Страстная пятница
26/03 | Пасхальная суббота
28/03 | Пасхальный понедельник
25/04 | День Анзака
02/05 | День труда
03/10 | День рождения королевы
25/12 | Рождество
26/12 | День подарков
27/12 | Праздник Рождества
Обратите внимание на следующее с сайта:
Праздник Рождества
Дополнительный праздничный день, который будет добавлен, когда Новый год, Рождество или День подарков выпадают на выходные.
Поскольку Рождество в воскресенье, есть дополнительная выходной день. Рождество все еще является государственным праздником.
Поскольку я человек утренний, вы должны указать текущую дату как день (так как это наиболее вероятное время, когда я проверю вашу программу на следующий государственный праздник). То есть, если введена дата выходного дня, ваш вывод должен быть 0
; если за день до праздничного дня, ваш вывод будет1
.
Я больше заинтересован только в датах между предприятием (с 27/01) до конца года. Конечная дата, которую вам нужно будет учесть, - 31/12, где будут ваши выходные данные 1
(на Новый год).
Стандартные лазейки запрещены.
вход
- Ввод всегда будет 5 символов: 4 буквы, разделенные дефисом
-
или косой чертой/
- Ввод будет только дата между 27/01 и 31/12
Выход
- Количество дней до следующего государственного праздника в Квинсленде, Австралия, включая дату ввода: должно быть числом между
0
и153
(самый большой разрыв) - Нет новых строк или ошибок
Примеры
01-05 = 1
02-05 = 0
03-05 = 153
25/12 = 0
26-12 = 0
27/12 = 0
30/12 = 2
31-12 = 1
Надеюсь, это ясно и ничего не пропущено; тем не менее, это мой второй вопрос, поэтому я буду признателен за любые отзывы и приложу все усилия, чтобы исправить проблемы как можно скорее.
Ответы:
Pyth ,
98846267 байтОбновление: сохранено 14 байт за счет сокращения списка количества дней для всех 12 месяцев для расчета номера дня. Не нашел хорошего способа сжать другой список, но все еще пытаюсь!
Обновление 2: еще 22 байта сохранены путем конечного кодирования списка номеров дней в виде строки base256.
Попробуйте онлайн!
Тот же алгоритм, что и в моем ответе на Python. И нет встроенных, чтобы получить день года, поэтому я должен был сделать это сам. Создание этих двух списков для расчета дня года и для дней праздников довольно затратно ... я хочу еще раз взглянуть на него и попытаться сгенерировать их в меньшем количестве байтов.
источник
Visual Basic для приложений, 155 или 118 байт
Версия 1 - не зависит от локали, 155 байт
Версия 2 - зависит от локали, 118 байт
Количество байт для окончательного файла .BAS, включая символы перевода строки. Редактируется вне стандартного редактора VBA (поскольку он налагает дополнительные пробелы и подробные формы некоторых ключевых слов) - но импортирует и работает без проблем в любом приложении Office (для проверки типа, например,
? h("10/08")
в непосредственном окне или в Excel, используется непосредственно в формуле ячейки).(ИЗМЕНЕНО) Первоначально я решил использовать
DateSerial
эту функцию, чтобы сделать функцию безопасной на региональном уровне (версия 1). Поскольку я живу в Бразилии, и, таким образом, моя система настроена на использование формата «дд / мм / гг» для дат (как в Австралии), я мог быCDate
вместо этого написать еще меньшую версию (версия 2).CDate
использует информацию о локали системы для преобразования текста в дату. В этой версии я также предполагал, что код будет выполняться только в течение 2016 года (если пропустить год (-6 байт), тоCDate
текущий год соответствует системным часам).Число 42454 в третьей строке представляет собой сумму 42450, которая является числовым представлением 01.01.2016 на VBA, и 84, которая является днем года для первого праздника. Массив содержит день года для каждого выходного дня (включая 01.01.2017), смещенный на -84, так как это отнимает несколько цифр. Использование 16 вместо 2016
DateSerial
приводит к удалению еще двух байтов.Создание идентичного массива девять раз внутри итерации - «плохой» код, но он работает и сохраняет еще 3 байта (один для имени массива и один для знака равенства вне цикла, и еще один для ссылки на массив внутри цикла).
«Пропущенные» пробелы между 0 и последующим ключевым словом во второй и четвертой строках не нужны, поскольку они автоматически вводятся VBE при импорте модуля. Используется устаревшим, но байтово-дешевым,
If <...> Goto <linenumber>
чтобы вырваться из цикла (обаIf <...> Then Exit For
иIf <...> Then Exit Function
использовать больше символов).Также использовался тот факт, что имя функции в VBA ведет себя как локальная переменная, и ее значение автоматически возвращается функцией в конце выполнения.
источник
JavaScript (ES6),
131128 байтобъяснение
Использует встроенный
Date
конструктор JavaScript для преобразования входной строки в количество миллисекунд с начала эпохи, а затем сравнивает это число с количеством миллисекунд для каждого выходного дня.Это достигается путем сохранения выходных дней в массиве в виде количества дней с даты ссылки. Я выбрал
2016-01-29
контрольную дату, потому что количество миллисекунд с начала эпохи может быть сокращено до кратчайшего для этой даты. Любое количество миллисекунд между этим днем и следующими работами, потому что результат округляется в меньшую сторону, а сохранение среднего значения позволяет избежать эффекта перехода на летнее время (хотя часовой пояс OP не имеет перехода на летнее время). Число этого дня1453986000000
и округление его до1454000000000
(добавив пару часов) означает, что оно может быть записано как1454e9
.Тестовое задание
Это решение зависит от часового пояса пользователя. Это работает в часовом поясе ОП (и моего) (GMT +1000). Если вы хотите проверить его в другом часовом поясе, добавив
numberOfHoursDifferentFromGMT1000 * 60 * 60 * 1000
к номеру контрольной даты должно работать. (например, GMT +0430 будет-5.5 * 60 * 60 * 1000 + 1454e9+n*864e5
)Показать фрагмент кода
источник
separated with a hyphen - or slash /
немного амбициозно. Для меня это означает, что мы должны иметь дело с обоими, но я определенно вижу вашу сторону. Угадай, ОП должен уточнить это.T-SQL,
210,206, 194 байта(Первый пост здесь, надеюсь, это нормально, но, пожалуйста, будьте добры :)
Ввод идет
@i
, обслуживает как/
и-
как разделитель. Я в Австралии, поэтому мой формат даты такой же, как у @TasОбновление
varchar
доchar
сохраняет 3 байт плюс удалил пробел :)Обновление 2 объявлять
@c
и назначать без выбораисточник
T-SQL, 296 байт
Создан как табличная функция
Используется следующим образом
Краткое объяснение
источник
JavaScript (ES6), 134 байта
user81655 по-прежнему заставляет меня биться на 3 байта, но я не могу найти где-нибудь еще, чтобы выжать что-то отсюда Работает, вычисляя количество прошедших дней вместо использования даты, затем сравнивая его с массивом смещений праздничных дней.
источник
Python 2,
204185165166 байтОбновление: уменьшил его на ~ 20 байт, рассчитав день года самостоятельно. Больше нет необходимости в долгом импорте :)
Обновление 2: еще 20 байтов, потому что я понимаю, что могу относиться к новым годам так же, как день 367, и внося некоторые другие небольшие изменения.
Попробуйте онлайн!
Ungolfed:
Работает, сохраняя число дней в году в списке, отфильтровывая те, которые предшествуют данной дате, беря первый элемент в этом отфильтрованном списке и вычитая день года, который рассчитан из ввода.
источник
PHP, 116 байт
Довольно прямой подход. Он хранит дни года для праздников и выводит их, пока они в прошлом. Наконец запрашиваемый день года вычитается.
Прошёл все тесты. Запускается из командной строки и принимает ввод с использованием дефиса, например:
источник
рубин 1.9.3,
155153 байтаПосле праздника Рождества нам нужен наш супер-специальный день 366! Аналогичный случай, как @DenkerAffe.
Использование:
источник
05AB1E , 45 байт
Это может быть уже не 2016, но что бы то ни было ..;) Тем не менее, предполагается, что это 2016 год ради високосного года с
29
февраля.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
Смотрите этот 05AB1E наконечника шахты (разделы Как сжать большие целые числа? И Как сжать целые списки? ) , Чтобы понять , почему
•9JRt€ª´Q®Ië•
это10549819042671399072072399
;•9JRt€ª´Q®Ië•368в
есть[85,86,88,116,123,277,360,361,362,367]
; и•Σ₁t•
есть5354545
.источник