아날로그는 불분명합니다!


23

아날로그 시계에는 시침과 분침이 있습니다.
이 손은 시간이 지남에 따라 시계의 얼굴을 돌고 있습니다. 분침이 완전히 회전 할 때마다 분침이 1/12 회전합니다. 시침의 2 회전이 하루 종일임을 나타냅니다.

이 손들은 같은 중심점에 고정되고 그 점을 중심으로 회전하므로 항상 손 사이의 각도를 계산할 수 있습니다. 실제로 주어진 시간에 2 개의 각도가 있습니다. 더 큰 것과 더 작은 것 (때로는 둘 다 180과 같지만 중요하지 않습니다)

* 우리의 가상 시계에는 초침이 없습니다

태스크

24 시간 형식의 시간이 주어지면 손 사이의 작은 각도를도 단위로 출력하십시오. 손이 직접 서로 대향 (예에서와 같은 경우 6:00, 18:00등) 출력 (180)

규칙

입력은 다음과 같습니다.-구분 기호로 구분 된 문자열 : 6:32, 14.26 -2 개의 개별 값, 문자열 또는 정수 : 6, 32, 14, 26 - 2 개의 값, 문자열 또는 정수 의 배열 : [6, 32],[14, 26]

또한 선택적으로 (당신이 문자열을 가정) 당신의 대답은 입력이 2 자리 패딩 할 필요 지정할 수 있습니다, 예 : 06:32, 06, 32,[06, 32]

또한 선택적으로, 시간 후 분을 고려하여 입력의 순서를 반대로 할 수 있습니다 예 : 32:6, 32, 6,[26, 14]

시간은 0~ 23(포함) 사이의 정수 값입니다. 분은 0~ 59(포함) 사이의 정수 값입니다.

분침이면을 따라 6 도씩 증가한다고 가정 할 수 있습니다 (각 분 값에 대해 하나의 균일 한 간격 위치)
시침이면을 따라 0.5 도씩 증가한다고 가정 할 수 있습니다 ( 시간당 매분 값)

라디안이 아닌 각도로 출력해야합니다. .0정수에 대한 후행 을 포함 할 수 있습니다

채점

이것은 이므로 각 언어에서 가장 적은 바이트 이깁니다!

테스트 케이스

Input: 06:32
Output: 4

Input: 06:30
Output: 15

Input: 18:32
Output: 4

Input: 06:01
Output: 174.5

Input: 00:00
Output: 0

Input: 00:01
Output: 5.5

Input: 12:30
Output: 165

Input: 6:00
Output: 180

Input: 23:59
Output: 5.5


2
@FryAmTheEggman "출력은 라디안이 아닌도 단위로 주어져야합니다"
Theo

1
5시 59 분에서 손이 거의 6시에 잊어 버렸습니다
aaaaa는 모니카

4
제안 된 테스트 사례 : 00:59 -> 35.5( m 값이 큰 값이 작 으면 일부 구현이 실패 할 수 있습니다). hm
Arnauld

1
고마워, @Arnauld, 당신은 나에게 한 바이트 비용이 들었습니다! : p
얽히고 설킨

답변:


14

자바 스크립트 (ES6),  41 40  39 바이트

로 입력을 (h)(m)받습니다.

h=>m=>((x=4+h/3-m*.55/9)&2?12-x:x)%4*90

온라인으로 사용해보십시오!

방법?

[0..360] 범위에서 직접 작업하는 대신 [ 0..4 ] 범위에서 임시 변수 엑스 를 정의합니다 .[0..4]

x=|4h12+4m60×124m60|mod4
x=|4h1244m60×12|mod4
x=|h311m180|mod4

각도는도에 의해 주어진다 :

(4엑스,엑스)×90

우리가 확실히 긴 사용하지 않도록하려면 그러나 공식은 JS 코드에서 약간 다르게 구현 Math.abs()Math.min().

절대 값을 계산하는 대신 다음과 같이 계산하여 [0..12] 에 양수 값을 강제합니다 .

x=4+h311m180

그리고 최소값을 계산하는 대신 우리는 단순히 비트 AND를 2 수행하여 어떤 경우인지 결정합니다. 이것이 바로 2 의 거듭 제곱으로 경계를 정한 이유 입니다.


5

젤리 , 14 12 바이트

ד<¿‘Iæ%Ø°AH

온라인으로 사용해보십시오!

시간을 두 개의 정수 (시간, 분)의 목록으로 취하는 모나드 링크.

2 바이트를 절약 한 @JonathanAllan에게 감사합니다!

설명

ד<¿‘        | Multiply hour by by 60 and minute by 11
     I       | Find difference
      æ%Ø°   | Symmetric mod 360 [equivalent to (x + 360) mod 720 - 360]
          A  | Absolute
           H | Half

대칭 모드? 어떻게 작동합니까?
얽히고 설킨

