ค้นหาวันอาทิตย์สุดท้ายของทุกเดือนของปีที่กำหนด


21

วิธีแก้ปัญหา F # ที่รู้จักกันใน 140 ตัวอักษรและนี่คือปัญหารหัส Rosetta

ผลลัพธ์ที่ต้องการใน stdout หรือตัวแปรสตริงสำหรับปีอินพุต2014:

2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28

ตามที่ได้รับการร้องขอสำหรับ 1900:

1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30

และ 2,000:

2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31

ถูกวางเนื่องจากวันที่ดูเหมือนจะทำให้เกิดความอึดอัดใจในภาษาส่วนใหญ่ มากกว่าการอนุญาตห้องสมุดวันที่ฉันหวังว่าจะเห็นพวกเขา! แต่ถ้าอยู่นอกภาษาหลักให้ประกาศในชื่อโพสต์ (เช่น C # + NodaTime ของ Jon Skeet)

ชี้แจง:

  • ช่วงปี 1900 ถึง 3015
  • ปฏิทินเกรกอเรียน
  • หากเป็นเช่นนั้นสิ่งใดก็ตามที่เป็นเรื่องปกติสำหรับอังกฤษ / ลอนดอน
  • โปรแกรมที่ใช้ commandline switch หรือ stdin นั้นใช้ได้ผลเป็น stdout
  • ฟังก์ชั่นรับค่าสำหรับปีและการส่งคืนสตริงก็เป็นเรื่องปกติ

ช่องโหว่มาตรฐานได้รับการยกเว้น รอคอยการแก้ปัญหา APL, J, K และดูห้องสมุดใหม่ ๆ


@ Sp3000 - 1752 อาจจะน่าอึดอัดใจโดยเฉพาะ :-)
squeamish ossifrage

@ MartinBüttner: โปรดใช้ห้องสมุดวันที่ได้แก้ไขคำถามเพื่อขอให้ผู้คนประกาศสิ่งที่พวกเขาใช้ด้วยภาษา
Phil H

1
คุณควรระบุช่วงปีซึ่งเป็นข้อมูลที่ถูกต้องและสิ่งที่ต้องพิจารณาเกี่ยวกับการใช้เกรโก (นั่นคือถ้าช่วงของปีรวมถึงช่วงก่อนปี 1930 คุณควรระบุว่าควรใช้ปฏิทินเกรโกเรียนสำหรับช่วงทั้งหมดโดยไม่คำนึงถึงสถานที่หรือว่าผลลัพธ์อาจแตกต่างกันไปตามสถานที่หรือคุณควรให้วันที่ตัดออกก่อน ควรใช้ปฏิทิน Julian และกรณีทดสอบเป็นเวลาสามปีรอบการเปลี่ยนแปลง)
Peter Taylor

1
@squeamishossifrage: ฉันได้ จำกัด ไว้ที่ 1900 และ Gregorian เพราะฉันค่อนข้างจะหลีกเลี่ยงโครงการวิจัยเพื่อสร้างสเป็ค ...
Phil H

1
@ Adám: ขอโทษที่ทำให้คุณรอนานในการตอบกลับ :) ใช่แน่นอน
Phil H

คำตอบ:


1

Dyalog APL ที่มีcal จากdfns ขนาด 19 ไบต์

มาสายดีกว่าไม่มาเลย!

แจ้งให้ปีส่งคืนรายการวันที่ในรูปแบบyyyy md

⎕{⍺⍵,2↑⊢⌿cal⍺⍵}¨⍳12

แจ้งให้ใส่ตัวเลขและปล่อยให้เป็นอาร์กิวเมนต์ซ้ายไปที่

