윤년입니까? y 또는

이 도전은 매우 간단합니다. 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 자

표준 규칙은 y4를 나누고 y100을 나누지 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을했다,하지만 난 결국에 그 긴 참조 대체 할 수 있었다 4004하고 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$= \ZRuby이므로).

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$= \ZRuby이므로) :

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