Analog is Obtuse!


23

アナログ時計には2つの針があります*:時間と分。
これらの針は、時間が経つにつれて時計の顔を一周します。分針が1回転するごとに、時針が1/12回転します。時針を2回転させると、1日を表します。

これらの手は同じ中心点に固定され、その点を中心に回転するため、いつでも手の間の角度を計算できます。実際、任意の時点で2つの角度があります。大きいものと小さいもの(両方とも180になることがありますが、それは重要ではありません)

*仮想時計には秒針がありません

仕事

24時間形式で時刻を指定すると、手の間の小さい角度を度単位で出力します。手が直接対向互いに(例えばにおける通りである場合6:0018:00等)出力180は

ルール

入力は次のように使用できます。-区切り文字で区切られた文字列:6:3214.26 -2つの独立した値、文字列または整数:6, 3214, 26 -2つの値、文字列または整数の配列:[6, 32][14, 26]

あなたはまた、必要に応じて(あなたが文字列を取ると仮定して)あなたの答えは入力が2桁にパッドを入れられたことが必要であることを指定することができ、すなわち:06:3206, 32[06, 32]

:あなたはまた、必要に応じて、すなわち、その後、時間分を取って、入力の順序を逆にします32:632, 6[26, 14]

Hourは0から23(包括的)までの整数値で、Minuteは0から59(包括的)までの整数値です

分針が顔に沿って6度刻みでスナップすると仮定できます(各分値に対して等間隔の位置1つ)
時針が顔に沿って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.5mの値が大きく、値が小さいと、一部の実装が失敗する可能性があります)。hm
アーナルド

1
ありがとう、@ Arnauld、あなたはちょうど私にバイトを要しました!:p
シャギー

回答:


14

JavaScript(ES6)、 41 40  39バイト

入力をとして受け取ります(h)(m)

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

オンラインでお試しください!

どうやって?

代わりに範囲内で直接作業の[0..360]、我々は一時的な変数の定義xの範囲内を[0..4]

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

度単位の角度は次のように与えられます。

min(4x,x)×90

我々は間違いなく長く使用しないようにしたいしかし、式は、JSコードに少し異なる実装されているMath.abs()としますMath.min()

絶対値を計算する代わりに、次の計算により[0..12]正の値を強制します。

x=4+h311m180

そして、最小値を計算する代わりに、単純に2ビット単位のANDを行うことにより、どちらの場合であるかを判断します。これが、最初に2累乗で区切られた間隔を選択した理由です。


5

ゼリー14 12バイト

ד<¿‘Iæ%Ø°AH

オンラインでお試しください!

時間を2つの整数(時間、分)のリストとして取る単項リンク。

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

対称mod?それはどうですか?
シャギー

@Shaggy非常に便利で、(-180, 180]同等の間隔で値を返します(mod 360)。これらの組み込みコマンド...
ニール

1
Ø°for 360“<¿‘forを使用して、半分の角度で作業して2バイト節約します60,11。以下のようなので、ד<¿‘Iæ%Ø°AH TIO
ジョナサン・アラン

私は12 文字を言うつもりでしたが、Windows-1252(および他のいくつかのエンコーディング)は実際にこれを12バイトでエンコードできることがわかりました。さまざまな非ASCII文字の間では、単一の非Unicodeエンコードがそれらすべてをカバーするとは思いませんでしたが、明らかに、私はそこで非常に間違っています。
タナトス

@Thanatosコードゴルフに特化した一部の言語には、それぞれが1バイトでエンコードする256文字の独自のコードページがあります。Jellyもその1つで、このカスタムコードページがあります。05AB1E、Charcoal、MathGolf、Staxなどは、カスタムコードページを持つ他の言語です。ただし、実際にはほとんどがWindows-1252に基づいています。:)
ケビンクルーッセン

4

MATL、18バイト

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

時間の2つの入力に続いて分を受け入れます。この回答と同じ方法を使用します

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言語(Mathematica)30 29 28バイト

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

オンラインでお試しください!

改変されていないバージョン:

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

初期セットアップ。およびに時間と分を入力hm、現在の角度dを360度(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このフローを逆にするように設定します。

この2番目のルールは複数回トリガーでき、初期セットアップルールの前にトリガーすることもできます。これは何も害を与えないので、これを防ぐ必要はありません。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³⁶⁰

オンラインでお試しください!リンクは、コードの詳細バージョンです。入力を2つの整数として受け取ります。説明:

             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

Python 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分単位で1時間から進められる角度(例:4:24の場合、時針は4時の位置から12度
h*30-m*5.5進みました)-時針と分針の間の2つの角度の1つ。以下のための係数がmある5.5のでm*6-m*.5=m*5.5、360°より大きい値(例:if h,m=13,0)または0°より小さい値(例:ifh,m=12,30
(h*30-m*5.5)%360-このモジュロは、上記の計算値が0〜360°の間にない場合を考慮します。これはまだ答えではありません。2つの角度のアンプラーになる可能性がありますが、最も狭い角度が必要です
180-abs(180-(h*30-m*5.5)%360)。これが最終結果です。一般的な規則は、x-abs(x-y)と同等でmin(y,x-y)、正しい結果が得られます



1

Pythonの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スタイル機能にもいくつかのバイトを保存する必要があります。
負の

それはそれのように思えた挑戦文言から@negativesevenを使用しなければならない標準入力/標準出力
テオ

2行目に括弧をドロップできます。
シャギー

ソリューションを実際に動作させるには、いくつかの修正(Python 2)が必要です。結果は以下であるか、または180に等しい、より大きいまたは0に等しくなければなりません
エリック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%ß

最初の入力として時間、2番目の入力として分かかります。

オンラインそれを試してみたり、すべてのテストケースを確認してください

説明:

基本的に、次の式を実装します。

t=60h+m×5.5
r=mntmod360tmod360

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.