이 도전은 매우 간단합니다. 1801 년에서 2400 년 사이의 연도를 입력하고 윤년인지 여부를 출력합니다.
입력 내용에는 줄 바꿈 또는 후행 공백이 없습니다.
1954
윤년인지 아닌지를 명확하게 알려주는 방식으로 원하는 방식으로 출력합니다 (예 / 아니오로 y 또는 n을 수락합니다)
당신은 여기에서 윤년 목록을 얻을 수 있습니다 : http://kalender-365.de/leap-years.php
윤년이 항상 4 년은 아니라는 것을 알고 싶습니다. 1896 년은 윤년이지만 1900 년은 아닙니다. 이 “건너 뛰기”를 따르는 년은 다음과 같습니다.
1900
2100
2200
2300
테스트 사례 :
1936 -> y
1805 -> n
1900 -> n
2272 -> y
2400 -> y
편집 : 이것은 표준 그레고리력 달력을 기반으로합니다 : http://www.epochconverter.com/date-and-time/daynumbers-by-year.php
답변
APL, 16 14 12 자
0
윤년 1
이 아닌 윤년을 반환 합니다 .
≥/⌽×4 25 4⊤⎕
tryapl.org 에서이 솔루션을 사용해보십시오 . {≥/⌽×4 25 4⊤⍵}
tryapl.com이 지원하지 않기 때문에 솔루션을 dfn 으로 변경했습니다 ⎕
. 참고 ⎕
빈 상자가 아닌 누락 된 문자입니다.
J의 동일한 솔루션 :
4 25 4>:/@|.@:*@#:]
설명
Dyadic ⊤
(인코딩)은 왼쪽 인수로 지정된 기본에서 오른쪽 인수를 나타냅니다. 4 25 4
이 솔루션에서 기본 을 사용 합니다. 이것은 y 를 다항식으로 나타냅니다
y mod 400 = 100 a + 4 b + c 여기서 b <100 및 c <4입니다.
명제하자 , β를 α, 및 γ 경우 나타내는 A, B, 및 C가 비 제로인 : 법안 γ 거짓이 경우 , Y가 (4)에 의해 분할 가능하고, β ∧ γ는 경우 거짓 Y가 100에 의해 분할 가능하다 α ∧ β ∧ γ IS y 를 400으로 나눌 수 있으면 false 입니다.
진리표 ( *
“무관심”을 나타냄)는 제안이 Δ y 가 윤년을 얻는 경우를 나타냅니다 .
α β γ | Δ
0 0 0 | 1
1 0 0 | 0
* 1 0 | 1
* * 1 | 0
다음 문장은 α , β 및 γ 에서 Δ를 표현합니다 .
Δ = ¬ (( α → β ) → γ )).
이 진술의 구조로 인해 ≥/⌽α β γ
, ≥가 ←를 구현 하는 축소 로 ¬Δ를 표현할 수 있습니다 . 이것은 내가 지금 설명하는 대답으로 이어집니다.
답변
Pyth, 11 바이트
!%|F_jQ*TT4
이 전체 프로그램은 STDIN에서 읽고 윤년 동안 True 를 인쇄 하고 그렇지 않으면 False 를 인쇄합니다 .
Pyth를 제안하고 기본적으로 CJam 코드를 포팅 한 @Jakube에게 감사드립니다.
Pyth Compiler / Executor 에서 테스트 사례를 직접 확인하십시오 .
작동 원리
jQ*TT Returns the evaluated input in base 10 × 10.
|F_ Swaps the digit order and reduces using logical OR.
So far, we've achieved 1954 -> [19, 54] -> 54 || 19.
!% 4 Returns the logical NOT of the result modulo 4.
This prints True for multiples of 4 and False otherwise.
답변
CJam, 12 바이트
rS+2m<~e|4%!
이 전체 프로그램은 STDIN에서 읽고 윤년 동안 1을, 그렇지 않으면 0을 인쇄합니다.
CJam 인터프리터 에서 테스트 사례를 직접 확인하십시오 .
작동 원리
r e# Read from STDIN.
S+ e# Append a space.
2m< e# Rotate two characters to the left.
~ e# Evaluate.
e# So far, we achieved "1954" -> "54 19" -> 54 19.
e| e# Logical OR; keep the leftmost non-zero integer.
4%! e# Logical NOT of the kept integer modulo 4.
e# This pushes 1 for multiples of 4 and 0 otherwise.
답변
자바 스크립트 (ES6), 21 자
표준 규칙은 y
4를 나누고 y
100을 나누지 y
않거나 400을 나누면 윤년 y
입니다. 코드에서
y%4 == 0 && (y%100 != 0 || y%400 == 0)
100과 400이 필요하지 않습니다. 대신 16 또는 4가 y를 나누는 지 여부를 확인하면 충분하고, 25가 y를 나누면 16을, 그렇지 않으면 4를 선택합니다. 골프, 이것은
!(y%(y%25?4:16))
이를 구현하는 자바 스크립트 함수의 길이는 21 자입니다.
l=y=>!(y%(y%25?4:16))
펄, 28 26 자
같은 생각이지만 펄입니다.
$_=$_%($_%25?4:16)?"n":"y"
-lp
옵션을 사용하여 실행하십시오 . 예를 들어
perl -lpe '$_=$_%($_%25?4:16)?"n":"y"'
테스트 세트를 입력으로 설정하면
1936
y
1805
n
1900
n
2272
y
2400
y
답변
핍 , 13 바이트
이것은 처음 등장한 것보다 더 흥미로웠다. 그것은 몇 가지 finagling을했다,하지만 난 결국에 그 긴 참조 대체 할 수 있었다 400
로 4
하고 h
변수 (= 100).
!(a%h?aa/h)%4
1
윤년 0
이 아닌 윤년에 대한 출력 . 설명:
a is command-line argument (implicit)
a%h?aa/h If a is divisible by 100, divide it by 100; otherwise, leave it alone
( )%4 The result mod 4 is 0 if it's a leap year, nonzero otherwise
! Negate and (implicitly) print
답변
Pyth, 19 15 14 바이트
xFm!%Q^d2[2TyT
너무 쉬운 방법입니다. 온라인으로 사용해보십시오 : 데모 또는 테스트 장치
편집 : 누락, 대신 Truthy / Falsy 값을 인쇄 할 수 있습니다 n/y
. -4 바이트
편집 2 : 마틴의 제곱근 아이디어를 사용했습니다. -1 바이트
설명
implicit: Q = input number
[ generate a list with the numbers:
2 2
T 10
yT 2*10 = 20
m map each number d to:
!%Q^d2 not(Q mod d^2) // True if Q % d^2 == 0 otherwise False
xF fold by xor
답변
정규식, 83 62 38
정규식의 두 절반을 결합하는 방법에 대한 팁을 제공 한 Toby에게 감사합니다.
1801..2400 범위에만 집중하고 입력이 정수라고 가정하면 :
(?!00)([02468][048]|[13579][26])(00)?$
원하는 범위에 대해 Ruby 에서 테스트하십시오 ( ^
= \A
및 $
= \Z
Ruby이므로).
r = /(?!00)([02468][048]|[13579][26])(00)?\Z/
(1801..2401).each do |year|
leap = year % 4 == 0 && ((year % 100 != 0) || (year % 400 == 0))
leap_regex = !year.to_s[r].nil?
if leap != leap_regex
print 'Assertion broken:', year, " ", leap, " ", leap_regex, "\n"
end
end
(Bonus) 1801..2400뿐만 아니라 음수가 아닌 연도에 효과가있는 것 :
^\d*(0000|(?!00)([13579][26]|(^|[02468])[048])(00)?)$
처음 100000 년 동안 Ruby 에서 테스트 ( ^
= \A
및 $
= \Z
Ruby이므로) :
r = /\A\d*(0000|(?!00)([13579][26]|(\A|[02468])[048])(00)?)\Z/
100000.times do |year|
leap = year % 4 == 0 && ((year % 100 != 0) || (year % 400 == 0))
leap_regex = !year.to_s[r].nil?
if leap != leap_regex
print 'Assertion broken:', year, " ", leap, " ", leap_regex, "\n"
end
end