模拟是钝的!


23

模拟时钟有两只指针*:小时和分钟。
随着时间的流逝,这些指针绕着时钟的脸盘旋。分针每旋转一圈,时针就会旋转1/12。时针旋转2圈表示整整一天。

由于这些指针固定在同一中心点上并围绕该点旋转,因此您始终可以计算指针之间​​的角度。实际上,在任何给定时间都有2个角度。较大的一个和较小的一个(有时它们都等于180,但这并不重要)

*我们假设的时钟没有秒针

任务

给定时间为24小时格式,请以度为单位输出双手之间的较小角度。如果手是直接相对海誓山盟(如在6:0018:00等)输出180

规则

输入可以视为:-用定界符分隔的字符串:6:3214.26 -2个独立的值,字符串或整数:6, 3214, 26 -由2个值,字符串或整数组成的数组:[6, 32][14, 26]

您也可以选择指定你的答案需要输入要填充到2个位数(假设你把字符串),即:06:3206, 32[06, 32]

你还可以任选地反转的输入的顺序,同时分钟然后小时,即:32:632, 6[26, 14]

小时将是介于(023)之间的整数值(分钟)将是介于(059)之间的整数值

您可以假设分针沿着脸部以6度为增量(每个分钟值一个均匀间隔的位置)
您可以假定时针沿着脸部以0.5度为增量进行增量(一个分钟的位置均匀间隔)。每分钟值/小时值)

输出必须以度为单位,而不是以弧度为单位。您可以包括尾随.0在整数

计分

这是因此每种语言中的字节数最少获胜!

测试用例

Input: 06:32
Output: 4

Input: 06:30
Output: 15

Input: 18:32
Output: 4

Input: 06:01
Output: 174.5

Input: 00:00
Output: 0

Input: 00:01
Output: 5.5

Input: 12:30
Output: 165

Input: 6:00
Output: 180

Input: 23:59
Output: 5.5


2
@FryAmTheEggman“输出必须以度为单位,而不是以弧度为单位”,所以我想不是
Theo

1
忘了在5:59时针几乎在6点
aaaaa说恢复莫妮卡

4
建议的测试用例:(00:59 -> 35.5较小的值和较大的m值可能会使某些实现失败)。hm
Arnauld

1
谢谢@Arnauld,您花了我一个字节!:p
毛茸茸的

Answers:


14

JavaScript(ES6),  41 40  39字节

将输入作为(h)(m)

h=>m=>((x=4+h/3-m*.55/9)&2?12-x:x)%4*90

在线尝试!

怎么样?

而不是直接在[0..360]范围内工作,我们在[ 0..4 ]范围内定义一个临时变量x[0..4]

x=|4h12+4m60×124m60|mod4
x=|4h1244m60×12|mod4
x=|h311m180|mod4

以度为单位的角度由下式给出:

min(4x,x)×90

但是,该公式在JS代码中的实现方式略有不同,因为我们一定要避免使用冗长Math.abs()Math.min()

代替计算绝对值,我们通过计算来强制[0..12]为正值:

x=4+h311m180

而不是计算最小值,我们通过在简单的情况下对2进行按位与运算来确定是哪种情况-这就是为什么我们首先选择以2的幂为边界的区间的原因。


5

果冻14 12字节

ד<¿‘Iæ%Ø°AH

在线尝试!

以时间为单位的两个整数的单子链接:小时,分钟。

感谢@JonathanAllan节省了2个字节!

说明

ד<¿‘        | Multiply hour by by 60 and minute by 11
     I       | Find difference
      æ%Ø°   | Symmetric mod 360 [equivalent to (x + 360) mod 720 - 360]
          A  | Absolute
           H | Half

对称模组?怎么样了
毛茸茸的

@Shaggy非常方便,它以(-180, 180]相等的间隔(mod 360)返回值。那些内建的东西……
尼尔·

1
使用Ø°for 360“<¿‘for ,通过半度工作来节省两个字节60,11。像这样ד<¿‘Iæ%Ø°AH TIO
乔纳森·艾伦