@Shaggy 매우 편리하게, (-180, 180]동등한 간격으로 값을 반환합니다 (mod 360). 그 내장 ...

1
Ø°for 360“<¿‘for를 사용하여 반도 단위로 작업하여 2 바이트를 절약하십시오 60,11. 같은 ד<¿‘Iæ%Ø°AH TIO
조나단 앨런

12 자를 말할 것이지만 Windows-1252 (및 다른 인코딩)는 실제로 12 바이트로 인코딩 할 수 있습니다. 다양한 비 ASCII 문자 사이에서 유니 코드가 아닌 단일 인코딩으로 모든 문자를 다룰 것이라고 생각하지는 않았지만 분명히 잘못되었습니다.
Thanatos

@Thanatos 코드 골프에 특화된 일부 언어에는 각각 1 바이트로 인코딩 된 256 개의 문자에 대한 자체 코드 페이지가 있습니다. 이 사용자 정의 코드 페이지를 가진 Jelly 중 하나입니다 . 05AB1E, Charcoal, MathGolf, Stax 등은 사용자 정의 코드 페이지가있는 다른 언어입니다. 그러나 대부분 Windows-1252를 기반으로합니다. :)
Kevin Cruijssen

4

MATL, 18 바이트

30*i5.5*-t360-|hX<

두 개의 입력 시간과 분을 허용합니다. 이 답변 과 동일한 방법을 사용합니다

MATL Online 에서 사용해보십시오

설명

      % Implicitly grab first input (hours)
30*   % Multiply by 30
i     % Explicitly grab second input (minutes)
5.5*  % Multiply by 5.5
-     % Take the difference
t     % Duplicate the result
360-  % Subtract 360
|     % Take the absolute value
h     % Horizontally concatenate
X<    % Determine the minimum value
      % Implicitly display the result

자정에는 실패하지 180않고 대신 출력 0합니까?
얽히고 설킨

4

Wolfram Language (Mathematica) , 30 29 28 바이트

