運命の時計の針


9

あなたは椅子につながれています。あなたの下には巨大な火山があります。あなたの隣にある12時間の時計が不気味にカチカチと音を立てており、それは後ろから鎖に繋がるワイヤーを持っていることがわかり、地球の中心にあなたを落とします。時計にテーピングは注意です:

各時計の針には電極があります。両方の時計の針が同じ位置にあると、電力が流れて死んでしまいます。つまり、これが発生する正確な時間を、分単位で教えてください。

あなたはすべてのプログラミング言語を知っているコンピュータを持っています。あなたは限り短いプログラム(これはであり、標準の抜け穴は禁止されています)を作成し、邪悪な科学者に時間を教える必要があります。プログラムは、時間と分で構成される入力を(任意の方法で)受け取る必要があります。これが発生する次の時間と分を(任意のメソッドで)返す必要があります。

OEISページによると、11回のオーバーラップ時間は次のとおりです。

00:00:00 plus 0/11 s, 01:05:27 plus 3/11 s,
02:10:54 plus 6/11 s, 03:16:21 plus 9/11 s,
04:21:49 plus 1/11 s, 05:27:16 plus 4/11 s,
06:32:43 plus 7/11 s, 07:38:10 plus 10/11 s,
08:43:38 plus 2/11 s, 09:49:05 plus 5/11 s,
10:54:32 plus 8/11 s.

次回は12:00:00になります。秒とその小数部分は、この課題では必要ありません。単に最も近い分に丸めます。

テストケース:

0:00 (Or 12:00) > 1:05
1:00 > 1:05
11:56 > 12:00 (Or 0:00)
6:45 > 7:38
5:00 > 5:27
6:30 > 6:33 (round up)

プログラムは、関数または完全なプログラムにすることができます。0:00またはを選択してもかまいません12:00。どちらでもかまいません。幸運を!


コメントは詳細な議論のためのものではありません。この会話はチャットに移動しました
Mego 2018

回答:


6

JavaScript(Node.js)54 47バイト(最も近い値に丸め)

-7バイト。ありがとう@ user202729

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60+.5|0]

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


JavaScript(Node.js)40 33 44バイト(0に切り上げ)

@Arnauldのおかげで-3バイト

@Kevin Cruijssenによる-4バイト

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60|0]

説明

a=>b=>[(a+=b>5.46*a)+a/11|0,a%12*65.46%60|0]    Full Code
a                                               Hours
   b                                            Minutes
    =>[                    ,               ]    return array with
       (a+=        )                            add to the current hour
           b>5.46*a                             1 if the minute's clock hand has 
                                                passed the hour's clock hand. Here we use
                                                equation 60*a/11 which is the same as 5.46*a
                    +a/11                       and add 1 when hour is 11
                         |0                     floor the result

                            a%12*65.46%60|0     Here we do equation ((720/11)*a) (mod 60)
                            a%12                In case of hour 12 we take 0
                                *65.46          multiply hour by 720/11 which can be shortened to
                                                65.46 to save 1 byte.
                                      %60       mod 60
                                         |0     floor the result

補足:数学の知識が豊富な人なら、これは間違いなくゴルフになると思います。合計と乗算の方法がほとんどわかりません

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


実際の時計がどのように動作するかを考えると、これは正しくありません:datagenetics.com/blog/november12016/index.html
Night2

いくつかの丸めエラーがあります。05:00出力すべき05:27しかし出力05:25の代わりに、そして06:45出力する必要があり07:38ますが出力は07:35代わりに。ここにおそらく有用なoeisシーケンスがあります:A178181
Kevin Cruijssen

1
@LuisfelipeDejesusMunoz私が与えた2つのテストケースは確かに正しくなりましたが、(または)の代わり11:56に出力するようです。00:0500:0012:00
Kevin Cruijssen、2018

@KevinCruijssen完了。私a=(a+=b>=a*5)%12は少し短くなると思いますが、私はこれがあまり得意ではありません
Luis felipe De jesus Munoz

1
Math.round(x)ただではない0|x+.5ですか?
user202729 2018

5

J、31バイト

