首页
学习
活动
专区
圈层
工具
发布

耐久
EN

Code Golf用户
提问于 2022-06-03 08:56:07
回答 4查看 472关注 0票数 10

Introduction

时间是一个非常简单的概念。一秒过去了,一个接一个,都一样。但人类喜欢把它弄得很难。这个堆叠溢出问题收集了许多答案,尽管它们的长度和复杂性令人惊讶,但对于某些输入,它们中的大多数仍然会失败。你能将数秒格式化成供人类消费的时间戳吗?不仅准确,而且正确?

挑战

从浮点数秒数构建人类可读的时间戳。时间戳必须格式化为hh:mm:ss.zzz。单数小时、分钟和秒必须用前导零格式化。如果完整小时数为零,则必须省略小时数和前导冒号,使输出格式为mm:ss.zzz。请注意,小时数可能超过两位数。对于不能表示为有限数的输入,结果必须是--:--.--- (可能适用于您的语言的示例请参见下面)。这是code-golf,所以以字节为单位的最短代码获胜。

示例输入输出

代码语言:javascript
复制
0          -> 00:00.000
-0         -> 00:00.000
1          -> 00:01.000
-1         -> -00:01.000
0.001      -> 00:00.001
3.141528   -> 00:03.142
3600       -> 01:00:00.000
3599.9995  -> 01:00:00.000
363600     -> 101:00:00.000
17999.9999 -> 05:00:00.000
Infinity   -> --:--.---
-Infinity  -> --:--.---
NaN        -> --:--.---
EN

回答 4

Code Golf用户

发布于 2022-06-03 10:08:28

JavaScript (ES6),112个字节

代码语言:javascript
复制
f=n=>1/n?n<0?'-'+f(-n):(n=n*1e3+.5,(k=n/36e5|0)?k>9?k:'0'+k:'')+new Date(n).toJSON().slice(13+!k,-1):'--:--.---'

在网上试试!

怎么做?

我们使用toJSON()方法直接以预期格式提取分钟、秒和毫秒。这样的日期表示总是以UTC表示,因此我们不必费心于系统时区。

代码语言:javascript
复制
1970-01-01T00:00:00.000Z
              \_______/

时间是手动格式化的。除非没有完整的小时,而且字段根本没有插入,否则上面字符串中的前导冒号也会被包括在内。

票数 4
EN

Code Golf用户

发布于 2022-06-04 03:36:40

JavaScript™,161个字节

代码语言:javascript
复制
t=n=>(f=parseInt,O='0',p=n<0?(n=-n,'-'):'',h=f(n/3600),m=f(n/60%60),s=(n%60).toFixed(3),n-n==0?p+(h?(h>9?h:O+h)+':':'')+(m>9?m:O+m)+':'+(s<10?O+s:s):'--:--.---')

如果我使用|0来截断h & m,我可以节省13个字节,但我认为这会导致它在非常大的数字上失败(例如,Number.MAX_SAFE_INTEGER/3600|0 === -1966140585 )。

而且,这有点傻,但我认为,如果箭头函数被替换成一个普通的箭头函数,它甚至可以在只使用ES3的旧引擎中工作?(另一个JS答案使用.toJSON,我相信它是在ES5中添加的)。

代码语言:javascript
复制
(n => (
    // constants
    f = parseInt,
    O = '0',
    // variables
    p = n<0?(n=-n,'-'):'',
    h = f(n/3600),
    m = f(n/60%60),
    s = (n%60).toFixed(3),
    // return value
    n-n==0
        ? p+(h?(h>9?h:O+h)+':':'')+(m>9?m:O+m)+':'+(s<10?O+s:s)
        : '--:--.---'
) )
票数 3
EN

Code Golf用户

发布于 2022-06-03 16:04:57

MATLAB,114个字节

代码语言:javascript
复制
function d(i),if~isfinite(i),'--:--.---',end,f='hh:mm:ss.SSS';if abs(i)<3600,f=f(4:12);end,i=seconds(i);i.Format=f

使用MATLAB内置的“持续时间”类(及其导数,秒),我可以将浮动输入i转换为持续时间,并将输出格式更改为适合于挑战的格式。如果输入是nan或inf,则持续时间将显示为nan或inf,因此我对异常字符串进行了硬编码。

TIO没有MATLAB,但是八度,和八度没有内置的‘秒’类,所以我不能显示一个TIO链接。

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/248155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档