{... ฟังก์ชั่นไม่ระบุชื่อ (พบด้านล่าง) นำไปใช้กับแต่ละ

⍳12 ตัวเลขตั้งแต่ 1 ถึง 12 (เดือน)

ฟังก์ชั่นที่ไม่ระบุชื่อข้างต้นมีดังนี้:

⍺⍵, เพิ่มอาร์กิวเมนต์ด้านซ้ายและขวา (เช่นปีและเดือน) ไปที่

2↑ อักขระสองตัวแรกของ

⊢⌿ แถวล่างสุดของ

cal ปฏิทินสำหรับ

⍺⍵ อาร์กิวเมนต์ซ้ายและอาร์กิวเมนต์ขวา (ปีและเดือน)

TryAPL ออนไลน์:

  1. กลับมาที่หน้านี้หลังจากคลิกที่นี่เพื่อนำเข้าcalและการอ้างอิง

  2. คลิกที่นี่เพื่อเรียกใช้กรณีทดสอบ


ดีมาก. หวังว่าจะได้ห้องสมุด APL ที่เข้าใจความหมายของวันที่ แต่ cal เหมาะสม!
Phil H


1
@PhilH นอกจากนี้ยังมีเนมสเปซวันที่จาก MiServer
อดัม

1
@PhilH และ Dyalog APL เป็นพื้นฐาน dyadic + - < = และทำงานร่วมกับสุทธิวันที่วัตถุ
อดัม

7

ทับทิม, 91 + 6 = 97

#!ruby -prdate
$_=(Date.new(y=$_.to_i)...Date.new(y+1)).select(&:sunday?).chunk(&:mon).map{|k,v|v[-1]}*' '

ทำงานออกมาได้ค่อนข้างดี การจัดรูปแบบทั้งหมดselect(&:sunday?)นั้นน่ารักและน่าประหลาดใจ*' '


เทคนิคที่ดี! คุณสามารถบันทึกสามตัวอักษรมากขึ้นโดยใช้แทนchunk group_by
Cristian Lupascu

ดังนั้นฉันทำได้ดี
ฮิสโทแกต

6

Bash 4.x + ncal, 57

หากตัวแบ่งบรรทัดใหม่เป็น OK แทนช่องว่างเราสามารถนำ-nสวิตช์และช่องว่างต่อท้ายออกจากechoคำสั่งได้ และฉันคิดว่ามันจะยังคงทำงานได้โดยไม่ต้องมี shebang ดังนั้นฉันจึงลบสิ่งนั้นด้วย:

for i in {01..12};{ echo "$1-$i-`ncal $i $1|tail -c-3`";}

สคริปต์ดั้งเดิม (73 ไบต์):

#!/bin/bash
for i in {01..12};{ echo -n "$1-$i-`ncal $i $1|tail -c-3` ";}

การใช้งาน:

$ bash sundays.sh 2014
2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-31
2014-09-28
2014-10-26
2014-11-30
2014-12-28
$

หมายเหตุ:เวอร์ชัน Bash ก่อนหน้า 4.0 จะตัดเลขศูนย์นำออกจากเดือน นี้สามารถแก้ไขได้ด้วยนอกเหนือจาก 5 ตัวอักษรโดยการเปลี่ยนไป{01..12} `seq -w 1 12)`นอกจากนี้tail -c-3อาจทำให้เกิดปัญหาในบางระบบที่ผลลัพธ์ของการncalรวมช่องว่างต่อท้าย แต่ฉันไม่ทราบว่าจะทำอย่างไร


1
ความแตกต่างเกี่ยวข้องกับดาร์วินจริงๆไม่ใช่เฉพาะรุ่น Bash ใช่ไหม ถูกเพิ่มใน Bash 4.0 (แม้ว่าจะมีข้อบกพร่องอยู่บ้างในภายหลัง) อย่างไรก็ตาม 1 ตัวละครยังคงสามารถงดเว้นโดยใช้แทนนิสัยที่ดี`…` $(…)
จัดการ

อาจะเป็น ดาร์วินบอกว่าใช้เวอร์ชั่น 3.2.53 Debian ใช้ 4.1.5
ossifrage คลื่นไส้

@Manatwork PS เพิ่งสังเกตเห็นความคิดเห็นของคุณเกี่ยวกับเห็บหลัง เยี่ยมมากขอบคุณ!
ossifrage คลื่นไส้

ฉันไม่คิดว่าคุณจะต้องนับ#!/bin/bashเพื่อจุดประสงค์ในการเล่นกอล์ฟ
บาดเจ็บทางดิจิทัล

@ DigitalTrauma นั่นเป็นเรื่องดี ดูเหมือนว่าฉันสามารถใช้ตัวแบ่งบรรทัดแทนการเว้นวรรคได้เช่นกัน ลงไปที่ 57 ไบต์ในขณะนี้ :-)
squeamish ossifrage

6

IBM DFSORT, 11 3 บรรทัดของ 71, 72 หรือ 80 ตัวอักษร

 OPTION COPY 
 OUTFIL REPEAT=12,OVERLAY=(5:SEQNUM,2,ZD,5,2,1,8,Y4T,LASTDAYM,TOJUL=Y4T*
 ,9,7,Y4T,ADDDAYS,+1,TOJUL=Y4T,1:16,7,Y4T,PREVDSUN,TOGREG=Y4T(-),12X) 

คำตอบสองคำตอบที่มีรูปแบบเอาต์พุตแบบเสามีการทดสอบตามเวลา ที่ให้ฉัน "ห่วง" เรียงลำดับของที่ใน OUTFIL REPEAT = คัดลอกระเบียนปัจจุบันที่หลายต่อหลายครั้ง

