Đơn giản hóa một căn bậc hai


29

Cho một số nguyên dương n, đơn giản hóa căn bậc hai √nthành biểu mẫu a√bbằng cách trích xuất tất cả các thừa số vuông. Đầu ra a,bphải là số nguyên dương n = a^2 * bvới bcàng nhỏ càng tốt.

Bạn có thể xuất abtheo thứ tự ở bất kỳ định dạng hợp lý. Bạn không thể bỏ qua các kết quả đầu ra 1như ẩn.

Các kết quả cho n=1..36như (a,b):

1 (1, 1)
2 (1, 2)
3 (1, 3)
4 (2, 1)
5 (1, 5)
6 (1, 6)
7 (1, 7)
8 (2, 2)
9 (3, 1)
10 (1, 10)
11 (1, 11)
12 (2, 3)
13 (1, 13)
14 (1, 14)
15 (1, 15)
16 (4, 1)
17 (1, 17)
18 (3, 2)
19 (1, 19)
20 (2, 5)
21 (1, 21)
22 (1, 22)
23 (1, 23)
24 (2, 6)
25 (5, 1)
26 (1, 26)
27 (3, 3)
28 (2, 7)
29 (1, 29)
30 (1, 30)
31 (1, 31)
32 (4, 2)
33 (1, 33)
34 (1, 34)
35 (1, 35)
36 (6, 1)

Đây là OEIS A000188A007913 .

Liên quan: Một phiên bản phức tạp hơn .


Chúng tôi đã có điều này trước đây , và nó đã bị đóng như một bản sao của thách thức được liên kết ở đây.
flawr

Câu trả lời:


13

Thạch , 9 byte

ÆE;0d2ZÆẸ

Hãy thử trực tuyến! hoặc xác minh tất cả các trường hợp thử nghiệm .

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

ÆE;0d2ZÆẸ  Main link. Argument: n

ÆE         Exponents; generate the exponents of n's prime factorization.
  ;0       Append 0 since 1ÆE returns [].
    d2     Divmod by 2.
      Z    Zip/transpose to group quotients and remainders.
       ÆẸ  Unexponent; turn the exponents of prime factorizations into integers.

3
Trong UTF-8, nhưng Jelly sử dụng trang mã tùy chỉnh. Các liên kết byte trong tiêu đề trỏ đến nó.
Dennis

Bạn đăng bình luận đó rất nhiều, vì vậy có lẽ bạn nên làm cho các byte như rõ ràng hơn (ví dụ : [bytes](link-to-byes) (not UTF-8).
NoOneIsHere 30/11/17

12

PARI / GP, 12 byte

n->core(n,1)

coretrả về phần không vuông ntheo mặc định, nhưng đặt cờ đối số thứ hai thành 1 làm cho nó trả về cả hai phần. Thứ tự đầu ra là (b, a), ví dụ (n->core(n,1))(12) -> [3, 2].


11

Python 2, 43 byte

k=n=input()
while n%k**2:k-=1
print k,n/k/k

Kiểm tra nó trên Ideone .


6

MATL , 12 byte

t:U\~f0)GyU/

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

Giải trình

t     % Take input n implicitly. Duplicate
:U    % Push [1 4 9 ... n^2]
\~    % True for entries that divide the input
f0)   % Get (1-based) index of the last (i.e. largest) dividing number
G     % Push input again
y     % Duplicate index of largest dividing number
U     % Square to recover largest dividing number
/     % Divide input by that. Implicitly display stack


2

Toán học 34 byte

#/.{a_ b_^_:>{a, b},_[b_,_]:>{1,b}}&

