Ripetere questa operazione GCD


19

Il problema A3 del concorso Putnam del 2008 dice:

Inizia con una sequenza finita a1,a2,,an di numeri interi positivi. Se possibile, scegli due indici j<k modo che aj non divida ak e sostituisci rispettivamente aj e ak con gcd(aj,ak) e , rispettivamente. Dimostra che se questo processo si ripete, alla fine deve arrestarsi e la sequenza finale non dipende dalle scelte fatte.lcm(aj,ak)

Il tuo obiettivo in questa sfida è prendere una sequenza finita di numeri interi positivi come input e produrre il risultato della ripetizione di questo processo fino a quando non saranno più possibili ulteriori progressi. (Cioè, fino a quando ogni numero nella sequenza risultante non divide tutti i numeri che lo seguono.) Non è necessario risolvere il problema di Putnam.

Questo è : vince la soluzione più breve in ogni linguaggio di programmazione.

Casi test

[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
Che bel problema! Scrivi ogni intero come 2 α i 3 β i 5 γ i e nota che il processo ordina semplicemente le bolle degli elenchi α , β , γ , ... in parallelo :)ai2αi3βi5γiα,β,γ,
Lynn,

Risposte:


12

Gelatina , 9 byte

ÆEz0Ṣ€ZÆẸ

Provalo online!

Come funziona

Æ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 byte

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

Provalo online!

Probabilmente la prima risposta J su PPCG da usare &.due volte. Dopo questo e quello , sto iniziando a sentirmi uno strano hacker J.

Fondamentalmente una traduzione da risposta Jelly di Dennis .

Come funziona

/:~"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

Uno precedente è qui
FrownyFrog

5

Wolfram Language (Mathematica) , 44 byte

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

kk

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

Provalo online!


Molto bella! Sei in due per approcci strani che non ho visto arrivare :)
Misha Lavrov,

5

Python 3 , 103 byte

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)

Provalo online!

Spiegazione

Questo problema è essenzialmente un ordinamento parallelo sui fattori primi e (gcd (a, b), mcm (a, b)) è analogo a (min (a, b), max (a, b)). Quindi parliamo in termini di smistamento.

Dimostreremo per induzione che dopo f (i, j), a [i] diventa il valore più piccolo in (il vecchio valore di) L, dove L è l'intervallo tra un [i] e un [j], comprese entrambe le estremità . E se j = -1, f (i, j) ordinerà l'intervallo L.

Il caso in cui L contiene un elemento è banale. Per la prima affermazione, nota che il più piccolo di L non può rimanere in un [j] dopo lo scambio, quindi f (i, j-1) lo metterà in un [i] e f (i + 1, - 1) non lo influenzerà.

Per la seconda affermazione, nota che a [i] è il valore più piccolo e f (i + 1, -1) ordinerà i valori rimanenti, quindi L diventa ordinato dopo f (i, j).


3

Retina , 65 byte

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

Provalo online! Link include i casi di test più veloci. Spiegazione:

\d+
*

Converti in unario.

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

Abbinamento ripetuto: qualsiasi numero con un fattore, quindi un numero successivo che non è divisibile per il primo numero ma è divisibile per il fattore.

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

$1è il primo numero. $2è il fattore. Poiché regex è avido, questo è il fattore più grande, cioè il GCD. $4è la parte della corrispondenza tra i numeri originali. $5è il secondo numero. $#3(in decimale anziché in unario) è uno in meno di $1diviso per$2 , poiché non include l'originale $2. Ciò significa che per calcolare il mcm dobbiamo moltiplicare $5per uno in più di quello $#3che è scritto più succintamente come la somma di $5e il prodotto di $#3e $5.

_+
$.&

Converti in decimale.



@Dennis Solo tre delle mie risposte Retina ricevono input in unario; Mi sono abituato a fare I / O in decimale.
Neil,

3

05AB1E , 10 byte

Il merito dell'approccio va alle alephalpha .

εIæN>ù€.¿¿

Provalo online!

ε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.


2

JavaScript (SpiderMonkey) , 69 byte

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)

Provalo online!

  • Funzione lassegnare lcm(p,q)a a[j], e assegnare gcd(p, q)aq if j > i, altrimenti mantiene tutto invariato.
    • lcm(p,q) = if p%q=0 then p else p*lcm(q,p%q)/(p%q)

Vecchia risposta:

JavaScript (SpiderMonkey) , 73 byte

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)

Provalo online!

  • La funzione gcalcola gcd(u, v)e assegna il valore di ritorno a u.

2

05AB1E , 15 14 13 byte

Ó¾ζ€{øεgÅpymP

Port of @ Dennis ♦ 'Jelly risponde , ma sfortunatamente 05AB1E non ha un Unexponents-builtin, quindi ci vuole più che dimezzare il programma .. :(
-1 byte grazie a @ Mr.Xcoder .
-1 byte grazie a @Enigma .

Provalo online o verifica tutti i casi di test .

Spiegazione:

Ó          # 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
Oh, non avevo visto la tua risposta prima di pubblicare la mia, lol. 14 byte utilizzando ¾e rimuovendo , +1. (L'ho provato prima perché ho cercato di portare anche la risposta di Dennis lol)
Mr. Xcoder,

1
Usando εgÅpymPsi salverebbe un altro byte sopra quello menzionato da Mr. Xcoder
Emigna il

@ Mr.Xcoder Oh, non sapevo che ci fosse una differenza tra il filler con 0e ¾. Devo ricordarlo! In effetti, lo aggiungerò ora ai miei piccoli suggerimenti 05AB1E. :)
Kevin Cruijssen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.