Hôm nay là trung tâm


36

Đưa ra một ngày làm đầu vào ở bất kỳ định dạng thuận tiện nào, xuất lịch với ngày đó là trung tâm chính xác của cửa sổ năm tuần. Tiêu đề của lịch phải bao gồm các chữ viết tắt hai chữ cái cho các ngày trong tuần (nghĩa là Su Mo Tu We Th Fr Sa). Ba chữ cái hoặc viết tắt khác của ngày không được phép.

Ví dụ, được đưa ra April 2 2019làm đầu vào, đầu ra phải là

Sa Su Mo Tu We Th Fr
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31  1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19

sao cho ngày đã cho là giữa chính xác của lịch.

Cho February 19 2020, đầu ra

Su Mo Tu We Th Fr Sa
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
 1  2  3  4  5  6  7

Đối với September 14 1752, hiển thị như sau:

Mo Tu We Th Fr Sa Su
28 29 30 31  1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  1

  • Đầu vào và đầu ra có thể được đưa ra bởi bất kỳ phương pháp thuận tiện .
  • Đầu vào được đảm bảo không trống và hợp lệ (nghĩa là bạn sẽ không bao giờ nhận được ""hoặc Feb 31v.v.).
  • Giả sử lịch Gregorian cho tất cả các ngày.
  • Năm nhuận phải được tính.
  • Ngày đầu vào sẽ dao động từ Jan 1 1600đến Dec 31 2500.
  • Bạn có thể in nó sang STDOUT hoặc trả lại dưới dạng kết quả chức năng.
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận.
  • Bất kỳ số lượng khoảng trắng ngoại lai nào cũng được chấp nhận, miễn là các ký tự xếp hàng một cách thích hợp.
  • Các số 0 đứng đầu trong các ngày có một chữ số được cho phép, cũng như sắp xếp các ngày một chữ số được căn trái.
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là vì vậy tất cả các quy tắc chơi gôn thông thường đều được áp dụng và mã ngắn nhất (tính bằng byte) sẽ thắng.

Câu trả lời:


12

R , 77 72 byte

function(d,`~`=format)write(c(strtrim(d+-3:3~"%a",2),d+-17:17~"%e"),1,7)

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

Đã sửa lỗi đầu ra để sử dụng 2 chữ cái viết tắt ngày.

-1 byte sử dụng strtrimnhờ Aaron Hayman .

Số ngày đệm với số 0 đứng đầu; lấy đầu vào là một Date, có thể được tạo bằng cách sử dụng as.Date("YYYY/MM/DD").

Thật ngắn gọn cho một câu trả lời R ...


8

05AB1E , 175 174 172 171 160 byte

¦WΘ1š-1šVтFY`2ô0Kθ4ÖUD2Qi\28X+ë<7%É31α}‹iY¬>0ëY1¾ǝDÅsD12‹i>1ë\1Dǝ¤>2}}ǝVY})DJIJk18+£35.£¬.•4ιõ÷‡o‹ƶ¸•2ôs`UÐ3‹12*+>13*5÷s3‹Xα©т%D4÷®т÷©4÷®·()DćsćsO7%._s€нT‰J«7ô»

Nhập theo định dạng [day, month, year]. Đầu ra với 0s hàng đầu cho các ngày có một chữ số và chữ thường mothông qua su(có thể thêm byte 1 nếu bắt buộc là Titlecase).

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Holy shit .. Đây có thể là bản ghi mới của tôi cho câu trả lời dài nhất 05AB1E, và sau đó tôi bao gồm một số thử thách rất phức tạp tôi đã làm ...>.> EDIT: Hmm ok, gần như ..; p

Lưu ý quan trọng: 05AB1E không có bất kỳ nội dung nào cho các đối tượng hoặc tính toán Ngày. Nội dung duy nhất liên quan đến ngày mà nó có là năm / tháng / ngày / giờ / phút / giây / giây / giây.

Do đó, gần như tất cả các mã bạn thấy là các tính toán thủ công để tính toán các ngày trước và ngày tiếp theo (bao gồm cả chuyển đổi qua các năm và ghi nhớ các năm nhuận) và tính toán ngày trong tuần bằng cách sử dụng đồng quy của Zeller .

