수요일 수요일


22

수요일 수요일

당신의 임무는 특정 연도의 주요 날에 해당하는 수요일 수를 계산하는 것입니다. 예를 들어 7-13-16수요일입니다. 일관성을 유지하려면 모든 날짜에 그레고리력을 사용하십시오 .

입력

프로그램 / 기능에 대한 입력은 1 년 (예 :) 2016이며 유연합니다. 연도는 1912 에서 2233 사이의 정수 입니다.

산출

출력도 유연하며 수요일 (예 :)의 수 여야합니다 18.

채점

이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다!

테스트 사례

입력 -> 출력
--------------------
1,912 -> 19
1,914 -> 16
1,984 -> 17
1,996 -> 19
2,063 -> 19
2,150 -> 16
2,199 - > 18
2233- > 18

답변:


7

MATL , 38 36 34 바이트

FT+"@llI$YO]q&:t8XO!s9\~)9#1$ZOZps

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 (몇 초 소요).

설명

FT+     % Input year implicitly. Add [0 1] element-wise. Gives array with input year
        % and next year
"       % For each of those two years
  @     %   Push year
  ll    %   Push 1 twice. This indicates January 1.
  I$YO  %   Convert year, month, day to serial date number
]       % End for each. We now have the serial date number for January 1 of the input
        % year and that of the following year
q       % Subtract 1 to the latter, to yield December 31 of the input year
&:      % Inclusive range between those two numbers. This gives an array of serial date
        % numbers for the whole input year
t       % Push another copy of that array
8XO     % Convert to date string with format 8. This gives weekday as "Mon", "Tue" etc.
        % The result is a 3-column 2D char array, where each row is a day
!s      % Transpose, sum of each column. 'Wed' gives 288 (sum of ASCII codes)
9\~     % 288 gives 0 modulo 9, and is the only weekday to do so. So we compute modulo 9
        % and negate. This gives true for Wednesdays, false for the rest
)       % Apply as logical index into the array of serial date numbers
9#1$ZO  % Array of month numbers corresponding to those serial date numbers
Zp      % Array that contains true for prime numbers, false for the rest
s       % Sum of array. Display implicitly

MATL은 날짜 기반 도전에서 이길 수 없다고 확신합니다. 날짜 기반 과제를 처리하도록 최적화 된 DATL을 만들어야합니다.
Suever

@Suever Haha, 좋은 이름
Luis Mendo

20

파이썬 2, 95 93 68 67 바이트

lambda y:0x10ea2c8dbb06c5619/5**((y+((y-22)/99-y/2002)*16)%28)%5+16

1 바이트를 골라내는 @Josay에게 감사드립니다!

Ideone에서 테스트하십시오 .


3
0x10ea2c8dbb06c5619대신 1 개의 문자를 저장할 수 있습니다 19501370182350951961.
SylvainD

나는 그 생각을 이해 big_constant//5**long_expression하지만 어떻게 지구상에서 그 상수와 표현을 가지고 왔습니까? 미친 짓이야 : D
Sherlock9

2
상수는 기본 5 자리 숫자를 사용하는 단순 찾아보기 테이블이지만 10 진수로 변환되므로 숫자는 문자열 색인을 사용하지 않고 숫자로 추출됩니다. 그 표현은 나에게 영원한 달력처럼 보인다. (1901 년에서 2099 년으로 제한되면 문제는 너무 쉬울 것입니다. 대답은 해당 간격 내에서 28 년마다 반복되므로 mod 28 년을 취하여 표에서 찾아 보는 경우에 해당합니다. )
Neil

13

Brain-Flak , 6588 , 2310 , 2308 , 2290 바이트

먼저, 나는이 프로그램의 거의 100 %를 작성하지 않았는데, 이것은 아마도 프로그램의 거대한 크기에 의해 증명 될 것입니다. 이 코드의 대부분은 내 자신의 Brain-Flak 골프 알고리즘에 의해 작성되었습니다 . 추가 파이썬 스크립트와 함께 올바른 방향으로 프롬프트를 작성했습니다.

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

({}<(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()()())){}{}){})[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])()())[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])())()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())[()()()])())())[()])[()])()()())[()()])()())[()()()()])()())())[()()])())()())[()()()()])())()()())[()()()])()())[()()()])()())[()]))())()())[()()()()])())()()())>[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}]){({}[()]<{}>)}{}({}<{{}}>)

이 프로그램은 코드 골프에 비해 상당히 길지만 Brain-Flak의 경우에는 짧습니다. 현재 정수 나누기의 세계 기록은 1000 바이트 이상입니다.

설명

알고리즘은 매우 간단합니다. 사용 가능한 기간이 제한되어 있기 때문에 (321) 단순히 입력에서 답을 역순으로 푸시하고 조회 알고리즘을 사용하여 정답을 찾습니다. 321 가지의 가능성을 모두 하드 코딩하는 것은 이처럼 복잡한 작업과 뇌-플래 크처럼 난해한 언어에서는 다소 비효율적 인 것처럼 보일 수 있지만 가장 좋은 해결책 일 수 있습니다. (나는 다음 주에 알아낼 계획이다).

321 숫자의 대부분은 평균 약 18이므로 모든 숫자를 개별적으로 푸시하는 대신 해마다 조금씩 다릅니다. 나는 첫해 (2233)를 정상적으로 누른 다음 매년 값을 복제하고 조금씩 변경합니다. 후. 이 방법은 321 년 동안 ~ 18을 지불하는 대신 매년 ~ 2를 지불하는 것만 지불합니다.

모든 답변이 푸시되면 입력에서 1912를 뺍니다 ({}[(((((((((()()()()())){}{}){}){}){}){}[()]){}){}){}])(이것은 차선책 일 수 있습니다. 하드 코딩 숫자가 초 기하 급수적 인 프로세스이기 때문에 최적이 아닌 것으로 생각되는 특정 값을 건너 뛰기 위해 옵티 마이저를 다시 작성했습니다. 며칠이 걸렸습니다).

그런 다음 첫 번째 요소에서 하나를 빼고 결과가 0이 될 때까지 두 번째 요소를 팝합니다. {({}[()]<{}>)} .

0 {}과 상단 요소 아래의 모든 요소 가 나타납니다 ({}<{{}}>).


골프 숫자에 대한 일반적인 접근 방법은 무엇입니까?
Neil

간단한 아이디어는 인수 n과 m이있는 숫자가 있으면 n m-1 번 밀고 m-1 번 터지는 것입니다. 초기 푸시는 n으로 평가되고 각 팝은 추가 n으로 평가되어 (1 + m-1) (n)은 mn과 같습니다. n을 푸시하려면 n도 골프해야하기 때문에 이것은 재귀 적으로 수행됩니다. 이 방법은 일부 소수, 특히 소수에 대해 잘 작동하지 않으므로 근처에 더 효율적인 숫자가 있는지 확인 하고이 경우 해당 숫자의 합계와 차이로 이것을 표현합니다.
밀 마법사

그래서 두 개의 숫자 주어진 ... 참조 n하고 m있는 길이가 k하고 l나는 가정, n+m길이있을 것입니다 k+l? 무엇에 대해 n*m?
Neil

n*mk+4m-4l+4n-4. 곱셈이 하드 코딩 되었기 때문입니다. 우리는 먼저 n m-1시간을 밀어 넣 습니다. 이 우리의 요구를 수행하기 위해 k표현하기 위해 문자 n2m-2밀어을 표현하는 문자 (누를 때마다 2 상징이다). 그런 다음 우리는 m-1시간을 더 내고 추가 2m-2비용을냅니다 (팝은 2 개의 심볼도 필요합니다). 총합은 k+4m-4입니다. m*n( 계산 속성)을 곱하여 얻을 수도 l+4n-4있습니다. 결과는 둘 중 더 짧을 것입니다.
밀 마법사

1
음, 그게 사실이라면, +1이 비용, *24 비용, *38 비용, *4보다 고가 인 12의 요금으로 *2*2사용하지 않았다가 (1,000 아래 번호 중 내가 10을 발견 그렇게하지 가치 *2: 1, 2, 3 , 4, 5, 9, 15, 27, 45, 135). 1912 년에 제가 할 수있는 최선 ((((((1+1+1)*2+1)*2*2+1)*2+1)*2+1)*2+1)*2*2*2의 길이는 52 살이었습니다 .
Neil

7

배쉬 + 공통 유틸리티, 39

ncal $1|grep W|factor|egrep -c ': \S+$'

입력 연도를 명령 줄 매개 변수로 사용합니다. 일반적으로 STDERR에 다음과 같은 메시지를 출력합니다. 메타 답변에 따라 합법적이라고 생각합니다 .

factor: We is not a valid positive integer

STDERR 출력을 명시 적으로 억제하려면 43 점으로 대신 할 수 있습니다 .

ncal $1|grep W|factor 2>-|egrep -c ': \S+$'

여기에는 영어 또는 C / POSIX 로캘이 사용됩니다. gd_GB.utf8하루 종일 이름이 약자로 사용되는 곳 에서는 제대로 작동하지 않습니다 Di.
Toby Speight

6

옥타브, 86 바이트

이것은 어떤 스트레칭으로도 빠르지 않습니다 . 그러나 이것이 실제로 코드 골프의 목표는 아닙니다. 그렇지 않습니까?

function r=p(y)r=0;for(i=698346:7:815953)d=datevec(i);r+=d(1)==y*isprime(d(3));end;end

옥타브는 "날짜 번호"로 날짜를 추적 할 수 있습니다. 1 월 1 일 0 일이 1 일 경과 한 날 수입니다.이 측정법에 의해 1912 년 1 월 3 일 (우리 세트의 첫 번째 수요일)은 698,346 일입니다. 시작하여 2233이 끝날 때까지 7 일 (매주 수요일)마다 반복하고, 연도가 목표 연도이고 월-일이 소수이면 1을 추가하십시오.


5

파이썬 2.7, 166 , 165 , 150 바이트

from datetime import*
y=input()
d,c=date(y,1,1),0
while d.year==y:n=d.day;c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n));d+=timedelta(1)
print c

확실히 개선의 여지가 있습니다. 나는 파이썬에서 골프를 처음 접합니다. 이것은datetime모듈을 . 기준에 맞는 경우 누산기에 1 년을 추가하여 연중 내내 반복됩니다. 그런 다음 결과를 인쇄합니다. 대부분의 무거운 리프팅은 모듈에 있으므로 코드가 매우 얇을 수 있습니다.

1 바이트 덕분에 저장 모건 Thrapp 에 의해 저장된 15 바이트 Pietu1998을 .


1
로 전환 n%x==0하여 1 바이트를 절약 할 수 있습니다 n%x<1.
Morgan Thrapp

2
-1필요하지 않다 range'의 종료 인덱스는 배타적입니다. 또한 filter발전기를 발전기 로 변환 할 수 있습니다 . [0for x in range(2,n)if n%x<1]
PurkkaKoodari

대신 any(...)또는 all(...)대신 사용할 수 있습니다 not filter(...).
kennytm

1
체인 비교를 결합 all하면 전체 묶음을 저장할 수 있습니다. c+=n>1<2==d.weekday()>0<all(n%x for x in range(2,n))
PurkkaKoodari

3

J, 44 바이트

+/@(valdate*3=weekday)@,.&(,/(>:,"0/p:)i.12)

방금 J에 날짜 조작을위한 내장 기능이 있다는 것을 알게되었습니다.

용법

추가 입력은 여러 입력 / 출력을 형식화하는 데 사용됩니다.

   f =: +/@(valdate*3=weekday)@,.&(,/(>:,"0/p:)i.12)
   (,.f"0) 1912 1914 1984 1996 2063 2150 2199 2233
1912 19
1914 16
1984 17
1996 19
2063 19
2150 16
2199 18
2233 18

설명

+/@(valdate*3=weekday)@,.&(,/(>:,"0/p:)i.12)  Input: year
                                       i.12   The range [0, ..., 11]
                              >:              Increment each to get the months [1, ..., 12]
                                    p:        Get the first 12 primes [2, ..., 37]
                                ,"0/          Make a table between each month and prime
                           ,/                 Join the rows
                       ,.&                    Prepend the year to each
                                              The date format is YYYY MM DD
            3=weekday                         Check if each date occurs on Wednesday
    valdate*                                  and is a valid date
+/@                                           Count the number of true values and return

1

PowerShell v3 +, 99 95 바이트

무차별 대입 방식-

param($y)(1..12|%{$m=$_;2,3,5,7,11,13,17,19,23,29,31|?{(date "$m-$_-$y").DayofWeek-eq3}}).Count

입력을 $y받고, 루프를 반복 1하고 12, 월을 일시적으로 저장 $m한 다음, 모든 소수를에서 루프로 반복 2합니다 31. 이들 각각에 대해, 우리는 그 Get-Date날의 특정 날짜를 구성한 다음 DayOfWeek -equal 3(예 : 수요일) 을 가진 사람 만 선택합니다 . 배열을 공식화하기 위해 모든 것을 parens에 캡슐화하고 그 배열을 취합니다 .Count.


또는 수학적 접근 방식-

PowerShell v3 +, 105 바이트

param($y)(16,19,18,20,16,18,19)[($a=(date "1-1-$y").DayOfWeek)]+(1,-3,0,1,2)[$y%5]*($a-in0,2,3,4)*!($y%4)

무차별 대입 방식보다 머리카락이 길어 지지만 다른 사람들에게 도움이 될 수 있으므로 여기에 포함시킵니다.

다시 $y연도로 입력 을 받습니다 . 이번에는 첫해를 기준으로 엄격하게 수학 연산을 수행합니다. 먼저 요일을 계산하고 $a나중에 사용하기 위해 저장합니다 . 첫 번째 배열로 색인을 생성하여 일반적으로 올바른 숫자를 얻습니다. 잠재적 인 윤년인지, 일요일, 화요일, 수요일 또는 목요일인지, 연도를 기준으로 두 번째 지수를 추가해야합니다.

이것은 다음 관찰에 근거합니다. 첫 번째 열은 1 월 1 일 요일이며 두 번째 열은 일반적인 출력입니다. 연도가 중간 숫자 중 하나가 아닌 한, 대신에 parens의 숫자입니다. 마지막 열은 % 5 인덱싱 작동 방식을 설명합니다.

Jan-1 -> #  ... Except if $y=       (then it's this number) | $y % 5 =
Sun   -> 16 ... 1928 1956 1984 etc. (17)                    |    3
Mon   -> 19
Tue   -> 18 ... 1924 1952 1980 etc. (20)                    |    4
Wed   -> 20 ... 1936 1964 1992 etc. (17)                    |    1
Thur  -> 16 ... 1920 1948 1976 etc. (17)                    |    0
Fri   -> 18
Sat   -> 19

참고 : 둘 다 en-us문화 / 날짜 정보에 대한 현재 PowerShell 설정 이라고 가정 합니다. DayOfWeek다른 문화 변형에 따라 날짜 형식과 숫자를 조정해야 할 수도 있습니다.


1

루비, 83 + 15 ( -rdate -rprime플래그) = 98 바이트

온라인으로 사용해보십시오! (repl.it에서 플래그를 사용할 수 있으면 idk 때문에 가져온 모듈이 인라인됩니다)

->y{k=0;Prime.each(31){|d|k+=(1..12).count{|m|Date.new(y,m,d).wday==3 rescue p}};k}

1

자바 스크립트 ES6, 187 182 181 179 바이트

179 while 루프를 위해 for 루프로 교체

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);for(;a()<=y;c())N+=y-a()?0:-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b());return N}

181 장 삼진

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);while(a()<=y){N+=y-a()?0:-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b());c()}return N}

182 두 개의 루프를 결합

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);while(a()<=y){N+=a()==y?-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b()):0;c()}return N}

187

z=y=>{D=new Date("1/3/1912");N=0;a=()=>D.getFullYear();b=()=>D.getDate();c=()=>D.setDate(b()+7);while(a()<y)c();for(;a()==y;c())N+=-1<[2,3,5,7,11,13,17,19,23,29,31].indexOf(b());return N}

이 예에서는 특정 연도의 첫 번째 수요일을 지정한 것으로 생각하지 않습니다. 이 ... 지금까지 비록 유일한 매개 변수 ... 위대한 노력으로 연도를 필요로하는 영업 이익의 도전 상태
WallyWest

"프로그램 / 기능에 대한 입력은 1 년이 될 것입니다."그러나 당신이 지적하는 것은 그렇지 않습니다. 저는 OP가 제공 한 기간에 수요일마다 또는 그 이전에 있기 때문에 1912 년 첫 번째 수요일을 시드로 사용하지만, 1911 년 또는 그 이전에도 임의의 수요일을 사용하여 시드를 할 수 있습니다. 내 함수에 대한 입력은 여전히 ​​1 년 이며이 함수는 OP에서 제안한 시간대로 주어진 연도의 수요일 수요일 수를 계산하므로 이것이 어떻게 도전에 맞지 않는지 잘 모르겠습니다.
Pandacoder

