오늘은 중심입니다


36

편리한 형식으로 날짜를 입력하면 해당 날짜의 달력을 5 주간의 정확한 중심으로 출력합니다. 달력의 머리글에는 요일 (예 :)의 두 글자 약어가 포함되어야합니다 Su Mo Tu We Th Fr Sa. 요일의 3 글자 또는 다른 약어는 허용되지 않습니다.

예를 들어, 주어진 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 1600~Dec 31 2500 입니다.
  • STDOUT에 인쇄하거나 함수 결과로 리턴 할 수 있습니다.
  • 전체 프로그램 또는 기능이 허용됩니다.
  • 문자가 적절하게 정렬되는 한 외부 공백은 허용됩니다.
  • 대신 한 자리 숫자를 왼쪽 맞춤으로 정렬하는 것처럼 한 자리 숫자의 선행 0이 허용됩니다.
  • 표준 허점 은 금지되어 있습니다.
  • 이것은 이므로 모든 일반적인 골프 규칙이 적용되며 가장 짧은 코드 (바이트)가 이깁니다.

답변:


12

R , 77 72 바이트

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

온라인으로 사용해보십시오!

2 글자 약어를 사용하도록 출력을 수정했습니다.

Aaron Haymanstrtrim 덕분에 -1 바이트 사용 .

날짜가 0으로 채워집니다. Date를 사용하여 만들 수있는 입력을로 가져옵니다 as.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한 자릿수 일의 앞에 s가 있고 소문자를 mo통해 출력합니다 su(제목이 필수 인 경우 +1 바이트 추가 가능).

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

이런 젠장 .. 이것은 가장 긴 05AB1E 답변에 대한 나의 새로운 기록일지도 모른다. 그리고 나는 내가 한 매우 복잡한 도전을 포함한다 ...>.> 편집 : 흠, 거의 ..

중요 사항 : 05AB1E에는 Date 객체 또는 계산을위한 내장 기능이 없습니다. 날짜에 관한 유일한 내장은 오늘의 연 / 월 / 일 /시 / 분 / 초 / 마이크로 초입니다.

그 때문에, 거의 모든 코드는 이전과 다음 날을 계산하기위한 수동 계산 (연도에 따른 전환과 윤년을 염두에두고)과 Zeller의 합의 를 사용하여 요일을 계산하는 것입니다 .

코드의 상당 부분 이 이전의 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을 목록에서 그대로 둡니다.

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
네, Java가 05AB1E를 이겼습니다! : D 처음으로, 나는 추측한다 ;-)
Olivier Grégoire

@LuisMendo 지난번에는 링크 된 챌린지로 대부분 완료되었지만 많은 작업이었습니다.;;) 설명이 btw에 추가되었습니다.
Kevin Cruijssen

@ OlivierGrégoire 이제 우리는 같은 바이 카운트입니다. ;)
Kevin Cruijssen

@ OlivierGrégoire 그리고 이제 다시 낮아집니다. 죄송합니다. ; p
Kevin Cruijssen

6

자바 스크립트 (ES6)  141  126 바이트

Neil의 답변.toUTCString().slice(0,2) 에서 차용 하여 15 바이트 절약

입력을 Date 객체로 사용합니다.

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 바이트를 저장하는

4

자바 스크립트 (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 Date 객체 또는 타임 스탬프로 입력을받습니다. 편집 : @EmbodimentofIgnorance 덕분에 1 바이트를 절약 한 후 출력에 후행 줄 바꿈을 추가하여 7 바이트를 더 저장할 수있었습니다. 처음에는 실제로 버그가 없었던 동작을 해결하고 있음을 발견했을 때 52 바이트를 절약했습니다 ...


padStart(2)-> padStart(3), -1 바이트의 조인 문자열에서 공백을 제거하십시오.
무지의 구현



2

Wolfram Language (Mathematica) , 123 바이트

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

온라인으로 사용해보십시오!

GridTIO에서 작동하지 않는지 모르겠지만이 코드는 이것을 출력합니다.

여기에 이미지 설명을 입력하십시오

@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

자바 (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"의 하루 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 

모든 테스트 사례 확인

또는 0으로 채워진 단일 숫자가있는 174 바이트 .


1

엑셀 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에 유효한 날짜 문자열 형식 (예 : 2020 년 2 월 19 일; 2/19/2020; 19-Feb-2019)으로 입력을 받고 주어진 달력을 중심으로 배열을 반환합니다.


이 솔루션에서 공백을 제거하면이 솔루션을 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 Thanks, 그 공간을 자동으로 채우는 내장 편집기 만 사용하고있었습니다.
윌리엄 포터


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

온라인 버전은 약간 다릅니다.이 게시 된 버전은 MS-SQL Studio Management에서 작동합니다. 온라인 버전과 비교하여 1 바이트를 절약하지만 온라인에서 올바른 결과를 제공하지는 않습니다.

온라인으로 사용해보십시오


0

파이썬 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.