Todos sabemos que sempre que um número racional é escrito em decimal, o resultado é finalizado ou (eventualmente) periódico. Por exemplo, quando 41/42 é escrito em decimal, o resultado é
0.9 761904 761904 761904 761904 761904 761904 761904 ...
com uma sequência inicial de dígitos 0.9
seguida pela sequência 761904
repetida várias vezes. (Uma notação conveniente para isso é 0.9(761904)
onde os parênteses cercam o bloco de dígitos repetidos.)
Seu objetivo neste desafio é pegar um número racional positivo, excluir o primeiro dígito que faz parte da sequência de repetição e retornar o número racional resultante. Por exemplo, se fizermos isso para 41/42, obtemos
0.9 61904 761904 761904 761904 761904 761904 761904 ...
ou 0.9(619047)
abreviado, que é 101/105.
Se o número racional tiver uma expansão decimal final, como 1/4 = 0.25
, nada deve acontecer. Você pode pensar em 1/4 como 0.250000000...
ou como, 0.249999999...
mas em ambos os casos, a exclusão do primeiro dígito da parte repetida deixa o número inalterado.
Detalhes
- A entrada é um número racional positivo, como um par de números inteiros positivos, representando o numerador e o denominador, ou (se o seu idioma de escolha permitir e você desejar) como algum tipo de objeto de número racional.
- A saída também é um número racional, também em qualquer forma. Se o resultado for um número inteiro, você poderá retornar o número inteiro em vez de um número racional.
- Se você usar um par de números como entrada, pode assumir que eles são relativamente primos; se estiver produzindo um par de números como saída, você deve torná-los relativamente primos.
- Cuidado para encontrar o primeiro dígito que inicia um bloco repetitivo. Por exemplo, alguém poderia escrever 41/42 como
0.97(619047)
mas isso não torna 2041/2100 (com expansão decimal0.97(190476)
) uma resposta válida. - Você pode supor que, na entrada obtida, o primeiro dígito periódico esteja após o ponto decimal, tornando
120/11
=10.909090909...
entrada inválida: (seu primeiro dígito periódico pode ser considerado0
como entrada10
). Você pode fazer o que quiser com essas informações. - Este é o código-golfe : a solução mais curta vence.
Casos de teste
41/42 => 101/105
101/105 => 193/210
193/210 => 104/105
104/105 => 19/21
1/3 => 1/3
1/4 => 1/4
2017/1 => 2017/1
1/7 => 3/7
1/26 => 11/130
1234/9999 => 2341/9999
fonte
2017
vez de2017/1
?(2017,1)
.)2/4
acontecer na entrada?120/11
a resposta correta111/11
ou210/11
?111/11
exceto que a resposta mais votada no momento retorna210/11
, então vou deixar você escolher para evitar a invalidação das respostas existentes.Respostas:
Wolfram Language (Mathematica) , 59 bytes
Experimente online!
Explicação
Encontre os dígitos decimais da entrada.
Se houver dígitos repetidos,
RotateLeft
eles. (List@@#
impede que o código tente girar o último dígito decimal se o número racional estiver terminando).Converta para racional.
fonte
Geléia ,
36323130 bytes-1 byte graças a Erik, o Outgolfer !
Experimente online!
Deve estar correto. Imprecisão de ponto flutuante adiciona 3 bytes para
+.Ḟ
.Depende da entrada ser irredutível.
Explicação
Isso depende de:
n/d
na sua forma mais simples. Em seguida, o linkọ2,5Ṁ
aplicadod
fornecerá o número de dígitos não periódicos após o ponto de raiz.fonte
Python 2 ,
237235214 bytes-21 bytes graças ao Sr. Xcoder
Experimente online!
A entrada é feita como uma tupla
(numerator, denominator)
; output é umfractions.Fraction
objeto.Ele usa um método no estilo de divisão longa para obter os dígitos inicial e repetitivo da resposta, depois move o primeiro dígito repetitivo para o final e usa a manipulação de strings e
fraction.Fraction
para convertê-lo novamente em uma proporção.Versão não destruída:
fonte
Python 3 ,
177173169 bytesExperimente online!
fonte
Wolfram Language (Mathematica) ,
7067 bytesGraças a esta dica (agora excluída) por -3 bytes!
Experimente online!
Uma porta da minha resposta Jelly . Mais do que a resposta existente do Mathematica em 8 bytes ...
A função aceita 2 entradas
[denominator, numerator]
, de modo queGCD[denominator, numerator] == 1
.fonte
Perl 6 , 102 bytes
Tente
Pega um número Rational e retorna um número Rational ou Int .
Expandido:
Nota manipulará denominadores até,
uint64.Range.max
para manipular denominadores maiores, useFatRat(9 x$1.chars)
Experimente .fonte