한 달에 몇 일입니까?


25

한 달의 텍스트 표현 (대소 문자를 구분하지 않는 전체 이름 또는 3 자 약어)이 주어진 경우 해당 월의 일 수를 반환합니다.

예를 들어 december, DECdec모든 31를 반환해야합니다.

2 월은 28 일 또는 29 일입니다.

입력이 올바른 형식 중 하나로 한 달이라고 가정하십시오.


19
우리가 받아 들일 수있는 달 이름의 모든 변형을 나열해야 할 것입니다.
Giuseppe

1
그것을 사용할 수있는 사람은 처음 3 자의 ASCII 서수 합계가 고유합니다.
완전히 인간적인

19
해결책을 받아들이기에는 너무 이르다.
Shaggy

5
형식이 기본적으로 고정 대 / 소문자로 변환하고 처음 3자를보고해야하기 때문에 입력이 고정 형식의 한 달에 불과하면 이것이 더 좋을 것이라고 생각합니다.
xnor

4
"예를 들어, - 그것은 당신이 나열된 모든 형태의 처리에 대한 답변을 원하는 모양의 약자로 december, DEC그리고 dec해야 모든 반환 31"- 의도인가요?
Jonathan Allan

답변:


4

파이크 , 9 바이트

l4C9@~%R@

여기 사용해보십시오!

