오늘 (또는 다른 날짜)은 무엇입니까?


12

직무

사용자가 입력 한 날짜의 요일 이름을 계산하는 프로그램이나 함수를 작성하십시오.

입출력

입력은 문자열 YYYYMMDD입니다.

입력 값의 예 :

20110617 : 2011 년 6 월 17 일
19040229 : 1904 년 2 월 29 일
06661225 : 666 년 12 월 25 일
00000101 : 1 월 1 일
99991231 : 9999 년 12 월 31 일

모든 입력이 유효하다고 가정 할 수 있습니다. 참고 년 제로는 유효합니다.

출력 사이의 정수 06. 각 정수는 요일 이름을 나타냅니다. 요일 이름을 나타내는 정수를 자유롭게 결정할 수 있습니다.

0 : 월요일
1 : 화요일
2 : 수요일
...
6 : 일요일

(순서대로) 또는 이것

0 : 월요일
1 : 수요일
2 : 일요일
...
6 : 토요일

(순서가 아님).

테스트 사례

입력 요일 출력 (이 예제에서는 [0..6-> Monday..Sunday]이 사용됩니다.)

20110617 금요일 4
19500101 일요일 6
22220202 토요일 5
19000228 수요일 2
19000301 목요일 3
19450815 수요일 2
19040229 월요일 0
19040301 화요일 1
17760704 목요일 3
20000228 월요일 0
20000229 화요일 1
20000301 수요일 2
20121223 일요일 6
00000401 토요일 5
66660606 수요일 2
59161021 토요일 5

제한

당신은 사용하는 모든 기능 / 클래스의 종류 / ... 같은 타임 스탬프 또는 날짜, 관련되는 Date클래스 Java/ JavaScript/ ActionScript, 또는 getdate함수 PHP.

많은 사람들이 사용 하는 Gregorian calender를 사용해야합니다 .

물론 가장 짧은 코드가 승리합니다. 두 코드의 길이가 동일하면 투표 수가 높은 코드가 우선합니다.

(사유 : +1투표 수가 5 이상인 코드가있는 경우 )


오늘? 왜, 크리스마스!
Joey Adams

3
Bash (6 자)로 작성된 낙관적 솔루션 : echo 4.
진실성

1
@trutheality 아니요, 그런 의미는 아닙니다. 내가 원하는 것은 오늘의 요일 만 인쇄하는 것이 아니라 누군가 입력 한 날짜의 요일을 인쇄 / 반환하는 코드입니다.
JiminP

오, 나 알아. 이것이 바로 이것입니다.
진실성

시간의 적어도 14 %가 맞습니다!
Draco18s는 더 이상 SE

답변:


2

루비, 95 92 자

0 : Monday, ...를 사용한 간단한 루비 구현

p ((y=(d=gets.to_i)/(k=100)/k-((m=d/k%k)<3?1:0))+y/4-y/k+y/400+"squsptrotqro"[-m].ord+d%k)%7

4

PHP- 101 97 103 125 자

  • 사카모토 알고리즘
  • 0 = 일요일

암호

<?php fscanf(STDIN,"%4d%2d%2d",$y,$m,$d);@$a=a032503514624;$y-=$m<3;$z=$y+1;echo($y+$y/4%$z-$y/100%$z+$y/400%$z+$a[$m]+$d)%7;

노트

불행히도 PHP의 역동적이고 약한 타이핑으로 인해 Sakamoto 알고리즘은 각 부서 작업을 명시 적으로 처리하지 않으면 제대로 작동하지 않습니다.


다시 시험해 주시겠습니까? 몇 년 동안 그것은 다른 결과를 낳습니다 (예 : 테스트 케이스 17760704는 수요일 대신 화요일 수율).
Howard

@Howard 그것은 매우 이상하다; 17760704 동안, 나는 수요일을 얻는다. 그러나 19040229가 화요일을 반환하는 것과 같은 다른 불일치가 발생합니다. 무엇이 원인 일 수 있는지 잘 모르겠습니다. 알고리즘을 다시 확장하면 동일한 결과가 나타납니다 y+y/4-y/100+y/400.
rintaun

497 * y / 400 y=4에서 발생하는 것을 볼 수 있습니다. 이 경우 올바른 5 대신 4를 반환합니다 y+y/4+y/100+y/400(처음 두 용어 만 사용됩니다). 그것이 내 JavaScript 답변을 괴롭히는 것입니다. 정수 대신 복식을 만들 수 있습니까? (내 PHP는 알기에는 너무 약합니다.)
DocMax

