In tất cả các ngày chủ nhật năm 2017


27

In ngày của tất cả các ngày chủ nhật năm 2017 theo định dạng sau : dd.mm.yyyy.
Đầu ra dự kiến:

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
Có thể dupe của kế hoạch chủ nhật của bạn ? Đây là một năm cụ thể mặc dù.
xnor

1
Tôi đã kiểm tra Kế hoạch chủ nhật của bạn trước khi đăng, nhưng nó yêu cầu in chủ nhật trong một tháng nhất định. @xnor
ShinMigami13

1
Bất kỳ lý do cụ thể cho định dạng đầu ra cụ thể? Bạn có thể mở ra một chút.
Rɪᴋᴇʀ

4
Tôi thực sự thích điều này như một thách thức kolmogorov chính xác văn bản. Lấy đúng định dạng ngày có một số tối ưu hóa thú vị.
xnor

5
Dù sao, tôi nghĩ rằng các phiếu bầu chặt chẽ nên được rút lại.
Erik the Outgolfer

Câu trả lời:


16

Python 2 , 81 byte

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

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

Không có thư viện ngày, tính ngày trực tiếp. Thủ thuật chính là coi dd.mmgiá trị thập phân. Ví dụ: 16.04.2017(ngày 16 tháng 4) tương ứng với số 16.04. Con số này được in định dạng như xx.xxvới .2017nối.

Ngày và tháng được tính toán một cách hợp lý. Mỗi tuần thêm 7 ngày làm x+=7. Lấy xmodulo 30.99xử lý cuộn qua bằng cách trừ đi 30.99bất cứ khi nào số ngày quá lớn. Điều này kết hợp -31để thiết lập lại các ngày với +0.01để tăng tháng.

Rollover giả định mỗi tháng có 31 ngày. Các tháng có ít ngày hơn được điều chỉnh bằng cách giảm dần xlên trên các số tuần nhất định với +[8,8,8,17,25,38,47].count(x/7). Danh sách này là số tuần kết thúc vào những tháng ngắn ngủi này, 8tăng gấp ba lần vì tháng 2 ngắn hơn 3 ngày 31.

Danh sách này có thể được nén thành một chuỗi bằng cách lấy các giá trị ASCII cộng với 40. Có +40thể tránh sự dịch chuyển bằng cách sử dụng các ký tự không thể in được và có thể được truy cập ngắn hơn dưới dạng đối tượng byte trong Python 3.


Thật là một câu trả lời tuyệt vời! '888z!}+'.count(chr(x%146))tiết kiệm một byte.
Lynn

10

PHP, 48 byte

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

PHP, 46 byte (đối với offset UTC không âm)

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

1
Có nên gmdateđể an toàn cho múi giờ? Nó thất bại trên onlinephpfifts.com. Công việc tuyệt vời trong tất cả các khía cạnh khác!
Tít

9

Python 2 , 90 79 byte

-5 byte với sự trợ giúp của xnor (tránh tự đếm số tuần)
-1 byte nhờ xnor (thêm lại vào e với giá 605000 là 605e3)

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

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

0giây kể từ kỷ nguyên là 00:00:00 ngày 1 tháng 1 năm 1970, giống như năm 2017 không phải là một năm nhuận. 605000giây là 1 tuần, 3 phút, 20 giây. Thêm 52 trong số "tuần" này không đưa chúng ta quá nửa đêm.


Đây là một cách ngắn hơn để tạo ra sự tiến triển số học.
xnor

@xnor Cảm ơn, tôi đã làm việc với cùng một thứ và đang cố gắng hạ thấp, nhưng 81 dường như rất phù hợp với cách tiếp cận thư viện.
Jonathan Allan

@xnor ... hay không.
Jonathan Allan

1
Tốt đẹp! Số lượng có thể được 605e3. Tôi có một số ý tưởng mặc dù :)
xnor

7

Bash + coreutils, 44 byte

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

có thể lưu 2 byte -unếu giả sử GMT

  • Cảm ơn Digital Trauma chỉ ra -fparamter dategiúp tiết kiệm 10 byte;
  • Và sử dụng 2017 trong chuỗi định dạng sẽ tiết kiệm được nhiều byte hơn, đó là ý tưởng từ câu trả lời được đưa ra bởi user63956

  • @0 là 1970-1-1
  • 605000là một tuần ( 604800) cộng thêm 200 giây
    • 200 giây. chỉ nên làm việc vì chỉ có 52 tuần trong một năm
  • @32000000 chỉ hơn một năm