เทคนิคที่แตกต่างกันที่จะได้รับค่าซึ่งดูเหมือนว่าอีกต่อไป แต่จะสั้นที่สุดเท่าที่ฉันไม่สามารถทำงานออกวิธีที่ไม่มีเงื่อนไขใด ๆ ในการจัดการกับบันทึกที่ 12 อยู่ในปีต่อไปและทำให้มันเป็นวิธีการเงื่อนไขรวมถึงIFTHEN=(WHEN=สองครั้งและบางสิ่งอื่น ๆ กำไรจากการชิงช้า (ครั้งแรกของเดือนเป็นวิธีที่ง่ายที่สุดในการทำ) แพ้อย่างหนักในวงเวียน (ข้อกำหนดด้านไวยากรณ์โดยเฉพาะ)

ใช้ฟังก์ชัน inbuilt (ฟังก์ชันทั้งหมดใน DFSORT เป็น inbuilt) เพื่อค้นหาวันสุดท้ายของเดือน จากนั้นเพิ่มหนึ่งวัน (ฟังก์ชัน) เพื่อไปยังเดือนแรกของเดือนถัดไปและใช้ฟังก์ชัน PREVDSUN เพื่อรับวันอาทิตย์ก่อนหน้า (ซึ่งจะเป็นวันอาทิตย์สุดท้ายของเดือนก่อนหน้าเสมอเหมือนก่อน)

เมื่อเปลี่ยนปี (อินพุท) เป็นวันที่ที่ถูกต้องจะใช้หมายเลขลำดับสองหลักสำหรับเดือนและค่านั้นจะถูกคัดลอกสำหรับวันเช่นกันเนื่องจากจุดเริ่มต้นไม่สำคัญตราบเท่าที่ถูกต้องตามที่เราเป็น หลังจากวันสุดท้ายของเดือนแรก: จะสั้นกว่า5,2C'01'

นี่คือรายละเอียด:

OPTION COPY - คัดลอกไฟล์อินพุตไปยังเอาต์พุต

OUTFIL - เพื่อให้ไฟล์เอาต์พุตหลายไฟล์ที่มีการเลือกและการจัดรูปแบบต่างกันสร้างรายงานที่จัดรูปแบบ ที่ใช้ในการตั้งค่าให้สั้นลงเนื่องจากการใช้งานของINRECREPEAT=

REPEAT = 12 - สร้างสำเนาของแต่ละระเบียน 12 ชุด ในตัวอย่างนี้สามารถมีได้เพียงหนึ่งระเบียนอินพุต (ไม่เหมือนกับเวอร์ชันก่อนหน้า) เนื่องจาก SEQNUM

5: - เริ่มที่คอลัมน์ 5 ในบันทึก

SEQNUM, 2, ZD - หมายเลขลำดับค่าเริ่มต้นที่เริ่มต้นที่หนึ่งสองหลัก "zoned ทศนิยม" (สำหรับเครื่องหมายที่ไม่ได้ลงนามซึ่งพวกเขาจะเป็นเช่นเดียวกับตัวละคร)

1,8 - คัดลอกไบต์ 1 สำหรับความยาว 8 ถึงตำแหน่งปัจจุบัน (9) นี่เป็นเพราะ Y4T จำเป็นต้องดูว่า 8 มิฉะนั้นจะใช้รูปแบบวันที่อื่น

Y4T - วันที่จัดรูปแบบ ccyymmdd (เนื่องจาก 8 อยู่ข้างหน้าทันที)

LASTDAYM - วันสุดท้ายของเดือน (อาจเป็นไปได้ของสัปดาห์ไตรมาสและปี)

TOJUL = - การแปลงวันที่เอาท์พุทสำหรับฟังก์ชั่นวันที่ (TOJUL คือหนึ่งตัวอักษรที่น้อยกว่า TOGREG)

9,7 - ตอนนี้มันยาว 7 แล้ว Y4T ก็จะเป็น CCYYDDD

เพิ่มวัน - เพิ่มจำนวนวันปรับโดยอัตโนมัติหากเข้าสู่เดือน / ปีถัดไป (อาจเป็น ADDMONS และ ADDYEARS)

PREVDSUN - วันที่จูเลียนเข้ามาวันอาทิตย์ก่อนหน้าตั้งอยู่ TOGREG เพื่อรับรูปแบบเอาต์พุตที่ถูกต้องโดยใช้ตัวคั่น "-" (อาจเป็นสิ่งที่คุณต้องการเป็นตัวคั่น)

12X - ช่องว่างเพื่อกำจัดสิ่งที่ทำให้เราทำอย่างนั้น

ผลลัพธ์จากด้านบนสำหรับปี 2014 คือ:

2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-31
2014-09-28
2014-10-26
2014-11-23
2014-12-28

บางสิ่งจำเป็นต้องบอกให้ SORT รู้ว่าต้องทำ ไม่มีค่าเริ่มต้น OPTION COPYสั้นที่สุดSORT FIELDS=COPYเทียบเท่า แต่ยาวกว่า

การทำงานของตัวเองมันเสร็จในเวลานี้OUTFIL(เพื่ออนุญาตการใช้งานซ้ำ) รหัสการทำงานเป็นเนื้อหาใด ๆ ของ 160 (2 * 80), 144 (2 * 72), 140 (72 + 69) หรือ 138 (70 + 68) (ไม่รวมช่องว่างนำหน้าการบังคับต่อเนื่องและช่องว่างต่อท้าย)

ระบุว่าผู้รับจะต้องรู้ว่าสิ่งที่พวกเขากำลังทำฉันคิดว่าฉันสามารถพูดได้ว่ารหัส DFSORT เพื่อแสดงรายการวันอาทิตย์สุดท้ายของแต่ละเดือนสำหรับปีใด ๆ จาก 1900 (จะทำงานจากปี 0001 แต่ฉันหลีกเลี่ยงการวิจัยเป็น ดี) มากถึง 9999 (แม้ว่า DFSORT จะรองรับปีที่สูงถึง 9999 แต่โซลูชันก่อนหน้านี้จะไม่ทำงานในปี 9999 เนื่องจากวันที่ 12 เข้าสู่ปีถัดไป) สามารถเป็นทวีตได้

ทำไมรหัสถึงยาวถ้ามีฟังก์ชั่น inbuilt-apt โดยเฉพาะ?

คำจำกัดความของฟิลด์เป็นชั่วคราว เขตข้อมูลถูกกำหนดเป็นสถานที่เฉพาะภายในข้อมูล (ซึ่งเป็นบันทึก) สำหรับการใช้งานทันที เพื่อให้เป็นอีกวิธีหนึ่งฟิลด์ไม่ได้ถูกกำหนดเช่นนั้น แต่ถูกกำหนดไว้สำหรับการใช้งานแต่ละครั้งและเพื่อการใช้งานเท่านั้น ฟังก์ชั่นวันที่จำเป็นต้องรู้ว่าจะใช้รูปแบบวันที่ (ของหลายรายการ) สำหรับแหล่งที่มาและเอาท์พุทจะต้องอยู่ในรูปแบบวันที่ดังนั้นจะต้องมีการระบุ

ตอนนี้เรามีวันที่จูเลียน .... TBC?


 OPTION COPY 
 INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8*
 ,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4,14:C'3',22:C'4',30:C'5',38:C'6',*
 46:C'7',54:C'8',62:C'9',69:C'10',77:C'11',85:C'12',127:X,89,8,Y4T,PREV*
 DSUN,TOGREG=Y4T(-),116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-),105:X,73,8,Y4*
 T,PREVDSUN,TOGREG=Y4T(-),94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-),83:X,57,*
 8,Y4T,PREVDSUN,TOGREG=Y4T(-),72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-),61:X*
 ,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-),50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-),*
 39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-),28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T*
 (-),17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-),1:1,8,Y4T,PREVDSUN,TOGREG=Y4T*
 (-),11:X,18,120,6X) 

