가장 가까운 시계 바늘 찾기


15

도전

자정을지나 몇 초가 지나면 가능한 한 적은 바이트를 사용하여 시계 모드에서 두 손 사이의 가장 작은 각도를 출력하십시오.

초 수는 항상 86400 미만이라고 가정 할 수 있습니다. 각도는도 또는 라디안으로 표시 될 수 있습니다.

참조 솔루션은 http://ideone.com/eVdgC0에 있습니다.

테스트 사례 (도 단위의 결과)

0 -> 0
60 -> 0.5
600 -> 5
3600 -> 0
5400 -> 45
6930 -> 84.75
50000 -> 63.333

Clarificarions

  • 시계에는시, 분, 초의 세 손이 있습니다.
  • 모든 손이 계속 움직이므로 시계 바늘의 눈금 사이에 시침과 분침을 찾을 수 있습니다.

관련 도전 (분 및 시침 만,도 단위)
Sp3000

1
시계에 초침이 있다는 것을 구체적으로 말해야합니다.
isaacg

테스트 사례를 추가 할 수 있습니까?
Beta Decay

1
일부 시계에서는 초침이 맨 위에 도달하면 분침이 다음 분으로 이동합니다. 다른 사람들에게는 계속 움직입니다. 나는 이것이 계속 움직이는 시계라고 생각합니까? 또한주의 깊게 읽은 후에는 분명하지만 처음에는 "초침"이 모호한 것으로 나타났습니다. 대부분의 시계에는 적어도 두 개의 손이 있으므로 "초침"을 추가하면 실제로는 세 번째 손이 추가됩니다.
Reto Koradi

1
확실히 @BetaDecay. "시계에는시, 분, 초의 세 손이 있습니다."
Reto Koradi

답변:


10

CJam, 36 35 34 32 30 바이트

riP*30/_60/_C/]2m*::-:mc:mC$3=

출력은 라디안입니다. 가능한 모든 86400 입력에 대한 솔루션을 확인했습니다.

CJam 통역사 에서 온라인으로 사용해보십시오 .

생각

이후 라디안은 시계 전체 무릎 각 분 / 초 간격이다 2π / 60 = π / 30 와이드 라디안.

따라서 초 수를 π / 30으로 나누면 초침의 위치가됩니다.

분침은 초침의 60 분의 1의 속도로 움직이므로 위의 결과를 60으로 나누면 분침의 위치가 산출됩니다.

마찬가지로 마지막 결과를 12로 나누면 시침의 위치가 산출됩니다.

위의 세 몫이 반드시 [0,2π) 범위에있는 것은 아닙니다 .

손 각도의 9 가지 가능한 차이를 모두 계산함으로써, 우리는 3 개의 0 (손과 그 자체 사이의 각거리)과 다른 손 사이의 6 개의 거리를 얻습니다 .

가장 가까운 손이 12를 포함하지 않는 절반에있는 경우 위와 다른 점 중 하나는 원하는 출력 (mod )입니다.

그러나 01:55:30 (예 :) 에서는 시침이 1.008 rad (57.75도)이고 분침이 12 에서 5.812 rad (333.00도) 인 4.804 rad 의 차이를 나타냅니다. (275.25도). 전체 랩에서이 결과를 빼서 "다른 방향으로"측정 된 각도는 1.479 rad (84.75 rad)입니다.

지금, 오히려 각 각 매핑보다 θ 에서 [0,2π를) 조건부의 결과 뺀 π를 , 우리가 할 수 단순히 계산 ARCCOS (COS (θ)) 이후, COS 주기 심지어 모두이며, ARCCOS는 항상에 값을 산출 [ 0, π) .

세 가지 가장 작은 결과 (모두 0)를 건너 뛰면 네 번째로 작은 결과가 원하는 출력이됩니다.

암호

ri                             e# Read an integer from STDIN.
  P*30/                        e# Multiply by π and divide by 30.
       _60/                    e# Divide a copy by 60.
           _C/                 e# Divide a copy by 12.
              ]2m*             e# Push the array of all pairs of quotients.
                  ::-          e# Replace each pair by its difference.
                     :mc       e# Apply cosine to each difference.
                        :mC    e# Apply arccosine to each cosine.
                           $3= e# Sort and select the fourth smallest element.

