Frações decimais de golfe

15

Seu objetivo é escrever um código que produza a menor seqüência decimal exclusiva para a fração de entrada. Não há duas frações com o mesmo denominador que possam ter a mesma saída, embora seja possível que frações com denominadores diferentes tenham a mesma representação.

Tome 2 números inteiros como entrada, o primeiro é o numerador, o segundo é o denominador.

Por exemplo:

n  d   output
-----  ------
0 13:  0.00
1 13:  0.07
2 13:  0.1
3 13:  0.2
4 13:  0.30
5 13:  0.38

etc.

3/13é a única fração com um denominador 13 que começa com 0.2, portanto, não são necessários mais dígitos. 4/13e 5/13ambos começam com 0.3, portanto, é necessário outro dígito para distinguir entre eles.

Você pode emitir números maiores que -1 e menores que 1 com ou sem zero antes do ponto decimal, desde que a saída seja consistente, ou seja, 0.5e .5seja o mesmo número e ambos sejam válidos. Nenhum outro zeros à esquerda é permitido. Zeros à direita devem ser mostrados se forem necessários para distinguir a saída de outro valor.

Você não pode arredondar nenhum número para longe de zero; eles devem ser truncados. Não deve haver espaços à esquerda ou à direita. Opcionalmente, pode haver uma nova linha final à direita.

Mais valores de teste:

   n    d   output
----------  ------
   0    1:   0 (this 0 may not be removed because there's no decimal point)
   5    1:   5
   0    3:   0.0 (or .0)
   4    3:   1.3
   5    3:   1.6
  10    8:   1.2
  11    8:   1.3
  12    8:   1.5
-496  -38:  13.05
 458  -73:  -6.27
  70  106:   0.660 (or .660)
 255  123:   2.07
 256 -123:  -2.081
-257 -123:   2.089
-258  123:  -2.09
 258 -152:  -1.697
-259  152:  -1.70
 260  152:   1.710
 272  195:   1.39
 380  247:   1.538
 455 -455:  -1.000
 -44  891:  -0.049 (or -.049)
 123 1234:   0.099 (or .099)

Em cada caso, a saída e o denominador são suficientes para calcular exclusivamente o numerador.

CJ Dennis
fonte

Respostas:

1

Perl, 77 bytes

#!perl -p
$%++while/ /<grep{!index$_/$',$\=$`/$'.($`%$'?0:n).0 x$%&'?'x$%}$`-2..$`+2}{

Contando o shebang como um, a entrada é obtida de stdin.

Uso da amostra

$ echo 0 3 | perl golf-decimals.pl
0.0

$ echo 4 3 | perl golf-decimals.pl
1.3

$ echo 11 8 | perl golf-decimals.pl
1.3

$ echo -496 -38 | perl golf-decimals.pl
13.05

$ echo 458 -73 | perl golf-decimals.pl
-6.27

$ echo -44 891 | perl golf-decimals.pl
-0.049
primo
fonte
1

Pitão, 37 bytes

AQJ+`cGHK*20\0<Jf!}<JTm<+`dKTcRH,tGhG

Um programa que recebe entrada no formulário numerator,denominatore imprime o resultado.

Suíte de teste

[Explicação que vem depois]

TheBikingViking
fonte
1

JavaScript (ES7), 118 93 90 bytes

f=(a,b,i=0)=>(v=(p=n=>((n/b*10**i|0)/10**i).toFixed(i))(a))==p(a+1)|v==p(a-1)?f(a,b,i+1):v

Salvei 25 bytes, graças ao @Neil.
3 bytes adicionais salvos usando recursão.

Huntro
fonte
2
Você sempre passa /be ipara, passim você pode codificá-los dentro de psi e apenas pegar um único parâmetro. Além disso, a resposta é apenas npara que você não precise calculá-la novamente. Eu tenho uma versão recursiva ES6 vagamente baseado em isso em meros 86 bytes ...
Neil