Гольф десятичные дроби

15

Ваша цель - написать код, который будет выводить самую короткую уникальную десятичную последовательность для входной дроби. Никакие две дроби с одинаковым знаменателем не могут иметь одинаковый выходной результат, хотя дроби с разными знаменателями могут иметь одинаковое представление.

Возьмите 2 целых числа в качестве входных данных, первое - числитель, второе - знаменатель.

Например:

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

и т.п.

3/13это единственная дробь со знаменателем 13, которая начинается с 0.2, поэтому никаких дополнительных цифр не требуется. 4/13и 5/13оба начинаются с 0.3, поэтому требуется другая цифра, чтобы различать их.

Вы можете выводить чисел больше -1 и меньше , чем 1 с или без нуля до десятичной точки, до тех пор , как выход последовательно, то есть 0.5и .5тот же число и являются действительными. Другие ведущие нули не допускаются. Конечные нули должны быть показаны, если они необходимы, чтобы отличить выходное значение от другого значения.

Вы не можете округлять любые числа от нуля; они должны быть усечены. Не должно быть начальных или конечных пробелов. При желании может быть один завершающий символ новой строки.

Больше тестовых значений:

   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)

В каждом случае выход и знаменатель достаточны для однозначной работы числителя.

CJ Деннис
источник

Ответы:

1

Perl, 77 байт

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

Считая Шебанг как единое, ввод берется из стандартного ввода.

Образец использования

$ 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 байт

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

Программа, которая принимает данные в форме numerator,denominatorи печатает результат.

Тестирование

[Объяснение будет позже]

TheBikingViking
источник
1

JavaScript (ES7), 118 93 90 байт

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

Я спас 25 байтов, благодаря @Neil.
Сохранены дополнительные 3 байта с помощью рекурсии.

Huntro
источник
2
Вы всегда проходят /bи iк pтак что вы могли бы также код их внутри pсебя и просто взять один параметр. Кроме того, ответ только для того, nчтобы вам не пришлось рассчитывать его снова. У меня есть рекурсивная версия ES6, свободно основанная на этом, всего 86 байтов ...
Нил