Hãy từ bỏ tất cả các hình vuông, các ngươi chia cho tôi


37

Định nghĩa

  • Một hình vuông hoàn hảo là một số nguyên có thể được biểu thị bằng hình vuông của một số nguyên khác. Ví dụ, 36là một hình vuông hoàn hảo bởi vì 6^2 = 36.
  • Một số squarefree là một số nguyên không chia hết cho bất kỳ vuông hoàn hảo, ngoại trừ 1. Ví dụ, 10là một số vuông. Tuy nhiên, 12không phải là một số vuông, bởi vì 12chia hết cho 44là một hình vuông hoàn hảo.

Bài tập

Cho một số nguyên dương n, xuất ra số không vuông lớn nhất sẽ chia n.

Tủ thử

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

Chấm điểm

Đây là . Câu trả lời ngắn nhất trong byte thắng.

Tiêu chuẩn áp dụng.

Tài liệu tham khảo


1
... Và được gọi là cấp tiến - vì vậy những năm 1980!
Jonathan Allan

Liên quan chặt chẽ , chỉ cần nhân hai đầu ra. Chỉnh sửa: Đừng bận tâm, nó chỉ khớp với số khối.
xnor

Câu trả lời:


45

05AB1E , 2 byte

fP

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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

26
> _> thực sự ... ??
HyperNeutrino

@HyperNeutrino yep - nếu một số không vuông góc thì đó là do một số yếu tố chính của nó có bội số.
Jonathan Allan

@Jonathan ALLan Tôi chỉ quan tâm đến việc tích hợp sẵn các yếu tố chính độc đáo. Tôi ước Jelly có một trong số đó ...
HyperNeutrino

@HyperNeutrino Đó là 05AB1E, hãy làm quen với nó. 05AB1E có một số nội dung thực sự dư thừa mà dường như tiết kiệm byte.
Erik the Outgolfer

6
Sửa lỗi, "lưu byte", có lẽ không có gì về nó.
Draco18

14

Brachylog , 3 byte

ḋd×

Hãy thử trực tuyến!

Một câu trả lời rất độc đáo ...

Giải trình

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

1
Một lần nữa, Brachylog đánh bại Jelly vì một nguyên tử hai byte chỉ có một byte ở đây. > :-P
HyperNeutrino

4
Jelly có rất nhiều nội dung thường được xem là một lợi thế; nhưng nhiều nội dung hơn có nghĩa là trung bình họ cần tên dài hơn. Vì vậy, có sự đánh đổi liên quan đến thiết kế ngôn ngữ golf.

2
Tôi không cố gắng trở thành "anh chàng đó" và có lẽ tôi chỉ hiểu nhầm việc đếm byte, nhưng đây không phải là 6 byte? Mothereff.in/byte-count#ḋd ×
Captain Man

5
@CaptainMan Brachylog sử dụng trang mã tùy chỉnh 256 ký tự mà bạn có thể tìm thấy ở đây .
Gây tử vong

14

JavaScript (ES6), 55 54 50 46 byte

Trích dẫn OEIS :
a (n) là ước số nhỏ nhất của n sao cho n chia u ^ n

Cập nhật triển khai:
a (n) là ước số u nhỏ nhất của n số nguyên dương u sao cho n chia u ^ n

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));
}


Cách tiếp cận tốt đẹp cho vấn đề, đặc biệt. thiếu yếu tố dựng sẵn
Đi xe đạp

12

MATL , 6 4 byte

2 byte được lưu với sự trợ giúp từ @LeakyNun

Yfup

Hãy thử trực tuyến!

Giải trình

Xem xét đầu vào 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, tôi chuẩn bị đăng bài đó :-) Cảm ơn
Luis Mendo


9

CJam , 8 byte

rimf_&:*

Tại sao mọi hoạt động trong chương trình này phải là 2 byte -_-

Hãy thử trực tuyến!

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

Tôi không thể tìm ra cách để lặp lại. Tốt đẹp!
Luis Mendo

