กี่สัปดาห์


13

งานของคุณคือการส่งออกจำนวนเดียว จำนวน ISO สัปดาห์ที่ช่วงวันที่กำหนดตัดกัน เพื่ออ้างถึง Wikipedia: An average year is exactly 52.1775 weeks longแต่นี่ไม่เกี่ยวกับค่าเฉลี่ย

ข้อมูลที่ป้อนประกอบด้วยวันที่ ISO สองช่องว่างแยกกัน:

0047-12-24 2013-06-01

วันที่สิ้นสุดไม่เคยมาก่อนวันที่เริ่มต้น เราจะใช้ปฏิทินเกรกอเรียนที่ประมาณการณ์เพื่อความเรียบง่าย

กรณีทดสอบ:

Format: input -> output
2015-12-31 2016-01-01 -> 1    (both are within week 53 of 2015)
2016-01-03 2016-01-04 -> 2    (the 3rd is within week 53, and the 4th is in week 1)
2015-12-24 2015-12-24 -> 1    (this single day is of course within a single week)

วิธีการแก้ปัญหาของคุณควรจะจัดการกับวันที่ระหว่างและ0001-01-019999-12-31


2
อินพุตสามารถเป็นอาร์เรย์ของสตริงแทนที่จะเป็นสตริงที่คั่นด้วยช่องว่างเดียวได้หรือไม่? อีกทางเลือกสองวันที่สามารถเป็นสองข้อโต้แย้งกับฟังก์ชั่น?
ลูกบิดประตู

ฉันถือว่าคุณหมายถึงปฏิทินเกรกอเรียนที่มีความสามารถพิเศษ
Brad Gilbert b2gills

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

@Doorknob 冰ใบเสนอราคา Wikipedia: "วันที่ระบุโดยปีที่หมายเลขสัปดาห์ของ ISO ในรูปแบบ YYYY หมายเลขสัปดาห์ในรูปแบบ ww นำหน้าด้วยตัวอักษร 'W' และหมายเลขวันทำงานเป็นตัวเลข d จาก 1 ถึง 7 เริ่มต้นด้วยวันจันทร์และลงท้ายด้วยวันอาทิตย์ "ดังนั้นเริ่มต้นในวันจันทร์ตาม ISO 8601
Tensibai

2
ตามมาตรฐาน ISOWeeks start with Monday.
Filip Haglund

คำตอบ:


2

Ruby, 89 88 86 ไบต์

->s{a,b=s.split.map{|x|Time.gm *x.split(?-)}
n=1
(a+=86400).wday==1&&n+=1until a==b
n}

วิธีการแก้ปัญหาดั้งเดิมมาก: รับวันแรกaและวันที่สองb, เพิ่มaการตรวจสอบถ้าเป็นวันจันทร์ (ถ้าเป็นเช่นนั้นเราได้ "รีดกว่า" เพื่อสัปดาห์ใหม่) และหยุดเมื่อมีab

รับอินพุตในรูปแบบที่แน่นอนที่ระบุในคำถาม: สตริงที่คั่นด้วยช่องว่างเดียว (วิธีแยกวิเคราะห์อินพุตเป็น fancy-ish: ใช้ตัวดำเนินการ "เครื่องหมาย" ของรูบี้ผู้ดำเนินการ*นี้ "ขยาย" อาร์เรย์หรือนับจำนวนออกดังนั้นTime.gm *[2013, 06, 01]จะกลายเป็นTime.gm 2013, 06, 01)

นำเข้าจากการสนทนาความคิดเห็น:

เราไม่สนใจเกี่ยวกับ "สัปดาห์ในหนึ่งปี" เราสนใจเฉพาะเรื่อง "สัปดาห์โดยรวม" ดังนั้นไม่ว่าปีจะมี 52 หรือ 53 สัปดาห์ก็ไม่ได้สร้างความแตกต่าง

เพียงเพื่อหลีกเลี่ยงความสับสนในอนาคตว่าจะจัดการกับขอบเขตของปีได้อย่างถูกต้องหรือไม่ - ตามที่ Wikipediaทุกสัปดาห์เริ่มต้นในวันจันทร์และสิ้นสุดในวันอาทิตย์

