Faktoryzacja macierzy

13

Biorąc pod uwagę tablicę dodatnich liczb całkowitych, wyprowadza stabilną tablicę różnych czynników pierwszych tych liczb całkowitych. Innymi słowy, dla każdej liczby całkowitej w danych wejściowych w kolejności, uzyskaj jej czynniki pierwsze, posortuj je i dołącz do liczb wyjściowych dowolne liczby pierwsze, które nie są jeszcze w danych wyjściowych.

Przypadki testowe

[1,2,3,4,5,6,7,8,9,10] -> [2,3,5,7]
[10,9,8,7,6,5,4,3,2,1] -> [2,5,3,7]
[100,99,98,1,2,3,4,5] -> [2,5,3,11,7]
[541,60,19,17,22] -> [541,2,3,5,19,17,11]
[1,1,2,3,5,8,13,21,34,45] -> [2,3,5,13,7,17]
[6,7,6,7,6,7,6,5] -> [2,3,7,5]
[1] -> []
[8] -> [2]
[] -> []

Dane wyjściowe mogą być tablicą lub listą liczb całkowitych lub ciągów, danych wyjściowych z ogranicznikami lub dowolnym innym standardowym sposobem generowania uporządkowanej listy liczb.

To jest , więc wygrywa najkrótsza odpowiedź w bajtach.

Stephen
źródło
Piaskownica
Stephen
5
To jedno z tych wyzwań, które uważam za „zbyt proste”. Prawie każda odpowiedź będzie wyglądać jak jedna z poniższych: (a) pętla nad wejściem i kod Ye Olde Prime Factorization z dopiskiem warunkowym; (b) łańcuch czterech wbudowanych. Po prostu nie ma dużo miejsca na kreatywność. Może odpowiedzi udowodnią, że się mylę, ale wątpię w to. W golfa nie ma nic więcej niż rozkład na czynniki pierwsze i zostało to zrobione na śmierć.
Lynn,
1
@ Lynn jest trywialny dla golfistów, ale nie jest trywialny dla prawie wszystkiego innego. Nie jestem pewien, czy to podstawa do trywialności tutaj: /
Stephen
Czy możesz mi powiedzieć, jakie są „odrębne czynniki pierwsze” 1?
J42161217,
1
@DigitalTrauma Tak. W przeciwnym razie byłoby po prostu „wypisz zbiór wszystkich czynników pierwszych wejściowych”
Stephen

Odpowiedzi:

9

05AB1E , 3 bajty

Dane wyjściowe jako lista ciągów.

f˜Ù

Wypróbuj online!

2sable , 3 bajty

Tak, działa to również w 2sable. Zwraca także listę ciągów.

f˜Ù

Wypróbuj online!

Pan Xcoder
źródło
6
Hah ... f U. Kocham to.
Magic Octopus Urn
@MagicOctopusUrn Dzięki :-)
Mr. Xcoder
5

Łuska , 3 bajty

1 bajt zapisany dzięki @Zgarb .

uṁp

Wypróbuj online!


Wyjaśnienie

u Fullp Pełny program.

  p Czynniki pierwsze każdego.
 ṁ Funkcja mapy na liście i konkatentacja wyniku.
Unikalny. 
Pan Xcoder
źródło
3
Σ†może być .
Zgarb
@Zgarb Wielkie dzięki. Jak widać, to moja pierwsza odpowiedź na
Łuskę
Miło jest widzieć nowych ludzi korzystających z Husk. :)
Zgarb,
1
@Zgarb Wydaje się to bardzo miłe (szczególnie, gdy wygrywa z Jelly: P)
Mr. Xcoder
5

Narzędzia Bash + GNU, 37

  • 21 bajtów zapisanych dzięki @muru (wow!)
factor|tr \  \\n|awk '!/:/&&!a[$0]++'

Wypróbuj online .

