Na representação decimal de todo número racional p/q
, você tem uma cauda periódica, uma cabeça não periódica e uma seção antes do ponto decimal no seguinte formato:
(before decimal point).(non-periodic)(periodic)
Alguns exemplos incluem:
1/70 = 0.0142857... = (0).(0)(142857)
10/7 = 1.428571... = (1).()(428571) ## no non-periodic part
1/13 = 0.076923... = (0).()(076923)
3/40 = 0.075 = (0).(075)() ## no periodic part
-2/15 = -0.13... = -(0).(1)(3) ## negative
75/38 = 1.9736842105263157894... = (1).(9)(736842105263157894)
## periodic part longer than float can handle
25/168 = 0.148809523... = (0).(148)(809523)
120/99 = 40/33 = 1.212121... = (1).()(21)
2/1 = 2 = (2).()() ## no periodic, no non-periodic
0/1 = 0 = (0).()()
0/2 = 0 = (0).()()
299/792 = 0.37752... = (0).(377)(52)
95/-14 = -6.7857142... = -(6).(7)(857142)
-95/-14 = 6.7857142... = (6).(7)(857142)
O desafio é trocar as partes periódicas e não periódicas, deixando before decimal point
sozinho, para criar um novo número. Por exemplo:
25/168 = 0.148809523... = (0).(148)(809523)
=> (0).(809523)(148) = 0.809523148148... = 870397/1080000
Se um número não possui parte periódica, como 0.25
transformar esse número em um novo número periódico, e vice-versa.
1/4 = 0.25 = (0).(25)() => (0).()(25) = 0.252525... = 25/99
4/9 = 0.444444... = (0).()(4) => (0).(4)() = 0.4 = 2/5
5/1 = 5 = (5).()() => (5).()() = 5 = 5/1
O desafio
- Tome uma fração
x
como entrada, como uma string, duas entradas, um número racional ou qualquer outro método adequado ao seu idioma. - Troque as partes periódicas e não periódicas da representação decimal de
x
para criar um novo número, deixando a parte antes do decimal sozinha. A parte periódica sempre começa o mais rápido possível, para que a parte não periódica seja o mais curta possível. Exemplos estão abaixo. - Retorne o número trocado como uma nova fração. A entrada não é necessariamente reduzida, embora a saída deva ser. É permitido que o formato de entrada seja diferente do formato de saída.
- O numerador
p
dex
será um número inteiro com valor absoluto de um milhão ou menos e o denominadorq
dex
será um número inteiro diferente de zero com valor absoluto de um milhão ou menos. - Não é garantido que o numerador
r
e o denominadors
do resultado sejam inferiores a um milhão. Dado o comprimento das partes periódicas desses números, é recomendável evitar a conversão direta em flutuadores. - Isso é código de golfe. A resposta mais curta em bytes vence.
Exemplos
1/70 = (0).(0)(142857) => (0).(142857)(0) = (0).(142857)() = 0.142857 = 142857/1000000
10/7 = (1).()(428571) => (1).(428571)() = 1.428571 = 1428571/1000000
1/13 = (0).()(076923) => (0).(076923)() = 0.076293 = 76923/1000000
3/40 = (0).(075)() => (0).()(075) = 0.075075... = 75/999 = 25/333
-2/15 = -(0).(1)(3) => -(0).(3)(1) = -0.311111... = -28/90 = -14/45
75/38 = (1).(9)(736842105263157894)
=> (1).(736842105263157894)(9) = (1).(736842105263157895)() ## since 0.999... = 1
= 1.736842105263157895 = 1736842105263157895/1000000000000000000
= 347368421052631579/200000000000000000
25/168 = (0).(148)(809523) => (0).(809523)(148) = 0.809523148148... = 870397/1080000
120/99 = (1).()(21) => (1).(21)() = 1.21 = 121/100
2/1 = (2).()() => (2).()() = 2 = 2/1
0/1 = (0).()() => (0).()() = 0 = 0/1
0/2 = (0).()() => (0).()() = 0 = 0/1
299/792 = (0).(377)(52) => (0).(52)(377) = 0.52377377... = 2093/3996
95/-14 = -(6).(7)(857142) => -(6).(857142)(7) = -6.857142777... = -12342857/1800000
-95/-14 = (6).(7)(857142) => (6).(857142)(7) = 6.857142777... = 12342857/1800000
code-golf
math
number
rational-numbers
Sherlock9
fonte
fonte
0
no final do caso de teste 2 (10/7
):1428571/100000
deveria ser1428571/1000000
.1/7
Pode ser representado como(0).()(142857)
ou(0).(1)(428571)
,1
pode ser representada como(1).()()
,(0).()(9)
,(0).()(99)
,(0).(9)(9)
, etcRespostas:
Python 2, 292 bytes
Versão ungolfed, funciona em python 2 e 3. Também imprime representação decimal.
fonte
d=10**len(p+a)
if n==0: p=''
, use``
em todos os lugares que você usarstr
, como em`n/d`
vez destr(n/d)
, e renomeielen
paraL
comL=len;
no início da função.n=int(b+p+a);d=10**L(p+a)
e vírgula: eimport fractions as f;g=f.gcd(n,d);return(n/g*s,d/g)
. Além disso, recebo 295 bytes para sua edição atual. Existe uma nova linha extra que você está esquecendo de deixar de fora?Geléia ,
1021018987838179787774 bytesIsso levou muito tempo para escrever, muito tempo para depurar e definitivamente precisa de muito golfe (
oito sete seiscincoquatro links, vaca sagrada), mas é, dentro do meu conhecimento, correto. Muito, muito obrigado a Dennis por sua ajuda aqui, especialmente com os dois primeiros links. Muito obrigado a Rainer P., pois acabei pegando emprestado muito do algoritmo na resposta em Python.Edições de golfe: -1 byte graças a Xanderhall. Correção de bug por não usar o NÃO lógico correto incorporado. -13 bytes de golfe nos links do numerador. +1 byte para corrigir um erro negativo,
d
graças a Dennis. Reestruturou os links para que a geração do numerador fique em um único link. -2 bytes da combinação do segundo e terceiro links. -4 bytes de mover alguns elementos comuns do terceiro e quarto links para o segundo e o link principal. -2 bytes da remoção de alguns operadores de cadeia supérfluos. -2 bytes de reorganizar o link do numerador. -1 byte da mudançaḢ€
para o final do segundo link. Corrigido um erro no link principal. -1 byte da alteraçãoṪ ... ,Ḣ
paraḢ ... ṭ
. -3 bytes de mover o link do numerador para o link principal.Sugestões de golfe são bem-vindas! Experimente online!
Explicação
Primeiro, explicarei o link principal , que chama os outros links.
Em seguida, o primeiro link que obtém os dígitos.
Agora, o segundo link que recebe as partes periódicas e não periódicas
n/d
e muitas outras atividades pesadas.O terceiro link , que produz nosso novo denominador.
fonte