음력 단계 계산


10

소개

tl; dr

이 도전에서 당신은 주어진 날짜에 대한 달의 위상을 계산해야합니다.


이 도전은 게임 사이코 소셜 시청각 실험 " Superbrothers : Sword & Sworcery EP "에서 영감을 얻었습니다 . 에서 S : S & S EP 일부 이벤트는 시간의 특정 지점에서만 발생하는 달의 위상은 모험의 결과에 중요하다.

Superbrothers 스크린 샷 : Sword & Sworcery EP

문제는 특정 날짜에 존재하는 달의 위상입니다. 초승달부터 1 분기까지, 보름달에서 3 분기까지의 각 주요 단계는 약 7.38 일입니다. 전체 음력주기는 약 29.52 일입니다. 이러한 값을 기반으로 다양한 계산 방법이 존재합니다. 1

입력

  • 1970 년 1 월 1 일과 2116 년 12 월 31 일 사이의 그레고리력을 기준으로 한 날짜입니다.
  • 다음 형식 중 하나를 선택할 수 있습니다 yyyy-mm-dd, dd.mm.yyyy, dd/mm/yyyy, yyyymmdd또는 ddmmyyyy.

산출

[0-7]이 인덱스가없는 배열을 기반으로 달의 위상을 출력합니다 .