Cyfrowa trauma
źródło
1
Myślę, że nl|sort|...można to zrobić za pomocą awk: awk '!a[$0]++'(drukuj, jeśli nie widziałeś wcześniej, więc zamówienie nigdy nie zostanie utracone), oszczędzając 15 bajtów. Następnie sedpolecenie można wyeliminować, używając nieco dłuższego awk: factor|awk '!/:/&&!a[$0]++' RS='[ \n]+'(podziel rekordy na spacje i znaki nowej linii, pomiń rekordy za pomocą :), zapisując kolejne 4 bajty.
muru
1
Właśnie zdałem sobie sprawę, że mogę zapisać kolejne dwa bajty poprzedniego komentarza, używając tr: factor|tr \ \\n|awk '!/:/&&!a[$0]++'(to dwie spacje po pierwszym odwrotnym
ukośniku
@muru niesamowite - dzięki! (Nie byłbym zdenerwowany, gdybyś opublikował to jako własną odpowiedź, co znacznie przewyższyło moją oryginalność)
Digital Trauma
4

MATL , 6 bajtów

"@Yfvu

Wypróbuj online!

Wyjaśnienie:

"      % Loop over input
 @     % Push the array element
  Yf   % Prime factors
    v  % Concatenate entire stack vertically (does nothing the first iteration)
     u % Stably get distinct (unique, in MATLAB terminology) elements. Does so every loop but this is code golf, not fastest code.

Ciekawe ciekawostki MATL: ogólnie wszystkie funkcje odnoszą się do wektorów (tablic) równie łatwo. Ale w tym przypadku liczba czynników jest zmienna dla każdego wejścia, a Matlab i przez rozszerzenie MATL zasadniczo zajmują się tylko macierzami kwadratowymi, więc musiałem użyć pętli for ".

Ponadto MATL ma dwóch głównych operatorów konkatenacji: horaz vkonkatenację poziomą i pionową. Ich zachowanie różni się znacznie: vłączy cały stos, nawet jeśli ma tylko jeden element, jak w naszej pierwszej iteracji. hzajmuje dokładnie dwa elementy i zawiedzie, jeśli tylko jeden jest obecny, co czyni go nieodpowiednim dla tej aplikacji.

Sanchises
źródło
4

Brachylog , 6 bajtów

ḋᵐ↔ᵐcd

Wypróbuj online!

Brachylog , 6 bajtów

ḋᵐoᵐcd

Wypróbuj online!


Wyjaśnienie

ḋᵐ Mapa z rozkładem podstawowym (który zwraca czynniki w odwrotnej kolejności).
  ↔ᵐ Odwróć każdy (lub oᵐ - uporządkuj każdy).
    c Concatenate (spłaszczony).
     d deduplikacja.
Pan Xcoder
źródło

3

PowerShell , 102 bajty

param($x)$a=@();$x|%{$a+=(2..($z=$_)|?{!($z%$_)-and'1'*$_-match'^(?!(..+)\1+$)..'}|sort)};$a|select -u

Wypróbuj online!

(Zapożycza pomysł na faktoryzację z odpowiedzi TessellatingHeckler na temat „Odsuń się ode mnie, Szatanie Najwyższy!”)

Pobiera dane wejściowe jako tablicę literalną $x. Tworzy nową pustą tablicę $a. Pętle się skończyły $x. Każda iteracja, od której zapętlamy, 2aż do bieżącej liczby, sprawdzając, czy to jest czynnik, -andjest liczbą pierwszą, a następnie |sortjego wynik i dołączamy go $a. Kiedy skończyliśmy przechodzić $x, wyprowadzamy, $aale |selecttylko ich -unikłe liczby. Wykorzystuje to fakt, że unikatowy przechodzi od lewej do prawej, zachowując pierwsze wystąpienie, które pasuje do opisu problemu. Te liczby są pozostawione w potoku, a dane wyjściowe są niejawne.


3

CJam, 11 bajtów

{:mfe__&1-}

Funkcja, która pobiera tablicę liczb całkowitych i wyświetla tablicę liczb całkowitych.

Wersja testowa


Jak rozróżnić dane wyjściowe za pomocą wielu znaków? Przynajmniej do moich (online) testów wypisuje ciąg, a nie tablicę liczb całkowitych.
Stephen

Jako funkcja, wyjściowym typem danych jest tablica liczb całkowitych. CJam automatycznie drukuje ten stos i drukuje tablice bez ograniczników. Nie wiem, czy to wystarczy do twoich celów. Jeśli chcesz, aby ograniczniki dodać S*w zamkniętym nawiasie.
geokavel

Wierzę, że języki oparte na stosie mogą być generowane przez ToS, więc jest w porządku, po prostu się zastanawiałem. Dzięki.
Stephen




2

Mathematica, 64 bajty

Select[DeleteDuplicates[First/@FactorInteger@#~Flatten~1],#>1&]&

Wejście

[{100, 99, 98, 1, 2, 3, 4, 5}]

J42161217
źródło
Select[#&@@@Gather[#&@@@Join@@FactorInteger@#],#>1&]&
matrix89
2

Haskell, 77 bajtów

import Data.List
x!y|y>x=[]|x`mod`y<1=y:(x`div`y)!y|1<2=x!(y+1)
nub.((!2)=<<)

Wyjaśnienie:

  • gdy x!ywraca operator listę wszystkich głównych czynników x, które są większe niż lub równey
  • (!2)funkcja zwraca listę wszystkich czynników swojej tezy
  • funkcja w ostatnim wierszu implementuje wymaganą funkcjonalność

Wypróbuj online.

Cristian Lupascu
źródło
2

Brachylog , 6 bajtów

ḋᵐoᵐcd

Wypróbuj online!

Wyjaśnienie

ḋᵐ         Map prime decomposition
  oᵐ       Map order
    c      Concatenate
     d     Remove duplicates
Fatalizować
źródło
Fais dla [10,9,8,7,6,5,4,3,2,1]. Powinno być [2, 5, 3, 7], nie[2, 3, 5, 7]
Mr. Xcoder
Możesz to naprawić dla bajtu +1:ḋᵐoᵐcd
Pan Xcoder
@ Mr.Xcoder Dzięki, naprawiono. Imo jest jednak dość niesensowne.
Fatalize
To nie jest tak naprawdę bezsensowne, ponieważ jest małe, trochę mniej banalne. Opublikowałem też własną odpowiedź, ale najpierw użyłem odwrotnej kolejności zamiast kolejności. Nie wiesz, dlaczego czynniki pierwsze są generowane w odwrotnej kolejności?
Pan Xcoder
@ Dobrze sformatuj - wyzwanie nie polega na „posortowaniu odrębnych czynników pierwszych na liście”, ale „iteracji po liście i dołączeniu odrębnych czynników pierwszych”.
Stephen
2

Ohm v2 , 3 bajty

Kolejny 3-bajtowy (dzięki językom z automatyczną wektoryzacją).

m{U

Wypróbuj online!


Wyjaśnienie

m Czynniki pierwsze. Automatycznie wektoryzuje na wejściu.
 {Spłaszcz.
  U Uniquify.
Pan Xcoder
źródło
2

Japt , 6 bajtów

mk c â

Sprawdź to


Wyjaśnienie

Domniemane wejście tablicy U. Map ( m) powyżej, uzyskując współczynniki ( k) każdego elementu. Spłaszcz ( c), pobierz unikalne elementy ( â) i niejawnie wyjdź.

Kudłaty
źródło
2

Python 3 , 128 125 116 bajtów

To jest czyste rozwiązanie Pythona. Brak paczek Dzięki Halvardowi za oszczędność 9 bajtów.

def f(l):y=[k for i in l for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))];print(sorted({*y},key=y.index))

Wypróbuj online!

Python 2 , 133 127 126 bajtów

def f(l):y=sum([[k for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))]for i in l],[]);print sorted(set(y),key=y.index)

Wypróbuj online!

Python 2 , 142 138 134 bajtów

l=input();r=[]
for i in sum([[k for k in range(2,i+1)if i%k<1*all(k%x for x in range(2,k))]for i in l],[]):r+=[i]*(i not in r)
print r

Wypróbuj online!

Bardzo zaskoczony, że nie ma jeszcze odpowiedzi na Python. Praca nad golfem.

Pan Xcoder
źródło
116 bajtów Python 3
Halvard Hummel
@HalvardHummel Thanks
Mr. Xcoder
2

Najgorsze , 16 bajtów

EDkE]l1FeFPkEQE_

Wypróbuj online!

Zrobione z pomocą @cairdcoinheringaahing w Deorst na czacie (zauważ, że rozwiązania są różne).


Wyjaśnienie

EDkE] l1FeFPkEQE_ Pełny program.