아 죄송합니다. 처음에는 시드 구성 요소로 사용하고 있다는 사실을 잘 몰랐습니다 ... 좋은 생각입니다. 특히 솔루션을 고려하면 약 30
배나 빠릅니다

1
감사. 나는 그의 설명에 따라 Eamon Olive의 Brain-Flak 구현에서 영감을 얻었습니다. 실제로 모든 대답이 사전 프로그래밍되어 있습니다.
Pandacoder

1

배치, 248 바이트

@set/ad=0,l=1,n=20
@for /l %%i in (1913,1,%1)do @set/ad=(d+l+1)%%7,l=!(%%i%%4)-!(%%i%%100)+!(%%i%%400)
@goto %l%%d%
:03
:06
@set/an-=1
:12
:13
:16
@set/an-=1
:01
:04
:14
@set/an-=1
:00
:05
:10
:15
@set/an-=1
:02
:11
@echo %n%

설명 : d요일은 0월요일로, 1912 년 1 월 1 일은 편리 l합니다. 년이 윤년인지 여부를 나타내는 플래그는 11912 년입니다. 그런 다음 1913 년에서 입력 연도로 반복하여 요일을 업데이트합니다. 우리가 갈 때 윤년 플래그를 다시 계산하고 주. 마지막으로 우리는 윤년 플래그와 요일을 사용하여 n수요일 수요일의 주요 수 를 결정하기 위해 실제로 큰 switch 문을 색인화 합니다. n흐름 제어 로직을 사용하는 것보다 20을 설정 하고 가을에 따라 감소시키는 것이 더 저렴하지만, 비 도약 연도의 1 월 1 일이 목요일 또는 일요일이면 다른 경우에는 16 개의 주요 수요일 등이 있습니다. .


1

자바 스크립트 ES6 206 203 199 197 195 183 182 179

가장 짧지는 않지만 지금 할 수있는 최선은 ... 골프 제안을 환영합니다 ...

p=n=>--d-1?n%d&&p(n):1;v=Date;D=(x,y)=>new v(x.setDate(x.getDate()-y));W=a=>eval('for(Z=0,z=D(w=new v(a,11,31),(w.getDay()+4)%7);z>new v(a,0,1);)Z+=~~p(d=z.getDate()),z=D(z,7);Z')

변경 사항 :

  1. 삼항 성분 변경 : 3>=x?3-x:10-x 에서 6-(x+10)%7, 저장 : 3 선언 위치 변경;
  2. 합병 x=w.getDay();z=D(w,6-(x+10)%7) 하여 z=D(w,6-(w.getDay()+10)%7)저장 : 4
  3. 루프에서 날짜 선언 으로 이동 Z=0하여 for푸시z=D(w,6-(x+10)%7) 으로 for저장 정돈하는 루프 : 2
  4. 이동 w=new Date(a,Z=0,1)선언을 for루프 로 하여 기존 w선언 과 병합하여 저장 : 2
  5. 프라임 찾기 기능을 프라임 테스트 기능으로 다시 작성하여 다음을 저장합니다.
  6. 변경 +!!하려면 ~~줄이고 여전히 변환 p(d=1)에서 NaN0 저장, 여전히 일에 국무 테스트 기능을 허용 : 1
  7. 모든 추가 함수를 주 호출 함수 W에서 옮기고 for루프를 재정의했습니다. 12 월 31 일부터 역순으로 진행하여 Date개체를 별도의 변수로 쓴 다음 for루프를 eval호출에 다시 썼습니다 . 절약 3.

@ 판다 코더, 나는 당신을 따라 잡고있어, 친구!


1

R, 149147 바이트

y=function(x){s=strftime;b=ISOdate
a=seq(b(x,1,1),t=b(x,12,31),b='d')
length(a[s(a,'%u')==3&trimws(s(a,'%e'))%in%c(2,3,5,7,11,13,17,19,23,29,31)])}

Ideone에서 테스트하십시오 .


0

그루비, 126

Groovy는 소수의 유효성 검사를하지 않았으며,이를 구축해야했습니다.

{n->p={x->x<3||(2..Math.sqrt(x)).every{x%it}};(new Date("1/1/$n")..new Date("12/31/$n")).collect{it[7]==4&&p(it[5])?it:0}-[0]}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.