seq -f@%1.f 14833e5 605e3 1515e6|date -uf- +%d.%m.%Ygiúp bạn tiết kiệm 10 byte. Bạn có lẽ nên yêu cầu điều này như Bash + coreutils , mặc dù.
Chấn thương kỹ thuật số

7

PowerShell, 51 47

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

Khá đơn giản. 2017-01-01 là Chủ nhật, cứ sau bảy ngày. Chúng ta có thể lưu hai byte nếu chúng ta chỉ cần tập lệnh hoạt động trong đời:

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

1
Bạn có thể lưu một vài byte nếu bạn, thay vì một chuỗi, thêm một số đại diện cho số ngày, nghĩa là (date 2017-1-1)+7.*$_. Xem câu trả lời này
Danko Durbić

@ DankoDurbić: Ồ, wow. Tôi chỉ biết thêm intdấu tick và chuỗi trong nhiều ngày cho đến nay. Rất vui được biết.
Joey

5

Excel VBA 106 91 79 byte

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

đã lưu 15 byte nhờ @Radhato

Giả sử 1/1/2017 là Chủ nhật, nó sẽ tiết kiệm thêm 12 byte.

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

Cảm ơn @Tooth Brush 66 byte

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

Chỉnh sửa: (Không cần Sub và End Sub) 52 byte

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

Có thể được cải thiện bằng cách chanching For i = 42736 To 43100 to For i = # 1/1/2017 # To #
12/31/2017

@Radhato nhưng sẽ không tăng kích thước byte?
Rohan

Tôi nghĩ rằng nó giảm xuống còn 96 .. ít nhất đó là những gì tôi đã đếm lol
Radhato

Có nó đã làm. Cảm ơn
Rohan

1
@newguy Sub p:For i=#1/1/2017# To #12/31/2017#:MsgBox i:i=i+6:Next:End Sublà mã VBA hoàn toàn hợp lệ và chỉ có 66 byte. Việc VBA Editor bổ sung thêm không gian là không liên quan.
Bàn chải đánh răng

4

PHP, 67 byte

Sử dụng thực tế PHP tự động gán giá trị 1 cho các biến vòng lặp không được khai báo và sử dụng thời gian kỷ nguyên của Linux,

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

Chào mừng đến với PPCG! Tôi tin rằng điều này có thể được tính là 59 byte (mặc dù bản thân tôi không chơi golf trong PHP).
Jonathan Allan

4
<?for(;54>++$t;)echo date("d.m.Y\n",605e3*$t+148263e4);nên ổn thôi
tsh

2
Luôn luôn tốt đẹp để xem một số golf thủ PHP mới! Bạn được phép sử dụng php -r, do đó bạn không cần <?php?>và do đó có thể đếm này là 59 bytesnhư @JonathanAllan nói một cách chính xác. Bạn không cần dấu ngoặc xung quanh $t. Một vài Tất chơi gôn khác và bạn kết thúc với for(;++$t<54;)echo date("d.m.Y\n",605e3*$t+14827e5);cho 51 bytes(theo múi giờ của tôi). Bạn có thể thay thế "\ n" bằng ngắt dòng thực chỉ có 1 byte do đó là 51 byte.
Christoph

1
Cảm ơn @Christoph Tôi đang thử một cách tiếp cận khác, sẽ sớm cập nhật
ShinMigami13

Ngoài tất cả các gợi ý khác, bạn có thể muốn sử dụng gmdatethay vì datean toàn múi giờ.
Tít

4

k6, 32 byte

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

Giải thích ngắn gọn:

                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

Than ôi, điều này dường như chỉ hoạt động trong trình thông dịch nguồn đóng, theo yêu cầu.

Chạy lệnh trong trình thông dịch nguồn đóng.


4

Pyke , 26 24 byte

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

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

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

Hoặc 11 byte

Nếu được phép bỏ qua định dạng đầu ra

y17y"52VDs6

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

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 byte

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

