ゴルフ小数


15

あなたの目標は、入力分数に対して最短の一意の10進数シーケンスを出力するコードを記述することです。同じ分母を持つ2つの分数が同じ出力を持つことはありませんが、異なる分母を持つ分数が同じ表現を持つことは可能です。

入力として2つの整数を取ります。1つ目は分子、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)

いずれの場合も、分子を一意に計算するには出力と分母で十分です。

回答:


1

Perl、77バイト

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

シバンを1つとしてカウントすると、入力は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
あなたは常に合格/biするpかもしれないあなたはとてもだけでなく内部のコードそれらをp自分自身だけの単一のパラメータを取ります。また、答えはちょうどnあなたがそれを再び計算する必要がないようにです。私は...緩く単なる86バイトで、これに基づいて再帰ES6のバージョンを持っている
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.