警报优化


28

我的闹钟

我是美国人,我的(数字)闹钟也是如此。要设置警报,它从先前的时间开始。按下小时按钮将其向上移动一小时,而按下分钟按钮将其向上移动一分钟。同时按下两个按钮会将其重置为午夜(上午12:00),并计为两次按下按钮。

当小时数超过上限(12)时,它将重置为1并切换AM / PM指示灯。当分钟数超过上限(59)时,它们将重置为0,而不会影响小时数。

任务

给定开始时间和目标时间,您的任务是输出将我的闹钟设置为目标时间所需的最佳按钮按下次数。

您可以采用最适合您的格式输入。对于这两个输入,程序唯一需要的数据是小时和分钟。举例来说,这意味着您可能会以大纪元以来的毫秒数为单位来提取数据,并提取小时和分钟,但是您可能无法在年,月,秒等中进行任何编码。请注意,尽管您可能会使用“军事时间”(或世界上大部分时间的常规时间),但这不会改变我的时钟的工作方式。

例子

1:15 pm -> 2:30 am

您可以同时按下两个按钮以将其重置为12:00 am,然后增加至2:30 am,即2+2+30 = 34按下按钮。您也可以增加到凌晨2:30,这就是13+15 = 28按下按钮。因此,您的输出为28

3:58 am -> 4:02 am

您可以重置和递增,这将是2+4+2 = 8按下按钮。您也可以增加1+4 = 5按钮的数量。因此,您的输出为5

10:55 pm -> 1:00 am

您可以重置和递增,这将是2+1 = 3按下按钮。您也可以增加3+5=8按钮的数量。因此,您的输出为3

1:00 am -> 1:59 pm

您可以重设和递增,但不仅仅是递增,还要多按三下。因此,您的输出为12+59 = 71

测试用例

Current  Target   = Output
1:15pm   2:30am   = 28
3:58am   4:02am   = 5
10:55pm  1:00am   = 3
1:00am   1:59pm   = 71
12:00am  12:00am  = 0
6:51pm   12:00am  = 2
2:01pm   11:00pm  = 25
2:01pm   11:01pm  = 9
12:59am  12:01am  = 2
11:50am  12:00pm  = 11


13
哇靠!按下两个按钮确实也将我的(欧洲)闹钟也重置为0:00 ...这些年来,这些按钮花了太多次了... O_o
Arnauld

8
“军事时间(或世界上大部分时间的常规时间)” ...您要查找的术语是“ 24小时制”。
雅各布

12
@Jakob不,他正在寻找的术语是“正常时间”。美国人使用不规则的时间,不规则的日期,不规则的单位等
Neil

1
@StepHen我在英国,直到雅各布(Jakob)解释了它,才知道您所说的“军事时间”是什么意思。24小时对我来说是完全
Darren H

Answers:


5

外壳,16字节

§▼ṁ→(Σz%e24 60z-

在线尝试!

以24h格式将参数作为两个列表[小时,分钟],用于开始和结束时间。

我对自己能打多少高尔夫球感到很高兴,我发现有趣的是如何在这种功能组合中管理参数。

计算不允许重设时我们需要多少按键的函数如下:

Σz%e24 60z-
         z-    elementwise subtract the two times
 z%e24 60      take the hours difference modulo 24 and the minutes difference modulo 60
Σ              sum the two resulting numbers

有趣的是,由于此解决方案的其余部分只能使用一个列表作为参数,因此该解决方案将部分应用于整个程序的第一个参数,“吃掉”它,而对第二个参数本身和第二个参数均不可见该程序的其余部分。

接下来,如果将时间重置为0:00,我们将计算所需的按键次数

ṁ→    take the sum of each element of the list increased by 1

如前所述,这仅对第二个参数(最后一次)hours+minutes+2起作用,并且仅以高尔夫球手的方式进行计算。

最后,§▼是将第二个参数传递给两个函数并返回两个结果中较小的那一部分的部分。


8

JavaScript(ES6),73 56 54 52 50字节

使用24小时格式。将输入作为4个整数表示每次的小时和分钟。

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)
  • 感谢Arnauld节省了2个字节。

试试吧

使用:分隔符以24小时格式输入时间。

o.innerText=(f=

(g,l,h,m)=>Math.min(2+h+m,(h-g+24)%24+(m-l+60)%60)

)(+(x=(i.value="01:00").split`:`)[0],+x[1],+(y=(j.value="13:59").split`:`)[0],+y[1]);oninput=_=>o.innerText=f(+(x=i.value.split`:`)[0],+x[1],+(y=j.value.split`:`)[0],+y[1])
label,input{font-family:sans-serif;font-size:14px;height:20px;line-height:20px;vertical-align:middle}input{margin:0 5px 0 0;width:100px;}
<label for=i>Current: </label><input id=i type=time><label for=j>Target: </label><input id=j type=time><pre id=o>


说明

(即将更新。)

(g,l,h,m)=>

匿名函数通过参数取整数作为参数glhm,其中gl分别是小时&的当前时间的分钟和hm是小时&的目标时间分钟。

