Dados dos números decimales arbitrariamente precisos 0 ≤ x < y ≤ 1, calcule el número binario más corto (en dígitos) b tal que x ≤ b < y .
Imprima los dígitos binarios de b después del punto binario como una matriz o una cadena de ceros y unos. Tenga en cuenta que la matriz vacía significa 0.0, en virtud de eliminar ceros finales. Esto también asegura que haya una respuesta correcta única para cualquier rango.
Si no está familiarizado con los números fraccionarios binarios, funcionan igual que los números decimales:
Base 10 0.625 = 0.6 + 0.02 + 0.005 = 6 x 10^-1 + 2 x 10^-2 + 5 x 10^-3
Base 2 0.101 = 0.1 + 0.00 + 0.001 = 1 x 2^-1 + 0 x 2^-2 + 1 x 2^-3
| | |
v v v
Base 10 0.625 = 0.5 + 0 + 0.125
Las incorporaciones que trivializan este problema no están permitidas.
Ejemplos:
0.0, 1.0 -> ""
0.1, 1.0 -> "1"
0.5, 0.6 -> "1"
0.4, 0.5 -> "0111"
El código más corto gana.
(0.98983459823945792125172638374187268447126843298479182647, 0.98983459823945792125172638374187268447126843298479182648)
? Además, los casos de prueba serían útiles.Respuestas:
CJam, 46
Pruébalo en línea
Explicación:
La idea general es: multiplique ambos números por 10 algún exponente lo suficientemente grande como para obtener enteros, multiplique nuevamente por 2 otro exponente lo suficientemente grande como para "dejar espacio" para los dígitos binarios en forma de enteros, dividir enteros por 10 el primer exponente , disminuir el números (para llegar al caso "x <b ≤ y") y convertir los resultados a la base 2. Encuentre el primer dígito diferente (será 0 en el primer número y 1 en el segundo número) e imprima todos los dígitos desde el segundo número hasta e incluido ese.
Antes de comenzar con las multiplicaciones, estoy agregando 3 a las partes enteras para asegurarme de que los resultados tengan el mismo número de dígitos binarios (sin ceros a la izquierda) después de disminuir. Al final, estoy omitiendo los primeros 2 dígitos binarios para compensar.
fuente
Rubí,
138132 bytes13 bytes agregados para la
-rbigdecimal
bandera. Espera entrada como dosBigDecimal
s.Ejecución de muestra:
Explicación:
fuente
Mathematica, 72 bytes
Explicación
El método consiste en encontrar el multiplicador de forma más pequeño
2^n
que amplíe la brecha entre dos números de entrada para que contenga un número entero.Por ejemplo,
16*{0.4,0.5} = {6.4,8.}
contiene7
, entonces la respuesta es7/16
.Caso de prueba
fuente
JavaScript (ES6), 144 bytes
Asume la entrada en el formulario
0.<digits>
(o1.<zeros>
es aceptable paray
).d
es una función que toma la parte decimal de un número y la duplica, luego recorta los ceros finales. El primer dígito debe estar presente pero se ignora. Convenientemented("0.0")
está vacío y, por lo tanto, esto se usa como prueba para ver six
es una fracción binaria exacta; en este casob
ya tiene el resultado. De lo contrario, hay una prueba algo complicada para determinar si el sufijo a1
tob
sirve para distinguir entrex
yy
; Si es así, se devuelve. De lo contrario, el MSB dex
tiene el sufijo del resultado y la función se llama a sí misma recursivamente para procesar el siguiente bit.Si en cambio deseamos que
x < b ≤ y
la función sea mucho más simple, algo como esto (no probado):fuente