Отримайте дату п’ятого дня тижня в даному році та місяці


17

Вступ

Часто люди позначають дати як "другу п’ятницю серпня 2018 року" або "четверту неділю березня 2012 року". Але важко сказати, яка це дата! Ваше завдання полягає в тому, щоб написати програму, яка отримує рік, місяць, день тижня і ціле число, і вивести цю дату.

Виклик

  • Для введення ви отримаєте рік, місяць, день тижня та число.

  • Ви можете взяти введення в будь-якому розумному форматі, наприклад, використовувати рядок для дня тижня або використовувати нульовий день, деіндексований, або навіть взяти рік і місяць в одному рядку. Однак поясніть формат введення у своїй відповіді.

  • Ціле число, яке повідомляє вам, який день тижня в місяці для націлювання буде цілим числом від 1-5. Ціле число ніколи не посилається на день тижня, який не існує (наприклад, п'яту п’ятницю лютого 2019 року, яка не існує).

  • Роки завжди будуть позитивними.

  • Вихід може бути в будь-якому розумному форматі, включаючи друк кінцевої дати. Однак, будь ласка, поясніть свій вихідний формат, не відповідаючи.

  • Забезпечення року та місяця у виході не є обов'язковим. Також ви можете вважати, що дата є дійсною.

Приклад введення та виведення

Розглянемо цей вхід, при цьому формат приймає рік як чотиризначне число, місяць як ціле число, день тижня як рядок, а порядковий номер - ціле число:

2019, 3, субота, 2
2019, 12, неділя, 1
2019, 9 субота, 1

Вихід:

9 березня
1
вересня 7 вересня

Це , тому найкоротша відповідь виграє.


1
Я думав, що я можу використати GNU date, але кумедно, аналізатор має ... цікаву інтерпретацію тут.
Дверна ручка

Чи може число тижневого тижня бути 0-індексованим?
Джо Кінг

Звичайно, якщо це відповідає вашій програмі
Втілення Невігластва

Запропонований тестовий випадок: 2018, 12, неділя 1
Adám

Пропонований тестовий випадок: у першу суботу вересня 2019 року
Shaggy

Відповіді:


4

Шаблон MediaWiki, 19 байт

{{#time:r|{{{1}}}}}

Це порт MediaWiki Temser ParserFunctions цього відповіді PHP

Примітка: #timeвикористовуйте PHP strtotimeвнутрішньо.


Зразок введення

{{#time: r | друга субота березня 2019}}

Вибірка зразка

Сб, 09 березня 2019 00:00:00 +0000


3

Japt, 19 15 байт

Вхідні дані: рік, індекс місяця на основі 0, індекс дня тижня на основі 0 ( 0є неділя) & n.

_XµW¶Ze}f@ÐUVYÄ

Спробуй це

                    :Implicit input of U=year, V=month, W=weekday & X=n
       }f           :Output the first element generated by the right function that returns
                    : falsey (0) when passed through the left function
         @          :Right function. Y=0-based index of current iteration
          ÐUVYÄ     :  new Date(U,V,Y+1)
_                   :Left function. Z=date being passed
 Xµ                 :  Decrement X by
   W¶               :   Test W for equality with
     Ze             :    Z.getDay()

2

C # (Visual C # Interactive Compiler) , 59 байт

(y,m,d,w)=>1+(d-(int)new DateTime(y,m,1).DayOfWeek+7)%7+7*w

Спробуйте в Інтернеті!

-27 байт завдяки @EmbodimentOfIgnorance!

Менше коду для гольфу ...

// y: year
// m: month
// d: day of week (0 is Sunday)
// w: week number (0 based)
(y,m,d,w)=>
  // start on the first day of the month
  1+
  // determine the number of days to
  // the first occurrence of the
  // requested weekday
  (d-(int)new DateTime(y,m,1).DayOfWeek+7)%7+
  // add the number of requested weeks
  7*w

Повернене значення - ціле число для дня місяця запитуваної дати.


Якщо ви повернете лише той день місяця, який дозволений, ви можете
Втілення

Дякую ще за підказку - (це вже 2х сьогодні;) я оновлю свої відповіді.
Dana

2

SmileBASIC, 58 51 48 46 45 байт

READ N,M$DTREAD M$OUT,,D,W?(5-W+D*2)MOD 7+N*7

Введіть форму: week,year/month/weekday

  • week: номер тижня, 0-індексується
  • year: рік, 4 цифри
  • month: місяць (1-індексований), 2 цифри - 0додано
  • weekday: день тижня (1-індексований, 1 = неділя), 2 цифри - 0додано

Вихід - день місяця, індексований 0.
Друга субота березня 2019 року буде 1,2019/03/078(9 березня)

Безумовно

READ WEEK,M$
DTREAD M$ OUT ,,D,W
'Functions in SB can output multiple values using OUT.
'In this case, we don't need the first 2 values, so no variables are given.

PRINT (5-W+ D*2) MOD 7 +WEEK*7

Пояснення

Форма введення була спеціально обрана таким чином, щоб рік / місяць / будній день можна було передати безпосередньо DTREAD, що є функцією, яка розбирає YYYY/MM/DDрядок і повертає рік / місяць / день у вигляді чисел, а також обчислює день тижня.

Однак зауважте, що там, де DTREADочікується день місяця, ми надаємо йому день тижня. Це ускладнює речі, але також означає, що вхідних значень менше, і нам не потрібно додавати /01в кінець рядка дати.

DTREADвиходи Wта D.
Wє будним Dднем і є днем ​​тижня першого Wчисла місяця.
(Отже, якщо ви вводите 7як будній день, Dто буде 7і Wбуде будь-який день тижня, 7-й день місяця)

Вираз (5-W+D*2)MOD 7використовується для отримання 1-го виникнення вхідного будня, як 0-індексованого дня місяця. (Я зрозумів, що це здебільшого шляхом спроб та помилок)

Після цього програма просто додає WEEK*7.


Мені дуже хочеться, щоб були окремі слова "день тижня" та "день місяця".


2

Perl 6 , 52 48 байт

{1+($^c+4-Date.new($^a,$^b,1).daycount)%7+$^d*7}

Спробуйте в Інтернеті!

Блок анонімного коду, який приймає дані як рік, місяць, день тижня (неділя - 0) та номер тижня (0 індексується). Вихід - об’єкт дати.

Старе пояснення:

{                                                  } # Anonymous code block
 (   Date.new(         ))   # Create a new date with
              $^a,$^b,1     # With year, month and the first day
  $_=                       # Save in the variable $_
                         +  # Add to this
                           $^c+4                     # The given day plus 4
                          (     -.daycount)          # The number of days since 17 Nov, 1858
                                           %7        # Modulo 7 to get the correct day
                                             +$^d*7  # Plus the 7 times the number of weeks

Я думаю, що номер тижня повинен бути 1-індексованим
12Me21

@ 12Me21 Питання говорить про те, що введення гнучко, але я запитав, чи вважаємо ми число тижня як індексоване 0
Jo King

Це, здається, не працює в інші місяці. Я думаю, що вам потрібно $^c+4-$!.daycount.
nwellnhof

@nwellnhof Ах, я мав би подумати про це замість спроб і помилок, lol. Має бути виправлено зараз
Jo King

1

MATL , 28 27 байт

'1 'ihYO31:q+t8XOi=!A)i)1XO

Для цього використовується три входи:

  • Рядок із місяцем та роком: 'March 2019'
  • Рядок з трьома літерами, з великої літери, із зазначенням дня тижня: ' Sat'
  • Номер: 2.

Вихід є рядком день, рік і місяць розділених тире: 09-Mar-2019.

Спробуйте в Інтернеті!

Пояснення

Розглянемо входи 'March 2019', 'Sat', 2.

'1 '    % Push this string
        % STACK: '1 '
ih      % Input string: month and year. Concatenate
        % STACK: '1 March 2019'
YO      % Convert to serial date number
        % STACK: 737485
31:q+   % Create vector [0 1 2 ... 30] and add element-wise
        % STACK: [737485 737486 737487 ... 737515]
t8XO    % Duplicate. Convert to date format 'ddd': day of week in three letters. Gives
        % a 2D char array
        % STACK: [737485 737486 737487 ... 737515], ['Fri'; 'Sat'; 'Sun'; ...; 'Sun']
i=      % Input string: day of week in three letters. Compare element-wise with broadcast
        % STACK: [737485 737486 737487 ... 737515],
        % [0 0 0; 0 0 0; ...; 1 1 1; 0 0 0; ... 1 1 1; ...]
!A      % True for rows containing only 1
        % STACK: [737485 737486 737487 ... 737515], [0 0 ... 1 ... 0 ... 1 ...]
)       % Index: uses the second vector as a mask into the first
        % STACK: [737486 737493 737500 737507 737514]
