Учитывая список действий и их время начала / дату, выведите календарь ASCII-искусства, показывающий действия в соответствующие дни. Все действия гарантированно будут выполняться в одном месяце, никакие два действия не будут выполняться в один и тот же день, и все действия гарантированно помещаются в поле календаря.
Календарь имеет дату в верхнем левом углу каждого блока, прямоугольники имеют ширину 9 и 5 пробелов в окружении -
и |
. Двухбуквенное сокращение дня недели расположено по центру над первым рядом, а недели начинаются с воскресенья.
Например, с учетом следующих действий:
10/5/2018 - 9:00am - Sandbox calendar challenge
10/9/2018 - 9:00am - Post challenge to main
10/10/2018 - 10:00am - Profit
10/31/2018 - 7:30pm - Halloween party
Выведите этот соответствующий календарь:
Su Mo Tu We Th Fr Sa
-----------------------------------------------------------------------
| |1 |2 |3 |4 |5 |6 |
| | | | | |9:00am | |
| | | | | |Sandbox | |
| | | | | |calendar | |
| | | | | |challenge| |
-----------------------------------------------------------------------
|7 |8 |9 |10 |11 |12 |13 |
| | |9:00am |10:00am | | | |
| | |Post |Profit | | | |
| | |challenge| | | | |
| | |to main | | | | |
-----------------------------------------------------------------------
|14 |15 |16 |17 |18 |19 |20 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------------------------------
|21 |22 |23 |24 |25 |26 |27 |
| | | | | | | |
| | | | | | | |
| | | | | | | |
| | | | | | | |
-----------------------------------------------------------------------
|28 |29 |30 |31 | | | |
| | | |7:30pm | | | |
| | | |Halloween| | | |
| | | |party | | | |
| | | | | | | |
-----------------------------------------------------------------------
Разъяснения
- Слова расписания (соответствующие [A-Za-z] +) будут разделены одним пробелом между ними (как в примере).
- Разделение текста по границам слова достаточно. Нет необходимости в переносе слов.
- Если февраль начинается в воскресенье не в високосный год, у вас будет только четыре календарных строки.
- Если 31-дневный месяц (например, август) начинается в конце недели, вам может потребоваться вывести шесть календарных строк.
I / O и правила
- Ваш код должен обрабатывать даты, по крайней мере, между
0001-01-01
и9999-12-31
в григорианском календаре, включая високосные годы в зависимости от ситуации. Например, если заданы входные данные2016-02-13 9:00am Test
, выходной календарь должен иметь 29 февраля. - Формат ввода даты может быть в любом желаемом формате. ISO 8601,
datetime
объект, строка специального формата и т. Д. Разбор входных данных не является интересной частью этой задачи. - Ввод и вывод может быть любым удобным способом .
- Лидирующие / завершающие символы новой строки или другие пробелы являются необязательными, при условии, что символы располагаются соответствующим образом.
- Либо полная программа или функция приемлемы. Если функция, вы можете вернуть вывод, а не распечатать его.
- Вывод может быть на консоль, возвращен в виде списка строк, возвращен в виде одной строки и т. Д.
- Стандартные лазейки запрещены.
- Это код-гольф, поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
1752-09-02 - 09:00am - Wife's Birthday Tomorrow (14th!)
Ответы:
JavaScript (ES8),
380…321320 байтПринимает вход как
(y,m,e)
где:y
это годm
это месяц с 0 индексамиe
это объект, ключи которого - дни, а значения - события в[hour, task]
форматеПопробуйте онлайн!
Как?
Ниже приведены некоторые важные части кода.
заголовок
Строка заголовка генерируется с помощью:
Когда
split()
используется с регулярным выражением, содержащим группу захвата, эта группа включается в выходной массив. В этом случае это дает:Мы объединяем этот массив с 4 пробелами, что приводит к:
что именно то, что мы хотим.
Структура месяца
Форматирование событий
Следующий код используется для форматирования события.
источник
Python 2 ,
326324315312307 байтПопробуйте онлайн!
Тот же вклад, что и в ответе Арнаулда :
Принимает вход как
(y,m,e)
где:y
это годm
это месяц, 1 проиндексированныйe
это объект, ключи которого - дни, а значения - события в(hour, task)
форматеисточник
Древесный уголь ,
215206 байтПопробуйте онлайн! Ссылка на подробную версию кода. Принимает даты в формате д / м / гггг. Объяснение:
Введите первое событие.
Извлечь дату и разделить на
/
с.Перевести в месяцы с 1 марта до н. Я хочу рассчитать день недели первого и следующего месяца, и текущего месяца, и работать в месяцах легче, чем разделять месяцы и годы и переносить их в конце года, плюс это также позволяет мне начать подсчет месяцы начинаются в марте вместо января, что требуется конгруэнтностью Зеллера.
Используйте измененную конгруэнтность Целлера, чтобы извлечь день недели первого дня следующего месяца и этого месяца. Основная часть опирается на тот факт, что число дней с 30 октября предыдущего года до 1 числа данного месяца, где
m = 4
для марта иm = 14
января следующего года определяется по формулеm * 153 / 5
, однако мы можем вычесть 140, потому что мы только заботиться о дне недели. Затем остается внести коррективы из-за года; каждый год добавляет день, каждый четвертый год добавляет дополнительный день, каждый сотый год вычитает день, а каждый 400-й год добавляет день снова. (Поскольку я работаю в месяцах, все эти значения умножаются на 12.) Скорее всего, это напрямую дает мне ответ с точки зрения индексируемой в воскресенье недели (обычно вы добавляете день месяца и начинаете считать в субботу).Отмените день недели и сохраните его как текущий день месяца.
Рассчитайте количество дней в месяце от дня недели двух месяцев.
Выведите заголовки дня.
Распечатать верхний ряд
-
с.Цикл, пока не будет выведен последний день месяца.
Переместите курсор в начало следующей строки.
Обрабатывайте 7 дней за один раз.
Распечатать столбец
|
s слева.Увеличение текущего дня месяца.
Если текущий день месяца является днем текущего события, ...
... извлечь другие части мероприятия, ...
... добавьте время к 9 пробелам и сохраните его и пустую строку в виде списка ...
... разбить описание на пробелы и зациклить их, ...
... добавляя каждое слово к предыдущему слову, если оно будет соответствовать; ...
... вывести время и описание (
Pδ
не работает, может быть ошибка с углем?), ...... и введите следующее событие.
Если текущий день месяца находится между 1 и последним днем месяца, выведите его, в противном случае просто выведите достаточно пробелов, чтобы перейти к следующему дню.
В конце недели выведите правый столбец
|
s и нижний ряд-
s.источник
year-1
следует использовать январь и февраль вместоyear
иmonth+12
вместоmonth
. Или вы как-то упростили алгоритм, который я упомянул в этом моем ответе 05AB1E, который совпадает с алгоритмом из Википедии ?Java (JDK) ,
538439428425 байтВполне возможно, самое длинное решение Code Golf, которое я когда-либо размещал. Все еще пытаюсь играть в гольф отсюда, но это борьба.
Удалось сбить 99 байтов, изменив формат ввода и использовав некоторый анализ регулярных выражений, и еще 11 из разных битов.
3 дополнительных байта благодаря Кевину!
Вдохновленный другими ответами, он принимает данные в виде года, месяца и карты дней в строку, представляющую время и событие в формате
<time>-<event>
.Попробуйте онлайн!
Ungolfed
источник
&&(i=1)<2?7:0
можно?7*(i=1):0
сохранить 3 байта.b>x|i++<6?0:7*(i=1)
вместоb<=x&++i>6?7*(i=1):0
иc*i>1|b<1|b>x?c<2&e!=null?e.split("-")[i-2]:" ":b+""
вместоc*i<2&b>0&b<=x?b+"":c<2&e!=null?e.split("-")[i-2]:" "
Красный ,
674651 байтПопробуйте онлайн!
Более читабельно:
источник
if e = 0[e: 7]
можно удалить, верно? Вы используетеe: 1 + c/weekday % 7
, поэтомуe
всегда будете в диапазоне[1, 7]
.1 +
происходит .. Хорошо, я вижу свою ошибку. Я привык%
и имею/
приоритет оператора над+
.