Was ist die binäre Zeit?


14

Was ist die binäre Zeit?

Jeder weiß, wie spät es ist. Es befindet sich oben rechts auf Ihrem Bildschirm. Aber eine Frage, die sich die Leute selten zu stellen scheinen, lautet: Was ist die binäre Zeit?

Binäre Zeit

Die Binärzeit (True Binary Time) liest zuerst das höchstwertige Bit (MSB) der Zahl. Wenn diese Zahl ist 0, ist die angegebene Zeit vor Mittag. Wenn diese Zahl ist 1, ist die angegebene Zeit nach Mittag. Das nächste Bit teilt die Hälfte des Tages, das erste Bit ausgedrückt in zwei gleiche Hälften, diesmal 6 Stunden. Das folgende Bit wird in 3 Stunden, die nächsten 90 Minuten usw. aufgeteilt. Zeiten wie 12:00:00, wo es scheint, sollte es auch nicht werden 1.

Ich kann dieses seltsame Timing-System nur verstehen, deshalb brauche ich ein Programm, um es für mich zu konvertieren. Da Binärzahlen jedoch Base-2 sind und 2 eine kleine Zahl ist, muss Ihr Programm so kurz wie möglich sein.

Bedarf

  • Ihr Programm sollte eine Zeit (als 24-Stunden-Zeit) als Eingabe und Ausgabe der entsprechenden binären Zeitnummer benötigen.
  • Die Ausgabenummer sollte eine 16-Bit-Genauigkeit haben (die Nummer sollte 16 Stellen lang sein).
  • Sie können kein integriertes Programm verwenden, das die gesamte Konvertierung für Sie ausführt.
  • Sie sollten Boden, wenn es abgerundet werden muss.

Regeln

  • Standardlücken sind verboten.
  • Ihr Programm sollte nichts schreiben STDERR.

Testfälle

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

Wertung

Wie ich bereits erwähnt habe, müssen Sie die wenigsten Bytes haben, um zu gewinnen.

Einreichungen

Um sicherzustellen, dass Ihre Antwort angezeigt wird, beginnen Sie Ihre Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:

# Language Name, N bytes

Wo Nist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:

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

Wenn Sie mehrere Zahlen in Ihre Kopfzeile aufnehmen möchten (z. B. weil Ihre Punktzahl die Summe von zwei Dateien ist oder wenn Sie die Strafen für Interpreter-Flags separat auflisten möchten), stellen Sie sicher, dass die tatsächliche Punktzahl die letzte Zahl in der Kopfzeile ist:

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

Sie können den Namen der Sprache auch als Link festlegen, der dann im Leaderboard-Snippet angezeigt wird:

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

Bestenliste

Hier ist ein Stack-Snippet, um sowohl eine reguläre Rangliste als auch eine Übersicht der Gewinner nach Sprache zu generieren.


3
Kann ich als eingeben [hour, minute, second]? Wir möchten das Eingabeformat nicht einschränken.
Undichte Nonne

2
Wie macht 09:57:30man das 0110110000000000?
Undichte Nonne

2
16 Bits können nur 65536 Werte darstellen. Ein Tag hat 86400 Sekunden. Wie sollen wir etwas darstellen, das nicht genau mit einer binären Darstellung übereinstimmt?
PurkkaKoodari

Können wir das Ergebnis als Liste mit 16 Zahlen zurückgeben?
Adám

@Adam Ja, das kannst du.
George Gibson

Antworten:


1

MATL , 15 Bytes

YOtk-KWW*k16&YB

Verwendet eine integrierte Funktion zum Konvertieren einer Zeichenfolge, die die Uhrzeit darstellt, in eine Seriennummer für Datum und Uhrzeit, die von der Abfrage zugelassen wird.

Probieren Sie es online!

Erläuterung

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 Bytes

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

Testsuite.

Erläuterung

Nutzt die Tatsache, dass 65536 (2 16 ) über 86400 (die Anzahl der Sekunden pro Tag) auf 512 über 675 vereinfacht wird.

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 Bytes

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

Testsuite.

Wandelt die Eingabe in die Anzahl der Sekunden um, multipliziert sie mit dem Faktor 2^16 / 24*60*60und setzt sie dann in eine 16-Bit-Binärdatei um.

4 Bytes durch Vereinfachung 65536/86400in 512/675(dumm mich) gespeichert .

Input-Output

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

Können Sie " und dann Boden " rechtfertigen ?
Peter Taylor

@PeterTaylor Was soll ich stattdessen tun?
Undichte Nonne

4
Warten Sie, bis die Spezifikation eindeutig ist, bevor Sie eine Antwort senden.
Peter Taylor

@PeterTaylor Die richtige Rundung ergibt sich aus 10:33:06.
Adám

@Adám, eigentlich nicht, denn das ergibt die gleiche Leistung mit Boden und Rundung zum nächsten.
Peter Taylor

3

TSQL (SQL Server 2012), 103 Byte

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

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

Probieren Sie es online aus

Ungolfed

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 (SQL Server 2012), 119 106 Byte

Enthält auch eine andere Version ohne die Variable @x, die jedoch einige Bytes länger ist. Einschließlich der ungolfed Version für Interessierte:

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 @

Das sieht nicht gut aus. Können Sie nicht viel Leerzeichen entfernen?
Adám