0.5<.@+>:@<.&.(11r720*12 60&#.)

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

Jの数値を丸める方法は0.5、床を追加して取る(<.)ことです。バイトが多すぎる...


説明

12 60&#. (混合ベース変換)[時、分]の配列から0:00以降に渡された分に変換します。

0:00から開始して、12/11時間(つまり720/11分)ごとに、2つの針が1回オーバーラップすることに注意してください。

したがって、分の値が与えられたら、720/11の最も近い倍数(それ自体とは異なる)に切り上げるだけです。これは*、11/720(Jは有理数リテラル11r720)によって達成でき、フロアを取り<.、増分し>:、それを720/11で乗算します。

「11/720を掛ける」と「720/11を掛ける」は2つの逆のアクションであり、「[時、分]から経過した分数に変換する」、その逆も同様です。幸いにも、Jには組み込み&.(アンダー)があり、変換を適用した後、一部のアクションを元に戻します。

その後ちょうど丸めん:0.5 +その後<.


5

R、68バイト

a=round(1:30*720/11);a[a>sum(scan()*c(60,1))][1]%/%c(60,1)%%c(12,60)

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

  • -ジュゼッペのおかげで2バイト
  • 丸めが欠落しているため+7バイト:(

方程式の活用:

same_position_minutes = 720/11 * index

index最初の重複する位置(00:00)の場合は0、2番目の場合は1などです。


1
私はあなたの周りに余分な括弧のセットがあると思います(a[...]...c(60,1))
Giuseppe

@Giuseppe:うん、そうだね...ありがとう!
digEmAll 2018

@digEmAllこれはに対して間違った答えを与え6:30 > 6:33ます。
mbomb007

@ mbomb007:正解、修正済み;)
digEmAll

4

R、88バイト

i=scan();d=1+60*i[1]+i[2];while(abs(60*(h=d%/%60%%12)-11*(m=d%%60))>5){d=d+1};paste(h,m)

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

時間を1分増やします。角度をチェックします。十分に接近していない場合、解が見つかるまでループします。


1
ええ、それはそれを行うクールな方法です。私は実際の時計をシミュレートすることを考えたことはありません!
Redwolfプログラム


2

Java 8、89 82バイト

(h,m)->(m=m<(m=(int)(h%12*720d/11%60))?m:(int)(++h%12*720d/11%60))*0+h%12%11+" "+m

修繕。後でゴルフできるかどうかを確認します(おそらく別の回答を移植することによって)。

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

説明:

TODO


あなたが移植した答えと同じ問題(明らかに)-例:f.apply(56).apply(10)利回り11 59
ジョナサンアラン

@JonathanAllan修正済み。私はいくつかは、後で...バイト取り除くことができるかどうかを確認します
ケビンCruijssenを

@KevinCruijssenこれはに対して間違った答えを与え6:30 > 6:33ます。
mbomb007

@ mbomb007わかっています。それを修正する前に、OPの応答を待っています。床、丸、天井、またはその両方が許可されるかどうか(チャレンジを投稿した場合、4番目のオプションを使用しますが、最初にOPを待ちましょう)。
Kevin Cruijssen、2018

@KevinCruijssen OPによるコメントのため、テストケースは質問に編集されました。ラウンドの最も一般的な定義を使用すると、OPの意図は明らかです。
mbomb007

2

Apl(Dyalog Unicode)、28バイト

((⍳11),⍪0,+\∊5/⊂5 6)(⍸⌷1⊖⊣)⎕

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


説明

((⍳11),⍪0,+\∊5/⊂5 6)手がオーバーラップする時間の行列です(tioリンクの最後に印刷され
(⍸⌷1⊖⊣)⎕ます)は、入力が行列にある間隔を見つけ、その下のインデックスが折り返します。


2

C#(.NET Core)、70バイト

(h,m)=>{h%=12;int n=(5*h+h/2)%60;return (m>n||h>10)?f(h+1,0):h+":"+n;}

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

すべてのテストケースに合格したと思います。h = 11のケースはちょっと醜いですが

説明:

(h,m)=>{ // Lambda receiving 2 integers
    h%=12; // Just to get rid of the 0/12 case
    int n=(5*h+h/2)%60; // get the minute at which the hands overlap 
                        //for current hour.
    return 
    (m>n||h>10)? // if current minute > n or h=11
        f(h+1,0) // it will happen next hour
    :
        h+":"+n; // return result
}

これはの間違った答えを与え6:30 > 6:33ます。
mbomb007

@ mbomb007よろしくお願いします。オーバーラップ時間の完全なリストが追加される前に、最初の試行を行いました。
F.Carette 2018

今は大丈夫です。currentTime == overlayTimeの場合の対処方法については明確な指示がないため、これらの場合は現在の時刻を返します(指定された(1,5)は、「2:11」ではなく「1:5」を返します)。 。
F.Carette 2018

1

JavaScript、41バイト

p=>q=>(p+=q>=(5.5*p|0),p%=11,[p,5.5*p|0])



0

Perl 6、43バイト

(* *60+*+33).round(65.45).round.polymod(60)

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

時間と分を表す2つの整数を取り、時間と分を逆の順序で返す匿名のWhateverラムダ。現在、整列された時間を入力した場合、次の整列された時間を出力するか、同じ時間にとどまるかにかかわらず、一貫性がありません。OPがその問題に対応するのを待っていますが、今は未定義として扱っています。

説明

(* *60+*+33)   # Converts the two inputs to number of minutes
            .round(65.45)   # Round to the nearest multiple of 65.45
                         .round  # Round to the nearest integer
                               .polymod(60) # Repeatedly modulo by 60 and return the list of results
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.