['New moon', 'Waxing crescent', 'First quarter', 'Waxing gibbous', 'Full moon', 'Waning gibbous', 'Third quarter', 'Waning crescent`]

요구 사항

  • 프로그램이나 함수를 작성할 수 있습니다. 익명의 기능을 사용하는 경우 호출 방법의 예를 포함하십시오.
  • STDIN명령 줄 인수에서 함수 매개 변수로 또는 가장 유사한 항목에서 입력을 승인 합니다.
  • 이것은 이므로 바이트 단위의 최단 답변이 승리합니다.
  • 달의 위상을 계산하는 내장 또는 외부 라이브러리는 허용되지 않습니다. 2
  • 표준 허점은 허용되지 않습니다.

테스트

값은 다음과 같습니다. date | index of the phase | illumination | name

전체 음력주기 :

08.02.2016 | 0 |   0% | New moon
07.02.2016 | 7 |   2% | Waning crescent
07.02.2016 | 7 |   2% | Waning crescent
06.02.2016 | 7 |   6% | Waning crescent
05.02.2016 | 7 |  12% | Waning crescent
04.02.2016 | 7 |  19% | Waning crescent
03.02.2016 | 7 |  28% | Waning crescent
02.02.2016 | 7 |  37% | Waning crescent
01.02.2016 | 6 |  47% | Third quarter
31.01.2016 | 5 |  56% | Waning gibbous
30.01.2016 | 5 |  65% | Waning gibbous
29.01.2016 | 5 |  74% | Waning gibbous
28.01.2016 | 5 |  82% | Waning gibbous
27.01.2016 | 5 |  89% | Waning gibbous
26.01.2016 | 5 |  94% | Waning gibbous
25.01.2016 | 5 |  98% | Waning gibbous
24.01.2016 | 4 | 100% | Full moon
23.01.2016 | 3 | 100% | Waxing gibbous
22.01.2016 | 3 |  97% | Waxing gibbous
21.01.2016 | 3 |  93% | Waxing gibbous
20.01.2016 | 3 |  86% | Waxing gibbous
19.01.2016 | 3 |  77% | Waxing gibbous
18.01.2016 | 3 |  67% | Waxing gibbous
17.01.2016 | 3 |  56% | Waxing gibbous
16.01.2016 | 2 |  45% | First quarter
15.01.2016 | 1 |  33% | Waxing crescent
14.01.2016 | 1 |  23% | Waxing crescent
13.01.2016 | 1 |  14% | Waxing crescent
12.01.2016 | 1 |   7% | Waxing crescent
11.01.2016 | 1 |   2% | Waxing crescent
10.01.2016 | 0 |   0% | New moon

무작위 테스트 사례 :

14.12.2016 | 4 | 100% | Full moon
16.10.1983 | 3 |  75% | Waxing gibbous
04.07.1976 | 2 |  47% | First quarter
28.11.1970 | 0 |   0% | New moon

대부분의 방법은 과학적으로 정확하지 않으며 요즘 며칠 동안 서로 다른 웹 사이트에서 혼합 된 결과를 얻으므로 결과가 ± 1 일 범위 내에 있으면 허용됩니다 .

보너스

바이트 수를 줄이고 철회하십시오 .

  • 15 % – 색인 대신 출력 섹션에 나열된 위상의 실제 이름을 인쇄하십시오 .
  • 25 % – 빈 입력시 공백 또는 개행 문자로 구분하여 예정된 새롭고 보름달의 날짜를 인쇄합니다.

1 예 : Wikipedia의 계산 단계 .
2 미안 Mathematica .


내 돈은 Japt에 있습니다.
lirtosiast

각 단계는 얼마나 지속됩니까? 약 7 일 동안 지속되는 4 가지 주요 단계를 나타내지 만 처리해야 할 8 단계가 있습니다.
Sherlock9

1
각 단계의 기간을 이해하는 데 도움이 될 것이라고 생각합니다. 약 5 일 연속으로 테스트 사례를 게시 할 수 있습니까? 아니면 귀하의 계산에 의해 "왁싱 깁슨"에서 "깁슨 waning"으로 변경되는 데 시간이 얼마나 걸립니까? 예를 들어, 쿼터 문 은 50 % 조명 의 순간 이기 때문에 정의에 문제가 있습니다. 따라서 "1/4" 전날에만 ​​"왁싱 초승달"및 "wanning 초승달"이 있어야합니다. 후. 그러나 나는 확실하지 않다.
Sherlock9

그럼 내 솔루션을 시작하겠습니다. 이 문제를 해결해 주셔서 감사합니다.
Sherlock9

@ Sherlock9 나는 음력주기와 매일의 조명을 포함하여 임의의 값으로 테스트 사례를 업데이트했습니다. 희망적으로 이것은 도움이됩니다.
insertusername 여기

답변:


3

파이썬 2 3 255 204 180 178 바이트

일부 테스트 사례를 포함하여 여러 곳에서 하루나 이틀 정도 대답이 정확하지는 않지만 일부 부정확성이 허용된다는 말을 들었습니다. 어쨌든 달의 움직임은 결코 정확하지 않으며이 기능은 일반적으로 올바른 상태로 유지됩니다 (또는 적어도 너무 멀지 않습니다).

편집 : 내 코드를 수정하고보다 정확하게 만드는 과정에서 코드를 크게 줄였습니다.

편집 : 이 코드는 이제 한 줄짜리 Python 3 프로그램입니다. ( "마법 번호"라는 이름 으로 TimmyD기여 )

p,q,r=(int(i)for i in input().split("-"));t=q<3;y=p-2000-t;i,j=divmod(((r+(153*(q+12*t-3)+2)//5+365*y+y//4-y//100+y//400+11010)*86400-74100)%2551443,637861);print((86400<=j)+2*i)

언 골프 드 :

def jul(p,q,r):
    '''
    The Julian Day Number (JDN) of the input minus the JDN of January 7, 1970,
    the first new moon after January 1, 1970.
    '''
    t=q<3
    y=p-2000-t  # -2000 years to push day 0 to January 1, 2000
    return r+(153*(q+12*t-3)+2)//5+365*y+y//4-y//100+y//400+11010
    # +11010 days to push day 0 to January 7, 1970

def moon(s):
    '''
    Input format: yyyy-mm-dd

    An attempt at explaining the "magic numbers"
    - 29.53059 days is close to 2551443 seconds, so I used that
    - The offset of +12300 seconds because the new moon of 1970-01-07 was at 2035 UTC 
      or 12300 seconds before midnight. For those of you saying that this pushes 
      the beginning of my calendar to 2035, *6* January 1970, yes it does.
      But if I need to the calendar to recognize 1970-01-07 as the day of the new moon 
      which means that midnight needed to be a positive number of seconds, 0 <= x < 86400.
      Basically, I hacked it together, and +12300 worked.        
    '''
    d = 86400
    p,q,r = map(int, s.split("-"))
    z=(jul(p,q,r)*d+12300)%2551443  # 2551443 is about the number of seconds in a lunar month
    div, mod = divmod(z, 637861)    # 637861 seconds is about a quarter of a lunar month
                                    # div is what part of the lunar month this is (0 - 3)
                                    # mod is seconds since the start of the main phase
    return 2*div + (86400 <= mod)   # 2*div for the main phase, and 
                                    # is mod >= the number seconds in a day?
                                    # (+0 if within a day of the main phase, +1 otherwise)

@TimmyD 당신은 내가 얼마나 많은 마법의 숫자를 시도하고 이것을 XD를 작동시키기 위해 던 졌는지 전혀 모른다
Sherlock9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.