Lấy ngày của ngày thứ n trong tuần trong một năm và tháng nhất định


17

Giới thiệu

Thông thường, mọi người gọi ngày là "Thứ Sáu thứ hai trong tháng 8 năm 2018" hoặc "Chủ nhật thứ tư của tháng 3 năm 2012". Nhưng thật khó để biết đó là ngày nào! Nhiệm vụ của bạn là viết một chương trình nhận được một năm, một tháng, một ngày trong tuần và một số nguyên và xuất ra ngày đó.

Thử thách

  • Đối với đầu vào, bạn sẽ nhận được một năm, một tháng, một ngày trong tuần và một con số.

  • Bạn có thể lấy đầu vào ở bất kỳ định dạng hợp lý nào, như sử dụng chuỗi cho ngày trong tuần hoặc sử dụng ngày trong tuần được lập chỉ mục bằng 0 hoặc thậm chí lấy năm và tháng trong một chuỗi. Hãy giải thích định dạng đầu vào của bạn trong câu trả lời của bạn, mặc dù.

  • Số nguyên cho bạn biết ngày nào trong tuần trong tháng cần nhắm mục tiêu sẽ là số nguyên từ 1-5. Số nguyên sẽ không bao giờ đề cập đến một ngày trong tuần không tồn tại (ví dụ: Thứ Sáu thứ năm của tháng 2 năm 2019, không tồn tại).

  • Năm sẽ luôn tích cực.

  • Đầu ra của bạn có thể ở bất kỳ định dạng hợp lý nào, bao gồm in ngày cuối cùng của bạn. Tuy nhiên, vui lòng giải thích định dạng đầu ra của bạn un câu trả lời của bạn.

  • Cung cấp năm và tháng trong đầu ra là tùy chọn. Ngoài ra, bạn có thể cho rằng ngày là hợp lệ.

Ví dụ đầu vào và đầu ra

Hãy xem xét đầu vào này, với định dạng được lấy trong năm dưới dạng số có 4 chữ số, tháng là số nguyên, ngày trong tuần dưới dạng chuỗi và số thứ tự dưới dạng số nguyên:

2019, 3, Thứ Bảy, 2
2019, 12, Chủ Nhật, 1
2019, 9 Thứ Bảy, 1

Đầu ra:

Ngày 9 tháng 3
ngày 1
tháng 9 ngày 7 tháng 9

Đây là , vì vậy câu trả lời ngắn nhất sẽ thắng.


1
Tôi nghĩ rằng tôi có thể sử dụng GNU date, nhưng thật thú vị, trình phân tích cú pháp có một ... diễn giải thú vị ở đây.
Doorknob

Số tuần có thể được lập chỉ mục 0?
Jo King

Chắc chắn, nếu nó phù hợp với chương trình của bạn
Hiện thân của sự thiếu hiểu biết

Trường hợp thử nghiệm được đề xuất: 2018, 12, Chủ nhật 1
Adám

Trường hợp thử nghiệm được đề xuất: Thứ Bảy đầu tiên vào tháng 9 năm 2019
Shaggy

Câu trả lời:


4

Mẫu MediaWiki, 19 byte

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

Đây là một cổng ParserFifts của MediaWiki Template của câu trả lời PHP này

Lưu ý: #timesử dụng PHP strtotimetrong nội bộ.


Đầu vào mẫu