ED Naciśnij listę dzielników każdego elementu.
  k Zapobieganie zmianie kolejności stosów.
   E] Spłaszcz stos.
     l1Fe Usuń 1 ze stosu (ponieważ Cairn rzucił się i zrobił 1 liczbę pierwszą!) - Powinien zostać usunięty w przyszłych wersjach językowych.
         FP Zachowaj liczby pierwsze.
           k Zapobieganie zmianie kolejności stosów.
            Deduplikacja EQ.
              E_ Wyprowadź wynik.
Pan Xcoder
źródło
2

Najgorsze , 16 bajtów

EDkE]EQFPkl1FeE_

Wypróbuj online!

Zrobione z pomocą @ Mr.Xcoder. Jest to zdecydowanie za długo na pseudogolfing.

Jak to działa

EDkE]EQFPkl1FeE_ - Full program, implicit input: [1,2,3,4,5]

ED               - Get divisors. Vectorizes. STACK = [[1], [1,2], [1,3], [1,2,4], [1,5]]
  k              - Turn off sorting for the next command
   E]            - Flatten the stack. STACK = [1, 1, 2, 1, 3, 1, 2, 4, 1, 5]
     EQ          - Deduplicate stack in place. STACK = [1, 2, 3, 4, 5]
       FP        - Filter by primality 1 is considered prime. STACK = [1, 2, 3, 5]
         k       - Turn off sorting for the next command
          l1     - Push 1. STACK = [1, 2, 3, 5, 1]
            Fe   - Filter elements that are equal to the last element. STACK = [2, 3, 5]
              E_ - Output the whole stack
Cairney Coheringaahing
źródło
1

Pyke , 4 bajty

mPs}

Wypróbuj tutaj!

mP   -   map(factorise, input)
  s  -  sum(^)
   } - uniquify(^)
niebieski
źródło
Ojej, źle cię ninja - Dobrze, że mamy różne podejścia :)
Pan Xcoder
: P Jedna bajtowa różnica. Myślę, że jest to dozwolone, a przynajmniej według ostatniego konsensusu, który przeczytałem
Blue
Tak, dozwolone są duplikaty odpowiedzi, nawet bajt po bajcie
Mr. Xcoder
1

MY, 17 bajtów

⎕Ḋḟ’⊢f(‘53ǵ'ƒf(ū←

Wypróbuj online!

W jaki sposób?

  • oceniane dane wejściowe
  • dzielniki (wektoryzuje / weryfikuje)
  • spłaszczyć
  • ’⊢f(‘zmniejszanie, filtrowanie, zwiększanie (usuwa 1)
  • 53ǵ'ciąg znaków 'P'na stronie kodowej MY, czyli testowanie pierwszeństwa. Niestety 0x35=53jest to 16. liczba pierwsza i nie ma polecenia wypychania 16na stos> _ <.
  • ƒ jako funkcja
  • f( filtruj według tego
  • ū wyjątkowy
  • wynik
Zacharý
źródło
1

C ++, 118 bajtów

[](auto n){decltype(n)r;for(int m:n)for(int i=1,j;i++<m;){j=m%i;for(int x:r)j|=!(i%x);if(!j)r.push_back(i);}return r;}

Musi zostać przekazany sygnał wejściowy w postaci a std::vector<int>, zwraca inny std::vector<int>wynik.

hvd
źródło
1

J, 10 bajtów

~.(#~*),q:

Jestem pewien, że jakiś sprytny J-er mógłby to skrócić.

Gregory Higley
źródło
1

Python 2, 88 119 103 bajtów

No to ruszamy. Przy prawidłowym sortowaniu.

def f(l,s=[]):[s.append(x) for x in sum([list(primefac(i)) for i in l],[]) if x not in s];print s
from primefac import*

W zasadzie nie mogę go uruchomić na TIO, ponieważ pakiet nie jest obsługiwany. Działa na mojej maszynie. Oto moje wyniki testu:

f([1,2,3,4,5,6,7,8,9,10],[])     #[2, 3, 5, 7]
f([10,9,8,7,6,5,4,3,2,1],[])     #[2, 5, 3, 7]
f([100,99,98,1,2,3,4,5],[])      #[2, 5, 3, 11, 7]
f([541,60,19,17,22],[])          #[541, 2, 3, 5, 19, 17, 11]
f([1,1,2,3,5,8,13,21,34,45],[])  #[2, 3, 5, 13, 7, 17]
f([6,7,6,7,6,7,6,5],[])          #[2, 3, 7, 5]
f([1],[])                        #[]
f([8],[])                        #[2]
f([],[])                         #[]

Jakoś nie byłem w stanie wykonać tej funkcji jako funkcji lambda. Ilekroć próbuję zwrócić zgodność listy, zwraca [Brak, Brak, ...]. Jeśli tylko coś przeoczę, czy ktoś mógłby wskazać ten błąd? Dziękujemy za opinię!


Edytować:

Korzystając z algorytmu sortowania Mr. Xcoders, mogłem zmniejszyć kod o 16 bajtów. Dziękuję za tę część.

from primefac import*
def f(l):a=sum([list(primefac(i))for i in l],[]);print sorted(set(a),key=a.index)
Szymon
źródło
To nie wydaje się poprawne. Drugi przypadek testowy powinien zostać wygenerowany [2, 5, 3, 7]. Kolejność wyjść ma znaczenie.
Mego
sorted(set().union(*map(primefac,l)))
Alex Hall
Kolejność wyjść jest ważna. Przeczytaj ponownie wyjaśnienie lub spójrz na inne odpowiedzi - tak naprawdę nie wiem, jak inaczej to wyjaśnić.
Stephen
@Stephen. Zaktualizowana procedura z poprawnym wyjściem. Zajęło mi trochę czasu, zanim zauważyłem różnice w każdej linii. Skupienie się podczas czytania bardzo pomaga.
Simon
@ Simon oszczędza trzy bajty, pozbywając się spacji po parens - s.append(x) for-> s.append(x)for, primefac(i)) for-> primefac(i))for, []) if->[])if
Stephen
1

Braingolf , 7 bajtów

&(p)u=;

Wypróbuj online!

Och, spójrz, to w zasadzie łańcuch 4 wbudowanych

Wyjaśnienie

&(p)u=;  Implicit input from commandline args
 (.)     Sandbox loop, sandboxes each item in a separate stack and runs the
         code within the loop.
&        Append the entire sandboxed stack when loop ends, rather than only the
         top of stack after each iteration
  p      Prime factors
    u    Unique
     =   Print stack
      ;  Suppress implicit output
Skidsdev
źródło
Nie działa na [10,9,8,7,6,5,4,3,2,1]. - Kolejność ma znaczenie: powinieneś wrócić [2, 5, 3, 7]zamiast [2, 3, 5, 7].
Pan Xcoder,
Możesz to naprawić dla bajtu -1 . Ponieważ Ktylko szkodzi tutaj.
Pan Xcoder,
@ Mr.Xcoder o tak, tak, nie zdawałem sobie sprawy, że powinny być w kolejności występowania, a nie w porządku rosnącym. Naprawiono
Skidsdev,