Máy tính ngày quên


18

Trong nỗ lực san bằng sân chơi giữa các ngôn ngữ có thư viện ngày tích hợp và những ngôn ngữ không có, hãy làm việc với một lịch giả tưởng. Vương quốc bị lãng quên là một thiết lập chiến dịch ( ? ) Cho Dungeons & Dragons. Tất nhiên, mỗi người có lịch riêng.

Lịch của Harptos

Thuận tiện, một năm ở cõi lãng quên cũng có 365 ngày. Hơn nữa, lịch cũng có 12 tháng. Tuy nhiên, đây là nơi nó trở nên thú vị. Mỗi tháng chính xác là 30 ngày. 5 ngày còn lại là những ngày nghỉ giữa các tháng. Dưới đây là các tháng và ngày lễ theo thứ tự (có ngày lễ thụt lề):

1   Deepwinter
        Midwinter
2   The Claw of Winter
3   The Claw of the Sunsets
4   The Claw of the Storms
        Greengrass
5   The Melting
6   The Time of Flowers
7   Summertide
        Midsummer
        [Shieldmeet]
8   Highsun
9   The Fading
        Highharvestide
10  Leaffall
11  The Rotting
        The Feast of the Moon
12  The Drawing Down

Lưu ý rằng tôi đã chèn một kỳ nghỉ thứ sáu trong ngoặc. Đây là ngày nhuận chỉ xảy ra bốn năm một lần (vâng, đó là - không có thêm shenanigans nào trong nhiều thế kỷ).

Lưu ý bên về tên tháng: mỗi tháng có một tên chính thức và tên chung. Trên đây là những tên phổ biến. Tôi đã chọn những thứ đó vì tôi nghĩ chúng cho phép nén thú vị hơn.

Có một số số của năm, nhưng phổ biến nhất là Dalereckaming , rút ​​ngắn thành DR . (Ngoài ra, mỗi năm có một hoặc nhiều tên , nhưng chúng tôi sẽ không bận tâm với điều đó.)

Các thành phần của một ngày nên được phân tách bằng dấu phẩy và dấu cách. Nói chung, một ngày hợp lệ có thể trông giống như:

4, The Melting, 1491 DR

hoặc là

Shieldmeet, 1464 DR

Lưu ý rằng không có số ngày cho các ngày lễ. (Tôi cho rằng 4th of The Meltingsẽ đẹp hơn vào những ngày trong tháng, nhưng tôi không muốn kéo số thứ tự vào đây.)

Chú thích: Tôi đã nghĩ ra điều này khi xnor phàn nàn rằng mọi thử thách ngày duy nhất đều cần tính toán năm nhuận. Tôi đã thất bại trong việc loại bỏ nó hoàn toàn, nhưng ít nhất nó chỉ là một modulo duy nhất trong lịch này.

Các thách thức

Cho một ngày hợp lệ của Lịch Harptos, cũng như một số nguyên D, xuất ra các ngày Dngày sau đó. Lưu ý rằng Dcó thể âm, trong trường hợp đó bạn nên trả lại ngày Dngày trước đó.

Bạn có thể viết chương trình hoặc hàm, lấy đầu vào qua STDIN (hoặc thay thế gần nhất), đối số dòng lệnh hoặc đối số hàm và xuất kết quả qua tham số STDOUT (hoặc thay thế gần nhất), tham số trả về hàm hoặc tham số hàm (out).

Bạn có thể cho rằng năm dương và dưới 2000.

Luật tiêu chuẩn được áp dụng.

Các trường hợp thử nghiệm

Hàng chục trường hợp thử nghiệm đầu tiên nên kiểm tra tất cả các trường hợp cạnh xung quanh các ngày lễ và năm nhuận. Bộ tiếp theo là để kiểm tra phạm vi trong nhiều năm làm việc và tất cả các tháng và ngày lễ đã được thực hiện. Nửa thứ hai là tất cả các trường hợp thử nghiệm một lần nữa nhưng với độ lệch âm.

"30, Summertide, 1491 DR" 1                 => "Midsummer, 1491 DR"
"30, Summertide, 1491 DR" 2                 => "1, Highsun, 1491 DR"
"Midsummer, 1491 DR" 1                      => "1, Highsun, 1491 DR"
"30, Summertide, 1492 DR" 1                 => "Midsummer, 1492 DR"
"30, Summertide, 1492 DR" 2                 => "Shieldmeet, 1492 DR"
"30, Summertide, 1492 DR" 3                 => "1, Highsun, 1492 DR"
"Midsummer, 1492 DR" 1                      => "Shieldmeet, 1492 DR"
"Midsummer, 1492 DR" 2                      => "1, Highsun, 1492 DR"
"Shieldmeet, 1492 DR" 1                     => "1, Highsun, 1492 DR"
"1, Highsun, 1490 DR" 365                   => "1, Highsun, 1491 DR"
"1, Highsun, 1491 DR" 365                   => "Shieldmeet, 1492 DR"
"Shieldmeet, 1492 DR" 365                   => "Midsummer, 1493 DR"
"Midsummer, 1493 DR" 365                    => "Midsummer, 1494 DR"
"Shieldmeet, 1500 DR" 365                   => "Midsummer, 1501 DR"

