如何在 APL 中根据秒数创建时间字符串?

How do I create a time string from a number of seconds in APL?

我想将自午夜以来的秒数转换为 HH:MM:SS 格式的字符串。

例如,数字17672应该变成字符串'04:54:32'。我可以通过数学计算得到整数分量,如下所示:

      T←17672
      H←⌊T÷3600
      MS←3600|T
      M←⌊MS÷60
      S←60|T
      H M S
4 54 32

但我不知道如何将这个数组的三个组成部分连接成一个字符串(以冒号分隔),在每个时间组成部分左边填充一个零。例如,我想要

6 0 8

成为 '06:00:08'.

我可以使用 GNU APL 或在线 ngn-apl

第一步是使用“encode”函数改进计算:

      24 60 60⊤17672
4 54 32

为了格式化这些数字并插入冒号,我通常使用 ⎕FMT 这是一个特定于供应商的函数,用于将数字格式化为字符串。在大多数 APL 中执行此操作的一般方法可能是这样的:

     a←,⍕3 1⍴24 60 60⊤17672
     1↓,':',3 2⍴('0',a)[1+(⍳⍴a)×a≠' ']
04:54:32

最后,您可以将其放入函数中,而不是在会话中执行:

R←FormatSecs secs;a
a←,⍕3 1⍴60 60 60⊤secs
R←1↓,':',3 2⍴('0',a)[1+(⍳⍴a)×a≠' ']

我们来测试一下:

 FormatSecs 17672
04:54:32

任务完成;-)

在扩展 APL(所有现代 APL)中,您可以使用

1↓∊':',¨¯2↑¨⍕¨100+24 60 60⊤T

ngn/apl 有一个不合格的 所以你需要

1↓∊':',¨¯2↑¨,¨⍕¨100+24 60 60⊤T

Try it online!

在 Dyalog、GNU 和 ngn/apl 中,您可以通过将其括在大括号中来生成 dfn (lambda)。试试看 in ngn/apl and in Dyalog APL.

使用 Dyalog APL 16.0 或更高版本,您可以使用 @ 运算符放置冒号:

{1↓':'@4 7∊⍕¨100+24 60 60⊤⍵}

Try it online!