Pecahan desimal golf

15

Tujuan Anda adalah menulis beberapa kode yang akan menghasilkan urutan desimal unik terpendek untuk fraksi input. Tidak ada dua pecahan dengan penyebut yang sama dapat memiliki output yang sama, meskipun mungkin pecahan dengan penyebut yang berbeda memiliki representasi yang sama.

Ambil 2 bilangan bulat sebagai input, yang pertama adalah pembilang, yang kedua adalah penyebut.

Misalnya:

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

dll.

3/13adalah satu-satunya fraksi dengan penyebut 13 yang dimulai dengan 0.2, jadi tidak diperlukan digit lebih lanjut. 4/13dan 5/13keduanya dimulai dengan 0.3, jadi digit lain diperlukan untuk membedakannya.

Anda dapat menampilkan angka lebih besar dari -1 dan kurang dari 1 baik dengan atau tanpa nol sebelum titik desimal, selama output konsisten, yaitu 0.5dan .5adalah angka yang sama dan keduanya valid. Tidak ada nol terkemuka lainnya yang diizinkan. Nol trailing harus ditunjukkan jika mereka perlu untuk membedakan output dari nilai lain.

Anda tidak boleh membulatkan angka apa pun dari nol; mereka harus dipotong. Tidak boleh ada ruang depan atau belakang. Secara opsional mungkin ada satu baris tambahan.

Nilai tes lainnya:

   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)

Dalam setiap kasus, output dan penyebutnya cukup untuk bekerja secara unik pembilangnya.

CJ Dennis
sumber

Jawaban:

1

Perl, 77 byte

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

Menghitung shebang sebagai satu, input diambil dari stdin.

Contoh Penggunaan

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

Pyth, 37 byte

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

Program yang mengambil input dalam bentuk numerator,denominatordan mencetak hasilnya.

Suite uji

[Penjelasan datang nanti]

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

Saya menghemat 25 byte, terima kasih kepada @Neil.
Disimpan tambahan 3 byte dengan menggunakan rekursi.

Huntro
sumber
2
Anda selalu lulus /bdan iuntuk psehingga Anda mungkin juga kode mereka di dalam pdirinya sendiri dan hanya mengambil satu parameter. Juga jawabannya hanya nsupaya Anda tidak perlu menghitungnya lagi. Saya memiliki versi ES6 rekursif secara longgar berdasarkan ini pada hanya 86 byte ...
Neil