Problem A3 z konkursu Putnam 2008 mówi:
Twoim celem w tym wyzwaniu jest przyjęcie skończonej sekwencji dodatnich liczb całkowitych jako danych wejściowych i wygenerowanie wyniku powtarzania tego procesu, dopóki dalszy postęp nie będzie możliwy. (To znaczy, dopóki każda liczba w wynikowej sekwencji nie podzieli wszystkich liczb, które występują po niej.) Nie musisz rozwiązywać problemu Putnam.
To jest golf golfowy : wygrywa najkrótsze rozwiązanie w każdym języku programowania.
Przypadki testowe
[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]
code-golf
array-manipulation
number-theory
Misza Ławrow
źródło
źródło
Odpowiedzi:
Galaretka , 9 bajtów
Wypróbuj online!
Jak to działa
źródło
Pari / GP , 33 bajty
Oblicz elementarne dzielniki macierzy diagonalnej.
Wypróbuj online!
źródło
J , 17 bajtów
Wypróbuj online!
Prawdopodobnie pierwsza odpowiedź J na PPCG została użyta
&.
dwukrotnie. Po tym i tamtym zaczynam czuć się jak dziwny haker J.Zasadniczo tłumaczenie z odpowiedzi Jelly'ego na galaretkę .
Jak to działa
źródło
Wolfram Language (Mathematica) , 44 bajty
Wypróbuj online!
źródło
Python 3 , 103 bajty
Wypróbuj online!
Wyjaśnienie
Ten problem jest zasadniczo równoległym sortowaniem czynników pierwszych i (gcd (a, b), lcm (a, b)) jest analogiczny do (min (a, b), max (a, b)). Porozmawiajmy więc o sortowaniu.
Udowodnimy przez indukcję, że po f (i, j) a [i] staje się najmniejszą wartością w (starej wartości) L, gdzie L jest zakresem między [i] a [j], obejmującym oba końce . A jeśli j = -1, f (i, j) posortuje zakres L.
Przypadek, w którym L zawiera jeden element, jest trywialny. W przypadku pierwszego zastrzeżenia zwróć uwagę, że najmniejszy z L nie może pozostać w [j] po zamianie, więc f (i, j-1) umieści go w [i], i f (i + 1, - 1) nie wpłynie na to.
W drugim zastrzeżeniu należy zauważyć, że [i] jest najmniejszą wartością, a f (i + 1, -1) posortuje pozostałe wartości, więc L zostanie posortowane po f (i, j).
źródło
Siatkówka , 65 bajtów
Wypróbuj online! Link zawiera szybsze przypadki testowe. Wyjaśnienie:
Konwertuj na unary.
Wielokrotne dopasowanie: dowolna liczba ze współczynnikiem, a następnie późniejsza liczba, która nie jest podzielna przez pierwszą liczbę, ale jest podzielna przez współczynnik.
$1
jest pierwszą liczbą.$2
jest czynnikiem. Ponieważ wyrażenie regularne jest zachłanne, jest to największy czynnik, tj. Gcd.$4
jest częścią dopasowania oryginalnych liczb.$5
jest drugą liczbą.$#3
(w liczbach dziesiętnych zamiast jednostkowych) jest o jeden mniej niż$1
podzielony$2
, ponieważ nie zawiera oryginału$2
. Oznacza to, że aby obliczyć lcm, musimy pomnożyć$5
przez jeden więcej, niż$#3
to, co jest najlepiej zapisane jako suma$5
i iloczyn$#3
i$5
.Konwertuj na dziesiętny.
źródło
05AB1E , 10 bajtów
Uznanie za podejście należy do alephalpha .
Wypróbuj online!
źródło
Perl 6 , 53 bajtów
Wypróbuj online!
Odpowiedź Mathematiki na port Aphalphy.
źródło
JavaScript (SpiderMonkey) , 69 bajtów
Wypróbuj online!
l
przypisujelcm(p,q)
doa[j]
i przypisujegcd(p, q)
doq
ifj > i
, w przeciwnym razie wszystko pozostanie niezmienione.lcm(p,q) = if p%q=0 then p else p*lcm(q,p%q)/(p%q)
Stara odpowiedź:
JavaScript (SpiderMonkey) , 73 bajty
Wypróbuj online!
g
obliczagcd(u, v)
i przypisuje wartość zwracaną dou
.źródło
05AB1E ,
151413 bajtówPort z @ Dennis ♦ 'Galaretka odpowiedź , ale niestety 05AB1E nie ma wbudowanego Unexonents, więc zajmuje to ponad połowę programu .. :(
-1 bajt dzięki @ Mr.Xcoder .
-1 bajt dzięki @Enigma .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
¾
i usuwaniu0ï
, +1. (Próbowałem już wcześniej, ponieważ próbowałem przenieść odpowiedź Dennisa również lol)εgÅpymP
uratuje kolejny bajt na jeden Pan Xcoder ilustrującej działanie komory oscylacyjnej0
i¾
. Musisz o tym pamiętać! W rzeczywistości dodam go teraz do moich małych wskazówek 05AB1E. :)