เครื่องคิดเลขวันที่อาณาจักรลืม


18

ในความพยายามที่จะยกระดับสนามเด็กเล่นระหว่างภาษาที่มีไลบรารีวันที่ในตัวและที่ไม่มีให้ลองทำงานกับปฏิทินสมมติ อาณาจักรลืมคือการตั้งค่าแคมเปญ( ? ) สำหรับ Dungeons & Dragons แน่นอนว่าแต่ละคนมีปฏิทินของตัวเอง

ปฏิทินของ Harptos

สะดวกสบายหนึ่งปีในอาณาจักรที่ถูกลืมยังมี 365 วัน นอกจากนี้ปฏิทินยังมี 12 เดือน อย่างไรก็ตามนี่คือจุดที่น่าสนใจ ในแต่ละเดือนมีความยาว 30 วัน ส่วนที่เหลืออีก 5 วันเป็นวันหยุดซึ่งอยู่ระหว่างเดือน นี่คือเดือนและวันหยุดในการสั่งซื้อ (กับวันหยุดเยื้อง)

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

ขอให้สังเกตว่าฉันได้ใส่วันหยุดที่หกในวงเล็บ วันนี้เป็นวันอธิกสุรทินที่เกิดขึ้นทุก ๆ สี่ปีเท่านั้น (ใช่นั่นคือ - ไม่มีคนเสฉวนเพิ่มเติมมาหลายศตวรรษ)

หมายเหตุด้านข้างเกี่ยวกับชื่อเดือน: แต่ละเดือนมีชื่อทางการและชื่อสามัญ ข้างต้นเป็นชื่อสามัญ ฉันเลือกมันเพราะฉันคิดว่าพวกมันยอมให้มีการบีบอัดที่น่าสนใจ

มีหลาย numberings ของปีที่ผ่านมามี แต่ที่แพร่หลายมากที่สุดคือDalereckoning , ลงไปDR (นอกจากนี้ทุกปีมีชื่อหนึ่งชื่อหรือมากกว่าแต่เราจะไม่ไปสนใจชื่อนั้น)

ส่วนประกอบของวันที่ควรคั่นด้วยเครื่องหมายจุลภาคและเว้นวรรค โดยรวมแล้ววันที่ที่ถูกต้องอาจมีลักษณะดังนี้:

4, The Melting, 1491 DR

หรือ

Shieldmeet, 1464 DR

โปรดทราบว่าไม่มีหมายเลขวันสำหรับวันหยุด (ฉันคิดว่า4th of The Meltingน่าจะดีกว่าในช่วงหลายเดือน แต่ฉันไม่ต้องการลากเลขลำดับเข้าไปในสิ่งนี้)

เชิงอรรถ: ฉันเกิดขึ้นเมื่อ xnor บ่นว่าการท้าทายทุก ๆ วันที่ต้องการการคำนวณปีอธิกสุรทิน ฉันล้มเหลวในการกำจัดอย่างสมบูรณ์ แต่อย่างน้อยก็เป็นโมดูโลเดียวในปฏิทินนี้

ความท้าทาย

ได้รับวันที่ที่ถูกต้องของปฎิทินของ Harptos รวมถึงจำนวนเต็มDส่งออกDวันที่ในภายหลัง โปรดทราบว่าDอาจเป็นค่าลบซึ่งในกรณีนี้คุณควรคืนDวันที่ก่อนหน้านี้

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น, รับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด), อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ของฟังก์ชันและส่งผลลัพธ์ผ่าน STDOUT (หรือทางเลือกที่ใกล้เคียงที่สุด), ค่าส่งคืนของฟังก์ชันหรือพารามิเตอร์

คุณอาจคิดว่าปีนี้เป็นบวกและน้อยกว่า 2000

ใช้กฎมาตรฐานของ

กรณีทดสอบ

กรณีทดสอบโหลหรือมากกว่านั้นควรทดสอบทุกกรณีขอบรอบวันหยุดและปีอธิกสุรทิน ชุดถัดไปคือการทดสอบว่าใช้งานได้นานหลายปีและมีการใช้งานเดือนและวันหยุดทั้งหมด ครึ่งหลังเป็นกรณีทดสอบเดียวกันทั้งหมดอีกครั้ง แต่มีออฟเซ็ตเชิงลบ

"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 เป็นอีกหนึ่งการตั้งค่าแคมเปญ D & D ที่สำคัญ ฉันจำไม่ได้มากเกี่ยวกับปฏิทินของพวกเขายกเว้นดวงจันทร์ทั้งสามดวงของพวกเขาวงโคจรที่อธิบายรายละเอียดในหนังสืออ้างอิงบางเล่ม
CJ Dennis

คำตอบ:


5

Ruby, 543 523 521 498 511 509 ไบต์

เพื่อสนับสนุนคำตอบเพิ่มเติมสำหรับคำถามนี้ฉันจะโพสต์คำตอบ Python ของฉันในเวอร์ชัน Ruby เนื่องจากฉันคิดว่ามันจะสั้นกว่า คำตอบนี้สั้นลง แต่ไม่มากนัก สามารถคุณทำดีกว่า

แก้ไข:ขอขอบคุณมาร์ตินBüttnerและคำพูดของเขาที่นี่

แก้ไข:ฉันเล่นรายการ "จำนวนวันในหนึ่งเดือน" ลงอย่างมาก

แก้ไข:ในขณะที่ลงเล่นกอล์ฟว่าฉันจัดการd[10]=r%4<1?1:0กับd[10]=0**(r%4)byte ได้อย่างไรฉันสังเกตเห็นว่าฉันแนะนำ bug ในขณะที่เล่นกอล์ฟdจำนวนวันที่มีจำนวนมากดังนั้น Shieldmeet มีเวลา 30 วันโดยไม่ได้ตั้งใจ ดังนั้นการนับไบต์กลับมาอีกครั้ง ฉันจะแก้ไขคำตอบของ Python เพื่อแก้ไขจุดบกพร่องนี้ด้วย

แก้ไข:ฉันลืมว่าฟังก์ชั่นไม่จำเป็นต้องตั้งชื่อในคำถามนี้

->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"}

Ungolfed:

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 ไบต์

ในที่สุดฉันพบเวลาที่จะเขียนคำตอบสำหรับคำถามที่ยอดเยี่ยมนี้ มันยังไม่ได้ลงสนามมากนัก (รายชื่อเดือนและจำนวนวันมีมากโดยเฉพาะอย่างยิ่งในกรณีนี้และความจริงที่ว่าการจัดการเชิงลบDต้องแยกในขณะที่วน ) แต่อย่างน้อยก็เป็นคำตอบ

แก้ไข:แก้ไขข้อผิดพลาด

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"

Ungolfed:

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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.