Abaikan semua kotak, kamu yang memecah belah aku


37

Definisi

  • Sebuah persegi yang sempurna adalah bilangan bulat yang dapat dinyatakan sebagai kuadrat dari bilangan bulat lain. Sebagai contoh, 36adalah kuadrat sempurna karena 6^2 = 36.
  • Angka squarefree adalah bilangan bulat yang tidak dapat dibagi dengan kuadrat sempurna mana pun, kecuali oleh 1. Misalnya, 10adalah nomor bebas kuadrat. Namun, 12bukan nomor bebas kuadrat, karena 12dapat dibagi oleh 4dan 4merupakan 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 . Jawaban terpendek dalam byte menang.

Celah standar berlaku.

Referensi


1
... dan disebut radikal - jadi tahun 1980-an!
Jonathan Allan

Terkait erat , cukup gandakan dua output. Sunting: Tidak apa-apa, ini hanya cocok pada angka cubefree.
xnor

Jawaban:


45

05AB1E , 2 byte

fP

Cobalah online!

Bagaimana itu bekerja

f   Implicitly take input and compute the integer's unique prime factors.
 P  Take the product.

26
> _> benar-benar ... ??
HyperNeutrino

@HyperNeutrino ya - jika angka tidak bebas persegi itu karena beberapa faktor utama (s) memiliki multiplisitas.
Jonathan Allan

@ Jonathanathan Allan Saya hanya tertarik pada built-in untuk faktor prima yang unik. Saya berharap Jelly punya salah satu dari mereka ...
HyperNeutrino

@HyperNeutrino Ini 05AB1E, biasakanlah. 05AB1E memiliki beberapa builtin yang benar-benar berlebihan yang tampaknya menyimpan byte.
Erik the Outgolfer

6
Koreksi, "simpan byte", tidak mungkin ada tentang itu.
Draco18s

14

Brachylog , 3 byte

ḋd×

Cobalah online!

Jawaban yang sangat asli ...

Penjelasan

ḋ          Take the prime factors of the Input
 d         Remove duplicates
  ×        Multiply

1
Sekali lagi, Brachylog mengalahkan Jelly karena atom dua byte hanya satu byte di sini. > :-P
HyperNeutrino

4
Jelly yang memiliki banyak builtin sering dianggap sebagai keuntungan; tetapi lebih banyak builtin berarti bahwa mereka membutuhkan nama yang lebih panjang rata-rata. Jadi ada pengorbanan yang terlibat dalam desain bahasa golf.

2
Saya tidak mencoba menjadi "orang itu", dan mungkin saya hanya salah paham penghitungan byte, tetapi bukankah ini 6 byte? mothereff.in/byte-counter#ḋd ×
Kapten Man

5
@CaptainMan Brachylog menggunakan halaman kode kustom 256 karakter yang dapat Anda temukan di sini .
Melegalkan

14

JavaScript (ES6), 55 54 50 46 byte

Mengutip OEIS :
a (n) adalah pembagi terkecil dari n sehingga membagi n ^ n

Implementasi yang diperbarui:
a (n) adalah pembagi terkecil dari n bilangan bulat positif Anda sehingga n membaginya

let f =

n=>(g=(p,i=n)=>i--?g(p*p%n,i):p?g(++u):u)(u=1)

for(n = 1; n <= 50; n++) {
  console.log(n,f(n));
}


Pendekatan yang bagus untuk masalah, esp. diberikan kurangnya faktorisasi
bawaan

12

MATL , 6 4 byte

2 byte disimpan dengan bantuan dari @LeakyNun

Yfup

Cobalah online!

Penjelasan

Pertimbangkan input 48.

Yf   % Implicit input. Push prime factors with repetitions.  STACK: [2 2 2 2 3]
u    % Unique.                                               STACK: [2 3]
p    % Product of array. Implicit display.                   STACK: 6


@ LeakyNun Heh, saya akan memposting itu :-) Terima kasih
Luis Mendo


9

CJam , 8 byte

rimf_&:*

Mengapa setiap operasi dalam program ini harus 2 byte -_-

Cobalah online!

ri       e# Read int from input
  mf     e# Get the prime factors
    _&   e# Deduplicate
      :* e# Take the product of the list

Saya tidak dapat menemukan cara untuk deduplicate. Bagus!
Luis Mendo

@LuisMendo Saya baru saja menemukan itu. Saya selalu berpikir itu adalah persimpangan multiset tapi ternyata itu hanya persimpangan biasa.
Business Cat

9

Retina , 36 30 28 byte