我要说的是12个字符,但事实证明Windows-1252(和其他一些编码)实际上可以将其编码为12个字节。在各种非ASCII字符之间,我认为没有一种非Unicode编码可以覆盖所有字符,但是,显然,我错了。
塔纳托斯

@Thanatos一些专门用于代码高尔夫球的语言具有自己的代码页,这些代码页分别以1字节为单位编码256个字符。Jelly是其中之一,带有此自定义代码页。05AB1E,木炭,MathGolf,Stax等是其他具有自定义代码页的语言。不过,大多数确实基于Windows-1252。:)
Kevin Cruijssen

4

MATL,18个字节

30*i5.5*-t360-|hX<

接受两个小时的输入,然后是分钟。使用与此答案相同的方法

尝试一下 MATL Online上

说明

      % Implicitly grab first input (hours)
30*   % Multiply by 30
i     % Explicitly grab second input (minutes)
5.5*  % Multiply by 5.5
-     % Take the difference
t     % Duplicate the result
360-  % Subtract 360
|     % Take the absolute value
h     % Horizontally concatenate
X<    % Determine the minimum value
      % Implicitly display the result

这不会在午夜失败,180而是输出0吗?
毛茸茸的

4

Wolfram语言(Mathematica)30 29 28字节

5Abs@Mod[#.{6,-1.1},72,-36]&

在线尝试!

非高尔夫版本:

Abs[Mod[#.{30,-5.5}, 360, -180]] &

该函数的参数# = {h,m}包含小时和分钟。此长度为2的列表被解释为向量,并且{30,-5.5}计算出的点积:#.{30,-5.5} = 30*h-5.5*m。然后,我们计算360度的对称模量,并Mod[#.{30,-5.5}, 360, -180]给出一个介于-180 .. + 180之间的角度。Abs取其绝对值。

由于所有涉及的算子都是线性的,因此我们可以将所有出现的数相乘和除法,但是它们最方便。通过5从表达式中提取一个因子并将表达式中的所有数字除以5,可以最大程度地减少字节数。


3

炼金术士,134字节

_->In_h+In_m+720d+360a+f
h->60d
m+11d->
0m+d+a+0r->b
0a+0x->r
d+b+r->r+a
r+0b->
b+0d+0h+0y->5y
b+0d+5y->x
0b+0d+f->Out_x+Out_"."+Out_y

在线尝试!

说明

_->In_h+In_m+720d+360a+f

初始设置。在h和中输入小时和分钟m,将当前角度设置d为360度(720个半度),进行设置a以计算主角度,并设置输出标志。

h->60d
m+11d->

每小时加30度,每分钟减5.5度。

0m+d+a+0r->b
0a+0x->r

虽然r未设置(反向)标记,但每个d原子应将一个a原子移动到b。这是在分钟数都用完之后发生的,以避免出现“比赛条件”。没有的时候a剩余原子时,设置r为反向流动。

请注意,第二条规则可以触发多次,甚至可以在初始设置规则之前触发。这不会造成任何伤害,因此无需防止这种情况。该0x条件处理一个极端情况:当输入为6:00 a时,程序终止时没有原子,但是x如果最终结果至少为1度,则有原子。

d+b+r->r+a
r+0b->

反之:当符号角大于180度时,移动b原子a以减小输出角度。当角度达到“ 360”时,停止反转。

b+0d+0h+0y->5y
b+0d+5y->x

当所有度数原子都用完时,除以2得到输出角度。

0b+0d+f->Out_x+Out_"."+Out_y

完成此操作后,使用f初始设置中的标志仅输出一次。


3

Python 3.8(预发布)45 43字节

-2个字节,感谢Erik

lambda h,m:min(x:=abs(h%12*30-m*5.5),360-x)

在线尝试!

h%12-以12小时格式表示
h%12*30的小时
m/2- 整小时的时针角度-时针以m分钟
h%12*30+m/2为单位的角度
m*6- 时针的当前位置为角度-分针的角度(360°/60 = 6°




2

木炭,22字节

I↔⁻¹⁸⁰﹪⁻׳⁰⁺⁶N×⁵·⁵N³⁶⁰

在线尝试!链接是详细版本的代码。将输入作为两个整数。说明:

             N          First input
           ⁺⁶           Plus literal 6
        ׳⁰             Multiplied by literal 30
       ⁻                Minus
                  N     Second input
              ×⁵·⁵      Multiplied by literal 5.5
      ﹪            ³⁶⁰  Modulo literal 360
  ⁻¹⁸⁰                  Subtracted from literal 180
 ↔                      Absolute value
I                       Cast to string
                        Implicitly print


2

Python 3,40个字节

lambda h,m:180-abs(180-(h*30-m*5.5)%360)

在线尝试!

h*30-中午和小时之间角度h时的分钟是0; 如果时数等于或大于12,则该角度可以等于或大于360°
m*6-中午和分针之间的
m*.5角度-时针在m分钟后整整小时向前移动的角度(例如:如果是4:24,时针从其4点位置向前移12度)
h*30-m*5.5-时针和分针之间的两个角度之一;的系数m5.5因为m*6-m*.5=m*5.5; 这仍然不是答案,因为它可以是大于360°的值(例如:h,m=13,0)或小于0°(例如:ifh,m=12,30)的值
(h*30-m*5.5)%360-该模数考虑了上面计算的值不在0到360°之间的情况;这仍然不是答案,因为它可能是两个角度的放大器,而我们想要的是最窄的
180-abs(180-(h*30-m*5.5)%360)-这是最终结果;一般规则是x-abs(x-y)等于min(y,x-y),这将给出正确的结果



1

Python 3,58 57字节

-1 / -2感谢@Shaggy

h,m=eval(input())
x=(30*h-5.5*m)
print(abs(min(x,360-x)))

天真的实现,采取以下形式的输入 [6,32]。尤其是某些字节,可能会从最后一行删除。

Python 2,52 50字节

h,m=input()
x=(30*h-5.5*m)
print abs(min(x,360-x))

30*h-5.5*m应该可以节省几个字节。
毛茸茸的

1
一个def风格的功能应一些字节保存为好。
七月

@negativeseven从挑战用语中似乎应该使用stdin / stdout
Theo

您可以将括号放在第二行。
毛茸茸的

解决方案实际上需要一些修改(Python 2)才能正常工作。结果应该是小于或等于180,并且大于或等于0
埃里克Outgolfer

1

Perl -MList::Util=min -p 5,37个字节

$_=abs<>*5.5-$_%12*30;$_=min$_,360-$_

在线尝试!

由于节省了一些字节,因此将输入以小时为单位,然后以分钟为一行,在单独的一行上。


好。修复了。
Xcali


1

Japt,16字节

*FÑ aV*5½
mUa360

试试吧

*FÑ aV*5½     :Implicit input of integers U=h and V=m
*F            :Multiply U by 15
  Ñ           :Multiply by 2
    a         :Absolute difference with
     V*5½     :V multiplied by 5.5
mUa360        :Reassign to U
m             :Minimum of U and
 Ua360        :Absolute difference of U and 360

0

> <>,17个字节

b*$6a**-:0)12,-*n

在线尝试!(6:32)

将输入作为h,m在堆栈上。

说明

b*$6a**-:0)12,-*n
b*                Multiplies m by 11
  $               Swaps m & h
   6a**           Multiplies h by 60
       -          Subtracts m & h (v)
        :0)       Checks if v > 0 (b=0/1)
           12,-   Subtracts .5 from b (-.5/.5)
               *  Multiplies v by b (halve & abs)
                n Outputs result
b*                Errors

0

05AB1E,16 个字节

60*+5.5*D(‚360%ß

以小时为第一输入,以分钟为第二输入。

在线尝试验证所有测试用例

说明:

基本上实现以下公式:

Ť=60H+×5.5
[R=一世ñŤ360-Ť360

60*               # Multiply the (implicit) hours-input by 60
   +              # Add it to the (implicit) minutes-input
    5.5*          # Multiply it by 5.5
        D(‚       # Pair it with it's negative
           360%   # Take modulo-360 on both
               ß  # And then pop and push the minimum of the two
                  # (which is output implicitly as result)

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.