Đầu tiên của tháng một là chủ nhật, đoạn trích này tạo ra một chuỗi ngày, cứ sau 7 ngày bắt đầu từ ngày 01-01-2017 đến ngày 31-12-2017, định dạng chúng theo định dạng mong muốn và in chúng.


Điều này sẽ đưa nó xuống còn 41 byteprint(as.Date("2017-01-01")+seq(7,365,7))
đếm

@count Cảm ơn nhưng nó sẽ không in đầu ra cần thiết (ví dụ: "2017.01.01" thay vì "2017/01/01")
plannapus

3

Befunge-98 (PyFunge) , 99 95 93 85 byte, Lá thư mới

Tất cả các tối ưu hóa được thực hiện bởi @JoKing rất nhiều nhờ chúng

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

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

Tôi cảm thấy như chúng ta đã bỏ lỡ một số bí truyền ở đây vì vậy tôi đã thực hiện một giải pháp bằng ngôn ngữ Esosteric yêu thích của mình.

Giải thích : Mã
>8><><>><><>hóa độ dài của 12 tháng
sLưu trữ ngày cũ vào chỗ trống
:1g2/Lấy giá trị ASCII từ hàng dưới cùng và chia cho hai số này cho chúng ta độ dài của một tháng nhất định Ex: 8 = 56 trong ASCII => 56 / 2 = 28 => Tháng (tháng 2) có 28 ngày
10g\%Lấy ngày đã lưu trước đó và sửa đổi nó theo độ dài của tháng cho phép chúng tôi chuyển ngày sang tháng tiếp theo
:d1pLưu bản sao của ngày cập nhật mới
10g\`+Kiểm tra nếu ngày cũ > ngày mới => chúng tôi đã chuyển sang tháng tiếp theo => thêm 1 vào bộ đếm tháng
:b`Kiểm tra nếu bộ đếm tháng> 11 có nghĩa là chúng tôi đã đạt đến cuối năm (sử dụng lập chỉ mục 0)
#@_Dựa trên trước đó nếu kết thúc chương trình, hãy bỏ qua chương trình tiếp theo insctrtion (duh)
:1\0d1g Sắp xếp lại ngăn xếp vì vậy nó trông như thế này:Month, 1, Month, 0, Day
#
1+:a/'0+,a%'0+,'., Chuyển đổi số thành 1 lập chỉ mục, in, thêm a .ở cuối
j;Sử dụng 0 từ ngăn xếp để không nhảy và sử dụng ;để đi đến lịch in một lần nữa sau đó sử dụng 1 để nhảy qua ;tiếp theo thời gian
a"7102"4k,In 2017\n
d1gNhận lại giá trị ngày 7+Thêm một tuần trước khi lặp lại


@JoKing Omc như một sự tối ưu hóa rõ ràng! Làm thế nào tôi có thể bỏ lỡ cái đó? Cảm ơn bạn.
IQuick 143

1
Một vài byte nữa tắt. Hãy thử trực tuyến! Thay vào đó, một từ thay đổi bước nhảy -17 sang một nhận xét, một từ sử dụng lập chỉ mục dựa trên 0 cho bộ đếm tháng và một từ thay đổi nó thành một lớp lót
Jo King

@JoKing Wow đó là rất nhiều golf bạn đã làm ở đó. Hãy thêm nó vào câu trả lời.
IQuick 143

1
Chết tiệt, tại sao không làm cho ngày 0 được lập chỉ mục là tốt, và tiết kiệm phải thực hiện bất kỳ khởi tạo nào cả! 85 byte
Jo King

3

JavaScript, 111 106 byte

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

Lưu ý: Bảng điều khiển của Stack Exchange không đủ dài để hiển thị toàn bộ danh sách, vì vậy đây là nửa đầu dưới dạng một đoạn riêng biệt:

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

Định dạng tùy chỉnh có giá 40 byte ...


2

Perl 5 , 64 byte

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

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

Nhiệm vụ được giao là năm 2017, không phải năm nào, vì vậy tôi đã mã hóa vào:

  • 117 (tương đương cho năm 2017, 1900 + 117)
  • +1 vì ngày 1 tháng 1 là chủ nhật năm 2017
  • 0..52 vì năm 2017 có 53 chủ nhật

