高尔夫小数


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开头的分母为13的分数0.2,因此不需要其他数字。4/135/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)

在每种情况下,输出和分母足以唯一地计算分子。

Answers:


1

Perl,77个字节

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

将shebang视为一个,输入来自stdin。

样品用量

$ 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

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

感谢@Neil,我节省了25个字节。
通过使用递归节省了额外的3个字节。


2
您总是传递/bip因此您不妨在其内部进行编码,p而只需使用一个参数即可。答案也只是n这样,您不必再次计算。我有一个基于此的递归ES6版本,仅以86个字节为基础...
Neil
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.