Algoritma Euclidean adalah algoritma yang dikenal luas untuk menghitung pembagi umum terbesar (GCD) dari dua bilangan bulat positif.
Algoritma
Untuk tujuan tantangan ini, algoritme tersebut dijelaskan sebagai berikut:
Tampilkan dua input sebagai garis yang berdekatan dari karakter tertentu
misalnya input3,4
dapat diwakili oleh garis yang berdekatan000
dan0000
Ubah
length(short_line)
karakter pertama di baris yang lebih panjang menjadi karakter lain, katakan-
sekarang sepertinya000
dan---0
Hilangkan
length(short_line)
karakter pertama di baris yang lebih panjang.
sekarang000
,0
Ulangi langkah 2 dan 3 sampai keduanya memiliki panjang yang sama, menggunakan garis yang lebih pendek dan lebih panjang setelah setiap iterasi, misalnya
000
,0
-00
,0
00
,0
-0
,0
0
,0
- Anda dapat memilih apakah akan berhenti di sini atau melanjutkan iterasi dan mengubah salah satu garis menjadi garis kosong.
Masing-masing langkah ini harus dipisahkan oleh interval antara 0,3 dan 1,5.
Tantangan
Tulis program yang, diberi dua bilangan asli sebagai input, membuat output yang terlihat persis sama dengan output dari algoritma di atas. Anda dapat menggunakan karakter ASCII non-spasi putih yang dapat dicetak selain 0
dan -
, tetapi konsisten dan gunakan hanya dua karakter. Anda juga dapat menggunakan algoritma alternatif asalkan output, termasuk waktunya, persis sama dengan yang akan dihasilkan oleh algoritma di atas.
Contohnya
Ini adalah contoh dengan input 24,35
, yang merupakan koprimes sehingga GCD mereka adalah 1.
Ini adalah contoh dengan input 16,42
, yang memiliki GCD 2.
Aturan
- Ini adalah sebuah kode-golf , sehingga byte terpendek menang
- Celah standar berlaku
- Anda dapat menganggap input sebagai bilangan desimal positif
Klarifikasi
- Garis-garis yang mewakili angka-angka harus tetap dalam urutan aslinya, yaitu baris pertama dan kedua dari "bingkai" pertama yang ditampilkan masing-masing harus menjadi baris pertama dan kedua, di semua bingkai berikutnya.
- Setelah algoritma berakhir, tidak ada entitas tambahan yang terlihat yang muncul. Namun, ini juga berarti tidak apa-apa untuk mengosongkan garis, jika Anda memastikan bahwa "bingkai" terakhir ditampilkan setidaknya untuk jumlah waktu yang sama seperti semua bingkai lainnya sebelum dikosongkan.
:-)
Jawaban:
Jelly , 29 byte
Cobalah online!
Ini mendefinisikan fungsi
2Ŀ
(bukan program lengkap; tautan TIO berisi catatan kaki yang mengubah fungsi menjadi program) yang mengambil daftar dua elemen sebagai input, dan menampilkan output di layar (salah satu metode I / O resmi kami , dan yang agak diperlukan untuk tantangan ini karena berbicara tentang penampilan di layar). Ini mengasumsikan bahwa program dijalankan di terminal yang sesuai dengan standar ANSI (saya menggunakangnome-terminal
tetapi sebagian besar akan bekerja), dan bahwa terminal pada awalnya kosong (yang tampak seperti standar yang paling masuk akal); perhatikan bahwa Coba online! tidak tidak sesuai dengan asumsi ini, dan dengan demikian output terdistorsi sana (aku berlari program lokal untuk memverifikasi bahwa itu menjiwai seperti yang diharapkan). Saya menggunakan1
tempat menggunakan pertanyaan0
, dan2
di tempat-
.Penjelasan
Fungsi helper
1Ŀ
(diberi daftar dua daftar digit, mengeluarkannya pada baris pertama dan kedua layar, lalu menunggu 0,5 detik; mengembalikan inputnya)String "\ x1bc", ketika dikirim ke terminal yang kompatibel dengan ANSI, ditafsirkan sebagai kode kontrol untuk mengatur ulang terminal; ini membersihkan layar dan memindahkan kursor ke sudut kiri atas (sehingga mengatur ulang terminal siap untuk output berikutnya).
Fungsi helper dinamai
1Ŀ
(Jelly autogenerates nama formulir ini untuk fungsi, dan sebenarnya tidak ada cara lain untuk menamai mereka), tetapi itu bisa disebut sebagai hanyaÇ
dari program utama (karena bahasa memiliki singkatan untuk fungsi dengan angka di dekatnya ).Fungsi utama
2Ŀ
(mengimplementasikan tugas yang diminta dalam pertanyaan)sumber
JavaScript (ES6),
128124 bytesumber
Python 2 ,
152146 byteCobalah online!
Mengambil dua bilangan bulat yang dipisahkan koma sebagai input
sumber
Javascript (ES6),
215 194...135 129127 bytePemakaian
Ini membutuhkan input dalam variasi pada kari. Untuk menggunakannya, kepalan menetapkan fungsi ke variabel (misalnya
G
), lalu panggil seperti ini:Penjelasan
Agak fungsi rekursif yang memanggil dirinya sendiri setelah 1 detik selama algoritma belum selesai. Ini melacak variabel ketiga
c
yang menentukan apakaha
danb
harus diubah (jikac
adalah1
, waktu itu untuk perubahan).Pertama, fungsi menulis sesuatu ke konsol. Jika
c
adalah0
, itu menulis dua string dari nol dengan peralihan baris baru. Sejakc
diinisialisasi0
, kita dapat mengambil keuntungan dari ini, dan mengatur variabel globalf
dang
yang memiliki beberapa string yang sering kita butuhkan (seperti0
danrepeat
).Kalau tidak, itu membangun string dengan nol dan minus. Semua string tersebut terdiri dari dua bagian: pertama beberapa (sebutlah jumlah ini
A
) minus, kemudian beberapa (panggil jumlah iniB
) nol, kemudian baris baru, lalu beberapa (panggil jumlah iniD
) minus dan terakhir beberapa (panggil jumlah iniE
) nol.Jika input pertama lebih kecil dari input kedua, kita perlu menghapus nol dari input kedua, jadi
A
nol,B
sama dengan input pertama,D
sama dengan input pertama danE
sama dengan input kedua dikurangi input pertama. Jika input pertama tidak lebih kecil dari input kedua, kebalikannya berlaku (A
adalah input kedua,B
adalah input pertama dikurangi input kedua dll.).Dengan nilai-nilai baru untuk input dan variabel yang diaktifkan
c
, fungsi dijadwalkan untuk dipanggil lagi dalam1e3
milidetik, yang sama dengan satu detik.Catatan
alert
untuk output0
dan-
, sama seperti dalam contohCobalah online
Coba di sini!
sumber
Python 2 ,
208204194 byte-4 dengan terima kasih kepada @math_junkie untuk trik liciknya
time.sleep
-10 dengan terima kasih kepada @busukxuan untuk mengklarifikasi aturan "hapus layar".
Cobalah online!
Cukup yakin ini bisa lebih golf. Menyakitkan saya untuk menduplikasi
print
danfor
loop untuk membuat jeda tapi saya tidak dapat menemukan cara memutarnya saat ini.Catatan
sumber
import time
,s=time.sleep
dans(1)
bukannya loop untuk keterlambatantime.sleep
tetapi melewatkan yang itu. Akan mencobanya.perl,
161149 byte... tanpa lekukan dan baris baru:
Masukkan ke dalam file gcd.pl dan jalankan seperti ini:
sumber
-M5.010
bendera untuk perl gratis, sehingga Anda dapat menyimpan beberapa byte dengan menggunakansay
lebihprint…\n
. Selain itu, saya cukup yakin untuk memberikan subrutin anonim nama Anda, daripada menyimpannya dalam variabel.GNU Sed (with
e
ekstensi xec), 88Skor termasuk +3 untuk
-zrf
opsised
.Input diberikan sebagai dua bilangan bulat unaris yang dipisahkan oleh baris baru, menggunakan huruf besar
O
sebagai digit.Misalnya, contoh 16, 42 dapat dijalankan sebagai:
Sesuai komentar terbaru, saya tidak membersihkan layar di antara iterasi.
sumber
V ,
4744 byteCobalah online!
Header dan footer di TIO hanya memodifikasi
gs
untuk menyalin dua baris saat ini ke bagian bawah layar, dan kemudian menghapus dua yang pertama di akhir. Ini memvisualisasikan operasi untuk TIO, tetapi jika Anda menjalankannya di V (tanpa header dan footer), itu hanya akan menunggu sebentar di antara setiap operasi.sumber
ò
?