Array-Faktorisierung


13

Ausgehend von einer Reihe positiver Ganzzahlen geben Sie eine stabile Reihe der unterschiedlichen Primfaktoren dieser Ganzzahlen aus. Mit anderen Worten, für jede Ganzzahl in der Eingabe in der angegebenen Reihenfolge müssen die Primfaktoren abgerufen, sortiert und alle Primzahlen, die noch nicht in der Ausgabe enthalten sind, an die Ausgabe angehängt werden.

Testfälle

[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]
[] -> []

Die Ausgabe kann als Array oder Liste von Ganzzahlen oder Zeichenfolgen, als begrenzte Ausgabe oder als andere Standardmethode zum Ausgeben einer geordneten Liste von Zahlen erfolgen.

Das ist , also gewinnt die kürzeste Antwort in Bytes.



5
Dies ist eine dieser Herausforderungen, die ich für „zu einfach“ halte. Fast jede Antwort wird wie folgt aussehen: (a) eine Schleife über die Eingabe und der Prime Factorization Code von Ye Olde mit einem bedingten Anhang; (b) eine Kette von vier Einbauten. Es gibt einfach nicht viel Raum für Kreativität. Vielleicht beweisen die Antworten, dass ich falsch liege, aber ich bezweifle es. Golf hat hier kaum mehr zu bieten als die Faktorisierung von Primzahlen, und das wurde zu Tode getan.
Lynn

1
@Lynn ist trivial für langs, aber nicht trivial für fast alles andere. Ich bin mir nicht sicher, ob das hier Gründe für Kleinigkeiten sind: /
Stephen

Können Sie mir sagen, welche "die unterschiedlichen Primfaktoren" von 1 sind?
J42161217

1
@DigitalTrauma Ja. Sonst wäre es nur "Ausgabe der Menge aller Primfaktoren der Eingabe"
Stephen

Antworten:



5

Schale , 3 Bytes

1 Byte gespart dank @Zgarb .

uṁp

Probieren Sie es online!


Erläuterung

Vollständiges Programm.

  p Primfaktoren von jedem.
 ṁ Map-Funktion über Liste und Ergebnis zusammenfassen.
u einzigartig. 

3
Σ†kann sein .
Zgarb

@ Zgarb Vielen Dank. Wie Sie sehen, ist es meine erste Antwort auf diese
Frage

Es ist schön zu sehen, wie neue Leute Husk benutzen. :)
Zgarb

1
@ Zgarb Es scheint sehr schön (vor allem, wenn es Jelly outgolfs: P)
Mr. Xcoder

5

Bash + GNU-Dienstprogramme, 37

  • 21 Bytes gespart dank @muru (wow!)
factor|tr \  \\n|awk '!/:/&&!a[$0]++'

Probieren Sie es online aus .


1
Ich denke, das nl|sort|...kann getan werden mit awk: awk '!a[$0]++'(Drucken, wenn nicht zuvor gesehen; damit die Bestellung nie verloren geht), Einsparung von 15 Bytes. Dann kann der sedBefehl mit einem etwas längeren Befehl entfernt werden awk: factor|awk '!/:/&&!a[$0]++' RS='[ \n]+'(Aufteilen von Datensätzen auf Leerzeichen und Zeilenumbrüche, Überspringen von Datensätzen mit :), Speichern weiterer 4 Bytes.
muru

1
Ich habe gerade festgestellt, dass ich zwei weitere Bytes gegenüber dem vorherigen Kommentar sparen kann, indem ich trfactor|tr \ \\n|awk '!/:/&&!a[$0]++'
Folgendes

@muru super - danke! (Ich wäre nicht verärgert gewesen, wenn Sie dies als Ihre eigene Antwort gepostet hätten, die mein Original deutlich übertroffen hätte)
Digital Trauma

4

MATL , 6 Bytes

"@Yfvu

Probieren Sie es online!

Erläuterung:

"      % 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.

Interessante MATL-Leckerbissen: Generell lassen sich alle Funktionen genauso einfach auf Vektoren (Arrays) anwenden. Aber in diesem Fall ist die Anzahl der Faktoren für jede Eingabe variabel, und Matlab und damit auch MATL befassen sich im Allgemeinen nur mit quadratischen Matrizen, sodass ich eine for-Schleife verwenden musste ".

Darüber hinaus verfügt MATL über zwei Hauptverkettungsoperatoren: hund vhorizontale und vertikale Verkettung. Ihr Verhalten unterscheidet sich erheblich: vVerkettet den gesamten Stapel, auch wenn er nur ein Element enthält, wie in unserer ersten Iteration. hNimmt genau zwei Elemente und schlägt fehl, wenn nur eines vorhanden ist, was es für diese Anwendung ungeeignet macht.




3

PowerShell , 102 Byte

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

