Beberapa waktu yang lalu, saya melihat faktorisasi utama 27000:
27000 = 2 3 × 3 3 × 5 3
Ada dua hal khusus tentang itu:
- consecutive-prime : Bilangan prima berturut-turut: 2 adalah prima 1, 3 adalah prima 2, 5 adalah prima 3.
- konstanta-eksponen : Eksponen adalah sama untuk setiap prime (selalu 3)
Secara matematis diungkapkan:
Integer x adalah bilangan berurutan / eksponen konstan jika ada bilangan bulat positif n , k , m sehingga x = p n m × p n +1 m × ... × p n + k m , di mana p j adalah prime j -th
Tugas Anda adalah menguji apakah bilangan bulat positif memenuhi persyaratan ini.
Memasukkan:
Bilangan bulat positif> 1, dalam bentuk apa pun yang wajar.
Keluaran:
Salah satu dari dua nilai, setidaknya satu di antaranya harus konstan, menunjukkan apakah inputnya adalah bilangan berurutan / prima konstan.
Kasus tepi:
- bilangan prima adalah benar, karena faktorisasi untuk prime p adalah p 1
- nomor lain yang dapat ditulis sebagai p m di mana p adalah bilangan prima juga benar.
Aturan:
- Celah standar berlaku.
- Tidak ada kekhawatiran tentang integer overflow, tetapi angka hingga 255 harus berfungsi.
- Kode terpendek dalam byte menang.
Kasus uji:
Benar:
2
3
4
5
6
7
8
9
11
13
15
27000
456533
Falsy:
10
12
14
72
10000000
Berikut ini adalah skrip python yang menghasilkan beberapa kasus uji.
x = Pn^m
bagian. Saya berasumsi Anda maksudkan Pn adalah perdana ke-nJawaban:
05AB1E , 4 byte
Cobalah online!
Penjelasan
sumber
ÎÓKË
hanya itu yang bisa saya pikirkan selain ini, yang bagus ... saya sedang berpikirß
tetapi itu berlawanan dengan apa yang saya pikirkan.Regex (ECMAScript),
276205201193189 byteMembandingkan multiplisitas (eksponen) dari faktor prima yang berbeda adalah masalah yang menarik untuk dipecahkan dengan regex ECMAScript - kurangnya referensi yang bertahan melalui iterasi dari loop membuatnya menjadi tantangan untuk menghitung apa pun. Sekalipun menghitung sifat numerik yang dipermasalahkan adalah mungkin, seringkali pendekatan yang lebih tidak langsung membuat golf lebih baik.
Seperti dengan posting regex ECMA saya yang lain, saya akan memberikan peringatan spoiler: Saya sangat merekomendasikan belajar bagaimana memecahkan masalah matematika unary di ECMAScript regex. Ini adalah perjalanan yang menarik bagi saya, dan saya tidak ingin merusaknya untuk siapa pun yang mungkin ingin mencobanya sendiri, terutama mereka yang tertarik pada teori bilangan.Lihat posting ini sebelumnya untuk daftar masalah yang direkomendasikan untuk ditandai dengan spoiler bertanda satu per satu.
Jadi jangan membaca lebih jauh jika Anda tidak ingin beberapa sihir regex unary canggih dimanjakan untuk Anda . Jika Anda ingin mencoba mencari tahu sendiri keajaiban ini, saya sangat menyarankan memulai dengan menyelesaikan beberapa masalah dalam ECMAScript regex sebagaimana diuraikan dalam pos yang ditautkan di atas.
Payload utama dari regex yang saya kembangkan sebelumnya ternyata sangat berlaku untuk tantangan ini. Itu adalah regex yang menemukan yang terbaik dari multiplisitas tertinggi . Solusi pertama saya untuk itu sangat panjang, dan saya kemudian turun golf secara bertahap, pertama menulis ulang untuk menggunakan lookahead molekuler , dan kemudian porting kembali ke ECMAScript menggunakan teknik canggih untuk mengatasi kekurangan lookahead molekuler , dan kemudian bermain golf menjadi jauh lebih kecil dari solusi ECMAScript polos asli.
Bagian dari regex yang berlaku untuk masalah ini adalah langkah pertama, yang menemukan Q, faktor terkecil N yang memiliki semua faktor prima. Setelah kita memiliki angka ini, yang harus kita lakukan untuk menunjukkan bahwa N adalah "angka eksponen konstan" dibagi N dengan Q sampai kita tidak bisa lagi; jika hasilnya 1, semua bilangan prima memiliki multiplisitas yang sama.
Setelah mengirimkan jawaban menggunakan algoritme yang saya kembangkan sebelumnya untuk menemukan Q, saya menyadari bahwa itu dapat dihitung dengan cara yang sama sekali berbeda: Temukan faktor N bebas kuadrat terbesar (menggunakan algoritme yang sama dengan regex nomor Carmichael saya ). Ternyata, ini tidak menimbulkan kesulitan sama sekali * dalam hal melangkah di sekitar kekurangan molekul lookahead dan melihat-panjang variabel di belakang (tidak perlu menarik teknik canggih yang sebelumnya digunakan), dan 64 byte lebih pendek! Selain itu menghilangkan kompleksitas memperlakukan N bebas dan N prima sebagai kasus khusus yang berbeda, menjatuhkan 7 byte lain dari solusi ini.
(Masih ada masalah lain yang memerlukan teknik canggih yang sebelumnya digunakan di sini untuk mengurangi perhitungan Q, tetapi saat ini tidak satupun dari mereka yang diwakili oleh posting PPCG saya.)
Saya menempatkan tes multiplisitas sebelum tes bilangan prima berturut-turut karena yang terakhir jauh lebih lambat; melakukan tes yang dapat gagal lebih cepat terlebih dahulu membuat regex lebih cepat untuk input yang didistribusikan secara merata. Golf juga lebih baik untuk didahulukan, karena menggunakan lebih banyak referensi (yang akan lebih mahal jika dua digit).
Saya dapat menjatuhkan 4 byte dari regex ini (193 → 189) menggunakan trik yang ditemukan oleh Grimy yang dapat memperpendek pembagian dalam kasus bahwa hasil bagi dijamin lebih besar dari atau sama dengan pembagi.
^(?=(|(x+)\2*(?=\2$))((?=(xx+?)\4*$)(?=(x+)(\5+$))\6(?!\4*$))*x$)(?=.*$\2|((?=((x*)(?=\2\9+$)x)(\8*$))\10)*x$)(?!(((x+)(?=\13+$)(x+))(?!\12+$)(x+))\11*(?=\11$)(?!(\15\14?)?((xx+)\18+|x?)$))
Cobalah online!
* Masih lebih bersih dengan lookahead molekuler, tanpa kasus khusus untuk N yang bebas persegi. Ini turun 6 byte, menghasilkan solusi
195187183 byte :^(?=(?*(x+))\1*(?=\1$)((?=(xx+?)\3*$)(?=(x+)(\4+$))\5(?!\3*$))*x$)(?=((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$)(?!(((x+)(?=\12+$)(x+))(?!\11+$)(x+))\10*(?=\10$)(?!(\14\13?)?((xx+)\17+|x?)$))
Ini porting ke tampilan panjang variabel:
Regex (ECMAScript 2018),
198195194186182 byte^(?=(x+)(?=\1*$)(?<=^x((?<!^\5*)\3(?<=(^\4+)(x+))(?<=^\5*(x+?x)))*))((?=((x*)(?=\1\8+$)x)(\7*$))\9)*x$(?<!(?!(\14\16?)?((xx+)\12+|x?)$)(?<=^\13+)((x+)(?<!^\15+)((x+)(?<=^\17+)(x+))))
Cobalah online!
sumber
.*$\2
dengan\2^
^(?=(|(x+)\2*(?=\2$))(((?=(xx+?)\5*$)(?=(x+)(\6+$))\7(?!\5*$))*x$))(?!(((xx+)(?=\10+$)(x+))(?!\9+$)(x+))\8*(?=\8$)(?!(\12\11?)?(xx+)\14+$))((?=((x*)(?=\2\17+$)x)(\16*$))\19)*\3$
Jelly ,
1365 byteCobalah online!
Masih kalah ... (terima kasih Erik untuk -1 byte)
Penjelasan
sumber
œl
->t
. Tidak ada alasan untuk mengekor nol untuk hadir dalam output outputE.JavaScript (ES6), 87 byte
Mengembalikan 0 untuk truey atau integer non-nol untuk falsy.
Cobalah online!
Berkomentar
sumber
j||i
kei
. Sekarang menghasilkan banyak positif palsu.CJam ,
3029 byteCobalah online!
Jawaban pertama saya setelah hampir 2 (!) - istirahat setahun, jadi mungkin bisa bermain golf lebih banyak. Ini adalah blok yang mengambil input sebagai integer (juga bisa dipetakan untuk array integer).
Penjelasan
sumber
Stax ,
56 byteJalankan dan debug itu
Dibongkar, tidak diserang, dan dikomentari, sepertinya ini.
Sunting:
Ini tidak berfungsiIni berfungsi sekarang.512
. Saya akan memikirkannya dan semoga perbaikan nanti.sumber
Stax , 9 byte
1 benar, 0 palsu
Jalankan dan debug itu
Penjelasan
Mungkin bisa bermain golf lebih banyak, tetapi ini mencakup kasus-kasus yang saya lewatkan dalam solusi terakhir.
sumber
MATL ,
12 1110 byteCobalah di MATL Online!
Terima kasih kepada Luis Mendo untuk bagian hapus-terkemuka-nol. Dia juga menunjukkan bahwa bertukar nilai kebenaran diperbolehkan, jadi ini mengembalikan 0 untuk angka yang memenuhi persyaratan tantangan dan nilai positif apa pun sebaliknya.
Grosso Modo, ini menghasilkan eksponen dari faktorisasi prima berurutan, menghilangkan nol terkemuka dan menghitung standar deviasi.
sumber
0iYFhdz
berfungsi untuk 7 byte: tambahkan 0 ke eksponen faktorisasi sekuensial, perbedaan berurutan, jumlah non-nol. Hasilnya adalah1
jika input memenuhi persyaratanJava 10,
223191178176168 byteKembali
1
sebagai kebenaran, dan>=2
sebagai kepalsuan.Cobalah online.
Penjelasan:
Beberapa contoh input:
n=15
:1
untuk prime 2 pertama (karena 15 tidak dapat dibagi oleh 2).1
ke0
begitu kita berada di prime 3. Sejak 15 dibagi oleh 3,n
menjadi 5 (15/3 1 ), dan Set menjadi[] → [1]
.n
menjadi 1 (5/5 1 ), dan Set tetap sama ([1] → [1]
).n=1
, jadi kita hentikan loop luar. Set ([1]
) hanya berisi satu item,1
dari kedua bilangan prima 3 dan 5 yang berdekatan, jadi kami mengembalikan true.n=14
:1
ke0
untuk prime 2 pertama (karena 14 dapat dibagi oleh 2).n
menjadi 7 (14/2 1 ), dan Set menjadi[] → [1]
.n
tetap sama, dan Set menjadi[1] → [1,0]
.n
tetap sama, dan Set tetap sama juga ([1,0] → [1,0]
).n
menjadi 1 (7/7 1 ), dan Set tetap sama ([1,0] → [1,0]
).n=1
, jadi kita hentikan loop luar. Set ([1,0]
) berisi dua item,1
dari bilangan prima 2 dan 7 yang tidak berdekatan, dan0
dari bilangan prima 3 dan 5, jadi kami mengembalikan false.n=72
:1
ke0
untuk prime 2 pertama, karena 72 dibagi 2 oleh (berkali-kali). Jadin
menjadi 9 (72/2 3 ), dan Set menjadi[] → [3]
.n
menjadi 1 (9/3 2 ), dan Set menjadi[3] → [3,2]
.n=1
, jadi kita hentikan loop luar. Set ([3,2]
) berisi dua item, dari3
dari prime 2, dan2
dari prime 3, jadi kami mengembalikan false.sumber
<2
dan mengembalikan int (tentukan bahwa Anda mengembalikan 1 untuk kebenaran).1
adalah benar dan2
atau lebih tinggi adalah dusta. Terima kasih.J , 16 byte
Terima kasih banyak kepada FrownyFrog untuk -8 byte!
Cobalah online!
Solusi lama saya:
J , 24 byte
Cobalah online!
Penjelasan:
_&q:
eksponen utama{.@I.}.]
menghapus nol terkemuka dengan menemukan elemen non-nol pertama:1=[:#@~.
menguji apakah semua angka yang tersisa sama:sumber
Sekam , 11 byte
Cobalah online!
Menghasilkan 0 jika bukan angka berurutan-prima / konstan-eksponen.
sumber
MATL , 7 byte
Hasilnya adalah
1
jika input memenuhi persyaratan.Cobalah online! Atau verifikasi semua kasus uji
Penjelasan
sumber
Oktaf , 67 byte
Cobalah online!
Saya percaya ini adalah satu-satunya solusi yang menggunakan histogram.
Penjelasan:
Ini membuat histogram, di mana variabel yang akan dihitung adalah faktor input, dan ditempatkan di tempat sampah
primes(x)
, yang semuanya lebih rendah dari input. Kami kemudian menemukan lokasi faktor prima, mengambil perbedaan antara masing-masing indeks dan mengurangi satu. Jika ada elemen yang tidak nol (yaitu selisih indeks bilangan prima bukan 1), maka ini akan menghasilkan nilai palsu, jika tidak maka akan mengembalikan nilai yang sebenarnya.Kami kemudian chech bahwa semua elemen non-nol dalam histogram sama dengan elemen maksimum. Jika ada nilai yang tidak sama maka ini akan menghasilkan nilai palsu, jika tidak maka akan mengembalikan nilai yang benar.
Jika kedua blok itu benar maka input kami adalah bilangan eksponen konstan prima berturut-turut!
sumber
APL (Dyalog Extended) , 28 byte
Cobalah online!
Bagaimana:
sumber
Bahasa Wolfram (Mathematica) , 65 byte
Cobalah online!
sumber
Pari / GP , 63 byte
Cobalah online!
sumber
J , 14 byte
1 dalam output menunjukkan eksponen konstan berturut-turut.
Cobalah online!
sumber
Bersihkan , 127 byte
Cobalah online!
Menentukan fungsi yang
? :: Int -> Bool
digunakan$ :: Int -> [Int]
untuk memfaktisasi dan@ :: Int -> Bool
memeriksa primality.sumber
APL (NARS) 41 karakter, 82 byte
{π⍵} adalah faktorisasi fungsi argumen ⍵ dalam daftar faktor prima (ulangi jika satu prime muncul lebih banyak waktu);
{1π⍵} adalah fungsi prime berikutnya (perhatikan bahwa dalam kasus ini argumennya bukan skalar tetapi satu array bilangan bulat). uji:
sumber