找到最近的钟针


15

挑战

给定午夜之后几秒钟的时间,请输出时钟表盘上任何两只指针之间的最小角度,并使用尽可能少的字节。

您可以假设秒数始终小于86400。角度可以用度或弧度表示。

参考解决方案位于:http : //ideone.com/eVdgC0

测试用例(以度为单位的结果)

0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333

澄清说明

  • 时钟有3针:时,分和秒。
  • 所有指针都连续移动,因此可以在表盘的刻度之间找到时针和分针。

相关挑战(仅分针和时针,以度为单位)
Sp3000

1
您可能应该明确地说,时钟是秒针。
isaacg 2015年

您可以添加一些测试用例吗?
Beta Decay's

1
在某些时钟上,秒针到达顶部时,分针跳至下一分钟。在其他方面,它不断地移动。我认为这是一个时钟,它会不断移动吗?另外,尽管您仔细阅读后便很清楚,但我最初发现“秒针”含糊不清,因为大多数时钟无论如何都至少有两只手,因此添加“秒针”确实增加了第三只手。
Reto Koradi

1
@BetaDecay当然。我可能会说类似的话:“时钟有三只指针:时,分和秒。”
Reto Koradi

Answers:


10

CJam,36 35 34 32 30字节

riP*30/_60/_C/]2m*::-:mc:mC$3=

输出以弧度为单位。我已经验证了所有86400种可能输入的解决方案。

CJam解释器中在线尝试。

理念

由于弧度是一整圈,因此时钟上每分钟/秒的间隔为2π/ 60 =π/ 30弧度。

因此,将秒数除以π/ 30得出秒针的位置。

分针的移动速度是秒针的六十分之一,因此将结果从上方除以60将得到分针的位置。

同样,将最后的结果除以12得到时针的位置。

注意,上面的三商不一定在[0,2π)范围内

通过计算手的角度的所有九种可能的差异,我们获得三个0(手与自身之间的角度距离)和不同手之间的六个距离。

如果最接近的手是在不包括半12,一个的差异从上方将所希望的输出(MOD )。

然而,在一时55分30秒(例如),时针是在1.008弧度(57.75度)和在从5.812弧度(333.00度)的角度分针的角度12,从而4.804弧度的差(275.25度)。通过从一整圈中减去该结果,我们获得了“在另一个方向”上测得的角度,该角度等于1.479弧度(84.75弧度)。

现在,而不是映射每个角度θ[0,2π)和有条件地减去结果π,就可以简单地计算反余弦(COS(θ)),因为COS是周期性和甚至,和反余弦总是产生在值[ 0,π)

跳过三个最小的结果(全为零),第四最小的结果将是所需的输出。

ri                             e# Read an integer from STDIN.
  P*30/                        e# Multiply by π and divide by 30.
       _60/                    e# Divide a copy by 60.
           _C/                 e# Divide a copy by 12.
              ]2m*             e# Push the array of all pairs of quotients.
                  ::-          e# Replace each pair by its difference.
                     :mc       e# Apply cosine to each difference.
                        :mC    e# Apply arccosine to each cosine.
                           $3= e# Sort and select the fourth smallest element.

备用版本(34字节)

rd6*_60/_C/]360f%2m*::m360X$f-+$6=

输出以度为单位,不使用三角函数。

CJam解释器中在线尝试。


9

Mathematica,40个字节

Min@Abs@Mod[#{11,708,719}/120,360,-180]&

说明:t设为自午夜以来的秒数。每只手的位置是

hour: t/120 (mod 360)
min:  t/10 (mod 360)
sec:  6t (mod 360)

要计算x度数与y度数之间的绝对角距离,我们可以将y - x360调制到范围内[-180, 180],然后取绝对值。(请注意,有没有限制xy。)所以这个功能只是计算成对的差异t/10-t/1206t-t/10以及6t-t/120和做到这一点。


抱歉,不熟悉Mathematica,但这是否接受自午夜以来的秒数的参数或变量?
温妮

1
@Winny是的,它是一个纯函数(由表示&),其传递的第一个参数在内部称为#
jcai 2015年

7

Python,65岁

lambda n,l={720,60,1}:6*min((n/x-n/y)%60for x in l for y in{x}^l)

时,分和秒针所经过的距离,以圆圈的1/60为单位h,m,s = n/720, n/60, n/1。我们可以将这些mod 60用作从0到的圆上的位置60

如果我们采用它们的差模60,我们将得到一个在另一个前面的单位数。我们取所有六个可能的差,找到最小值,然后乘以6以重新缩放为360度。

两层列表解析首先选择第一手为代表720601,然后从该集合中选择另一只手,并通过集合xor删除第一选择。

我针对参考代码进行了详尽的测试。


6

C#,163152字节

这将创建每只手两次以进行环绕计数,然后遍历每种组合并找到手之间的最小角度。计算以60除法进行,然后乘以6得到度。

为了清楚起见缩进:

float F(int s){
    float b=60,c;
    float[]a={c=s/b/b%12*5,c+b,c=s/b%b,c+b,s%=60,s+b};
    for(s=36;s-->0;)
        b=s%6!=s/6&(c=(c=a[s%6]-a[s/6])<0?-c:c)<b?c:b;
    return b*6;
}

输出示例:

    0 seconds, 00:00:00, smallest angle is 0°
43200 seconds, 12:00:00, smallest angle is 0°
86399 seconds, 23:59:59, smallest angle is 0.09164429°
 3330 seconds, 00:55:30, smallest angle is 54.75°
39930 seconds, 11:05:30, smallest angle is 60.25001°
21955 seconds, 06:05:55, smallest angle is 65.49998°
21305 seconds, 05:55:05, smallest angle is 59.50001°
 5455 seconds, 01:30:55, smallest angle is 75.45831°
41405 seconds, 11:30:05, smallest angle is 44.95834°

很好的解决方案,以考虑回绕
TOTO

2

TI-BASIC,17个字节

min(cos⁻¹(cos(ΔList(Ans{6,.1,5!⁻¹,6

使用丹尼斯(Dennis)arccos(cos(归一化距离;但是,它只计算所需的三个,而不是计算所有成对的距离ΔList([seconds],[minutes],[hours],[seconds]

该程序期望Degree模式并以度为单位返回答案。

编辑:5!比短一字节120

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.