几点了?


25

我确实喜欢节省时间,方法是在手腕上戴三只手表...问题是它们各自分配的时间不同。一只手表比实际时间晚x分钟。一只手表比实际时间早x分钟。最后一块手表显示实际时间。

问题是,我无法确定哪只手表的时间正确。

根据每只手表上显示的时间,确定实际时间。如果无法确定时间,请打印“看着太阳”。

输入: 三个读数,以单个空格字符分隔:H1:M1 H2:M2 H3:M3 在每个读数中,H1,H2,H3表示显示的小时数(0 <H1,H2,H3 <13),而M1,M2,M3表示显示的分钟数(0 <= M1 ,M2,M3 <60)。如果分钟数小于10,则在输入中添加前导0。类似地,如果小时数少于10,则在输入中添加前导0。

输出: The correct time is HH:MM其中HH:MM是正确的时间。如果无法确定正确的时间,则显示Look at the sun

输入1: 05:00 12:00 10:00

输出1: The correct time is 05:00

输入2: 11:59 12:30 01:01

输出2: The correct time is 12:30

输入3: 12:00 04:00 08:00

输出3: Look at the sun

最短的代码胜出...没有特殊惩罚。另外,请记住,我们正在处理12小时制时钟...我不在乎AM或PM ...想象一下我们正在处理模拟手表...


通过正确的时间,您是指当前的当地时间?
Optimizer

7
@sanchises,因为它们相距4个小时。12:00正是之间8:004:00太,你知道...
Siguza

1
您说输出是形式The correct time is HH:MM,没有句号,但是在前两个示例中继续包括句号。哪个版本正确?
Sp3000

1
是否可以将时间作为命令行参数读取?
丹尼斯

1
whattimeisit 07:21 08:39 08:00?当然!
WallyWest

Answers:


10

CJam,86 83 77 75 71字节

"The correct time is "ea{aea+':f/60fb(f-:+720%!},{];"Look at the sun"}*

感谢@ jimmy23013从我的代码中删除了6个字节。

CJam解释器中在线尝试。

测试用例

$ cjam time.cjam 05:00 12:00 10:00; echo
The correct time is 05:00
$ cjam time.cjam 11:59 12:30 01:01; echo
The correct time is 12:30
$ cjam time.cjam 12:00 04:00 08:00; echo
Look at the sun

怎么运行的

"The correct time is "
        e# Push that string.
ea      e# Push the array of command-line arguments.
{       e# Filter; for each time T:
  a     e#   Wrap T in an array.
  ea+   e#   Concatenate with the array of all times.
  ':f/  e#   Split each time at the colon.
  60fb  e#   Consider it a base 60 integer.
  (f-   e#   Shift out the converted T and subtract it from the remaining times.
  :+    e#   Add them.
  720%! e#   Push 1 is the sum is 0 modulo 720 and 0 if not.
},      e#   Keep the time iff a 1 has been pushed.

        e# The array on the stack now contains one or three times.

{       e# Reduce; for each time but the first:
  ];    e#   Discard the entire stack.
  "Look at the sun"
        e#   Push that string.
}*      e#

1
qS/_':f/60fb_f{f-:+720%!,}\"The correct time is "f\2/.e&$("Look at the sun"@?b暗示:i
jimmy23013 2015年

3
"The correct time is "lS/_':f/60fb:T.{Tf-:+720%{}@?}{];"Look at the sun"}*
jimmy23013 2015年

您错过了x = 0时的情况
Lakshay Garg 2015年

@LakshayGarg:这个问题说,他们每个人都给不同的时间。如果那是错误的x = 0
丹尼斯

@Dennis您也许可以进一步降低它,不需要最后的句号...
WallyWest 2015年

7

的JavaScript(ES6),164 168 172

对于每个读数,计算与其他两个读数的距离。您需要的是具有相同距离的那个。如果不止一个,那么您就无法分辨。

F=s=>(s=s.split(' '))
  .map(x=>([h,m]=x.split(':'),+m+(h%12)*60))
  .map((v,i,z)=>(v+v-z[++i%3]-z[++i%3])%720||'The correct time is '+s[k+=i],k=-2)
[k]||'Look at the sun'


// TEST

out=x=>O.innerHTML += x+'\n';

['12:30 01:01 11:59', '11:50 11:55 12:00', '05:00 12:00 10:00', '12:10 04:10 08:10', '07:00 06:00 08:00']
.forEach(x => out(x + ' -> ' + F(x)))

go=_=>out(I.value + ' -> ' + F(I.value))
<pre id=O></pre>
<input id=I><button onclick="go()">Test</button>


输入的3:00 3:00 3:00是否应提供3:00。当x = 0时:P
Lakshay Garg

4
@LakshayGarg号 Problem is they each give a different time所以x不能是0。
edc65

每获得一份赞誉,就应该edc65++
Alex A.

4

Python 3中,166个 163字节

L=input().split()
f=lambda x:int(x[:2])*60+int(x[3:])
s=""
for a in L:s=[s,s and"Look at the sun"or"The correct time is "+a][(sum(map(f,L))-3*f(a))%720<1]
print(s)

用途

      a-b == b-c
<==>  a+c-2*b == 0
<==>  (a+b+c)-3*b == 0

算术是分钟以720为模。


使用类似的方法(a + abc == 0),我发现不需要排序。您是否尝试避免这种情况?
edc65

@ edc65我确实尝试保持计数,但是我认为结果更长了。最初我也有一个+ abc,但这是很多电话f(而且pre-list-comp很长)
Sp3000

2

Python 2中,254 ... 199 207 203 194 200字节

可能有几种方法可以缩短此时间,请给我一些时间。

t=[x.split(':')for x in raw_input().split()]
a,b,c=[int(x[0])*60+int(x[1])for x in t]
print["The correct time is "+':'.join(t[[(c+a)%720%(b/2)<1,2][(a+b)%720%(c/2)<1]]),"Look at the sun"][(a-b)%240<1]

感谢Sp3000帮助我解决此问题。

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.