Tính toán giai đoạn âm lịch


10

Giới thiệu

tl; dr

Trong thử thách này, bạn phải tính toán pha của mặt trăng cho một ngày nhất định.


Thách thức này được lấy cảm hứng từ trò chơi tâm lý thí nghiệm nghe nhìn xã hội " Superbrothers: Sword & Sworcery EP ". Trong S: S & S EP, các pha của mặt trăng rất quan trọng đối với kết quả của cuộc phiêu lưu vì một số sự kiện chỉ xảy ra tại một thời điểm cụ thể.

Ảnh chụp màn hình từ Superbrothers: Sword & Sworcery EP

Câu hỏi là: Giai đoạn mặt trăng nào có mặt vào một ngày cụ thể. Mỗi giai đoạn chính - từ mặt trăng mới đến quý đầu tiên đến trăng tròn đến quý thứ ba - dài khoảng 7,38 ngày. Toàn bộ chu kỳ mặt trăng là khoảng 29,52 ngày. Dựa trên các giá trị này, các phương pháp tính toán khác nhau tồn tại. 1

Đầu vào

  • Một ngày dựa trên lịch Gregorian, giữa ngày 1 tháng 1 năm 1970 đến ngày 31 tháng 12 năm 2116.
  • Bạn có thể chọn một trong các định dạng sau: yyyy-mm-dd, dd.mm.yyyy, dd/mm/yyyy, yyyymmddhoặc ddmmyyyy.

Đầu ra

Xuất chỉ mục [0-7]của pha mặt trăng dựa trên mảng không có chỉ mục này:

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

Yêu cầu

  • Bạn có thể viết một chương trình hoặc một chức năng. Nếu bạn đi với một chức năng ẩn danh, vui lòng bao gồm một ví dụ về cách gọi nó.
  • Đầu vào được chấp nhận từ STDIN, đối số dòng lệnh, dưới dạng tham số hàm hoặc từ tương đương gần nhất.
  • Đây là để câu trả lời ngắn nhất trong byte thắng.
  • Các thư viện tích hợp hoặc bên ngoài tính toán pha mặt trăng không được phép. 2
  • Sơ hở tiêu chuẩn là không được phép.

Xét nghiệm

Các giá trị là: date | index of the phase | illumination | name

Một chu kỳ mặt trăng đầy đủ:

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

Các trường hợp thử nghiệm ngẫu nhiên:

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

Vì hầu hết các phương pháp không chính xác đến mức khoa học và bạn cũng nhận được kết quả hỗn hợp trên các trang web khác nhau trong một vài ngày này, có thể chấp nhận được nếu kết quả của bạn nằm trong phạm vi ± 1 ngày .

Tặng kem

Giảm số byte và rút tiền của bạn :

  • 15% - In tên thực của pha như được liệt kê trong phần Đầu ra thay vì chỉ mục của pha.
  • 25% - In ngày của mặt trăng mới và trăng tròn sắp tới được phân tách bằng khoảng trắng hoặc dòng mới trên đầu vào trống.

1 Ví dụ: Tính pha trên Wikipedia.
2 Xin lỗi Mathicala .


Tiền của tôi vào Japt.
lirtosiast

Mỗi giai đoạn kéo dài bao lâu? Bạn tham khảo bốn giai đoạn chính kéo dài khoảng 7 ngày, nhưng có 8 giai đoạn để giải quyết.
Sherlock9

1
Tôi nghĩ để giúp tôi hiểu mỗi giai đoạn nên kéo dài bao lâu, bạn có thể đăng một trường hợp thử nghiệm trong khoảng năm ngày liên tiếp không, hoặc mất bao lâu để thay đổi từ, nói "sáp vượn" thành "vượn người" bằng cách tính toán của bạn? Tôi đang gặp rắc rối với các định nghĩa bởi vì, ví dụ, các mặt trăng quý là tức thời của tỷ lệ chiếu sáng 50%, vì vậy "quý đầu tiên" chỉ nên có vào ngày, với "lưỡi liềm sáp" và "lưỡi liềm waning" vào những ngày trước và sau. Nhưng tôi không chắc lắm.
Sherlock9

Được rồi, tôi sẽ bắt đầu với giải pháp của mình. Cảm ơn đã xóa một số điều này lên.
Sherlock9

@ Sherlock9 Tôi đã cập nhật các trường hợp thử nghiệm với chu kỳ mặt trăng đầy đủ và một số giá trị ngẫu nhiên, bao gồm cả chiếu sáng mỗi ngày. Hy vọng điều này là hữu ích.
insertusernamehere

Câu trả lời:


3

Python 2 3, 255 204 180 178 byte

Đây là câu trả lời không chính xác bởi một hoặc hai ngày ở một số nơi, bao gồm cả một số trường hợp thử nghiệm, mặc dù tôi đã nói rằng một số không chính xác là chấp nhận được. Ở mọi mức độ, chuyển động của mặt trăng không bao giờ chính xác và chức năng này nói chung vẫn đúng (hoặc ít nhất, nó không thay đổi quá xa).

Chỉnh sửa: Trong quá trình sửa mã của tôi và làm cho nó chính xác hơn, tôi đã đánh nó xuống đáng kể.

Chỉnh sửa: Mã này hiện là chương trình Python 3 một dòng. (Tín dụng cho TimmyD cho tên "số ma thuật")

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)

Ung dung:

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 Bạn không biết có bao nhiêu số ma thuật tôi đã thử và ném ra để làm cho nó hoạt động XD
Sherlock9
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.