POSIX là một mô-đun lõi và luôn được cài đặt với Perl5. Làm tương tự mà không sử dụng các mô-đun trong 101 byte, loại bỏ khoảng trắng:

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

2

Ruby, 75 byte

Giải pháp đơn giản để tìm ra ngày với Time.

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

1
Nếu bạn thêm cả tuần (604800 giây), thì bạn không cần kiểm tra chủ nhật, chỉ cần lặp lại 53 lần.
GB

1
Nếu bạn thực hiện thủ thuật được đề xuất bởi @GB và không còn kiểm tra vào Chủ nhật, bạn cũng có thể khởi tạo với t=Time.new 1và sau đó thực hiện t.strftime"%d.%m.2017"cho -1 byte.
Mực giá trị

2

SAS, 52 50 byte

Đã lưu 2 byte nhờ @ user3490.

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

Bạn không cần chỉ định một tập dữ liệu - chỉ cần sử dụng data;thay vì data c;và tiết kiệm 2 byte. Tôi nghĩ rằng bạn cần một run;mặc dù.
user3490

@ user3490 Cảm ơn, tôi không biết điều đó. Tôi đoán đó là tương đương với data _null_? Ngoài ra, runtuyên bố được ngụ ý nếu nó bị thiếu.
J_Lard

Không hoàn toàn tương đương - bạn kết thúc với một bộ dữ liệu đầu ra theo datanquy ước đặt tên.
user3490

2

Toán học 90 84 byte

Khá dài dòng. numbermaniac và Scott Milner lần lượt lưu 5 và 1 byte.

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

Bạn có cần Most@? Đầu ra dường như giống hệt nhau mà không có nó.
numbermaniac

1
@numbermaniac, Cảm ơn. Mostđã ở đó để tránh Chủ nhật đầu tiên vào năm 2018. Ban đầu tôi đã kiểm tra mã, mà không Most, trong nhiều năm, 2011, 2012, trong trường hợp đó, Chủ nhật đầu tiên vào năm 2012 được đưa vào đầu ra. (Đó là lý do tại sao tôi đưa nó vào mã.) Thật kỳ lạ, Mostkhông cần thiết cho năm 2017-18. Cũng không Mostcó bất kỳ ảnh hưởng rõ ràng đến kết quả. Bí ẩn!
DavidC

1

VBA, 81 byte (có thể là 64)

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

Bài viết đầu tiên của tôi. Dựa trên giải pháp của newguy bằng cách xóa séc cho các ngày trong tuần và chỉ cần chỉ định mỗi ngày thứ 7. Loại bỏ các ngày tiết kiệm 12 byte một mảnh. 42736 là 1/1/2017. Định dạng ngày đầu ra phụ thuộc vào cài đặt hệ thống. Điều đó có được phép không? Nếu vậy, đó là 64 byte vì bạn không cần phương thức định dạng .

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

Bạn cũng có thể loại bỏ rất nhiều khoảng trắng được tự động định dạng. Ví dụ, For i=0To 52Format(42736+i*7,"dd.mm.yyyy"). Ngoài ra, bạn chỉ có thể sử dụng Nextthay vì Next i.
Kỹ sư Toast

1

AHK , 67 byte

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

Không có gì kỳ diệu xảy ra ở đây. Tôi đã cố gắng tìm một phương tiện ngắn hơn FormatTime nhưng tôi đã thất bại.


1

Java 8+, 104 100 99 byte

()->{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 byte

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

Sử dụng các khả năng ngày của printfđịnh dạng.

Tự kiểm tra!

Tiết kiệm

  1. 104 -> 100: thay đổi giá trị vòng lặp và bội số.
  2. 100 -> 99: đánh gôn

1

T-SQL, 94 byte

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

nếu bạn không thích SQL GOTO hoặc WHILE, đây là giải pháp CTE 122 byte

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

giải pháp đầu tiên của bạn bắt đầu lúc 08.01.2017không01.01.2017
lấy

1
Thủ thuật rất tốt trong giải pháp của bạn. Làm tốt lắm. Tôi không thể cưỡng lại việc mượn chúng. ;)
AXMIM

1

Ruby, 60 + 7 = 67 byte

Sử dụng -rdatecờ.