@LuisMendo Tôi mới phát hiện ra điều đó gần đây. Tôi luôn nghĩ đó là giao lộ nhiều người nhưng rõ ràng đó chỉ là giao lộ bình thường.
Mèo kinh doanh

9

Võng mạc , 36 30 28 byte

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

Đầu vào và đầu ra trong unary .

Hãy thử trực tuyến! (Bao gồm một tiêu đề và chân trang cho số thập phân <-> chuyển đổi đơn nguyên và để chạy nhiều trường hợp thử nghiệm cùng một lúc.)

Giải trình

Ý tưởng là để phù hợp với đầu vào như một số lần nhân một số yếu tố. Regex cơ bản để khớp một hình vuông sử dụng tham chiếu chuyển tiếp để khớp tổng các số nguyên lẻ liên tiếp:

(^1|11\1)+$

Vì chúng tôi không muốn khớp các hình vuông hoàn hảo, nhưng các số chia hết cho một hình vuông, chúng tôi thay thế nó 1bằng một phản hồi chính:

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

Vì vậy, bây giờ nhóm bên ngoài 1sẽ được sử dụng n lần trong đó n 2 là hình vuông lớn nhất phân chia đầu vào và nhóm 2lưu trữ các yếu tố còn lại. Điều chúng ta muốn là chia số nguyên cho n để loại bỏ hình vuông. Kết quả có thể được biểu thị bằng số lần lặp của nhóm 1lần nhóm 2, nhưng điều này hơi khó thực hiện. Retina $*có thể sẽ sớm được cải thiện để lấy mã thông báo không có ký tự làm đối số bên phải của nó trong trường hợp chúng ta có thể đơn giản thay thế nó bằng $#1$*$2, nhưng điều đó vẫn chưa hoạt động.

Thay vào đó, chúng tôi phân tách các số lẻ khác nhau. Chúng ta hãy quay trở lại ví dụ đơn giản hơn về việc khớp các ô vuông hoàn hảo với (^1|11\1)+$. Thay vì có một bộ đếm \1được khởi tạo thành 1 và tăng thêm 2 trên mỗi lần lặp, chúng ta sẽ có hai bộ đếm. Một được khởi tạo thành 0 và một được khởi tạo thành 1 và cả hai đều tăng 1 trên mỗi lần lặp. Vì vậy, về cơ bản chúng tôi đã phân tách các số lẻ 2n + 1 thành (n) + (n + 1) . Lợi ích là chúng tôi sẽ kết thúc với n trong một trong các nhóm. Ở dạng đơn giản nhất, nó trông như thế này:

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

Trong trường hợp \2n\3n + 1 . Tuy nhiên, chúng ta có thể làm điều này hiệu quả hơn một chút bằng cách nhận thấy rằng n + 1 của một lần lặp bằng với n của lần lặp tiếp theo, vì vậy chúng ta có thể lưu vào 1đây:

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

Bây giờ chúng ta chỉ cần quay lại sử dụng một yếu tố ban đầu thay vì 1khớp các đầu vào được chia cho một hình vuông hoàn hảo:

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

Bây giờ tất cả những gì chúng ta cần làm là thay thế toàn bộ điều này bằng $3ở cuối, nơi lưu trữ hệ số ban đầu nhân với số bước, làm giảm một yếu tố của hình vuông khỏi đầu vào.

Điều này được thực hiện lặp đi lặp lại +ngay từ đầu chương trình, để tính đến các yếu tố đầu vào có sức mạnh cao hơn bình phương.


8

Octave, 27 byte

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

Cách tiếp cận tương tự như các câu trả lời khác. Sự khác biệt là: Các chức năng có tên dài hơn nhiều. Tôi tin rằng mã giải thích chính nó thực sự: Đưa ra prodcác uniquesố nguyên tố factorcủa một số.


Bạn sẽ cho tôi khoảng 30 giây :)
Kritixi Lithos


