Кому не нравится отдыхать в воскресенье утром летом с охлажденным пивом и телевизором, а зимой играть в бадминтон или играть в ульт с друзьями?
Я всегда думаю, что зная, сколько дней вам нужно отдохнуть в месяце, вы будете хорошо информированы и поможете спланировать, что вы хотите сделать. Будь то сидение перед компьютером и решение проблемы игры в гольф или игра в футбол.
Итак, помогите мне написать программу или функцию , которая принимает в качестве входных 2 положительных целых чисел, Y
а M
и выводит количество воскресений в этом конкретном году ( Y
) и месяц ( M
) (по григорианскому календарю), а затем по дате каждого воскресенья.
Кроме того, имейте в виду, что выигрывает самый короткий код.
Ограничения ввода
1000 <= Y <= 9999
1 <= M <= 12
Выход
Эти тесты будут иметь выходные данные с датами каждого воскресенья того месяца в этом году в формате DD-MM-YYYY
.
Примеры тестовых случаев
Тестовый пример 1
Пример ввода
2017 1
Пример вывода
5
01-01-2017
08-01-2017
15-01-2017
22-01-2017
29-01-2017
Тестовый пример 2
Пример ввода
2018 2
Пример вывода
4
04-02-2018
11-02-2018
18-02-2018
25-02-2018
Тестовый пример 3
Пример ввода
2016 11
Пример вывода
4
06-11-2016
13-11-2016
20-11-2016
27-11-2016
Date()
объект, и любой формат вывода, в том числе[4, [<dateobj>, <dateobj>, <dateobj>, <dateobj>]]
(где<dateobj>
это фактический объект даты и[]
фактический массив)./
вместо-
? Или это может быть месяц, потом день, потом год?Ответы:
MATL ,
46454235 байтВвод является массивом формы
[2017 1]
. Формат вывода29/01/2017
.Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Python 2 ,
150, 148,145 байтовПопробуйте онлайн!
-3 байта, делающие вещи более питоническими (используя zip и filter!)
источник
JavaScript (ES6), 107 байт
Редактировать: добавление явного подсчета стоит 15 байт. Форматирование вывода будет стоить как минимум еще 33 байта в зависимости от того, насколько строгим является формат вывода.
источник
outputs the number of Sundays in that particular year and month
; Похоже, что это не выводит количество воскресений.<input type='date'>
.PowerShell , 91 байт
Попробуйте онлайн!
(Особое примечание - это зависит от настроек локали и культуры. Поскольку TIO работает как
en-us
, он работает там, где есть, и может потребоваться изменить этот код для разных локалей.)Принимает ввод как два целых числа
$y
и$m
. Переходя от1
к к31
, получая новыйdatetime
объект для каждой возможной даты (черезGet-Date
командлет). Будет выбрасывать ошибки в STDERR (по умолчанию игнорируется при вызовах кода-гольфа) в течение месяцев с количеством дней менее 31, но это не влияет на результат. Мы берем каждый из этихdatetime
объектов и используем для нихWhere-Object
(|?{...}
) с предложением!$_.dayofweek
. Свойство.dayofweek
представляет собой число от0
до6
, с0
удобным соответствиемSunday
, поэтому значение!
true, которое экономит пару байт по сравнению с проверкой равенства, например-eq0
.Затем воскресенья собираются в парен и хранятся в
$a
. Затем мы берем.count
их, и это помещается на конвейер. Далее мы перебираем цикл$a
и используем-f
оператор ormat для создания правильного выходного формата. Обратите внимание, что это не выводит лидирующие нули в течение нескольких дней или месяцев. Эти строки даты также остаются в конвейере, и неявноеWrite-Output
при завершении программы печатает их с разделителями новой строки.NB. Если бы выходной формат был более гибким, мы могли бы просто оставить его
$a
в конвейере, и не нужно было бы проходить через него. Это преобразуетdatetime
объекты в формат длинных дат, включающий информацию о времени, но сокращает нас до 69 байтов , которые (в настоящее время) будут побеждены только Mathematica и MATL.источник
Октава, 72 байта
nweekdate
возвращает номер даты, соответствующийN
-ому вхождению определенного дня недели в указанный месяц / год. Мы используем массив1:6
вместо,N
чтобы получить все вхождения за месяц. Если числоN
дней недели в этом месяце меньше, чем число , то результирующий номер даты равен0
. По этой причине мы выбираем только действительные даты, используя,(x>1)
а затем конвертируем их в строки, используяdatestr
.Затем, чтобы посчитать количество воскресений, мы посчитаем количество ненулевых (
nnz
) чисел даты в результате.Затем мы оборачиваем все,
cellfun
чтобы отобразить каждое значение.источник
Рубин,
140132129118 байтисточник
Excel - 103 символа
Поместите год в ячейку
A1
и месяц в ячейкуA2
.Количество в ячейке
D1
, а воскресенье в ячейкахD2:D6
.Предположения
D2:D6
отформатированы ДД-ММ-ГГГГ.источник
Mathematica,
8268 байтАнонимная функция. Выводит список количества дней, за которым следует список воскресений как
DateObject
s. Оказывается, в Mathematica 0-й день месяца интерпретируется как последний день предыдущего месяца.источник
C #, 183 байта
Анонимный метод, который возвращает массив строк, содержащий сначала количество воскресений, а затем каждое воскресенье в указанном формате. Если в месяце только 4 воскресенья, последняя строка равна нулю.
Полная программа с методикой ungolfed и тестовыми примерами:
источник
REXX, 168 байт
источник
1217
?Bash + bsdmainutils, 94 байта
Использует команду
cal
которая печатает календарь, устанавливается по умолчанию в нескольких UNIX / LINUX / BSD (к сожалению, не в TIO).Для того, чтобы попробовать сохранить на
file
,chmod +x file
и запустить./file 2017 9
Сохраняет в массив первые два байта выходных данных калибровки, к которым добавляется строка «MM-YYYY», передаваемая в качестве второго и первого параметров (необходимо изменить, если ваша локаль не запускается неделями по воскресеньям).
Далее отражается длина массива, вычтенная одним (первый элемент - слово, представляющее воскресенье) и массив без первого элемента, по одному на строку
fmt -1
источник
SAS, 182 байта
источник
T-SQL,
316311 байтЯ не знаю, если это правильный ответ, так как он выводит количество воскресений после даты
Попробуй здесь
ungolfed:
источник
PHP
127 118 112107 байтпринимает входные данные из аргументов командной строки; запустить
-r
или проверить это онлайн .сломать
источник
Excel VBA, 190 байт
источник