한 달의 텍스트 표현 (대소 문자를 구분하지 않는 전체 이름 또는 3 자 약어)이 주어진 경우 해당 월의 일 수를 반환합니다.
예를 들어 december
, DEC
및 dec
모든 31를 반환해야합니다.
2 월은 28 일 또는 29 일입니다.
입력이 올바른 형식 중 하나로 한 달이라고 가정하십시오.
december
, DEC
그리고 dec
해야 모든 반환 31"- 의도인가요?
한 달의 텍스트 표현 (대소 문자를 구분하지 않는 전체 이름 또는 3 자 약어)이 주어진 경우 해당 월의 일 수를 반환합니다.
예를 들어 december
, DEC
및 dec
모든 31를 반환해야합니다.
2 월은 28 일 또는 29 일입니다.
입력이 올바른 형식 중 하나로 한 달이라고 가정하십시오.
december
, DEC
그리고 dec
해야 모든 반환 31"- 의도인가요?
답변:
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]
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]
FEB
.
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
.substr(0,3)
필요하지 않다고 생각했다 . 따라서 다시 생각하면 이것이 최선의 방법이 아닐 수도 있습니다.
substr
? slice
!
@JustinMariner와 @Neil 덕분에 -3 바이트
m=>31-new Date(m+31).getDate()%31
죄송합니다. @Arnauld, JavaScript 이상을 남용하는 것은 멋진 기본 전환보다 짧습니다.
어떤 이유로, JavaScript는 지정된 달 이외의 날짜를 입력 할 수 있습니다. 이 코드는 해당 월의 일수가 몇 일인지를 계산하는 날짜입니다. 예 :
"FEB31"
→ Thu Mar 02 2000
→ 31 - 2 % 31
→ 29
"October31"
→ Tue Oct 31 2000
→ 31 - 31 % 31
→31
31
. new Date("feb31")
예를 들어 Chrome에서 작동하는 것 같습니다 .
+31
전체적으로 3 바이트를 절약 할 수 있습니다 . Firefox에서는 작동하지 않습니다.
cal $1|xargs|tail -c3
명령 행 인수로 입력을 취하고 후행 줄 바꿈으로 출력합니다. 2 월의 요일 수는 현재 연도의 요일 수에 따라 다릅니다.
필요 폴더의 유틸리티 - 리눅스 2.29 버전 cal
하나입니다, TIO 볼을 . 또한 로케일에 따라 다르므로 영어 이외의 시스템에서는 LC_TIME을 변경해야합니다 (명명을 위해 @Dennis 덕분에).
xargs
트림 cal
의 출력을 통한 배관 아이디어는 이 SO 답변 에서 비롯 됩니다.
k=>31-((e=k.lower()[1to3])in"eprunov")-3*(e=="eb")
Jonathan Frech 덕분에 -14 바이트
9 월, 4 월, 6 월, 11 월 30 일. 나머지는 모두 땅콩 버터를 먹었습니다. 할머니를 제외한 모든 사람; 그녀는 약간의 빨간 세발 자전거를 가지고 있었다. 그러나 나는 그것을 훔쳤다. muahahahahaha
(나는이 사이트에서 연령대에 대한 농담 (출처 : 내 수학 교수)을 말하기를 기다리고 있습니다 : D : D : D)
'sepaprjunnov'
목록 대신 단일 문자열을 사용할 수 있다고 생각합니다 .
m=>D.DaysInMonth(1,D.Parse(1+m).Month)
+24 using D=System.DateTime;
Grzegorz Puławski 덕분에 -3 바이트.
using System;
? 아니면 바이트 수에서 제외시킬 수 있습니까?
using D=System.DateTime;
그리고 m=>D.DaysInMonth(1,D.Parse(1+m).Month)
여기처럼 : tio.run/##jc5BSwMxEAXgs/…
x=input().lower()[1:3];print(31-(x in"eprunov")-3*(x=="eb"))
내 양성자 솔루션 포팅
완전히 휴먼 덕분에 -10 바이트
date -d1$1+1month-1day +%d
$1
월의 이름은 어디에 있습니까 ?
편집 : 많은 바이트를 저장해 주셔서 감사합니다 데니스 !
다양한 응답 (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
는 다양한 월 테스트 사례에 대해 해당 값을 처리하는 방법에 대한 증거를 보여줍니다 .
import ...,calendar as c
'calendar'를 두 번 입력하지 않아도되도록 사용하여 더 하향 조정했습니다 .
($_)=/.(..)/;
대신 $_=substr$_,1,2;
및 ()
주변 "eprunov"=~/$_/i
을 제거 할 수 있습니다.
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 바이트
f s|let i#n=n<mod(fromEnum$s!!i)32=sum$29:[2|2#2]++[-1|2#13,1#3]
c<3
대신 확인하여 바이트를 절약 할 수 있습니다 a==6
(2 월은 세 번째 문자로 주문한 경우 첫 달이며 12 월이 이어집니다)
암묵적 접두사 기능. 많은 시스템에서 기본값 인 ⎕IO
( i ndex O rigin)을 가정 0
합니다.
31 28 30⊃⍨∘⊃'.p|un|no|f'⎕S 1⍠1
⍠1
대소 문자를 구분하지 않고
1
길이를 반환
⎕S
PCRE S를 위한 earch
'.p|un|no|f'
모든 문자, "p"또는 "un"또는 "no"또는 "f"
⊃⍨∘⊃
그 첫 번째 요소를 사용하여 (없으면 0)
31 28 30
이 목록
그러므로:
Ap r, S ep , J un 및 No v는 인덱스 2에서 숫자, 즉 30을 선택합니다.
F EB 즉, 인덱스 1에서 28 수를 선택합니다
다른 것은 인덱스 0에서 숫자, 즉 31을 선택합니다.
* 클래식을 사용하고 계산 ⍠
으로 ⎕OPT
.
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
#~NextDate~"Month"~DayCount~#&
현재 연도가 윤년인지에 따라 2 월 중 하나 28
또는 29
2 월을 제공합니다 .
매스 매 티카의 모든 날짜 명령을 입력 해석하는 것 같은 April
, APR
, ApRiL
, 등 현재 연도의 해당 월의 첫날에. (보너스로 "February 2016"
또는 입력과 같이 또는 {2016,2}
예상대로 작동합니다.)
#~NextDate~"Month"
그 다음 달의 첫 번째 날을 DayCount
제공하고 두 인수 사이의 일 수를 제공합니다. 4 월 1 일에서 5 월 1 일 사이의 일 수는 4 월의 일 수인 30 일입니다.
m->31-new java.util.Date(m+"31 1").getDate()%31
Herman Lauenstein의 JS answer 와 동일한 아이디어를 사용하여 날짜를 31 번째로 설정하면 다음 달로 넘어갔습니다. Java는 1 년이 필요하므로로 설정되었습니다 1
.
i`f
28
i`p|v|un
30
\D
^$
31
온라인으로 사용해보십시오! 편집 : @RobertBenson 덕분에 1 바이트가 절약되었습니다. @ovs 덕분에 3 바이트가 절약되었습니다.
해결책:
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
Titus 덕분에 5 바이트 절약
<?=date(t,strtotime("$argn 1"));
파이프로 실행 -nF
.' 1'
, 그것이 없으면 TIO에서 작동하는 것 같습니다!
<?=date(t,strtotime($argn));
(와 함께 파이프로 실행 -nF
)
.' 1'
했지만 작동하지 않았습니다. 귀하의 의견을 본 후, 내가 뭘 잘못했는지 알아 내려고 노력했습니다. 매월 31 일에 실행했기 때문에 입력 한 월에 대해 31 일 (현재) 일이 걸리므로 현재 달을 넘어서게됩니다. 2 월 31 일은 3 월 3 일로 바뀌므로 코드는 31 (3 월의 일 수)을 반환합니다. 이로 인해 매월 31이 반환되었습니다. 따라서 .' 1'
매월 28 일 <= 28 일 없이 작동합니다 .
't'
->을 몰랐는지 모르겠다 t
. 또한 "파이프로 실행"하는 방법을 찾기 위해 많은 검색을 수행해야 -nF
했지만 알아 냈습니다. :)
s->{for(java.time.Month m:java.time.Month.values())if(m.name().startsWith(s.toUpperCase()))System.out.print(m.length(false));}
false
것과 같은 부울 식으로 단축 할 수 있다고 생각합니다 1<0
.
->m{((Date.parse(m)>>1)-1).day}
require'date'
루비 Date.parse
는 자체적으로 월 이름을 받아들입니다. 일반적으로 오른쪽 이동 ( >>
)이 실제로 Date
객체 의 월에 추가됩니다 . 뺄셈은 해당 월의 일에 영향을 미치며 이전 달의 마지막 날로 되돌아갑니다.
val d={m:String->arrayOf(0,31,30,30,31,30,31,28,31,0,30)[(m[1].toInt()+m[2].toInt())%32%11]}