Tivemos alguns desafios para a conversão de base, mas todos parecem se aplicar a valores inteiros. Vamos fazer isso com números reais!
O desafio
Entradas:
- Um número positivo real x , expresso na base 10. Isso pode ser tomado como um flutuador de precisão dupla ou como uma string. Para evitar problemas de precisão, o número pode ser considerado maior que 10 −6 e menor que 10 15 .
- Uma base alvo b . Este será um número inteiro de 2 a 36.
- Um número de dígitos fracionários n . Este será um número inteiro de 1 a 20.
Saída: a representação de x na base b com n dígitos fracionários.
Ao calcular a expressão de saída, os dígitos além do n- ésimo devem ser truncados (não arredondados). Por exemplo, x = 3.141592653589793
em base b = 3
é 10.0102110122...
, portanto, para n = 3
a saída seria 10.010
(truncamento), não 10.011
(arredondamento).
Para x e b que produzem um número finito de dígitos na parte fracionária, a representação infinita equivalente (truncada em n dígitos) também é permitida. Por exemplo, 4.5
em decimal também pode ser representado como 4.49999...
.
Não se preocupe com erros de ponto flutuante .
Formato de entrada e saída
x será dado sem zeros à esquerda. Se x for um número inteiro, você pode assumir que ele será fornecido com uma parte decimal zero ( 3.0
) ou sem parte decimal ( 3
).
A saída é flexível. Por exemplo, pode ser:
- Uma sequência que representa o número com um separador adequado (ponto decimal) entre partes inteiras e fracionárias. Dígitos
11
,12
etc. (para b além de 10) podem ser representados como letrasA
,B
como de costume, ou como qualquer outro caractere distinto (especifique). - Uma sequência para a parte inteira e outra para a parte fracionária.
- Duas matrizes / listas, uma para cada parte, contendo números de
0
até35
como dígitos.
As únicas restrições são que as partes inteiras e fracionárias possam ser separadas (separador adequado) e usar o mesmo formato (por exemplo, não [5, 11]
para a lista que representa a parte inteira e ['5', 'B']
para a lista que representa a parte fracionária).
Regras adicionais
- Programas ou funções são permitidos, em qualquer linguagem de programação . As brechas padrão são proibidas.
- O menor código em bytes vence.
Casos de teste
Saída é mostrada como uma string com dígitos 0
, ..., 9
, A
, ..., Z
, utilizando .
como separador decimal.
x, b, n -> output(s)
4.5, 10, 5 -> 4.50000 or 4.49999
42, 13, 1 -> 33.0 or 32.C
3.141592653589793, 3, 8 -> 10.01021101
3.141592653589793, 5, 10 -> 3.0323221430
1.234, 16, 12 -> 1.3BE76C8B4395
10.5, 2, 8 -> 1010.10000000 or 1010.01111111
10.5, 3, 8 -> 101.11111111
6.5817645, 20, 10 -> 6.BCE2680000 or 6.BCE267JJJJ
0.367879441171442, 25, 10 -> 0.94N2MGH7G8
12944892982609, 29, 9 -> PPCGROCKS.000000000
fonte
42, 13, 1
podemos ter em33
vez de33.0
?n
dígitos decimaisRespostas:
Gelatina , 16 bytes
Experimente online!
Observe que os singletons são impressos como o elemento na saída.
fonte
JavaScript (ES8),
817471 bytesObras de
x
entre1e-6
e1e21
,b
a partir2
de36
(exatamente como necessário) en
a partir1
de qualquer coisa, desde10
que48
dependendo da base antes de ponto flutuante erros fluência em Edit:. Saved 7 bytes com a ajuda de @Birjolaxew. Salvou mais 3 bytes com a ajuda de @tsh. A versão anterior de 74 bytes também funcionava com números negativos:fonte
n
"dígitos" de uma string..toString(b)
... mePython 2 ,
153149144137 137135109 bytesNão havia notado que posso retornar os dígitos como números, o que torna muito mais simples. Retorna duas listas de dígitos, primeiro para a parte inteira, segundo para o fracionário.
Experimente online!
fonte
1e-6
(e menos do que1e15
, como antes)Perl 6 , 25 bytes
Tente
Expandido:
Observe que o espaço é analisado como
(+x).base(b,n)
não
+( x.base(b,n) )
.fonte
1e-6
(e menos do que1e15
, como antes)Mathematica, 158 bytes
Como esse desafio já obteve uma resposta muito boa no mathematica do @KellyLowder, tentei produzir (com uma abordagem diferente) os resultados exatos, como mostrado nos casos de teste
entrada
resultado
fonte
Ruby , 45 bytes
Por quê?
Como b ^ n na base b é 10 ^ n, multiplicamos x por esse número e adicionamos o ponto decimal ao qual ele pertence.
Experimente online!
fonte
.round
por.to_i
; isso corrige o último dígito da saída para aqueles em que não corresponde às saídas de teste. -1 byte a mais usando.insert ~n,?.
, sem parênteses.C (gcc) ,
157152 bytesPrecisa de 64 bits
long int
para que isso funcione com casos de teste maiores.-5 bytes graças a Peter Cordes
Experimente online!
edit: alguns bytes podem ser raspados se for permitido gerar duas strings separadas por um separador de nova linha:
149 bytes:
edit: esta submissão não é a mais longa, sim!
fonte
printf(z+r)
se não contiver nenhum%
caractere. (Isso é código-golfe; a segurança e as boas práticas aparecem pela janela: P). Você também pode usarputs(z+r)
para obter uma nova linha gratuitamente (salvando aputs("")
na segunda versão).float
é menor quedouble
, mas parece que a pergunta requer umadouble
entrada de string ou.long
e, de acordo com as regras do code-golf, é tudo o que você precisa para que sua resposta seja válida. (Além disso, é comum que as respostas de golfe em código C e C ++ assumam 64 bitslong
, já que é isso que o Try It Online usa.) Sugiro reverter sua edição e adicionar uma nota como "long
deve ser de 64 bits para isso para dar suporte a casos de teste maiores ".Mathematica 47 Bytes
Chamando
RealDigits
duas vezes para descobrir primeiro o número de dígitos à esquerda do decimal.fonte
1e-6
(e menos do que1e15
, como antes)TakeDrop@@RealDigits[##]
mas então percebi que tinha interpretado mal as coisas - sua solução parece ótima.SageMath , 68 bytes
Experimente online!
fonte
1e-6
(e menos do que1e15
, como antes)Haskell , 188 bytes
Experimente online!
g
converte um número em uma lista que representa esse número em uma determinada basez
mapeia números inteiros para letras (36 = .
)h
aplica as funções anteriores à parte inteira e fracionária de um número.fonte
Axioma, 566 bytes
foi particularmente difícil essa questão; depois de algum tempo escrevendo algo, os resultados certos parecem gerar usando uma macro para preservar dígitos () ... não é muito jogado ... resultados:
o alvo real é uma função que converte na base 2..36 cada flutuador [que possui k: = dígitos ()] ou cada número calculado como% pi ou% e ou a divisão de dois flutuantes / int como em 1./3 . [dígitos oo]
fonte
Axioma, 127 bytes
resultados
Tem um pequeno problema para o exemplo final zero
Retornaria '4.5' e não '4.50000'
fonte