+`((^|\3)(^(1+?)|\3\4))+$
$3

Input 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:

(^1|11\1)+$

Karena kami tidak ingin mencocokkan kotak yang sempurna, tetapi angka yang dapat dibagi dengan kotak, kami menggantinya 1dengan backreference itu sendiri:

(^(1+?)|\1\2\2)+$

Jadi sekarang kelompok terluar 1akan digunakan n kali di mana n 2 adalah kuadrat terbesar yang membagi input dan kelompok 2menyimpan faktor yang tersisa. Yang kita inginkan adalah membagi bilangan bulat dengan n untuk menghapus kuadrat. Hasilnya dapat dinyatakan sebagai jumlah iterasi grup 1kali grup 2, 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 \1yang 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:

((^|1\2)(^1|1\3))+$

Di mana \2adalah n dan \3adalah 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 di 1sini:

((^|\3)(^1|1\3))+$

Sekarang kita hanya perlu kembali menggunakan faktor awal alih-alih 1mencocokkan input yang dibagi dengan kuadrat sempurna:

((^|\3)(^(1+?)|\3\4))+$

Sekarang yang perlu kita lakukan adalah mengganti semua ini dengan $3di 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.


8

Oktaf, 27 byte

@(x)prod(unique(factor(x)))

Pendekatan serupa dengan jawaban lainnya. Perbedaannya adalah: Fungsi memiliki nama yang jauh lebih panjang. Saya percaya kode itu menjelaskan dirinya sendiri: Membawa prodproduk uniqueutama factordari sebuah angka.


Anda ninja saya dengan ~ 30 detik :)
Kritixi Lithos


7

Bahasa Wolfram, 29 28 byte

-1 Terima kasih kepada @Martin Ender ♦

Most[1##&@@FactorInteger@#]&

Penjelasan:

           FactorInteger@#    (*Get prime factorization as {{a,b},{c,d}}*)
     1##&@@                   (*Multiply list elements together, to get the product of the factors and the product of their exponents*)
Most[                     ]&  (*Take the first element*)

2
Baru menyadari ini pada dasarnya adalah komentar @ GregMartin pada jawaban Matematika, hanya kurang golf ...
Scott Milner

Jangan merasa buruk, saya punya jawaban yang bahkan kurang golfTimes@@(#&@@@FactorInteger@#)&
Ian Miller

Mostmeninggalkannya sebagai daftar. Anda perlu Firstmendapatkan nilainya.
Ian Miller

@IanMiller Saya menyadari itu, tetapi kurang byte untuk hanya mengembalikan daftar dengan hanya satu elemen. Saya berasumsi bahwa itu ok, karena masih merupakan output yang masuk akal.
Scott Milner

7

Python , 37 byte

f=lambda n,r=1:1>>r**n%n or-~f(n,r+1)

Cobalah online!

Pembagi persegi bebas terbesar nadalah angka terkecil rdengan semua nfaktor utama. Kita dapat memeriksa ini sebagai r**n%n==0, karena r**nmembuat nsalinan dari masing-masing faktor utama r, dan hanya dapat dibagi dengan njika masing-masing nfaktor utama diwakili.

Ini 1>>r**n%nsetara dengan int(r**n%n==0). Jika Truedapat digunakan output 1, ini 2 byte lebih pendek untuk dilakukan.

f=lambda n,r=1:r**n%n<1or-~f(n,r+1)

6

Matematika , 40 byte

Times@@(Transpose@FactorInteger@#)[[1]]&

Cobalah online!


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).
Martin Ender

Anda juga dapat menggunakan Threadbukan Transpose. Di Mathematica ada juga operator 3-byte Transpose, tetapi saya tidak tahu apakah Matematika mendukungnya.
Martin Ender

6
#&@@(1##&@@FactorInteger@#)&menghindari keharusan untuk Transposesama sekali. ( 1##&@@Hanya Times@@menyamar, yang bekerja besar pada pasangan memerintahkan dihasilkan FactorInteger, dan '#&@@yang First@menyamar.)
Greg Martin

@GregMartin itu pada dasarnya solusi Anda sendiri, jangan ragu untuk mempostingnya, jika Anda mau.
Pavel

Sepertinya Scott Milner mendapatkannya :)
Greg Martin

5

Alice , 4 byte

iDo@

Cobalah online!

Input dan output diberikan sebagai titik kode karakter (berfungsi untuk semua titik kode Unicode yang valid).

Penjelasan

Yah, Alice memiliki built-in Dyang 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).


Bagian yang menyedihkan adalah, bahkan dengan builtin ini bukan jawaban terpendek.
Rɪᴋᴇʀ

@Riker Yah, itu karena Alice bukan bahasa golf sehingga perlu I / O eksplisit dan (karena itu bahasa 2D) penghentian program.
Martin Ender

Ya, masih agak sedih.
Rɪᴋᴇʀ

@ ConorO'Brien Kami baru saja mengadakan diskusi ini di tempat lain, dan itu hanya berlaku jika operator yang berdiri sendiri adalah ekspresi yang mengevaluasi fungsi (yang tidak terjadi di sini, karena fungsi / operator bukan nilai kelas satu) . codegolf.meta.stackexchange.com/a/7206/8478
Martin Ender

@ ConorO'Brien maaf itu adalah "kami" yang eksklusif.
Martin Ender





1

Pyth, 8 6 byte

*F+1{P

* -2 byte terima kasih kepada @LeakyNun

Akan menjadi 3 jika Pyth memiliki built-in untuk produk daftar ...

Cobalah!

*F+1{P
      Q     # Implicit input
     P      # Prime factors of the input
    {       # Deduplicate
  +1        # Prepend 1 to the list (for the case Q==1)
*F          # Fold * over the list

Anda bisa menggunakannya *F+1{P.
Leaky Nun

1

C, 65 50 byte

Terima kasih kepada @ Ørjan Johansen karena telah menghapus kebutuhan r. Berkat ini dan beberapa trik kotor lainnya saya bisa memeras 15 byte!

d;f(n){for(d=1;d++<n;)n%(d*d)||(n/=d--);return n;}

whilehilang dan diganti dengan ||dan indeks twiddling. <=seharusnya selama ini <.

<=beralih ke <dengan menggerakkan kenaikan untuk mendapatkan n%(++d*d)(harus didefinisikan dengan baik karena prioritas operator).


Kode asli:

d;r;f(n){for(r=d=1;d++<=n;)while(n%d<1)r*=r%d?d:1,n/=d;return r;}

Saya pikir Anda dapat mempersingkatnya dengan menghapus rdan menggunakannya while(n%(d*d)<1)n/=d;.
Ørjan Johansen

@ ØrjanJohansen Sepertinya itu benar. Saya lebih memikirkan konstruksi daripada pengurangan. Saya memiliki beberapa peningkatan tambahan untuk ditambahkan, akan segera diperbarui.
algmyr

++d*dsama 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.
Ørjan Johansen

Sebenarnya, bukankah d++<n, yang didefinisikan dengan baik, masih berfungsi? Saya pikir versi lama berjalan jauh ke n+1(tidak berbahaya).
Ørjan Johansen

Anda mungkin benar tentang perilaku yang tidak terdefinisi. Untuk beberapa alasan saya berpikir bahwa prioritas operator akan menyelesaikannya. Sebagian besar contoh yang saya lihat di UB menggunakan operator prioritas yang sama, tetapi tentu saja ada perlombaan data di sini juga. Anda juga benar tentang d++<nkebenaran, untuk beberapa alasan saya tidak melihat itu ketika saya menulis ulang kode.
algmyr

0

Aksioma, 89 byte

f(x:PI):PI==(x=1=>1;g:=factor x;reduce(*,[nthFactor(g,i) for i in 1..numberOfFactors g]))

tes dan hasil

(38) -> [[i, f(i)] for i in 1..30 ]
   (38)
   [[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]]

ini adalah fungsi tidak menggunakan faktor ()

g(x:PI):PI==(w:=sqrt(x);r:=i:=1;repeat(i:=i+1;i>w or x<2=>break;x rem i=0=>(r:=r*i;repeat(x rem i=0=>(x:=x quo i);break)));r)

tetapi hanya 125 byte


0

R, 52 byte

`if`((n=scan())<2,1,prod(unique(c(1,gmp::factorize(n))))

dibaca ndari stdin. Memerlukan gmppustaka untuk diinstal (agar TIO tidak berfungsi). Menggunakan pendekatan yang sama dengan banyak jawaban di atas, tetapi crash pada input 1, karena factorize(1)mengembalikan vektor kelas kosong bigz, yang crash unique, sayangnya.


Ini menghasilkan 12 ketika saya input 12.
Flounderer

@Flounderer Anda benar, saya telah memperbarui kode.
Giuseppe



0

Pyt , 3 byte

←ϼΠ

Penjelasan:

←                  Get input
 ϼ                 Get list of unique prime factors
  Π                Compute product of list
                   Implicit print
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.