추수 감사절은 언제입니까?


38

배경

일부 휴일은 10 월 31 일, 12 월 25 일 등과 같이 기억하기 쉬운 고정 날짜를 갖습니다. 그러나 일부 휴일은 번거롭기를 원합니다. "9 월 첫째 월요일"또는 "11 월 넷째 목요일"과 같이 지정됩니다. 그것이 언제인지 어떻게 알 수 있습니까?

내가 아는 것은 추수 감사절이 빨리 다가오고 있다는 것입니다. 어떤 사람들은 그것이 내일 이라고 말하기도 하므로 프로그램을 제 시간에 다시 입력 할 수 있도록 가능한 짧아야합니다.

도전

최대 4 자리 연도 (예 : 2015 또는 1984)가 주어진 경우 해당 연도의 미국 추수 감사절 날짜를 출력하거나 반환하는 프로그램 또는 함수를 만듭니다. 추수 감사절은 Wikipedia 페이지 에 따르면 11 월 넷째 목요일로 정의됩니다 . (도움말 : 해당 페이지에는 날짜 패턴에 대한 흥미로운 정보도 포함되어 있습니다.)

입력 : 공통 시대 (CE)에서 연도를 나타내는 최대 4 자리의 10 진수입니다. 예 : 987, 1984, 2101

출력 : 해당 연도에 추수 감사절이 존재하거나 존재하는 경우 하락할 날짜 (월 및 일 포함)입니다. 이것은 합리적인 형식 일 수 있습니다. 최선의 판단을하십시오. 그 당시 달력을 사용하지 않았더라도 모든 경우에 그레고리력을 사용하십시오.

(참고 : 윤년을 올바르게 처리하십시오!)

테스트 사례 입력 1 :

2015

출력 1 :

Nov 26

입력 2 :

1917

출력 2 :

Nov 22

채점

제출물은 바이트 단위 로 채점 됩니다 . 이 웹 사이트 는 바이트 수를 추적하는 것이 좋지만 원하는 카운터를 사용할 수 있습니다.

보너스

BCE 날짜를 음수로 처리하면 점수가 -25 % 가됩니다 (예 : -480은 Thermopylae 전투의 해가됩니다).

부정적인 테스트 케이스 입력 :

-480

해당 출력 :

Nov 25

이것은 이므로 최저 점수가 이깁니다!

편집 : Thomas Kwa의 TI-BASIC 제출을 수락 된 것으로 표시하고 있습니다. 이로 인해 새로운 출품작을 제출하지 못하게하십시오!

리더 보드

다음은 일반 리더 보드와 언어 별 수상자 개요를 생성하는 스택 스 니펫입니다.

답변이 표시되도록하려면 다음 마크 다운 템플릿을 사용하여 헤드 라인으로 답변을 시작하십시오.

# Language Name, N bytes

N제출물의 크기는 어디에 있습니까 ? 당신이 당신의 점수를 향상시킬 경우에, 당신은 할 수 있습니다 를 통해 눈에 띄는에 의해, 헤드 라인에 오래된 점수를 유지한다. 예를 들어 :

# Ruby, <s>104</s> <s>101</s> 96 bytes

헤더에 여러 숫자를 포함하려는 경우 (예 : 점수가 두 파일의 합계이거나 인터프리터 플래그 페널티를 별도로 나열하려는 경우) 실제 점수가 헤더 의 마지막 숫자 인지 확인하십시오 .

# Perl, 43 + 2 (-p flag) = 45 bytes

언어 이름을 링크로 만들어 리더 보드 스 니펫에 표시 될 수도 있습니다.

# [><>](http://esolangs.org/wiki/Fish), 121 bytes


25
올해 추수 감사절이 언제 올지 궁금해하는 사람은 추수 감사절이 내일이 될 것입니다.
TheNumberOne

6
하지만 10 월 10 일에 추수 감사절을 했습니까? 질문이 늦어서 죄송합니다.
JimmyJazzx

5
@Downgoat 원하는 바이트 카운터를 사용하십시오. 그것은 내가 개인적으로 사용하고 추천하는 것입니다.
bkul

22
"일부 공휴일은 10 월 31 일, 12 월 25 일과 같이 기억하기 쉬운 날짜가 정해져 있습니다."이러한 예는 실제로 같은 날이기 때문에 기억하기 쉽습니다. 8 월 31 == 10 진수 25. ;-)
Adrian McCarthy

7
보너스에 대한 답변을 얻으려면 -1과 1 사이에 0 년이 있어야합니까?
feersum

답변:


40

TI-BASIC, 15 바이트 * 0.75 = 11.25

TI-84 + 계산기에서 테스트

