พิมพ์ทุกวันอาทิตย์ในปี 2560


27

พิมพ์วันของทุกวันอาทิตย์ในปี 2017 dd.mm.yyyyในรูปแบบต่อไปนี้:
ผลลัพธ์ที่คาดหวัง:

01.01.2017
08.01.2017
15.01.2017
22.01.2017
29.01.2017
05.02.2017
12.02.2017
19.02.2017
26.02.2017
05.03.2017
12.03.2017
19.03.2017
26.03.2017
02.04.2017
09.04.2017
16.04.2017
23.04.2017
30.04.2017
07.05.2017
14.05.2017
21.05.2017
28.05.2017
04.06.2017
11.06.2017
18.06.2017
25.06.2017
02.07.2017
09.07.2017
16.07.2017
23.07.2017
30.07.2017
06.08.2017
13.08.2017
20.08.2017
27.08.2017
03.09.2017
10.09.2017
17.09.2017
24.09.2017
01.10.2017
08.10.2017
15.10.2017
22.10.2017
29.10.2017
05.11.2017
12.11.2017
19.11.2017
26.11.2017
03.12.2017
10.12.2017
17.12.2017
24.12.2017
31.12.2017

1
ล่อลวงเป็นไปได้ของการวางแผนวันอาทิตย์ของคุณ ? ปีนี้เป็นปีที่เฉพาะเจาะจง
xnor

1
ฉันเช็คเอาท์วางแผนวันอาทิตย์ของคุณก่อนโพสต์ แต่ขอให้พิมพ์วันอาทิตย์ในเดือนที่กำหนด @xnor
ShinMigami13

1
มีเหตุผลใดสำหรับรูปแบบผลลัพธ์เฉพาะนั้นหรือไม่ คุณสามารถเปิดขึ้นมาเล็กน้อย
Rɪᴋᴇʀ

4
จริงๆแล้วฉันชอบสิ่งนี้ในฐานะที่เป็นความท้าทายที่แท้จริงของข้อความ kolmogorov การจัดรูปแบบวันที่อย่างถูกต้องมีการเพิ่มประสิทธิภาพที่น่าสนใจ
xnor

5
อย่างไรก็ตามฉันคิดว่าควรปิดการโหวตอย่างใกล้ชิด
Erik the Outgolfer

คำตอบ:


16

Python 2 , 81 ไบต์

x=0
exec"print'%05.2f.2017'%(x%30.99+1.01);x+=7+'0009ANW'.count(chr(x/7+40));"*53

ลองออนไลน์!

ไม่มีไลบรารีวันที่คำนวณวันที่โดยตรง เคล็ดลับหลักคือการปฏิบัติต่อdd.mmเป็นค่าทศนิยม ยกตัวอย่างเช่น16.04.2017(16 เมษายน) 16.04ที่สอดคล้องกับจำนวน จำนวนจะถูกพิมพ์ในรูปแบบเช่นเดียวxx.xxกับ .2017ผนวก

คำนวณวันและเดือน ในแต่ละสัปดาห์เพิ่ม 7 x+=7วันทำตาม การใช้ชุดxโมดูโล30.99จัดการกับโรลโอเวอร์ด้วยการลบ30.99เมื่อใดก็ตามที่จำนวนวันใหญ่เกินไป รวม-31การรีเซ็ตวันด้วย+0.01การเพิ่มเดือน

โรลโอเวอร์ถือว่าในแต่ละเดือนมี 31 วัน เดือนที่มีวันน้อยลงจะถูกปรับโดยดุนขึ้นอยู่กับตัวเลขสัปดาห์บางอย่างกับx +[8,8,8,17,25,38,47].count(x/7)รายการเหล่านี้เป็นตัวเลขสัปดาห์ที่สิ้นสุดเดือนสั้น ๆ เหล่านี้โดย8เพิ่มเป็นสามเท่าเพราะกุมภาพันธ์สั้น 3 วันที่ 31

รายการนี้สามารถบีบอัดลงในสายอักขระได้โดยการใช้ค่า ASCII บวก 40 การ+40หลีกเลี่ยงการเลื่อนสามารถทำได้โดยใช้ตัวอักษรที่ไม่สามารถพิมพ์ได้และสามารถเข้าถึงได้สั้นลงเป็นวัตถุไบต์ใน Python 3


ช่างเป็นคำตอบที่ยอดเยี่ยม! '888z!}+'.count(chr(x%146))บันทึกหนึ่งไบต์
Lynn

10

PHP, 48 ไบต์