{{#time: r | thứ hai thứ ba của tháng 3 năm 2019}}

Đầu ra mẫu

Thứ bảy, ngày 09 tháng 3 năm 2019 00:00:00 +0000


3

Japt, 19 15 byte

Đầu vào là: năm, chỉ số dựa trên 0 của tháng, chỉ số dựa trên 0 của ngày trong tuần ( 0là Chủ nhật) & n.

_XµW¶Ze}f@ÐUVYÄ

Thử nó

                    :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 # (Trình biên dịch tương tác Visual C #) , 59 byte

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

Hãy thử trực tuyến!

-27 byte nhờ @EmbodimentOfIgnorance!

Mã golf ít hơn ...

// 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

Giá trị trả về là một số nguyên cho ngày của tháng của ngày được yêu cầu.


Nếu bạn chỉ trả lại ngày trong tháng được phép, bạn có thể đánh gôn xuống còn 59 byte
Hiện thân của sự thờ ơ

Cảm ơn vì lời khuyên một lần nữa - (đó là gấp 2 ngày hôm nay;) Tôi sẽ cập nhật câu trả lời của mình.
dana

2

SmileBASIC, 58 51 48 46 45 byte

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

Đầu vào có dạng: week,year/month/weekday

  • week: số tuần, 0 chỉ mục
  • year: năm, 4 chữ số
  • month: Tháng (1-lập chỉ mục), 2 chữ số 0-padded
  • weekday: ngày trong tuần (1 chỉ mục, 1 = Chủ nhật), 2 chữ số được 0đệm

Đầu ra là ngày trong tháng, 0 được lập chỉ mục.
Thứ Bảy thứ 2 của tháng 3 năm 2019 sẽ là 1,2019/03/078(ngày 9 tháng 3)

Bị đánh cắp

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

Giải trình

Biểu mẫu đầu vào được chọn cụ thể để năm / tháng / ngày trong tuần có thể được chuyển trực tiếp đến DTREAD, đây là chức năng phân tích YYYY/MM/DDchuỗi và trả về năm / tháng / ngày dưới dạng số, cũng như tính ngày trong tuần.

Tuy nhiên, lưu ý rằng, nơi DTREADmong đợi ngày trong tháng, thay vào đó, chúng tôi sẽ cung cấp cho ngày đó trong tuần. Điều này làm phức tạp mọi thứ, nhưng cũng có nghĩa là có ít giá trị đầu vào hơn và chúng ta không cần thêm /01vào cuối chuỗi ngày.

DTREADđầu ra WD.
Wlà ngày trong tuần và Dlà ngày trong tuần của Wngày thứ trong tháng.
(Vì vậy, nếu bạn nhập vào 7là ngày trong tuần, Dsẽ 7Wsẽ là bất cứ ngày nào trong tuần vào ngày thứ 7 của tháng)

Biểu thức (5-W+D*2)MOD 7được sử dụng để có được lần xuất hiện đầu tiên của ngày trong tuần đầu vào, là ngày có chỉ số 0 trong tháng. (Tôi đã tìm ra điều này chủ yếu thông qua thử nghiệm và lỗi)

Sau đó, chương trình chỉ cần thêm WEEK*7.


Tôi thực sự muốn có những từ riêng biệt cho "ngày trong tuần" và "ngày trong tháng".


2

Perl 6 , 52 48 byte

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

Hãy thử trực tuyến!

Khối mã ẩn danh nhận đầu vào là năm, tháng, ngày trong tuần (Chủ nhật là 0) và số tuần (0 được lập chỉ mục). Đầu ra là một đối tượng ngày.

Giải thích cũ:

{                                                  } # 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

Tôi nghĩ rằng số tuần cần phải được lập chỉ mục 1
12Me21

@ 12Me21 Câu hỏi nói rằng đầu vào rất linh hoạt, nhưng tôi đã hỏi liệu chúng tôi có lấy số tuần là 0 được lập chỉ mục hay không
Jo King

Điều này dường như không hoạt động trong những tháng khác. Tôi nghĩ bạn cần $^c+4-$!.daycount.
nwellnhof

@nwellnhof Ah, tôi nên nghĩ về điều đó thay vì dùng thử và lỗi, lol. Nên sửa ngay bây giờ
Jo King

1

MATL , 28 27 byte

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

Điều này sử dụng ba đầu vào:

  • Chuỗi với tháng và năm: 'March 2019'
  • Chuỗi có ba chữ cái, viết hoa đầu tiên, biểu thị ngày trong tuần: ' Sat'
  • Số : 2.

Đầu ra là một chuỗi với ngày, năm và tháng được phân tách bằng dấu gạch ngang : 09-Mar-2019.

Hãy thử trực tuyến!

Giải trình

Xem xét đầu vào '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 byte

82 byte nhờ @Jo King

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

Hãy thử trực tuyến!

Phiên bản gốc, 92 byte

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

Hãy thử trực tuyến!

Lấy năm là số nguyên, tháng là số nguyên 1 chỉ số, ngày trong tuần là số nguyên 0 chỉ số trong đó Thứ Hai 0và Chủ Nhật là 6và tuần trong tháng dưới dạng số nguyên 1 chỉ số.

Làm thế nào nó hoạt động:

# 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 byte

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

Hãy thử trực tuyến!

Lấy đầu vào là:

  • Số năm
  • Số tháng (1-12)
  • Chuỗi ngày trong miền địa phương hiện tại (TIO yêu cầu tên tiếng Anh với chữ in hoa)
  • Số thường (1 chỉ mục)




0

Đỏ , 64 60 byte

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

Hãy thử trực tuyến!

Lấy năm, tháng và ngày trong tuần dưới dạng số, 1 chỉ mục, thứ Hai là ngày đầu tiên trong tuần.


huh, to-datelà một điều. có lẽ điều này sẽ hữu ích trong thử thách định dạng christmase eve
ASCII - chỉ

@ ASCII-only Chúng tôi đã sử dụng nowcho thử thách đó
Galen Ivanov

1
vâng, nhưng tôi đã nghĩ đến các phương pháp thay thế (cụ thể là phương pháp <lặp lại " Eve"date2-date1 lần> iirc)
ASCII - chỉ

@ Chỉ ASCII>> 25-Dec-2019 - 1-1-2019 == 358
Galen Ivanov

0

APL (Dyalog Unicode) , 36 byte SBCS

Chương trình đầy đủ. Lời nhắc cho [year,month](tháng 1 là 1), sau đó cho ngày (Chủ nhật là 0), sau đó cho n (đầu tiên là 1).

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

Hãy thử trực tuyến!

⎕CY'dfns'c o p y trong thư viện dfns

 loại bỏ kết quả của việc đó để ủng hộ

 bảng điều khiển nhắc nhở cho [year,month]số

days[c]  ngày [n] từ 1899/12/31 của 0 ngày của tháng đó

(⍳31)+ thêm i ntegers 1 Ván 31 vào đó

d← lưu trữ trong d(cho số d ay)

7| phần còn lại khi chia cho 7 (ngày trong tuần với Chủ nhật là 0 do kỷ nguyên tốt)

⎕= bảng điều khiển nhanh chóng cho số ngày trong tuần và nhận mặt nạ trong đó bằng với số ngày trong tuần

d/⍨ lọc dvới mặt nạ đó

⎕⊃ nhắc nhở bảng điều khiển cho n và sử dụng nó để chọn từ danh sách các số ngày

date[c]  tem datetime [n] (có các số 0 ở cuối giờ, phút, giây, mili giây)


Nhấp vào [c] cho mã và [n] để ghi chú.


0

JavaScript (ES6), 49 48 byte

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>

Lấy tham số là f([year, month], day, number). Tháng và ngày trong tuần (bắt đầu từ Chủ nhật) không có chỉ số. Chỉnh sửa: Đã lưu 1 byte nhờ @Shaggy.


Là ngày trong tuần theo định dạng Chủ nhật-Thứ bảy hoặc Thứ hai-Chủ nhật?
Hiện thân của sự thiếu hiểu biết

@EmbodimentofIgnorance Xin lỗi, tôi biết tôi đã quên một cái gì đó. (Đoạn mã bây giờ sử dụng chọn để làm cho nó dễ dàng hơn.)
Neil

@EmbodimentofIgnorance, Chủ nhật là 0trong JS.
Xù xì

Oh. Tôi không biết rằng, tôi không quen thuộc với Javascript.
Hiện thân của sự thiếu hiểu biết


0

TSQL, 106 byte

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

Đầu ra:

2019-03-09 00:00:00.000

Dùng thử


0

Kotlin , 131 84 byte

47 byte nhờ mã và nhận xét của ASCII.

Đầu vào: năm, tháng số, số ngày trong tuần, số tuần

Tất cả các số nguyên từ 1 đến tối đa trên một dòng. Số ngày trong tuần là Chủ nhật từ 1 đến Thứ Bảy của 7. Chương trình chính làm cho năm mất 1900 cho lớp Ngày và tháng và ngày trong tuần được chuyển sang bắt đầu bằng 0 thay vì một trước khi gọi lambda. Bạn có thể nhập đối số của mình vào hộp văn bản đầu vào để thử ngày của riêng bạn.

Đầu ra: một thể hiện của lớp Date. Chương trình chính hiển thị kết quả như sau: Sat Mar 09 00:00:00 UTC 2019.

Có một phiên bản mở rộng với các bình luận giải thích mã cho những người muốn tìm hiểu thêm.

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

Hãy thử trực tuyến!


1
74 - sử dụng phương pháp tương tự như câu trả lời của Scala và Groovy
ASCII - chỉ


1
Không cần lệnh nhập nữa nên đó không phải là vấn đề: P
ASCII - chỉ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.