Điều này nói rằng thay thế tất cả các đầu vào ( #) theo các quy tắc sau: (1) một số, a , nhân với căn bậc hai của b nên được thay thế bằng {a, b} và một hàm b thành lũy thừa của bất cứ thứ gì nên được thay thế bằng {1, b }. Lưu ý rằng hàm giả định rằng đầu vào sẽ có dạng , Sqrt[n]. Nó sẽ không hoạt động với các loại đầu vào khác.

Hàm không tên này là mật mã bất thường cho Mathicala. Nó có thể được làm rõ phần nào bằng cách hiển thị hình thức đầy đủ của nó, tiếp theo là thay thế các hình thức ngắn hơn ban đầu.

Function[
   ReplaceAll[
      Slot[1],
      List[
         RuleDelayed[Times[Pattern[a,Blank[]],Power[Pattern[b,Blank[]],Blank[]]],List[a,b]],
         RuleDelayed[Blank[][Pattern[b,Blank[]],Blank[]],List[1,b]]]]]

giống như

   ReplaceAll[
      #,
      List[
         RuleDelayed[Times[Pattern[a,Blank[]],Power[Pattern[b,Blank[]],Blank[]]],List[a,b]],
         RuleDelayed[Blank[][Pattern[b,Blank[]],Blank[]],List[1,b]]]]&

ReplaceAll[#, 
  List[RuleDelayed[
    Times[Pattern[a, Blank[]], 
     Power[Pattern[b, Blank[]], Blank[]]], {a, b}], 
   RuleDelayed[Blank[][Pattern[b, Blank[]], Blank[]], {1, b}]]] &

ReplaceAll[#, 
  List[RuleDelayed[Times[a_, Power[b_, _]], {a, b}], 
   RuleDelayed[Blank[][b_, _], {1, b}]]] &

ReplaceAll[#, {RuleDelayed[a_*b^_, {a, b}], RuleDelayed[_[b_, _], {1, b}]}]&

ReplaceAll[#, {a_*b^_ :> {a, b}, _[b_, _] :> {1, b}}] &


1

Matlab, 51 byte

x=input('');y=1:x;z=y(~rem(x,y.^2));a=z(end)
x/a^2

Giải trình

x=input('')       -- takes input
y=1:x             -- numbers from 1 to x
z=y(~rem(x,y.^2)) -- numbers such that their squares divide x
a=z(end)          -- biggest such number (first part of output)
x/a^2             -- remaining part

1

JavaScript (ECMAScript 2016), 40 byte

n=>{for(k=n;n%k**2;k--);return[k,n/k/k]}

Về cơ bản là một cổng JavaScript của câu trả lời Python 2 của Dennis .

Hãy thử nó trên JSBin .

Lưu ý: nó không hoạt động ở chế độ nghiêm ngặt, vì kkhông được khởi tạo ở bất cứ đâu. Để làm cho nó hoạt động trong chế độ nghiêm ngặt, k=ntrong vòng lặp nên được thay đổi thành let k=n.


1

Haskell, 43> 42 byte

Giải pháp vũ lực.

Đã lưu 1 byte nhờ Xnor

f n=[(x,y)|y<-[1..],x<-[1..n],x*x*y==n]!!0

Giải pháp tuyệt vời, tôi thích cách nó không sử dụng modhoặc div. Tôi nghĩ bạn có thể làm y<-[1..]do lười biếng.
xnor

Vâng, bạn đúng. Không thể với giải pháp đầu tiên của tôi last[(x,y)|x<-[1..n],y<-[1..n],x*x*y==n]nhưng bây giờ nó sẽ hoạt động. Cảm ơn. Bạn có giải pháp riêng của mình trong Haskell?
Damien

1

05AB1E, 14 byte

Lv¹ynÖi¹yn/y‚ï

Giải thích

Lv              # for each x in range(1,N) inclusive
  ¹ynÖi         # if N % x^2 == 0
       ¹yn/y‚ï  # create [N/x^2,x] pairs, N=12 -> [12,1] [3,2]
                # implicitly output last found pair

Dùng thử trực tuyến


1

Python, 74 byte

def e(k):a=filter(lambda x:k/x**2*x*x==k,range(k,0,-1))[0];return a,k/a**2

Nói thẳng là đủ.


0

Python 2.7 (không được mã hóa) - 181 byte

def e(n):   
 for x in range(1,n+1):
  r=(1,x)
  for i in range(1,x+1):
   l=i**.5
   for j in range(1,x+1): 
    if i*j==x and l%1==0 and j<r[1]:r=(int(l),j)                
  print x,r

Chạy dưới dạng: e (số), vd. (24)

Đầu ra mẫu:

>> e(24)
1 (1, 1)
2 (1, 2)
3 (1, 3)
4 (2, 1)
5 (1, 5)
6 (1, 6)
7 (1, 7)
8 (2, 2)
9 (3, 1)
10 (1, 10)
11 (1, 11)
12 (2, 3)
13 (1, 13)
14 (1, 14)
15 (1, 15)
16 (4, 1)
17 (1, 17)
18 (3, 2)
19 (1, 19)
20 (2, 5)
21 (1, 21)
22 (1, 22)
23 (1, 23)
24 (2, 6)

1
Hãy cố gắng đánh golf câu trả lời của bạn càng nhiều càng tốt, đây là một môn đánh gôn
caird coinheringaahing

0

APL, 25 ký tự

 {(⊢,⍵÷×⍨)1+⍵-0⍳⍨⌽⍵|⍨×⍨⍳⍵}

Bằng tiếng Anh:

  • 0⍳⍨⌽⍵|⍨×⍨⍳⍵: chỉ số của hình vuông lớn nhất lên tới n chia hoàn toàn n;
  • 1+⍵-: chỉ mục nằm trong mảng đảo ngược, vì vậy hãy điều chỉnh chỉ mục
  • (⊢,⍵÷×⍨): tạo kết quả: chính chỉ số (a) và thương số b (nghĩa là n a * a)

Kiểm tra:

     ↑{(⊢,⍵÷×⍨)⊃z/⍨0=⍵|⍨×⍨z←⌽⍳⍵}¨⍳36
1  1
1  2
1  3
2  1
1  5
1  6
1  7
2  2
3  1
1 10
1 11
2  3
1 13
1 14
1 15
4  1
1 17
3  2
1 19
2  5
1 21
1 22
1 23
2  6
5  1
1 26
3  3
2  7
1 29
1 30
1 31
4  2
1 33
1 34
1 35
6  1

0

JavaScript (ECMAScript 6), 35 byte

f=(n,k=n)=>n/k%k?f(n,--k):[k,n/k/k]

JavaScript 1+, 37 B

for(k=n=prompt();n/k%k;--k);[k,n/k/k]

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.