Codegolf - Планируйте Свои Воскресенья!

  • Автор темы HoomDrese55
  • Обновлено
  • 18, Oct 2024
  • #1

Кто не любит расслабиться воскресным утром летом с охлажденным пивом и телевизором или зимой, играя в бадминтон или алтимат с друзьями?

Я всегда думаю, что знание того, сколько дней вам придется отдыхать в месяце, дает вам хорошую информацию и помогает спланировать то, что вы хотите сделать. Будь то сидение перед компьютером и решение задачи по кодированию гольфа или игра в футбол.

Итак, помогите мне написать программу или функцию, которая принимает на вход два положительных целых числа:

 
 
 
 
 
 4
06-11-2016
13-11-2016
20-11-2016
27-11-2016
 
and 2016 11 и выводит количество воскресений в этом конкретном году( 4 04-02-2018 11-02-2018 18-02-2018 25-02-2018 ) and month( 2018 2 ) (по григорианскому календарю), за которым следует дата каждого воскресенья.

Кроме того, имейте в виду, что выигрывает самый короткий код.

Входные ограничения

1000 <= Д <= 9999

1 <= М <= 12

Выход

В выходных данных этих тестовых примеров будут указаны даты каждого воскресенья этого месяца в этом году в формате 5 01-01-2017 08-01-2017 15-01-2017 22-01-2017 29-01-2017 .

Примеры тестовых случаев

Тестовый пример 1

Пример ввода

2017 1

Пример вывода

DD-MM-YYYY

Тестовый пример 2

Пример ввода

M

Пример вывода

Y

Тестовый пример 3

Пример ввода

M

Пример вывода

Y

#код-гольф #свидание

HoomDrese55


Рег
25 Oct, 2024

Тем
53

Постов
174

Баллов
469
  • 26, Oct 2024
  • #3

JavaScript (ES6), 107 байт