l4        -   input.title()
    @     -  v.index(^)
  C9      -   ['PADDING', 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']
        @ - v[^]
     ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

또는 모든 입력 형식이 필요한 경우 15 바이트

l43<C9 3L<@~%R@

여기 사용해보십시오!

l43<            -   input.title()[:3]
          @     -  v.index(^)
    C9 3L<      -   ['PAD', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
              @ - v[^]
           ~%R  -  ['Padding', 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

6
에 대해 31을 반환합니다 FEB.
Laikoni

2
나는 Laikoni의 포인트가 (그것도 31을 반환 유효 @ 믿고 Apr, Jun, Sep,과 Nov)뿐만 아니라이 (내 참조 OP에 약간의 설명이 필요하다고 생각하는 질문 ).
Jonathan Allan

@JonathanAllan 음, OP 가이 답변을 수락 했으므로 유효하다고 생각합니까?
Outgolfer Erik

4
@EriktheOutgolfer 나는 개인적으로 그 결론에 뛰어 들지 않을 것입니다.
Jonathan Allan

한 가지 형태의 입력에 대해서만 작업해야한다는 인상을 받았습니다.
Blue

33

자바 스크립트 (ES6),  48 47 44 43  42 바이트

m=>31^'311'[parseInt(m[1]+m[2],34)*3%49%8]

데모

방법?

이러한 연산은 8 개의 항목으로 구성된 룩업 테이블로 이어지며, 값이 무작위로 분포 된 경우 그리 흥미롭지 않습니다. 그러나 2 보다 큰 결과 는 31 일로 매핑 됩니다. 따라서 처음 3 개의 항목 만 명시 적으로 저장하면됩니다.

Month | [1:2] | Base 34 -> dec. | * 3  | % 49 | % 8 | Days
------+-------+-----------------+------+------+-----+-----
  JAN |    AN |             363 | 1089 |   11 |   3 |  31
  FEB |    EB |             487 | 1461 |   40 |   0 |  28
  MAR |    AR |             367 | 1101 |   23 |   7 |  31
  APR |    PR |             877 | 2631 |   34 |   2 |  30
  MAY |    AY |              10 |   30 |   30 |   6 |  31
  JUN |    UN |            1043 | 3129 |   42 |   2 |  30
  JUL |    UL |            1041 | 3123 |   36 |   4 |  31
  AUG |    UG |            1036 | 3108 |   21 |   5 |  31
  SEP |    EP |             501 | 1503 |   33 |   1 |  30
  OCT |    CT |             437 | 1311 |   37 |   5 |  31
  NOV |    OV |             847 | 2541 |   42 |   2 |  30
  DEC |    EC |             488 | 1464 |   43 |   3 |  31

14
솔직히 지구상에서 어떻게 미친 수학 재료로 놀라운 기묘한 제출을하고 있습니까? D : 이것들을 찾을 수있는 프로그램이 있습니까, 아니면 나머지 사람들에게 너무 좋
습니까

1
@HyperNeutrino 첫 번째 시도는 항상 기본 변환을 찾은 다음 선택적 곱셈과 하나 이상의 모듈로 연산을 찾는 것입니다. 이것은 그렇게 빨리 발견되었습니다. 그러나 나는 도전을 잘못 읽고 처음에는 이것이 .substr(0,3)필요하지 않다고 생각했다 . 따라서 다시 생각하면 이것이 최선의 방법이 아닐 수도 있습니다.
Arnauld

substr? slice!
Neil

내 사소한 접근 방식은 <s> 2 </ s> 3 바이트 더 길기 때문에 더 이상 최적이 아닐 수도 있지만 여전히 인상적입니다 :)
HyperNeutrino

1
누군가의 편집으로 해당 부분이 제거되었지만 원래 허용하지 않은 이유 중 하나는 이와 같은 답변을보고 싶었 기 때문입니다. 나는 대문자와 다른 형식의 문제를 피하기 위해 사용 기반 34를 좋아합니다.
qw3n

15

자바 스크립트 (ES6), 36 33 바이트

@JustinMariner와 @Neil 덕분에 -3 바이트

m=>31-new Date(m+31).getDate()%31

죄송합니다. @Arnauld, JavaScript 이상을 남용하는 것은 멋진 기본 전환보다 짧습니다.

작동 원리

어떤 이유로, JavaScript는 지정된 달 이외의 날짜를 입력 할 수 있습니다. 이 코드는 해당 월의 일수가 몇 일인지를 계산하는 날짜입니다. 예 :
"FEB31"Thu Mar 02 200031 - 2 % 3129
"October31"Tue Oct 31 200031 - 31 % 3131

테스트 사례


MS Excel도이 작업을 수행합니다. 1 월 0은 항상 12 월 마지막 날이므로 = DAY ( "00/01/2017")는 31 일
DavChana

Javascript는 하루가 최대 31 일인 날짜 문자열 만 허용하는 것처럼 보입니다. "feb 32"를 입력하려고하면 2032-02-01로 변환되고 "0-feb-32"로 강제 적용하면 (또는 유사한 문자열) "잘못된 날짜"라고 표시됩니다. 이상하게도, 요일을 0 ( "feb 0")으로 설정하면 2000-01-31이 아니라 2000-02-01로 변환됩니다.
TehPers

전에 공백을 삭제하여 바이트를 절약 할 수 있습니다 31. new Date("feb31")예를 들어 Chrome에서 작동하는 것 같습니다 .
Justin Mariner

실제로 +31전체적으로 3 바이트를 절약 할 수 있습니다 . Firefox에서는 작동하지 않습니다.
Neil


7

배쉬 , 21 바이트

cal $1|xargs|tail -c3

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

명령 행 인수로 입력을 취하고 후행 줄 바꿈으로 출력합니다. 2 월의 요일 수는 현재 연도의 요일 수에 따라 다릅니다.

필요 폴더의 유틸리티 - 리눅스 2.29 버전 cal하나입니다, TIO 볼을 . 또한 로케일에 따라 다르므로 영어 이외의 시스템에서는 LC_TIME을 변경해야합니다 (명명을 위해 @Dennis 덕분에).

xargs트림 cal의 출력을 통한 배관 아이디어는 이 SO 답변 에서 비롯 됩니다.


2
이것은 단지 bash가 아닙니다. 일반적으로 문제가 있지만 cal, tail 및 xargs가있는 시스템에서 경로 조회 및 파이프를 지원하는 거의 모든 셸 구현 일 것입니다.
kojiro

5

양성자 , 50 바이트

k=>31-((e=k.lower()[1to3])in"eprunov")-3*(e=="eb")

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

Jonathan Frech 덕분에 -14 바이트

9 월, 4 월, 6 월, 11 월 30 일. 나머지는 모두 땅콩 버터를 먹었습니다. 할머니를 제외한 모든 사람; 그녀는 약간의 빨간 세발 자전거를 가지고 있었다. 그러나 나는 그것을 훔쳤다. muahahahahaha

(나는이 사이트에서 연령대에 대한 농담 (출처 : 내 수학 교수)을 말하기를 기다리고 있습니다 : D : D : D)


@Riker oh 내가 이것을 쓸 때 거기에
없었던 으악

1
유효한 월이 아닌지 확인하고 0을 반환해야하는 새로운 규칙이 있습니다. 삭제되기를 희망합니다
Level River St

1
그 부분을 삭제 중입니다.
qw3n

문자열 'sepaprjunnov'목록 대신 단일 문자열을 사용할 수 있다고 생각합니다 .
Jonathan Frech

@JonathanFrech 아마; 감사합니다
HyperNeutrino

4

C # (. NET 코어) , 52 + 13 = 65 38 + 24 = 62 바이트

m=>D.DaysInMonth(1,D.Parse(1+m).Month)

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

+24 using D=System.DateTime;

감사의 말

Grzegorz Puławski 덕분에 -3 바이트.


이없이 작동합니까 using System;? 아니면 바이트 수에서 제외시킬 수 있습니까?
Matty

@Matty 좋은 지적입니다. 이제 추가되었습니다.
Ayb4btu

늦은 팁이지만 -3 바이트 : using D=System.DateTime;그리고 m=>D.DaysInMonth(1,D.Parse(1+m).Month)여기처럼 : tio.run/##jc5BSwMxEAXgs/…
Grzegorz Puławski




2

파이썬 3 - (93) 86 84 82 바이트

다양한 응답 (TIO 링크를 사용하여 시간의 진행률 및 각 바이트 수 표시) :

원문 답변 (93 바이트)

Jonathan Frech 덕분에 -7 바이트 (86 바이트)

monthrange결과 에 대한 나 자신의 추가 테스트 덕분에 -2 바이트 더 증가 하고 두 번째 값은 항상 더 높은 값입니다. (84 바이트) 1

를 사용 import calendar as c하고 참조 하여 -2 이상을 참조하십시오 c.monthrange. (82 바이트, 현재 개정판 )


lambda x:c.monthrange(1,time.strptime(x[:3],'%b')[1])[1];import time,calendar as c

내장 기능을 사용하지 않는 HyperNeutrino의 대답 만큼 좋지 는 않지만 여전히 작동합니다.


각주

1 : TIO.run통한 테스트 사례monthrange 는 다양한 월 테스트 사례에 대해 해당 값을 처리하는 방법에 대한 증거를 보여줍니다 .



@JonathanFrech 감사합니다. 월간 작동 방식을 더 많이 테스트하고 import ...,calendar as c'calendar'를 두 번 입력하지 않아도되도록 사용하여 더 하향 조정했습니다 .
Thomas Ward


2

하스켈 , 65 63 62 바이트

f.map((`mod`32).fromEnum)
f(_:b:c:_)|c<3=28|c>13,b>3=30
f _=31

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

패턴 매칭 접근법. 첫 번째 줄은 대소 문자를 구분하지 않는 것입니다. 그런 다음 28세 번째 문자가 C보다 작은 경우 (숫자 3), 30두 번째 문자가 C보다 크고 세 번째 문자가 M보다 큰 경우, 31그렇지 않으면 반환합니다.

편집 : Leo 덕분에 -1 바이트


대안 ( 65 64 바이트)

f s|let i#n=n<mod(fromEnum$s!!i)32=sum$29:[2|2#2]++[-1|2#13,1#3]

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


1
영리한 사람! c<3대신 확인하여 바이트를 절약 할 수 있습니다 a==6(2 월은 세 번째 문자로 주문한 경우 첫 달이며 12 월이 이어집니다)
Leo

2

APL (Dyalog) , 32 바이트 *

암묵적 접두사 기능. 많은 시스템에서 기본값 인 ⎕IO( i ndex O rigin)을 가정 0합니다.

31 28 30⊃⍨∘⊃'.p|un|no|f'S 11

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

⍠1 대소 문자를 구분하지 않고

1 길이를 반환

⎕S PCRE S를 위한 earch

'.p|un|no|f' 모든 문자, "p"또는 "un"또는 "no"또는 "f"

⊃⍨∘⊃ 그 첫 번째 요소를 사용하여 (없으면 0)

31 28 30 이 목록

그러므로:

  • Ap r, S ep , J unNo v는 인덱스 2에서 숫자, 즉 30을 선택합니다.

  • F EB 즉, 인덱스 1에서 28 수를 선택합니다

  • 다른 것은 인덱스 0에서 숫자, 즉 31을 선택합니다.


* 클래식을 사용하고 계산 으로 ⎕OPT.


2

미디어 위키 템플릿, 19 바이트

{{#time:t|{{{1}}}}}

1

MATL , 22 바이트

14L22Y2c3:Z)Z{kj3:)km)

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

설명

14L    % Push numeric array of month lengths: [31 28 ... 31]
22Y2   % Push cell array of strings with month names: {'January', ..., 'December'}
c      % Convert to 2D char array, right-padding with spaces
3:Z)   % Keep first 3 columns
Z{     % Split into cell array of strings, one each row
k      % Convert to lower case
j      % Input string
3:)    % Keep first 3 characcters
k      % Convert to lower case
m      % Ismember: gives a logical index with one match
)      % Use that as index into array of month lengths. Implicit display

