Dado dois números decimais arbitrariamente precisos 0 ≤ x < y ≤ 1, calcule o número binário mais curto (em dígitos) b de modo que x ≤ b < y .
Emita os dígitos binários de b após o ponto binário como uma matriz ou uma sequência de zeros e uns. Observe que a matriz vazia significa 0,0, devido à exclusão de zeros à direita. Isso também garante que haja uma resposta correta exclusiva para qualquer intervalo.
Se você não estiver familiarizado com números fracionários binários, eles funcionam como números decimais:
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
Os internos que trivializam esse problema não são permitidos.
Exemplos:
0.0, 1.0 -> ""
0.1, 1.0 -> "1"
0.5, 0.6 -> "1"
0.4, 0.5 -> "0111"
O menor código vence.
(0.98983459823945792125172638374187268447126843298479182647, 0.98983459823945792125172638374187268447126843298479182648)
? Além disso, os casos de teste seriam úteis.Respostas:
CJam, 46
Experimente online
Explicação:
A idéia geral é: multiplique os dois números por 10 algum expoente grande o suficiente para obter números inteiros, multiplique novamente por 2 outro expoente grande o suficiente para "criar espaço" para dígitos binários em forma de número inteiro, divida-o novamente por 10 o primeiro expoente , diminua o números (para chegar ao caso "x <b ≤ y") e converter os resultados na base 2. Encontre o primeiro dígito diferente (será 0 no primeiro número e 1 no segundo número) e imprima todos os dígitos do segundo número até e incluindo esse.
Antes de começar com as multiplicações, estou adicionando 3 às partes inteiras para garantir que os resultados tenham o mesmo número de dígitos binários (sem zeros à esquerda) após decrementar. No final, estou pulando os 2 primeiros dígitos binários para compensar.
fonte
Ruby,
138132 bytes13 bytes adicionados para o
-rbigdecimal
sinalizador. Espera entrada como doisBigDecimal
s.Exemplo de execução:
Explicação:
fonte
Mathematica, 72 bytes
Explicação
O método é encontrar o menor multiplicador de forma
2^n
que amplia o intervalo entre dois números de entrada, para que ele contenha um número inteiro.Por exemplo,
16*{0.4,0.5} = {6.4,8.}
contém7
, então a resposta é7/16
.Caso de teste
fonte
JavaScript (ES6), 144 bytes
Assume a entrada no formulário
0.<digits>
(ou1.<zeros>
é aceitável paray
).d
é uma função que pega a parte decimal de um número e a dobra e apara os zeros à direita. O dígito inicial deve estar presente, mas é ignorado. Convenientemented("0.0")
está vazio e, portanto, é usado como teste para verificar sex
é uma fração binária exata; neste caso,b
já mantém o resultado. Caso contrário, há um teste um pouco complicado para determinar se o sufixo a1
ab
serve para distinguir entrex
ey
; se sim, isso é retornado. Caso contrário, o MSB dex
é sufixado no resultado e a função se chama recursivamente para processar o próximo bit.Se, em vez disso, desejamos que
x < b ≤ y
a função seja muito mais simples, algo como isto (não testado):fonte