Phần lớn của mã được sao chép từ câu trả lời 05AB1E trước đó của tôi , cũng sẽ có liên quan để giải thích bên dưới.

Giải trình:

Chúng tôi bắt đầu bằng cách đi đến ngày đầu tiên của tháng trước:

¦          # Remove the first item (the days) from the (implicit) input
 W         # Get the minimum (without popping the list itself)
           # (since the year is guaranteed to be above 1599, this is the month)
  Θ        # Check if its exactly 1 (1 if 1, 0 if in the range [2,31])
   1š      # Prepend a 1 as list (so we now have either [1,1] or [1,0]
     -     # Subtract this from the month and year
      1š   # And prepend a 1 for the day
        V  # Pop and store this first day of the previous month in variable `Y`

Sau đó, tôi sử dụng ngày đó làm ngày bắt đầu và tính 100 ngày tiếp theo:

тF    # Loop 100 times:
  Y`2ô0Kθ4ÖUD2Qi\28X+ë<731α}‹iY¬>0ëY1¾ǝDÅsD12i>1ë\1Dǝ¤>2}}ǝV
      #  Calculate the next day in line
      #  (see the linked challenge above for a detailed explanation of this)
   Y  #  And leave it on the stack
 })   # After the loop: wrap the entire stack into a list, which contains our 100 days

Sau đó, với ngày đầu vào là giữa, tôi chỉ để lại 17 trước và 17 sau ngày đầu vào đó từ danh sách:

DJ          # Duplicate the 100 dates, and join the day/month/year together to strings
  IJ        # Push the input, also joined together
    k       # Get the 0-based index of the input in this list
            # (the joins are necessary, because indexing doesn't work for 2D lists)
     18+    # Add 18 to this index (18 instead of 17, because the index is 0-based)
        £   # Only leave the first index+18 items from the 100 dates
     35.£   # Then only leave the last 35 items

Bây giờ chúng tôi có 35 ngày của chúng tôi. Bước tiếp theo là tính ngày trong tuần và tạo tiêu đề của bảng đầu ra:

¬                # Get the first date of the list (without popping the list itself)
 .•4ιõ÷‡o‹ƶ¸•    # Push compressed string "sasumotuwethfr"
             2ô  # Split it into chunks of size 2
s                # Swap to get the first date again
 `UÐ312*+>13*5÷s3Xα©т%D4÷®т÷©4÷®·()DćsćsO7%
                 # Calculate the day of the week (sa=0; su=1; ...; fr=6)
                 # (see the linked challenge above for a detailed explanation of this)
  ._             # Rotate the list of strings that many times

Xem 05AB1E mẹo này của tôi (phần Làm thế nào để chuỗi nén không nằm trong từ điển? ) Để hiểu tại sao .•4ιõ÷‡o‹ƶ¸•"sasumotuwethfr".

Sau đó, chúng tôi tạo các ngày để điền vào bảng dựa trên danh sách ngày được tạo trước đó của chúng tôi. Mà chúng ta sẽ hợp nhất với tiêu đề. Sau đó chúng ta có thể in kết quả cuối cùng:

s           # Swap to get the list of dates again
 €н         # Only leave the first item of each date (the days)
   T       # Take the divmod 10 of each
     J      # Join those divmod results together
            # (we now have leading 0s for single-digit days)
      «     # Merge this list together with the header list
       7ô   # Split it into chunks of size 7
         »  # Join each inner list by spaces, and then each string by newlines
            # (and output the result implicitly)

2
Đó là một khối lượng công việc khổng lồ!
Luis Mendo

2
Vâng, Java đánh bại 05AB1E! : D Lần đầu tiên, tôi đoán ;-)
Olivier Grégoire

@LuisMendo Hầu hết đã được thực hiện lần trước với thử thách được liên kết, nhưng vâng, đó là rất nhiều công việc ..;) Giải thích đã được thêm btw.
Kevin Cruijssen

@ OlivierGrégoire Bây giờ chúng ta cùng tạm biệt. ;)
Kevin Cruijssen

@ OlivierGrégoire Và bây giờ nó lại thấp hơn, xin lỗi. ; p
Kevin Cruijssen

6

JavaScript (ES6),  141  126 byte

