Definisi
- Sebuah persegi yang sempurna adalah bilangan bulat yang dapat dinyatakan sebagai kuadrat dari bilangan bulat lain. Sebagai contoh,
36
adalah kuadrat sempurna karena6^2 = 36
. - Angka squarefree adalah bilangan bulat yang tidak dapat dibagi dengan kuadrat sempurna mana pun, kecuali oleh
1
. Misalnya,10
adalah nomor bebas kuadrat. Namun,12
bukan nomor bebas kuadrat, karena12
dapat dibagi oleh4
dan4
merupakan kuadrat sempurna.
Tugas
Diberikan bilangan bulat positif n
, menghasilkan angka bebas-kuadrat terbesar yang membelah n
.
Testcases
n output
1 1
2 2
3 3
4 2
5 5
6 6
7 7
8 2
9 3
10 10
11 11
12 6
13 13
14 14
15 15
16 2
17 17
18 6
19 19
20 10
21 21
22 22
23 23
24 6
25 5
26 26
27 3
28 14
29 29
30 30
31 31
32 2
33 33
34 34
35 35
36 6
37 37
38 38
39 39
40 10
41 41
42 42
43 43
44 22
45 15
46 46
47 47
48 6
49 7
50 10
Mencetak gol
Ini adalah kode-golf . Jawaban terpendek dalam byte menang.
Celah standar berlaku.
Referensi
code-golf
math
arithmetic
number-theory
Biarawati Bocor
sumber
sumber
Jawaban:
05AB1E , 2 byte
Cobalah online!
Bagaimana itu bekerja
sumber
Brachylog , 3 byte
Cobalah online!
Jawaban yang sangat asli ...
Penjelasan
sumber
JavaScript (ES6),
55545046 byteMengutip OEIS :
a (n) adalah pembagi terkecil dari n sehingga membagi n ^ n
Implementasi yang diperbarui:
a (n) adalah
pembagiterkecildari nbilangan bulat positif Anda sehingga n membaginyasumber
MATL ,
64 byte2 byte disimpan dengan bantuan dari @LeakyNun
Cobalah online!
Penjelasan
Pertimbangkan input
48
.sumber
Jelly , 4 byte
Cobalah online!
sumber
CJam , 8 byte
Mengapa setiap operasi dalam program ini harus 2 byte -_-
Cobalah online!
sumber
Retina ,
363028 byteInput dan output di unary .
Cobalah online! (Termasuk header dan footer untuk konversi desimal <-> unary dan untuk menjalankan beberapa test case sekaligus.)
Penjelasan
Idenya adalah untuk mencocokkan input dengan kuadrat beberapa faktor. Regex dasar untuk mencocokkan kotak menggunakan referensi maju untuk mencocokkan jumlah bilangan bulat ganjil berturut-turut:
Karena kami tidak ingin mencocokkan kotak yang sempurna, tetapi angka yang dapat dibagi dengan kotak, kami menggantinya
1
dengan backreference itu sendiri:Jadi sekarang kelompok terluar
1
akan digunakan n kali di mana n 2 adalah kuadrat terbesar yang membagi input dan kelompok2
menyimpan faktor yang tersisa. Yang kita inginkan adalah membagi bilangan bulat dengan n untuk menghapus kuadrat. Hasilnya dapat dinyatakan sebagai jumlah iterasi grup1
kali grup2
, tetapi ini agak sulit dilakukan. Retina's$*
mungkin akan segera ditingkatkan untuk mengambil token non-karakter sebagai argumen kanannya dalam hal ini kita bisa dengan mudah mengganti ini$#1$*$2
, tetapi itu belum berfungsi.Sebagai gantinya, kami menguraikan angka ganjil secara berbeda. Mari kita kembali ke contoh sederhana dari pencocokan kuadrat sempurna dengannya
(^1|11\1)+$
. Alih-alih memiliki penghitung\1
yang diinisialisasi ke 1 dan bertambah 2 pada setiap iterasi, kami akan memiliki dua penghitung. Satu diinisialisasi ke 0 dan satu diinisialisasi ke 1 , dan keduanya bertambah 1 pada setiap iterasi. Jadi pada dasarnya kami telah mendekomposisi angka ganjil 2n + 1 menjadi (n) + (n + 1) . Manfaatnya adalah kita akan berakhir dengan n di salah satu grup. Dalam bentuknya yang paling sederhana, yang terlihat seperti ini:Di mana
\2
adalah n dan\3
adalah n + 1 . Namun, kita dapat melakukan ini sedikit lebih efisien dengan memperhatikan bahwa n +1 dari satu iterasi sama dengan n dari iterasi berikutnya, sehingga kita dapat menghemat di1
sini:Sekarang kita hanya perlu kembali menggunakan faktor awal alih-alih
1
mencocokkan input yang dibagi dengan kuadrat sempurna:Sekarang yang perlu kita lakukan adalah mengganti semua ini dengan
$3
di akhir, yang menyimpan faktor awal dikalikan jumlah langkah, yang menjatuhkan satu faktor kuadrat dari input.Ini dilakukan berulang kali dengan
+
di bagian paling awal program, untuk memperhitungkan input yang mengandung kekuatan lebih tinggi daripada kotak.sumber
Oktaf, 27 byte
Pendekatan serupa dengan jawaban lainnya. Perbedaannya adalah: Fungsi memiliki nama yang jauh lebih panjang. Saya percaya kode itu menjelaskan dirinya sendiri: Membawa
prod
produkunique
utamafactor
dari sebuah angka.sumber
Bahasa Wolfram,
2928 byte-1 Terima kasih kepada @Martin Ender ♦
Penjelasan:
sumber
Times@@(#&@@@FactorInteger@#)&
Most
meninggalkannya sebagai daftar. Anda perluFirst
mendapatkan nilainya.Python , 37 byte
Cobalah online!
Pembagi persegi bebas terbesar
n
adalah angka terkecilr
dengan semuan
faktor utama. Kita dapat memeriksa ini sebagair**n%n==0
, karenar**n
membuatn
salinan dari masing-masing faktor utamar
, dan hanya dapat dibagi dengann
jika masing-masingn
faktor utama diwakili.Ini
1>>r**n%n
setara denganint(r**n%n==0)
. JikaTrue
dapat digunakan output 1, ini 2 byte lebih pendek untuk dilakukan.sumber
Matematika , 40 byte
Cobalah online!
sumber
Times@@#&@@Transpose@FactorInteger@#&
menghemat 3 byte (#&@@
adalah trik standar untuk[[1]]
dan dalam kasus seperti ini sering dapat menyimpan beberapa byte tambahan pada tanda kurung).Thread
bukanTranspose
. Di Mathematica ada juga operator 3-byteTranspose
, tetapi saya tidak tahu apakah Matematika mendukungnya.#&@@(1##&@@FactorInteger@#)&
menghindari keharusan untukTranspose
sama sekali. (1##&@@
HanyaTimes@@
menyamar, yang bekerja besar pada pasangan memerintahkan dihasilkanFactorInteger
, dan'#&@@
yangFirst@
menyamar.)Alice , 4 byte
Cobalah online!
Input dan output diberikan sebagai titik kode karakter (berfungsi untuk semua titik kode Unicode yang valid).
Penjelasan
Yah, Alice memiliki built-in
D
yang definisinya adalah "Faktor prima duplikat". Yaitu, selama suatu nilai dapat dibagi oleh beberapa p 2 untuk sebuah prima p , bagi nilai tersebut dengan p . Ini kebetulan persis fungsi yang diperlukan dalam tantangan ini. Selebihnya hanya input, output, penghentian program.Alasan ini ditambahkan ke Alice sebenarnya tidak ada hubungannya dengan urutan bilangan bulat ini. Saya mencoba untuk tetap berpegang pada tema mengasosiasikan pembagi dengan substring dan faktor prima dengan karakter. Dan saya membutuhkan fungsi yang sesuai dengan "karakter deduplicate" (yang jauh lebih berguna secara umum, karena memungkinkan Anda memperlakukan string sebagai set, terutama bila digunakan bersama dengan berbagai operator multiset).
sumber
Haskell , 31 byte
Cobalah online!
sumber
Pyke , 3 byte
Cobalah online!
sumber
Prolog (SWI) ,
8439 byteCobalah online!
Mengadaptasi gagasan jawaban Haskell @ xnor untuk Prolog.
sumber
PHP, 70 Bytes
Cobalah online!
sumber
Pyth,
86 byte* -2 byte terima kasih kepada @LeakyNun
Akan menjadi 3 jika Pyth memiliki built-in untuk produk daftar ...
Cobalah!
sumber
*F+1{P
.C,
6550 byteTerima kasih kepada @ Ørjan Johansen karena telah menghapus kebutuhan
r
. Berkat ini dan beberapa trik kotor lainnya saya bisa memeras 15 byte!while
hilang dan diganti dengan||
dan indeks twiddling.<=
seharusnya selama ini<
.<=
beralih ke<
dengan menggerakkan kenaikan untuk mendapatkann%(++d*d)
(harus didefinisikan dengan baik karena prioritas operator).Kode asli:
sumber
r
dan menggunakannyawhile(n%(d*d)<1)n/=d;
.++d*d
sama sekali tidak didefinisikan dengan baik oleh standar C - ini adalah kasus klasik dari perilaku yang secara eksplisit tidak terdefinisi. Tapi bagaimanapun, kita akan mengimplementasikannya di sini.d++<n
, yang didefinisikan dengan baik, masih berfungsi? Saya pikir versi lama berjalan jauh ken+1
(tidak berbahaya).d++<n
kebenaran, untuk beberapa alasan saya tidak melihat itu ketika saya menulis ulang kode.Aksioma, 89 byte
tes dan hasil
ini adalah fungsi tidak menggunakan faktor ()
tetapi hanya 125 byte
sumber
R, 52 byte
dibaca
n
dari stdin. Memerlukangmp
pustaka untuk diinstal (agar TIO tidak berfungsi). Menggunakan pendekatan yang sama dengan banyak jawaban di atas, tetapi crash pada input1
, karenafactorize(1)
mengembalikan vektor kelas kosongbigz
, yang crashunique
, sayangnya.sumber
Sebenarnya , 2 byte
Cobalah online!
Penjelasan:
sumber
Pari / GP , 28 byte
Cobalah online!
sumber
Pyt , 3 byte
Penjelasan:
sumber