วันนี้เป็นศูนย์


36

ให้วันที่เป็นข้อมูลในรูปแบบที่สะดวกใด ๆ ให้ส่งออกปฏิทินโดยใช้วันที่นั้นเป็นศูนย์กลางที่แน่นอนของหน้าต่างห้าสัปดาห์ ส่วนหัวของปฏิทินจะต้องมีตัวย่อสองตัวอักษรสำหรับวันของสัปดาห์ (เช่น, Su Mo Tu We Th Fr Sa) ไม่อนุญาตให้ใช้ตัวย่อสามตัวหรืออื่น ๆ ของวัน

ตัวอย่างเช่นที่กำหนดApril 2 2019เป็นอินพุตเอาต์พุตควรเป็น

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

เพื่อให้วันที่ที่ได้รับอยู่ตรงกลางของปฏิทิน

รับFebruary 19 2020เอาท์พุท

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

สำหรับSeptember 14 1752แสดงสิ่งต่อไปนี้:

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

  • เข้าและส่งออกจะได้รับโดยวิธีการที่สะดวกใด
  • ข้อมูลเข้ารับประกันว่าไม่ว่างเปล่าและถูกต้อง (เช่นคุณจะไม่ได้รับ""หรือFeb 31อื่น ๆ )
  • สมมติว่าปฏิทินแบบคริสต์ศักราชสำหรับวันที่ทั้งหมด
  • ปีที่ก้าวกระโดดจะต้องถูกนำมาพิจารณา
  • วันที่ป้อนข้อมูลจะมีตั้งแต่การJan 1 1600Dec 31 2500
  • คุณสามารถพิมพ์ลงใน STDOUT หรือส่งคืนเป็นผลลัพธ์ของฟังก์ชัน
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น
  • สามารถยอมรับช่องว่างที่ไม่เกี่ยวข้องใด ๆ ได้ตราบใดที่อักขระมีการจัดเรียงอย่างเหมาะสม
  • อนุญาตให้นำเลขศูนย์ในวันหลักเดียวเช่นเดียวกับการจัดตำแหน่งวันหลักเดียวที่จะจัดชิดซ้ายแทน
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการตีกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

คำตอบ:


12

R , 77 72 ไบต์

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

ลองออนไลน์!

แก้ไขเอาต์พุตเพื่อใช้ตัวย่อวัน 2 ตัวอักษร

-1 ไบต์ใช้strtrimต้องขอบคุณแอรอนเฮย์แมน

แผ่นตัวเลขวันที่ด้วย 0s นำ; จะเข้าเป็นซึ่งสามารถสร้างขึ้นโดยใช้Dateas.Date("YYYY/MM/DD")

สั้นประหลาดสำหรับคำตอบR ...


8

05AB1E , 175 174 172 171 160 ไบต์

¦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ô»

[day, month, year]การป้อนข้อมูลในรูปแบบ เอาต์พุตที่มีการนำหน้า0สำหรับวันหลักเดียวและตัวพิมพ์เล็กmoผ่านsu(สามารถเพิ่ม +1 ไบต์ได้หากจำเป็นต้องใส่หัวเรื่อง)

ลองมันออนไลน์หรือตรวจสอบกรณีทดสอบทั้งหมด

อึศักดิ์สิทธิ์ .. นี่อาจเป็นบันทึกใหม่ของฉันสำหรับคำตอบที่ยาวที่สุดของ 05AB1E และจากนั้นฉันก็รวมความท้าทายที่ซับซ้อนมากที่ฉันทำ ... >.> แก้ไข: อืมโอเคเกือบ .. ; p

หมายเหตุสำคัญ: 05AB1E ไม่มี builtins สำหรับวัตถุหรือการคำนวณ Date builtin เพียงอย่างเดียวเกี่ยวกับวันที่มีคือวันนี้ปี / เดือน / วัน / ชั่วโมง / นาที / วินาที / microseconds

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

