バイナリ時間は何ですか?


14

バイナリ時間は何ですか?

誰もが通常時が何であるかを知っています。画面の右上(またはどこに置いても)にあります。しかし、人々がめったに自問しない質問はこれです。バイナリ時間は何ですか?

バイナリ時間

バイナリ時間(True Binary Time)は、最初に数値の最上位ビット(MSB)を読み取ることで機能します。その数がの場合、0表現される時間は正午までです。その数がの場合、1表現される時間は正午以降です。次のビットは、1日の半分を、最初のビットがさらに2つの等しい半分に分割します。今回は6時間です。次のビットは3時間、次の90分などに分割されます。のような時代は12:00:00、どちらでもないはずのようになり1ます。

私はこの奇妙なタイミングのシステムしか理解できないので、私のためにそれに変換するプログラムが必要です。ただし、2進数は2進数であり、2は小さい数なので、プログラムはできるだけ短くする必要があります。

必要条件

  • プログラムは、入力(24時間制)として時間を取り、対応するバイナリの時間数を出力する必要があります。
  • 出力番号は16ビット精度である必要があります(番号は16桁である必要があります)。
  • すべての変換を行うビルトインを使用することはできません。
  • 丸くする必要がある場合は床を張る必要があります。

ルール

  • 標準的な抜け穴は禁止されています。
  • プログラムはに何も書き込まないでくださいSTDERR

テストケース

00:00:00==> 0000000000000000
12:00:00==> 1000000000000000
01:30:00==> 0001000000000000
10:33:06==> 0111000010001101
09:57:30==> 0110101000111000
06:00:00==> 0100000000000000
18:00:00==>1100000000000000

得点

先に述べたように、勝つためには最小バイト数が必要です。

提出

回答が表示されるようにするには、次のマークダウンテンプレートを使用して、見出しから回答を開始してください。

# Language Name, N bytes

N提出のサイズはどこですか。スコアを改善する場合、古いスコアを打つことで見出しに残すことができます。例えば:

# Ruby, <s>104</s> <s>101</s> 96 bytes

ヘッダーに複数の数字を含める場合(たとえば、スコアが2つのファイルの合計であるか、インタープリターフラグペナルティーを個別にリストする場合)、実際のスコアがヘッダーの最後の数字であることを確認します。

# Perl, 43 + 2 (-p flag) = 45 bytes

言語名をリンクにして、リーダーボードスニペットに表示することもできます。

# [><>](http://esolangs.org/wiki/Fish), 121 bytes

リーダーボード

これは、通常のリーダーボードと言語ごとの勝者の概要の両方を生成するスタックスニペットです。


3
として入力できます[hour, minute, second]か?入力形式を制限するのは好きではありません。
リーキー修道女

2
どうやって09:57:30作るの0110110000000000
リーキー修道女

2
16ビットは65536個の値のみを表すことができます。1日は86400秒です。バイナリ表現と完全に一致しないものをどのように表現すべきですか?
-PurkkaKoodari

結果を16個の数字のリストとして返すことはできますか?
アダム

@Adámはい、できます。
ジョージギブソン

回答:


1

MATL、15バイト

YOtk-KWW*k16&YB

チャレンジで許可されている、時刻を表す文字列をシリアルの日付/時刻番号に変換するための組み込み関数を使用します。

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

説明

YO       % Input time string. Convert to serial date/time. Time is fractional part
tk-      % Duplicate, round down, subtract. This keeps fractional part only
KWW      % 34, 2 raised to, 2 raised to (`16W` would require an extra space)
*        % Multiply
k        % Round down
16&YB    % Convert to binary string with 16 digits. Display

5

CJam、20バイト

l':/60b9m<675/2bG0e[

テストスイート。

説明

65536(286400(1日の秒数)を超える 16)が675を超える512に簡素化される。

l     e# Read input.
':/   e# Split around ':', so we get ["hh" "mm" "ss"].
60b   e# Interpret as base-60 digits, which computes hh*60^2 + mm*60 + ss,
      e# i.e. it computes the total number of seconds. Note that this implicitly
      e# converts all three strings to integers.