1

Wolfram Language (Mathematica) , 46 30 바이트

#~NextDate~"Month"~DayCount~#&

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

현재 연도가 윤년인지에 따라 2 월 중 하나 28또는 292 월을 제공합니다 .

작동 원리

매스 매 티카의 모든 날짜 명령을 입력 해석하는 것 같은 April, APR, ApRiL, 등 현재 연도의 해당 월의 첫날에. (보너스로 "February 2016"또는 입력과 같이 또는 {2016,2}예상대로 작동합니다.)

#~NextDate~"Month"그 다음 달의 첫 번째 날을 DayCount제공하고 두 인수 사이의 일 수를 제공합니다. 4 월 1 일에서 5 월 1 일 사이의 일 수는 4 월의 일 수인 30 일입니다.




1

q / kdb +, 36 바이트

해결책:

28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#

예 :

q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"January"
31
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"FEB"
28
q)28 30 31@2^1&(*)"ebeprunov"ss(_)1_3#"jun"
30

설명:

고양이를 껍질을 벗기는 방법은 백만 가지가 있습니다. 나는 다른 사람들과 약간 다르다고 생각합니다. 입력의 두 번째 및 세 번째 문자를 소문자로 사용한 다음 문자열에서 찾아보십시오 "ebeprunov". 그들이 0 위치에 있다면, 이것은 2 월이며,> 0에 위치하면 30 일이며, 문자열에 없으면 31 일입니다.

