손목에 3 개의 시계를 착용하여 문자 그대로 시간을 절약하고 싶습니다. 문제는 각각 시간이 다릅니다. 한 시계는 실제 시간보다 x 분 뒤입니다. 하나의 시계는 실제 시간보다 x 분 앞서 있습니다. 마지막 시계는 실제 시간을 보여줍니다.
문제는 어떤 시계가 정확한 시간인지 알 수 없다는 것입니다.
각 시계에 표시된 시간에서 실제 시간을 결정하십시오. 시간을 결정할 수 없으면 “태양을 보라”를 인쇄하십시오.
입력 :
단일 공백 문자로 구분 된 3 개의 판독 값 : 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을 신경 쓰지 않습니다 … 우리가 아날로그 시계를 다루고 있다고 상상해보십시오 …
답변
CJam, 86 83 77 75 71 바이트
"The correct time is "ea{aea+':f/60fb(f-:+720%!},{];"Look at the sun"}*
내 코드에서 6 바이트를 골라내는 @ jimmy23013에게 감사드립니다.
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#
답변
자바 스크립트 ( ES6 ) 164 168 172
각 판독 값에 대해 다른 2 개의 거리를 계산하십시오. 거리가 같은 것이 필요합니다. 둘 이상이 있으면 말할 수 없습니다.
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, 166163 바이트
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입니다.
답변
파이썬 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 덕분에이 문제를 해결할 수 있습니다.