i)      % Input number. Index
        % STACK: 737493
1XO     % Convert to date format 'dd-mmm-yyyy'. Implicit display
        % STACK: '09-Mar-2019'

1

Python 3 , 92 82 байт

82 байти завдяки @Jo King

lambda y,m,d,w:z(y,m)[w-(z(y,m)[0][d]>0)][d]
from calendar import*
z=monthcalendar

Спробуйте в Інтернеті!

Оригінальна версія, 92 байти

from calendar import*
def f(y,m,d,w):
 x=monthcalendar(y,m)
 if x[0][d]:w-=1
 return x[w][d]

Спробуйте в Інтернеті!

Приймає рік як ціле число, місяць як 1-індексоване ціле число, день тижня як ціле число 0-індексу, де є понеділок 0та неділя 6, а тиждень місяця - як індексоване ціле число.

Як це працює:

# import monthcalendar
from calendar import*
# function with 4 inputs
def f(y,m,d,w):
 # get a 2-D array representing the specified month
 # each week is represented by an array
 # and the value of each element is its date of the month
 # Monday is the 0th element of each week, Sunday is the 6th element
 # days of the first week of the month before the 1st are 0s 
 x=monthcalendar(y,m)
 # if the first week of the month includes the desired day of week
 # convert the week of month to 0-index so that it takes into account the first week
 if x[0][d]:w-=1
 # return the weekday of the week number specified
 return x[w][d]

