Judul mengatakan itu semua. Dua input bilangan bulat 32-bit positif m, n >= 2
, output gcd(m,n)
dalam bentuk faktorisasi prima.
Memasukkan
Baris perintah args atau 1 baris stdin oke, apa pun yang lebih baik untuk golf.
Keluaran
Satu ruang dibatasi dengan eksponen (tanpa spasi tambahan). Tidak menghasilkan apa-apa jika inputnya relatif prima.
Contoh:
$ ./factorize 96 162
2^1 3^1
$ ./factorize 14 15
$ ./factorize 196 294
2^1 7^2
Aturan
- Anda tidak boleh menggunakan sumber daya eksternal, perpustakaan matematika atau fungsi bawaan untuk faktorisasi atau GCD. Contoh: Java, no
java.lang.Math
. ruby, tidakprime_division
, perl, tidakfactor
, dll.
gcd(n,m) == 1
?q:a+.b
atau__ q:a+.b
di J menggunakan tidakexternal resources or math libraries
, tapi saya tidak akan mempostingnya, karena terlalu jauh dari semangat pertanyaan. Saya hanya berpikir saya akan membagikannya di sini.Jawaban:
Python 3,
255250237226188180150142137136 charsSungguh menakjubkan betapa saya bisa mempersingkat ini dengan hanya melewatkan hal-hal (seperti, Anda tahu, menemukan gcd)! Saya juga bisa mengurangi 10 karakter lagi dengan membuat ini fungsi yang mengharapkan 2 int, seperti beberapa jawaban lain, daripada membaca dari stdin.
sumber
while g<a and g<b:
kewhile(g<a)*(g<b):
a%g+b%g
sedikitelse:g+=1
bisa sajag+=1
, kecuali saya kehilangan sesuatu.Ruby -
16811711410110097Sunting: Setelah memikirkannya, saya menyadari bahwa saya tidak memerlukan saringan karena faktor yang utama diperhatikan dalam loop faktorisasi. Juga, sebagaimana diinformasikan oleh jawaban orang lain (yang laindir dan Tal adalah yang saya lihat di dalamnya, meskipun sepertinya orang lain juga melakukannya), menghapus perhitungan gcd terpisah, karena itu juga terjadi dalam faktorisasi.
Sunting 2: Tidak perlu
do
.Sunting 3: Peras lebih banyak.
Sunting 4: Ditarik satu ruang lagi.
Sunting 5:
upto
alih-aliheach
;?^ == "^"
!Output (sama setelah diedit):
Tentu saja bisa dibuat lebih baik, tapi tidak buruk untuk yang pertamaku.
sumber
map{|i|i.to_i}
kemap &:to_i
. Anda dapat menghapus byte ke-5 dengan tidak menghitung baris baru di akhir file; Ruby bekerja tanpa itu.$*
bukanARGV
.Python 2 -
254252196185156151134126121Penerjemah
repl.it
Contoh Input - stdin
Contoh Output - stdout
sumber
…`a`+'^'+`f.count(a)`…
?f.append(i)
untukf+=[i]
menyimpan 5 karakter.f=''
masih ada di sana?)Jawa -
184175Ini terinspirasi oleh jawaban @Geobits (dan sedikit jawaban @ Tal), tetapi cukup berbeda sehingga saya memutuskan untuk membuat jawaban sendiri.
Harness uji (tidak dikelompokkan) dengan (verifikasi manusia):
sumber
dc, 96 byte
Bunyinya satu baris input standar. Outputnya tidak berakhir dengan baris baru. (EDIT: Ini juga menghasilkan ruang ekstra setelah setiap faktorisasi. Beberapa jawaban lain memangkas ruang, tetapi yang ini tidak.)
Contoh:
Kode dengan komentar:
sumber
PowerShell - 82
sumber
2..$a
menjadi loop Foreach-Object%{...}
. Loop mengumpulkan nilai dariif($p){"$_^$p"}
.JavaScript (ECMAScript 6 Draft) - 89 Karakter
Mengonversi jawaban asli (berulang), di bawah, menjadi jawaban rekursif.
Penjelasan
Jawaban Iteratif: JavaScript (ECMASCript 6) -
108 (atau 121)98 KarakterVersi 2:
Versi 1:
Menjawab pertanyaan seperti aslinya:
Atau untuk mematuhi perubahan aturan setelah fakta:
Penjelasan
Keluaran
sumber
f(158,237)
tolong coba pengujian" 79^1"
filter()
menelepon?Perl 6: 90 karakter, 94 byte
Agak de-golf dan berkomentar:
Penggunaannya seperti:
sumber
Perl,
1441331181149793Versi tidak disatukan:
Saya benar-benar baru mulai belajar Perl hanya untuk menjawab pertanyaan ini (ini adalah kode Perl pertama saya), jadi saya curiga bahwa ini dapat diturunkan lebih lanjut.
sumber
foreach
selalu identik denganfor
di Perl 5, sehingga harus memotong 4 karakter :)Jawa:
247241Melacak faktor dalam array dan hanya mencetaknya dalam satu lingkaran.
Ukuran yang layak untuk Java, tampaknya.
sumber
int
, Anda kehilangan 4 keint
tetapi Anda mendapatkannya kembali dengannew int[
->new Integer[
jadi itu adalah cuci.n%i<1&&m%i<1
ken%i+m%i<1
.()
. Jikan==m
, itu akanm+1
tetap default .m/=i;i=1;
denganm/=i--;
Ini akan berjalan lebih cepat juga :)for
loop pertama diperlukan?JavaScript (ECMAScript 5)
170164163113Saya tidak bisa menahan diri mengikuti petunjuk MT0. Saya telah mempertimbangkan rekursi sebelumnya, tetapi sepertinya terlalu mudah untuk dikacaukan. Dan memang benar. Variasi sekecil apa pun menghancurkan segalanya.
Ada biola bagi mereka yang suka biola.
Tidak Disatukan:
Versi lama
Tidak Disatukan:
Berikut ini beberapa tes:
sumber
f(301343045, 421880263);
mungkin karena browser saya tidak akan membiarkan saya mengulanginya sedalam itu. Firefox rusak yang bodoh!GolfScript, 68 byte
Perhatikan bahwa pendekatan ini membutuhkan O (b 2 ) waktu dan ruang untuk bilangan bulat "a" dan "b".
Dengan biaya satu byte tambahan, "hanya" O (b) waktu dan ruang yang diperlukan:
Bagaimana itu bekerja
sumber
Python 3 (123)
Ini pada dasarnya menggunakan struktur yang sama dengan jawaban Tal .
Cukuplah untuk mengulang hingga p = a-1, karena kita segera menambah p = a dan a> = min (a, b). Jika b> a, tidak ada salahnya mencoba nilai p yang tidak berguna di atas a.
Dalam 2.x, saya pikir kami bisa menghemat karakter dengan mencetak masing-masing bagian seperti yang kita mendapatkannya daripada mengumpulkan string:
if c:print'%d^%d'%(p,c),
. Sayangnya, Python 3 tampaknya tidak memiliki cara yang ringkas untuk mencetak tanpa baris baru.sumber
PHP, 96
sumber
p=0;g+=1
menjadi satu baris dengan mulaig
dari 1 sebagai gantinya, yang memungkinkan Anda melakukannyag<a
daripadag<=a
. Saya harap Anda tumbuh seperti python.awk -
1151119685Versi baru hanya dapat menangani satu jalur input. Terima kasih kepada durron597 untuk menunjukkan bahwa saya hanya perlu memastikan
i <= $1
.Tidak Disatukan:
Sebelumnya bisa mengambil pasangan angka berulang kali
Tidak Disatukan:
sumber
&&i<=b
?i > b
, makab % i != 0
... terima kasih :)NF=0;
gagal menghapus $ 1 dan $ 2. Output dariecho 301343045 421880263 | awk -f factorize.awk | sed 's/ */ /g'
adalah5 7 1021^1 59029^1
karena $ 1 adalah 5 dan $ 2 adalah 7. Sed meremas ruang tambahan yang berasal dari mencetak $ 1022, $ 1023, $ 1024, ..., $ 59028 sebagai string kosong yang bergabung dengan spasi.$0=z;
$0=z;
jumlah karakternya sama denganNF=0;
. Jika$0=z;
lebih lama, saya akan memberitahu Anda untuk menyimpannyaNF=0;
.Pip , 41 byte
Bukan jawaban yang bersaing, karena bahasa lebih baru dari pertanyaan. Tapi itu tanda GolfScript dari 68 perlu turun.
Output berakhir di spasi; jika itu masalah, versi berikut ini juga 41 byte (termasuk
-s
bendera):Diformat, dengan penjelasan:
Pip, tidak seperti GolfScript, CJam, dkk. adalah bahasa imperatif dengan operator infiks; itu juga mengambil beberapa inspirasi dari bahasa pemrograman array. Tugas ini dengan baik menampilkan kedua paradigma di tempat kerja.
(Perhatikan bahwa komit 2015-4-20 diperlukan untuk menjalankan ini, karena saya baru saja memperbaiki beberapa bug.)
sumber
Python 2 - 262 byte
Jalur 6 perlu bekerja.
sumber
…`a`+'^'+`f.count(a)`…
?Groovy: 174 karakter
Ini adalah port solusi Geobits untuk Groovy 2.2.1:
Ini adalah versi yang tidak disunat:
sumber
R: 139
Dengan lekukan:
Pemakaian:
sumber