ต้องการบ้าง JCL

//LASTSUNG EXEC PGM=SORT 
//SYSOUT   DD SYSOUT=* 
//SORTOUT  DD SYSOUT=* 
//SYSIN    DD * 

และไฟล์อินพุต (บรรทัดอื่นของ JCL และรายการสตรีมข้อมูลสามรายการ):

//SORTIN DD *
2014 
1900 
2000 

ผลิต:

2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28
1900-01-28 1900-02-25 1900-03-25 1900-04-29 1900-05-27 1900-06-24 1900-07-29 1900-08-26 1900-09-30 1900-10-28 1900-11-25 1900-12-30
2000-01-30 2000-02-27 2000-03-26 2000-04-30 2000-05-28 2000-06-25 2000-07-30 2000-08-27 2000-09-24 2000-10-29 2000-11-26 2000-12-31

จะทำงานได้จริงถึงปี 9999

DFSORT เป็นผลิตภัณฑ์เรียงลำดับเมนเฟรมของ IBM ข้อมูลสามารถจัดการได้ แต่เนื่องจากการเรียงลำดับเป็นกุญแจสำคัญและมักจะมีขนาดใหญ่และยาวการ์ดควบคุม DFSORT จึงไม่มีโครงสร้างวนลูปดังนั้นเราจึงไม่สามารถใส่ SORT เข้าไปในลูปได้ ทำให้สิ่งต่าง ๆ ยืดเยื้อไปนานสำหรับงานต่างๆเช่นกอล์ฟ

ทำไมต้องโพสต์คำตอบเป็นเพราะ DFSORT มีPREVDdayฟังก์ชั่น ดังนั้นวันอาทิตย์สุดท้ายของเดือนจึงเป็นเรื่องง่าย เป็นวันอาทิตย์ก่อนหน้า (PREVDSUN) ถึงวันแรกของเดือนถัดไป

นอกจากนี้ยังสนุกที่จะทำมันภายในหนึ่ง "ตัวถูกดำเนินการ" (OVERLAY) บิตเช่นทำมันทั้งหมดภายในsprintfหรือคล้ายกัน

นี่มัน ungolfed:

 OPTION COPY 

 INREC OVERLAY=(1,4,C'0201',1,8,1,8,1,8,1,8,1,8,1,8, 
         1,8,1,8,1,8,1,8, 
         1,8,94:C'1',89:1,4,ZD,ADD,+1,ZD,LENGTH=4, 
         14:C'3',22:C'4',30:C'5',38:C'6',46:C'7',54:C'8',
         62:C'9',69:C'10',77:C'11',85:C'12', 
        127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
        116:X,81,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
        105:X,73,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         94:X,65,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         83:X,57,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         72:X,49,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         61:X,41,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         50:X,33,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         39:X,25,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         28:X,17,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         17:X,09,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
          1:1,8,Y4T,PREVDSUN,TOGREG=Y4T(-), 
         11:X,18,120,6X) 

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

INREC จะถูกประมวลผลสำหรับแต่ละระเบียน

OVERLAY อนุญาตให้มีการเปลี่ยนแปลงเนื้อหาของระเบียนที่มีอยู่ หากมีการขยายเรกคอร์ดเกินความยาวในกระบวนการนั่นไม่ใช่ปัญหา

1,4 คือปีที่เข้ามามันมีตัวอักษรอยู่ที่ 0201 ต่อท้ายจากนั้น 1,8s ต่อเนื่องทำซ้ำ 11 ครั้งเพื่อให้ชัคยาว 96 ไบต์

ปีที่ 12 ในบันทึกปัจจุบันที่ขยายเพิ่มได้รับ 1 เพิ่มและเดือนที่ทำกับ 1 (มกราคม)

ส่วนที่เหลืออีก 10 เดือนจะเปลี่ยนเป็น 3 ถึง 11

จากนั้นมี 12 ตามลำดับย้อนกลับ (เนื่องจาก OVERLAY) ของสิ่งประเภทนี้:

127:X,89,8,Y4T,PREVDSUN,TOGREG=Y4T(-),