@DocMax : 확장 된 표현식을 그대로두면 동일한 결과가 나타납니다 (497y / 400은 동일해야 함 : y / 100을 빼고 y / 400을 다시 추가 함). PHP가 소수점 이하의 모든 것을 반올림하지 않고 잘라 버린 것 같습니다. 나는 모듈로 전에 반올림하여 이것을 테스트했습니다. 이로 인해 두 가지 예외가 해결되지만 19040229는 여전히 동일한 결과를 반환합니다. 다른 아이디어가 있습니까?
rintaun

@rintaun 나는 그것이 반올림이라고 생각하지 않습니다. 그것들은 근본적으로 다릅니다. 위의 예를 보자 (y = 4) : 497 * 4 / 400 = 1988 / 400 = 4 그러나 다른 한편으로 4 + 4 / 4-4 / 100 + 4 / 400 = 4 + 1-0 + 0 = 5 . / 100 및 / 400이라는 용어는 계산에 너무 많은 가중치를 부여하여 2000에 도달 할 수 없습니다.
Howard

2

C-129

main(y,m,d,s)
{
    scanf("%04d%02d%02d",&y,&m,&d);
    y-=s=86400;
    d+=y+"-addgbegcfadf"[m];
    m>2?y++:0;
    putchar(48+(d+y/4-y/100+y/400+s+s)%7);
}

이것은 적어도 내 시스템 (Linux x86)에서 나누기가 0으로 반올림되는 방식을 남용합니다.

마법 상수 86400는 두 가지 목적을 제공합니다.

  • 요일에 영향을 미치지 않고 음수로 만들기 위해 연도를 뺍니다. 이로 인해 부서가 다운되지 않고 반올림됩니다.
  • 월요일이 0이되도록 요일 번호를 이동하십시오.

또한 하루의 초 수입니다.


y+=m>2;대신 m>2?y++:0;몇 바이트를 사용 하여 면도 하십시오 .
Clearer

2

자바 스크립트, 126,123

0 = 일요일과 함께 Sakamoto의 알고리즘 사용 :

prompt().replace(/(....)(..)(..)/,function(_,y,m,d){y-=m<3;alert((+d+y-~(y/4)+~(y/100)-~(y/400)+ +".621462403513"[+m])%7)})

부서가 붕괴 될 수 있다고 생각하지만 지금은 볼 수 없습니다.

편집 : 나눗셈이 향상되었습니다 ( ~~할 수있을 때 필요 없음 ~).


2

파이썬 (2) , 83 (116) 113 109 바이트

Sakamoto의 알고리즘을 구현 합니다 . 골프 제안을 환영합니다. 온라인으로 사용해보십시오!

편집 : 나는이 나이 전에 고쳐야했다. Jonathan Allan의 제안에서 -6 바이트 +2 바이트는 실제로 코드를 수정합니다.

def w(s):m=int(s[4:6]);y,d=int(s[:4])-(m<3),int(s[6:]);return(y+y/4-y/100+y/400+int('032503514624'[m-1])+d)%7

입력은 단일 문자열이어야합니다.
msh210

int('032503514624'[m-1])
Jonathan Allan

0

펄-110 바이트

다음은 perl -p source.pl 또는 perl -pe 'here-is-code'로 실행하는 솔루션입니다.

s/((..)(..))(..)(..)/(1+3*$1+$2-2*($1%4+$2%4)-(2<$4?$4+(1&$4&&4-(8&$4)):(2^$4)+(!($3%4)-!-$3+!($2%4)))+$5)%7/e

테스트 케이스를 stdin에 복사하여 붙여 넣기 만하면됩니다.

이것은 변수, 문자열 상수 및 나누기가없는 유일한 코드 인 것 같습니다.


0

자바 스크립트 (ES6), 73 바이트 (비경쟁)

d=>(w=new Date(d[s="slice"](0,4),d[s](4,6)-1,d[s](-2)).getDay())-(w?1:-6)

시도 해봐

f=
d=>(w=new Date(d[s="slice"](0,4),d[s](4,6)-1,d[s](-2)).getDay())-(w?1:-6)
o.innerText=f(i.value="59161021")
oninput=_=>i.value.length==8&&(o.innerText=f(i.value))
<input id=i type=number><pre id=o>


왜 경쟁이 아닌가?
programmer5000

@ programmer5000, 도전이 게시 된 날짜를 확인하십시오;)
Shaggy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.