Quel est le temps binaire?
Tout le monde sait quelle est l'heure normale. Il est là-haut en haut à droite (ou partout où vous le mettez) de votre écran. Mais une question que les gens semblent rarement se poser est la suivante: quel est le temps binaire ?
Temps binaire
Le temps binaire (True Binary Time) fonctionne en lisant d'abord le bit le plus significatif (MSB) du nombre. Si ce nombre est 0
, le temps exprimé est avant midi. Si ce nombre est 1
, le temps exprimé est après midi. Le bit suivant divise la moitié de la journée, le premier bit exprimé en deux moitiés plus égales, cette fois de 6 heures. Le bit suivant se divise en 3 heures, les 90 minutes suivantes, etc. Des temps comme 12:00:00
, où il semble que ce ne devrait être ni l'un ni l'autre, deviennent 1
.
Je ne peux que comprendre cet étrange système de synchronisation, j'ai donc besoin d'un programme pour le convertir pour moi. Mais comme les nombres binaires sont Base-2 et 2 est un petit nombre, votre programme doit être aussi court que possible.
Exigences
- Votre programme doit prendre un certain temps (au format 24 heures) comme entrée et sortie du numéro d'heure binaire correspondant.
- Le numéro de sortie doit avoir une précision de 16 bits (le nombre doit être composé de 16 chiffres).
- Vous ne pouvez pas utiliser une fonction intégrée qui effectue toute cette conversion pour vous.
- Vous devriez plancher s'il doit être arrondi.
Règles
Cas de 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
Notation
Pour gagner, comme je l'ai mentionné plus tôt, vous devez avoir le moins d'octets.
Soumissions
Pour vous assurer que votre réponse s'affiche, veuillez commencer votre réponse avec un titre, en utilisant le modèle de démarque suivant:
# Language Name, N bytes
où N
est la taille de votre soumission. Si vous améliorez votre score, vous pouvez conserver les anciens scores dans le titre, en les barrant. Par exemple:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si vous souhaitez inclure plusieurs nombres dans votre en-tête (par exemple, parce que votre score est la somme de deux fichiers ou que vous souhaitez répertorier les pénalités de drapeau d'interprète séparément), assurez-vous que le score réel est le dernier numéro de l'en-tête:
# Perl, 43 + 2 (-p flag) = 45 bytes
Vous pouvez également faire du nom de la langue un lien qui apparaîtra ensuite dans l'extrait de classement:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Classement
Voici un extrait de pile pour générer à la fois un classement régulier et un aperçu des gagnants par langue.
/* 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]
? Nous n'aimons pas restreindre le format d'entrée.09:57:30
fait0110110000000000
?Réponses:
MATL , 15 octets
Utilise une fonction intégrée pour convertir une chaîne représentant l'heure en un numéro de date / heure série, ce qui est autorisé par le défi.
Essayez-le en ligne!
Explication
la source
CJam, 20 octets
Suite de tests.
Explication
Utilise le fait que 65536 (2 16 ) sur 86400 (le nombre de secondes dans une journée) se simplifie à 512 sur 675.
la source
Pyth,
3127 octetsSuite de tests.
Convertit l'entrée en nombre de secondes écoulées, multiplie par un facteur de
2^16 / 24*60*60
, puis plancher et convertit en binaire 16 bits.Enregistré 4 octets en simplifiant
65536/86400
en512/675
(stupide moi).Entrée sortie
la source
10:33:06
.TSQL (sqlserver 2012), 103 octets
Essayez-le en ligne
Non golfé
TSQL (sqlserver 2012),
119106 octetsInclut également une version différente sans la variable @x, mais elle était plus longue de quelques octets. Y compris la version non golfée pour les personnes intéressées:
la source
JavaScript (ES6), 72
76octetsÉditer 4 octets de sauvegarde thx @Neil
Pas encore clair sur l'arrondissement.Celui-ci tronque et c'est ok.Tester
la source
t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)
vous économise 2 octets, maisreduce
va un octet plus loin:t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
APL (Dyalog) ,
2421 octetsLes règles ont maintenant été clarifiées.
Demande l'heure en tant que liste à 3 éléments.
Modifier: mis à jour (
⌈
→⌊
) pour correspondre au nouveau résultat pour 10:33:06.Essayez-le en ligne!
⎕
demande de saisie60⊥
évaluer en base 60675÷⍨
diviser par 675512×
multiplier par 512⌊
sol(
…)⊤
Convertir (mnémonique: la base à l'envers est anti-base) le système numérique suivant:16/2
répliquer 2 seize fois (c'est-à-dire binaire 16 bits)la source
Q, 32 octets
Tester
Afin de réduire l'encombrement de l'affichage, je suppose une légère modification de l'expression originale, qui donne un nom
t
au lambdale suffixe b indique le binaire
Explication
REMARQUE: lire de gauche à droite, évaluer de droite à gauche
Lit comme: 48 baisse de la représentation binaire du plancher de 512 diviserb par 675 et multiplié par 60 scalarFromVector sur un entier transtypé à partir de divisions à ":" chaîne d'origine
Évaluation:
":"\:x
divise la chaîne x (argument implicite du lambda) au caractère ":" (Q utilise "" pour désigner le caractère)"I"$x
cast chaîne (s) x en int (s) -> heures, minutes, secondes60/:x
utilise la base 60 pour calculer une valeur unique à partir d'une séquence d'entiers -> secondes au total(512%675)*x
calcule le ratio512%675
(% est divisé) et multiplie les secondes. 512% 675 est la forme simplifiée de la fraction (totalSecondsPerDay% 64K)_ x
indique le plancher du flotteur x0b\:x
calcule la représentation binaire de x (64 bits)48_ x
déposer les 48 premiers bits, nous avons donc notre représentation 16 bitsExemple (x = "01:30:00"). NOTE.- "/" indique un commentaire à la fin de la ligne
":"\:"01:30:00" /-> ("01";"30";"00") "I"$ /-> 1 30 0 60/: /-> 5400 (512%675)* /-> 4096.0 _ /-> 4096 0b\: /-> 0000000000000000000000000000000000000000000000000001000000000000b 48_ /-> 0001000000000000b
la source
Rubis, 75 octets
J'ai l'impression qu'il doit y avoir une méthode plus courte pour convertir le temps en secondes, mais c'est tout ce à quoi je pouvais penser.
la source
Python, 45 octets
Je suis venu avec le
512/675
facteur moi-même, puis j'ai vu que d'autres faisaient de même.la source
C, 91 octets
la source
PHP,
474643 octetsUtilise le codage IBM-850.
Courez comme ceci:
Tweaks
$argn
la source