Повторіть цю операцію GCD


19

Проблема A3 з конкурсу Putnam 2008 року говорить:

Почнемо з кінцевої послідовності 1 , з 2 , ... , в п натуральних чисел. Якщо можливо, вибрати два індексу J < до так , що J поділяє на K , і замінити на J і на K по НОД ( в J , в до ) і , відповідно. Доведіть, що якщо цей процес повториться, він з часом повинен припинитися, а остаточна послідовність не залежить від зробленого вибору.a1,a2,,anj<kajakajakgcd(aj,ak)lcm(aj,ak)

Ваша мета в цьому виклику полягає в тому, щоб прийняти за вхід кінцеву послідовність натуральних чисел і вивести результат повторення цього процесу, поки подальший прогрес не можливий. (Тобто до тих пір, поки кожне число в отриманій послідовності не розділить всі числа, що надходять після нього.) Вам не потрібно вирішувати задачу Putnam.

Це : виграє найкоротше рішення в кожній мові програмування.

Тестові справи

[1, 2, 4, 8, 16, 32] => [1, 2, 4, 8, 16, 32]
[120, 24, 6, 2, 1, 1] => [1, 1, 2, 6, 24, 120]
[97, 41, 48, 12, 98, 68] => [1, 1, 2, 4, 12, 159016368]
[225, 36, 30, 1125, 36, 18, 180] => [3, 9, 18, 90, 180, 900, 4500]
[17, 17, 17, 17] => [17, 17, 17, 17]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] => [1, 1, 1, 1, 1, 2, 2, 6, 60, 2520]

9
Яка акуратна проблема! Запишіть кожне ціле число як 2 α i 3 β i 5 γ i і зауважте, що процес просто міхурово сортує списки α , β , γ , паралельно :)ai2αi3βi5γiα,β,γ,
Lynn

Відповіді:


12

Желе , 9 байт

ÆEz0Ṣ€ZÆẸ

Спробуйте в Інтернеті!

Як це працює

ÆEz0Ṣ€ZÆẸ  Main link. Argument: A (array)

ÆE         For each n in A, compute the exponents of n's prime factorization.
           E.g., 2000000 = 2⁷3⁰5⁶ gets mapped to [7, 0, 6].
  z0       Zip 0; append 0's to shorter exponent arrays to pad them to the same
           length, then read the resulting matrix by columns.
    Ṣ€     Sort the resulting arrays (exponents that correspond to the same prime).
      Z    Zip; read the resulting matrix by columns, re-grouping the exponents by
           the integers they represent.
       ÆẸ  Unexponents; map the exponent arrays back to integers.


5

J , 17 байт

/:~"1&.|:&.(_&q:)

Спробуйте в Інтернеті!

Можливо, перший J відповідь на PPCG використовувати &.два рази. Після цього і того я починаю відчувати себе дивним хакером J.

В основному це переклад з відповіді Дженніса Желе .

Як це працює

/:~"1&.|:&.(_&q:)  Single monadic verb.
           (_&q:)  Convert each number to prime exponents
                   (automatically zero-filled to the right)
       |:&.        Transpose
/:~"1&.            Sort each row in increasing order
       |:&.        Transpose again (inverse of transpose == transpose)
           (_&q:)  Apply inverse of prime exponents; convert back to integers

Більш рання тут
FrownyFrog

5

Мова Вольфрама (Mathematica) , 44 байти

Table[GCD@@LCM@@@#~Subsets~{i},{i,Tr[1^#]}]&

The kk

bk=gcd({lcm(ai1,,aik)|1i1<<ikn})

Спробуйте в Інтернеті!


Дуже хороша! Ви два на два на дивних підходах, яких я не бачила, що приходять :)
Міша Лавров

5

Python 3 , 103 байти

import math
def f(a,i=0,j=-1):d=math.gcd(a[i],a[j]);a[j]*=a[i]//d;a[i]=d;a[i:j]and f(a,i,j-1)==f(a,i+1)

Спробуйте в Інтернеті!

Пояснення

Ця проблема по суті є паралельним сортуванням на прості коефіцієнти, і (gcd (a, b), lcm (a, b)) є аналогом (min (a, b), max (a, b)). Тож давайте поговоримо з точки зору сортування.