n: คือหมายเลขคอลัมน์ในบันทึก X แทรกว่างเปล่า 89,8 ใช้ข้อมูลจากคอลัมน์ / ความยาว Y4T ถือว่าเป็นวันที่ CCYYMMDD, PREVDSUM ทำงานเมื่อวันอาทิตย์ที่ผ่านมา TOGREG = Y4T (-) ส่งออกเป็นวันที่แบบคริสต์ศักราช CCYY-MM-DD

เนื่องจากคุณได้รับขยะหากแหล่งที่มาและเป้าหมายของส่วนเฉพาะของ OVERLAY ทับซ้อนกันอย่างทำลายล้างการ11:X,18,120,6X)จัดเรียงใหม่และปิดบังความยุ่งเหยิงเล็กน้อย

คู่มือและเอกสารสามารถดูได้ที่: http://www-01.ibm.com/support/docview.wss?uid=isg3T7000080และมีคู่มือการเขียนโปรแกรม DFSORT แอปพลิเคชัน 900+ หน้า

เช่นเดียวกับผลิตภัณฑ์ทั้งหมดของ IBM มีคู่มือให้ใช้ฟรี (ยกเว้นของที่มีราคาแพงมาก ๆ ซึ่งมีเพียงไม่กี่คนเท่านั้นที่ยังมีคนทั่วโลกที่แสร้งทำเป็นเข้าใจ)

การ์ดควบคุม DFSORT ทั้งหมดจะต้องเริ่มต้นด้วยช่องว่าง คอลัมน์ 72 ใช้สำหรับการดำเนินการต่อไปเท่านั้น (ไม่ใช่ที่ว่างเปล่าใด ๆ ที่จะทำ แต่ * เป็นแบบเดิม) คอลัมน์ 72 ตามด้วยพื้นที่หมายเลขลำดับซึ่งถูกละเว้นทำให้แต่ละระเบียน 80 ไบต์

อีกสองวิธีที่จะมาอาจจะ


5

Bash, 63 ไบต์

for i in {01..12};{  date -v30d -v${i}m  -v2014y  -vsun +%Y-%m-%d;}

เอาท์พุท:

2014-01-26
2014-02-23
2014-03-30
2014-04-27
2014-05-25
2014-06-29
2014-07-27
2014-08-24
2014-09-28
2014-10-26 
2014-11-30
2014-12-28

for i in {1..12};{ date -v30d -v${i}m -v$1y -v0w +%Y-%m-%d;}- 60 bytes
Digital Trauma

-vพารามิเตอร์ที่dateเฉพาะเจาะจงกับวันที่ BSD ดังนั้นจึงใช้งานได้กับ OSX แต่ไม่ใช่บน Linux ส่วนใหญ่ - อาจจะระบุไว้ในคำตอบ
บาดเจ็บทางดิจิทัล

@DigitalTrauma ทำงานบน mac และ Linux ของฉัน
michael501

4

Python 2 - 189 ไบต์

y=input()
for m in range(12):
 d=[31-(1322>>m&1),28+(y%400<1or 1>y%4<y%100)][m==1];Y=y-(m<2);Z=Y%100;C=Y/100
 while(d+13*((m-2)%12+4)/5+Z+Z/4+C/4-2*C)%7-1:d-=1
 print"%d-%02d-%d"%(y,m+1,d),

ป้อนวันที่ผ่าน STDIN

ยังมีสนามกอล์ฟอีกมากที่สามารถทำได้ โปรแกรมลงน้ำเล็กน้อยเพื่อความสนุกสนาน:

  • ไม่มีการนำเข้าโดยเฉพาะอย่างยิ่งไม่ได้ใช้ฟังก์ชั่นวันที่ในตัว
  • ใช้ความสอดคล้องของ Zeller ในการคำนวณวันในสัปดาห์

หมายเหตุ

  • 1,322 เป็นตารางการค้นหามายากลสำหรับการตรวจสอบว่าเดือนที่ไม่กุมภาพันธ์มี 30 หรือ 31 วัน
  • ไม่zfillจำเป็นสำหรับปีเนื่องจากช่วงอินพุทหรือวันที่มันจะมากกว่า 20

Python 2 - 106 ไบต์

ทางออกที่ไม่สนุก:

from calendar import*
y=input();m=1
while m<13:w,n=monthrange(y,m);print"%d-%02d-%d"%(y,m,n-(n+w)%7),;m+=1

calendar.monthrangeส่งกลับตัวเลขสองตัว: วันธรรมดาของเดือนเริ่มต้นที่ ( w) และจำนวนวันในเดือน ( n) วิธีการแก้ปัญหานั้นค่อนข้างง่ายเนื่องจากมีการจับ - วันทำงานเริ่มต้นที่ 0 สำหรับวันจันทร์ไม่ใช่วันอาทิตย์! อย่างไรก็ตามสิ่งนี้ถูกชดเชยด้วยความจริงที่nเป็นแบบ 1


