รับวันที่วันที่สัปดาห์ในปีและเดือนที่กำหนด


17

บทนำ

บ่อยครั้งที่ผู้คนอ้างถึงวันที่ว่า "วันศุกร์ที่สองในเดือนสิงหาคม 2018" หรือ "วันอาทิตย์ที่สี่ในเดือนมีนาคม 2012" แต่มันยากที่จะบอกว่าวันนั้นคืออะไร! งานของคุณคือการเขียนโปรแกรมที่ได้รับปีเดือนวันของสัปดาห์และจำนวนเต็มและส่งออกวันที่

ท้าทาย

  • สำหรับการป้อนข้อมูลคุณจะได้รับปีเดือนวันของสัปดาห์และตัวเลข

  • คุณสามารถป้อนข้อมูลในรูปแบบที่เหมาะสมเช่นการใช้สตริงสำหรับวันของสัปดาห์หรือใช้วันธรรมดาที่มีการทำดัชนีเป็นศูนย์หรือแม้แต่ใช้ปีและเดือนในสตริงเดียว อธิบายรูปแบบการป้อนข้อมูลของคุณในคำตอบของคุณ

  • จำนวนเต็มที่บอกคุณว่าวันใดของสัปดาห์ในเดือนที่จะกำหนดเป้าหมายจะเป็นจำนวนเต็มตั้งแต่ 1-5 จำนวนเต็มจะไม่อ้างถึงวันในสัปดาห์ที่ไม่มีอยู่ (เช่นวันศุกร์ที่ห้าของเดือนกุมภาพันธ์ 2019 ซึ่งไม่มีอยู่)

  • ปีจะเป็นบวกเสมอ

  • ผลลัพธ์ของคุณอาจอยู่ในรูปแบบที่เหมาะสมรวมถึงการพิมพ์วันสุดท้ายของคุณ อย่างไรก็ตามโปรดอธิบายรูปแบบผลลัพธ์ของคุณด้วยคำตอบ

  • การระบุปีและเดือนในเอาต์พุตเป็นทางเลือก นอกจากนี้คุณอาจถือว่าวันที่ถูกต้อง

ตัวอย่างอินพุตและเอาต์พุต

พิจารณาอินพุตนี้โดยมีรูปแบบที่ใช้ในปีเป็นตัวเลข 4 หลักเดือนเป็นจำนวนเต็มวันของสัปดาห์เป็นสตริงและหมายเลขลำดับเป็นจำนวนเต็ม:

2019, 3, วันเสาร์, 2
2019, 12, วันอาทิตย์, 1
2019, 9 วันเสาร์, 1

เอาท์พุท:

9 มีนาคม
1 ธันวาคม
7 กันยายน

นี่คือคำตอบที่สั้นที่สุดจึงชนะ


1
ฉันคิดว่าฉันอาจจะสามารถใช้ GNU dateได้ แต่ที่น่าประหลาดใจตัวแยกวิเคราะห์มี ... การตีความที่น่าสนใจที่นี่
Doorknob

จำนวนสัปดาห์อาจถูกจัดทำดัชนี 0?
Jo King

แน่นอนถ้ามันเหมาะกับโปรแกรมของคุณ
ศูนย์รวมแห่งความไม่รู้

กรณีปัญหาการทดสอบ: 2018 12 อาทิตย์ 1
อดัม

กรณีทดสอบที่แนะนำ: วันเสาร์แรกของเดือนกันยายน 2019
Shaggy

คำตอบ:


4

เทมเพลต MediaWiki ขนาด 19 ไบต์

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

นี่คือพอร์ตตัวแยกวิเคราะห์เทมเพลต MediaWiki ของคำตอบ PHP นี้

หมายเหตุ: #timeใช้ PHPstrtotimeภายใน


ตัวอย่างอินพุต

{{#time: r | วันเสาร์ที่สองของเดือนมีนาคม 2019}}

ตัวอย่างผลลัพธ์

วันเสาร์ที่ 09 มีนาคม 2019 00:00:00 +0000


3

Japtap, 19 15 ไบต์

การป้อนข้อมูลเป็นปีที่ดัชนี 0-based ของเดือนดัชนี 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!

น้อยรหัส golfed ...

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

ค่าส่งคืนเป็นจำนวนเต็มสำหรับวันของเดือนของวันที่ร้องขอ


หากคุณส่งคืนเฉพาะวันที่คุณได้รับอนุญาตคุณสามารถตีกอล์ฟนี้ได้ถึง59 ไบต์
ศูนย์รวมแห่งความไม่รู้

ขอบคุณสำหรับเคล็ดลับอีกครั้ง - (วันนี้ 2x;) ฉันจะปรับปรุงคำตอบของฉัน
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
วันเสาร์ที่ 2 ของเดือนมีนาคม 2562 จะเป็น1,2019/03/078(วันที่ 9 มีนาคม)

Ungolfed

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 เป็นวันทำงานและเป็นวันแห่งสัปดาห์ของวันที่ของเดือน (ดังนั้นหากคุณป้อนเป็นวันธรรมดาจะเป็นและจะเป็นวันใดก็ตามในวันที่ 7 ของเดือน)D
WDW
7D7W

การแสดงออกที่(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 อ่าฉันควรจะคิดอย่างนั้นแทนการลองผิดลองถูก ควรได้รับการแก้ไขแล้ว
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สัปดาห์และสัปดาห์ของเดือนเป็นจำนวนเต็ม 1 ดัชนี

มันทำงานอย่างไร:

# 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 ไบต์ขอบคุณ Shaggy



นอกจากนี้ฉันไม่คิดว่าคุณต้องการofในการป้อนข้อมูล
Shaggy

@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สำหรับความท้าทายนั้น
Galen Ivanov

1
ใช่ แต่ฉันกำลังคิดวิธีการทางเลือก (กล่าวคือ <repeat " Eve"date2-date1 times> method iirc)
ASCII-only

@ ASCII เท่านั้น>> 25-Dec-2019 - 1-1-2019 == 358
Galen Ivanov

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 THของเดือนนั้น

(⍳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 ขออภัยฉันรู้ว่าฉันลืมอะไรบางอย่าง (ตอนนี้ตัวอย่างใช้การเลือกเพื่อทำให้ง่ายขึ้น)
Neil

@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

Kotlin , 131 84 ไบต์

47 ไบต์ต้องขอบคุณรหัสและความคิดเห็นของ ASCII-only

อินพุต: ปี, เดือน, จำนวนวัน, จำนวนสัปดาห์, จำนวน

จำนวนเต็มทั้งหมด 1 ถึงสูงสุดในบรรทัดเดียว หมายเลขวันในสัปดาห์คือวันอาทิตย์ที่ 1 ถึงวันเสาร์ที่ 7 โปรแกรมหลักทำให้ปี 1900 สูญเสียไปสำหรับคลาสวันที่และเดือนและวันทำงานจะเปลี่ยนเป็นเริ่มต้นด้วยศูนย์แทนที่จะเป็นหนึ่งก่อนที่จะเรียกแลมบ์ดา คุณสามารถป้อนข้อโต้แย้งของคุณในกล่องข้อความป้อนข้อมูลเพื่อลองวันที่ของคุณเอง

เอาต์พุต: อินสแตนซ์ของคลาส Date โปรแกรมหลักแสดงผลลัพธ์ดังนี้: Sat Mar 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 - ใช้วิธีการเดียวกันกับคำตอบ Scala และ Groovy
เท่านั้น


1
ไม่จำเป็นต้องใช้คำสั่งการนำเข้าอีกต่อไปดังนั้นจึงไม่ใช่ปัญหา: P
เท่านั้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.