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 N
ist 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.
/* Configuration */
var QUESTION_ID = 81057; // Obtain this from the url
// It will be like https://XYZ.stackexchange.com/questions/QUESTION_ID/... on any question page
var ANSWER_FILTER = "!t)IWYnsLAZle2tQ3KqrVveCRJfxcRLe";
var COMMENT_FILTER = "!)Q2B_A2kjfAiU78X(md6BoYk";
var OVERRIDE_USER = 53406; // This should be the user ID of the challenge author.
/* App */
var answers = [], answers_hash, answer_ids, answer_page = 1, more_answers = true, comment_page;
function answersUrl(index) {
return "https://api.stackexchange.com/2.2/questions/" + QUESTION_ID + "/answers?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + ANSWER_FILTER;
}
function commentUrl(index, answers) {
return "https://api.stackexchange.com/2.2/answers/" + answers.join(';') + "/comments?page=" + index + "&pagesize=100&order=desc&sort=creation&site=codegolf&filter=" + COMMENT_FILTER;
}
function getAnswers() {
jQuery.ajax({
url: answersUrl(answer_page++),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
answers.push.apply(answers, data.items);
answers_hash = [];
answer_ids = [];
data.items.forEach(function(a) {
a.comments = [];
var id = +a.share_link.match(/\d+/);
answer_ids.push(id);
answers_hash[id] = a;
});
if (!data.has_more) more_answers = false;
comment_page = 1;
getComments();
}
});
}
function getComments() {
jQuery.ajax({
url: commentUrl(comment_page++, answer_ids),
method: "get",
dataType: "jsonp",
crossDomain: true,
success: function (data) {
data.items.forEach(function(c) {
if (c.owner.user_id === OVERRIDE_USER)
answers_hash[c.post_id].comments.push(c);
});
if (data.has_more) getComments();
else if (more_answers) getAnswers();
else process();
}
});
}
getAnswers();
var SCORE_REG = /<h\d>\s*([^\n,]*[^\s,]),.*?(\d+)(?=[^\n\d<>]*(?:<(?:s>[^\n<>]*<\/s>|[^\n<>]+>)[^\n\d<>]*)*<\/h\d>)/;
var OVERRIDE_REG = /^Override\s*header:\s*/i;
function getAuthorName(a) {
return a.owner.display_name;
}
function process() {
var valid = [];
answers.forEach(function(a) {
var body = a.body;
a.comments.forEach(function(c) {
if(OVERRIDE_REG.test(c.body))
body = '<h1>' + c.body.replace(OVERRIDE_REG, '') + '</h1>';
});
var match = body.match(SCORE_REG);
if (match)
valid.push({
user: getAuthorName(a),
size: +match[2],
language: match[1],
link: a.share_link,
});
});
valid.sort(function (a, b) {
var aB = a.size,
bB = b.size;
return aB - bB
});
var languages = {};
var place = 1;
var lastSize = null;
var lastPlace = 1;
valid.forEach(function (a) {
if (a.size != lastSize)
lastPlace = place;
lastSize = a.size;
++place;
var answer = jQuery("#answer-template").html();
answer = answer.replace("{{PLACE}}", lastPlace + ".")
.replace("{{NAME}}", a.user)
.replace("{{LANGUAGE}}", a.language)
.replace("{{SIZE}}", a.size)
.replace("{{LINK}}", a.link);
answer = jQuery(answer);
jQuery("#answers").append(answer);
var lang = a.language;
if (/<a/.test(lang)) lang = jQuery(lang).text();
languages[lang] = languages[lang] || {lang: a.language, user: a.user, size: a.size, link: a.link};
});
var langs = [];
for (var lang in languages)
if (languages.hasOwnProperty(lang))
langs.push(languages[lang]);
langs.sort(function (a, b) {
if (a.lang > b.lang) return 1;
if (a.lang < b.lang) return -1;
return 0;
});
for (var i = 0; i < langs.length; ++i)
{
var language = jQuery("#language-template").html();
var lang = langs[i];
language = language.replace("{{LANGUAGE}}", lang.lang)
.replace("{{NAME}}", lang.user)
.replace("{{SIZE}}", lang.size)
.replace("{{LINK}}", lang.link);
language = jQuery(language);
jQuery("#languages").append(language);
}
}
body { text-align: left !important}
#answer-list {
padding: 10px;
width: 290px;
float: left;
}
#language-list {
padding: 10px;
width: 290px;
float: left;
}
table thead {
font-weight: bold;
}
table td {
padding: 5px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="//cdn.sstatic.net/codegolf/all.css?v=83c949450c8b">
<div id="answer-list">
<h2>Leaderboard</h2>
<table class="answer-list">
<thead>
<tr><td></td><td>Author</td><td>Language</td><td>Size</td></tr>
</thead>
<tbody id="answers">
</tbody>
</table>
</div>
<div id="language-list">
<h2>Winners by Language</h2>
<table class="language-list">
<thead>
<tr><td>Language</td><td>User</td><td>Score</td></tr>
</thead>
<tbody id="languages">
</tbody>
</table>
</div>
<table style="display: none">
<tbody id="answer-template">
<tr><td>{{PLACE}}</td><td>{{NAME}}</td><td>{{LANGUAGE}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
<table style="display: none">
<tbody id="language-template">
<tr><td>{{LANGUAGE}}</td><td>{{NAME}}</td><td>{{SIZE}}</td><td><a href="{{LINK}}">Link</a></td></tr>
</tbody>
</table>
[hour, minute, second]
? Wir möchten das Eingabeformat nicht einschränken.09:57:30
man das0110110000000000
?Antworten:
MATL , 15 Bytes
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
quelle
CJam, 20 Bytes
Testsuite.
Erläuterung
Nutzt die Tatsache, dass 65536 (2 16 ) über 86400 (die Anzahl der Sekunden pro Tag) auf 512 über 675 vereinfacht wird.
quelle
Pyth,
3127 BytesTestsuite.
Wandelt die Eingabe in die Anzahl der Sekunden um, multipliziert sie mit dem Faktor
2^16 / 24*60*60
und setzt sie dann in eine 16-Bit-Binärdatei um.4 Bytes durch Vereinfachung
65536/86400
in512/675
(dumm mich) gespeichert .Input-Output
quelle
10:33:06
.TSQL (SQL Server 2012), 103 Byte
Probieren Sie es online aus
Ungolfed
TSQL (SQL Server 2012),
119106 ByteEnthält auch eine andere Version ohne die Variable @x, die jedoch einige Bytes länger ist. Einschließlich der ungolfed Version für Interessierte:
quelle
JavaScript (ES6), 72,
76ByteBearbeiten 4 Bytes und speichere das @Neil
Noch unklar über die Rundung.Dieser schneidet ab und das ist in Ordnung.Prüfung
quelle
t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)
Speichert Sie 2 Bytes,reduce
geht aber ein Byte weiter:t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
APL (Dyalog) ,
2421 BytesDie Regeln wurden jetzt geklärt.
Fordert zur Eingabe der Zeit als 3-Elemente-Liste auf.
Bearbeiten: Aktualisiert (
⌈
→⌊
), um dem neuen Ergebnis für 10:33:06 zu entsprechen.Probieren Sie es online!
⎕
Eingabeaufforderung60⊥
in Basis 60 auswerten675÷⍨
Teilen Sie durch 675512×
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)quelle
Q, 32 Bytes
Prüfung
Um die Überfüllung der Anzeige zu verringern, gehe ich von einer geringfügigen Änderung des ursprünglichen Ausdrucks aus,
t
der dem Lambda den Namen gibtDas 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 umwandeln60/:x
Verwendet die Basis 60, um einen einzelnen Wert aus einer Folge von Ints -> Sekunden insgesamt zu berechnen(512%675)*x
berechnet das Verhältnis512%675
(% ist dividiert) und multipliziert Sekunden. 512% 675 ist die vereinfachte Form des Bruchs (totalSecondsPerDay% 64K)_ x
zeigt den Boden des Schwimmers x an0b\: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 habenBeispiel (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
quelle
Ruby, 75 Bytes
Ich glaube, es muss eine kürzere Methode geben, um die Zeit in Sekunden umzurechnen, aber das ist alles, was ich mir vorstellen kann.
quelle
Python, 45 Bytes
Kam mit dem
512/675
Faktor selbst auf und sah dann, dass andere es genauso taten.quelle
C 91 Bytes
quelle
PHP,
474643 BytesVerwendet die IBM-850-Codierung.
Laufen Sie wie folgt:
Optimierungen
$argn
quelle