สำหรับเทคนิคแฟนซีบางอย่างสิ่งเหล่านี้เทียบเท่ากันทั้งหมด:

until a==b;a+=86400;n+=a.wday==1?1:0;end
[a+=86400,n+=a.wday==1?1:0]until a==b
n+=(a+=86400).wday==1?1:0 until a==b
(a+=86400).wday==1&&n+=1 until a==b
(a+=86400).wday==1&&n+=1until a==b

คุณไม่สามารถบันทึกการแทนที่ 1 อักขระa==bด้วยa<bหรือไม่
Tensibai

1

VBA, 125 ไบต์

ต้องการฟังก์ชัน 2 อินพุตเป็นสตริง

Function u(k,j)
f=DateValue(k)
For i=0 To (DateValue(j)-f)
q=DatePart("ww",f+i,2,2)
If q<>j Then u=u+1
j=q
Next
End Function

ค่อนข้างแน่ใจว่านี้สามารถ golfed นี่คือการวนซ้ำแม้ว่าทุกวันระหว่าง 2 วันที่และเพิ่มตัวนับทุกครั้งที่มีการเปลี่ยนแปลงวันที่ ISO

DatePart("ww",f+i,2,2)คือหมายเลข ISO สัปดาห์ใน VBA 2 วิธีMonday (complies with ISO standard 8601, section 3.17)แรก จากนั้นสองหมายความว่าWeek that has at least four days in the new year (complies with ISO standard 8601, section 3.17)

140 ไบต์ w / อินพุตเดี่ยว

Function g(k)
y=Split(k)
f=DateValue(y(0))
For i=0 To (DateValue(y(1))-f)
q=DatePart("ww",f+i,2,2)
If q<>j Then g=g+1
j=q
Next
End Function

1

R, 76 ไบต์

d=as.Date(scan("","raw"));sum(strftime(seq(d[1],d[2],"day")[-1],"%w")==1)+1

หลังจากคุยกับ @Doorknob ในที่สุดมันก็ง่ายพอ ๆ กับการนับวันจันทร์

seq อนุญาตให้สร้างเวกเตอร์วันที่ (ในแต่ละวันระหว่างสองวัน) และ strftime เปลี่ยนเป็น 'จำนวนวันในสัปดาห์' ตอนนี้นับเวลาที่ 1 เพื่อรับจำนวนเวลาที่คุณเปลี่ยนสัปดาห์และเพิ่ม 1 เป็น พิจารณาในสัปดาห์ก่อนหน้า

อีกวิธีการวนลูป:

R, 85 ไบต์

n=1;d=as.Date(scan("","raw"));z=d[1];while(z<d[2]){n=n+(strftime(z<-z+1,"%w")==1)};n

1
เกี่ยวกับวิธีที่สองของคุณคุณควรเพิ่ม 1 ลงในจำนวนวันจันทร์ทั้งหมดหากวันแรกไม่ตรงกับวันจันทร์
DavidC

@DavidCarraher ขอบคุณอ่านคำตอบของคุณทำให้ฉันคิดว่าฉันจะเอาวันแรกของช่วงจึงแก้ไขปัญหา :)
Tensibai

0

Mathematica 135 79 96 84 74 ไบต์

สอดคล้องกับข้อเสนอแนะของ @ Doorknob สิ่งนี้

  • สร้างวันที่ทั้งหมดในช่วง

  • นับจำนวนวันจันทร์ ( ISOWeekDay== "1") ในDateRange(ยกเว้นd) และ

  • เพิ่ม1ไปยังผลรวม


Count[DateString[#,"ISOWeekDay"]&/@Rest@(DateRange@@StringSplit@#),"1"]+1&

Count[DateString[#,"ISOWeekDay"]&/@Rest@(DateRange@@StringSplit@#),"1"]+1&
/@ {"2015-12-31 2016-01-01", "2016-01-04 2016-01-05","2016-01-03 2016-01-04", 
"2015-12-24 2015-12-24", "1876-12-24 2016-01-01"}

{1, 1, 2, 1, 7255}

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