5Abs@Mod[#.{6,-1.1},72,-36]&

온라인으로 사용해보십시오!

ungolfed 버전 :

Abs[Mod[#.{30,-5.5}, 360, -180]] &

함수의 인수는 # = {h,m}시간과 분을 포함합니다. 이 길이 2리스트는 벡터로 해석되고 다음과의 내적 {30,-5.5}은 다음 과 같이 계산 #.{30,-5.5} = 30*h-5.5*m됩니다. 그런 다음 Mod[#.{30,-5.5}, 360, -180]-180 .. + 180 간격의 각도로 360의 대칭 계수를 계산합니다 . Abs절대 값을 취합니다.

관련된 모든 연산자가 선형이므로 모든 숫자를 곱하고 나눌 수 있지만 가장 편리합니다. 5식에서 인수를 빼고 식의 모든 숫자를 5로 나누면 바이트 수가 최소화됩니다.


3

연금술사 , 134 바이트

_->In_h+In_m+720d+360a+f
h->60d
m+11d->
0m+d+a+0r->b
0a+0x->r
d+b+r->r+a
r+0b->
b+0d+0h+0y->5y
b+0d+5y->x
0b+0d+f->Out_x+Out_"."+Out_y

온라인으로 사용해보십시오!

설명

_->In_h+In_m+720d+360a+f

초기 설정. 입력 시간에 분 h하고 m, 세트 전류 각도 d360 개도 (720 절반 정도)으로는, 설정 a주 각도를 계산하고, 출력 플래그를 설정한다.

h->60d
m+11d->

1 시간마다 30도 가산되고 1 분마다 5.5도 가감합니다.

0m+d+a+0r->b
0a+0x->r

r(역) 플래그가 설정되어 있지 않은 동안 각 d원자는 한 a원자를 로 이동해야 합니다 b. "경쟁 조건"을 피하기 위해 분이 모두 사용 된 후에 발생합니다. a원자가 남아 있지 않으면 r이 흐름을 반대로 설정 하십시오.

이 두 번째 규칙은 여러 번 트리거 될 수 있으며 초기 설정 규칙 전에 트리거 될 수도 있습니다. 이것은 아무 것도 해치지 않으므로 이것을 막을 필요는 없습니다. 0x입력 6:00 인 경우에는 없다 : 조건 에지 사건을 처리 a할 때 원자, 프로그램은 종료하지만, 거기에 x최종 결과가 적어도 1 정도이면 원자.

d+b+r->r+a
r+0b->

반대의 경우 : 부호있는 각도가 180 도보 다 큰 경우 b원자를 이동 a하여 출력 각도를 줄입니다. 각도가 "360"에 도달하면 반전을 중지하십시오.

b+0d+0h+0y->5y
b+0d+5y->x

모든 정도의 원자가 모두 소모되면 각도로 출력하기 위해 2로 나눕니다.

0b+0d+f->Out_x+Out_"."+Out_y

이 작업이 완료되면 f초기 설정에서 플래그를 사용하여 정확히 한 번만 출력 하십시오.





2

, 22 바이트

I↔⁻¹⁸⁰﹪⁻׳⁰⁺⁶N×⁵·⁵N³⁶⁰

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 입력을 두 정수로 취합니다. 설명:

             N          First input
           ⁺⁶           Plus literal 6
        ׳⁰             Multiplied by literal 30
       ⁻                Minus
                  N     Second input
              ×⁵·⁵      Multiplied by literal 5.5
      ﹪            ³⁶⁰  Modulo literal 360
  ⁻¹⁸⁰                  Subtracted from literal 180
 ↔                      Absolute value
I                       Cast to string
                        Implicitly print


2

파이썬 3 , 40 바이트

lambda h,m:180-abs(180-(h*30-m*5.5)%360)

온라인으로 사용해보십시오!

h*30 -정오와 시간 사이의 각도 h 분이0 ; 시간이 12보다 크거나 같으면이 각도는 360 °보다 크거나 같을 수 있습니다 (
m*6정오와 분침 사이의
m*.5각도- 분 후 전체 시간에서 시침이 전진 한 각도 m(예 : 4:24 인 경우, 시침은 4시 방향에서 12도 앞으로 이동)
h*30-m*5.5-시침과 분침 사이의 두 각도 중 하나. 용 계수 mIS 5.5때문에 m*6-m*.5=m*5.5; 360 °보다 크거나 (예 : if h,m=13,0) 0 °보다 작을 수 있으므로 (예 : if )h,m=12,30 )
(h*30-m*5.5)%360-이 모듈로는 위의 계산 된 값이 0과 360 ° 사이가 아닌 경우를 고려합니다. 이것은 두 각도의 암페어가 될 수 있기 때문에 여전히 답이 아닙니다. 가장 좁은 것을 원합니다.
180-abs(180-(h*30-m*5.5)%360)이것이 최종 결과입니다. 일반적인 규칙은와 x-abs(x-y)동일 min(y,x-y)하며 올바른 결과를 제공합니다.



1

파이썬 3, 58 57 바이트

-1 / -2 @Shaggy 덕분에

h,m=eval(input())
x=(30*h-5.5*m)
print(abs(min(x,360-x)))

순진한 구현으로 [6,32] . 일부 바이트는 특히 마지막 줄에서 제거 될 수 있습니다.

파이썬 2, 52 50 바이트

h,m=input()
x=(30*h-5.5*m)
print abs(min(x,360-x))

30*h-5.5*m몇 바이트를 절약해야합니다.
얽히고 설킨

1
- def스타일 함수는 일부 바이트도 저장해야합니다.
부정 7

@negativeseven은 도전 문구에서 stdin / stdout을 사용해야하는 것처럼 보였습니다
Theo

두 번째 줄에 괄호를 놓을 수 있습니다.
얽히고 설킨

솔루션이 실제로 제대로 작동하려면 몇 가지 수정 (Python 2)이 필요 합니다. 결과는 180보다 작거나 같아야하며 0보다 크거나 같아야합니다.
33 분에 Erik the Outgolfer



1

Japt , 16 바이트

*FÑ aV*5½
mUa360

시도 해봐

*FÑ aV*5½     :Implicit input of integers U=h and V=m
*F            :Multiply U by 15
  Ñ           :Multiply by 2
    a         :Absolute difference with
     V*5½     :V multiplied by 5.5
mUa360        :Reassign to U
m             :Minimum of U and
 Ua360        :Absolute difference of U and 360

0

> <> , 17 바이트

b*$6a**-:0)12,-*n

온라인으로 사용해보십시오! (6:32)

스택에서 h, m으로 입력을받습니다.

설명

b*$6a**-:0)12,-*n
b*                Multiplies m by 11
  $               Swaps m & h
   6a**           Multiplies h by 60
       -          Subtracts m & h (v)
        :0)       Checks if v > 0 (b=0/1)
           12,-   Subtracts .5 from b (-.5/.5)
               *  Multiplies v by b (halve & abs)
                n Outputs result
b*                Errors

0

05AB1E , 16 바이트

60*+5.5*D(‚360%ß

첫 번째 입력 시간을 초 단위로 분을 사용합니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

기본적으로 다음 공식을 구현합니다.

=(60h+)×5.5
아르 자형=나는(모드360,모드360)

60*               # Multiply the (implicit) hours-input by 60
   +              # Add it to the (implicit) minutes-input
    5.5*          # Multiply it by 5.5
        D(‚       # Pair it with it's negative
           360%   # Take modulo-360 on both
               ß  # And then pop and push the minimum of the two
                  # (which is output implicitly as result)

0

피 레트, 59 바이트

{(h,m):x=(30 * h) - (m * 5.5)
num-abs(num-min(x,360 - x))}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.