¿Cuál es el tiempo binario?
Todos saben cuál es el tiempo normal. Está arriba en la esquina superior derecha (o donde sea que lo coloque) de su pantalla. Pero una pregunta que la gente rara vez se hace es: ¿Cuál es el tiempo binario ?
Tiempo binario
El tiempo binario (tiempo binario verdadero) funciona leyendo primero el bit más significativo (MSB) del número. Si ese número es 0
, el tiempo expresado es antes del mediodía. Si ese número es 1
, el tiempo expresado es después del mediodía. El siguiente bit divide la mitad del día el primer bit expresado en dos mitades más iguales, esta vez de 6 horas. El siguiente bit se divide en 3 horas, los siguientes 90 minutos, y así sucesivamente. Tiempos como 12:00:00
, donde parece que no debería ser ninguno, convertirse 1
.
Solo puedo entender este extraño sistema de sincronización, por lo que necesito un programa para convertirlo. Pero como los números binarios son Base-2 y 2 es un número pequeño, su programa debe ser lo más corto posible.
Requisitos
- Su programa debe tomar un tiempo (como 24 horas) como entrada y salida del número de tiempo binario correspondiente.
- El número de salida debe tener una precisión de 16 bits (el número debe tener 16 dígitos).
- No puede usar un generador incorporado que haga toda esa conversión por usted.
- Debe piso si necesita ser redondeado.
Reglas
Casos de prueba
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
Puntuación
Para ganar, como mencioné anteriormente, debe tener la menor cantidad de bytes.
Envíos
Para asegurarse de que su respuesta se muestre, comience con un título, usando la siguiente plantilla de Markdown:
# Language Name, N bytes
¿Dónde N
está el tamaño de su envío? Si mejora su puntaje, puede mantener los puntajes antiguos en el título, tachándolos. Por ejemplo:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Si desea incluir varios números en su encabezado (por ejemplo, porque su puntaje es la suma de dos archivos o desea enumerar las penalizaciones de la bandera del intérprete por separado), asegúrese de que el puntaje real sea el último número en el encabezado:
# Perl, 43 + 2 (-p flag) = 45 bytes
También puede hacer que el nombre del idioma sea un enlace que luego aparecerá en el fragmento de la tabla de clasificación:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Tabla de clasificación
Aquí hay un fragmento de pila para generar una tabla de clasificación regular y una descripción general de los ganadores por idioma.
/* 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]
? No nos gusta restringir el formato de entrada.09:57:30
hacer0110110000000000
?Respuestas:
MATL , 15 bytes
Utiliza una función incorporada para convertir una cadena que representa la hora en un número de fecha / hora en serie, lo cual está permitido por el desafío.
Pruébalo en línea!
Explicación
fuente
CJam, 20 bytes
Banco de pruebas.
Explicación
Hace uso del hecho de que 65536 (2 16 ) sobre 86400 (la cantidad de segundos en un día) se simplifica a 512 sobre 675.
fuente
Pyth,
3127 bytesBanco de pruebas.
Convierte la entrada en el número de segundos transcurridos, multiplica por un factor de
2^16 / 24*60*60
, y luego piso y convierte a binario de 16 bits.Guardado 4 bytes simplificando
65536/86400
en512/675
(estúpido).De entrada y salida
fuente
10:33:06
.TSQL (sqlserver 2012), 103 bytes
Pruébalo en línea
Sin golf
TSQL (sqlserver 2012),
119106bytesTambién incluía una versión diferente sin la variable @x, sin embargo, era unos pocos bytes más. Incluyendo la versión sin golf para aquellos interesados:
fuente
JavaScript (ES6), 72
76bytesEditar 4 bytes guardar thx @Neil
Todavía no está claro sobre el redondeo.Este se trunca y está bien.Prueba
fuente
t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)
le ahorra 2 bytes, peroreduce
va un byte más:t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
APL (Dyalog) ,
2421 bytesLas reglas ahora han sido aclaradas.
Solicita tiempo como lista de 3 elementos.
Editar: actualizado (
⌈
→⌊
) para que coincida con el nuevo resultado de 10:33:06.Pruébalo en línea!
⎕
solicitud de entrada60⊥
evaluar en base-60675÷⍨
dividir por 675512×
multiplicar por 512⌊
piso(
…)⊤
Convierta a (mnemónico: la base invertida es anti-base) el siguiente sistema de números:16/2
replicar 2 dieciseis veces (es decir, binario de 16 bits)fuente
Q, 32 bytes
Prueba
Para reducir el desorden de la pantalla, supongo una ligera modificación a la expresión original, que da nombre
t
a la lambdael sufijo b indica binario
Explicación
NOTA.- lee de izquierda a derecha, evalúa de derecha a izquierda
Se lee como: 48 caídas de la representación binaria del piso de 512 divideb por 675 y multiplicado por 60 scalarFromVector sobre el número entero emitido desde las divisiones en la cadena original ":"
Evaluación:
":"\:x
divide la cadena x (argumento implícito de la lambda) en el carácter ":" (Q usa "" para denotar char)"I"$x
emitir cadena (s) x a int (s) -> horas, minutos, segundos60/:x
utiliza la base 60 para calcular un solo valor a partir de una secuencia de entradas -> segundos en total(512%675)*x
calcula la relación512%675
(% es dividir) y multiplica los segundos. 512% 675 es la forma simplificada de la fracción (totalSecondsPerDay% 64K)_ x
indica piso de flotador x0b\:x
calcula la representación binaria de x (64 bits)48_ x
soltar los primeros 48 bits, por lo que tenemos nuestra representación de 16 bitsEjemplo (x = "01:30:00"). NOTA.- "/" indica comentario al final de la línea
":"\:"01:30:00" /-> ("01";"30";"00") "I"$ /-> 1 30 0 60/: /-> 5400 (512%675)* /-> 4096.0 _ /-> 4096 0b\: /-> 0000000000000000000000000000000000000000000000000001000000000000b 48_ /-> 0001000000000000b
fuente
Ruby, 75 bytes
Siento que debe haber un método más corto para convertir el tiempo en segundos, pero esto es todo lo que se me ocurre.
fuente
Python, 45 bytes
Se me ocurrió el
512/675
factor yo mismo, luego vi que otros lo hacían igual.fuente
C, 91 bytes
fuente
PHP,
474643 bytesUtiliza la codificación IBM-850.
Corre así:
Ajustes
$argn
fuente