1
คำตอบ$from calendar import monthrange as gt$V12AGH>QhN%"%d-%02d-%d"(QhN-H%+GH7
Pyth ที่

3

JavaScript (ES6) 155 145

แก้ไขปัญหาเขตเวลาคงที่อาจสั้นกว่านี้หากทำซ้ำ อาจจะ.

F=y=>{
  for(n=i=o=[];!o[11];)
    d=new Date(Date.UTC(y,0,++i)),m=d.getMonth(),
    d.getDay()||(m!=n&&o.push(p.toISOString().slice(0,10)),p=d,n=m);
  return o.join(' ')
}

new Date(y,0,++i,9)คุณสามารถใช้ นอกจากนี้สิ่งนี้ล้มเหลวในปี 2100 และปีอธิกสุรทินที่สูงกว่าเนื่องจาก JS ไม่มีข้อมูลเกี่ยวกับปีอธิกสุรทินเหล่านั้นและจึงไม่มีเลยFeb 29ในปีอธิกสุรทินสำหรับปี 2100 ขึ้นไป
เครื่องมือเพิ่มประสิทธิภาพ

@Optimizer ไม่ใช่ JS: 2100,2200,2300 ไม่ใช่ปีอธิกสุรทิน ปี 2014 เป็นปีอธิกสุรทินและ JS รู้ สำหรับการใช้ชั่วโมงที่ 9 ฉันไม่สามารถตรวจสอบได้ แต่ฉันคิดว่ามันไม่ทำงานถ้าคุณเป็นเช่นในเมลเบิร์น ...
edc65

อ่า .. ไม่เคยรู้เลยว่าเราจะตก 3 วันต่อ 400 ปี เกี่ยวกับ 9 - ผมเปลี่ยนเขตเวลาของฉันจาก -1000 (ฮาวาย) เพื่อ 1100 (เมลเบิร์น) และnew Date(2014,0,26,9)เป็นวันอาทิตย์ให้ถูกต้องISOสตริงเช่นเดียวกับการเป็นgetDay() 0
เครื่องมือเพิ่มประสิทธิภาพ

3

JavaScript, ES6, 222 219 199 ไบต์

ฉันไม่เห็นคำตอบ JavaScript ใด ๆ ใน Rosetta wiki

ไปเลย:

S=Y=>{for(l=[],p=new Date(Y,i=0);i<365+!(Y%4);)if(!(d=new Date(Y,0,++i,9)).getDay()){p.getMonth()-d.getMonth()&&l.push(p);p=new Date(d)}return[...l,p].map(x=>x.toISOString().split("T")[0]).join(" ")}

สิ่งนี้จะสร้างฟังก์ชั่นSที่ส่งคืนสตริงที่มีเอาต์พุตที่ต้องการ ฟังก์ชั่นนี้ยังดูแลปีอธิกสุรทิน

เนื่องจาก ES6 ใช้งานได้กับ Firefox ล่าสุดเท่านั้น

ขอบคุณ apsillers สำหรับส่วนปลายซึ่งทำให้ลดลงเหลือ 200 ไบต์

ค้นหารุ่น ungolfed ด้านล่างเป็นตัวอย่างสแต็กซึ่งคุณสามารถเรียกใช้ที่นี่:

S=Y=>{
  for(l=[],p=new Date(Y,i=0);i<365+!(Y%4);)
    if(!(d=new Date(Y,0,++i,9)).getDay()){
      p.getMonth()-d.getMonth()&&l.push(p);
      p=new Date(d)
    }
  return[...l,p].map(x=>x.toISOString().split("T")[0]).join(" ")
}

alert(S(parseInt(prompt())))


คุณสามารถใช้ + พรอมต์ () แทนการแยกวิเคราะห์และกำจัดบาง bytes
Jacob

@Jacob ไม่ได้เพิ่มพรอมต์ลงในจำนวนไบต์
เครื่องมือเพิ่มประสิทธิภาพ

OIC ฉันควรจะได้อ่านคำถาม ...
จาค็อบ

@apsillers ขอบคุณตัน! แก้ไขปัญหาและลดจำนวนมากตามเคล็ดลับของคุณ
เครื่องมือเพิ่มประสิทธิภาพ

อินพุต2100เอาต์พุต2100-01-31 2100-02-28 2100-03-28 2100-04-25 2100-05-30 2100-06-27 2100-07-25 2100-08-29 2100-09-26 2100-10-31 2100-11-28 2100-12-26 2101-01-02ไม่ถูกต้อง
Qwertiy

3

Rebol - 120 116 80 79 76

d: do join"1-1-"input print collect[for m 2 13 1[d/2: m keep d - d/weekday]]


Ungolfed + คำอธิบายประกอบบางส่วน:

d: do join "1-1-" input         ;; golfy way to create Rebol date! datatype 1-Jan-(year)

print collect [
    for m 2 13 1 [              ;; loop thru months 2 to 13!
        d/2: m                  ;; move to (1st of) next month
        keep d - d/weekday      ;; collect/keep last sunday of month
    ]
]

ตัวอย่างการคำนวณวันอาทิตย์ในคอนโซล Rebol:

>> ; get last sunday of Jan 2014

>> d: 1-1-2014
== 1-Jan-2014

>> d/month: d/month + 1
== 2

>> d
== 1-Feb-2014

>> d/weekday
== 6

>> d - d/weekday
== 26-Jan-2014

>> ; above is last sunday of Jan 2014
>> ; and when pass end of year (ie. month 13!)

>> d/month: 13
== 13

>> d
== 1-Jan-2015

อาจเกิดขึ้น 87: d: 1-1-1 d / ปี: ทำพิมพ์เก็บรวบรวม [ทำซ้ำ m 12 [d / เดือน: m + 1 เก็บ d - d / วันธรรมดา]]
rgchris

@rgchris ขอบคุณ Chris ก็สามารถที่จะโกนได้อีก 7 ตัวเพื่อมัน
draegtun

มีความสุข !! มันไม่ดี แต่ไม่เคยคิดว่าFORจะเป็นทางลัด
rgchris

2

CJam, 122 102 ไบต์

30li:X400%){[1387Yb30f+~28I!I4%!I100%e&|g+\]W%{\_2$>7*-\7%7\m1$+}/}fI;]12/W=12,{101+s1>}%]z{X+W%'-*S}/

สิ่งนี้ไม่ใช้ไลบรารีรูปแบบใด ๆ ฉันยังสามารถเล่นกอล์ฟได้เป็นอย่างมากฉันคิดว่า

ทดสอบที่นี่


3
ฉันตื่นเต้นมากที่คำตอบ CJam ไม่ใช่คำตอบยอดนิยมในการแข่งขันกอล์ฟโค๊ตครั้งเดียว ฉันสามารถตายได้อย่างมีความสุข .. วันนี้เป็นวันที่ดี (จนกระทั่งมันลงมาถึง 6 ไบต์อย่างแน่นอน)
แบรนดอน

@Brandon: นั่นเป็นเหตุผลที่ฉันคิดว่ามันน่าสนใจ หวังว่าจะได้เห็นห้องสมุดมหัศจรรย์ที่ทำให้เรื่องนี้ง่าย แต่ก็ไม่ผิดหวัง
Phil H

1

R, 128 ตัวอักษร

P=paste;f=format;a=strptime(P(1:366,scan()),"%j %Y");cat(sort(sapply(split(a,f(a,"%B")),function(x)P(tail(x[f(x,"%u")==7],1)))))

ด้วยตัวแบ่งบรรทัด:

P=paste
f=format
a=strptime(P(1:366,scan()),"%j %Y")
cat(sort(sapply(split(a,f(a,"%B")),function(x)P(tail(x[f(x,"%u")==7],1)))))

1

C # 255

Ungolfed

static void Main(string[] a)
    {
        int y = Int32.Parse(Console.ReadLine());
        DateTime d = new DateTime(y, 1, 1);
        while (d.Year == y)
        {
            if (d.DayOfWeek == DayOfWeek.Sunday && d.Day>(DateTime.DaysInMonth(y,d.Month)-7))
                Console.WriteLine(d.ToShortDateString());
            d = d.AddDays(1);
        }
        Console.ReadKey();
    }

แก้ไข: แก้ไขเพื่อพิมพ์เฉพาะวันอาทิตย์ที่ผ่านมา :)