1

R , 72 69 байт

function(y,m,d,n,D=as.Date(paste0(y,-m,-1))+0:31)D[weekdays(D)==d][n]

Спробуйте в Інтернеті!

Введення даних у якості:

  • Номер року
  • Кількість місяця (1-12)
  • Рядок тижня в поточному мові (TIO вимагає англійського імені з великої літери)
  • Порядковий номер (1-індексований)

0

PHP , 46 , 43 , 31 байт

<?=date(d,strtotime($argv[1]));

Спробуйте в Інтернеті!

Програма отримує як вхід такий рядок "second saturday of March 2019"

Програма друкує номер дня.

-12 байт завдяки Шаггі.



Крім того, я не думаю, що вам потрібно ofвведення.
Кошлатий

@Shaggy, я думаю, це деталі. Варіантів може бути багато.
Кирилл Малышев



0

Червоний , 64 60 байт

func[y m d n][a: to-date[1 m y]d - a/10 - 7 % 7 +(n * 7)+ a]

Спробуйте в Інтернеті!

Рік, місяць і будній день приймає як числа, 1-індексованими, понеділок - першим днем ​​тижня.


так, to-dateце річ. можливо, це було б корисно у виклику формату Різдва напередодні
лише для ASCII

@ ASCII Тільки ми використовували nowдля цього виклик
Гален Іванов

1
так, але я думав про альтернативні методи (а саме <повторити " Eve"date2-date1 разів> метод iirc)
лише для ASCII

@ ASCII-only>> 25-Dec-2019 - 1-1-2019 == 358
Гален Іванов

0

APL (Dyalog Unicode) , 36 байт SBCS