"14, Deepwinter, 654 DR" 5069               => "The Feast of the Moon, 667 DR"
"Midwinter, 17 DR" 7897                     => "15, The Fading, 38 DR"
"3, The Claw of Winter, 1000 DR" 813        => "25, The Claw of the Storms, 1002 DR"
"Greengrass, 5 DR" 26246                    => "9, The Claw of the Sunsets, 77 DR"
"30, The Melting, 321 DR" 394               => "29, The Time of Flowers, 322 DR"
"17, The Time of Flowers, 867 DR" 13579     => "20, Highsun, 904 DR"
"Highharvestide, 1814 DR" 456               => "30, The Drawing Down, 1815 DR"
"23, The Rotting, 1814 DR" 3616             => "16, Leaffall, 1824 DR"
"1, Deepwinter, 1 DR" 730499                => "30, The Drawing Down, 2000 DR"

"Midsummer, 1491 DR" -1                     => "30, Summertide, 1491 DR"
"1, Highsun, 1491 DR" -2                    => "30, Summertide, 1491 DR"
"1, Highsun, 1491 DR" -1                    => "Midsummer, 1491 DR"
"Midsummer, 1492 DR" -1                     => "30, Summertide, 1492 DR"
"Shieldmeet, 1492 DR" -2                    => "30, Summertide, 1492 DR"
"1, Highsun, 1492 DR" -3                    => "30, Summertide, 1492 DR"
"Shieldmeet, 1492 DR" -1                    => "Midsummer, 1492 DR"
"1, Highsun, 1492 DR" -2                    => "Midsummer, 1492 DR"
"1, Highsun, 1492 DR" -1                    => "Shieldmeet, 1492 DR"
"1, Highsun, 1491 DR" -365                  => "1, Highsun, 1490 DR"
"Shieldmeet, 1492 DR" -365                  => "1, Highsun, 1491 DR"
"Midsummer, 1493 DR" -365                   => "Shieldmeet, 1492 DR"
"Midsummer, 1494 DR" -365                   => "Midsummer, 1493 DR"
"Midsummer, 1501 DR" -365                   => "Shieldmeet, 1500 DR"

"The Feast of the Moon, 667 DR" -5069       => "14, Deepwinter, 654 DR"
"15, The Fading, 38 DR" -7897               => "Midwinter, 17 DR"
"25, The Claw of the Storms, 1002 DR" -813  => "3, The Claw of Winter, 1000 DR"
"9, The Claw of the Sunsets, 77 DR" -26246  => "Greengrass, 5 DR"
"29, The Time of Flowers, 322 DR" -394      => "30, The Melting, 321 DR"
"20, Highsun, 904 DR" -13579                => "17, The Time of Flowers, 867 DR"
"30, The Drawing Down, 1815 DR" -456        => "Highharvestide, 1814 DR"
"16, Leaffall, 1824 DR" -3616               => "23, The Rotting, 1814 DR"
"30, The Drawing Down, 2000 DR" -730499     => "1, Deepwinter, 1 DR"

1
DragonLance là một cài đặt chiến dịch D & D lớn khác. Tôi không thể nhớ nhiều về lịch của họ ngoại trừ ba mặt trăng của họ, quỹ đạo được giải thích chi tiết trong một số sách tham khảo.
CJ Dennis

Câu trả lời:


5

Hồng ngọc, 543 523 521 498 511 509 byte

Để khuyến khích nhiều câu trả lời hơn cho câu hỏi này, tôi sẽ đăng một phiên bản Ruby cho câu trả lời Python của tôi, vì tôi cho rằng nó sẽ ngắn hơn. Câu trả lời này này ngắn hơn nhưng không nhiều. Có thể bạn làm tốt hơn?

Chỉnh sửa: Cảm ơn Martin Büttner và đề nghị của anh ấy ở đây .

Chỉnh sửa: Tôi đã giảm đáng kể danh sách "số ngày trong một tháng".

Chỉnh sửa: Trong khi chơi golf xuống cách tôi xử lý d[10]=r%4<1?1:0đếnd[10]=0**(r%4) cho một byte, tôi nhận thấy tôi đã giới thiệu một lỗi trong khi chơi golf xuống d, số lượng danh sách ngày, do đó Shieldmeet có 30 ngày một cách tình cờ. Và do đó, số byte đã quay trở lại. Tôi cũng sẽ chỉnh sửa câu trả lời Python để sửa lỗi này ở đó.

Biên tập: Tôi quên rằng các chức năng không cần phải được đặt tên trong câu hỏi này.