(d=Date.new 1).step(d+365,7){|d|puts d.strftime"%d.%m.2017"}

1

Groovy, 81 77 63 60 56 byte

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

Ở trên có thể được chạy như kịch bản Groovy.

Mã golf đầu tiên của tôi nhập cảnh. May mắn thay, năm 1970 không phải là năm nhuận, do đó có thể sử dụng nó làm căn cứ.

Cảm ơn Dennis, đây là: Hãy thử trực tuyến!


Chào mừng bạn đến với Câu đố lập trình & Code Golf! Trong trường hợp bạn quan tâm, đây là một permalink: Hãy thử trực tuyến!
Dennis

Cảm ơn bạn @Dennis Tôi không biết điều này đã tồn tại :)
Krystian

Bạn có thể lưu bốn byte bằng cách di chuyển ngày trong khối thời gian 53.times{printf('%td.%<tm.2017%n',new Date(0)+it*7)}, 52 byte. Bảo vệ danh dự của
Groov

1

C #, 138 111 102 byte

Đã lưu thêm 9 byte nhờ Johan du Toit !

Đã lưu 27 byte nhờ đề xuất của Kevin Cruijssen !

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

Chức năng ẩn danh in tất cả các ngày chủ nhật năm 2017.

Chương trình đầy đủ với phương pháp vô căn cứ:

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
Nó không dễ sử dụng hơn .AddDays(7*i++)sao? Sau đó, không cần .DayOfWeek<1kiểm tra. Chúng tôi biết 01-01-2017 là Chủ nhật, và từ đó chúng tôi chỉ có thể tiếp tục thêm 7 ngày.
Kevin Cruijssen

2
Không chắc chắn về điều này - trong tất cả các môn đánh gôn tôi tham gia, tôi luôn sử dụng không gian tên hoàn chỉnh - nhưng bạn không thiếu một số Systems trong đó - System.DateTimeSystem.Console.Write?
auhmaan

