Введение
Некоторые месяцы полностью симметричны , то есть они имеют центральную симметрию, а также симметрию отражения , например February of 2010
:
February 2010
┌──┬──┬──┬──┬──┬──┬──┐
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
└──┴──┴──┴──┴──┴──┴──┘
Некоторые месяцы имеют только центральную симметрию, например, February of 1996
или текущий месяц April of 2018
:
February 1996
┌──┬──┬──┬──┐
│ │ │ │ │
┌──┬──┬──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┴──┴──┘
│ │ │ │ │
└──┴──┴──┴──┘
April 2018 ┌──┐
│ │
┌──┬──┬──┬──┬──┬──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┴──┴──┴──┴──┴──┘
│ │
└──┘
А некоторые асимметричны , как и в предыдущем месяце March of 2018
:
March 2018
┌──┬──┬──┬──┐
│ │ │ │ │
┌──┬──┬──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┤
│ │ │ │ │ │ │ │
├──┼──┼──┼──┼──┼──┼──┘
│ │ │ │ │ │ │
└──┴──┴──┴──┴──┴──┘
задача
Примите данные в виде даты , например:
2018.04
2018.03
2010.02
1996.02
Выведите соответствующую симметрию , например
2018.04
->centrally symmetric
2018.03
->asymmetric
2010.02
->symmetric
1996.02
->centrally symmetric
правила
- Это код гольф, поэтому выигрывает наименьшее количество байтов.
- Стандартные лазейки явно не допускаются.
- Предположим, что неделя начинается с понедельника (спасибо Ангсу и Арно за предложение).
- Рассмотрим только годы между 1900 и 2100 ( включительно ).
- Правила форматирования ввода и вывода являются разрешающими , то есть вы можете использовать любой эквивалентный формат, который является родным для языка по вашему выбору.
- Основывайте свое решение на григорианском календаре .
f(x)
для каждогоx
в списке». А как насчет "принять данные в виде даты"?Ответы:
JavaScript (ES6), 55 байт
Сохранено 6 байтов благодаря @Neil
Принимает ввод в синтаксисе карри
(year)(month)
. Возвращаетfalse
для асимметричного,true
для центрально-симметричного и0
полностью симметричного.Попробуйте онлайн!
Как?
Мы определяем функцию g (), которая возвращает день недели yyyy / mm / 01 как целое число от 0 = понедельник до 6 = воскресенье.
Поскольку getDay () изначально возвращает 0 = воскресенье на 6 = суббота, мы смещаем результат в ожидаемый диапазон, запрашивая вместо этого 7-й день.
Затем мы определяем:
Поскольку конструктор Date ожидает месяц с индексом 0 и поскольку g () уменьшает m после передачи его в Date , мы фактически сначала вычисляем день недели первого дня следующего месяца, а затем добавляем день недели текущего.
Полностью симметричные месяцы
Полностью симметричные месяцы начинаются с понедельника, а за ним следует месяц, который также начинается с понедельника. Это возможно только в феврале не високосного года.
Это приводит к n = 0 .
Центрально-симметричные месяцы
Центрально-симметричные месяцы - это месяцы, для которых сумма дня недели их первого дня и дня следующего месяца равна 7 .
Отсюда второй тест: n == 7 .
Нет встроенного, 93 байта
Использует конгруэнтность Целлера . Тот же формат ввода / вывода, что и в другой версии.
Попробуйте онлайн!
источник
true
,false
иfilenotfound
вместо0
...g=m=>new Date(y,m,7).getDay()
экономит 6 байт.T-SQL , 213 байт (строгие правила ввода / вывода)
Приведенный выше запрос учитывает строгие правила форматирования ввода / вывода.
Входные данные взяты из столбца
s
таблицы с именемt
:Ungolfed:
SQLFiddle 1
T-SQL , 128 байт (разрешающие правила ввода-вывода)
Если формат ввода и вывода можно изменить, я бы выбрал ввод первого дня месяца в
datetime
столбце с именемd
:Выход будет 1 для асимметричного, 0 для симметричного, NULL для центрально-симметричного.
Если мы сможем запустить его на сервере (или с именем входа), настроенном на британский язык, мы сможем удалить
SET DATEFIRST 1
сохранение еще 15 байтов.SQLFiddle 2
источник
CONVERT(DATETIME,s+'.01')
вместоREPLACE
. Вы также можетеFROM (SELECT
DATEFORMAT
настроек. Например, если мы используемSET LANGUAGE BRITISH
, тоCONVERT(DATETIME,'2018.02.01')
будет 2 января, а не 1 февраля.Haskell, 170 байт
Возвращает 2 для центрально-симметричного, 1 для симметричного и 0 для асимметричного
источник
Python 2,
118104 байтаСпасибо Джонатану Аллану и Мертвому Опоссуму за улучшения!
Python 3,
122105 байтвход
Выход
источник
Y
илиM
), поэтому в настоящее время это фрагмент и недопустимый. Однако если вы измените переменные на вызовыinput()
, это будет совершенно нормально._[0]+_[-1]
->sum(..)
Красный ,
199, 168161 байтПопробуйте онлайн!
0 - асимметричный
1 - симметричный
2 - центрально-симметричный
Более читабельно:
источник
Mathematica, 137 байт
Чистая функция. Принимает год и месяц в качестве входных данных и возвращает
-1
асимметричные месяцы,0
центрально-симметричные месяцы и1
полностью симметричные месяцы. Не уверен, почему этот язык не может конвертировать из дня недели в число по умолчанию ...источник
Утилиты Bash + GNU, 70
Ввод отформатирован как
YYYY/MM
.Вывод числовой:
Я предполагаю, что этот формат вывода является приемлемым для этого вопроса.
Попробуйте онлайн!
источник
C 111 байтов
Вызвать
f(year, month)
, 0 для полностью симметричного, 1 для асимметричного, 2 для центрально-симметричного.источник
return
сy=
(первым параметром) и выпадением функции.Perl 6 , 74 байта
Голый блок, неявно функция с 1 аргументом, строка типа
"2012-02"
. Возвращает:Когда шаблон симметричен, так как .day-of-week увеличивается на 1, .days-in-month нужно будет сдвинуть на 2, чтобы все еще совпадать (месяц должен начинаться днем позже, но должен заканчиваться днем ранее ), поэтому
2 * .day-of-week + .days-in-month
дает нам меру этого разрыва. По модулю 7 это должно быть 1, чтобы получить симметрию, но мы можем сначала дешево проверить на отсутствие високосного февраля, проверив это общее количество перед модулем (понедельник и 28 дней в месяц - минимально возможная комбинация).Я удивлен, что это занимает так много байтов, но для создания даты и получения дня недели и дней в этом месяце необходимо 36 байтов.
источник