¿Cuál es el tiempo binario?

14

¿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 Nestá 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.

George Gibson
fuente
3
¿Puedo ingresar como [hour, minute, second]? No nos gusta restringir el formato de entrada.
Leaky Nun
2
¿Cómo 09:57:30hacer 0110110000000000?
Leaky Nun
2
16 bits solo pueden representar 65536 valores. Hay 86400 segundos en un día. ¿Cómo debemos representar algo que no coincide exactamente con una representación binaria?
PurkkaKoodari
¿Podemos devolver el resultado como una lista de 16 números?
Adám
@ Adám Sí, puedes.
George Gibson

Respuestas:

1

MATL , 15 bytes

YOtk-KWW*k16&YB

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

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
Luis Mendo
fuente
5

CJam, 20 bytes

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

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.

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.
Martin Ender
fuente
3

Pyth, 31 27 bytes

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

Banco 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/86400en 512/675(estúpido).

De entrada y salida

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
Monja permeable
fuente
¿Puedes justificar " y luego piso "?
Peter Taylor
@PeterTaylor ¿Qué debo hacer en su lugar?
Leaky Nun
44
Espere hasta que la especificación haya sido desambiguada antes de publicar una respuesta.
Peter Taylor
@PeterTaylor La forma correcta de redondeo es evidente por 10:33:06.
Adám
@ Adám, en realidad no, porque eso da el mismo resultado con piso y redondeado al más cercano.
Peter Taylor
3

TSQL (sqlserver 2012), 103 bytes

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

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

Pruébalo en línea

Sin golf

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), 119106 bytes

Tambié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:

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 @
t-clausen.dk
fuente
Eso no parece golfista. ¿No puedes eliminar mucho espacio en blanco?
Adám
@ Adám es muy divertido, utilicé métodos diferentes al estándar para acortar el script e incluso probé un método diferente. Acabo de poner un espacio en blanco accidental al copiar mi respuesta en codegolf (solo un extra). Quería poner un salto de línea allí, pero decidí ponerlo después de MIENTRAS en cambio. Eliminando el espacio y preguntándome si realmente me rechazaste por ese espacio extra único
t-clausen.dk
@ Adám y si estás viendo el segundo método, no es golf (excepto el recuento de caracteres), ya que no es mi respuesta real. Solo un método diferente y más calculador para resolverlo
t-clausen.dk
3
No, no voté en contra. Probablemente fue alguien que tiene el principio de rechazar todas las respuestas que se publican antes de que el OP aclare las preguntas de reglas pendientes. Todos menos la respuesta más reciente tienen exactamente un voto negativo. (Probablemente fue Peter Taylor, porque fue el último aquí justo antes de esa publicación, y se ha estado quejando de esto). Puedes ver esto cuando tienes suficiente reputación. Aquí, ¡toma un poco!
Adám
2

JavaScript (ES6), 72 76 bytes

Editar 4 bytes guardar thx @Neil

Todavía no está claro sobre el redondeo. Este se trunca y está bien.

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

Prueba

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>

edc65
fuente
Estoy tratando de averiguar por qué esto se downvoted
t-clausen.dk
t=>([h,m,s]=t.split`:`,(+h+m/60+s/3600)*8192/3|65536).toString(2).slice(1)le ahorra 2 bytes, pero reduceva un byte más:t=>(t.split`:`.reduce((n,m)=>+m+n*60)*512/675|65536).toString(2).slice(1)
Neil
El voto a favor sin comentario no es bueno, votó a favor
t-clausen.dk
@Neil muchas gracias! Y con .map 1 byte más guardado
edc65
Huh, me preguntaba de dónde ibas a obtener el 0 para el mapa ...
Neil
1

APL (Dyalog) , 24 21 bytes

Las reglas ahora han sido aclaradas.

Solicita tiempo como lista de 3 elementos.

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

Editar: actualizado ( ) para que coincida con el nuevo resultado de 10:33:06.

Pruébalo en línea!

 solicitud de entrada

60⊥ evaluar en base-60

675÷⍨ dividir por 675

512× 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)   

Adán
fuente
0

Q, 32 bytes

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

Prueba

   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
  • Para reducir el desorden de la pantalla, supongo una ligera modificación a la expresión original, que da nombre t a la lambda

  • el 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, segundos

60/: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ón 512%675(% es dividir) y multiplica los segundos. 512% 675 es la forma simplificada de la fracción (totalSecondsPerDay% 64K)

_ x indica piso de flotador x

0b\: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 bits

Ejemplo (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

J. Sendra
fuente
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'

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.

mrwillihog
fuente
0

Python, 45 bytes

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

Se me ocurrió el 512/675factor yo mismo, luego vi que otros lo hacían igual.

Karl Napf
fuente
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++;}
Coates
fuente
0

PHP, 47 46 43 bytes

Utiliza la codificación IBM-850.

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

Corre así:

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

Ajustes

  • Guardado un byte utilizando la codificación IBM-850.
  • Guardado 3 bytes usando $argn
aross
fuente