Probieren Sie es online!

(Idee zur Faktorisierung von Ausleihen aus TessellatingHecklers Antwort über "Lass dich hinter mich, Satan-Prime!")

Übernimmt die Eingabe als Literal-Array $x. Erstellt ein neues leeres Array $a. Schleifen vorbei $x. Bei jeder Iteration durchlaufen wir eine Schleife 2bis zur aktuellen Zahl, prüfen, ob es sich um einen -andPrimfaktor handelt, |sortgeben diesen als Ergebnis aus und hängen ihn an $a. Wenn wir gehen durch getan $x, wir geben dann $aaber |selectnur die -unique Zahlen davon. Dies nutzt die Tatsache aus, dass die Eindeutigkeit von links nach rechts erfolgt, wobei das erste Vorkommen beibehalten wird, das mit der Problembeschreibung übereinstimmt. Diese Zahlen verbleiben in der Pipeline und die Ausgabe ist implizit.


3

CJam, 11 Bytes

{:mfe__&1-}

Funktion, die ein Array von Eingaben annimmt und ein Array von Eingaben ausgibt.

Testversion


Wie würde ich die Ausgabe mit mehreren Zeichen unterscheiden? Zumindest für meine (Online-) Tests gibt es einen String aus, kein Array von Ints.
Stephen

Als Funktion ist der Ausgabedatentyp ein Array von Ints. CJam druckt diesen Stapel automatisch und Arrays ohne Trennzeichen. Ich weiß nicht, ob das für deine Zwecke gut genug ist. Wenn Sie Delimeter wünschen, fügen Sie diese S*in die Klammer ein.
Geokavel

Ich glaube, dass stapelbasierte langs sowieso von ToS ausgegeben werden können, also ist es in Ordnung, ich habe mich nur gefragt. Vielen Dank.
Stephen




2

Mathematica, 64 Bytes

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

Eingang

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


Select[#&@@@Gather[#&@@@Join@@FactorInteger@#],#>1&]&
Matrix89

2

Haskell, 77 Bytes

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

Erläuterung:

  • Der x!yOperator gibt eine Liste aller Primfaktoren zurück x, die größer oder gleich sindy
  • Die (!2)Funktion gibt eine Liste aller Primfaktoren ihres Arguments zurück
  • Die Funktion in der letzten Zeile implementiert die erforderliche Funktionalität

Probieren Sie es online aus.


2

Brachylog , 6 Bytes

ḋᵐoᵐcd

Probieren Sie es online!

Erläuterung

ḋᵐ         Map prime decomposition
  oᵐ       Map order
    c      Concatenate
     d     Remove duplicates

Lob für [10,9,8,7,6,5,4,3,2,1]. Es sollte [2, 5, 3, 7]nicht sein[2, 3, 5, 7]
Mr. Xcoder

Sie können dies für +1 Byte ḋᵐoᵐcd
korrigieren

@ Mr.Xcoder Danke, behoben. Ziemlich unsinnig Voraussetzung imo.
Fatalize

Es ist nicht wirklich unsinnig, da es ein winziges bisschen weniger trivial ist. Ich habe auch meine eigene Antwort gepostet, aber ich habe zuerst umgekehrt anstatt Reihenfolge verwendet. Nicht sicher, warum die Primfaktoren in umgekehrter Reihenfolge generiert werden?
Mr. Xcoder

@Fatalize well - die Herausforderung besteht nicht darin, "verschiedene Primfaktoren der Liste zu sortieren", sondern "die Liste zu durchlaufen und verschiedene Primfaktoren anzuhängen".
Stephen


2

Japt , 6 Bytes

mk c â

Probier es aus


Erläuterung

Implizite Eingabe eines Arrays U. Map ( m) darüber, um die Faktoren ( k) jedes Elements zu erhalten. Flatten ( c), erhält die eindeutigen Elemente ( â) und gibt sie implizit aus.


2

Python 3 , 128 125 116 Bytes

Dies ist eine reine Python-Lösung. Keine Pakete. Vielen Dank an Halvard für das Speichern von 9 Bytes.

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))

Probieren Sie es online!

Python 2 , 133 127 126 Bytes

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)

Probieren Sie es online!

Python 2 , 142 138 134 Bytes

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

Probieren Sie es online!

Sehr überrascht, dass es noch keine Python-Antwort gab. Golf spielen.



@ HalvardHummel Danke
Mr. Xcoder

2

Deorst , 16 Bytes

EDkE]l1FeFPkEQE_

Probieren Sie es online!

Fertig mit Hilfe von @cairdcoinheringaahing im Deorst-Chatroom (beachten Sie, dass die Lösungen unterschiedlich sind).


Erläuterung

EDkE] l1FeFPkEQE_ Volles Programm.

