Повторите эту операцию GCD


19

Задача A3 из конкурса Putnam 2008 года гласит:

a1,a2,...,aNJ<КaJaКaJaКНОД(aJ,aК)LCM(aJ,aК)

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

Это : выигрывает самое короткое решение на каждом языке программирования.

Контрольные примеры

[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
Какая изящная проблема! Запишите каждое целое число как и отметьте, что процесс просто списки на параллельно :)aя2αя3βя5γяα,β,γ,...
Линн

Ответы:


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

Wolfram Language (Mathematica) , 44 байта

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

КК

бКзнак равноНОД({LCM(aя1,,aяК)|1я1<<яКN})

Попробуйте онлайн!


Очень хорошо! Вы двое на двоих на странных подходах, которые я не ожидал, приходя :)
Миша Лавров

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 - диапазон между a [i] и a [j], включая оба конца , И если j = -1, f (i, j) будет сортировать диапазон L.

Случай, когда L содержит один элемент, тривиален. Для первого утверждения обратите внимание, что самый маленький из L не может оставаться в [j] после перестановки, поэтому f (i, j-1) поместит его в a [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.

_+
$.&

Преобразовать в десятичную.


Унарное разрешение по умолчанию разрешено для Retina , поэтому вы можете считать это как 52 байта.
Деннис

@Dennis Только три из моих ответов на Retina имеют одинарный ввод; Я привык делать ввод / вывод в десятичном формате.
Нил



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

Port of @ Dennis ♦ 'Jelly ответ , но, к сожалению, 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. (Я пробовал это раньше, потому что пытался перенести и ответ Денниса)
Мистер Xcoder,

1
Использование εgÅpymPспасло бы еще один байт по сравнению с тем, о котором говорил мистер Xcoder
Emigna

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