ส่วนใหญ่ของรหัสจะถูกคัดลอกมาจากคำตอบของฉัน 05AB1E ก่อนหน้านี้ซึ่งจะเกี่ยวข้องกับคำอธิบายด้านล่าง

คำอธิบาย:

เราเริ่มต้นโดยไปที่วันแรกของเดือนก่อนหน้า:

¦          # 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`

จากนั้นฉันใช้วันที่เป็นวันที่เริ่มต้นและคำนวณ 100 วันถัดไป:

т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

จากนั้นด้วยอินพุตวันที่เป็นกึ่งกลางฉันจะเหลือเพียง 17 ก่อนและ 17 หลังจากวันที่อินพุตจากรายการ:

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

ตอนนี้เรามี 35 วันของเรา ขั้นตอนถัดไปคือการคำนวณวันในสัปดาห์และสร้างส่วนหัวของตารางผลลัพธ์:

¬                # 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

ดู 05AB1E นี้เคล็ดลับของฉัน (ส่วนวิธีการบีบอัดสตริงไม่ใช่ส่วนหนึ่งของพจนานุกรม? )จะเข้าใจว่าทำไมเป็น.•4ιõ÷‡o‹ƶ¸•"sasumotuwethfr"

จากนั้นเราสร้างวันเพื่อเติมข้อมูลตารางตามรายการวันที่ที่สร้างไว้ก่อนหน้านี้ของเรา ซึ่งเราจะรวมเข้ากับส่วนหัว หลังจากนั้นเราสามารถพิมพ์ผลลัพธ์สุดท้าย:

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
นั่นเป็นงานจำนวนมาก!
Luis Mendo

2
ใช่ชวาเต้น 05AB1E! : D ครั้งแรกที่เคยฉันเดา ;-)
Olivier Grégoire

@LuisMendo ส่วนใหญ่ทำครั้งสุดท้ายกับความท้าทายที่เชื่อมโยง แต่ใช่มันเป็นงานมาก .. ;) คำอธิบายได้รับการเพิ่ม btw
Kevin Cruijssen

@ OlivierGrégoireตอนนี้เราก็นับจำนวนเดียวกัน ;)
Kevin Cruijssen

@ OlivierGrégoireและตอนนี้มันลดลงอีกครั้งขอโทษ ; p
Kevin Cruijssen

6

JavaScript (ES6),  141  126 ไบต์

บันทึก 15 ไบต์โดยการยืม.toUTCString().slice(0,2)จากคำตอบของ Neil

รับอินพุตเป็นวัตถุวันที่

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):''

ลองออนไลน์!


อืมฉันสาบานได้ว่ารหัสของฉันล้มเหลวสำหรับกรณีทดสอบครั้งที่สามเมื่อฉันเขียนมัน ... ดีที่ช่วยฉัน 52 ไบต์ ...
Neil

4

JavaScript (Node.js) , 205 152 145 ไบต์

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>

ลองออนไลน์! รับอินพุตเป็นวัตถุวันที่ของ JavaScript หรือการประทับเวลา แก้ไข: บันทึก 1 ไบต์ขอบคุณ @EmbodimentofIgnorance ซึ่งอนุญาตให้ฉันบันทึกอีก 7 ไบต์ด้วยการเพิ่มบรรทัดใหม่ต่อท้ายไปยังเอาต์พุต บันทึก 52 ไบต์เมื่อฉันค้นพบว่าฉันกำลังทำงานกับพฤติกรรมที่ไม่ได้บั๊กในตอนแรก ...


padStart(2)-> padStart(3)ลบช่องว่างในสตริงการเข้าร่วมสำหรับ -1 ไบต์
ศูนย์รวมของความไม่รู้



2

ภาษา Wolfram (Mathematica) , 123 ไบต์

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

ลองออนไลน์!

ฉันไม่รู้ว่าทำไมGridไม่ทำงานบน TIO แต่รหัสนี้ส่งออกนี้