Đã lưu 15 byte bằng cách mượn .toUTCString().slice(0,2)từ câu trả lời của Neil

Đưa đầu vào dưới dạng đối tượng Ngày.

f=(d,n=0)=>n<42?(D=new Date(d-864e5*(24-n)),n<7?D.toUTCString().slice(0,2):(i=D.getDate())>9?i:' '+i)+`
 `[++n%7&&1]+f(d,n):''

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


Huh, tôi có thể đã thề rằng mã của tôi đã thất bại trong trường hợp thử nghiệm thứ ba khi ban đầu tôi viết nó ... điều đó giúp tôi tiết kiệm được 52 byte ...
Neil

4

JavaScript (Node.js) , 205 152 145 byte

f=
d=>`012345`.replace(g=/./g,r=>`0123456
`.replace(g,c=>`${new Date(d-864e5*(24-c-r*7))[+r?`getUTCDate`:`toUTCString`]()}`.slice(0,2).padStart(3)))
<input type=date oninput=o.textContent=f(this.valueAsDate)><pre id=o>

Hãy thử trực tuyến! Đưa đầu vào dưới dạng đối tượng Ngày JavaScript hoặc dấu thời gian. Chỉnh sửa: Đã lưu 1 byte nhờ @EmbodimentofIgnorance, sau đó cho phép tôi lưu thêm 7 byte bằng cách thêm một dòng mới vào đầu ra. Đã lưu 52 byte khi tôi phát hiện ra rằng tôi đang xử lý hành vi không thực sự có lỗi ở nơi đầu tiên ...


padStart(2)-> padStart(3), xóa khoảng trắng trong chuỗi tham gia cho -1 byte
Hiện thân của sự thiếu hiểu biết



2

Ngôn ngữ Wolfram (Mathicala) , 123 byte

(s=#;Grid@Join[{StringTake[ToString@DayName[s~d~#]&/@Range[-3,3],2]},Partition[Last@d[s,#]&/@Range[-17,17],7]])&
d=DatePlus

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

Tôi không biết tại sao Gridkhông hoạt động trên TIO nhưng mã này tạo ra điều này

nhập mô tả hình ảnh ở đây

@DavidC đã lưu 1 byte


Có lẽ Gridkhông hoạt động vì TIO không thể căn giữa các mục như trong ảnh của bạn?
admBorkBork

@AdmBorkBork Có một cách để tải đồ họa như thế này trong TIO. Ai đó đã cho tôi thấy năm ngoái tôi nghĩ. Nhưng tôi không thể nhớ làm thế nào để làm điều đó ... Vì vậy, nếu có ai biết, hãy cho chúng tôi biết!
J42161217

2

MATL , 34 33 31 byte

YO-17:17+t7:)8XOO3Z(!1ew7XOU7e!

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

Giải trình

YO       % Implicit input. Convert to date number. This is a single number
         % that specifies the date
-17:17   % Push [-17 -16 ... 16 17]
+        % Add to date number, element-wise. This gives a row vector of 35
         % date numbers centered around the input date
t        % Duplicate
7:       % Push [1 2 ... 7]
)        % Index into the 35-element vector. This keeps the first 7 entries
8XO      % Convert to day-of-week in 3 letters. Gives a 3-col char matrix
O3Z(     % Write char 0 (equivalent to space for display purposes) into the
         % 3rd column
!1e      % Tranpose and linearize into a row. This produces a string such as
         % 'Tu We Th Fr Sa Su Mo ', to be used as column headings
w        % Swap. This brings to top the row vector of 35 date numbers
         % computed from the input
7XO      % Convert to day-of-month. Gives a 2-col char matrix
U        % Convert each row to number
7e!      % Reshape into 7-row matrix and transpose
         % Implicit display. This prints the string with the headings and
         % the matrix. The latter has a minimum-one-space separation between
         % columns, so it is aligned with the headings

2

Java (JDK) , 149 byte

d->{d.add(5,-24);for(int i=0,w;i<42;d.add(5,1))System.out.printf("%c%2s",i%7<1?10:32,i++<7?"SaSuMoTuWeThFr".substring(w=d.get(7)%7*2,w+2):d.get(5));}

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

Tín dụng



1
@KevinCruijssen Chờ ... cái gì? Tôi chúc mừng bạn! Tôi đã cố gắng để làm điều này, nhưng không thể tìm ra cách để làm điều đó, nhưng bạn đã làm nó! Rất hay :-)
Olivier Grégoire