while($t<53)echo gmdate("d.m.2017
",605e3*$t++);

PHP, 46 ไบต์ (สำหรับการชดเชย UTC ที่ไม่เป็นลบ)

while($t<53)echo date("d.m.2017
",605e3*$t++);

1
ไม่ควรgmdateสำหรับความปลอดภัยของเขตเวลา? มันล้มเหลวบน onlinephpfunctions.com ทำงานได้ยอดเยี่ยมในด้านอื่น ๆ !
ติตัส

9

Python 2 , 90 79 ไบต์

-5 ไบต์ด้วยความช่วยเหลือของ xnor (หลีกเลี่ยงการนับสัปดาห์เอง)
-1 ไบต์ขอบคุณ xnor (เพิ่มกลับมาใน e สำหรับ 605000 เป็น 605e3)

from time import*
i=0
exec"print strftime('%d.%m.2017',gmtime(i));i+=605e3;"*53

ลองออนไลน์!

0วินาทีตั้งแต่เวลา 00:00:00 ในวันที่ 1 มกราคม 1970 ซึ่งเช่นปี 2017 ไม่ใช่ปีอธิกสุรทิน 605000วินาทีคือ 1 สัปดาห์, 3 นาที, 20 วินาที การเพิ่ม 52 สัปดาห์ "เหล่านี้" ไม่ได้ทำให้เราเกินเที่ยงคืน


นี่เป็นวิธีที่สั้นกว่าในการสร้างความก้าวหน้าทางคณิตศาสตร์
xnor

@ xnor ขอบคุณฉันกำลังทำงานในสิ่งเดียวกันและพยายามลดลง แต่ 81 ดูเหมือนจะไปด้วยวิธีห้องสมุด
Jonathan Allan

@xnor ... หรือไม่
Jonathan Allan

1
ดี! 605e3จำนวนที่สามารถ ฉันมีความคิดบางอย่าง :)
xnor

7

Bash + coreutils 44 ไบต์

seq -f@%f 0 605e3 32e6|date -uf- +%d.%m.2017

อาจบันทึก 2 ไบต์-uหากสมมติว่าเป็น GMT

  • ขอบคุณDigital Traumaชี้ให้เห็น-fพารามิเตอร์dateที่ช่วยประหยัด 10 ไบต์;
  • และใช้ 2017 ในรูปแบบของสตริงช่วยประหยัดไบต์ได้มากขึ้นซึ่งแนวคิดนี้มาจากคำตอบที่ให้โดย user63956

  • @0 คือ 1970-1-1
  • 605000คือหนึ่งสัปดาห์ ( 604800) บวก 200 วินาที
    • 200 วินาที ควรทำงานตั้งแต่มีเพียง 52 สัปดาห์ในหนึ่งปี
  • @32000000 น้อยกว่าหนึ่งปี

seq -f@%1.f 14833e5 605e3 1515e6|date -uf- +%d.%m.%Yช่วยให้คุณประหยัด 10 ไบต์ คุณอาจจะเรียกร้องนี้เป็นทุบตี + coreutilsแม้ว่า
บาดเจ็บทางระบบดิจิตอล

7

PowerShell, 51 47

0..52|%{date((date 2017-1-1)+7.*$_)-u %d.%m.%Y}

ค่อนข้างตรงไปตรงมา 2017-01-01 เป็นวันอาทิตย์ดังนั้นจึงเป็นเช่นนี้ต่อไปอีกเจ็ดวัน เราสามารถบันทึกสองไบต์หากเราต้องการให้สคริปต์ทำงานในช่วงชีวิตของฉันเท่านั้น:

0..52|%{date((date 17-1-1)+7.*$_)-u %d.%m.%Y}

1
(date 2017-1-1)+7.*$_คุณสามารถบันทึกไม่กี่ไบต์ถ้าคุณแทนของสตริงเพิ่มจำนวนตัวแทนที่สองของวันคือ ดูคำตอบนี้
Danko Durbić

@ DankoDurbić: โอ้ว้าว ฉันรู้เพียงว่าการเพิ่มintเห็บและสายอักขระสำหรับวันที่ผ่านมาเท่านั้น ดีที่รู้.
Joey

5

Excel VBA 106 91 79 ไบต์

Sub p()
For i = #1/1/2017# To #12/31/2017#
If Weekday(i) = 1 Then MsgBox i
Next
End Sub

บันทึก 15 ไบต์ด้วย @Radhato

สมมติว่า 1/1/2017 คือวันอาทิตย์มันจะประหยัดได้อีก 12 ไบต์

Sub p()
For i = #1/1/2017# To #12/31/2017#
MsgBox i
i = i + 6
Next
End Sub

ขอบคุณ @Toothbrush 66 ไบต์

Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Sub

แก้ไข: (ไม่จำเป็นต้องใช้ Sub และ End Sub) 52 ไบต์

For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next

สามารถปรับปรุงได้โดยการเปลี่ยนเป็น i = 42736 เป็น 43100เป็นสำหรับ i = # 1/1/2017 # เป็น # 12/31/2017 #แล้วจึงลบรูปแบบ (... ) แทนที่ด้วยi
Radhato

@ Radhato แต่จะไม่เพิ่มขนาด byte หรือไม่
Rohan

ฉันคิดว่ามันจะช่วยลดความมันถึง 96 .. ที่ครับอย่างน้อยสิ่งที่ฉันนับฮ่า ๆ
Radhato

ใช่มันได้. ขอบคุณ
Rohan

1
@newguy Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Subเป็นรหัส VBA ที่ถูกต้องสมบูรณ์และมีขนาด 66 ไบต์เท่านั้น ความจริงที่ว่า VBA Editor เพิ่มในช่องว่างเพิ่มเติมไม่เกี่ยวข้อง
แปรงสีฟัน

4

PHP, 67 ไบต์

การใช้ความเป็นจริง PHP จะกำหนดค่า 1 ให้กับตัวแปรลูปที่ไม่ได้ประกาศและใช้เวลา epoch ของ Linux โดยอัตโนมัติ

<?php for(;54>$t+=1;)echo date("d.m.Y\n",604800*($t)+1482624000);?>

ยินดีต้อนรับสู่ PPCG! ฉันเชื่อว่าสิ่งนี้สามารถนับได้เป็น59 ไบต์ (แม้ว่าฉันจะไม่เล่นกอล์ฟใน PHP เอง)
Jonathan Allan

4
<?for(;54>++$t;)echo date("d.m.Y\n",605e3*$t+148263e4);ควรจะโอเค
tsh

2
ดีเสมอที่ได้เห็นนักกอล์ฟ PHP ใหม่! คุณได้รับอนุญาตให้ใช้งานphp -rเพื่อให้คุณไม่จำเป็น<?phpและ?>ดังนั้นจึงสามารถนับว่านี่เป็น59 bytesเหมือน @JonathanAllan อย่างถูกต้องกล่าวว่า $tคุณไม่จำเป็นต้องวงเล็บรอบ ไม่กี่โรงแรมพร้อมสนามกอล์ฟอื่น ๆ และคุณจะจบลงด้วยfor(;++$t<54;)echo date("d.m.Y\n",605e3*$t+14827e5);สำหรับ51 bytes(ในเขตเวลาของฉัน) คุณสามารถแทนที่ "\ n" ด้วยตัวแบ่งบรรทัดจริงซึ่งมีเพียง 1 ไบต์เท่านั้นดังนั้นจึงเป็น 51 ไบต์
Christoph

1
ขอบคุณ @Christoph ฉันลองวิธีอื่นแล้วจะอัปเดตเร็ว ๆ นี้
ShinMigami13

นอกเหนือจากคำแนะนำอื่น ๆ ทั้งหมดคุณอาจต้องการใช้gmdateแทนdateความปลอดภัยของเขตเวลา
ติตัส

4

k6, 32 ไบต์

`0:("."/|"."\)'$2017.01.01+7*!53

คำอธิบายสั้น ๆ :

                2017.01.01+7*!53 /add 0, 7, 14, ..., 364 to January 1st
   ("."/|"."\)'$                 /convert to string, turn Y.m.d into d.m.Y
                                 /   split by ".", reverse, join by "."
`0:                              /output to stdout (or stderr), line by line

อนิจจาสิ่งนี้ดูเหมือนว่าจะใช้ได้เฉพาะกับล่ามแบบโอเพ่นซอร์สเมื่อต้องการเท่านั้น

การรันคำสั่งในล่ามแบบโอเพ่นซอร์ส


4

Pyke , 26 24 ไบต์

53 Fy17y"RVs6)c"%d.%m.%Y

ลองออนไลน์!

53 F                     - for i in range(53):, printing a newline between each
    y17y"                -  Create a time object with the year 2017. (Month and days are initialised to 1.)
         RV  )           -  Repeat i times:
           s6            -   Add 1 week
              c"%d.%m.%Y -  Format in "dd.mm.yyyy" time

