ลดความซับซ้อนของรากที่สอง


29

รับค่าจำนวนเต็มบวกnทำให้สแควร์รูท√nเป็นรูปแบบที่ง่ายa√bขึ้นโดยการแยกปัจจัยสแควร์ทั้งหมด เอาต์พุตa,bควรเป็นจำนวนเต็มบวกโดยn = a^2 * bมีbขนาดเล็กที่สุดเท่าที่จะเป็นไปได้

คุณสามารถส่งออกaและbในลำดับใดก็ได้ในรูปแบบที่เหมาะสม คุณไม่สามารถละเว้นเอาต์พุตของ1โดยปริยาย

ผลลัพธ์สำหรับn=1..36เป็น(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)

เหล่านี้เป็น OEIS A000188และA007913

ที่เกี่ยวข้อง: รุ่นที่ซับซ้อนมากขึ้น


เราเคยทำสิ่งนี้มาก่อนและนั่นถูกปิดเหมือนความท้าทายที่เชื่อมโยงที่นี่
ข้อบกพร่อง

คำตอบ:


13

เยลลี่ขนาด 9 ไบต์

ÆE;0d2ZÆẸ

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

มันทำงานอย่างไร

Æ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
ใน UTF-8 มันเป็น แต่ Jelly ใช้หน้ารหัสที่กำหนดเอง ไบต์เชื่อมโยงในจุดที่ส่วนหัวของมัน
Dennis

คุณโพสต์ความคิดเห็นนั้นมากดังนั้นบางทีคุณควรทำให้จำนวนไบต์อย่างชัดเจนยิ่งขึ้น (ตัวอย่าง: [bytes](link-to-byes) (not UTF-8).
NoOneIsHere

12

PARI / GP ขนาด 12 ไบต์

n->core(n,1)

coreส่งกลับค่าส่วนฟรีของnค่าเริ่มต้น แต่การตั้งค่าสถานะอาร์กิวเมนต์ที่สองเป็น 1 ทำให้ส่งคืนทั้งสองส่วน เพื่อการส่งออกเป็นเช่น(b, a)(n->core(n,1))(12) -> [3, 2]



6

MATLขนาด 12 ไบต์

t:U\~f0)GyU/

ลองออนไลน์!

คำอธิบาย

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

Mathematica 34 ไบต์

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

สิ่งนี้บอกว่าจะแทนที่อินพุตทั้งหมด ( #) ตามกฎต่อไปนี้: (1) ตัวเลข, a , คูณด้วยการแทนที่สแควร์รูทของb{a, b} และฟังก์ชัน b เป็นพลังของสิ่งที่ควรแทนที่ด้วย {1, b }. โปรดทราบว่าฟังก์ชั่นสันนิษฐานว่าการป้อนข้อมูลจะอยู่ในรูปแบบ, Sqrt[n]. มันจะไม่ทำงานกับอินพุตอื่น ๆ

ฟังก์ชันที่ไม่มีชื่อนี้เป็นรหัสลับสำหรับ Mathematica อย่างผิดปกติ สามารถชี้แจงได้บ้างโดยแสดงแบบเต็มตามด้วยการแทนที่แบบฟอร์มที่สั้นกว่าเดิม

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

ซึ่งเหมือนกับ

   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 ไบต์

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

คำอธิบาย

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 ไบต์

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

โดยทั่วไปพอร์ต JavaScript ของเดนนิสเป็นงูหลาม 2 คำตอบ

ลองบน JSBin

หมายเหตุ: มันไม่ทำงานในโหมดเข้มงวดเพราะkไม่ได้เริ่มต้นที่ใดก็ได้ จะทำให้การทำงานในโหมดที่เข้มงวดในวงควรจะเปลี่ยนเป็นk=nlet k=n


1

Haskell, 43> 42 ไบต์

วิธีการแก้ปัญหากำลังดุร้าย

บันทึก 1 ไบต์ต้องขอบคุณ Xnor

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

วิธีการแก้ปัญหาที่ดีผมชอบวิธีการที่จะไม่ได้ใช้หรือmod divฉันคิดว่าคุณสามารถทำได้y<-[1..]เนื่องจากความเกียจคร้าน
xnor

ใช่คุณถูก. มันเป็นไปไม่ได้ด้วยวิธีแก้ปัญหาแรกของฉันlast[(x,y)|x<-[1..n],y<-[1..n],x*x*y==n]แต่ตอนนี้มันจะได้ผล ขอบคุณ คุณมีทางออกของคุณเองใน Haskell หรือไม่?
Damien



0

Python 2.7 (ungolfed) - 181 Bytes

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

ทำงานเป็น: e (หมายเลข) เช่น E (24)

ตัวอย่างผลลัพธ์:

>> 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
โปรดลองคำตอบของคุณให้มากที่สุดนี่คือcode-golf
caird coinheringaahing

0

APL, 25 ตัวอักษร

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

เป็นภาษาอังกฤษ:

  • 0⍳⍨⌽⍵|⍨×⍨⍳⍵: ดัชนีของสี่เหลี่ยมที่ใหญ่ที่สุดจนถึง n ที่หาร n ทั้งหมด
  • 1+⍵-: ดัชนีอยู่ในอาร์เรย์ที่กลับด้านดังนั้นปรับดัชนี
  • (⊢,⍵÷×⍨): สร้างผลลัพธ์: ดัชนีของตัวเอง (a) และผลหาร b (นั่นคือ n ÷ a * a)

ทดสอบ:

     ↑{(⊢,⍵÷×⍨)⊃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 ไบต์

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]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.