Sebuah Gaussian bilangan bulat adalah bilangan kompleks yang bagian real dan imajiner adalah bilangan bulat.
Bilangan bulat Gaussian, seperti bilangan bulat biasa, dapat direpresentasikan sebagai produk bilangan prima Gaussian, dengan cara yang unik. Tantangannya di sini adalah untuk menghitung konstituen utama dari bilangan bulat Gaussian yang diberikan.
Input: bilangan bulat Gaussian, yang tidak sama dengan 0 dan bukan unit (yaitu 1, -1, i dan -i tidak dapat diberikan sebagai input). Gunakan format apa pun yang masuk akal, misalnya:
- 4-5i
- -5 * j + 4
- (4, -5)
Output: daftar bilangan bulat Gaussian, yang merupakan bilangan prima (yaitu tidak ada satupun yang dapat direpresentasikan sebagai produk dari dua bilangan bulat Gaussian non-unit), dan yang produknya sama dengan nomor input. Semua angka dalam daftar output harus non-sepele, yaitu bukan 1, -1, i atau -i. Segala format output yang masuk akal dapat digunakan; tidak harus sama dengan format input.
Jika daftar output memiliki lebih dari 1 elemen, maka beberapa output yang benar dimungkinkan. Misalnya, untuk input 9 output bisa [3, 3] atau [-3, -3] atau [3i, -3i] atau [-3i, 3i].
Test case, (diambil dari tabel ini ; 2 baris per test case)
2
1+i, 1-i
3i
3i
256
1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i,1+i
7+9i
1+i,2−i,3+2i
27+15i
1+i,3,7−2i
6840+585i
-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i
Fungsi bawaan untuk memfaktorkan bilangan bulat Gaussian tidak diizinkan. Anjak bilangan bulat biasa dengan fungsi bawaan diizinkan.
sumber
3i
kembali sebagai3,i
, atau3i
?3i
adalah jawaban yang benar karenai
bukan yang utama. Saya telah memperbarui test case untuk membuatnya lebih jelas.6840+585i
memiliki daftar faktor yang salah, karena5
bukan perdana Gaussian. Sebaliknya, ia kembali-1-2i, 1+4i, 2+i, 3, 3, 6+i, 6+i
. Sumber256=(1+i)**16
bukan(1+i)**8
karena256=2**8=(2i)**8
dan2i=(1+i)**2
Jawaban:
Jelly ,
6155 byteCobalah online! (Header dan Footer memformat output)
-6 byte terima kasih kepada @EricTheOutgolfer
Bagaimana itu bekerja
sumber
Ruby ,
258256249246 + 8 =264257254 byteMenggunakan
-rprime
bendera.Ya ampun, benar-benar berantakan.
Menggunakan algoritma ini dari stackoverflow.
Cobalah online!
sumber
Python 2 ,
250239223215 byteCobalah online!
(a,b)
Beberapa penjelasan secara rekursi menguraikan kompleks menjadi dua kompleks sampai tidak ada pembusukan yang mungkin ...
sumber
def f(Z,s=[])
harus menyelamatkan Anda karakterKarat - 212 byte
Saya tidak 100% yakin apakah ini berfungsi 100% benar, tetapi tampaknya benar untuk berbagai macam tes. Ini tidak lebih kecil dari Jelly, tapi setidaknya itu lebih kecil dari bahasa yang ditafsirkan (sejauh ini). Ini juga tampaknya lebih cepat dan dapat bekerja melalui input yang besarnya satu miliar dalam waktu kurang dari satu detik. Misalnya 1234567890 + 3141592650i faktor sebagai (-9487 + 7990i) (- 1 + -1i) (- 395 + 336i) (2 + -1i) (1 + 1i) (3 + 0i) (3 + 0i) (3 + 0i) (4+ 1i) (- 1 + 1i) (- 1 + 2i), (klik di sini untuk menguji wolfram alpha)
Ini dimulai sebagai ide yang sama seperti anjak bilangan bulat dari bilangan bulat, untuk melewati setiap angka di bawah bilangan bulat yang dimaksud, lihat apakah ia terbagi, ulangi sampai selesai. Kemudian, terinspirasi oleh jawaban lain, itu berubah ... berulang kali faktor item dalam vektor. Ini melakukan ini beberapa kali, tetapi tidak 'sampai' apa pun. Jumlah iterasi telah dipilih untuk mencakup sejumlah input yang masuk akal.
Itu masih menggunakan "(a mod b) == 0" untuk menguji apakah satu integer membagi yang lain (untuk Gaussians, kami menggunakan builtin Rust gaussian modulo, dan menganggap "0" sebagai norma == 0), namun pemeriksaan untuk 'norma ( a / b)! = 1 'mencegah membagi "terlalu banyak", pada dasarnya memungkinkan vektor yang dihasilkan hanya diisi dengan bilangan prima, tetapi tidak mengambil elemen vektor ke kesatuan (0-i, 0 + i, -1 + 0i, 1 + 0i) (yang dilarang oleh pertanyaan).
Batas for-loop ditemukan melalui percobaan. Anda beralih dari 1 ke atas untuk mencegah kepanikan di-by-zero, dan x dapat berubah dari -999 menjadi 0 berkat mirroring Gaussians atas kuadran (saya pikir?). Mengenai keterbatasan, pertanyaan awal tidak menunjukkan kisaran input / output yang valid, sehingga "ukuran input yang masuk akal" diasumsikan ... (Edit ... namun saya tidak yakin bagaimana menghitung di nomor mana ini akan mulai "gagal", saya bayangkan ada bilangan bulat Gaussian yang tidak dapat dibagi oleh apa pun di bawah 999 tetapi masih sangat kecil bagi saya)
Coba versi yang agak ungolfed di play.rust-lang.org
sumber
Perl 6 ,
141124 byteTerima kasih kepada Jo King untuk -17 byte
Cobalah online!
sumber
floor
ini memeriksa apakah$_/w
(yaitu faktor saat ini dibagi dengan angka) adalah bilangan bulatPyth ,
5451454236 byteCobalah online!
Menerima input dalam bentuk
1+2j
- angka nyata atau imajiner murni dapat menghilangkan komponen lain (misalnya9
,2j
). Output adalah daftar bilangan kompleks yang dipisahkan oleh baris baru, dalam formulir(1+2j)
, dengan bilangan imajiner murni menghilangkan bagian yang sebenarnya.Ini menggunakan pembagian jejak sederhana, menghasilkan semua bilangan bulat gaussian dengan magnitudo lebih besar dari 1 dan kurang dari nilai saat ini, ditambah nilainya sendiri. Ini disaring untuk menjaga mereka yang merupakan faktor nilai, dan yang terkecil berdasarkan besarnya dipilih sebagai faktor utama berikutnya. Ini adalah output, dan nilainya dibagi olehnya untuk menghasilkan nilai untuk iterasi berikutnya.
Juga, Pyth mengalahkan Jelly 😲 (saya tidak berharap itu berlangsung lama)
sumber