Hemos tenido algunos desafíos para la conversión de bases, pero todos parecen aplicarse a valores enteros. ¡Hagámoslo con números reales!
El reto
Entradas:
- Un número positivo real x , expresado en la base 10. Esto puede tomarse como un flotante de doble precisión o como una cadena. Para evitar problemas de precisión, se puede suponer que el número es mayor que 10 −6 y menor que 10 15 .
- Una base objetivo b . Este será un número entero de 2 a 36.
- Un número de dígitos fraccionarios n . Este será un entero del 1 al 20.
Salida: la representación de x en la base b con n dígitos fraccionarios.
Al calcular la expresión de salida, los dígitos más allá de la n -ésima se deben truncar (no redondear). Por ejemplo, x = 3.141592653589793
en base b = 3
es 10.0102110122...
, por lo que para n = 3
la salida sería 10.010
(truncamiento), no 10.011
(redondeo).
Para x y b que producen un número finito de dígitos en la parte fraccional, también se permite la representación infinita equivalente (truncada en n dígitos). Por ejemplo, 4.5
en decimal también se puede representar como 4.49999...
.
No te preocupes por los errores de coma flotante .
Formato de entrada y salida.
x se dará sin ceros a la izquierda. Si x resulta ser un número entero, puede suponer que se dará con una parte decimal cero ( 3.0
) o sin una parte decimal ( 3
).
La salida es flexible. Por ejemplo, puede ser:
- Una cadena que representa el número con un separador adecuado (punto decimal) entre partes enteras y fraccionarias. Los dígitos
11
,12
etc. (para b más allá de 10) se pueden representar como letrasA
,B
como de costumbre, o como cualquier otro carácter distinto (especifique). - Una cadena para la parte entera y otra cadena para la parte fraccionaria.
- Dos matrices / listas, una para cada parte, que contienen números de
0
a35
como dígitos.
Las únicas restricciones son que las partes enteras y fraccionarias pueden separarse (separador adecuado) y usar el mismo formato (por ejemplo, no [5, 11]
para la lista que representa la parte entera y ['5', 'B']
para la lista que representa la parte fraccionaria).
Reglas adicionales
- Se permiten programas o funciones , en cualquier lenguaje de programación . Las lagunas estándar están prohibidas.
- El código más corto en bytes gana.
Casos de prueba
Salida se muestra como una cadena con dígitos 0
, ..., 9
, A
, ..., Z
, usando .
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
fuente
42, 13, 1
podemos tener en33
lugar de33.0
?n
dígitos decimalesRespuestas:
Jalea , 16 bytes
Pruébalo en línea!
Tenga en cuenta que los singletons se imprimen como el elemento en la salida.
fuente
JavaScript (ES8),
817471 bytesFunciona
x
entre1e-6
y1e21
,b
desde2
hasta36
(exactamente como se requiere) yn
desde1
cualquier cosa desde10
hasta48
dependiendo de la base antes de que los errores de punto flotante entren. Editar: Guardado 7 bytes con ayuda de @Birjolaxew. Se guardaron otros 3 bytes con la ayuda de @tsh. La versión anterior de 74 bytes también funcionaba con números negativos:fuente
n
"dígitos" de una cadena..toString(b)
... tonto> _ <Python 2 ,
153149144137135109 bytesNo me había dado cuenta de que puedo devolver los dígitos como números, por lo que es mucho más simple. Devuelve dos listas de dígitos, primero para la parte entera, segundo para la fracción.
Pruébalo en línea!
fuente
1e-6
(y menores que1e15
, como antes)Perl 6 , 25 bytes
Intentalo
Expandido:
Tenga en cuenta que el espacio es para que se analice como
(+x).base(b,n)
no
+( x.base(b,n) )
.fuente
1e-6
(y menores que1e15
, como antes)Mathematica, 158 bytes
Dado que este desafío ya obtuvo una respuesta muy buena en matemáticas por @KellyLowder, traté de producir (con un enfoque diferente) los resultados exactos como se muestra en los casos de prueba
entrada
salida
fuente
Ruby , 45 bytes
¿Por qué?
Como b ^ n en la base b es 10 ^ n, multiplicamos x por ese número y luego sumamos el punto decimal al que pertenece.
Pruébalo en línea!
fuente
.round
con.to_i
; Esto corrige el último dígito de la salida para aquellos en los que no coincide con las salidas de prueba. -1 byte más usando.insert ~n,?.
, sin paréntesis.C (gcc) ,
157152 bytesNecesita 64 bits
long int
para que esto funcione con casos de prueba más grandes.-5 bytes gracias a Peter Cordes
Pruébalo en línea!
editar: se pueden eliminar algunos bytes si se permite que salgan dos cadenas separadas por un separador de nueva línea:
149 bytes:
editar: esta presentación no es la más larga, ¡yay!
fuente
printf(z+r)
si no contiene ningún%
carácter. (Esto es código golf; la seguridad y las buenas prácticas salen por la ventana: P). También puede usarputs(z+r)
para obtener una nueva línea de forma gratuita (guardandoputs("")
en la segunda versión).float
es más corto quedouble
, pero parece que la pregunta requiere unadouble
entrada de cadena o.long
, y de acuerdo con las reglas de código de golf, eso es todo lo que necesita para que su respuesta sea válida. (Además, es común que las respuestas de golf de código C y C ++ asuman 64 bitslong
, ya que eso es lo que utiliza Try It Online). Sugeriría revertir su edición, y simplemente agregar una nota como "long
debe ser de 64 bits para esto para apoyar los casos de prueba más grandes ".Mathematica 47 Bytes
Llamar
RealDigits
dos veces para averiguar primero el número de dígitos a la izquierda del decimal.fuente
1e-6
(y menores que1e15
, como antes)TakeDrop@@RealDigits[##]
y luego me di cuenta de que había leído mal las cosas: su solución parece óptima.SageMath , 68 bytes
Pruébalo en línea!
fuente
1e-6
(y menores que1e15
, como antes)Haskell , 188 bytes
Pruébalo en línea!
g
convierte un número en una lista que representa ese número en una base dadaz
asigna enteros a letras (36 = .
)h
aplica las funciones anteriores al número entero y la parte fraccionaria de un número.fuente
Axioma, 566 bytes
fue particularmente difícil esta pregunta; después de algún tiempo en escribir algo, los resultados correctos que parece generar usando una macro para preservar dígitos () ... no se juega demasiado al golf ... resultados:
el objetivo real es una función que convierte a base 2..36 cada Float [que tiene k: = dígitos ()] o cada número calculado como% pi o% e o la división de dos float / int como en 1./3 . ['oo' dígitos]
fuente
Axioma, 127 bytes
resultados
Tiene un pequeño problema para el ejemplo final cero
Devuelve '4.5' y no '4.50000'
fuente