Fracciones decimales golfizadas

15

Su objetivo es escribir un código que genere la secuencia decimal única más corta para la fracción de entrada. No hay dos fracciones con el mismo denominador pueden tener la misma salida, aunque es posible que las fracciones con diferentes denominadores tengan la misma representación.

Tome 2 enteros como entrada, el primero es el numerador, el segundo es el denominador.

P.ej:

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/13es la única fracción con un denominador de 13 que comienza con 0.2, por lo que no se requieren más dígitos. 4/13y 5/13ambos comienzan con 0.3, por lo que se requiere otro dígito para distinguirlos.

Puede generar números mayores que -1 y menores que 1 con o sin un cero antes del punto decimal, siempre que la salida sea consistente, es decir, 0.5y .5sean el mismo número y sean válidos. No se permiten otros ceros a la izquierda. Los ceros finales se deben mostrar si son necesarios para distinguir la salida de otro valor.

No puede redondear ningún número desde cero; deben ser truncados No debe haber espacios iniciales o finales. Opcionalmente, puede haber una nueva línea final.

Más valores de prueba:

   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)

En cada caso, la salida y el denominador son suficientes para resolver de forma única el numerador.

CJ Dennis
fuente

Respuestas:

1

Perl, 77 bytes

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

Contando el shebang como uno, la entrada se toma de stdin.

Uso de muestra

$ 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
fuente
1

Pyth, 37 bytes

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

Un programa que toma datos en el formulario numerator,denominatore imprime el resultado.

Banco de pruebas

[Explicación más tarde]

TheBikingViking
fuente
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

Ahorré 25 bytes, gracias a @Neil.
Se guardaron 3 bytes adicionales mediante el uso de recursividad.

Huntro
fuente
2
Siempre pasa /by ipara, pasí que también podría codificarlos dentro de psí mismo y simplemente tomar un solo parámetro. Además, la respuesta es solo npara que no tenga que calcularlo nuevamente. Tengo una versión recursiva de ES6 basada en esto en solo 86 bytes ...
Neil