APL 代码,用于通过公历规则解压转换为天数的日期
APL code to unpack date converted to day count via Gregorian rules
我对 APL 代码感兴趣,该代码使用公历规则将打包的日期解压缩为整数天数。
大约一个月前我问了一个关于 APL 代码打包日期的问题,这样我就可以计算日期之间的天数 ()。效果很好,现在我想以这种方式存储日期;但是,这意味着我需要打开它们。
我已经尝试过了,但是逻辑变得一团糟,我觉得我没有抓住重点...有些极端情况会失败。
假设解包函数是Y,我想看到的是:
Y¨ 1 365 730 1095 736591
1 1 1 1 12 31 2 12 31 3 12 31 2017 9 19
某些版本可能library/intrinsic支持来帮助解决这个问题,但我正在寻找纯APL代码解决方案。
您没有提到您使用的是哪种翻译器,因此您可能需要将其翻译成您的方言。以下摘自Dyalog的dfsn-workspace
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│
└─────────────┴───────────────┴───────────────┴───────────────┴─────────────────┘
∇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
我对 APL 代码感兴趣,该代码使用公历规则将打包的日期解压缩为整数天数。
大约一个月前我问了一个关于 APL 代码打包日期的问题,这样我就可以计算日期之间的天数 (
我已经尝试过了,但是逻辑变得一团糟,我觉得我没有抓住重点...有些极端情况会失败。
假设解包函数是Y,我想看到的是:
Y¨ 1 365 730 1095 736591
1 1 1 1 12 31 2 12 31 3 12 31 2017 9 19
某些版本可能library/intrinsic支持来帮助解决这个问题,但我正在寻找纯APL代码解决方案。
您没有提到您使用的是哪种翻译器,因此您可能需要将其翻译成您的方言。以下摘自Dyalog的dfsn-workspace
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│
└─────────────┴───────────────┴───────────────┴───────────────┴─────────────────┘
∇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