Escreva um programa ou função que, com dois números inteiros a, b, produza uma sequência contendo um número decimal que representa exatamente a fração a / b .
Se a / b for inteiro, basta gerar o valor, sem um ponto decimal ou zeros à esquerda:
123562375921304812375087183597 / 2777 -> 44494913907563850333124661
81 / 3 -> 27
-6 / 2 -> -3
Se a / b não for inteiro, mas tiver uma representação finita na base 10, imprima o valor sem zeros à esquerda ou à direita (exceto um único zero antes do ponto):
1 / 2 -> 0.5
3289323463 / -250000000 -> -13.157293852
Finalmente, se e somente se (então não 0.999...
) a / b não é um número inteiro e não possui uma representação finita, produza a parte finita seguida pela parte repetida entre parênteses. A parte repetida deve ser a menor possível e começar o mais cedo possível.
-1 / 3 -> -0.(3)
235 / 14 -> 16.7(857142)
123 / 321 -> 0.(38317757009345794392523364485981308411214953271028037)
355 / 113 -> 3.(1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168)
Seu programa deve funcionar para todos os exemplos acima em menos de 10 segundos em um PC de mesa moderno. O menor programa em bytes vence.
Respostas:
Perl 6 ,
63 5850 bytesTeste-o
Se você não se importa que ele funcione apenas com denominadores que se encaixam em um número inteiro de 64 bits, pode ser reduzido para apenas 43 bytes:
Expandido:
fonte
Python 2, 174 bytes
Não estou muito convencido sobre a validade dessa resposta, mas ela funcionou para os casos de teste acima e outros casos de teste que joguei para ela. Parece uma bagunça certa, então eu tenho certeza que há muito espaço para jogar golfe.
A configuração inicial usa valores absolutos de ambos os argumentos para garantir que estamos lidando com números não negativos (salvando o cálculo de sinal para mais tarde) e delega a parte quociente do resultado na aritmética de precisão arbitrária do Python. A parte fracionária é feita com o algoritmo da divisão da escola primária até obtermos uma repetição no restante. Em seguida, olhamos quando vimos essa repetição pela última vez para obter o período e construímos a sequência de acordo.
Observe que o algoritmo é realmente muito lento devido à
in
operação O (n) , mas é rápido o suficiente para os exemplos.fonte
Lote,
349344 bytesEditar: salvou 5 bytes removendo caracteres desnecessários. "Ungolfed":
fonte
set /a
.Java,
625605Código de golfe:
Nota: Conto a importação estática como parte da função para fins de golfe.
Esta função começa obtendo o resultado da divisão. Ele adiciona a parte integral e o sinal, se necessário. Então, se houver um restante, ele executa a divisão longa da base 10. Em cada etapa, execute a divisão. Armazene o dígito calculado e o restante em duas listas. Se encontrarmos o mesmo dígito e o restante novamente, haverá uma porção repetida e saberemos em que índice ele começa. O código adiciona os dígitos (sem repetição) ou os dígitos de pré-repetição e os dígitos repetidos entre parênteses.
Isso é um pouco grande principalmente por causa de
BigInteger
. Se as entradas não transbordarem, mesmolong
assim, poderá ser um pouco menor. Ainda assim, espero que haja maneiras de melhorar essa entrada.Código ungolfed com método principal de teste:
Saída do programa:
fonte
a, BigInteger
. Eu também acho que você poderia apelidoBigInteger.TEN
eBigInteger.ZERO
.while (true)
->for (;;)
que também me permitiram colocar coisas nofor
inicializador, economizando outro byte.BigInteger
no meu código e não vejo como a adição de mais código para reduzi-los a um único nome de classe de caractere será recompensada. E certamente adicionando código para lidar comint[]
(o que o BigInteger já faz internamente) apenas inchará a minha resposta.BigInteger
métodos que chamo para retornar uma instância da subclasse, precisarei adicionar vários elencos que aumentam ainda mais o código. Além dos bytes desperdiçados pela sobrecarga de uma subclasse, isso certamente aumentaria o tamanho do código.PHP, 277 bytes
fonte
Mathematica 198 bytes
UnGolfed
Testes
{"27", "-27", "0,25", "-4. (3)", "2. (714285)", "131572.93852", "16,7 (857142)", "94,6 (428571)"}
fonte