Thật tuyệt nhưng bạn có thể lưu một vài byte:()=>{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: Có, nên sử dụng không gian tên đầy đủ hoặc các usingcâu lệnh nên được bao gồm trong số byte.
raznagul

3
@adrianmp: Các usingcâu lệnh cần thiết để chạy mã phải được tính. Xem câu hỏi Meta này: Tôi có cần sử dụng nhập khẩu hay tôi có thể gọi một lớp khám phá?
raznagul

1

C #, 110 109 byte

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

Bạn có thể thưởng thức chương trình này trực tuyến tại đây

Trong phần này, chúng tôi:

  • Sử dụng Ngày tự động hóa OLE (OADate) để tránh "AddDay ()" từ datetime.
    FromOADate()có vẻ lớn nhưng nó bằngnew DateTime(2017,1,1)

  • Bắt đầu vòng lặp vào chủ nhật cuối cùng của năm 2016. để cho phép chúng tôi tăng chỉ với toán tử +=. Toán tử này trả về giá trị sau khi gia tăng được thực hiện.

  • Tăng thêm 7 ngày để chuyển từ chủ nhật sang chủ nhật trước khi in ngày.

  • Chúng tôi dừng lại khi chủ nhật cuối cùng của năm 2017 đã bị tấn công.

  • Sử dụng Debugthay vì Consoleđể lưu hai ký tự

  • Tránh có khai báo và gán biến rõ ràng


Trừ khi có quy định khác, mặc định của chúng tôi nói rằng bạn nên cung cấp một chức năng hoặc chương trình (không phải là đoạn trích) và bạn cần đủ điều kiện gỡ lỗi và DateTime : Tôi khuyên bạn nên thêm using System;và chuyển sang Consoletừ Debug(chính là một cách tinh ranh, nhưng tôi có thể Không tìm thấy bất kỳ bình luận nào về meta liên quan đến nó).
VisualMelon

1
@VisualMelon tôi đã tuân thủ "cung cấp một chức năng" và tôi cũng đã thay thế Debugcho Consoletừ Debugđòi hỏi cụ thể bao gồm. Tuy nhiên, tôi đã không tuân thủ 'hệ thống sử dụng' vì đối thủ của tôi trong ngôn ngữ này không làm điều đó. Ngoài ra, bạn không thể mã bên ngoài một lớp mà chính nó được yêu cầu phải được xác định trong một không gian tên. Tôi khá chắc chắn rằng hầu hết câu trả lời c # trên trang web này không bao gồm điều đó. Vì vậy, những gì bây giờ, chúng ta ném tất cả những câu trả lời vào thùng rác? Chúng ta có hạ bệ tất cả để buộc họ tuân thủ không? Nếu vậy, cộng đồng cũng có thể cấm hoàn toàn c # từ codegolf.
AXMIM

Những "quy tắc" này chỉ là những gì cộng đồng đã giải quyết theo thời gian (và được ghi lại trên meta). Chúng tôi không downvote câu trả lời, chúng tôi nhận xét và không upvote chúng. Khi họ sửa chúng, chúng tôi có thể tự do nâng cấp. Cả hai câu trả lời C # khác đều có ý kiến ​​cho thấy họ nên thêm usingchỉ thị hoặc đủ điều kiện về các phương pháp và loại, vui lòng không sử dụng bất kỳ nội dung nào trong số này. Tôi là một người chơi C # lâu năm và tôi đánh giá cao các quy tắc có vẻ độc đoán, vì vậy tôi thích thúc đẩy mọi người đi đúng hướng khi tôi có thể. Tôi đặc biệt 'nhắm mục tiêu' câu trả lời C # vì tôi được thông báo tương đối rõ về vấn đề này.
VisualMelon

1
@VisualMelon Đủ rồi, dù sao tôi cũng chỉ là người qua đường. Vì vậy, tôi sẽ chấp nhận quy tắc của bạn trong khi tôi ở đây. Do đó, tôi đã cố gắng làm cho câu trả lời của mình tuân thủ lần này.
AXMIM

1
Co vẻ tôt vơi tôi! +1 cho cách tiếp cận ban đầu. Và bạn không cần khoảng trống sau using System;(tôi cho rằng điều đó không cố ý) nên đó là 109 byte.
VisualMelon

1

TSQL, 112 105 byte

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

Bản giới thiệu

Cú pháp chuyển đổi T-SQL


Bạn có thể lưu 2 byte bằng cách thay thế DAYbằng d. Nó làm như vậy.
AXMIM

+1 Bạn có thể lưu thêm 3 byte bằng cách thay thế '20170101'bằng 42734. Ngày tháng là số. Thời gian là phần thập phân của số.
AXMIM

1

JavaScript (ES6), 123 byte

Đây là bài viết đầu tiên của tôi ở đây, xin chào!

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)})

Giải pháp này sử dụng dữ liệu được mã hóa cứng và được thiết kế để hoạt động cụ thể cho năm 2017. Nó không phụ thuộc vào API ngày / giờ.

Đối với các chữ số trong chuỗi 155274263153, mỗi chữ số là một số riêng và biểu thị Chủ nhật đầu tiên của mỗi tháng liên tiếp. Đầu ra cho cả năm có thể được tạo ra bằng cách liên tiếp thêm 7 vào đó.

Còn số ma thuật 2633, được sử dụng trong vòng lặp thì sao?
Chà ... 2633(thập phân) là 101001001001ở dạng nhị phân. Bây giờ những gì có thể có 1nghĩa là gì? Bắt đầu từ bên phải, bit thứ 1, 4, 7, 10 và 12 được đặt. Điều này tương ứng với những tháng xảy ra có năm Chủ nhật, trái ngược với những tháng chỉ có bốn. Nhìn xuống biểu hiện gọn gàng này, ban đầu nó trông như thế này : for(j=0;j<4+ +[0,3,6,9,11].includes(i);j++).

Tôi đoán các phần còn lại là khá tự giải thích.


@SIGSEGV: Tôi không ngại đổi ECMAScript 2015sang Javascript (ES6), nhưng ... bạn đã phá mã của tôi và tôi phải hoàn nguyên nó.
tê giác

Ồ, đó là sự đồng thuận của cộng đồng, chỉ cho phép phần lambda.
Matthew Roh

@SIGSEGV Đây không phải là trường hợp ở đây. Lambda này chỉ chứa một phần nhỏ của mã và tôi cần mã định danh đó để có thể sử dụng nó ở nơi khác. Không có a=mã thực sự bị hỏng .
tê giác

