运行时返回最接近当前时间的时钟表情符号


20

if/else每30分钟我可能会有一个很大的状况,但我正在寻找更多基于数学和Unicode的解决方案。

这是时钟表情符号:🕐🕑🕒🕓🕔🕕🕖🕗🕘🕙🕚🕛🕜🕝🕞🕟🕠🕡🕢🕣🕤🕥🕦🕧。如果您缺少适当的渲染支持,则可以在下面(它们的顺序不相同,它们看上去可能与您看到的不同)或在Unicode图表第4页上看到它们。它们对应于Unicode代码点U + 1F550(时钟) FACE ONE OCLOCK)(FACE ONE OCLOCK)至U + 1F567(CLOCK FACE TWELVE-THIRTY)。

您面临的挑战是编写一个程序,将与当前系统时间最接近的钟面表情符号输出到STDOUT(应该将AM和PM视为相同)。例如,如果时间t为[5:15 <t <5:45),则将显示5:30表情符号🕠。

这是代码高尔夫球,因此以字节为单位的最短代码获胜。您可能想要包括一种轻松指定测试代码时间的方法。

边缘测试用例

Time   Output  Written
----------------------
11:48  🕛       12:00
3:15   🕞       3:30
9:45   🕙       10:00

在此处输入图片说明


7
这个问题目前不在这里,但是可能很容易解决。您需要一个客观的获胜条件,但是如果您标记问题代码高尔夫,那么编写最短程序的人将是获胜者。它也没有指定,但是您可以说“运行时输出最接近当前时间的时钟表情符号的脚本”,应该就足够了。另外,尽管在技术上并非必需,但我建议您允许使用其他语言提交。(反正有人可能会在Bash中做一个。)
undergroundmonorail

Windows命令提示符不支持表情符号:(
stokastic 2014年

2
我已对您的帖子进行了修改,以阐明规则并使其符合高尔夫规范,以使其符合我们的标准。如果我误解了任何内容,请随时进行编辑。
NinjaBearMonkey 2014年

3
xx:15和xx:45应该如何取整?
彼得·泰勒

1
@PeterTaylor如测试用例所示,应将它们四舍五入(即1:45 => 2:00)
NinjaBearMonkey 2014年

Answers:


9

Ruby — 61 54字节

Python 3-79 77 75 74字节

编辑:事实证明,这在Ruby中要短得多,因为Time不需要导入,并且整数除法是默认的。

a=(Time.now.to_i/900-3)/2%24
puts""<<128336+a/2+a%2*12

算术:

  • Time.now.to_i:自时代以来的秒数。
  • /900:将时间分为15分钟。
  • -3-4因为字符从1点开始,+1所以四舍五入到最接近的半小时,而不是向下。
  • /2:合并为半小时。
  • %24:从12小时中获取当前的半小时时段。
  • a/2 + a%2*12:考虑到以下事实:全时字符比半时字符先成一个块。

本地时间版本,69字节:

n=Time.now
a=((n.to_i+n.gmtoff)/900-3)/2%24
puts""<<128336+a/2+a%2*12

原始Python 3版本:

import time
a=int((time.time()/900-3)/2%24)
print(chr(128336+a//2+a%2*12))

打印当前时间UTC。Python 2 chr仅接受0-255,并且unichr仅接受0-65535。在Python 3中,/始终为浮点除法,//始终为整数除法。


12*(a%2)如果您以其他顺序执行操作,则可以从中删除括号a%2*12
xnor 2014年

7

Bash + Coreutils,60个字节

date +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4

表情符号可以在OSX终端上很好地渲染,但是对于Linux(Ubuntu 14.04),您必须 sudo apt-get install ttf-ancient-fonts

要测试不同的时间,请插入-d $timedate命令。例如用于测试12:59:

date -d 12:59 +%I\ 60*%M+45-30/24%%2+2~C*+C8335+0PP|dc|iconv -f ucs-4

5

JavaScript – 137 117 107 102 95

这很容易被击败,但是我会在这里尽力而为。

编辑1:现在像Python答案一样以UTC格式打印以节省20个字节。

编辑2:更改new Date().getTime()Date.now()保存10个字节。

编辑3:更改Math.round(x)~~(x+.5)保存5个字节。

编辑4:删除了不必要的内容,(&1023)从一些旧的开发版本中删除,在该版本中,我做了更通用的UTF-16编码以节省7个字节。

d=~~(Date.now()/18e5+.5)%24;d+=d<2?24:0;alert(String.fromCharCode(55357,56655+(d%2?23+d:d)/2));

JavaScript 确实允许使用表情符号,但是在UTF-16中将其编码为两个字符。幸运的是,我们可以简单地将它们定义为两个字符。第一个字符也是常量(0xD83D),而其他则更改。

或者,以当地时间打印, 137 132 125:


(d%2?23+d:d)一样d+d%2*23吗?
尼尔

4

CJam,50个字节

"🕐":i~et3=C%60*et4=+30d/mo2m24+24%_2%24*+2/+]:c

该算法很简单,将时间舍入到最接近的30分钟,计算从12 AM / PM开始经过了30分钟,如果数字是奇数,则将其加24,下限除以2,然后将初始unicode乘以代码点以获得正确的钟面。

另外,请确保您从1 AM / PM而不是12开始,因此请在此处进行补偿。

为了进行测试,请使用以下代码:

3:H;45:M;"🕐":i~HC%60*M+30d/mo2m48+48%_2%24*+2/+]:c

其中3:H;部分是当前小时,45:M;部分是小时的当前分钟。只需更换345与所需的值。

在这里在线尝试

并非所有unicode字符都可能会在在线版本上正确打印,具体取决于您的浏览器和操作系统以及所安装的字体。但是对我来说,在Windows 7的Firefox上,所有打印都很好。


@ user23013不错!我认为您应该将其发布为新答案,因为我没有打高尔夫球:)
Optimizer

3

CJam,31个字节

"🕐")et5<60b675+30/24%2mdC*++

您可以在以下程序中更改时间进行测试:

"🕐")[2014 12 19 22 14 1 901 5 -28800000]5<60b675+30/24%2mdC*++
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.