Dezimalbrüche

15

Ihr Ziel ist es, Code zu schreiben, der die kürzeste eindeutige Dezimalsequenz für den eingegebenen Bruch ausgibt. Keine zwei Brüche mit demselben Nenner dürfen dieselbe Ausgabe haben, obwohl Brüche mit unterschiedlichen Nennern dieselbe Darstellung haben können.

Nehmen Sie 2 Ganzzahlen als Eingabe, die erste ist der Zähler, die zweite der Nenner.

Z.B:

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

etc.

3/13ist der einzige Bruch mit einem Nenner von 13, der mit beginnt 0.2, sodass keine weiteren Ziffern erforderlich sind. 4/13und 5/13beide beginnen mit 0.3, daher ist eine weitere Ziffer erforderlich, um zwischen ihnen zu unterscheiden.

Sie können Ausgangsnummern größer als -1 und weniger als 1 entweder mit oder ohne Null vor dem Komma, solange der Ausgang konsistent ist, dh 0.5und .5die gleiche Anzahl und sind beide gültig. Andere führende Nullen sind nicht zulässig. Nachgestellte Nullen müssen angezeigt werden, wenn sie erforderlich sind, um die Ausgabe von einem anderen Wert zu unterscheiden.

Sie dürfen keine Zahlen von Null abrunden. Sie müssen abgeschnitten werden. Es dürfen keine führenden oder nachfolgenden Leerzeichen vorhanden sein. Optional kann eine einzelne nachgestellte Zeile eingefügt werden.

Weitere Testwerte:

   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 jedem Fall reichen die Ausgabe und der Nenner aus, um den Zähler eindeutig zu berechnen.

CJ Dennis
quelle

Antworten:

1

Perl, 77 Bytes

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

Zählt man den Shebang als einen, wird die Eingabe von stdin übernommen.

Beispielnutzung

$ 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
quelle
1

Pyth, 37 Bytes

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

Ein Programm, das Eingaben in das Formular übernimmt numerator,denominator und das Ergebnis druckt.

Testsuite

[Erklärung kommt später]

TheBikingViking
quelle
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

Ich habe 25 Bytes gespart, dank @Neil.
Weitere 3 Bytes durch Rekursion gespeichert.

Huntro
quelle
2
Sie übergeben /bund übergeben immer i, psodass Sie sie genauso gut in sich pselbst codieren und nur einen einzigen Parameter verwenden können. Außerdem ist die Antwort nur nso, dass Sie sie nicht erneut berechnen müssen. Ich habe eine rekursive ES6-Version, die lose auf dieser mit nur 86 Bytes basiert ...
Neil