หรือ 11 ไบต์

หากอนุญาตให้ละเว้นรูปแบบเอาต์พุต

y17y"52VDs6

ลองออนไลน์!

y17y"       - Create a time object with the year 2017. (Month and days are initialised to 1.)
     52V    - Repeat 52 times:
        D   -  Duplicate the old time
         s6 -  Add 1 week

3

R, 79 67 58 ไบต์

cat(format(seq(as.Date("2017/01/01"),,7,53),"\n%d.%m.%Y"))

วันแรกของเดือนมกราคมเป็นวันอาทิตย์ตัวอย่างนี้สร้างลำดับของวันทุก ๆ 7 วันเริ่มตั้งแต่ 01-01-2017 ถึง 31-12-2017 จัดรูปแบบเป็นรูปแบบที่ต้องการและพิมพ์ออกมา


สิ่งนี้ควรลดขนาดลงเหลือ 41 ไบต์print(as.Date("2017-01-01")+seq(7,365,7))
นับ

@ จำนวนขอบคุณ แต่จะไม่พิมพ์ผลลัพธ์ที่ต้องการ (เช่น "2017.01.01" แทนที่จะเป็น "2017/01/01")
plannapus

3

Befunge-98 (PyFunge) , 99 95 93 85 ไบต์, ขึ้นบรรทัดใหม่

การเพิ่มประสิทธิภาพทั้งหมดทำโดย @JoKing ขอบคุณมากสำหรับพวกเขา

s :1g2/10g\%:d1p10g\`+:b`#@_:1\0d1g#;1+:a/'0+,a%'0+,'.,j;a"7102"4k,d1g7+
>8><><>><><>

ลองออนไลน์!

ฉันรู้สึกเหมือนว่าเราพลาดความลึกลับบางอย่างที่นี่ดังนั้นฉันจึงแก้ปัญหาด้วยภาษาเอสเตอริกที่ฉันโปรดปราน

คำอธิบาย :
>8><><>><><>เข้ารหัสความยาวของ 12 เดือน
sเก็บวันเก่าในพื้นที่ว่าง
:1g2/รับค่า ASCII จากแถวล่างและหารด้วยสองสิ่งนี้ทำให้เรามีความยาวของเดือนที่กำหนด Ex: 8 = 56 ใน ASCII => 56 / 2 = 28 => เดือน (กุมภาพันธ์) มี 28 วันรับวัน
10g\%ที่บันทึกไว้ก่อนหน้านี้และปรับเปลี่ยนตามความยาวของเดือนซึ่งช่วยให้เราสามารถเปลี่ยนวันเป็นเดือนถัดไป
:d1pบันทึกสำเนาของวันที่อัปเดตใหม่
10g\`+ทดสอบถ้าวันเก่า > วันที่ใหม่ => เราเปลี่ยนลงในเดือนถัดไป => เพิ่ม 1 กับเดือนเคาน์เตอร์
:b`ทดสอบว่านับเดือน> 11 นั่นหมายความว่าเรามาถึงจุดสิ้นสุดของปี (ใช้ 0 การจัดทำดัชนี)
#@_จากก่อนหน้านี้ถ้ายกเลิกโปรแกรม
:1\0d1gสั่งซื้อใหม่สแต็ค ดังนั้นดูเหมือนว่านี้:Month, 1, Month, 0, Day
#ข้าม insctruction ถัดไป (duh)
1+:a/'0+,a%'0+,'.,แปลงตัวเลขเป็น 1 การจัดทำดัชนีพิมพ์เพิ่ม.ที่ท้าย
j;ใช้ 0 จากสแต็กเพื่อไม่ข้ามและใช้;เพื่อไปที่ตารางการพิมพ์อีกครั้งจากนั้นใช้ 1 เพื่อข้าม;ไปถัดไป เวลา
a"7102"4k,พิมพ์2017\n
d1gรับค่าวันอีกครั้ง 7+เพิ่มหนึ่งสัปดาห์ก่อนทำซ้ำ


@ โจกิ้ง Omc เช่นการเพิ่มประสิทธิภาพที่เห็นได้ชัด! ฉันจะคิดถึงมันได้อย่างไร ขอขอบคุณ.
IQuick 143

1
ปิดอีกสองสามไบต์ ลองออนไลน์! หนึ่งจากการเปลี่ยน -17 ข้ามไปที่ความคิดเห็นแทนหนึ่งจากการใช้การจัดทำดัชนีตาม 0 สำหรับเคาน์เตอร์เดือนและอีกหนึ่งจากการเปลี่ยนเป็นหนึ่งซับ
Jo King

@ โจ้กกิ้งว้าวนั่นเป็นสนามกอล์ฟที่คุณทำอยู่ Lemme เพิ่มลงในคำตอบ
IQuick 143

1
นรกทำไมไม่ทำดัชนีวันที่ 0 ด้วยเช่นกันและไม่ต้องทำการเริ่มต้นเลย! 85 ไบต์
Jo King

3

JavaScript, 111 106 ไบต์

for(i=14833e8;i<1515e9;i+=605e6)console.log(new Date(i).toJSON().replace(/(....).(..).(..).*/,'$3.$2.$1'))

หมายเหตุ: คอนโซลของ Stack Exchange ไม่ยาวพอที่จะแสดงรายการทั้งหมดดังนั้นนี่เป็นครึ่งแรกของตัวอย่างข้อมูลแยกต่างหาก:

for(i=14833e8;i<15e11;i+=605e6)console.log(new Date(i).toJSON().replace(/(....).(..).(..).*/,'$3.$2.$1'))

รูปแบบที่กำหนดเองมีค่าใช้จ่ายฉัน 40 ไบต์ ...


2

Perl 5 , 64 ไบต์

use POSIX;print strftime"%d.%m.%Y\n",0,0,0,7*$_+1,0,117for 0..52

ลองออนไลน์!

งานที่ได้รับคือ 2017 ไม่ใช่ปีใด ๆ ดังนั้นฉันจึง hardcoded ใน:

  • 117 (ซึ่งเสียชีวิตในปี 2560, 1900 + 117)
  • +1 เนื่องจากวันที่ 1 มกราคมเป็นวันอาทิตย์ในปี 2560
  • 0..52 เพราะ 2017 มี 53 วันอาทิตย์

POSIX เป็นโมดูลหลักและติดตั้งกับ Perl5 เสมอ ทำเช่นเดียวกันโดยไม่ใช้โมดูลขนาด 101 ไบต์ลบช่องว่าง:

$$_[5]==117&&printf"%02d.%02d.%d\n",$$_[3],$$_[4]+1,$$_[5]+1900
  for map[gmtime(($_*7+3)*86400)],0..1e4

2

Ruby, 75 ไบต์

Timeวิธีการแก้ปัญหาตรงไปตรงมาคิดออกวันที่มี

t=Time.new 2017
365.times{puts t.strftime("%d.%m.%Y")if t.sunday?
t+=86400}

1
หากคุณเพิ่มทั้งสัปดาห์ (604800 วินาที) คุณไม่จำเป็นต้องตรวจสอบวันอาทิตย์เพียงทำซ้ำ 53 ครั้ง
GB

1
หากคุณทำตามเคล็ดลับที่แนะนำโดย @GB และไม่ได้ตรวจสอบอีกต่อไปในวันอาทิตย์คุณสามารถเริ่มต้นด้วยt=Time.new 1แล้วทำt.strftime"%d.%m.2017"-1 ไบต์
หมึกมูลค่า

2

SAS, 52 50 ไบต์

บันทึก 2 ไบต์ต้องขอบคุณ @ user3490

data;do i=20820to 21184 by 7;put i ddmmyyp10.;end;

คุณไม่จำเป็นต้องระบุชุดข้อมูล - เพียงแค่ใช้data;แทนdata c;และนั่นจะช่วยประหยัด 2 ไบต์ ฉันคิดว่าคุณไม่จำเป็นต้องมีrun;แต่
user3490

@ user3490 ขอบคุณฉันไม่ทราบว่า ฉันเดาว่าเทียบเท่าของdata _null_? นอกจากนี้runคำสั่งนั้นยังบอกเป็นนัยว่ามันหายไป
J_Lard

ไม่เทียบเท่าเลย - คุณจบด้วยชุดข้อมูลผลลัพธ์ตามหลักการdatanตั้งชื่อ
user3490

2

Mathematica 90 84 ไบต์

พูดมากพอสมควร numbermaniac และ Scott Milner บันทึก 5 และ 1 ไบต์ตามลำดับ

Column[#~DateString~{"Day",".","Month",".","Year"}&/@DayRange["2017","2018",Sunday]]

คุณต้องการMost@? เอาต์พุตดูเหมือนจะไม่เหมือนกันหากไม่มี
numbermaniac

1
@ ตัวเลขช่างขอบคุณ Mostอยู่ในนั้นเพื่อหลีกเลี่ยงวันอาทิตย์แรกในปี 2018 ฉันได้ทำการทดสอบรหัสโดยไม่ต้องใช้Mostสำหรับปี 2011, 2012 ซึ่งในกรณีนี้วันอาทิตย์แรกของปี 2012 จะรวมอยู่ในผลลัพธ์ (นั่นเป็นเหตุผลที่ฉันรวมมันไว้ในรหัส) แปลกMostไม่จำเป็นสำหรับ 2017-18 และไม่มีMostผลกระทบต่อผลลัพธ์อย่างชัดเจน ลึกลับ!
DavidC

1

VBA, 81 ไบต์ (อาจเป็น 64)

Sub p()
For i = 0 To 52
MsgBox format(42736 + i * 7, "dd.mm.yyyy")
Next i
End Sub

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

MsgBox #1/1/2017# + i * 7

คุณยังสามารถลบพื้นที่สีขาวจำนวนมากที่ฟอร์แมตโดยอัตโนมัติ ยกตัวอย่างเช่นและและFor i=0To 52 Format(42736+i*7,"dd.mm.yyyy")นอกจากนี้คุณก็สามารถใช้แทนNext Next i
Engineer Toast

1

AHK , 67 ไบต์

d=20170101
Loop,52{
FormatTime,p,%d%,dd.MM.yyyy
Send,%p%`n
d+=7,d
}

ไม่มีอะไรวิเศษเกิดขึ้นที่นี่ ฉันพยายามหาวิธีที่สั้นกว่าFormatTime แต่ล้มเหลว


1

Java 8+, 104 100 99 ไบต์

()->{for(int t=0;t<53;)System.out.printf("%1$td.%1$tm.2017%n",new java.util.Date(t++*604800000L));}

Java 5+, 109 105 104 ไบต์

void f(){for(int t=0;t<53;)System.out.printf("%1$td.%1$tm.2017%n",new java.util.Date(t++*604800000L));}

ใช้วันที่ - ความสามารถของprintfรูปแบบ

ทดสอบด้วยตัวเอง!

เงินออม

  1. 104 -> 100: เปลี่ยนค่าลูปและตัวคูณ
  2. 100 -> 99: golfed วน

1

T-SQL, 94 ไบต์

DECLARE @ INT=0,@_ DATETIME='2017'W:SET @+=1SET @_+=7PRINT FORMAT(@_,'dd.MM.yyy')IF @<52GOTO W

ถ้าคุณไม่ชอบ SQL GOTO หรือในขณะที่นี่เป็นวิธีแก้ปัญหา 122 ไบต์ CTE

WITH C AS(SELECT CAST('2017'AS DATETIME)x UNION ALL SELECT x+7FROM C WHERE X<'12-31-17')SELECT FORMAT(x,'dd.MM.yyy')FROM C

วิธีแก้ปัญหาแรกของคุณเริ่มต้นที่08.01.2017ไม่ใช่01.01.2017
grabthefish

1
เทคนิคที่ดีมากในการแก้ปัญหาของคุณ ทำได้ดีมาก ฉันไม่สามารถต้านทานการยืมมันได้ ;)
AXMIM


1

Groovy, 81 77 63 60 56 ไบต์

d=new Date(0);53.times{printf('%td.%<tm.2017%n',d);d+=7}

ข้างต้นสามารถเรียกใช้เป็นสคริปต์ Groovy

รหัสรายการกอล์ฟครั้งแรกของฉัน โชคดีที่ปี 1970 ไม่ใช่ปีอธิกสุรทินจึงสามารถใช้เป็นฐานได้

ขอบคุณเดนนิสนี่คือ: ลองออนไลน์!


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนา & รหัสกอล์ฟ! ในกรณีที่คุณสนใจต่อไปนี้เป็นลิงก์มา: ลองออนไลน์!
Dennis

ขอบคุณ @Dennis ผมไม่ทราบว่านี้มีอยู่ :)
Krystian

คุณสามารถบันทึกสี่ไบต์ด้วยการย้ายวันที่ภายในเวลาบล็อก53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)}, 52 ไบต์ ปกป้องเกียรติยศของ groovy ที่นี่ ...
Matias Bjarland

1

C #, 138 111 102 ไบต์

บันทึกอีก 9 ไบต์ขอบคุณJohan du Toit !

บันทึกแล้ว 27 ไบต์ด้วยคำแนะนำของKevin Cruijssen !

()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));}

ฟังก์ชั่นไม่ระบุชื่อซึ่งพิมพ์ทุกวันอาทิตย์ในปี 2560

โปรแกรมเต็มรูปแบบด้วยวิธี ungolfed:

using System;

class P
{
    static void Main()
    {
        Action f =
        ()=>
        {
            for (int i = 0; i < 53; )
                Console.Write(new DateTime(2017, 1, 1).AddDays(7 * i++).ToString("dd.MM.yyyy\n"));
        };



        f();
    }
}

1
ใช้ง่ายกว่า.AddDays(7*i++)ไหม จากนั้นไม่จำเป็นต้องมีการ.DayOfWeek<1ตรวจสอบ เรารู้ว่า 01-01-2017 เป็นวันอาทิตย์และจากนั้นเราสามารถเพิ่มได้อีก 7 วัน
Kevin Cruijssen

2
ไม่แน่ใจเกี่ยวกับเรื่องนี้ - ในการเล่นกอล์ฟทุกครั้งที่ฉันเข้าร่วมฉันมักใช้เนมสเปซที่สมบูรณ์ แต่คุณไม่ได้พลาดบางอย่างSystemในนั้น - System.DateTimeและSystem.Console.Write?
auhmaan

เจ๋ง แต่คุณสามารถประหยัดได้สองไบต์:()=>{for(int i=0;i<53;)Console.Write(new DateTime(2017,1,1).AddDays(7*i++).ToString("dd.MM.yyyy\n"));};
Johan du Toit

@auhmaan: ใช่ควรใช้เนมสเปซเต็มรูปแบบหรือusingควรรวมคำสั่งในการนับจำนวนไบต์
raznagul

3
@adrianmp: ต้องนับusingคำสั่งที่จำเป็นในการเรียกใช้รหัส ดูคำถาม Meta นี้: ฉันจำเป็นต้องใช้การนำเข้าหรือฉันสามารถเรียกชั้นเรียนอธิบายได้หรือไม่?
raznagul

1

C #, 110 109 ไบต์

using System;()=>{for(int i=42729;i<43100;Console.Write(DateTime.FromOADate(i+=7).ToString("dd.MM.yyy\n")));}

คุณสามารถเพลิดเพลินกับโปรแกรมนี้ออนไลน์ได้ที่นี่

ในการแก้ปัญหานี้เรา:

  • ใช้ OLE Automation Date (OADate) เพื่อหลีกเลี่ยง "AddDay ()" จาก datetime
    FromOADate()ดูใหญ่ แต่ก็เท่ากับnew DateTime(2017,1,1)

  • เริ่มวนซ้ำในวันอาทิตย์สุดท้ายของปี 2559 เพื่อให้เราสามารถเพิ่มผู้ประกอบการได้+=เท่านั้น ผู้ประกอบการนี้จะคืนค่าหลังจากที่เพิ่มขึ้นจะทำ

  • เพิ่มขึ้น 7 วันเพื่อกระโดดจากวันอาทิตย์เป็นวันอาทิตย์ก่อนพิมพ์วันที่

  • เราหยุดทันทีเมื่อวันอาทิตย์ที่ผ่านมาของปี 2017 ได้รับผลกระทบ

  • ใช้DebugแทนConsoleการบันทึกอักขระสองตัว

  • หลีกเลี่ยงการประกาศและการมอบหมายตัวแปรอย่างชัดเจน


ค่าเริ่มต้นของเราบอกว่าคุณควรมีฟังก์ชั่นหรือโปรแกรม (เช่นไม่ใช่ตัวอย่าง) และคุณต้องมีคุณสมบัติ Debug และ DateTime : ฉันขอแนะนำให้เพิ่มusing System;และเปลี่ยนConsoleจากDebug(ซึ่งเป็น tad หลบตัวเอง แต่ฉันสามารถ ไม่พบคำอธิบายใด ๆ เกี่ยวกับเมตาเกี่ยวกับมัน)
VisualMelon

1
@VisualMelon ฉันได้ปฏิบัติตาม "ให้ฟังก์ชั่น" และฉันได้แทนที่Debugด้วยConsoleเนื่องจากDebugจำเป็นต้องมีการรวม อย่างไรก็ตามฉันไม่ปฏิบัติตาม 'ระบบการใช้งาน' เพราะคู่แข่งของฉันในภาษานี้ไม่ได้ทำ นอกจากนี้คุณไม่สามารถเขียนโค้ดนอกคลาสที่จำเป็นต้องกำหนดภายในเนมสเปซ ฉันค่อนข้างมั่นใจว่าคำตอบ c # ส่วนใหญ่ในเว็บไซต์นี้ไม่ได้รวมอยู่ในนั้น ดังนั้นตอนนี้เราจะทิ้งคำตอบทั้งหมดเหล่านี้ลงในถังขยะหรือไม่? เราลงคะแนนพวกเขาทั้งหมดเพื่อบังคับให้พวกเขาปฏิบัติตามหรือไม่? ถ้าเป็นเช่นนั้นชุมชนอาจห้าม c # จาก codegolf ไปด้วยกัน
AXMIM

'กฎ' เหล่านี้เป็นเพียงสิ่งที่ชุมชนได้ตัดสินเมื่อเวลาผ่านไป (และบันทึกไว้ในเมตา) เราไม่ดาวน์คำตอบเราแสดงความคิดเห็นและไม่โหวตด้วยเช่นกัน เมื่อพวกเขาแก้ไขพวกเขาแล้วเรามีอิสระในการโหวต ทั้งคำตอบ C # อื่น ๆ มีความคิดเห็นที่แนะนำว่าควรเพิ่มusingคำสั่งหรือวิธีการและประเภทที่มีคุณสมบัติครบถ้วนโปรดอย่าใช้สิ่งนี้เป็นการส่วนตัว ฉันเป็นนักกอล์ฟ C # เป็นเวลานานและฉันรู้สึกซาบซึ้งที่กฎเกณฑ์ต่าง ๆ นั้นปรากฏขึ้นดังนั้นฉันชอบที่จะผลักดันผู้คนในทิศทางที่ถูกต้องเมื่อฉันสามารถทำได้ ฉันตอบ 'เป้าหมาย' โดยเฉพาะ C # เพราะฉันค่อนข้างทราบในเรื่องนี้
VisualMelon

1
@VisualMelon ยุติธรรมพอฉันแค่ผ่านไปนี่ ดังนั้นฉันจะยอมรับกฎของคุณในขณะที่ฉันอยู่ที่นี่ ดังนั้นฉันจึงพยายามที่จะทำให้คำตอบของฉันสอดคล้องกับเวลานี้
AXMIM

1
ดูดีกับผม! +1 สำหรับวิธีการดั้งเดิม และคุณไม่ต้องการช่องว่างหลังจากนั้นusing System;(ฉันคิดว่ามันไม่ได้ตั้งใจ) นั่นคือ 109 ไบต์
VisualMelon

1

TSQL, ที่ 112 105 ไบต์

SELECT CONVERT(VARCHAR,DATEADD(d,number*7,42734),104)FROM master..spt_values WHERE type='p' AND number<53

การสาธิต

ไวยากรณ์การแปลง T-SQL


คุณสามารถบันทึก 2 ไบต์โดยการแทนที่โดยDAY dมันทำเช่นเดียวกัน
AXMIM

+1 คุณสามารถบันทึกอีก 3 ไบต์โดยการแทนที่ด้วย'20170101' 42734วันที่คือจำนวน เวลาคือส่วนทศนิยมของจำนวน
AXMIM

1

JavaScript (ES6), 123 ไบต์

มันเป็นโพสต์แรกของฉันที่นี่สวัสดี!

a=x=>`0${x}.`.slice(-3);[].map.call('155274263153',(x,i)=>{for(j=0;j<4+(2633>>i&1);j++)console.log(a(+x+j*7)+a(i+1)+2017)})

โซลูชันนี้ใช้ข้อมูล hardcoded และได้รับการออกแบบมาเพื่อทำงานโดยเฉพาะสำหรับปี 2560 โดยไม่มี API วันที่ / เวลา

สำหรับตัวเลขในสตริง155274263153แต่ละหลักคือตัวเลขของตัวเองและแสดงถึงวันอาทิตย์แรกของแต่ละเดือนติดต่อกัน สามารถสร้างผลผลิตตลอดทั้งปีโดยการเพิ่ม 7 อย่างต่อเนื่อง

ใช้เวทมนตร์อะไร2633ในวงนี้?
ทีนี้ ... 2633(ทศนิยม) เป็น101001001001เลขฐานสอง ตอนนี้สิ่งที่อาจ1หมายถึงอะไร เริ่มจากด้านขวาบิตที่ 1, 4, 7, 10 และ 12 ถูกตั้งค่า สิ่งนี้สอดคล้องกับเดือนที่มีห้าวันอาทิตย์ซึ่งตรงข้ามกับที่มีเพียงสี่วัน เมื่อมองลงไปที่นิพจน์ที่ประณีตนี้ในขั้นต้นมันจะเป็นแบบนี้: for(j=0;j<4+ +[0,3,6,9,11].includes(i);j++).

ฉันเดาว่าส่วนที่เหลือนั้นอธิบายได้ค่อนข้างดี


@SIGSEGV: ฉันไม่รังเกียจที่ECMAScript 2015จะเปลี่ยนไปJavascript (ES6)แต่ ... คุณทำลายรหัสของฉันและฉันต้องเปลี่ยนมัน
แรด

โอ้นั่นเป็นมติของชุมชนโดยอนุญาตให้มีเฉพาะส่วนแลมบ์ดาเท่านั้น
Matthew Roh

@SIGSEGV นี่ไม่ใช่กรณีที่นี่ แลมบ์ดานี้มีโค้ดเพียงบางส่วนเท่านั้นและฉันต้องการตัวระบุนั้นเพื่อให้สามารถใช้งานได้จากที่อื่น โดยไม่ต้องมีa=รหัสที่เป็นจริงเสีย
แรด

1

T-SQL, 79 77 ไบต์

หลังจากที่ช่วยซัลปรับปรุงคำตอบของเขา PRINTฉันตัดสินใจที่จะเขียนของตัวเองโดยใช้ห่วงและ

ฉันลงเอยด้วยโซลูชัน 90 ไบต์

DECLARE @d DATETIME=42734 WHILE @d<43100BEGIN PRINT CONVERT(VARCHAR,@d,104)SET @d=@d+7 END

จากนั้นฉันดูผู้นำปัจจุบันใน T-SQL ซึ่งมีขนาด 94 ไบต์จาก WORNG ALL ด้วยคำตอบนี้ ผู้ชายคนนี้ได้พบเทคนิคที่ดีมาก

  1. ตั้งชื่อตัวแปรเท่านั้น @
  2. วนซ้ำด้วยGOTOแทน LOOP จริง
  3. บันทึกตัวละครตัวหนึ่งที่ใช้แทนFORMAT CONVERT(SSMS2012 + เท่านั้น)

ด้วยการใช้เทคนิคเหล่านี้วิธีการแก้ปัญหานี้ถูกตัดลงไปที่วิธีการแก้ปัญหาด้านล่างซึ่งเป็น 79 ไบต์

DECLARE @ DATETIME=42734G:PRINT FORMAT(@,'dd.MM.yyy')SET @+=7IF @<43100GOTO G

คุณสามารถบันทึก 2 ไบต์โดยเปลี่ยน @ = @ + 7 เป็น @ + = 7 และโดยการลบช่องว่างระหว่าง 7 และ IF
WORNG ALL

ในโพสต์นี้เป็นที่ที่ฉันได้รับกลทั้งหมดอาจช่วยคุณได้เช่นกัน
WORNG ALL

1
@ WALLGALL ฉันสงสัยว่าฉันไม่สามารถทำสิ่งนั้นได้ ขอบคุณมาก.
AXMIM

1

อ็อกเทฟ 37 ไบต์

สั้นกว่าภาษาอื่น ๆ ที่ไม่ใช่การเล่นกอล์ฟมากและมันก็ผูกติดกับเยลลี่! วิธีที่จะไประดับแปดเสียง! :)

disp(datestr(367:7:737,'DD.mm.2017'))

ลองออนไลน์!

โชคดีที่ปีที่มีลักษณะตรงเช่นเดียวกับปี2 AD 2017 ADทั้งสองเริ่มต้นและสิ้นสุดในวันอาทิตย์และไม่เป็นปีอธิกสุรทิน สิ่งนี้ช่วยประหยัดจำนวนไบต์เนื่องจาก367:7:737ค่อนข้างสั้นกว่า736696:7:737060เล็กน้อย

นี้จะแปลงจำนวนวันตั้งแต่01.01.0001, สตริงในรูปแบบที่มีต่อท้ายDD.mm.2017


1

Haskell , 133 130 ไบต์

import Data.Time.Calendar
((\[f,g,h,i,j]->i:j:'.':f:g:".2017\n").drop 5.show)=<<take 53(iterate(addDays 7)$fromGregorian 2017 1 1)

ลองออนไลน์!

หากไม่มีไลบรารีปฏิทิน148 144 140 ไบต์

(\l->last l!l++length l!l++"2017\n").fst.span(>0).(<$>scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]).(-)=<<[1,8..365]
a!_=['0'|a<=9]++show a++"."

นี้เป็นเรื่องตลกตั้งแต่ใช้ดำเนินการสำหรับการทำงาน padding บันทึกไบต์ที่สองแม้ว่าอาร์กิวเมนต์ที่สองไม่ได้ใช้เพราะวงเล็บน้อยที่มีความจำเป็น - มีความยาวมากกว่าp(last l) last l!lทำงานโดยการคำนวณday/monthคู่โดยลบวันที่เริ่มต้นเดือนสะสมออกจากวันของปี วันที่เริ่มต้นเดือนถูกบีบอัดเป็น ( scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]) จำนวนเดือนคือจำนวนองค์ประกอบที่เป็นบวกและจำนวนวันคือองค์ประกอบที่เป็นบวกสุดท้าย

ลองออนไลน์!


0

C #, 116 114 113 ไบต์

for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(‌​new DateTime(i).ToString("dd.MM.yyyy\n"));

สามารถทำงานในหน้าต่างโต้ตอบของ Visual Studio (หรือ C # REPL อื่น ๆ ตาม Roslyn)

ลงถึง 113 ไบต์: ต้องขอบคุณ Kevin Cruijssen


1
คุณสามารถเพิ่มลิงค์ TryItNow ได้ไหม นอกจากนี้คุณยังสามารถตีกอล์ฟได้ด้วยการใช้ for-loop แทน while-loop:for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
Kevin Cruijssen

@KevinCruijssen Unuckyaly ฉันไม่สามารถหาคอมไพเลอร์ที่เกี่ยวข้องในหน้าเว็บที่กำหนด นี่คือการเชื่อมโยงกับเทคโนโลยีที่ใช้ถ้าคุณต้องการที่จะได้รับในการติดต่อกับมันเชื่อมโยง อย่างไรก็ตามขอขอบคุณสำหรับลูปใหม่ :)
rmrm

1
ค่าเริ่มต้นของเราบอกว่าคุณควรมีฟังก์ชั่นหรือโปรแกรม (เช่นไม่ใช่ตัวอย่าง) และคุณจำเป็นต้องมีคุณสมบัติ Debug และ DateTime : ฉันขอแนะนำให้เพิ่มusing System;และใช้งานConsole.WriteLine(string)
VisualMelon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.