Tantangan
Tulis program atau fungsi yang mengambil dua bilangan bulat input, i
dan j
, dan hasilkan pembagi umum terbesar mereka; dihitung dengan menggunakan algoritma Euclidean (lihat di bawah).
Memasukkan
Input dapat diambil sebagai representasi string dengan batasan ruang i
dan j
atau sebagai dua bilangan bulat terpisah. Anda dapat mengasumsikan bahwa bilangan bulat akan kurang dari atau sama dengan 10.000. Anda juga dapat mengasumsikan bahwa bilangan bulat input tidak akan menjadi prima satu sama lain.
Kerusakan Euclidean
Jumlah yang lebih besar antara i
dan j
dibagi dengan yang lebih kecil sebanyak mungkin. Kemudian, sisanya ditambahkan. Proses ini diulangi dengan sisa dan nomor sebelumnya, sampai sisa menjadi 0
.
Misalnya, jika inputnya adalah 1599 650
:
1599 = (650 * 2) + 299
650 = (299 * 2) + 52
299 = (52 * 5) + 39
52 = (39 * 1) + 13
39 = (13 * 3) + 0
Angka terakhir 13
,, adalah pembagi umum terbesar dari dua bilangan bulat input. Dapat divisualisasikan seperti ini:
Keluaran
Output Anda harus berupa rincian dalam formulir di atas, diikuti oleh baris baru dan GCD. Ini bisa menjadi output melalui media apa pun.
Contohnya
Input
18 27
50 20
447 501
9894 2628
Keluaran
27 = (18 * 1) + 9
18 = (9 * 2) + 0
9
50 = (20 * 2) + 10
20 = (10 * 2) + 0
10
501 = (447 * 1) + 54
447 = (54 * 8) + 15
54 = (15 * 3) + 9
15 = (9 * 1) + 6
9 = (6 * 1) + 3
6 = (3 * 2) + 0
3
9894 = (2628 * 3) + 2010
2628 = (2010 * 1) + 618
2010 = (618 * 3) + 156
618 = (156 * 3) + 150
156 = (150 * 1) + 6
150 = (6 * 25) + 0
6
Catatan: Output tidak harus diberi spasi seperti di atas. Spasi hanya untuk kejelasan. Diperlukan tanda kurung.
Bonus
Jika output Anda diberi spasi seperti di atas, Anda dapat menambahkan bonus -10% untuk skor Anda.
Jawaban:
Pyth, 33 byte
Cobalah online: Demonstrasi atau Test Suite
Penjelasan:
sumber
CJam,
464339 byteCobalah online di juru bahasa CJam .
Bagaimana itu bekerja
sumber
Python 2, 70
Fungsi rekursif yang mengembalikan string multiline. Fungsi menciptakan baris pertama, kemudian menambahkannya ke hasil rekursif dengan pasangan angka berikutnya dalam algoritma Euclidean. Setelah angka kedua adalah nol, kita mengambil string dari angka lainnya sebagai alas, menyebabkannya dicetak pada barisnya sendiri di bagian akhir.
Pemformatan dilakukan melalui substitusi string, menggunakan divisi integer untuk mendapatkan multiplicand.
Satu cegukan harus dimulai dengan jumlah yang lebih besar yang diambil dengan jumlah yang lebih kecil. Mudahnya, jika angkanya salah, langkah pertama dari algoritma Euclidian membaliknya. Untuk mencegah langkah ini ditampilkan, hanya tambahkan baris saat ini jika angka pertama setidaknya yang kedua (kesetaraan diperlukan untuk, katakanlah
f(9,9)
).sumber
awk,
7877Menyortir input berdasarkan ukuran membutuhkan banyak byte: /
Turun ke ini:
Keluaran
Hanya untuk bersenang-senang saya membuat versi spasi juga, memberi saya skor 233 * 0,9 == 209,7 byte.
Pembaruan Saya dapat mempersingkat ini dari 285 byte dan sekarang berfungsi untuk nomor panjang sewenang-wenang jika memanggil gawk4 dengan
-M
opsi.Tapi aku masih punya perasaan aku berlari ke beberapa blok mental di suatu tempat ...
Output (gawk4 disebut dengan
awk -M -f code.awk
)Beberapa baris dan tab baru ditambahkan
Saya bisa menyimpan panjang nilai awal untuk x, y dan x% y di awal, karena mereka hanya bisa mendapatkan lebih pendek setiap langkah. Tetapi untuk faktor saya harus menentukan panjang maksimum sebelum mencetak apa pun, karena panjangnya bisa bervariasi. Saya menggunakan
$i
sebagai array di sini, karena menghemat dua karakter dibandingkan dengan menggunakan [i] setiap kali.sumber
C ++, kompiler GCC, 171 byte (-10%, jadi 154 byte)
oke jadi coba pertama saya ..
tips untuk kode golf dihargai.
PS Apakah perlu untuk menghitung byte dari file header standar dan int main saat menggunakan c ++? Tidak termasuk itu mengurangi 50 byte
sumber
T-SQL (2012+), 268 byte
Diimplementasikan sebagai fungsi tabel inline yang mengeksekusi CTE rekursif. Mungkin bermanfaat untuk mencoba memformat bonus 10%, tetapi itu harus menunggu.
Penjelasan dan penggunaan:
sumber
Rev 1: Ruby, 86
Algoritma rekursif, terima kasih untuk tip dari Doorknob.
Rev 0: Ruby, 93
Ini benar-benar tidak berhasil sama sekali. The
while
Loop memakan terlalu banyak karakter, terutama denganend
. Saya tidak bisa melihat cara untuk menghindarinya. Rekursi akan membutuhkan fungsi bernama alih-alih lambda, yang juga akan memakan banyak karakter.Sebut saja seperti ini:
sumber
a=->i,j{...}
dan menelepona
viaa[1,2]
—tidak yakin apakah ini akan menghemat karakter Anda.f.call
.) Sebenarnya ini sedikit lebih pendek, tetapi masih jauh dari Python.PowerShell, 84
Blok kode rekursif, disimpan dalam variabel. Aktifkan dengan
& $e num1 num2
, misalnya:Dalam bentuk yang lebih mudah dibaca, ia melakukan hal berikut (nb. Untuk kode yang lebih jelas, saya telah memasukkan nama commandlet lengkap, lebih banyak spasi dalam string, dan membuat perintah output pipa eksplisit):
Satu gangguan dari sudut pandang codegolf; PoSh tidak memiliki divisi integer, 10/3 mengembalikan Double, tetapi membuang hasilnya ke integer dan tidak selalu bulat, membulatkan N.5 ke bilangan genap terdekat - naik atau turun. Jadi
[int](99/2) == 50
.Itu menyisakan dua pilihan aneh:
Itulah sebabnya saya harus membakar beberapa karakter:
Terlepas dari itu, ini adalah jumlah
Saya juga memiliki versi berulang yang, agak bagus, juga 84 karakter:
Codeblock sepenuhnya anonim, jadi jalankan dengan
sumber
PHP, 118 Bytes
Cobalah online!
PHP, 131 Bytes
Cobalah online!
-4 Bytes diganti
list(,$n,$m)=$argv
dengan[,$n,$m]=$argv
kebutuhan PHP> = 7.1sumber
Japt ,
434241 byte"Keterampilan" yang baru saya temukan tampaknya semakin buruk, tidak lebih baik!
Cobalah online
sumber
JavaScript (ES6),
7450626155 byteCobalah
Penjelasan
sumber
JS, 151
sumber
C, 83 byte
tes dan hasil
sumber
Jawa 133
Itu tidak melakukan algoritma Euclidean biasa. Sebagai gantinya, ia menggunakan modulus dan kemudian menghitung angka ke-2 untuk dikalikan dengan kapan itu dicetak. Anda juga dapat membuat ini lebih pendek dengan mengubahnya menjadi ekspresi lambda, tapi saya tidak yakin bagaimana caranya.
sumber
public
, mengubah keduaprintln
untukprint
, dan perubahand!=0
ked>0
. Selain itu, saat ini memberikan output yang salah untuk baris pertama. Ini dapat diperbaiki dengan menambahkanif(d!=i)
di depanSystem.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);
. Jadi secara total:void z(int i,int j){for(int d=1;d>0;i=j,j=d){d=i%j;if(d!=i)System.out.println(i+"=("+j+"*"+((i-d)/j)+")+"+d);}System.out.print(i);}
( 131 byte & bug-diperbaiki)