Pemenang: Jawaban Ian D. Scott , dengan satu byte (48 byte)! Hebat!
Program Anda harus menerima input dari fraksi yang dapat disederhanakan, lalu menyederhanakannya.
Aturan:
- Jika fraksi sudah dalam bentuk yang paling disederhanakan, Anda harus memberi tahu pengguna
- Tidak ada fungsi bawaan untuk melakukan ini
- Pengguna harus mengetikkan angka di beberapa titik, namun metode yang dibaca program itu tidak masalah. Bisa dengan stdin, console.readline, dll. Selama tipe pengguna
9/18
(misalnya) di beberapa titik, itu valid - Output harus dilakukan dengan stdout, console.writeline, dll ...
- Fraksi akan dimasukkan sebagai
x/y
, dan harus ditampilkan sebagaia/b
- Fraksi harus menampilkan bentuk yang paling sederhana. Misalnya, 8/12 -> 6/9 tidak valid , satu-satunya solusi yang valid adalah 2/3.
- Kontes ini berakhir pada 9 Agustus 2014 (7 hari sejak posting)
- Ini adalah pertanyaan kode-golf , sehingga kode terpendek menang
Jawaban:
Python -
6948Hal pertama yang harus dilakukan adalah merepresentasikannya dalam format asli python untuk menyimpan fraksi, yaitu kelas Fraction.
Sekarang kami menyederhanakan ... tapi lihat! Ini sudah disederhanakan.
Apakah ini dianggap sebagai menggunakan fungsi bawaan? Itu tidak dimaksudkan khusus untuk menyederhanakan, dan Fraction adalah kelas, bukan fungsi.
Saya tidak memanggil fungsi penyederhanaan, jadi bukan salah saya jika python memutuskan untuk melakukannya sendiri.
sumber
type(fractions.Fraction.__init__)
mengembalikanwrapper_descriptor
daripadafunction
, jadi Anda bisa mengatakan itu bukan fungsi. Ini sebenarnya hanya berarti diimplementasikan dalam c, tetapi apa pun yang tidak ada dalam fungsi kelas bukan fungsi, kan?> <> (92)
Saya tahu saya bisa mendapatkan ini lebih rendah, saya akan golf lebih banyak di pagi hari.
Penjelasan dasar: Dua baris pertama, dan paruh kedua dari ketiga, semuanya untuk membaca angka. Sedihnya,> <> tidak memiliki cara untuk melakukan itu, sehingga parsing mengambil setengah dari program.
Baris ke-4 adalah perhitungan gcd berulang sederhana. Saya terkejut melihat seberapa baik> <> lakukan pada hitungan byte untuk algoritma yang sebenarnya. Jika bukan karena i / o yang mengerikan, itu sebenarnya bisa menjadi bahasa golf yang masuk akal.
Dua baris terakhir hanya untuk mencetak hasilnya dan membagi angka aslinya dengan gcd.
sumber
GolfScript, 49 karakter
Jalankan kedua testcas di sini :
sumber
JavaScript 101
Untuk sekali ini, solusi tidak menggunakan EcmaScript 6
Namun dengan E6 bisa jadi 93
sumber
for([a,b]=[c,d]=prompt().split('/');b;[a,b]=[b,a%b]);alert(a-1?c/a+'/'+d/a:'Reduced');
86 saya harap ini benar secara matematis ...Python 2.7, 124
Solusi yang sangat sederhana, meskipun saya tahu ini akan lebih pendek dalam banyak bahasa lain.
Saya menggunakan yang diimpor
gcd
tetapi jika dianggap sebagai peredam fraksi bawaan, ia dapat diterapkan secara langsung.sumber
Python 2 (82)
Mencetak Boolean sesudahnya untuk mengatakan apakah aslinya dalam bentuk yang paling sederhana. Hanya melakukan algoritma GCD biasa. Sebagian besar karakter dihabiskan untuk input / output.
sumber
input()
?print
,map
sedang dibongkar, dan mungkin bilangan bulat daripada divisi float.map
dibongkar?a,b=map(int,...)
tidak memerlukan karakter tambahan karenaa,b=...
membongkar secara otomatis. Masalah yang kadang-kadang Anda temui adalah Python 3 yangmap
tidak menghasilkan daftar tetapi objek peta yang perlu diubah menjadi daftar sebelum Anda bisa melakukan sesuatu seperti mengirisnya. Ekspresi suka*l,=map(...)
diperlukan untuk menetapkanl
sebagai daftar.PHP> = 7.1, 76 Bytes (Tidak Bersaing)
Versi Online
sumber
C, 94
Hanya tebakan kasar dan periksa, untuk GCD mulai dari | b hingga 1;
sumber
c;d;f(a,b){b?f(b,a%b):printf("%d/%d",c/a,d/a);}main(){scanf("%d/%d",&c,&d);f(c,d);}
Rebmu (104 karakter)
Tanpa suara:
sumber
PHP 156
meh.
Lari:
Berikut adalah versi yang tidak dikenali dengan beberapa pengujian (dimodifikasi ke dalam bentuk fungsi):
sumber
Java,
361349329 (terima kasih @Sieg untukint
tipnya)Saya tahu ini tidak pendek, tapi saya hanya terpesona dengan apa yang saya lakukan.
Untuk menggunakannya, kompilasi kode dan jalankan lewat argumen melalui baris perintah.
doubles
dan tugas tidak memerlukannya).Tidak disatukan (jika ada yang ingin melihat kekacauan ini):
sumber
int
sebagai gantiInteger
, bahkan dalam kode produksi. Int dialokasikan dari stack, sedangkan integer dari heap.new Integer(str)
akan memiliki hasil yang sama denganInteger.parseInt(str)
. Juga, mengapa tidak menggunakanString f=""
(selalu)?new Integer(str)
menciptakanInteger
string, tetapi tidakInteger.parseInt(str)
melakukan hal yang sama? Dan masalahnyaString f=""
, saya tahu bahwa saya harus menggunakannyaString f=new String()
, tetapi saya tidak tahu mengapa saya tidak menggunakannya, mungkin itu kebiasaan buruk: PInteger.parseInt
memang melakukan hal yang sama, tetapi dengan beberapa nilai cache untuk pencarian lebih cepat.Ruby - 112 karakter
g
adalah lambda pembantu yang menghitung GCD dari dua bilangan bulat.f
mengambil fraksi sebagai string, misalnya'42/14'
, dan mengeluarkan fraksi yang berkurang atausimplest
jika pembilang dan penyebutnya relatif prima.Beberapa test case:
Keluaran:
Catatan, meskipun bertentangan dengan aturan, Ruby memiliki
Rational
dukungan, jadi kami bisa melakukannyasumber
JavaScript
(91)(73)Mengembalikan '/' ketika fraksi sudah dalam bentuk yang paling sederhana. Fungsi g menghitung gcd. BTW: Apakah ada cara yang lebih pendek untuk '1 == sesuatu' di mana ada sesuatu yang bukan bilangan bulat negatif?
function s(f){[n,m]=f.split(b='/');g=(u,v)=>v?g(v,u%v):u;return 1==(c=g(n,m))?b:n/c+b+m/c;}
Terima kasih kepada @bebe untuk versi yang lebih singkat:
sumber
s=f=>...
lalu tetapkan g saat menggunakannya(g=...)(n,m)
lalu berikan ke c dan uji apakah itu sama dengan 1 olehc-1?not_equals:equals
dan cobalah untuk menghindari menggunakan kembali. hasil:s=f=>([n,m]=f.split(b='/'),c=(g=(u,v)=>v?g(v,u%v):u)(n,m))-1?n/c+b+m/c:f;
73 (mengembalikan bentuk paling sederhana (f) jika tidak dapat dikurangi)function
danreturn
. Dan terima kasih atas-1
=)Lua -
130115 karakter10/10 saya benar-benar mencoba
Saya sepenuhnya mengambil keuntungan dari kemampuan Lua untuk secara otomatis mengkonversi string ke angka ketika melakukan operasi aritmatika pada string. Saya harus menambahkan "+0" sebagai pengganti tonumber untuk beberapa kode perbandingan.
Maaf, saya tidak memiliki versi yang tidak disunat, di atas sebenarnya adalah bagaimana saya menulisnya
sumber
Gelombang - 198
Masukan dibagi sebagai
a/b
, maka untuk setiapc
dib,b-1,...1
kita memeriksa apakaha
danb
dibagi olehc
, dan membagi mereka denganc
jika mereka. Lalu kita kembalia/b
sumber
Befunge 93 (192)
sumber
C 135
Menerima input untuk 2 bilangan bulat yang dipisahkan ruang. Terus membagi dengan minimum a & b hingga 1 untuk menemukan GCD.
sumber
Jawa (200)
Solusi terbaik sebelumnya di Jawa masih memiliki> 300 byte, yang ini memiliki 200:
Ini menggunakan modulo (lebih cepat) untuk menentukan gcd daripada mengulangi semua angka.
sumber
class M