ป้อนคำอธิบายรูปภาพที่นี่

@DavidC บันทึก 1 ไบต์


อาจGridจะไม่ทำงานเพราะ TIO ไม่สามารถจัดรายการตามที่ต้องการไว้ในภาพของคุณ
AdmBorkBork

@AdmBorkBork มีวิธีโหลดกราฟิกเช่นนี้ใน TIO มีคนแสดงให้ฉันเห็นเมื่อปีที่แล้ว แต่ฉันจำไม่ได้ว่าจะทำอย่างไร ... ดังนั้นหากใครรู้แจ้งให้เราทราบ!
J42161217

2

MATL , 34 33 31 ไบต์

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

ลองออนไลน์!

คำอธิบาย

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 ไบต์

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

ลองออนไลน์!

เครดิต



1
@KevinCruijssen เดี๋ยวก่อนอะไรนะ? ฉันขอแสดงความยินดีกับคุณ! ฉันพยายามทำสิ่งนี้ แต่หาทางทำไม่ได้ แต่คุณก็ทำได้! ดีมาก :-)
Olivier Grégoire

1
คุณอาจเห็นบางสิ่งบางอย่างมากขึ้นในการรวมiและjอย่างใด? หรือบางสิ่งบางอย่างที่สั้นลงj++%7<1?10:32ด้วยเวทมนตร์ระดับบิต แต่ฉันจะปล่อยให้คุณ ฉันจะกลับไปทำงานฮ่า ๆ ;)
Kevin Cruijssen

1
อ่าแน่นอน .. การทำงานเป็นทีมที่ดี! ;) PS: wจุดยืนของคุณอยู่ที่ไหน ทำไมไม่hให้ส่วนหัว?
Kevin Cruijssen

1
@KevinCruijssen wสำหรับ "day of w eek" นอกจากนี้การ twiddling บิตสามารถนำไปสู่(i%7+6)/7*22+10ซึ่งมีความยาวมาก
Olivier Grégoire

2

PHP ,197 189 187 ไบต์

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

ลองออนไลน์!

อินพุตSTDINเป็นสตริงวันที่ 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 

ตรวจสอบกรณีทดสอบทั้งหมด

หรือ174 ไบต์ด้วยตัวเลขหลักเดียวที่ไม่มีเบาะรอง


1

Excel VBA, 190 159 ไบต์

ขอบคุณ @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

รับอินพุตในรูปแบบของสตริงวันที่ที่ถูกต้องสำหรับ Excel VBA (เช่น 19 กุมภาพันธ์ 2020; 2/19/2020; 19 กุมภาพันธ์ 2562) และส่งกลับอาร์เรย์พร้อมกับปฏิทินที่กำหนดอยู่ตรงกลาง


คุณสามารถแก้ปัญหานี้ได้ถึง 159 โดยลบช่องว่างออกจากโซลูชันนี้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 ขอขอบคุณใช้ตัวแก้ไขที่สร้างขึ้นอัตโนมัติซึ่งมีช่องว่างเหล่านั้นโดยอัตโนมัติ
william porter


0

T-SQL, 203 ไบต์

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

รุ่นออนไลน์แตกต่างกันเล็กน้อยรุ่นที่โพสต์นี้ทำงานในการจัดการ Studio MS-SQL มันช่วยประหยัด 1 ไบต์เมื่อเทียบกับรุ่นออนไลน์ แต่ไม่ได้ให้ผลลัพธ์ที่ถูกต้องออนไลน์

ลองออนไลน์


0

Python 2 , 115 ไบต์

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

ลองออนไลน์!

ไม่แน่ใจว่านี้จะได้รับอนุญาต ... ต้องใช้ข้อมูลจาก STDIN date(year, month, day)ในรูปแบบ __import__('datetime').date(year, month, day)นอกจากนี้ยังสามารถแสดงเป็น สิ่งเหล่านี้เป็น__import__('datetime').dateวัตถุจริงๆ

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