1
Có lẽ bạn thấy một cái gì đó nhiều hơn để kết hợp ijbằng cách nào đó? Hoặc một cái gì đó ngắn hơn j++%7<1?10:32với một số ma thuật bitwise? Nhưng tôi sẽ để lại cho bạn. Tôi sẽ trở lại làm việc, lol. ;)
Kevin Cruijssen

1
Ah, tất nhiên .. Làm việc nhóm tốt! ;) PS: Nơi nào wđứng cho? Tại sao không hcho tiêu đề?
Kevin Cruijssen

1
@KevinCruijssen wcho "ngày của w eek". Ngoài ra, twiddling chỉ có thể dẫn đến (i%7+6)/7*22+10đó là lâu hơn nhiều.
Olivier Grégoire

2

PHP ,197 189 187 byte

for($d=date_create($argn)->sub($i=new DateInterval(P17D)),$i->d=1;$x++<35;$h.=$x<8?substr($d->format(D),0,2).' ':'',$d->add($i))$o.=str_pad($d->format(j),3,' ',2);echo wordwrap($h.$o,20);

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

Đầu vào là STDINmột chuỗi ngày. Chạy với php -nF.

$ echo April 2 2019|php -nF cal.php

Sa Su Mo Tu We Th Fr 
16 17 18 19 20 21 22 
23 24 25 26 27 28 29 
30 31  1  2  3  4  5 
 6  7  8  9 10 11 12 
13 14 15 16 17 18 19 

Xác nhận tất cả các trường hợp kiểm tra

Hoặc 174 byte với các chữ số đơn không đệm.


1

VBA Excel, 190 159 byte

Cảm ơn @TaylorScott

Function z(i)
Dim d(5,6)
v=DateValue(i)-17
For x=1To 5
For y=0To 6
d(0,y)=Left(WeekdayName(Weekday(v+y)),2)
d(x,y)=day(v+y+(x-1)*7)
Next y,x
z=d()
End Function

Đưa đầu vào dưới dạng chuỗi ngày hợp lệ cho Excel VBA (ví dụ: ngày 19 tháng 2 năm 2020; 2/19/2020; 19 tháng 2 năm 2019) và trả về một mảng với lịch đã cho tập trung vào nó.


Bạn có thể giảm giải pháp này xuống còn 159 bằng cách xóa khoảng trắng khỏi giải pháp này,Function z(i) Dim d(5,6) v=DateValue(i)-17 For x=1To 5 For y=0To 6 d(0,y)=Left(WeekdayName(Weekday(v+y)),2) d(x,y)=Day(v+y+(x-1)*7) Next y,x z=d() End Function
Taylor Scott

@TaylorScott Cảm ơn, chỉ sử dụng trình chỉnh sửa được tích hợp sẵn để tự động kích hoạt các không gian đó.
porter william


0

T-SQL, 203 byte

DECLARE @f date='2020-02-19'

,@ char(20)=0,@d char(105)=0SELECT
@=left(format(d,'D'),2)+' '+@,@d=right(d,2)+char(32-n%7/6*19)+@d
FROM(SELECT dateadd(d,number-17,@f)d,number n
FROM spt_values WHERE'P'=type)x ORDER BY-n
PRINT @+'
'+@d

Phiên bản trực tuyến hơi khác một chút, phiên bản được đăng này hoạt động trong MS-SQL Studio Management. Nó tiết kiệm 1 byte so với phiên bản trực tuyến, nhưng không cho kết quả chính xác trực tuyến

Dùng thử trực tuyến


0

Python 2 , 115 byte

from datetime import*
d=input()
for i in range(42):print(d+timedelta(i-24)).strftime('%'+'da'[i<7])[:2]+i%7/6*'\n',

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

Không chắc chắn nếu điều này được cho phép ... lấy đầu vào từ STDIN trong biểu mẫu date(year, month, day). Điều này cũng có thể được đại diện như __import__('datetime').date(year, month, day). Đây là những __import__('datetime').dateđối tượng thực sự .

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.