模拟我的笨老闹钟


25

我有一个带两个按钮的笨拙的旧闹钟:hourminute。该hour按钮增加设置警报的小时数,并minute增加设置警报的分钟数。但是,一些聪明的设计师意识到同时按下两个按钮应该具有一定的意义,因此决定同时按下hourminute将导致警报设置为12:00 am/ 0:00。您的任务是模拟此行为。

任务

给定开始时间和一系列按钮状态,请确定结束时间。

从开始时间开始,增加每次出现的小时的时间,增加每次出现(1,0)的分钟(0,1)的时间,并将每次出现的时间设置0:00(1,1)。状态(0,0)应被忽略,因为它们与两个按钮都不对应。

当加上分钟和小时时,如果分钟/小时超过最大值,则将其设置为0,即,增加分钟值59应将分钟值设置为0,增加小时值23应将小时值设置为0。将分钟/小时值增加到它们的限制以上不会影响其他值,例如增加10:59产量的分钟10:00,而不是增加11:00

给定输入时间13:58和步骤[(0,1),(0,1),(0,1),(0,0),(1,1),(1,0)]

  1. (0,1)。这相当于minute被按下。现在是时候了13:59
  2. (0,1)。这相当于minute被按下。现在是时候了13:00
  3. (0,1)。这相当于minute被按下。现在是时候了13:01
  4. (0,0)。这对应于两个按钮均未被按下。现在不受影响的时间13:01
  5. (1,1)。这对应于两个按钮都被按下。现在是时候了0:00
  6. (1,0)这相当于hour被按下。现在是时候了1:00

因为我们以结尾1:00,所以它是输出。

输入输出

输入将包含一个时间和一系列按钮状态。输出是单个时间。

输入时间和输出时间可能是

  • (hour, minute)(minute, hour)24小时为单位的2元组,例如(13, 30)hour范围从023minute范围从059
  • 同前,但在12-Hour时间和布尔am/ pm开关(hour范围为01112111minute059)。
  • 此后的分钟数,0:00例如810(从0到1439,包括0)
  • 编码相同信息的任何其他格式

按钮状态的序列表示布尔2元组的列表,例如:

  • 元组列表: [(0,1),(1,0),(0,0),(1,1)]
  • 用空格分隔的字符串: "01 10 00 11"
  • 字符串: "01100011"
  • 在第四纪: [1,2,0,3]
  • 转换为整数: 99
  • 编码相同信息的任何其他格式

测试用例