ไม่ใช่รูปแบบเอาต์พุตที่ต้องการ + นี่คือรหัสกอล์ฟ
edc65

1

q, 67

{({{1<>x mod 7}-[;1]/x}')14h$1_til[13]+13h$"D"$(($)x),".01.01"}

ไม่มีไลบรารีวันที่ที่ใช้สำหรับสิ่งนี้ใน q หรือไม่?
Phil H

1

"โอ้ไม่เขาอีกครั้ง!"

Java - 259 246 ไบต์

void g(int y){for(int i=;i<12;i++){GregorianCalendar c=new GregorianCalendar(y,i,0);c.set(c.DAY_OF_WEEK,c.SUNDAY);c.set(c.DAY_OF_WEEK_IN_MONTH,-1);System.out.print(y+"-"+String.format("%02d",(c.get(c.MONTH)+1))+"-"+(c.get(c.DAY_OF_MONTH))+" ");}}

เวอร์ชันที่ไม่ถูกปรับแต่ง:

void g(int y){
    for (int i = 0; i < 12;i++) {
        GregorianCalendar c = new GregorianCalendar(y, i, 0);
        c.set(c.DAY_OF_WEEK, c.SUNDAY);
        c.set(c.DAY_OF_WEEK_IN_MONTH, -1);
        System.out.print(y+"-"+String.format("%02d",(c.get(c.MONTH)+1))+"-"+(c.get(c.DAY_OF_MONTH))+" ");
    }
}

การใช้งาน:

import java.util.GregorianCalendar;
import java.util.Scanner;

public class LastSundayInYear {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Year?");
        int year = scanner.nextInt();
        LastSundayInYear sunday = new LastSundayInYear();
        sunday.g(year); 
    }

    void g(int y){
        for (int i = -1; ++i < 12;) {
            GregorianCalendar c = new GregorianCalendar(y, i, 0);
            c.set(c.DAY_OF_WEEK, c.SUNDAY);
            c.set(c.DAY_OF_WEEK_IN_MONTH, -1);
            System.out.print(y+"-"+String.format("%02d",(c.get(c.MONTH)+1))+"-"+(c.get(c.DAY_OF_MONTH))+" ");
        }
    }
}

เอาท์พุท:

2014-01-26 2014-02-23 2014-03-30 2014-04-27 2014-05-25 2014-06-29 2014-07-27 2014-08-31 2014-09-28 2014-10-26 2014-11-30 2014-12-28

อีกคำตอบหนึ่ง "ให้ใส่คำตอบของจาวาเพื่อความบันเทิง" โอ้ดี แต่อย่างน้อยเมื่อคุณใส่ใจถึงคำตอบของฉันฉันจะพยายามทำให้คุณเบื่อมากขึ้นและอธิบายเหตุผลของฉัน

วิธีgรับปีที่ต้องการและสำหรับแต่ละเดือนจะสร้างGregorianCalendarวัตถุ (เดือนไปจาก 0 ถึง 11) จากนั้นคนแรกc.setชุดวันของสัปดาห์เป็นวันอาทิตย์และวันที่สองบอกว่าเราต้องการที่ผ่านมาสัปดาห์ของเดือน - เท่าที่เห็นในเอกสารอย่างเป็นทางการ System.out.printlnพิมพ์ออกวันอาทิตย์ที่ (ถ้าเราได้ทำในขณะนี้ซึ่งเป็นปีที่จะพิมพ์เป็นc.get(c.YEAR)แต่ใช้yอีกครั้งโกนออก 13 ตัวอักษร) เดือนจะต้องมีการจัดรูปแบบการเพิ่มศูนย์นำตั้งแต่เดือนมกราคมถึงกันยายน (หน่วยและ ค่าจะเพิ่มขึ้นเนื่องจากดีเดือนที่นี่จะถูกแสดง 0-11) และวันของวันอาทิตย์ที่ผ่านมาจะถูกพิมพ์ และขั้นตอนนี้จะทำซ้ำอีกสิบเอ็ดเดือน


0

C #, 212 , 237

string x(int y){var s="";var t="";var d=new DateTime(y,1,1);for(;;){if(d.Year!=y){return s;}t=(d.DayOfWeek==DayOfWeek.Sunday)?t=string.Format("{0}-{1}-{2} ",d.Year,d.Month,d.Day):t;s=(d.AddDays(1).Month!=d.Month)?s+=t:s;d=d.AddDays(1);}}

ด้วยการขึ้นบรรทัดใหม่

string x(int y)
    {
        var s = "";
        var t = "";
        var d = new DateTime(y,1,1);
        for (;;)
        {
            if (d.Year != y) {
                return s;
            }
            t = (d.DayOfWeek == DayOfWeek.Sunday) ? t = string.Format("{0}-{1}-{2} ", d.Year, d.Month, d.Day) : t;
            s=(d.AddDays(1).Month!=d.Month)?s+=t:s;
            d=d.AddDays(1);
        }
    }

ผลผลิตสำหรับปี 2014

"2015-1-25 2015-2-22 2015-3-29 2015-4-26 2015-5-31 2015-6-28 2015-7-26 2015-8-30 2015-9-27 2015-10-25 2015-11-29 2015-12-27"

ไม่ใช่รูปแบบเอาต์พุตที่จำเป็น
edc65

ที่นั่นคงที่ ดีขึ้นหรือไม่
Darren Breen

0

C # 171

ฟังก์ชันส่งคืนสตริง

string S(int y){var r="";for(int m=1;m<13;++m){var d=new System.DateTime(y,1,1).AddMonths(m).AddDays(-1);r+=y+string.Format("-{0:00}-{1} ",m,d.Day-d.DayOfWeek);}return r;}

Ungolfed

string S(int y)
{
    var r="";
    for (int m=1;m<13;++m)
    {
        var d = new System.DateTime(y, 1, 1).AddMonths(m).AddDays(-1);
        r += y + string.Format("-{0:00}-{1} ", m, d.Day - d.DayOfWeek);
    }
    return r;
}

0

C # 194

ใช้ Linq:

string d(int y){return string.Join(" ",Enumerable.Range(1,12).Select(m=>new DateTime(y,m,DateTime.DaysInMonth(y,m))).Select(d=>d.AddDays(-(int)d.DayOfWeek)).Select(d=>d.ToString("yyy-MM-dd")));}

Ungolfed

string d(int y)
{
    return string.Join(" ",Enumerable.Range(1,12)
        .Select(m => new DateTime(y, m, DateTime.DaysInMonth(y, m)))
        .Select(d => d.AddDays(-(int)d.DayOfWeek))
        .Select(d => d.ToString("yyy-MM-dd")));
}

เอาท์พุต

2013-01-27 2013-02-24 2013-03-31 2013-04-28 2013-05-26 2013-06-30 2013-07-28 2013-08-25 2013-09-29 2013-10-27 2013-11-24 2013-12-29

0

Mathematica - 171

ล้อมรอบในฟังก์ชั่นที่ไม่ระบุชื่อส่งคืนสตริง

StringJoin[Last@#~DateString~{"Year","-","Month","-","Day"," "}&/@GatherBy[Select[DateRange[DateObject[{#}],DateObject[{#+1}]],DayName@#==Sunday&],DateValue[#,"Month"]&]]&

สนามกอล์ฟ Mathematica แห่งแรก ฉันรู้สึกว่ามันจะลดลงอย่างมาก


0

VB-192

Function z(y)
For i = 1 To 11
a = 0
s = IIf(i <> 11, DateSerial(y, i + 1, 1), DateSerial(y + 1, 1, 1))
While Weekday(s - a) <> 1
a = a + 1
Wend
r = r + Str(s - a) + " "
Next
z = r
End Function

อาจแย่กว่านี้ ^^

รายการที่สองและสุดท้ายของฉัน (อย่าคิดว่าฉันจะทำให้เล็กลง)

142

Function z(y)
Dim m(12)
For i = 1 To 366
s = DateSerial(y, 1, 1) + i
If Weekday(s) = 1 Then m(Month(s)) = s
Next
z = Join(m, " ")
End Function

0

ทับทิม 76

ruby sundays.rb 1900ใช้พารามิเตอร์ commandline ใช้ไลบรารี Date

require'date';puts (1..12).map{|m|d=Date.new($*[0].to_i,m,-1);d-d.wday}*" "
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.