7

Ngôn ngữ Wolfram, 29 28 byte

-1 Cảm ơn @Martin Ender ♦

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

Giải trình:

           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
Chỉ cần nhận ra rằng về cơ bản đây là nhận xét của @ GregMartin về câu trả lời Toán học, chỉ kém chơi gôn ...
Scott Milner

Đừng cảm thấy tồi tệ, tôi đã có câu trả lời thậm chí ít golf hơnTimes@@(#&@@@FactorInteger@#)&
Ian Miller

Mostđể lại nó như một danh sách Bạn cần Firstnhận được giá trị.
Ian Miller

@IanMiller Tôi nhận ra điều đó, nhưng chỉ cần trả về một danh sách chỉ có một phần tử. Tôi cho rằng điều đó là ổn, vì nó vẫn là một đầu ra hợp lý.
Scott Milner

7

Python , 37 byte

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

Hãy thử trực tuyến!

Số chia vuông góc lớn nhất nlà số nhỏ nhất rvới tất cả các thừa số nnguyên tố. Chúng ta có thể kiểm tra điều này vì r**n%n==0, r**ntạo các nbản sao của từng yếu tố chính rvà chỉ chia hết nnếu mỗi nyếu tố chính được biểu diễn.

Các 1>>r**n%n này tương đương với int(r**n%n==0). Nếu Truecó thể được sử dụng đầu ra 1, thì ngắn hơn 2 byte.

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

6

Toán học , 40 byte

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

Hãy thử trực tuyến!


Times@@#&@@Transpose@FactorInteger@#&lưu 3 byte ( #&@@là thủ thuật tiêu chuẩn cho [[1]]và trong những trường hợp như thế này, nó thường có thể lưu một số byte bổ sung trên dấu ngoặc đơn).
Martin Ender

Bạn cũng có thể sử dụng Threadthay vì Transpose. Trong Mathematica cũng có toán tử 3 byte cho Transpose, nhưng tôi không biết Mathics có hỗ trợ nó không.
Martin Ender

6
#&@@(1##&@@FactorInteger@#)&tránh sự cần thiết Transposehoàn toàn ( 1##&@@chỉ Times@@ở dạng ngụy trang, hoạt động tuyệt vời trên các cặp được đặt hàng mang lại FactorInteger; và '#&@@đang First@ngụy trang.)
Greg Martin

@GregMartin về cơ bản là giải pháp của riêng bạn, vui lòng đăng nó, nếu bạn muốn.
Pavel

Có vẻ như Scott Milner vẫn hiểu điều đó :)
Greg Martin

5

Alice , 4 byte

iDo@

Hãy thử trực tuyến!

Đầu vào và đầu ra được đưa ra dưới dạng điểm mã của một ký tự (hoạt động cho tất cả các điểm mã Unicode hợp lệ).

Giải trình

Chà, Alice có tích hợp sẵn Dvới định nghĩa là "Các yếu tố chính không trùng lặp". Nghĩa là, miễn là một giá trị chia hết cho một số p 2 cho một số nguyên tố p , chia giá trị đó cho p . Điều này xảy ra chính xác là chức năng cần thiết trong thử thách này. Phần còn lại chỉ là đầu vào, đầu ra, chấm dứt chương trình.

Lý do điều này đã được thêm vào Alice thực sự không liên quan gì đến chuỗi số nguyên này. Tôi đã cố gắng bám sát chủ đề liên kết các ước số với các chuỗi con và các thừa số nguyên tố với các ký tự. Và tôi cần một hàm đi kèm với "các ký tự lặp lại" (nói chung hữu ích hơn nhiều, vì nó cho phép bạn coi các chuỗi là các tập hợp, đặc biệt là khi được sử dụng cùng với các toán tử đa biến khác nhau).


Điều đáng buồn là, ngay cả với một nội dung, đây không phải là câu trả lời ngắn nhất.
Rɪᴋᴇʀ

