Frazioni decimali golfate


15

Il tuo obiettivo è scrivere del codice che genererà la sequenza decimale univoca più breve per la frazione di input. Non esistono due frazioni con lo stesso denominatore che possono avere lo stesso output, sebbene sia possibile che le frazioni con denominatori diversi abbiano la stessa rappresentazione.

Prendi 2 numeri interi come input, il primo è il numeratore, il secondo è il denominatore.

Per esempio:

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

eccetera.

3/13è l'unica frazione con un denominatore di 13 che inizia con 0.2, quindi non sono necessarie ulteriori cifre. 4/13ed 5/13entrambi iniziano con 0.3, quindi è necessaria un'altra cifra per distinguerli.

È possibile generare numeri maggiori di -1 e minori di 1 con o senza zero prima del punto decimale, purché l'output sia coerente, ovvero 0.5e .5abbiano lo stesso numero e siano entrambi validi. Non sono consentiti altri zeri iniziali. Gli zeri finali devono essere visualizzati se sono necessari per distinguere l'output da un altro valore.

Non è possibile arrotondare alcun numero lontano da zero; devono essere troncati. Non ci devono essere spazi iniziali o finali. Opzionalmente può esserci una sola nuova riga finale.

Più valori di prova:

   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)

In ogni caso, l'output e il denominatore sono sufficienti per elaborare in modo univoco il numeratore.

Risposte:


1

Perl, 77 byte

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

Contando lo shebang come uno, l'input viene preso dallo stdin.

Esempio di utilizzo

$ 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

1

Pyth, 37 byte

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

Un programma che accetta input nel modulo numerator,denominatore stampa il risultato.

Suite di test

[Spiegazione che verrà dopo]


1

JavaScript (ES7), 118 93 90 byte

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

Ho salvato 25 byte, grazie a @Neil.
Ulteriori 3 byte salvati utilizzando la ricorsione.


2
È sempre passa /be ial pmodo si potrebbe anche loro codice all'interno di pse stessa e basta prendere un singolo parametro. Anche la risposta è solo nper non doverla calcolare di nuovo. Ho una versione ricorsiva ES6 liberamente basata su questa a soli 86 byte ...
Neil
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.