Repita esta operación GCD

19

El problema A3 de la competencia Putnam 2008 dice:

a1,a2,,anj<kajakajakgcd(aj,ak)lcm(aj,ak)

Su objetivo en este desafío es tomar una secuencia finita de enteros positivos como entrada y generar el resultado de repetir este proceso hasta que no sea posible ningún progreso adicional. (Es decir, hasta que cada número en la secuencia resultante divida todos los números que le siguen). No necesita resolver el problema de Putnam.

Esto es : gana la solución más corta en cada lenguaje de programación.

Casos de prueba

[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]
Misha Lavrov
fuente
99
¡Qué problema tan lindo! Escriba cada número entero como y observe que el proceso simplemente clasifica las listas en burbujas paralelo :)2 α i 3 β i 5 γ i α , β , γ , ...ai2αi3βi5γiα,β,γ,
Lynn

Respuestas:

12

Jalea , 9 bytes

ÆEz0Ṣ€ZÆẸ

Pruébalo en línea!

Cómo funciona

Æ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.
Dennis
fuente
5

J , 17 bytes

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

Pruébalo en línea!

Probablemente la primera respuesta J en PPCG para usar &.dos veces. Después de esto y aquello , empiezo a sentirme como un extraño hacker de J.

Básicamente una traducción de la respuesta de Dennis 'Jelly .

Cómo funciona

/:~"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
Bubbler
fuente
Uno anterior está aquí
FrownyFrog
5

Wolfram Language (Mathematica) , 44 bytes

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

El -ésimo elemento del resultado es el MCD de los LCM de los subconjuntos con elementos.kk

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

Pruébalo en línea!

alephalpha
fuente
¡Muy agradable! Son dos por dos en enfoques extraños que no vi venir :)
Misha Lavrov
5

Python 3 , 103 bytes

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)

Pruébalo en línea!

Explicación

Este problema es esencialmente una clasificación paralela de los factores primos, y (mcd (a, b), mcm (a, b)) es análogo a (min (a, b), max (a, b)). Entonces hablemos en términos de clasificación.

Demostraremos por inducción que después de f (i, j), a [i] se convierte en el valor más pequeño en (el valor anterior de) L, donde L es el rango entre a [i] y a [j], incluidos ambos extremos . Y si j = -1, f (i, j) ordenará el rango L.

El caso cuando L contiene un elemento es trivial. Para el primer reclamo, observe que el más pequeño de L no puede permanecer en un [j] después del intercambio, por lo que f (i, j-1) lo colocará en un [i], yf (i + 1, - 1) no lo afectará.

Para la segunda afirmación, tenga en cuenta que a [i] es el valor más pequeño y f (i + 1, -1) clasificará los valores restantes, por lo que L se ordena después de f (i, j).

infmagic2047
fuente
3

Retina , 65 bytes

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

Pruébalo en línea! El enlace incluye los casos de prueba más rápidos. Explicación:

\d+
*

Convierte a unario.

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

Emparejar repetidamente: cualquier número con un factor, luego un número posterior que no es divisible por el primer número pero es divisible por el factor.

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

$1Es el primer número. $2es el factor Debido a que la expresión regular es codiciosa, este es el factor más importante, es decir, el mcd. $4es la parte de la coincidencia entre los números originales. $5Es el segundo número. $#3(en decimal en lugar de unario) es uno menos que $1dividido por $2, ya que no incluye el original $2. Esto significa que para calcular el mcm necesitamos multiplicar $5por uno más de lo $#3que se escribe más sucintamente como la suma de $5y el producto de $#3y $5.

_+
$.&

Convierte a decimal.

Neil
fuente
Unary está permitido de forma predeterminada para Retina , por lo que puede contar esto como 52 bytes.
Dennis
@Dennis Solo tres de mis respuestas de Retina toman entrada en unario; Me he acostumbrado a hacer E / S en decimal.
Neil
3

05AB1E , 10 bytes

El crédito por el enfoque va a alephalpha .

εIæN>ù€.¿¿

Pruébalo en línea!

εIæN>ù€.¿¿     Full program. Takes a list from STDIN, outputs another one to STDOUT.
ε              Execute for each element of the input, with N as the index variable.
 Iæ            Powerset of the input.
   N>ù         Only keep the elements of length N+1.
      €.¿      LCM each.
         ¿     Take the GCD of LCMs.
Sr. Xcoder
fuente
2

JavaScript (SpiderMonkey) , 69 bytes

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)

Pruébalo en línea!

  • La función lasignar lcm(p,q)a a[j], y asignar gcd(p, q)a qsi j > i, de lo contrario mantiene todo sin cambios.
    • lcm(p,q) = if p%q=0 then p else p*lcm(q,p%q)/(p%q)

Vieja respuesta:

JavaScript (SpiderMonkey) , 73 bytes

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)

Pruébalo en línea!

  • Función gcalcular gcd(u, v)y asignar valor de retorno a u.
tsh
fuente
2

05AB1E , 15 14 13 bytes

Ó¾ζ€{øεgÅpymP

Puerto de @ Dennis ♦ 'Respuesta de Jelly , pero desafortunadamente 05AB1E no tiene un componente de Unexponents, por lo que toma más de la mitad del programa ... :(
-1 byte gracias a @ Mr.Xcoder .
-1 byte gracias a @Enigma .

Pruébelo en línea o verifique todos los casos de prueba .

Explicación:

Ó          # 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)
Kevin Cruijssen
fuente
1
Oh, no había visto tu respuesta antes de publicar la mía, jajaja. 14 bytes usando ¾y eliminando , +1. (He intentado esto antes porque intenté
transmitir la
1
Usando εgÅpymPahorraría otro byte sobre el Sr. Xcoder metioned
Emigna
@ Mr.Xcoder Oh, no sabía que había una diferencia entre el relleno con 0y ¾. ¡Necesito recordar eso! De hecho, lo agregaré a mis pequeños consejos 05AB1E ahora mismo. :)
Kevin Cruijssen