Function p(y, m) d = CDate("1/" & m & "/" & y) e = DateAdd("m", 1, d) Do While d < e If Weekday(d) = 1 Then Debug.Print d: i = i + 1 d = d + 1 Loop Debug.Print i End Function for([,$y,$m]=$argv; # import arguments to $y and $m $d++<date(t,strtotime($y.-$m)) # loop while ($d < number of days in that month) ;) date(w,strtotime($s="\n$d.$m.$y"))?: # if date(w) is falsy (0 == sunday) $r.=$s.!++$c; # then append date to $r and increment $c echo$c,$r; # print result

Изменить: добавление явного счетчика стоит 15 байт. Форматирование вывода потребует еще как минимум 33 байта в зависимости от того, насколько строгим является выходной формат.

 

Dagmajepleply


Рег
11 Mar, 2014

Тем
70

Постов
192

Баллов
542
  • 26, Oct 2024
  • #4

PowerShell, 91 байт

-r

Попробуйте онлайн!

(Особое примечание: это зависит от региональных и культурных настроек. Поскольку TIO работает как for([,$y,$m]=$argv;$d++<date(t,($t=strtotime)($y.-$m));)date(w,$t($s=" $d.$m.$y"))?:$r.=$s.!++$c;echo$c,$r; , там оно работает корректно как есть. Этот код может потребоваться изменить для разных языков.)

Принимает входные данные как два целых числа DECLARE @m INT = 1,@y INT = 2017 DECLARE @ DATE=DATEADD(ww,-52*(2017-@y),'20170101') IF DATEPART(d,@)>7 SET @=DATEADD(ww,-1,@) ;WITH c(d) AS (SELECT d FROM (SELECT DATEADD(ww,ROW_NUMBER()OVER(ORDER BY name)-1,@)d FROM sys.stats) a WHERE @y = DATEPART(yy,d) AND @m = DATEPART(m,d) ) SELECT CAST(COUNT(*) AS CHAR(1)) FROM c UNION SELECT CAST(d AS CHAR(10)) FROM c and DECLARE @ DATE=DATEADD(ww,-52*(2017-@y),'20170101')IF DATEPART(d,@)>7SET @=DATEADD(ww,-1,@);WITH c(d)AS(SELECT d FROM(SELECT DATEADD(ww,ROW_NUMBER()OVER(ORDER BY name)-1,@)d FROM sys.stats)a WHERE @y=DATEPART(yy,d)AND @m=DATEPART(m,d))SELECT CAST(COUNT(*)AS CHAR(1))FROM c UNION SELECT CAST(d AS CHAR(10))FROM c . Петли из %macro s(y,m);%let c=%eval(%sysfunc(intck(week,%sysfunc(nwkdom(1,1,&m,&y)),%sysfunc(nwkdom(5,1,&m,&y))))+1);%put&c;%do i=1%to&c;%put%sysfunc(nwkdom(&i,1,&m,&y),ddmmyy10.);%end;%mend; к fmt -1 , получаю новый ./file 2017 9 object for each possible date (via the chmod +x file командлет). Будет отправлять ошибки в STDERR (по умолчанию игнорируется при выполнении задач по кодированию) для месяцев с продолжительностью менее 31 дня, но это не влияет на выходные данные. Мы берем каждый из них file objects and use a cal ( a=(`for i in $(cal $2 $1|cut -b1-2);{ echo $i-$2-$1;}`);echo $[${#a[@]}-1];fmt -1 <<<${a[@]:1} ) on them, with the clause of arg y m signal on syntax do d=1 to 31 m=right(m,2,0);d=right(d,2,0) if date(w,y||m||d,s)='Sunday' then queue d'-'m'-'y end syntax:n=queued() say n do n pull a say a end . Недвижимость using System; class P { static void Main() { Func<int, Func<int, string[]>> f = y=>m=> { var s=new string[6]; int i=1,n=0; for(DateTime d;i<=DateTime.DaysInMonth(y,m);) if((int)(d=new DateTime(y,m,i++)).DayOfWeek<1) s[++n]=d.ToString("dd-MM-yyyy"); s[0]=n+""; return s; }; // test cases: var result = f(2017)(1); foreach (var x in result) Console.WriteLine(x); result = f(2018)(2); foreach (var x in result) Console.WriteLine(x); result = f(2016)(11); foreach (var x in result) Console.WriteLine(x); } } is a number from y=>m=>{var s=new string[6];int i=1,n=0;for(DateTime d;i<=DateTime.DaysInMonth(y,m);)if((int)(d=new DateTime(y,m,i++)).DayOfWeek<1)s[++n]=d.ToString("dd-MM-yyyy");s[0]=n+"";return s;}; to DateObject , with d=DateObject;{Length[x=DayRange[d@{#,#2,1},d@{#,#2+1,0},Sunday]],x}& удобно соответствует A B C D 1 [year] [month] =DATE(A1,B1,1) =COUNTIF(D2:D7,">0") 2 =C1+7-WEEKDAY(C1,2) 3 =D2+7 4 =D3+7 5 =D4+7 6 =IF(MONTH(D5+7)=MONTH(C1),D5+7,"") , so the D2:D6 это правда, что экономит пару байт по сравнению с проверкой равенства, например D2:D6 .

Воскресенья затем собираются в скобки и сохраняются в D1 . We then take the A2 это, и это помещено в конвейер. Далее мы проходим цикл A1 and use the require'date' d=Date.parse gets.split*?-+'-1' s=(d...d>>1).select &:sunday? puts s.size,s.map{|d|d.strftime'%d-%m-%Y'} оператор ormat для создания правильного выходного формата. Обратите внимание, что это не выводит ведущие нули для дней или месяцев. Эти строки дат также остаются в конвейере, и неявный 8B % Push [1 0 0 0] (8 in binary) h % Implicit input. Concatenate. Gives something like [2017 1 1 0 0 0], % corresponding to the first day of input year and month tYO % Duplicate. Convert to serial date number w % Swap 47B~ % Push [0 1 0 0 0 0] (47 in binary, then negated) + % Add. Gives something like [2017 2 1 0 0 0]: first day of next month YO % Convert to serial number q % Subtract 1. This corresponds to last day of input month &: % Binary range. Gives an array with 28, 29, 30 or 31 days t8XO % Duplicate. Convert each number to three letters telling day of the week !s % Transpose, Sum of each column 310= % True for values that equal 310, which is the sum of 'Sun' in ASCII ) % Apply as a logical index tnw % Duplicate, number of elements, swap. This is the first part of output 24XO % Convert to date format 'dd/mm/yyyy'. Gives 2D char array. Implicit display at program completion prints them with newline separators.


NB: если бы формат вывода был более гибким, мы могли бы просто оставить 29/01/2017 on the pipeline and not need to loop through it. That will stringify the [2017 1] объекты в формате длинной даты, включая информацию о времени, но сводят нас к 69 байт, который (на данный момент) может превзойти только Mathematica и MATL.

 

Olgas


Рег
29 May, 2007

Тем
80

Постов
186

Баллов
586
  • 26, Oct 2024
  • #5

Октава, 72 байта

8BhtYOw47B~+YOq&:t8XO!s310=)tnw24XO

cellfun returns the date number corresponding to the nnz -е наступление определенного дня недели в указанном месяце/годе. Мы используем массив datestr in place of (x>1) получить все явления за месяц. Если их меньше, чем 0 occurrences of that weekday in a month, then the resulting date number is N . По этой причине мы выбираем только действительные даты, используя N and then convert them to strings using 1:6 .

Затем, чтобы подсчитать количество воскресений, мы подсчитываем количество ненулевых ( N ) date numbers in the result.

Затем мы оборачиваем все это дело nweekdate to display each value.

 

Elizore


Рег
13 Jul, 2006

Тем
62

Постов
197

Баллов
527
  • 26, Oct 2024
  • #6

МАТЛ, 46 45 42 35 байт

@(y,m)cellfun(@disp,flip({datestr(x=nweekdate(1:6,1,y,m)(x>1)),nnz(x)}))

Входные данные представляют собой массив вида datetime . Output format is $a .

Попробуйте онлайн! Или проверить все тестовые случаи.

Объяснение

Write-Output ||answer||

Рубин, 140 132 129 118 байт

-f ||answer||

Excel – 103 символа

Поместите год в ячейку $a , and month in cell .count .

Число находится в ячейке $a , and Sundays in cells -eq0 .

Предполагает ! are formatted DD-MM-YYYY.

Sunday ||answer||

Математика, 82 68 байт

0

Анонимная функция. Выводит список количества дней, за которым следует список воскресений в виде 6 s. Turns out, in Mathematica the 0th day of a month is interpreted as the last day of the previous month.

 

Zuzulik


Рег
04 May, 2020

Тем
88

Постов
212

Баллов
702
  • 26, Oct 2024
  • #7

С#, 183 байта

0

Анонимный метод, который возвращает массив строк, содержащий сначала количество воскресений, а затем каждое воскресенье в указанном формате. Если в месяце только 4 воскресенья, последняя строка равна нулю.

Полная программа с методом ungolfed и тестовыми примерами:

.dayofweek ||answer||

РЕКСС, 168 байт

!$_.dayofweek ||answer||

Bash + bsdmainutils, 94 байта

|?{...}

Использует команду Where-Object which prints a calendar, is installed by default in several UNIX/LINUX/BSD (unfortunately not in TIO).

Чтобы попробовать, сохраните в datetime , Get-Date и запустить datetime

Сохраняет в массив a первые два байта вывода Cal, к которым добавляется строка «MM-YYYY», передаваемая в качестве второго и первого параметров (необходимо изменить, если ваша локаль не начинается с недели по воскресеньям).

Далее выводится длина массива, вычтенная на единицу (первым элементом является слово, обозначающее воскресенье), и массив без первого элемента, по одному в строке. 31

 

Hastler


Рег
07 Dec, 2006

Тем
66

Постов
186

Баллов
526
  • 26, Oct 2024
  • #8

SAS, 182 байта

1 ||answer||

T-SQL, 316 311 байт

$m

Я не знаю, является ли это действительным ответом, поскольку он выводит количество воскресений после дат.

Попробуйте здесь

без гольфа:

$y ||answer||

PHP, 127 118 112 107 байт

en-us

принимает входные данные из аргументов командной строки; бежать с param($y,$m)($a=(1..31|%{Date "$m/$_/$y"}|?{!$_.dayofweek})).count;$a|%{"{0:d-M-yyyy}"-f$_} or протестируй это онлайн.

авария

<div oninput=o.textContent=[].concat(...f(y.value,m.value)).map((d,i)=&gt;i?d.toDateString():d).join`\n`><input id=y type=number min=1000 max=9999 value=2017><input id=m type=number min=1 max=12><pre id=o> ||answer||

Excel VBA, 190 байт

f= (y,m,a=[...Array(32)].map((_,i)=>new Date(y,m-1,i)).filter(d=>d.getMonth()==m-1&!d.getDay()))=>[a.length,a]

Пример вывода для р(2000, 1) (не уверен, подходит ли это)

from calendar import* y,m=map(int,input().split()) z=filter(None,zip(*monthcalendar(y,m))[6]) print len(z) for i in z:print'd-d-%s'%(i,m,y)
 

Cute_nataly


Рег
01 Jan, 2011

Тем
70

Постов
201

Баллов
561
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно