Спростіть квадратний корінь


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 .

Пов'язане: Більш складна версія .


У нас це було раніше , і це було закрито як дублікат виклику, пов'язаного тут.
flawr

Відповіді:


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 використовує користувацьку кодову сторінку. Посилання байтів у заголовку вказує на нього.
Денніс

Ви відправляєте , що коментар багато, так що, може бути , ви повинні зробити байти як зрозуміліше (наприклад: [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) число, а , разів квадратний корінь 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

Матлаб, 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-порт відповіді Dennis's Python 2 .

Спробуйте це на JSBin .

Примітка: вона не працює в суворому режимі, оскільки kніде не ініціалізована. Щоб він працював у суворому режимі, k=nцикл слід змінити на let k=n.


1

Haskell, 43> 42 байти

Рішення грубої сили.

Збережено 1 байт завдяки Xnor

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

Nice рішення, мені подобається , як він не використовує modабо div. Я думаю, що ти можеш зробити y<-[1..]через лінь.
xnor

Так, ти правий. З моїм першим рішенням це було неможливо, last[(x,y)|x<-[1..n],y<-[1..n],x*x*y==n]але зараз воно буде працювати. Спасибі. У вас є власне рішення в Haskell?
Демієн



0

Пітон 2,7 (безголів) - 181 байт

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 (число), наприклад. е (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
Спробуйте спробувати якомога більше відповіді на гольф, це гольф-код
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]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.