@Adám es ist sehr genervt, ich habe andere Methoden als den Standard verwendet, um das Skript zu verkürzen und habe sogar eine andere Methode ausprobiert. Ich habe gerade ein versehentliches Leerzeichen eingefügt, als ich meine Antwort in Codegolf kopierte (nur ein zusätzliches). Ich wollte dort einen Zeilenumbruch einfügen, habe mich aber dafür entschieden, diesen nach WHILE einzufügen. Entfernen Sie das Leerzeichen und fragen Sie sich, ob Sie mich wirklich für dieses zusätzliche Leerzeichen
abgewertet haben

@Adam und wenn du dir die zweite methode ansiehst, wird nicht golfen (außer die zeichenanzahl), da es nicht meine eigentliche antwort ist. Nur eine andere, berechnendere Methode, um sie zu lösen
t-clausen.dk

3
Nein, ich habe nicht abgelehnt. Es war wahrscheinlich jemand, der ein Prinzip hat, um alle Antworten, die vor dem OP gepostet wurden, herunterzustimmen, um offene Regelfragen zu klären. Alle bis auf die neueste Antwort haben genau eine Ablehnung. (Es war wahrscheinlich Peter Taylor, weil er kurz vor diesem Post das letzte Mal hier war und sich darüber beschwert hat.) Sie können dies sehen, wenn Sie genügend Wiederholungen erhalten. Hier, hab was!
Adám

2

JavaScript (ES6), 72, 76 Byte

Bearbeiten 4 Bytes und speichere das @Neil

Noch unklar über die Rundung. Dieser schneidet ab und das ist in Ordnung.

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

Prüfung

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>


Ich versuche herauszufinden, warum dies abgelehnt wurde
t-clausen.dk

t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)Speichert Sie 2 Bytes, reducegeht aber ein Byte weiter:t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
Neil

Downvote ohne Kommentar ist nicht cool, upvoted
t-clausen.dk

@ Neil, vielen Dank! Und mit .map 1 weiteres Byte gespeichert
edc65

Huh, ich habe mich gefragt, woher du die 0 für die Karte nehmen würdest ...
Neil

1

APL (Dyalog) , 24 21 Bytes

Die Regeln wurden jetzt geklärt.

Fordert zur Eingabe der Zeit als 3-Elemente-Liste auf.

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

Bearbeiten: Aktualisiert ( ), um dem neuen Ergebnis für 10:33:06 zu entsprechen.

Probieren Sie es online!

 Eingabeaufforderung

60⊥ in Basis 60 auswerten

675÷⍨ Teilen Sie durch 675

512× multiplizieren mit 512

 Fußboden

()⊤ Konvertieren in (Mnemonik: Upside-Down-Base ist Anti-Base) das folgende Zahlensystem:

16/2 2 16-mal replizieren (dh 16-Bit-Binärdatei)   


0

Q, 32 Bytes

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

Prüfung

   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
  • Um die Überfüllung der Anzeige zu verringern, gehe ich von einer geringfügigen Änderung des ursprünglichen Ausdrucks aus, tder dem Lambda den Namen gibt

  • Das Suffix b gibt binär an

Erläuterung

HINWEIS: Von links nach rechts lesen, von rechts nach links auswerten

Liest als: 48 Tropfen von der binären Darstellung des Bodens von 512 dividiert durch 675 und multipliziert mit 60 scalarFromVector über die Ganzzahl, die aus Teilungen an der ursprünglichen Zeichenfolge ":" geworfen wurde

Auswertung:

":"\:x Teilt den String x (implizites Argument des Lambda) am Zeichen ":" auf (Q verwendet "", um das Zeichen zu kennzeichnen)

"I"$x Zeichenfolge (n) x in int (s) -> Stunden, Minuten, Sekunden umwandeln

60/:x Verwendet die Basis 60, um einen einzelnen Wert aus einer Folge von Ints -> Sekunden insgesamt zu berechnen

(512%675)*x berechnet das Verhältnis 512%675(% ist dividiert) und multipliziert Sekunden. 512% 675 ist die vereinfachte Form des Bruchs (totalSecondsPerDay% 64K)

_ x zeigt den Boden des Schwimmers x an

0b\:x berechnet die binäre Darstellung von x (64 Bit)

48_ x Lassen Sie die ersten 48 Bits fallen, sodass wir unsere 16-Bit-Darstellung haben

Beispiel (x = "01:30:00"). HINWEIS.- "/" kennzeichnet einen Kommentar zum Zeilenende

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


0

Ruby, 75 Bytes

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

Ich glaube, es muss eine kürzere Methode geben, um die Zeit in Sekunden umzurechnen, aber das ist alles, was ich mir vorstellen kann.


0

Python, 45 Bytes

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

Kam mit dem 512/675Faktor selbst auf und sah dann, dass andere es genauso taten.


0

C 91 Bytes

f(h,m,s,n,i){i=0;n=(s+m*60+h*3600)*512/675;while(i<16)printf((n&32768)?"1":"0"),n<<=1,i++;}

0

PHP, 47 46 43 Bytes

Verwendet die IBM-850-Codierung.

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

Laufen Sie wie folgt:

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

Optimierungen

  • Ein Byte mithilfe der IBM-850-Codierung gespeichert.
  • 3 Bytes mit gespeichert $argn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.