Escriba un programa o función que tenga dos enteros a, b emite una cadena que contiene un número decimal que representa exactamente la fracción a / b .
Si a / b es entero, simplemente envíe el valor, sin un punto decimal o ceros a la izquierda:
123562375921304812375087183597 / 2777 -> 44494913907563850333124661
81 / 3 -> 27
-6 / 2 -> -3
Si a / b no es entero pero tiene una representación finita en la base 10, muestre el valor sin ceros iniciales o finales (excepto un cero simple antes del punto):
1 / 2 -> 0.5
3289323463 / -250000000 -> -13.157293852
Finalmente, si y solo si (entonces no 0.999...
) a / b no es entero y no tiene una representación finita, envíe la parte finita seguida de la parte repetida entre paréntesis. La parte que se repite debe ser lo más pequeña posible y comenzar lo antes posible.
-1 / 3 -> -0.(3)
235 / 14 -> 16.7(857142)
123 / 321 -> 0.(38317757009345794392523364485981308411214953271028037)
355 / 113 -> 3.(1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168)
Su programa debe funcionar para todos los ejemplos anteriores en menos de 10 segundos en una PC de escritorio moderna. El programa más pequeño en bytes gana.
Respuestas:
Perl 6 ,
63 5850 bytesPruébalo
Si no le importa que solo funcione con denominadores que se ajusten a un entero de 64 bits, puede acortarse a solo 43 bytes:
Expandido:
fuente
Python 2, 174 bytes
No estoy muy convencido de la validez de esta respuesta, pero funcionó para los casos de prueba anteriores y otros casos de prueba que le he presentado. Sin embargo, parece un desastre, así que estoy seguro de que hay mucho espacio para jugar al golf.
La configuración inicial toma valores absolutos de ambos argumentos para garantizar que estamos tratando con números no negativos (guardando el cálculo del signo para más adelante), y delega la parte del cociente del resultado en la aritmética de precisión arbitraria de Python. La parte fraccionaria se realiza con el algoritmo de división de la escuela primaria hasta que obtengamos una repetición en el resto. Luego miramos hacia arriba cuando vimos esta repetición por última vez para obtener el período, y construimos la cadena en consecuencia.
Tenga en cuenta que el algoritmo en realidad es bastante lento debido a la
in
operación O (n) , pero es lo suficientemente rápido para los ejemplos.fuente
Lote,
349344bytesEditar: guardado 5 bytes eliminando caracteres innecesarios. "Sin golf":
fuente
set /a
.Java,
625605Código de golf:
Nota: Cuento la importación estática como parte de la función para fines de golf.
Esta función comienza obteniendo el resultado de la división. Agrega la parte integral y el signo, si es necesario. Luego, si hay un resto, realiza una división larga de base 10. En cada paso, realiza la división. Almacene el dígito calculado y el resto en dos listas. Si nos encontramos con el mismo dígito y el resto nuevamente, hay una porción repetida y sabemos en qué índice comienza. El código agrega los dígitos (sin repetición) o los dígitos de repetición previa, luego los dígitos repetidos encerrados entre paréntesis.
Esto es un poco grande principalmente debido a
BigInteger
. Si las entradas no se desbordan ni siquiera a,long
entonces podría ser un poco más corto. Aún así, espero que haya formas de mejorar esta entrada.Código no protegido con método principal para probar:
Salida del programa:
fuente
a, BigInteger
. También creo que podrías aliasBigInteger.TEN
yBigInteger.ZERO
.while (true)
->for (;;)
que también me permitió poner cosas en elfor
inicializador, guardando otro byte.BigInteger
en mi código, y no veo cómo valdrá la pena agregar más código para reducirlos a un solo nombre de clase de caracteres. Y ciertamente agregar código para tratarint[]
(lo que BigInteger ya hace internamente) solo aumentará mi respuesta.BigInteger
métodos que llamo para devolver una instancia de la subclase, necesitaré agregar varios lanzamientos que inflarán aún más el código. Además de los bytes desperdiciados para la sobrecarga de una subclase, eso ciertamente aumentaría el tamaño del código.PHP, 277 bytes
fuente
Mathematica 198 bytes
Sin golf
Pruebas
{"27", "-27", "0.25", "-4. (3)", "2. (714285)", "131572.93852", "16.7 (857142)", "94.6 (428571)"}
fuente