9m<   e# Bitwise left-shift by 9 positions, which is the same as multiplying by
      e# 2^9 = 512.
675/  e# Divide by 675, flooring the result.
2b    e# Convert to binary.
G0e[  e# Left-pad with zeros to 16 digits.

3

Pyth、31 27バイト

.[\016.Bs*512cisMcQ\:60 675

テストスイート。

入力を、渡された秒数に変換し、係数で乗算します 2^16 / 24*60*60次にフロアし、16ビットバイナリに変換します。

簡素化して4バイトを節約 65536/86400512/675(愚かな)にことで。

入出力

00:00:00    0000000000000000
11:00:00    0111010101010101
12:00:00    1000000000000000
01:30:00    0001000000000000
10:33:06    0111000010001101
09:57:30    0110101000111000
06:00:00    0100000000000000
18:00:00    1100000000000000
23:59:59    1111111111111111

そして次にフロア」を正当化できますか?
ピーターテイラー

@PeterTaylor代わりに何をすべきでしょうか?
リーキー修道女

4
仕様を明確にするまで待ってから回答を投稿してください。
ピーターテイラー

@PeterTaylor正しい丸め方法はによって明らか10:33:06です。
アダム

@Adám、実際にはそうではありません。これは、フロアと最近傍への丸めで同じ出力を提供するためです。
ピーターテイラー

3

TSQL(sqlserver 2012)、103バイト

DECLARE @d datetime = '10:33:06'

DECLARE @ char(16)='',@x INT=cast(@d as real)*131072WHILE
len(@)<16SELECT @x/=2,@=concat(@x%2,@)PRINT @

オンラインで試す

非ゴルフ

DECLARE @d datetime = '10:33:06'

DECLARE @ char(16)='',
        @x INT=cast(@d as real)*131072
WHILE len(@)<16
SELECT @x/=2,@=concat(@x%2,@)
PRINT @

TSQL(sqlserver 2012)、119 106バイト

変数@xのない別のバージョンも含まれていましたが、数バイト長かったです。興味のある人のための非ゴルフバージョンを含む:

DECLARE @d datetime = '23:59:59'

DECLARE @ varchar(16) =''
WHILE LEN(@)<16
SET @+=LEFT(CAST(@d as decimal(9,9))*2*POWER(2,LEN(@))%2,1)
PRINT @

それはゴルフに見えません。たくさんの空白を削除できませんか?
アダム

@Adámそれは非常にゴルファーです、私はスクリプトを短くするために標準とは異なる方法を使用し、さらに別の方法を試しました。私の答えをcodegolfにコピーするときに、偶然の空白を入れました(1つだけ余分)。私はそこに改行を入れたかったのですが、代わりにWHILEの後に置くことにしました。スペースを削除し、あなたが本当にその単一の余分なスペースを掲載してdownvoted場合不思議
t-clausen.dk

@Adámと2番目の方法を見ている場合、それは私の実際の答えではないため、ゴルフではありません(キャラクター数を除く)。それを解決するための
単なる

3
いいえ、投票しませんでした。おそらく、OPが未解決のルールの質問を明確にする前に投稿されたすべての回答を下票するという原則を持っている人でした。非常に最新の答えを除くすべてに、1つのダウン票があります。(おそらく彼はその投稿の直前にここにいたので、おそらくピーター・テイラーだったでしょう。彼はこれについて不平を言っていました。)十分な担当者が得られたときにこれを見ることができます。ここに、いくつかあります!
アダム

2

JavaScript(ES6)、72 76バイト

4バイトを編集して thx @Neilを保存します

丸めについてはまだ不明です。これは切り捨てられ、大丈夫です。

t=>(t.split`:`.map(v=>t=+v+60*~~t),t*512/675|65536).toString(2).slice(1)

テスト

f=t=>(t.split`:`.map(v=>t=+v+60*~~t),t*512/675|65536).toString(2).slice(1)

function test() {
  var v=I.value
  R.textContent=f(v)
}

test()


;`00:00:00 ==> 0000000000000000
12:00:00 ==> 1000000000000000
01:30:00 ==> 0001000000000000
10:33:06 ==> 0111000010001101
09:57:30 ==> 0110101000111000
06:00:00 ==> 0100000000000000
18:00:00 ==> 1100000000000000`
.split('\n').forEach(t=>{
  [i,k]=t.split(' ==> ')
  r=f(i)
  ok=r==k
  O.textContent += (ok ? 'OK ':'KO ')+ i + ' -> ' + r + (ok? '\n' : ' Expected '+k+'\n')
})
<input id=I value='12:34:56' oninput=test()>
<span id=R></span>
<pre id=O></pre>


これがなぜ投票されたのかを解明しようとしています-t-clausen.dk 16
14:01

t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)2バイト節約できますが、reduceさらに1バイト進みますt=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
ニール

コメントのないダウン投票はクールではなく、アップ投票されます-t-clausen.dk 16
19:46

@ニールありがとうございます!.map 1でさらにバイトを保存
edc65

ええと、私はあなたがマップのためにどこから0を取得しようとしているのだろうと思ってい
ニール

1

APL(Dyalog)24 21バイト

ルールが明確になりました。

3要素リストとして時間のプロンプトを出します。

(16/2)⊤⌊512×675÷⍨60⊥⎕

編集:更新( 33:06の新しい結果に一致するように)。

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

 入力を促す

60⊥ base-60で評価する

675÷⍨ 675で割る

512× 512を掛ける

 床

()⊤ (ニーモニック:逆さまのベースは反ベース)次の番号システムに変換します。

16/2 2を16回複製します(16ビットバイナリ)   


0

Q、32バイト

48_0b\:_(512%675)*60/:"I"$":"\:

テスト

   t "00:00:00"
0000000000000000b
   t "12:00:00"
1000000000000000b
   t "01:30:00"
0001000000000000b
   t "10:33:06"
0111000010001101b
   t "09:57:30"
0110101000111000b
   t "06:00:00"
0100000000000000b
   t "18:00:00"
1100000000000000b
  • 表示の乱雑さを減らすために、元の式にわずかな変更を加えt、ラムダに名前を付けます

  • bサフィックスはバイナリを示します

説明

注-左から右に読み、右から左に評価する

読み取り値:512のフロアのバイナリ表現から48ドロップし、675で除算し、「:」元の文字列での分割からキャストされた整数に60のscalarFromVectorを掛けます

評価:

":"\:x 文字列x(ラムダの暗黙の引数)を「:」文字で分割します(Qは「」を使用してcharを表します)

"I"$x 文字列xをint(s)にキャスト->時間、分、秒

60/:x base 60を使用して、intのシーケンスから単一の値を計算します->合計秒

(512%675)*x 比率512%675(%は除算)を計算し、秒を乗算します。512%675は、分数の簡易形式(totalSecondsPerDay%64K)です

_ x フロートxの床を示します

0b\:x x(64ビット)のバイナリ表現を計算します

48_ x 最初の48ビットをドロップするので、16ビット表現になります

例(x = "01:30:00")。注-「/」は行末へのコメントを示します

":"\:"01:30:00" /-> ("01";"30";"00") "I"$ /-> 1 30 0 60/: /-> 5400 (512%675)* /-> 4096.0 _ /-> 4096 0b\: /-> 0000000000000000000000000000000000000000000000000001000000000000b 48_ /-> 0001000000000000b


0

ルビー、75バイト

h,m,s=t.split(':').map &:to_i;((h*3600+m*60+s<<9)/675).to_s(2).rjust 16,'0'

時間を秒に変換するより短い方法が必要だと思いますが、これは私が考えることができるすべてです。


0

Python、45バイト

lambda h,m,s:bin((s+m*60+h*3600)*512/675)[2:]

512/675自分でその要因に気付き、他の人が同じことをしたのを見ました。



0

PHP、47 46 43バイト

IBM-850エンコードを使用します。

printf(~┌Ø,strtotime($argn.UTC,0)*512/675);

次のように実行します:

echo "18:00:00" | php -nR 'printf(~┌Ø,strtotime($argn.UTC,0)*512/675);';echo

微調整

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