Індукцією доведемо, що після f (i, j) a [i] стає найменшим значенням у (старому значенні) L, де L - діапазон між [i] і a [j], включаючи обидва кінці . І якщо j = -1, f (i, j) буде сортувати діапазон L.

Випадок, коли L містить один елемент, є тривіальним. Для першої претензії зауважте, що найменший з L не може залишитися в a [j] після свопу, тому f (i, j-1) помістить його в [i], а f (i + 1, - 1) це не вплине.

Для другого твердження зауважте, що a [i] - найменше значення, а f (i + 1, -1) буде сортувати решта значень, тому L стає відсортованим після f (i, j).


3

Сітківка , 65 байт

\d+
*
+`\b((_+)(\2)+)\b(.*)\b(?!\1+\b)(\2+)\b
$2$4$5$#3*$5
_+
$.&

Спробуйте в Інтернеті! Посилання включає більш швидкі тестові випадки. Пояснення:

\d+
*

Перетворити в одинарне.

+`\b((_+)(\2)+)\b(.*)\b(?!\1+\b)(\2+)\b

Неодноразово співпадають: будь-яке число з фактором, потім пізніше число, яке не ділиться на перше число, але ділиться на множник.

$2$4$5$#3*$5

$1- це перше число. $2є фактором. Оскільки регулярне вираження жадібне, це найбільший фактор, тобто gcd. $4є частиною відповідності між початковими числами. $5є другим числом. $#3(у десятковій, а не унарній формі) на одиницю менше, ніж $1ділиться $2, оскільки не включає оригінал $2. Це означає, що для обчислення lcm нам потрібно помножити $5на один більше, ніж $#3найчастіше записується як сума $5та добуток $#3і $5.

_+
$.&

Перетворити в десятковий.


Unar дозволено для Retina за замовчуванням , тому ви можете порахувати це як 52 байти.
Денніс

@Dennis Тільки три мої відповіді на сітківку приймають дані не одинично; Я звик робити введення / виведення в десятковій частині.
Ніл



2

JavaScript (SpiderMonkey) , 69 байт

a=>a.map((q,i)=>a.map(l=(p,j)=>a[j]=j>i&&(t=p%q)?p/t*l(q,j,q=t):p)|q)

Спробуйте в Інтернеті!

  • Функція lправонаступник lcm(p,q)до a[j]і правонаступника gcd(p, q)в qвипадок j > i, інакше зберігають всі без змін.
    • lcm(p,q) = if p%q=0 then p else p*lcm(q,p%q)/(p%q)

Стара відповідь:

JavaScript (SpiderMonkey) , 73 байти

a=>a.map((u,i)=>a.map((v,j)=>i<j?a[j]*=u/(g=p=>p%u?g(u,u=p%u):u)(v):0)|u)

Спробуйте в Інтернеті!

  • Функція gобчислює gcd(u, v)та присвоює повернене значення u.

2

05AB1E , 15 14 13 байт

Ó¾ζ€{øεgÅpymP

Порт @ Dennis ♦ 'Желе відповідь , але, на жаль, 05AB1E не має вбудованих Unexponents, тому це займає більш ніж вдвічі програму .. :(
-1 байт завдяки @ Mr.Xcoder .
-1 байт завдяки @Enigma .

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

Ó          # Prime exponents of the (implicit) input-list
 ¾ζ        # Zip, swapping rows and columns, with integer 0 as filler
   €{      # Sort each inner list
     ø     # Zip, swapping rows and columns again
ε          # Map each inner list:
 gÅp       #  Get the first `l` primes, where `l` is the size of the inner list
    ym     #  Take the power of the prime-list and inner list
      P    #  And then take the product of that result
           # (And output implicitly)

1
О, я не бачив вашої відповіді до того, як опублікував свою, лол. 14 байт за допомогою ¾та вилучення +1. (Я вже пробував це раніше, тому що я намагався передати відповідь Денніса так само,
хай

1
Використання εgÅpymPврятують інші байти за один г - н Xcoder metioned
Emigna

@ Mr.Xcoder О, не знав, що є різниця між наповнювачем 0і ¾. Потрібно пам’ятати про це! Насправді я зараз додаю його до своїх маленьких порад 05AB1E. :)
Кевін Круїссен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.