最寄りの時計の針を見つける


15

チャレンジ

真夜中を過ぎた秒数が与えられたら、可能な限り少ないバイトを使用して、時計の文字盤の任意の2つの針の間の最小の角度を出力します。

秒数は常に86400未満であると想定できます。角度は度またはラジアンで表すことができます。

リファレンスソリューションは次の場所にあります。 http //ideone.com/eVdgC0

テストケース(度単位の結果)

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

明確化

  • 時計には3つの針があります:時間、分、秒。
  • すべての針は連続的に動くため、時計の文字盤の目盛りの間には時針と分針があります。

関連する課題(分と時針のみ、度単位)
-Sp3000

1
あなたはおそらく時計に秒針があることを明確にすべきです。
isaacg

テストケースを追加できますか?
ベータ崩壊

1
一部の時計では、秒針が上に達すると、分針が次の分にジャンプします。他では、それは絶えず動きます。私はこれが連続的に動く時計だと思いますか?また、注意深く読むと明らかになりますが、ほとんどの時計には少なくとも2つの針があるため、最初は「秒針」が曖昧であることがわかりました。
レトコラディ

1
@BetaDecay確かに。「時計には、時、分、秒の3つの針があります。」
レトコラディ

回答:


10

CJam、36 35 34 32 30バイト

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

出力はラジアン単位です。86400のすべての可能な入力に対するソリューションを検証しました。

CJamインタプリタでオンラインで試してください。

考え

ラジアンはフルラップであるため、クロックの1分/秒間隔は2π/ 60 =π/ 30ラジアン幅です。

したがって、秒数をπ/ 30で除算します秒針の位置が得られます。

分針は秒針の60分の1のペースで動くため、上からの結果を60で割ると分針の位置が得られます。

同様に、最後の結果を12で割ると、時針の位置が得られます。

上記の3つの商が必ずしも範囲[0,2π)にあるわけではないことに注意してください

手の角度の9つの可能な差すべてを計算することにより、3つの0(手とそれ自体の間の角度距離)および異なる手の間の6つの距離を取得します。

最も近い手が12を含まない半分にある場合にある場合、上記との違いの1つは目的の出力(mod2π)です。

ただし、015530(たとえば)では、時針は1.008 rad(57.75 deg)の角度にあり、分針は5.812 rad(333.00 deg)の角度にあります。 12、差が4.804 radになります。 (275.25 deg)。この結果をフルラップから差し引くことにより、「他の方向」で測定された角度が得られます。これは1.479 rad(84.75 rad)に相当します。

今、むしろ各アングルマッピングよりθにおける[0,2π)を条件付きの結果減算πを、我々ができ、単純に計算ARCCOS(COS(θ))ので、COS周期と偶数の両方であり、そしてARCCOSは常にに値をもたらします[ 0、π)

3つの最小の結果(すべてゼロ)をスキップすると、4番目に小さい結果が目的の出力になります。

コード

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度とy度の間の絶対角距離を計算するにはy - x、360を範囲にmod して[-180, 180]、絶対値を取得します。(上の制約がないことに注意してくださいxy。)したがって、この関数は単にペアごとの差異を計算しt/10-t/1206t-t/10し、6t-t/120そしてそれを行います。


申し訳ありませんが、Mathematicaに慣れていませんが、実際には真夜中からの秒数の引数または変数を受け入れますか?
ウィニー

1
@Winnyはい、それは(で示される&)純粋な関数であり、渡される最初の引数は内部でとして参照され#ます。
-jcai

7

Python、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。私たちは、から円上の自分の位置を取得するために、これらのmod 60を取ることができます0します60

それらの差分mod 60を取ると、一方が他方の前にあるユニットの数を取得します。6つの可能な差すべてを取り、最小値を見つけてから、乗算し6360度ます。

二層リストの内包は、第で表されるように、第1の手を選択する72060または1、次にセットXORを介して除去最初の選択と、そのセットのうち一方を選択します。

これを参照コードに対して徹底的にテストしました。


6

C#、163 152バイト

これにより、すべてのハンドが2回作成されてラップアラウンドのカウントが行われ、すべての組み合わせがループ処理され、ハンド間の最小角度が検出されます。計算は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

デニスを使用してarccos(cos(距離を正規化します。ただし、すべてのペアワイズ距離を計算するのではなく、を使用して必要な3つのみを計算しΔList([seconds],[minutes],[hours],[seconds]ます。

このプログラムはDegreeモードを予期し、度単位で答えを返します。

EDIT:5!は1バイト短くなり120ます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.