2+h+m

首先,如果我们只是重置时钟,我们计算需要按下多少按钮,这仅仅是2(用于重置)加上目标小时和目标分钟。

h-g+24*(h<g)

接下来,我们计算需要多少次按键才能达到目标小时。我们通过从目标小时中减去当前小时来实现。但是,如果当前时间小于目标时间,这将给我们带来一个负数,因此我们通过将24乘以检查是否得到纠正h<g(返回布尔值,但隐式转换为integer 1,如果为true,或者0如果为false ,则纠正此错误)。数学运算。

+m-l+60*(m<l)

我们使用类似的公式来计算从当前分钟到目标分钟的印刷次数,并将其添加到小时印刷中。

Math.min()

最后,我们得到2个数字中的最小值来给出我们的结果。


1
你可以(h-g+24)%24+(m-l+60)%60吗?
Arnauld

7

Pyth,29个字节

显然,这一挑战并没有利用高尔夫语言,这就是为什么它这么长的原因。另一方面,Pyth是基于Python的事实对此有所改善,因此我们可以滥用其负模数。

hS,+%-eQ@Q1 60%-@Q2hQ24+2s>Q2

测试套件。 Pyth中的数字不支持前导零。



3

C#(.NET Core),56个字节

(H,M,h,m)=>Math.Min(((h+24-H)%24)+((m+60-M)%60),(2+h+m))

在线尝试!

与Javascript答案非常相似。C#中的布尔无法轻松地转换为数字,因此与其有效地做相同的事情,不如[diff]+24*(H<h)我这样做([diff]+24)%24


您可以删除2+h+m-2个字节左右的括号。
凯文·克鲁伊森

在Java 8中创建了您答案的端口,并注意到您可以通过删除更多的括号来打高尔夫球另外的四个字节,以这种方式结束(H,M,h,m)=>Math.Min((h+24-H)%24+(m+60-M%60),2+h+m)
Kevin Cruijssen

1
你不是必须做到System.Math.Min吗?
LiefdeWen


2

Python 3,43个字节

lambda a,b,c,d:min((c-a)%24+(d-b)%60,2+c+d)

在线尝试!

输入为4个整数(开始时间,开始时间,结束时间,结束时间)


@StepHen哎呀。轻松修复。
HyperNeutrino

失败2 01 11 00?在您的答案中,如何确定时间是否为AMPM,如果不将其作为输入?
Xcoder先生17年

@ Mr.Xcoder; 我13使用TIO来获得该输入,这是正确的(reset + 11 <9 + 59)。
毛茸茸的

2
%在Python中是否总是返回正数?
毛茸茸的

4
@Shaggy总是返回右侧的符号%1%24= 11%-24= -23。这对这个问题很有帮助。
斯蒂芬

2

Java 8,54 50字节

(h,m,H,M)->Math.min((H-h+24)%24+(M-m+60)%60,H+M+2)

@KamilDrakari的C#答案的端口(在我打完2 6个字节后)。

说明:

在这里尝试。

(h,m,H,M)->       // Method with four integer parameter and integer return-type
  Math.min(       //  Return the lowest of the following two:
                  //   The hours:
   (H-h           //    Second hours - first hours inputs
       +24)       //    +24 so we won't have negative numbers
           %24    //    mod-24 to get the hours
   +              //   And add the minutes:
    (M-m          //    Second minutes - first minutes inputs
         +60)     //    +60 so we won't have negative numbers
             %60  //    mod-60 to get the minutes
    ,H+M          //  And compare it to the second hours + second minutes inputs
        +2)       //   +2 for the added +24 and +60 to get the positive modulo arguments

1

Perl 5,71 +2(-ap)= 73个字节

($w,$x,$y,$z)=@F;$_=($r=2+$y+$z)>($c=($y-$w+24)%24+($z-$x+60)%60)?$c:$r

在线尝试!

以24小时格式(军事时间)进行输入,以空格分隔,开始时间第一,结束时间第二:HH MM hh mm


1

视网膜,106字节

\d+
$*
 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2
(1*):(1* )\1(1{24})?
$2
(1*) (1*):\1(1{60})?
$2
(1+)#(?!\1)

\G1

在线尝试!链接包括测试用例。将输入作为当前时间和所需时间(在常规的24小时内),两者之间用空格隔开。说明:

\d+
$*

转换为一元。

 (1*):(1*)
 24$*1$1:60$*1$2#11$1$2

这有两件事;它将所需的小时和分钟数增加了24小时60分钟,并且还将原始所需的小时和分钟数总和增加了2,即使用重置进行设置的按钮按下次数。

(1*):(1* )\1(1{24})?
$2

从所需的小时数中减去当前的小时数,如果可以的话,减去我们添加的24小时。

(1*) (1*):\1(1{60})?
$2

分钟也一样。这还将两个结果加在一起。

(1+)#(?!\1)

如果使用当前时间设置的按键数大于使用重设设置的按键数,则将其删除。

\G1

将第一个剩余的数字转换回十进制。

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.