->s,n{x=s[0..-4].split(", ");x=x[2]?x:[1,*x];t=(["Deepwinter,Midwinter","Winter","Sunsets","the Storms,Greengrass,The Melting,The Time of Flowers,Summertide,Midsummer,Shieldmeet,Highsun,The Fading,Highharvestide,Leaffall,The Rotting,The Feast of the Moon,The Drawing Down"]*',The Claw of ').split(?,);p,q,r=x[0].to_i+n,t.index(x[1]),x[2].to_i;d=[30,1,30,30]*4+[1,30];d[10]=0**(r%4);(a=p<1?1:-1;q=(q-a)%18;p+=a*d[a<0?q-1:q];r-=a*0**q;d[10]=0**(r%4))until(1..d[q])===p;z=d[q]<2?[t[q],r]:[p,t[q],r];z*", "+" DR"}

Ung dung:

def h(s,n)
  x=s[0..-4].split(", ")
  x=x[2]?x:[1,*x]
  t=["Deepwinter,Midwinter","Winter","Sunsets","the Storms,Greengrass,The Melting,The Time of Flowers,Summertide,Midsummer,Shieldmeet,Highsun,The Fading,Highharvestide,Leaffall,The Rotting,The Feast of the Moon,The Drawing Down"]
  t=t*',The Claw of '           # turns the above array into a string with "Claw"s inserted
  t=t.split(?,)                 # then splits that string back up again by ","
  p=x[0].to_i+n
  q=t.index(x[1])
  r=x[2].to_i
  d=[30,1,30,30]*4+[1,30]
  d[10]=0**(r%4)
  until(1..d[q])===p
    a=p<1?1:-1
    q=(q-a)%18
    p+=a*d[a<0?q-1:q]
    r-=a*0**q
    d[10]=0**(r%4)
  end
  z=d[q]<2?[t[q],r]:[p,t[q],r]  # putting z=[t[q],r] on another line saved me no bytes
  z*", "+" DR"
end

5

Python 3, 712 652 636 567 563 552 550 548 529 540 byte

Cuối cùng, tôi đã tìm thấy thời gian để viết câu trả lời cho câu hỏi xuất sắc này. Nó chưa được đánh gôn lắm (danh sách tên tháng và số ngày trong danh sách đặc biệt nghiêm trọng trong trường hợp này và thực tế là việc xử lý tiêu cực Dđòi hỏi một vòng lặp while riêng biệt ) nhưng ít nhất đó là một câu trả lời.

Chỉnh sửa: Sửa lỗi

def h(s,n):
 x=s[:-3].split(", ");x=[1]*(len(x)<3)+x;t="Deepwinter,Midwinter,The Claw of Winter,The Claw of the Sunsets,The Claw of the Storms,Greengrass,The Melting,The Time of Flowers,Summertide,Midsummer,Shieldmeet,Highsun,The Fading,Highharvestide,Leaffall,The Rotting,The Feast of the Moon,The Drawing Down".split(",");p,q,r=int(x[0])+n,t.index(x[1]),int(x[2]);d=[30,1,30,30]*4+[1,30];d[10]=r%4<1
 while p>d[q]or p<1:a=[-1,1][p<1];q=(q-a)%18;p+=a*d[q-(a<0)];r-=a*0**q;d[10]=r%4<1
 return', '.join([str(p)]*(d[q]>2)+[t[q],str(r)])+" DR"

Ung dung:

def harptos(date, num):
    t = "Deepwinter,Midwinter,The Claw of Winter,The Claw of the Sunsets,The Claw of the Storms,Greengrass,The Melting,The Time of Flowers,Summertide,Midsummer,Shieldmeet,Highsun,The Fading,Highharvestide,Leaffall,The Rotting,The Feast of the Moon,The Drawing Down"
    t = t.split(",")        # split up the names of the months
    x = date[:-3]           # removes " DR"
    x = x.split(", ")
    if len(x) < 3:
        x = [1] + x         # if we have two items (holiday), append a "day of the month"
    p = int(x[0]) + num     # initialize the "date" by adding num to it
    q = t.index(x[1])
    r = int(x[2])
    d=[30,1,30,30]*4+[1,30] # all the month lengths
    d[10] = r%4 < 1         # leap year toggle
    while p > d[q]:         # while the "date" > the number of days in the current month
        p -= d[q]           # decrement by number of days in current month
        q = (q+1)%18        # increment month
        r += 0**q           # increment year if the incremented month == the first month
        d[10] = r%4 < 1     # leap year toggle
    while p < 1:            # while the "date" is negative
        q = (q-1)%18        # decrement month first
        p += d[q]           # add the number of days in the decremented month
        r -= 0**q            # decrement year if the decremented month == the first month
        d[10] = r%4 < 1     # leap year toggle
    m = [t[q],str(r)]       # start the result array
    if d[q] > 2:
        m = [str(p)] + m    # if the month is NOT a holiday, add the day
    return ", ".join(m) + " DR"
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.