1

T-SQL, 79 77 byte

Sau khi giúp Salman A cải thiện câu trả lời của mình . Tôi quyết định tự viết bằng cách sử dụng một vòng lặp và PRINT.

Tôi đã kết thúc với giải pháp 90 byte này.

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

Sau đó, tôi đã xem xét nhà lãnh đạo hiện tại trong T-SQL, có 94 byte từ WORNG ALL với câu trả lời này . Anh chàng này đã tìm thấy thủ đoạn rất tốt.

  1. Chỉ đặt tên biến @
  2. Lặp lại với GOTOthay vì LOOP thực tế
  3. Lưu một ký tự bằng cách sử dụng FORMATthay vì CONVERT. (Chỉ SSMS2012)

Sử dụng các thủ thuật này, giải pháp này đã được cắt giảm thành giải pháp bên dưới là 79 byte.

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

Bạn có thể lưu 2 byte bằng cách thay đổi @ = @ + 7 thành @ + = 7 và bằng cách xóa khoảng trắng giữa 7 và IF.
LÀM VIỆC TẤT CẢ

Trong bài viết này là nơi tôi có tất cả các thủ thuật, có thể giúp bạn quá.
LÀM VIỆC TẤT CẢ

1
@WORNGALL tuyệt vời, tôi không biết chúng ta có thể làm điều đó. Cảm ơn rất nhiều.
AXMIM

1

Octave , 37 byte

Ngắn hơn rất nhiều so với tất cả các ngôn ngữ không chơi gôn khác, và thậm chí nó còn gắn liền với Jelly! Con đường để đi Octave! :)

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

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

May mắn thay, năm 2 ADtrông giống hệt như năm 2017 AD. Cả hai bắt đầu và kết thúc vào Chủ nhật, và cũng không phải là một năm nhuận. Điều này tiết kiệm rất nhiều byte, vì 367:7:737nó khá ngắn hơn một chút 736696:7:737060.

Điều này chuyển đổi số ngày kể từ khi 01.01.0001, thành một chuỗi trên định dạng DD.mm, với một dấu .2017.


1

Haskell , 133 130 byte

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)

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

Không có thư viện lịch, 148 144 140 byte

(\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++"."

Điều này thật buồn cười vì sử dụng một toán tử cho chức năng đệm sẽ tiết kiệm hai byte mặc dù đối số thứ hai không được sử dụng, bởi vì cần ít dấu ngoặc đơn hơn - p(last l)dài hơn last l!l. Hoạt động bằng cách tính toán day/monthcác cặp bằng cách trừ ngày bắt đầu tích lũy của tháng kể từ ngày trong năm. Ngày bắt đầu tháng được nén là ( scanl((+).(+28))0[3,0,3,2,3,2,3,3,2,3,2]). Số tháng là số phần tử dương và số ngày là phần tử dương cuối cùng.

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


0

C #, 116 114 113 byte

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

Có thể chạy trong các cửa sổ tương tác của Visual Studio (hoặc bất kỳ C # REPL nào khác dựa trên Roslyn)

Xuống tới 113 byte: nhờ Kevin Cruijssen.


1
Bạn có thể thêm một liên kết TryItNow không? Ngoài ra, bạn có thể chơi gôn một chút bằng cách sử dụng vòng lặp thay vì vòng lặp while:for(long i=(long)636188256e9;i<636502857e9;i+=(long)605e10)Out.Write(new DateTime(i).ToString("dd.MM.yyyy\n"));
Kevin Cruijssen

@KevinCruijssen Unfortunaly Tôi không thể tìm thấy trình biên dịch áp dụng trên trang đã cho. Đây là một liên kết đến công nghệ được sử dụng nếu bạn muốn liên lạc với nó: liên kết . Dù sao cũng cảm ơn vì vòng lặp mới. :)
rmrm

1
Trừ khi có quy định khác, mặc định của chúng tôi nói rằng bạn nên cung cấp chức năng hoặc chương trình (không phải là đoạn trích) và bạn cần đủ điều kiện Gỡ lỗi và DateTime : Tôi khuyên bạn nên thêm using System;và sử dụngConsole.WriteLine(string)
VisualMelon
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.