@Riker Chà, đó là vì Alice không phải là ngôn ngữ chơi gôn nên nó cần kết thúc chương trình I / O rõ ràng và (vì đó là ngôn ngữ 2D).
Martin Ender

Vâng, vẫn còn hơi buồn.
Rɪᴋᴇʀ

@ ConorO'Brien Chúng tôi vừa thảo luận ở nơi khác và điều đó chỉ hợp lệ nếu toán tử độc lập là một biểu thức đánh giá hàm (không phải là trường hợp ở đây, vì các hàm / toán tử không có giá trị hạng nhất) . codegolf.meta.stackexchange.com/a/7206/8478
Martin Ender

@ ConorO'Brien xin lỗi đó là một "chúng tôi" độc quyền.
Martin Ender





1

Bình thường, 8 6 byte

*F+1{P

* -2 byte nhờ @LeakyNun

Sẽ là 3 nếu Pyth tích hợp sẵn các sản phẩm của danh sách ...

Thử nó!

*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

Bạn có thể sử dụng *F+1{Pthay thế.
Nữ tu rò rỉ

1

C, 65 50 byte

Cảm ơn @ rjan Johansen vì đã loại bỏ nhu cầu r. Nhờ điều này và một số thủ thuật bẩn thỉu khác, tôi đã có thể giảm 15 byte!

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

whileđã biến mất và thay thế bằng ||và chỉ số twiddling. <=nên đã được <tất cả cùng.

<=chuyển sang <bằng cách di chuyển gia số để có được n%(++d*d)(nên được xác định rõ do ưu tiên toán tử).


Mã gốc:

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

Tôi nghĩ bạn có thể rút ngắn nó bằng cách loại bỏ rvà thay vào đó sử dụng while(n%(d*d)<1)n/=d;.
Ørjan Johansen

@ RjanJohansen Điều đó có vẻ đúng. Tôi đã suy nghĩ xây dựng hơn là giảm. Tôi có một số cải tiến bổ sung để thêm, sẽ cập nhật sớm.
algmyr

++d*dhoàn toàn không được xác định rõ bởi các tiêu chuẩn C - đó là một trường hợp kinh điển về hành vi không xác định rõ ràng. Nhưng dù sao chúng ta cũng sẽ thực hiện ở đây.
Ørjan Johansen

Trên thực tế, không nên d++<n, được xác định rõ, vẫn hoạt động? Tôi nghĩ rằng phiên bản cũ đã đi tất cả n+1(vô hại).
Ørjan Johansen

Bạn có thể đúng về hành vi không xác định. Vì một số lý do, tôi nghĩ rằng quyền ưu tiên của nhà điều hành sẽ giải quyết điều đó. Hầu hết các ví dụ tôi đã thấy về UB sử dụng các toán tử ưu tiên tương tự, nhưng tất nhiên cũng có một cuộc đua dữ liệu ở đây. Bạn cũng đúng về d++<nviệc đúng, vì một số lý do tôi đã không thấy điều đó khi tôi viết lại mã.
algmyr

0

Tiên đề, 89 byte

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

kiểm tra và kết quả

(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]]

đây là hàm không sử dụng nhân tố ()

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)

nhưng nó chỉ có 125 byte


0

R, 52 byte

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

đọc ntừ stdin. Yêu cầu gmpthư viện phải được cài đặt (vì vậy TIO sẽ không hoạt động). Sử dụng cách tiếp cận giống như nhiều câu trả lời ở trên, nhưng nó gặp sự cố với đầu vào 1, bởi vì factorize(1)trả về một vectơ trống của lớp bigz, bị treo unique, than ôi.


Điều này xuất ra 12 khi tôi nhập 12.
Flounderer

@Flounderer bạn đúng, tôi đã cập nhật mã.
Giuseppe



0

Pyt , 3 byte

←ϼΠ

Giải trình:

←                  Get input
 ϼ                 Get list of unique prime factors
  Π                Compute product of list
                   Implicit print
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.