Ułamki dziesiętne w golfa

15

Twoim celem jest napisanie kodu, który wyświetli najkrótszą unikalną sekwencję dziesiętną dla ułamka wejściowego. Żadne dwie ułamki o tym samym mianowniku mogą mieć tę samą moc wyjściową, chociaż możliwe jest, że ułamki o różnych mianownikach mają tę samą reprezentację.

Weź 2 liczby całkowite jako dane wejściowe, pierwszy to licznik, drugi to mianownik.

Na przykład:

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

itp.

3/13jest jedyną frakcją o mianowniku 13, która zaczyna się od 0.2, więc dalsze cyfry nie są wymagane. 4/13i 5/13oba zaczynają się od 0.3, więc do ich rozróżnienia potrzebna jest kolejna cyfra.

Możesz wypisywać liczby większe niż -1 i mniejsze niż 1 albo z zerem, albo bez zera przed kropką dziesiętną, o ile dane wyjściowe są spójne, tj. 0.5I .5są tej samej liczby i oba są poprawne. Żadne inne zera wiodące nie są dozwolone. Zera końcowe muszą być pokazane, jeśli są konieczne do odróżnienia wyniku od innej wartości.

Nie możesz zaokrąglać żadnych liczb od zera; muszą zostać obcięte. Nie może być żadnych spacji wiodących ani końcowych. Opcjonalnie może występować pojedynczy znak nowej linii.

Więcej wartości testowych:

   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)

W każdym przypadku dane wyjściowe i mianownik są wystarczające do jednoznacznego opracowania licznika.

CJ Dennis
źródło

Odpowiedzi:

1

Perl, 77 bajtów

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

Licząc shebang jako jeden, dane wejściowe są pobierane ze standardowego wejścia.

Przykładowe użycie

$ 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
źródło
1

Pyth, 37 bajtów

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

Program, który pobiera dane z formularza numerator,denominator i drukuje wynik.

Zestaw testowy

[Wyjaśnienie nastąpi później]

TheBikingViking
źródło
1

JavaScript (ES7), 118 93 90 bajtów

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

Zaoszczędziłem 25 bajtów dzięki @Neil.
Zaoszczędzono dodatkowe 3 bajty za pomocą rekurencji.

Huntro
źródło
2
Zawsze przechodzą /bi ido ptak równie dobrze można je kod wewnątrz psiebie i po prostu wziąć jeden parametr. Odpowiedź jest ntaka, że ​​nie musisz jej ponownie obliczać. Mam rekurencyjną wersję ES6 luźno opartą na tym przy zaledwie 86 bajtach ...
Neil