ED Schieben Sie die Liste der Teiler jedes Elements.
  k Verhindern Sie, dass der Stapel neu sortiert wird.
   E] Den Stapel flachdrücken.
     l1Fe Entferne 1s vom Stapel (weil Caird überstürzt ist und 1 Prime gemacht hat!) - Sollte in zukünftigen Sprachversionen entfernt werden.
         FP Behalte die Primzahlen.
           k Verhindern Sie, dass der Stapel neu sortiert wird.
            EQ Deduplizieren.
              E_ Ergebnis ausgeben.

2

Deorst , 16 Bytes

EDkE]EQFPkl1FeE_

Probieren Sie es online!

Mit Hilfe von @ Mr.Xcoder erledigt. Für eine Pseudogolf-Sprache ist das viel zu lang.

Wie es funktioniert

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

1

Pyke , 4 Bytes

mPs}

Probieren Sie es hier aus!

mP   -   map(factorise, input)
  s  -  sum(^)
   } - uniquify(^)

Autsch, ich habe dich schlecht verwöhnt - Gut, wir haben verschiedene Ansätze :)
Mr. Xcoder

: P Ein Byte Unterschied. Ich denke, es ist erlaubt oder zumindest nach dem letzten Konsens, den ich gelesen habe
Blue

Ja, doppelte Antworten, sogar byteweise, sind zulässig
Mr. Xcoder


1

MY, 17 Bytes

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

Probieren Sie es online!

Wie?

  • ausgewertete Eingabe
  • Teiler (vektorisiert / spezifiziert)
  • ebnen
  • ’⊢f(‘dekrementieren, filtern, inkrementieren (entfernt 1)
  • 53ǵ'Die Zeichenfolge 'P'in der MY-Codepage, bei der es sich um einen Primärtest handelt. Leider 0x35=53ist es die 16. Primzahl, und es gibt keinen Befehl, 16um zum Stapel> _ <zu gelangen.
  • ƒ als eine Funktion
  • f( danach filtern
  • ū eindeutig machen
  • Ausgabe

1

C ++, 118 Bytes

[](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;}

Muss die Eingabe in a übergeben werden std::vector<int>, gibt eine andere std::vector<int>für die Ausgabe zurück.


1

J, 10 Bytes

~.(#~*),q:

Ich bin sicher, dass ein kluger J-er dies verkürzen könnte.



1

Python 2, 88 119 103 Bytes

Auf geht's. Mit der richtigen Sortierung.

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*

Anscheinend kann ich es nicht auf TIO zum Laufen bringen, weil das Paket nicht unterstützt wird. Es läuft auf meiner Maschine. Hier sind meine Testausgaben:

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([],[])                         #[]

Irgendwie konnte ich die Funktion nicht als Lambda-Funktion ausführen. Immer wenn ich versuche, das Listenverständnis zurückzugeben, wird [None, None, ...] zurückgegeben. Wenn ich nur etwas übersehen habe, könnte jemand auf diesen Fehler hinweisen? Danke für die Rückmeldung!


Bearbeiten:

Mit dem Sortieralgorithmus von Mr. Xcoder konnte ich den Code um 16 Bytes reduzieren. Danke für diesen Teil.

from primefac import*
def f(l):a=sum([list(primefac(i))for i in l],[]);print sorted(set(a),key=a.index)

Dies scheint nicht richtig zu sein. Der zweite Testfall sollte ausgegeben werden [2, 5, 3, 7]. Die Reihenfolge der Ausgänge ist wichtig.
Mego

sorted(set().union(*map(primefac,l)))
Alex Hall

Die Reihenfolge der Ausgänge ist wichtig. Lesen Sie die Erklärung noch einmal durch oder sehen Sie sich andere Antworten an - ich weiß nicht, wie ich sie sonst erklären soll.
Stephen

@Stephen. Aktualisierte Routine mit korrekter Ausgabe. Es hat eine Weile gedauert, bis ich die Unterschiede in jeder Zeile bemerkte. Fokussieren beim Lesen hilft sehr.
Simon

@Simon save three bytes by getting rid of spaces after parens - s.append(x) for -> s.append(x)for, primefac(i)) for -> primefac(i))for, []) if-> [])if
Stephen

1

Braingolf, 7 bytes

&(p)u=;

Try it online!

Oh look, it's basically a chain of 4 built-ins

Explanation

&(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

Fails for [10,9,8,7,6,5,4,3,2,1]. - The order matters: you should return [2, 5, 3, 7] instead of [2, 3, 5, 7].
Mr. Xcoder

You can fix that for -1 byte though. Since K only makes harm here.
Mr. Xcoder

@Mr.Xcoder oh right yeah, didn't realise they were supposed to be in order of occurrence, not ascending order. Fixed
Skidsdev

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.