Dengan bilangan bulat N > 1
, hasilkan semua angka lainnya yang dekomposisi utamanya memiliki digit yang sama dengan dekomposisi utama N
.
Misalnya, jika N = 117
, maka outputnya harus [279, 939, 993, 3313, 3331]
, karena
117 = 3 × 3 × 13
oleh karena itu, tersedia angka yang 1
, 3
, 3
dan 3
dan kita harus
279 = 3 × 3 × 31
939 = 3 × 313
993 = 3 × 331
3313 = 3313
3331 = 3331
Itu adalah satu-satunya angka lain yang mungkin, karena kombinasi lain dari angka-angka ini menghasilkan bilangan bulat non-prima, yang tidak dapat menjadi hasil faktorisasi prima.
Jika N
adalah salah 117
, 279
, 939
, 993
, 3313
atau3331
, maka output akan berisi lima nomor lainnya: mereka adalah faktor utama teman.
Anda tidak dapat menggunakan nol terkemuka untuk mendapatkan bilangan prima, misalnya untuk N = 107
, satu-satunya teman adalah 701
(017
tidak dipertimbangkan).
Input dan Output
Teman input dan output harus diambil dan dikembalikan dalam basis desimal.
N
akan selalu lebih ketat dari1
.Outputnya bisa diformat dengan bebas, asalkan hanya berisi sobat dan elemen pemisah / daftar sintaksis.
Urutan output tidak penting.
Anda dapat mengambil input melalui
STDIN
, sebagai argumen fungsi atau yang serupa.Anda dapat mencetak output ke
STDOUT
, mengembalikannya dari fungsi, atau yang serupa.
Uji kasus
Program Anda harus menyelesaikan salah satu kasus uji di bawah ini dalam waktu kurang dari satu menit .
N Buddies
2 []
4 []
8 []
15 [53]
16 []
23 [6]
42 [74, 146, 161]
126 [222, 438, 483, 674, 746, 851, 1466, 1631, 1679]
204 [364,548,692,762,782,852,868,1268,1626,2474,2654,2921,2951,3266,3446,3791,4274,4742,5426,5462,6233,6434,6542,7037,8561,14426,14642,15491,15833,22547]
Mencetak gol
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Ç€=$
akan menjadi sedikit lebih cepat daripadaÇ€=Ç
, mengingat batasan waktu.PowerShell v3 +, 450 byte
Akhirnya!
PowerShell tidak memiliki built-in untuk pengecekan primitif, faktorisasi, atau permutasi, jadi ini sepenuhnya digulung dengan tangan. Saya bekerja melalui banyak trik pengoptimalan untuk mencoba dan mengurangi kompleksitas waktu menjadi sesuatu yang sesuai dengan batasan tantangan, dan saya senang mengatakan bahwa saya akhirnya berhasil -
Penjelasan
Ada banyak hal yang terjadi di sini, jadi saya akan mencoba memecahnya.
Baris pertama mengambil input
$n
dan mendefinisikan sebuahfunction
,f
. Fungsi ini menggunakan divisi percobaan akumulatif untuk menghasilkan daftar faktor-faktor utama. Ini cukup cepat untuk input kecil, tapi jelas rawa turun jika inputnya besar. Untungnya semua test case kecil, jadi ini sudah cukup.Baris berikutnya mendapatkan
f
aktor$n
,-split
mereka pada setiap digit mengabaikan hasil kosong (ini diperlukan karena bagaimana PowerShell melakukan pencocokan regex dan bagaimana memindahkan pointer melalui input dan agak menjengkelkan untuk tujuan bermain golf), kemudiansort
hasilnya dalam urutan menaik. Kami menyimpan array angka itu ke dalam$x
, dan menggunakannya sebagai input ke|?{...}
filter untuk menarik hanya mereka yang prima. Digit-digit utama tersebut disimpan$y
untuk digunakan nanti.Kami kemudian dibagi
$x
menjadi dua komponen. Digit pertama (yaitu, terkecil) disimpan ke dalam$a
, sedangkan sisanya dilewatkan ke$b
. Jika$x
hanya memiliki satu digit, maka$b
akan kosong / null. Kami kemudian perlu melakukan casting ulang$a
sebagai array, jadi kami menggunakan operator koma seperti untuk melakukannya.Selanjutnya, kita perlu membangun semua kemungkinan permutasi digit. Ini diperlukan agar pengujian divisi kami nanti melewati banyak angka dan membuat semuanya lebih cepat secara keseluruhan.
Selama ada elemen yang tersisa
$b
, kita lepaskan digit pertama ke dalam$z
dan biarkan sisanya masuk$b
. Kemudian, kita perlu menumpuk ke$a
dalam hasil dari beberapa mengiris tali dan dicing. Kami mengambil$a+$y
sebagai array yang Rangkaian, dan untuk setiap elemen kita membangun string baru$c
, maka loop melalui$c
's.length
dan insert$z
ke dalam setiap posisi, termasuk mengawali$z$c
dan menambahkan$c$z
, kemudianselect
ing hanya-u
elemen nique. Itu lagi array-digabungkan dengan$a
dan disimpan kembali ke dalam$a
. Ya, ini memang berakhir dengan hal konyol terjadi, seperti Anda bisa mendapatkan3333
masukan117
, yang sebenarnya bukan permutasi, tetapi ini jauh lebih pendek daripada mencoba menyaringnya secara eksplisit, memastikan bahwa kita mendapatkan setiap permutasi, dan hanya sedikit lebih lambat.Jadi, sekarang
$a
memiliki array semua permutasi yang mungkin (dan kemudian beberapa) dari digit faktor. Kita perlu mengatur ulang$x
untuk menjadi batas atas dari hasil yang mungkin dengan|sort
memasukkan angka dalam-des
urutan cending dan-join
menggabungkannya kembali. Jelas, tidak ada nilai output yang bisa lebih besar dari angka ini.Kami menetapkan larik pembantu kami
$l
menjadi larik nilai yang sebelumnya telah kami lihat. Selanjutnya, kami mengeluarkan setiap nilai dari$a
(yaitu permutasi tersebut) yang prima, dan memasukkan satu loop yang merupakan waktu terbesar dari seluruh program ...Setiap iterasi, kami beralih dari
0
batas atas kami$x
, bertambah dengan elemen saat ini$j
. Selama$i
nilai yang kami pertimbangkan bukan kelipatan dari nilai sebelumnya (itulah0-notin($l|%{$i%$_})
bagiannya), itu adalah kandidat potensial untuk output. Jika kita mengambilf
aktor$i
,sort
mereka, dan mereka-eq
ual$x
, kemudian menambahkan nilai ke dalam pipa. Pada akhir loop, kami menambahkan elemen kami saat ini$j
ke$l
array kami untuk digunakan di lain waktu, karena kami telah mempertimbangkan semua nilai tersebut.Akhirnya, kami
|?{$_-ne$n}
berusaha untuk menarik keluar yang bukan elemen input. Mereka semua tertinggal di jalur pipa dan hasilnya tersirat.Contohnya
sumber
CJam ,
2623 byteCobalah online
Penjelasan
Menggabungkan dua angka selalu memberikan hasil yang lebih besar daripada mengalikannya. Jadi jumlah terbesar yang perlu kita pertimbangkan adalah jumlah terbesar yang dapat kita bentuk dari digit faktorisasi utama input, yang hanya semua digit yang diurutkan dalam urutan menurun. Untuk angka yang diberikan, batas atas ini cukup kecil sehingga kita dapat memeriksa setiap angka dalam rentang untuk mengetahui apakah itu faktor teman utama:
sumber
05AB1E , 17 byte
Kode:
Penjelasan:
Menggunakan pengkodean CP-1252 . Cobalah online!
sumber
Pyth, 17
Suite uji .
Menggunakan pengamatan yang sama seperti dari pos Martin .
Ekspansi:
sumber
JavaScript (ES6),
163158 byteEdit : Telah diklarifikasi bahwa prime seperti 23 harus mengembalikan [6] dan bukannya set hasil kosong. Disimpan 5 byte dengan menghapus aturan yang sekarang tidak berguna yang - sengaja - mencegah hal itu terjadi.
Test case terakhir dikomentari sehingga snippet ini berjalan cukup cepat, meskipun harus selesai dalam waktu kurang dari satu menit juga.
sumber
PHP 486 byte
mungkin bisa lebih pendek dengan algoritma yang tidak sesuai dengan buku.
(tapi saya suka jumlah byte saat ini)
kerusakan
sumber
Sebenarnya, 27 byte
Ini menggunakan algoritma yang sama yang telah digunakan Martin , Adnan , FryAmTheEggman , dan Dennis . Saran golf diterima. Cobalah online!
Tidak melakukanolf
sumber
Powershell, 147 byte (versi CodeGolf)
Catatan: Script menyelesaikan kasus uji terakhir kurang dari 3 menit pada notebook lokal saya. Lihat solusi "kinerja" di bawah ini.
Skrip uji yang kurang golf:
Keluaran:
Powershell, 215 byte (versi "Kinerja")
Catatan: Saya percaya persyaratan kinerja bertentangan dengan prinsip GodeGolf. Tetapi karena ada aturan
Your program should solve any of the test cases below in less than a minute
, saya membuat dua perubahan untuk memenuhi aturan:-split'(.)'-ne''
alih-alih kode pendek|% t*y
;Setiap perubahan mengurangi setengah waktu evaluasi. Tolong jangan berpikir bahwa saya telah menggunakan semua fitur untuk meningkatkan kinerja. Hanya itu saja sudah cukup untuk memenuhi aturan.
Skrip uji yang kurang golf:
Keluaran:
sumber
Japt, 18 byte
Cobalah
sumber