대체 버전 (34 바이트)

rd6*_60/_C/]360f%2m*::m360X$f-+$6=

출력은도 단위이며 삼각 함수는 사용되지 않습니다.

CJam 통역사 에서 온라인으로 사용해보십시오 .


9

Mathematica, 40 바이트

Min@Abs@Mod[#{11,708,719}/120,360,-180]&

설명 : t자정 이후의 시간 (초)입니다. 각 손의 위치는

hour: t/120 (mod 360)
min:  t/10 (mod 360)
sec:  6t (mod 360)

x도와도 사이의 절대 각도 거리를 계산하기 위해 범위를 360으로 y수정 y - x[-180, 180]다음 절대 값을 취할 수 있습니다. (주이 더에 제한이 없음을 x하고 y이 기능이 바로 페어의 차이를 계산합니다 그래서.) t/10-t/120, 6t-t/106t-t/120그 않습니다.


죄송합니다. Mathematica에 익숙하지 않지만 자정 이후 초 동안 인수 또는 변수를 실제로 허용합니까?
Winny

1
@Winny 예, 순수한 함수 (로 표시 &)이며 전달 된 첫 번째 인수는 inside로 참조됩니다 #.
jcai

7

파이썬, 65

lambda n,l={720,60,1}:6*min((n/x-n/y)%60for x in l for y in{x}^l)

시, 분, 초침으로 이동 한 거리는 원의 1/60 단위입니다 h,m,s = n/720, n/60, n/1. 우리는에서 원에 자신의 위치를 얻기 위해이 모드 (60)를 취할 수 있습니다 060.

우리가 그들의 mod mod 60을 취하면, 우리는 하나가 다른 것 앞에있는 단위의 수를 얻습니다. 우리는 가능한 여섯 가지 차이점을 모두 취하고 최소값을 찾은 다음 곱하여 각도 6를 다시 조정합니다 360.

두 층 지능형리스트 처음에 의해 나타난 바와 같이 제 손을 선택 720, 60또는 1다음 세트 XOR 통해 제거 먼저 선택하여 해당 세트 중 한편을 선택한다.

참조 코드에 대해 철저하게 테스트했습니다.


6

C #, 163152 바이트

이렇게하면 랩 어라운드를 계산하기 위해 모든 손을 두 번 생성 한 다음 모든 조합을 반복하여 손 사이의 최소 각도를 찾습니다. 계산은 60 나누기에서 수행 된 다음 6을 곱하여도를 구합니다.

명확성을 위해 들여 쓰기 :

float F(int s){
    float b=60,c;
    float[]a={c=s/b/b%12*5,c+b,c=s/b%b,c+b,s%=60,s+b};
    for(s=36;s-->0;)
        b=s%6!=s/6&(c=(c=a[s%6]-a[s/6])<0?-c:c)<b?c:b;
    return b*6;
}

출력 예 :

    0 seconds, 00:00:00, smallest angle is 0°
43200 seconds, 12:00:00, smallest angle is 0°
86399 seconds, 23:59:59, smallest angle is 0.09164429°
 3330 seconds, 00:55:30, smallest angle is 54.75°
39930 seconds, 11:05:30, smallest angle is 60.25001°
21955 seconds, 06:05:55, smallest angle is 65.49998°
21305 seconds, 05:55:05, smallest angle is 59.50001°
 5455 seconds, 01:30:55, smallest angle is 75.45831°
41405 seconds, 11:30:05, smallest angle is 44.95834°

랩을 설명하는 훌륭한 솔루션
toto

2

TI-BASIC, 17 바이트

min(cos⁻¹(cos(ΔList(Ans{6,.1,5!⁻¹,6

Dennis를 사용 arccos(cos(하여 거리를 정규화합니다. 그러나 모든 쌍별 거리를 계산하는 대신을 사용하여 필요한 세 가지만 계산합니다 ΔList([seconds],[minutes],[hours],[seconds].

이 프로그램은 Degree모드를 예상 하고 응답을도 단위로 반환합니다.

편집 : 5!보다 1 바이트 짧습니다 120.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.