28 30 31@2^1&first"ebeprunov"ss lower 1_3# / ungolfed solution
                                        3# / take first 3 items from list, January => Jan
                                      1_   / drop the first item from the list, Jan => an
                                lower      / lower-case, an => an
                  "ebeprunov"ss            / string-search in "ebeprunov", an => ,0N (enlisted null)
             first                         / take the first, ,0N => 0N
           1&                              / take max (&) with 1, 0N => 0N
         2^                                / fill nulls with 2, 0N => 2
        @                                  / index into
28 30 31                                   / list 28,30,31

1

Excel VBA, 47 43 바이트

범위에서 월 이름, 약어 또는 숫자로 입력을 가져 와서 [A1]2001 년 해당 월의 길이를 VBE 즉시 창 함수로 출력하는 익명 VBE 즉시 창 함수.

?31-Day(DateValue("1 "&[A1]&" 1")+30)Mod 31

구 버전

d=DateValue(["1 "&A1&" 1"]):?DateAdd("m",1,d)-d

1

PHP, 38 33 + 1 32 + 1 바이트

Titus 덕분에 5 바이트 절약

<?=date(t,strtotime("$argn 1"));

파이프로 실행 -nF

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


1
이봐, 난 당신이 필요하다고 생각하지 않습니다 .' 1', 그것이 없으면 TIO에서 작동하는 것 같습니다!
돔 헤이스팅스

1
28 + 1 바이트 : <?=date(t,strtotime($argn));(와 함께 파이프로 실행 -nF)
Titus

3
@DomHastings-게시하기 전에.없이 작동하는지 테스트 .' 1'했지만 작동하지 않았습니다. 귀하의 의견을 본 후, 내가 뭘 잘못했는지 알아 내려고 노력했습니다. 매월 31 일에 실행했기 때문에 입력 한 월에 대해 31 일 (현재) 일이 걸리므로 현재 달을 넘어서게됩니다. 2 월 31 일은 3 월 3 일로 바뀌므로 코드는 31 (3 월의 일 수)을 반환합니다. 이로 인해 매월 31이 반환되었습니다. 따라서 .' 1'매월 28 일 <= 28 일 없이 작동합니다 .
조.

아아, PHP가 공백을 채우는 방법을 잊어 버렸습니다! 설명해 주셔서 감사합니다!
돔 헤이스팅스

@Titus 감사합니다. 나는 그런 골프 초보자입니다! 왜 내가 't'->을 몰랐는지 모르겠다 t. 또한 "파이프로 실행"하는 방법을 찾기 위해 많은 검색을 수행해야 -nF했지만 알아 냈습니다. :)
조.


0

QBIC , 49 35 바이트

?31-(instr(@aprjunsepnov feb`,;)%3)

약간의 속임수로 상당히 짧습니다.

설명

?                          PRINT
31-(                       31 minus
  instr(                   the position of
                      ,;   our input string
    @aprjunsepnov feb`  )  in the string cntaining all non-31 months                                
    %3)                    modulo 3 (this yields a 1 for each month except feb=2)


0

루비 , 45 바이트

->m{((Date.parse(m)>>1)-1).day}
require'date'

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

루비 Date.parse는 자체적으로 월 이름을 받아들입니다. 일반적으로 오른쪽 이동 ( >>)이 실제로 Date객체 의 월에 추가됩니다 . 뺄셈은 해당 월의 일에 영향을 미치며 이전 달의 마지막 날로 되돌아갑니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.