Tulis program atau fungsi yang memberikan dua bilangan bulat a, b menghasilkan string yang berisi angka desimal yang mewakili fraksi a / b secara tepat .
Jika a / b adalah bilangan bulat, cukup output nilainya, tanpa titik desimal atau nol di depan:
123562375921304812375087183597 / 2777 -> 44494913907563850333124661
81 / 3 -> 27
-6 / 2 -> -3
Jika a / b bukan bilangan bulat tetapi memiliki representasi terbatas di basis 10, output nilai tanpa memimpin atau membuntuti nol (kecuali nol tunggal sebelum titik):
1 / 2 -> 0.5
3289323463 / -250000000 -> -13.157293852
Akhirnya, jika dan hanya jika (jadi tidak 0.999...
) a / b tidak bilangan bulat dan tidak memiliki representasi yang terbatas, output bagian yang terbatas diikuti oleh bagian berulang dalam tanda kurung. Bagian berulang harus sekecil mungkin, dan mulai sedini mungkin.
-1 / 3 -> -0.(3)
235 / 14 -> 16.7(857142)
123 / 321 -> 0.(38317757009345794392523364485981308411214953271028037)
355 / 113 -> 3.(1415929203539823008849557522123893805309734513274336283185840707964601769911504424778761061946902654867256637168)
Program Anda harus bekerja untuk semua contoh di atas dalam waktu kurang dari 10 detik pada PC desktop modern. Program terkecil dalam byte menang.
Jawaban:
Perl 6 ,
63 5850 byteMenguji
Jika Anda tidak peduli bahwa itu hanya akan bekerja dengan penyebut yang cocok dengan integer 64 bit, itu dapat disingkat menjadi hanya 43 byte:
Diperluas:
sumber
Python 2, 174 byte
Saya tidak begitu yakin tentang validitas jawaban ini, tetapi ini berhasil untuk kasus uji di atas dan kasus uji lain yang saya berikan. Ini terlihat seperti kekacauan yang tepat, jadi saya yakin ada banyak ruang untuk bermain golf.
Penyiapan awal mengambil nilai absolut dari kedua argumen untuk memastikan bahwa kita berhadapan dengan bilangan non-negatif (menyimpan perhitungan tanda untuk nanti), dan mendelegasikan bagian hasil bagi hasil ke aritmatika presisi sewenang-wenang Python. Bagian fraksional dilakukan dengan algoritma pembagian kelas-sekolah sampai kita mendapatkan pengulangan dalam sisanya. Kami kemudian melihat ke atas ketika kami terakhir kali melihat pengulangan ini untuk mendapatkan periode, dan membangun string yang sesuai.
Perhatikan bahwa algoritma ini sebenarnya cukup lambat karena operasi O (n)
in
, tetapi cukup cepat untuk contoh.sumber
Batch,
349344 byteSunting: Disimpan 5 byte dengan menghapus karakter yang tidak perlu. "Tidak Disatukan":
sumber
set /a
.Jawa,
625605Kode golf:
Catatan: Saya menghitung impor statis sebagai bagian dari fungsi untuk tujuan bermain golf.
Fungsi ini dimulai dengan mendapatkan hasil pembagian. Itu menambahkan bagian integral dan tanda, jika perlu. Kemudian jika ada sisanya, ia melakukan basis 10 divisi panjang. Di setiap langkah, lakukan pembagian. Simpan digit yang dihitung dan sisanya dalam dua daftar. Jika kita menemukan angka yang sama dan tetap lagi, ada bagian yang berulang dan kita tahu indeksnya dimulai dari mana. Kode dapat menambahkan digit (tanpa pengulangan) atau digit pra-pengulangan, lalu digit yang berulang diapit tanda kurung.
Ini agak besar karena sebagian besar
BigInteger
. Jika inputnya tidak melimpah bahkanlong
mungkin sedikit lebih pendek. Meski begitu, saya berharap ada cara untuk meningkatkan entri ini.Kode tidak dikumpulkan dengan metode utama untuk pengujian:
Output program:
sumber
a, BigInteger
. Saya juga berpikir Anda bisa aliasBigInteger.TEN
danBigInteger.ZERO
.while (true)
->for (;;)
yang juga memungkinkan saya untuk meletakkan barang-barang difor
penginisialisasi, menghemat byte lain.BigInteger
dalam kode saya, dan saya tidak melihat bagaimana menambahkan lebih banyak kode untuk mengecilkannya ke nama kelas karakter tunggal akan membayar. Dan tentu saja menambahkan kode untuk menanganiint[]
(yang sudah dilakukan BigInteger secara internal) hanya akan mengasapi jawaban saya.BigInteger
metode yang saya panggil untuk mengembalikan instance dari subclass, saya akan perlu menambahkan beberapa gips yang selanjutnya mengasapi kode. Di atas byte yang terbuang untuk overhead subclass, yang tentunya akan meningkatkan ukuran kode.PHP, 277 Bytes
sumber
Mathematica 198 byte
Tidak disatukan
Tes
{"27", "-27", "0,25", "-4. (3)", "2. (714285)", "131572.93852", "16,7 (857142)", "94,6 (428571)"}
sumber