Kode APL untuk membongkar tanggal dikonversi ke jumlah hari melalui aturan Gregorian

Saya tertarik dengan kode APL untuk membongkar tanggal yang dikemas ke jumlah hari bilangan bulat menggunakan aturan kalender Gregorian.

Saya mengajukan pertanyaan sekitar sebulan yang lalu agar kode APL mengemas tanggal sehingga saya dapat menghitung jumlah hari antar tanggal (Konversi hitungan tanggal menjadi hari). Itu berhasil dengan baik dan sekarang saya ingin menyimpan kurma dengan cara ini; namun, itu berarti saya harus membongkarnya.

Saya sudah mencobanya tetapi logikanya menjadi kacau dan saya merasa meleset... ada kasus edge yang gagal.

Dengan asumsi fungsi unpacking adalah Y, yang ingin saya lihat:

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

Mungkin ada dukungan perpustakaan/intrinsik di beberapa versi untuk membantu menyelesaikan masalah ini, tetapi saya mencari solusi kode APL murni.


apl
person Paul Houle    schedule 20.09.2017    source sumber


Jawaban (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

Berikut ini contoh proses dengan outputnya (saya menggunakan hari bulan tahun hari ini):

Y 736592
2017 9 20
person Paul Smietan    schedule 20.09.2017
comment
Ini adalah jawaban yang bagus dan sangat dihargai; Saya menggunakan yang berfungsi di APL yang saya gunakan (yang bukan Dyalog). Namun saya akan mempelajari keduanya untuk mencoba dan mencari tahu cara kerjanya. - person Paul Houle; 21.09.2017

Anda tidak menyebutkan penerjemah mana yang Anda gunakan, jadi Anda mungkin perlu menerjemahkannya ke dalam dialek Anda. Berikut ini diambil dari ruang kerja dfsn 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