Повна програма. Підказки для [year,month](січень - 1), потім для дня (неділя - 0), потім для n (перший - 1).

date⎕⊃d/⍨⎕=7|d←(⍳31)+days⎕⊣⎕CY'dfns'

Спробуйте в Інтернеті!

⎕CY'dfns'c o p y у бібліотеці dfns

 відкиньте результат цього на користь…

 швидка консоль [year,month]номерів

days[c]  днів [n] з 1899-12-31 року 0- го цього місяця

(⍳31)+ до цього додайте i ntegers 1… 31

d← зберігати в d(для d ay номерів)

7| залишок ділення при діленні на 7 (день тижня з неділею 0 через добру епоху)

⎕= підкажіть консоль для номера дня тижня та отримайте маску там, де дорівнює кількість днів тижня

d/⍨ фільтрують за dдопомогою цієї маски

⎕⊃ підкажіть консоль n і скористайтеся нею, щоб вибрати зі списку номерів днів

date[c]  штамп часу [n] (має кінцеві нулі на години, хвилини, секунди, мілісекунди)


Клацніть [c] для коду та [n] для приміток.


0

JavaScript (ES6), 49 48 байт

f=
(a,d,n)=>(d+6-new Date(...a,7).getDay())%7+n*7-6
<div oninput=o.textContent=f([+y.value,+m.value],+d.value,+n.value)>Year: <input id=y type=number value=2019><br>Month: <select id=m><option value=0>Jan<option value=1>Feb<option value=2>Mar<option value=3>Apr<option value=4>May<option value=5>Jun<option value=6>Jul<option value=7>Aug<option value=8>Sep<option value=9>Oct<option value=10>Nov<option value=11>Dec</select><br>Day: <select id=d><option value=0>Sun<option value=1>Mon<option value=2>Tue<option value=3>Wed<option value=4>Thu<option value=5>Fri<option value=6>Sat</select><br>Count: <input id=n type=number value=1 min=1 max=5><pre id=o>

Приймає параметри як f([year, month], day, number). Місяць і день тижня (починаючи з неділі) нульово індексуються. Редагувати: Збережено 1 байт завдяки @Shaggy.


Чи день тижня у форматі неділя-субота чи понеділок-неділя?
Втілення

@EmbodimentofIgnorance Вибачте, я знав, що щось забув. (У фрагменті зараз використовується select, щоб полегшити його.)
Ніл

@EmbodimentofIgnorance, неділя 0в JS.
Shaggy

Ой. Я цього не знав, я не так знайомий з Javascript.
Втілення


0

TSQL, 106 байт

DECLARE @ datetime='2019',@m int=3,@w char(2)='saturday',@p int=2

SELECT dateadd(wk,datediff(d,x,dateadd(m,@m-1,@)-1)/7,x)+@p*7FROM(SELECT
charindex(@w,' tuwethfrsasu')/2x)x

Вихід:

2019-03-09 00:00:00.000

Спробуй


0

Котлін , 131 84 байт

47 байт завдяки коду та коментарю лише для ASCII.

Вхід: рік, місяць число, тиждень день, число, тиждень число

Усі цілі числа від 1 до максимуму в одному рядку. Номер дня тижня - неділя з 1 по суботу 7. Основна програма змушує рік втратити 1900 для класу Date, а місяць і будній день зміщуються на нуль замість одного, перш ніж викликати лямбду. Ви можете ввести свої аргументи у вхідне текстове поле, щоб спробувати власні дати.

Вихід: екземпляр класу Дата. Основна програма відображає такий результат, як: Сб Березень 09 00:00:00 UTC 2019.

Існує розширена версія з коментарями, що пояснюють код для бажаючих дізнатися більше.

{y,m,d,w->val r=java.util.Date(y,m,7*w)
r.setDate(r.getDate()-(r.getDay()+7-d)%7)
r}

Спробуйте в Інтернеті!


1
74 - використовується той же метод, що і відповіді Скали та
лише для ASCII


1
Команда імпорту більше не потребує, тому це не проблема: P
лише ASCII
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.