time,steps -> output
06:49,[(0, 1)] -> 06:50
12:23,[(1, 0)] -> 13:23
02:23,[(0, 1), (1, 0)] -> 03:24
21:40,[(0, 1), (0, 1), (0, 1), (0, 1)] -> 21:44
13:10,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 1), (0, 1), (0, 1)] -> 00:02
21:33,[(1, 0), (0, 1), (1, 0), (0, 1)] -> 23:35
14:21,[(0, 1), (0, 1), (0, 1)] -> 14:24
02:39,[(0, 0), (0, 1)] -> 02:40
16:07,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 19:16
17:55,[(0, 1), (1, 0), (0, 1)] -> 18:57
15:55,[(1, 0), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0)] -> 23:00
22:11,[(0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 00:19
03:58,[(1, 0), (0, 0), (0, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1)] -> 07:03
13:02,[(0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0)] -> 16:06
04:37,[(1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (1, 0)] -> 08:47
00:01,[(0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1)] -> 03:08
02:58,[(1, 0), (1, 0), (0, 1)] -> 04:59
01:43,[(0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1)] -> 04:52
07:54,[(1, 0), (0, 1), (1, 0), (1, 0), (1, 1)] -> 00:00
09:33,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1)] -> 10:38
09:01,[(0, 1), (0, 1)] -> 09:03
19:04,[(0, 1), (1, 0), (0, 1), (1, 0)] -> 21:06
11:17,[(0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 1), (0, 1), (0, 1)] -> 00:02
19:32,[(0, 1), (1, 0), (0, 1), (1, 0), (1, 0), (1, 0)] -> 23:34
17:31,[(0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 0), (1, 1), (0, 1)] -> 00:01
06:46,[(0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (1, 0), (1, 0), (0, 1), (1, 0), (0, 1), (0, 1), (0, 1), (0, 1), (0, 1)] -> 18:16



两组数据作为一个列表的输入格式是否可以接受?例如[[initialHour, initialMinute], [hourPressed1, minuitePressed1], [hourPressed2, minuitePressed2], ...]
乔纳森·艾伦,

@JonathanAllan是的。
fireflame241

正常数字时间1200am是什么意思?
Ferrybig '17

Answers:


8

果冻,13个字节

_`+Ạ}?/%24,60

在线尝试!


注意,我不确定我们是否可以继续使用该输入格式(所以我问),因为OP声明“按钮状态的顺序是列表的表示”。
乔纳森·艾伦

@JonathanAllan如果是这样,那么OP会对我的回答发表评论,但是我使用的是您在评论中使用的确切格式...有时候,OP懒惰或忘记更新挑战
Erik the Outgolfer

6

C,89 87字节

感谢@Jonathan Frech节省了两个字节!

f(h,m,s)char*s;{for(;*s;++s)*s++&1?*s&1?h=m=0:++h:*s&1&&++m;printf("%d %d",h%24,m%60);}

在线尝试!


6

果冻 21 (17?)19 字节

17个字节?-如果输入格式:[[initHour, initMinute], [a1, b1], [a2, b2], ...]可以接受,我们将有一个单子链接,并且可以W;从第二行的开头删除。

注意:这正趋向于Outgolfers Jelly果冻手Erik的回答,所以我不会再打高尔夫球了(我没看过)...

N⁹⁹Ạ¤?+⁸
W;ç/%24,60

甲二进链路以作为整数的初始时间的列表[hour, minute]左侧(24小时)和按钮的状态的列表[[hourPressed, minPressed], ...]上的权利
返回的最终结果时间列表作为整体,再[hour, minute](24小时)。

在线尝试!或见测试人员

怎么样?

N⁹⁹Ạ¤?+⁸ - Link 1, nextState: list, currentState [cH, cM]; list, presses [pH, pM]
     ?   - if:
    ¤    - ...condition: nilad followed by link(s) as a nilad:
  ⁹      -   chain's right argument, presses
   Ạ     -   all truthy? (1 for [1,1] 0 otherwise)
N        - ...then: negate (the left argument, currentState, i.e. [-cH, -cM])
 ⁹       - ...else: chain's right argument, presses
       ⁸ - chain's left argument, currentState
      +  - add
           i.e.: if presses was [1,1] then [cH+-cH,cM+-cM]=[0,0]
                 otherwise [cH+pH,cM+cM]

W;ç/%24,60
     24,60 - literal list of integers [24,60]
    %      - modulo by (vectorises)

替换⁹Ạ¤-1字节Ạ}另一个-2用于使用允许的格式。最后,另一个-1因为之前的链条µ在这里被称为一个二分..
埃里克Outgolfer


5

视网膜,75字节

.*,1:1
:
\d+
$*
O`\D1*
,

1>`:

+`1{24}:|:1{60}
:
(?<=^|:)1*
$.&
\b\d\b
0$&

在线尝试!链接包括测试用例。说明:

.*,1:1
:

删除直到最后一次按下的所有内容,包括空的时间(如果这是最后一次按下的按钮),请删除所有内容。

\d+
$*

转换为一元。

O`\D1*

将分钟排序到末尾。

,

将小时数加在一起。

1>`:

将分钟数加在一起,但将时间分开。

+`1{24}:|:1{60}
:

适当减少小时和分钟的模数24或60。

(?<=^|:)1*
$.&

转换为十进制。

\b\d\b
0$&

格式化为两位数。


4

Python 3中,135个 117 115字节

-20字节归功于Jonathan Frech

def a(m,f):
 for b,c in f:
  if b&c:m=[0,0]
  elif b:m[0]=-~m[0]*(m[0]<23)
  elif c:m[1]=-~m[1]*(m[1]<59)
 return m

在线尝试!

将时间作为表格中的列表[hour, minute]


您可以替换(m[0]+1)-~m[0]if m[0]<23 else 0*(m[0]<23)
乔纳森·弗雷希

另外,由于bc始终是布尔值,因此可以替换b+c>1b&c
乔纳森·弗雷希

76字节(缩短的链接,由于TIO在注释框中变大)
Halvard Hummel


4

JavaScript(ES6),55个字节

t=>a=>a.map(x=>x>2?t=[0,0]:t[x-1]++)&&[t[0]%60,t[1]%24]

以渐进式语法进行输入,起始时间以数组形式出现[min, hour],而步骤则以四元数组的形式出现。输出时间与输入时间的格式相同。

测试用例



3

Perl 5个字节

69个字节的代码+ 1个-n标志

s/.*d/0:0/;/(.*):(\d+)/;printf"%02d:%02d",($1+y/c//)%24,($2+y/b//)%60

在线尝试!

输入格式

hh:mm,abcdabcdabcdaddccbbaa

哪里:

hh=start hour
mm=start minute
 a = (0, 0) = no buttons pressed
 b = (0, 1) = minute button pressed
 c = (1, 0) = hour button pressed
 d = (1, 1) = both buttons pressed

压力机之间的空间或其他分隔物微不足道。

说明

s/.*d/0:0/;    # If both buttons were ever pressed, previous presses
               # don't matter.  Get rid of them and set start time to midnight.
/(.*):(\d+)/;  # Extract start hour and minute
printf"%02d:%02d",            # Output numbers with leading 0
($1+y/c//)%24,                # Take starting hour, add number of presses, remainder 24
($2+y/b//)%60                 # Take starting minute, add number of presses, remainder 24

3

迅捷106 96字节

-10,多亏了Xcoder

func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}

在ideone上尝试!

函数将采用初始值和元组数组,并返回最终时间。


96字节,通过打印到STDOUT代替:func x(m:(Int,Int),n:[(Int,Int)]){let i=n.reduce(m){($0.0+$1.0,$0.1+$1.1)};print(i.0%24,i.1%60)}。这也摆脱了typealias
Xcoder先生

1
顺便说一句,欢迎来到PPCG!惊人的第一答案。
Xcoder先生

非常感谢,实际上我首先使用了print()...但是在不同的实现之间切换后却忘了。再次感谢您的帮助。
Naresh

1

Terrapin徽标,304字节

未优化;很多空间。

MAKE "M :B MAKE "H :A LABEL "L IF EMPTY? :I OP LIST :H :M MAKE "C FIRST :I IF AND ((ITEM 2 :C)=1) ((ITEM 1 :C) = 0) MAKE "M :M+1 IF :M=60 MAKE "M 0 IF AND ((ITEM 1 :C) = 1) ((ITEM 2 :C)=1 MAKE "M 0 MAKE "H 0 IF AND ((ITEM 1 :C)-1) ((ITEM 2 :C) = 0) MAKE "H :H + 1 IF :H = 23 MAKE "H 0 MAKE "I BF :I GO "L

将列表作为其第一输入,并将开始的小时+分钟(单独的输入)分别作为第二和第三。

我无法从Terrapin徽标复制+粘贴,因为它是试用版,所以:(


1

R,61字节

function(I,B){for(b in B)I=I+"if"(sum(b)>1,-I,b)
I%%c(24,60)}

注意到I作为一个长度为2的向量c(H,M)B作为长度为2的向量的按钮中的一个列表中,c(H,M)。循环遍历B,设置Ic(0,0)总和为2。然后,它在末尾降低。标头中还有一个功能,如果您想测试所有按钮,则可以将按钮按下转换为正确的R格式。它以数组[(H,M),...]作为字符串。

在线尝试!


1

C#(.NET Core),93字节

(n,l)=>{for(int i=0,x;i<n.Length;){x=n[i++];if(x>1)l[0]=l[1]=0;else{l[x]=++l[x]%(24+36*x);}}}

在线尝试!

以三进制形式输入,其中0 ==(1,0),1 ==(0,1),2 ==(1,1),索引为0的数组中的时间为小时,而1的分钟为分钟。修改时间数组。



0

Mathematica,54个字节

Switch[#2,a={0,0},#,a+1,a,_,Mod[+##,{24,60}]]&~Fold~#&

匿名函数。将2元组的列表作为输入,并返回2元组作为输出。


0

Scala,116字节

因此,我只是将开始时间作为func(hm)的两个第一个参数,并将输入序列作为Array [Tuple2]。

var x=h
var y=m
for(u<-a)u match{case (0,1)=>y=(y+1)%60
case (1,0)=>x=(x+1)%24
case (1,1)=>{x=0;y=0}
case _=>}
(x,y)

我想知道...我应该在字节数中计算func声明(def time(h:Int,m:Int,a:Array[Tuple2[Int,Int]]):Tuple2[Int,Int]={加上结尾})吗?

在线尝试!

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.