1129-dayOfWk(Ans+ᴇ4,9,1

추수 감사절은 11 월 29 일로, 9 월 1 일 요일을 빼고 1은 일요일이고 7은 토요일입니다. 이 형식으로 출력됩니다 MMDD.

테스트 사례 : 2015-> 1126, 1917-> 1122, -480-> 1125확인되었습니다. TI-BASIC은 모든 날짜에 그레고리력을 사용하는 것 같습니다.

TI-BASIC은 음수 연도를 지원하지 않지만 10000을 입력에 추가하므로 보너스를 얻습니다. 그레고리력의 기간은 400 년이므로 요일은 바뀌지 않습니다.


5
이런 세상에. xD 나는 이것이 +1처럼 작동했을 것이라고 생각하지 않았을 것입니다.
애디슨 크럼

10000을 추가하는 것이 좋습니다.
agtoever

나는 23 개의 편지를 셉니다. 어떻게 15 바이트가 될 수 있습니까?
Stephan Schinkel

1
@StephanSchinkel TI-BASIC은 계산기 메모리에 저장되어있는 토큰, 내가 여기에 모든 문자를 믿는 토큰을 제외하고 1 바이트이다 사용 dayofWK(하고 Ans2 일 각 바이트있다.
FryAmTheEggman

계산기로 테스트 했습니까? 와.

23

PHP, 65 48 42 41 36 (+2의 경우 -F) = 38 바이트

<?date(Md,strtotime("4thuXI$argn"));

입력을 첫 번째 명령 행 인수로 사용합니다. 우리의 규칙에 따라 허용되는 경고와 함께 실행됩니다. 인쇄는 NovDD여기서 DD추수 감사절의 날입니다.

ideone이 명령 줄 인수를 지원하지 않아 온라인 통역사를 모르기 때문에 온라인 링크가 없습니다.

나에게 새로운 트릭을 가르쳐 준 Alexander O'Mara와 상당한 감소를위한 primo에게 감사드립니다.


2
이것은 Mathematica보다 재미 있습니다.
lirtosiast

2
@Tryth 더 짧음 : "4thuXI". 당신은 심지어 년 사이의 공간을 떨어 뜨릴 수 있습니다 "4thuXI2015".
Alexander O'Mara 1

1
명령 행 옵션을 사용하면 -F입력을 단축 할 수 있습니다 "4thuXI$argn".
primo

3
잠깐, 이것이 실제로 작동합니까? 단지의이 ... ... 심지어하지 않는 것이 ...
ETHproductions

1
나를 위해 작동합니다 . 내가있는 동안 비활성화 된 Md따옴표가 필요하지 E_NOTICE않습니다.
primo

18

Mathematica, 59 38 바이트

DayRange[{#,11},{#,12},Thursday][[4]]&

영리한 +1 WolframAlpha["Thanksgiving " <> #] &날짜가 문자열로 입력되는 곳 도 있습니다 .
DavidC

WolframAlpha는 1863 년 (미국 링컨이 11 월 목요일 목요일이라고 선언 한 날)부터 추수 감사절을 반환합니다. 미국은 1789 년 이후 추수 감사절을 관찰했습니다.
DavidC

@DavidCarraher 그러나, OP 상태 프로그램에 대한 작업에 대해 가지는 적어도 0-9999 CE
LegionMammal978

17

자바 스크립트 (ES6), 42 40 31 바이트-25 % = 23.25

a=>28.11-new Date(a,8).getDay()

날짜는 "합리적인 형식 일 수 있습니다"이므로이 함수는를 사용합니다 DD.MM. 다른 기술 로 TeaScript 답변 을 작성 했지만이 수식은 더 짧았습니다.

설명

월은 0 부터 시작하므로 지정된 연도의 11 월 1 일을 나타내는 개체를 new Date(a,10)반환합니다 Date.

지도에서 getDay()요일을 나타내는 숫자를 반환 하므로0..6

Su Mo Tu We Th Fr Sa 
0  1  2  3  4  5  6  
to to to to to to to
4  3  2  1  0  6  5  

그런 다음 22를 추가하십시오 (11 - new Date(a,10).getDay()) % 7. 으로 @Thomas 콰가 지적했듯이,이 동일한 28-new Date(a,8).getDay()28을 뺀 9 월 1 일 요일한다.


좋은 해결책, 나는 그것이 얼마나 짧고 여전히 대부분의 항목보다 이해하기 쉽다는 것을 좋아합니다.
Marko Grešak

16

apt , 43 37 36 35 29 바이트-25 % = 21.75

JaptJa 의 단축 버전입니다. vaScri pt .

`{28.11-?w D?e(U,8).getDay()}

하하하, 정말 간결한 트릭을 발견했습니다 . 인터프리터는 압축을 풀면서 문자열 내부의 모든 괄호 (코드 삽입에 사용됨)를 무시하므로 전체 소스 코드를 압축하여 바이트를 절약 할 수 있습니다.

두 개 ?는 각각 유니 코드 인쇄 불가능 U + 0098 및 U + 0085 여야합니다. 온라인으로 사용해보십시오!

압축 해제 후 코드는 다음과 같이 평가됩니다.

"{28.11-new Date(U,8).getDay()}"

다음으로 평가됩니다.

""+(28.11-new Date(U,8).getDay())+""

적절한 출력을 제공합니다.

intrepidcoder의 기술을 사용 하여 형식으로 출력dd.mm . 음수 연도를 올바르게 지원합니다. 제안을 환영합니다!

편집 : 12 월 2 일 현재이 11 바이트 코드를 사용할 수 있습니다 ( 8.25 점 점수 ).

28.11-ÐU8 e

(그래서 더 빨리 구현했으면 좋겠다!)


아주 잘 했어요
bkul

이것은 이제 바닐라 JavaScript보다 길다. 토마스 콰는 훨씬 짧은 공식을 가지고 있습니다.
intrepidcoder

@intrepidcoder 감사합니다.
ETHproductions

12

Vitsy , 44 바이트

나는 순수한 mathemagics로 계산하고 있습니다 !

골프 :

Ve2 * V2-V41m + Vaa * Dv1m-Vv4 * 1m + 7M-baa * / + N
/ D1M-

Ungolfed (메서드 호출을 첫 번째 행으로 이동하여 읽을 수 있도록) :

Ve2 * V2-V4 / D1M- + Vaa * Dv / D1M--Vv4 * / D1M- + 7M-baa * / + N

V 입력을 최종 변수로 저장하십시오.
 e2 * 28을 스택으로 밉니다.
    V 입력을 스택으로 밉니다.
     2- 2를 뺍니다.
       V4 / D1M-바닥 (입력 / 4)을 얻습니다.
              + 합계에 추가하십시오.
               Vaa * Dv / D1M- 바닥 (입력 / 100)을 얻고 온도를 100으로 저장
                                    과정에서 변수.
                          -합계에서 빼십시오.
                           Vv4 * / D1M- 바닥을 입력하십시오 (입력 / 400).
                                    + 합계에 추가하십시오.
                                     7M 모듈로 7
                                       -28에서 결과를 뺍니다.
                                        baa * / + 추가 .11
                                              N 숫자로 출력합니다.

아마도 이것에 대한 더 좋은 알고리즘이있을 것입니다 (그리고 이것은 끔찍한 골치입니다), 궁금한 사람들을 위해, 내 알고리즘은 여기 에서 나옵니다 .

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

그것을 계산하고 정확히 42 바이트를 갖는 보너스 포인트를 얻습니까? 꿈은 망했다.

내가 잘못하고 있다고 지적 한 @ Hosch250에게 감사드립니다. : D 고정.


2
번호하지만 당신은 나를에서 +1을받을)
코너 오브라이언

2016 년 추수 감사절은 11 월 28 일이라고합니다. 실제로 11 월 24 일입니다.
Hosch250

@ Hosch250 당신 말이 맞아요.
애디슨 크럼

10

파이썬, 38 * 0.75 = 28.5 바이트

lambda x:28.11-(x-2+x/4-x/100+x/400)%7

이것은 Gregorian 달력에 0 년이 없으므로이 행동은 약간 의심 스럽지만 질문에 지정된 방식으로 음수 년과 함께 작동합니다.


1
당신은 떨어 뜨릴 수 있습니다 f=.
feersum

1
마이너스 날짜에 어떻게 작동합니까? 파이썬의 모듈로가 음수에 적용됩니까? : O
Addison Crump

문자열 반복을 사용하는 것이 더 짧아야합니다."Nov "+`...`
xnor

@VoteToClose Python 모듈러스는 두 번째 인수와 같은 부호를 가진 답을 제공합니다. 따라서 -40%7==2하지만-40%-7==-5
quintopia

@quintopia 잠깐만, 나는 바보 야. 괜찮아. 말이 되네요
애디슨 크럼

10

자바 스크립트 (ES6), 43.5

실제 바이트 수는 58입니다. -25 %의 보너스 적용 => 58 * 0.75 = 43.5

s=>new Date(s,10,(a=new Date(s,10).getDay())<5?26-a:a+21)

까다로운 해결 방법이나 계산없이 가능한 그대로 일직선 과 어리석은 방법입니다.

골프 골프 (ES5) + 데모 ​​:

function t(s) {
    a = new Date(s, 10).getDay();
    alert(new Date(s,10,a<=4?26-a:a+21))
}

t(prompt())

0-100 년을 입력하면 1900-2000 년이됩니다. 그러나 0-100 년은 1900-2000 년과 동일한 날짜를 주지만 다른 답변으로 판단됩니다.


교체 a+1822가 단지 "다른"및 "다른"에서라고 때문에, A는도 큰도 미만 4, 즉 정확히 4 인 경우에만 발생합니다.


교체 a<4?26-a:a>4?a+21:22a<=4?26-a:a+21


2
실례 내가 틀렸다가 아닌 경우 a<4?x:a>4?y:a+18에 해당 a<4?x:a>4?y:22?
ETHproductions

BTW, 0에서 99까지의 입력에 대해 잘못된 연도를 알려줍니다. 이것이 중요한지 확실하지 않습니다.
ETHproductions

@Eth LOL 물론 그렇습니다, 그것이 항상 4 + 18이라고 생각하지는 않았습니다 : D
nicael

@Eth hm, 0에서 99까지는 실제로 틀 렸습니다.
nicael

@Eth 0-100은 1900-2000과 동일한 날짜를 제공하며 다른 답변으로 판단됩니다.
nicael

8

티 스크립트, 35 33 24 바이트-25 % = 18

28.11-new D(x,8).getDay¡

이것은 Thomas Kwa의 영리한 공식 을 사용하는 JavaScript 답변 과 동일한 방법 입니다.

설명이있는 대체 버전

r(22,28)F(#/h/t(new D(x,10,l)))+'-11'

r(22,28)    // Range from 22 to 28
        F(    // filter, keeps elements for which the function returns true. 
          #    // Expands to function(l,i,a,b)
           /h/    // RegExp literal, Thursday is the only day with an 'h'.
              t(    // test, true if date string contains an 'h'.
                new D(x,10,l) // Create date object
                             ))+'-11' // Append '-11' for the month.

35 문자이지만 ¡ :) 때문에 36 바이트
nicael

@nicael 이 사이트 가 아니라;)
ETHproductions


@Downgoat는 일반적 으로이 형식을 사용하는데 , U + 00FF까지의 모든 문자는 1 바이트입니다.
ETHproductions

5

자이, 141 155 바이트

Python 구문과 함께 Java Calendar 및 Scanner 클래스를 사용합니다.

import java.util.Scanner as s;import java.util.Calendar as c
d=c.getInstance();k=s(System.in);d.set(c.YEAR,k.nextInt());d.set(c.DAY_OF_WEEK,c.THURSDAY)

편집 : 사소한 구문 문제로 14 바이트가 추가되었습니다.

또한 내 Brainfuck 버전을 참조하십시오 .


5

파이썬, 83 81 78 바이트

from datetime import*
lambda a:'Nov '+`((10-datetime(a,11,1).weekday())%7)+22`
  • -2 바이트 : 가져올 이름 추가 (@ Κριτικσι Λίθος 덕분에)
  • -1 바이트 : * import **로 변경되었습니다 (@FryAmTheEggman 덕분에)
  • -2 바이트 : 하루를 변환하기 위해 repr로 변경되었습니다 (@willem 덕분에)

1
바이트 수를 줄이려는 제안 : 사용 import datetime as d하면 프로그램에서 d사용할 때마다 사용할 수 있습니다 datetime.
Kritixi Lithos

2
팬더도 먹을 수 있습니다. import pandas;print'Nov '+`((10-pandas.datetime(input(),11,1).weekday())%7)+22`
Willem

@ ΚριτικσιΛίθος 그러나 datetime.datetime은 d.datetime 일뿐입니까?
TanMath

2
from datetime import*당신이 필요하지 않으므로, 심지어 약간 짧은 d.
FryAmTheEggman

5

엑셀 367 154 53~25% = 39.75 바이트

연도가 날짜 형식으로 A1 셀에 유지된다고 가정합니다. 추수 감사절이 열리는 11 월의 정수를 반환합니다.

이것은 정상적인 윤년에만 해당됩니다. 년, 2100, 2200, 2300이 윤년이 아니라는 사실을 설명하지 않습니다.

이것은 추수 감사절이 시작된 이후 1621 년 이후에만 작동하도록 설계되었습니다. (물론 0 AD로 돌아갈 것입니다).

=IF(MOD(YEAR(A1),4)=0,IF(WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,1127-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),1134-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))),IF(WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,1127-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),1134-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))))

예쁜 인쇄 :

=IF(MOD(YEAR(A1),4)=0,
    IF(WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,
       1127-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),
       1134-WEEKDAY(305+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))),
    IF(WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))<6,
       1127-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy")))),
       1134-WEEKDAY(304+DATEVALUE(("01/01/"&TEXT(A1,"yyyy"))))))

가! 1 월 1 일을 기준으로 계산 한 다음 2 월 29 일에 대처하기 위해 많은 윤년 계산을 수행하는 대신 11 월 1 일을 기준으로 계산해야했습니다. nb 이제 2100, 2200 및 2300 년을 올바르게 처리합니다. 구현은 Excel 설치의 기본 날짜 형식에 따라 달라집니다. 이 버전은 dd / mm / yyyy 용으로 설계되었습니다.

 =IF(WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy"))))<6,  
     1127-WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy")))),
     1134-WEEKDAY(DATEVALUE(("01/11/"&TEXT(C1,"yyyy")))))

이제 Smalltalk에서 간결한 계산을 얻기 위해 pfaffing을 수행했으며 Excel로 백 포트하면 다음과 같은 결과가 발생합니다.

=DATE(A1,11,MOD(12-WEEKDAY(DATE(9600+A1,11,1)),7)+22)

(연도는 여전히 A1이지만 정수로). 이것은 Thomas Kwa의 날짜 반복 트릭을 사용하여 7700BC / E 이후의 모든 날짜에 대해 2100 년, 2200 년 및 2300 년 동안 작동합니다.


1
1900 이전의 날짜로 이것을 시도하면 Excel 사본에서 작동하지 않습니다.
Angelo Fuchs

긴 버전도 작동하지 않습니다.
Angelo Fuchs

이전 날짜의 경우 Excel 사용자의 1900 년 이전 날짜 통합 문서를 사용하십시오. < exceluser.com/downloads/examples/post_900_123/index.html >
Euan M

이것이 작동하는지에 대한 질문, 나는 당신이 11 월의 날짜 만 출력 할 수 있다고 생각하지 않습니다. 어떤 형태의 "Nov"또는 "11"이 필요합니다.
lirtosiast

@Thomas Kwa 날짜 입력은 날짜 형식의 연도입니다. 그런 다음 계산은 11 월 1 일이되는 요일을 계산 한 다음 11 월 네 번째 목요일의 날짜를 계산합니다.
Euan M

4

PowerShell, 67 64 84 72 58 45 바이트

param($a)'Nov';28-(date "00$a/9/1").DayOfWeek

입력 정수를로 사용 $a하고 즉시 출력 Nov하고 줄 바꿈합니다. 그런 다음 새로운 것을 생성하고 그것이 무엇인지 결정 하기 전에 $a0과 9 월 1 일로 붙 입니다. 9 월 1 일이 일요일 ( 과 같음 ) 인 경우 추수 감사절은 28 일입니다. 9 월 1 일이 월요일 ( 과 같음 ) 인 경우 추수 감사절은 27 일입니다. 등등. 따라서 답을 출력하기 위해 요일을 뺍니다 .00$a/9/1dateDayOfWeek.DayOfWeek0.DayOfWeek128

3 자리 또는 4 자리 연도의 구문 분석을 중단하지 않고 2 자리 숫자 앞에는 1 자리 및 2 자리 연도를 사용합니다. .NET datetime은보다 적은 연도를 지원하지 않으므로 음수에 대해서는 작동 하지 않습니다 0.

이에 대한 도움을 주신 TessellatingHecklerToby Speight 에게 감사드립니다 .


"{0:D3}/Nov/$_" -f $a보다 짧고 "$($a.ToString("000"))/Nov/$_"동일한 결과를 생성하며, 11대신 사용할 수 있다고 생각합니다.Nov
n0rd

@ n0rd 아, 훌륭합니다! 네- Nov두 자리 연도를 제대로 인식하려고 할 때의 잔재였습니다. 그래서 그도 바꿔 놓을 것입니다. 감사!
AdmBorkBork

@TessellatingHeckler이 방법은 효과가 있지만 한 자리 연도를 설명하기 위해 두 개의 0을 추가해야합니다. 그렇지 않으면 20XX로 돌아 왔습니다. 도움 주셔서 감사합니다-답변을 업데이트했습니다.
AdmBorkBork

1
@TessellatingHeckler 내 시스템에서는 적어도 한 자리 연도를 date "11/1/$a"결과에 입력 Thursday, November 1, 2007 12:00:00 AM합니다. Calendar.TwoDigitYearMax 속성을 편집하지 않기 때문에 구문 분석 할 때 이중 제로 패딩이 붙어 있습니다.
AdmBorkBork

맞아 맞아. 더블 패딩입니다.
TessellatingHeckler

3

골프 스크립트, 25 * 0.75 = 18.75 바이트

~.4/.25/.4/2---+7%28\--11

이것은 요일에 Sakamoto의 공식을 사용합니다. 이 작업을 수행하는 사람들이 있으므로 출력 형식은 dd-mm입니다. 내 이전 제출물은 아래에서 찾을 수 있습니다.

~.4/.25/.4/2---+7%"Nov "28@-

3

TSQL, 478 296 바이트

그냥 재미 로요 일반적으로 날짜 차원 테이블을 사용하면이를 간단 select * from dimDate where [Year] = @Year and [Holiday] = 'Thanksgiving'하지만 만들지 않아도됩니다 .

create function a(@y varchar(4))returns date as begin declare @d date,@i int=0 set @d=convert(date,@y+'-11-01')declare @t table(d date,c int identity)while @i<28 begin if datepart(weekday,@d)=5 insert @t(d) select @d select @d=dateadd(d,1,@d),@i+=1 end select @d=d from @t where c=4 return @d end

언 골프 드 :

if exists(select * from sys.objects where name='a' and [type]='FN') drop function a
go

create function a(@y varchar(4))returns date
-- select dbo.a('2015')
as
begin
    declare @d date,@i int=0;

    set @d=convert(date,@y+'-11-01'); -- cannot golf out dashes for dates <year 1000

    declare @t table(d date,c int identity)

    while @i<28 
    begin -- populate "November" array
        if datepart(weekday,@d)=5 insert @t(d) select @d -- assumes @@datefirst = 7
        select @d=dateadd(d,1,@d),@i+=1
    end;

    select @d=d from @t where c=4 

    return @d

end

이것이 가장 짧은 방법입니까?
lirtosiast

코드 골프 규칙에 익숙하지 않을 수도 있지만 대답은 입력을 수락하고 OP와 일치하는 출력을 반환하는 DB 개체를 만듭니다. 입력을 인라인 코드로 받아 들일 수있는 경우 발생할 수있는 명백한 단축이 있지만 이것은 함수 객체 유형에 대한 나의 생각이었습니다. 두 경우 모두 더 골프를 칠 수 있다고 확신합니다. @ThomasKwa, 당신은 제안이 있습니까?
피터 Vandivier

글쎄, 이 대답이 언급하고 순수한 날짜의 물건을 귀찮게하지 않는 순수한 수학 공식을 사용할 수있는 것처럼 보입니다 .
lirtosiast

엄밀히 말하면 순수한 해결책은 아니지만 그 답을 읽으면 분명히 200자를 골라내는 아이디어가 나왔습니다. 감사!!
피터 Vandivier

(I는 의미 (28 - ( x - 2 + floor(x / 4) - floor(x / 100) + floor(x / 400) ) % 7그래, 다른 답변을 읽는 것은 많은 도움이하는 경향이있다).
lirtosiast

3

Pyth, 30 28 * 75 % = 21 바이트

나는 이것이 더 짧아 질 수 있다고 100 % 긍정적이지만, 야, 그것은 나의 첫 번째 Pyth 프로그램입니다! \영형/

-28.11%+-+-Q2/Q4/Q100/Q400 7

테스트 스위트

날짜를 dd.mm형식으로 출력 합니다.

가능 하면 골프를 치는 방법을 제안 하십시오 ! Pyth에 대해 더 자세히 알고 싶습니다.


2

뛰어나다, 64 48

A1의 해

= 날짜 (A1,11, CHOOSE (WEEKDAY (DATE (A1,11,1)), 26,25,24,23,22,28,27))

=DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22)

Excel은 현지화 기반이므로 이것을 테스트하고 싶습니다. 언어의 기능을 설명해주세요. 언어에 맞는 것을 고르실 수 있습니다.
Angelo Fuchs

1
또한,이 (엑셀의 내 사본 적어도)하지 전에 1900 날짜에 대한 작업을 수행
안젤로 Fuchs의

또한, 저장 13에 바이트 TEXT에서 =TEXT(DATE(A1,11,MOD(12-WEEKDAY(DATE(A1,11,1)),7)+22),"d mmm")출력이 서식없이 정수를 -.
user3819867

@ user3819867, 이것이 Excel에서 날짜를 저장하는 방법입니다. 포맷은 사용자에게
맡겨져

@AngeloFuchs, DATE는 연도, 월, 일을 매개 변수로 사용하여 날짜 값을 반환합니다. MOD는 나눗셈의 나머지 부분 (모듈러스)을 반환합니다. WEEKDAY는 요일을 반환합니다 (1 = 일요일, 2 = 월요일 등).
SeanC

2

베 펀지, 41 바이트

47*&:::4"d"*/\"d"/-\4/++5+7%-" voN",,,,.@

이 인터프리터 에서 실행하십시오 .

설명 : 일반적인 년은 365 = 1 모드 7 의 올해 플러스 4 일마다 년을 뺀 매 100 ( dASCII)에서 올해 플러스 매 400 번째 년 (현재 연도 포함) 윤년 일 차지한다. 의 결과는 :::4"d"*/\"d"/-\4/++다음 3월 5일으로 간주 할 수 있습니다 , 2 월은 공통 년 올해의 첫 날과 동일한 날에 떨어질 후 첫 날. 우리가 패턴을 교정 할 것을 후 5+7%-28에서 요일의 숫자를 빼는 합니다 ( 47*11 월 이전에 저장). 그런 다음 인쇄하십시오.

BC 년에 대한 수정 버전은 현재 보너스가 제공하는 것보다 59 -25 % = 44.25 바이트입니다.

47*&v
!`0:<+*"(F"_v#
" voN",,,,.@>:::4"d"*/\"d"/-\4/++5+7%-

2

Matlab, 78 바이트

x=find(all(bsxfun(@eq,datestr(datenum(input(''),11,1:30),'ddd'),'Thu')'));x(4)

2

루비, 60 58 57 * 0.75 = 42.75 바이트

->y{puts"Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

58 바이트

->y{puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

60 바이트

->y{puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11,1).wday]+21}"}

언 골프 드 :

-> y {
  puts "Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"
}

용법:

->y{puts"Nov #{[5,4,3,2,1,7,6][Time.new(y,11).wday]+21}"}

=> Nov 26

0

VBA, 124 바이트 * 75 % = 93 바이트

Function e(y)
For i = 1 To 7
x = DateSerial(y, 11, 21) + i
If Weekday(x) = 5 Then e = Format(x, "mmm dd")
Next
End Function

공백이 있는지, 확실하지 않은지 102 ~ 124 사이이며 자유롭게 편집하십시오.
정수가 유효한 출력이면 Format부품 을 제거하는 것이 좋습니다.


공백 개수; 프로그램에 불필요하다면 제거 할 수 있습니다.
lirtosiast

0

PHP 5.3+, 59 바이트

PHP 내장 함수 strtotime를 사용 하여 날짜를 구문 분석합니다.

<?=gmdate('M d',strtotime("Next Thursday $_GET[Y]-11-19"));

이는 값이 GET 매개 변수 Y 또는 over를 통해 전달 될 것으로 예상합니다 php-cli Y=<year>.

11 월 19 일 이후 다음 목요일을 찾으려고합니다.
지금까지 내가 한 테스트로 제대로 작동합니다.

2 자리 연도는 다르게 해석 될 수 있습니다.

나는 gmdate시간대 문제를 피하기 위해 사용 하지만 date(적어도 내가 사는 곳)을 사용하여 동일하게 작동합니다 .


1
답변은 입력 방법의 유효성을 논의하기에 적절한 장소가 아닙니다. 기본 I / O 메타 게시물 에이 옵션 을 만들었 으며 (커뮤니티가 투표 할 수 있도록) 대화 를 채팅으로 옮겼습니다 . (CC @Mego)
데니스

0

T-SQL 215 바이트 248 * 0.75 = 186 바이트

create function t(@y int)returns table return select x=convert(char(6),x,107)from(select x=cast(dateadd(dd,d,dateadd(yy,@y-2015+7600,'20151101'))as date)from(select d=21+n from(values(0),(1),(2),(3),(4),(5),(6))b(n))c)t where datepart(weekday,x)=5

언 골프

set nocount on;
if object_id('dbo.t') is not null drop function dbo.t
go

create function t(@y int)returns table return
    select x=convert(char(6),x,107)
    from (
        select
        x=cast(dateadd(dd,d,dateadd(yy,@y-2015+7600,'20151101'))as date)
        from (
            select d=21+n 
            from (values (0),(1),(2),(3),(4),(5),(6))b(n)
        )c
    )t
    where datepart(weekday,x)=5
go

이 테스트 비계로

select 
  [ 2015 = Nov. 26]=(select x from dbo.t( 2015))
 ,[ 1917 = Nov. 22]=(select x from dbo.t( 1917))
 ,[ 1752 = Nov. 23]=(select x from dbo.t( 1752))
 ,[ 1582 = Nov. 25]=(select x from dbo.t( 1582))
 ,[ 1400 = Nov. 27]=(select x from dbo.t( 1400))
 ,[ -480 = Nov. 25]=(select x from dbo.t( -480))
 ,[-5480 = Nov. 28]=(select x from dbo.t(-5480))
;
go

원하는 수율

2015 = Nov. 26  1917 = Nov. 22  1752 = Nov. 23  1582 = Nov. 25  1400 = Nov. 27  -480 = Nov. 25 -5480 = Nov. 28
--------------- --------------- --------------- --------------- --------------- --------------- ---------------
Nov 26          Nov 22          Nov 23          Nov 25          Nov 27          Nov 25          Nov 28

0

파이크 , 87 91107 77 76 바이트-25 % = 57

string t(int y){return"Nov "+((11-Calendar.Day(y,11,1)->week_day())%7+22);}

캘린더 모듈을 활용한다는 점에서 더 영리하다는 것을 알기 때문에 비교를 위해 오래된 것을 남겨 두지 만 위의 방법은 더 짧습니다.

string t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}

이것은 입력을받지 않는 것 같습니다.
피터 테일러

네, 혼란 스럽습니다. 일부 솔루션에는 함수 정의가 있고 일부는 정의되지 않은 변수를 사용하므로 바이트 수에 무엇을 사용 해야하는지 잘 모르겠습니다.
eMBee

" 어딘가에 정의되지 않은 변수 "를 사용하는 것으로 보이는 답 은 실제로 매우 짧은 함수 선언 구문을 사용하고 있다고 생각 합니다. stdin에 대한 특별한 대우를 받고 따라서 전체 프로그램을 작성하는 것을 선호하는 esolang을 사용하는 하나 또는 두 개의 답변이 있습니다. 나는 파이크를 모르지만 공백을 제거하고 함수 이름을 줄여서 string t(int y){object n=Calendar.Month(y,11);return"Nov "+(n->weeks()->day(4)&n->days())[3]->month_day();}107 바이트로 계산할 수 있다면.
피터 테일러

함수 선언이 아닌 몇 가지를 보았지만 고정 된 것처럼 보였지만 smalltalk 예제 만 맞지 않습니다. 만약 이것이 유효하다면 나는 이것의 또 다른 17 바이트를 면도 할 수 있습니다 ...
eMBee

스몰 토크 버전은 프로그램, 특히 작업 공간 표현으로 작성됩니다. 우리는 입력을 요구하기보다는 입력을받는다고 들었습니다.
Euan M

0

스몰 토크-삐걱 거리다와 파로 , 69 57 54 49 35 34 33 32-25 % = 24 바이트

"Nov nn": 69B 49B (-25 % = 36.75B)
11nn (anInt) : 57 54 32B (-25 % = 24B)

"Year supplied as an integer value, y  
 Result provided as an integer value, 11nn
 Methods Date>>y:m:d: and >>w created as duplicates 
 of year:month:day and weekdayIndex"
(12-(Date y:y m:11d:1)w)\\7+1122

이전 버전

11nn 출력

"Year supplied as an integer value, y  
 Result provided as an integer value, 11nn"
(12-(Date year:y month:11 day:1) weekdayIndex)\\7+1122

"Year supplied as an integer value, y  
 Result provided as an integer value, d, prefixed by 11"
d:=(12-(Date year:y month:11 day:1) weekdayIndex)\\7+1122

11 월 nn 출력

"Year supplied as an integer value, y  Result provided as a string, 'Nov nn'"
'Nov ', (12-(Date year:y month:11 day:1) weekdayIndex\\7+22) asString

nn 출력

"Year supplied as an integer value, y  Result provided as an integer value, d"
d:=(12-(Date year:y month:11 day:1) weekdayIndex)\\7+22

nb 이것은 메소드가 아닌 프로그램, 특히 작업 공간 표현식으로 제공됩니다.

입력이 주어진 것으로 가정합니다 ( "최대 4 자리 연도"라는 구절
에 따라). 입력을 선언하고 제공하는 것을 포함하면 11 개의 문자가 추가됩니다.

|y|y:=2015.(12-(Date y:y m:11 d:1)w)\\7+1122

eMBee 덕분에 'w'바로 앞의 공백을 제거하는 방법을 보여주었습니다.

실제로, 그것은 'd :'전에 공백을 제거하려고 영감을주었습니다
|y|y:=2015.(12-(Date y:y m:11d:1)w)\\7+1122
.


OP의 설명 에 따라 날짜 번호 버전이 유효하지 않습니다.
Mego

동의합니다. 그러나 목록에 몇 개의 숫자 만있는 버전이 있다고해서, 사과와 사과를 비교하기위한 것입니다
Euan M

0

GNU coreutils, 35 바이트

seq -f$1-11-2%g 2 8|date -f-|grep h

11 월 22-28 일 목요일에 목요일을 검색하면됩니다. 목요일에 'h'를 포함하는 유일한 약어이기 때문에 C 또는 POSIX 로케일에서 실행하십시오.


바이트는 더 길지만 영리한 대답은 다음과 같습니다.

echo Nov $((28-`date -d$1-5-5 +%w`))

우리는 3 월과 9 월 사이에 상당히 임의의 주에있는 날짜의 요일 번호를 검색합니다 (따라서 일과 월은 각각 한 자리 숫자이며 가능한 윤일의 영향을받지 않습니다). %w==0추수 감사절이 28 일인 일요일 ( )이 되도록 요일을 선택합니다 . 그런 다음 28에서 해당 값을 빼서 적절한 목요일을 얻을 수 있습니다.


2
Sean Connery가 실행하지 않으면 작동합니다.
bkul

0

TSQL, 53 52 바이트

DECLARE @ CHAR(4)=2000

PRINT DATEADD(d,59,DATEDIFF(d,1,DATEADD(m,9,@))/7*7)

깡깡이

9 월 2 일 전 또는 9 월 월요일 계산 및 59 일 추가

(10 월은 10 번째 달이므로 1 바이트를 절약하므로 10 월 4 일 이전 또는 월요일에 계산하고 31 일을 추가하는 것보다 낫습니다)


-1

펄, 92 바이트

use Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print "Nov $_":0for 22..28

편집 : 고정 출력 형식, 고정 버그 (예 : 2012 결과), 더 짧은 "for"형식이 사용되었습니다. msh210에게 감사합니다.


이것은 더 짧고 같은 일을합니다 : use Time::Local;(localtime(timelocal 0,0,0,$_,10,$ARGV[0]))[6]==4?print:0for 22..29. 그러나 두 스크립트 모두 같은 결함이 있습니다. (1) 필요에 따라 해당 월의 표현을 인쇄하지 않습니다. (2) 예를 들어 2012 년에 대해 잘못된 출력이 있습니다.
msh210
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.