รหัส APL ที่จะคลายวันที่แปลงเป็นการนับวันตามกฎเกรกอเรียน

ฉันสนใจรหัส APL เพื่อคลายวันที่ที่บรรจุเป็นจำนวนเต็มโดยใช้กฎปฏิทินเกรกอเรียน

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

ฉันได้ลองแล้ว แต่ตรรกะเริ่มยุ่งเหยิง และฉันรู้สึกว่าตัวเองพลาดไป... มีกรณี Edge ที่ล้มเหลวอยู่บ้าง

สมมติว่าฟังก์ชันการเปิดออกคือ Y สิ่งที่ฉันต้องการเห็น:

    Y¨ 1 365 730 1095 736591
1 1 1  1 12 31  2 12 31  3 12 31  2017 9 19

อาจมีการสนับสนุนไลบรารี/ที่แท้จริงในบางเวอร์ชันเพื่อช่วยแก้ไขปัญหานี้ แต่ฉันกำลังมองหาโซลูชันโค้ด APL ที่แท้จริง


apl
person Paul Houle    schedule 20.09.2017    source แหล่งที่มา


คำตอบ (2)


      ∇r←Y b;d;m
[1]   r←r++⌿36584 73108 109632∘.≤r←146097|b←365+b
[2]   r←366|r++⌿425 790 1155∘.≤r←1461|r
[3]   m←+/r∘.≥d←0 31 60 91 121 152 182 213 244 305 335
[4]   r←(⌊0.5+(b-r)÷365.2425),m,(r-d[m-~⎕IO])∘.+,1

นี่คือตัวอย่างการทำงานพร้อมผลลัพธ์ (ฉันใช้วันเดือนปีของวันนี้):

Y 736592
2017 9 20
person Paul Smietan    schedule 20.09.2017
comment
นี่เป็นคำตอบที่ดีและน่าชื่นชมมาก ฉันไปกับอันที่ใช้งานได้กับ APL ที่ฉันใช้ (ซึ่งไม่ใช่ Dyalog) แต่ฉันจะศึกษาทั้งสองอย่างเพื่อพยายามค้นหาว่ามันทำงานอย่างไร - person Paul Houle; 21.09.2017

คุณไม่ได้บอกว่าคุณกำลังใช้ล่ามตัวไหน ดังนั้นคุณอาจต้องแปลเป็นภาษาถิ่นของคุณ ข้อมูลต่อไปนี้นำมาจาก dfsn-workspace ของ Dyalog

 date←{⎕ML←1                             ⍝ ⎕TS format from day number (Meeus).
     ⍺←¯53799                            ⍝ start of Gregorian calendar (GB).
     qr←{⊂⍤¯1⊢(0,⍺)⊤⍵}                   ⍝ quotient and remainder.
     Z F←1 qr ⍵+2415020                  ⍝
     a←⌊(Z-1867216.25)÷36524.25          ⍝
     A←Z+(Z≥⍺+2415021)×1+a-⌊a÷4          ⍝
     B←A+1524                            ⍝
     C←⌊(B-122.1)÷365.25                 ⍝
     D←⌊C×365.25                         ⍝
     E←⌊(B-D)÷30.6001                    ⍝
     dd df←1 qr(B-D)+F-⌊30.6001×E        ⍝
     mm←E-1+12×E≥14                      ⍝
     yyyy←C-6614+mm>2                    ⍝
     part←60 60 1000 qr⌊0.5+df×86400000  ⍝
     ↑[⎕IO-0.5]yyyy mm dd,part           ⍝
 }
      date¨1 365 730 1095 736591
┌─────────────┬───────────────┬───────────────┬───────────────┬─────────────────┐
│1 1 1 0 0 0 0│1 12 31 0 0 0 0│2 12 31 0 0 0 0│3 12 31 0 0 0 0│2017 9 19 0 0 0 0│
└─────────────┴───────────────┴───────────────┴───────────────┴─────────────────┘
person MBaas    schedule 20.09.2017