Geben Sie bei einer Ganzzahl N > 1
alle anderen Zahlen aus, deren Primzerlegungen die gleichen Ziffern haben wie die Primzerlegung von N
.
Wenn zum Beispiel, N = 117
dann muss die Ausgabe [279, 939, 993, 3313, 3331]
, weil sein
117 = 3 × 3 × 13
Daher sind die zur Verfügung stehenden Ziffern 1
, 3
, 3
und , 3
und wir haben
279 = 3 × 3 × 31
939 = 3 × 313
993 = 3 × 331
3313 = 3313
3331 = 3331
Dies sind die einzig möglichen anderen Zahlen, da eine andere Kombination dieser Ziffern Nicht-Primzahlen ergibt, die nicht das Ergebnis einer Primfaktorisierung sein können.
Wenn N
irgendeine von 117
, 279
, 939
, 993
, 3313
oder 3331
, dann wird der Ausgang der fünf anderen Zahlen enthalten: sie sind Primfaktoren Kumpels.
Sie können keine führenden Nullen verwenden, um Primzahlen zu erhalten, z. B. N = 107
ist der einzige Freund 701
( 017
wird nicht berücksichtigt).
Ein- und Ausgänge
Die Eingabe- und Ausgabe-Buddies müssen in der Dezimalbasis genommen und zurückgegeben werden.
N
wird immer strikt größer sein als1
.Die Ausgabe kann ziemlich frei formatiert werden, solange sie nur die syntaktischen Elemente Buddies und Separatoren / Listen enthält.
Die Reihenfolge der Ausgabe ist unwichtig.
Sie können die Eingabe
STDIN
als Funktionsargument oder ähnliches durchgehen .Sie können die Ausgabe an drucken
STDOUT
, von einer Funktion zurückgeben oder etwas Ähnliches.
Testfälle
Ihr Programm sollte einen der folgenden Testfälle in weniger als einer Minute lösen .
N Buddies
2 []
4 []
8 []
15 [53]
16 []
23 [6]
42 [74, 146, 161]
126 [222, 438, 483, 674, 746, 851, 1466, 1631, 1679]
204 [364,548,692,762,782,852,868,1268,1626,2474,2654,2921,2951,3266,3446,3791,4274,4742,5426,5462,6233,6434,6542,7037,8561,14426,14642,15491,15833,22547]
Wertung
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Ç€=$
wäre ein bisschen schneller alsÇ€=Ç
, wenn man die zeitliche Begrenzung bedenkt.PowerShell v3 +, 450 Byte
Endlich!
PowerShell verfügt über keine integrierten Funktionen für die Prüfung, Faktorisierung oder Permutation von Primzahlen. Daher wird diese Funktion vollständig von Hand ausgeführt. Ich habe eine Reihe von Optimierungs-Tricks durchgearbeitet, um die Zeitkomplexität auf etwas zu reduzieren, das in die Herausforderungseinschränkungen passt, und ich bin froh zu sagen, dass es mir endlich gelungen ist -
Erläuterung
Hier ist viel los, also werde ich versuchen, es zu zerschlagen.
Die erste Zeile nimmt die Eingabe
$n
und definiert einefunction
,f
. Diese Funktion verwendet die akkumulative Versuchsaufteilung, um eine Liste der Primfaktoren zu erstellen. Es ist ziemlich schnell für kleine Eingaben, aber es bleibt offensichtlich hängen, wenn die Eingabe groß ist. Zum Glück sind alle Testfälle klein, das ist also ausreichend.Die nächste Zeile wird die
f
Akteure$n
,-split
s sie auf jede Ziffer alle leeren Ergebnisse zu ignorieren (dies aufgrund benötigt wird , wie Powershell funktioniert Regex Matching und wie es sich bewegt den Zeiger über die Eingabe und ist ein bisschen ärgerlich für Golfzwecke), dannsort
s die Ergebnisse in aufsteigender Reihenfolge. Wir speichern dieses Array von Ziffern in$x
und verwenden es als Eingabe für einen|?{...}
Filter, um nur diejenigen herauszufiltern, die selbst Primzahlen sind. Diese Primzahlen werden$y
zur späteren Verwendung gespeichert .Wir haben uns dann
$x
in zwei Komponenten aufgeteilt. Die erste (dh kleinste) Ziffer wird in gespeichert$a
, während der Rest in übergeben wird$b
. Wenn$x
nur eine Ziffer vorhanden ist, ist$b
diese leer / null. Wir müssen dann$a
als Array umwandeln, also verwenden wir den Komma-Operator schnell, um dies zu tun.Als nächstes müssen wir alle möglichen Permutationen der Ziffern konstruieren. Dies ist notwendig, damit unsere Divisionstests später eine Reihe von Zahlen überspringen und die Dinge insgesamt schneller machen.
Solange noch ein Element vorhanden ist
$b
, ziehen wir die erste Ziffer in ab$z
und lassen die verbleibenden in$b
. Dann müssen wir uns zu$a
dem Ergebnis des Schneidens und Zerteilens von Schnüren ansammeln . Wir nehmen$a+$y
als Array Verkettung, und für jedes Element wir eine neue Zeichenkette konstruieren$c
, dann eine Schleife durch$c
‚s.length
und Insert$z
in jede Position, einschließlich Voranstellen$z$c
und Anhängen$c$z
, dannselect
ing nur die-u
nique Elemente. Das ist wieder Array-verkettet mit$a
und wieder in gespeichert$a
. Ja, dies führt dazu, dass doofe Dinge passieren, wie Sie sie3333
zur Eingabe bekommen können117
, was eigentlich keine Permutation ist, aber viel kürzer als der Versuch, sie explizit herauszufiltern, stellt sicher, dass wir jede Permutation erhalten, und ist nur geringfügig langsamer.Also, hat jetzt
$a
ein Array aller möglichen (und dann einige) Permutationen der Ziffern des Faktors. Wir müssen neu einstellen$x
, um unsere Obergrenze für mögliche Ergebnisse zu erreichen, indem wir|sort
die Ziffern in-des
aufsteigender Reihenfolge und-join
wieder zusammensetzen. Offensichtlich kann kein Ausgabewert größer als diese Zahl sein.Wir setzen unser Helfer-Array
$l
auf ein Array von Werten, die wir zuvor gesehen haben. Als nächstes ziehen wir jeden Wert aus$a
(dh den Permutationen), die Primzahlen sind, und treten in eine Schleife ein, die die größte Zeitsenke des gesamten Programms darstellt ...Bei jeder Iteration durchlaufen wir eine Schleife
0
bis zu unserer oberen Grenze$x
und erhöhen sie um das aktuelle Element$j
. Solange der$i
Wert, den wir betrachten, kein Vielfaches eines vorherigen Wertes ist (das ist der0-notin($l|%{$i%$_})
Abschnitt), ist er ein potenzieller Kandidat für die Ausgabe. Wenn wir dief
Akteure von$i
, vonsort
und nach-eq
nehmen$x
, dann addieren Sie den Wert zur Rohrleitung. Am Ende der Schleife fügen wir unser aktuelles Element zur nächsten Verwendung$j
in unser$l
Array ein, da wir alle diese Werte bereits berücksichtigt haben.Schließlich werden wir
|?{$_-ne$n}
diejenigen herausziehen, die nicht das Eingabeelement sind. Sie verbleiben alle in der Pipeline und die Ausgabe ist implizit.Beispiele
quelle
CJam ,
2623 BytesProbieren Sie es online aus
Erläuterung
Die Verkettung zweier Zahlen ergibt immer ein größeres Ergebnis als die Multiplikation. Die größte Zahl, die wir möglicherweise berücksichtigen müssen, ist die größte Zahl, die wir aus den Ziffern der Primfaktorisierung der Eingabe bilden können. Dabei handelt es sich nur um alle Ziffern, die in absteigender Reihenfolge sortiert sind. Für die angegebenen Zahlen ist diese Obergrenze leicht so klein, dass wir jede Zahl im Bereich gründlich daraufhin überprüfen können, ob es sich um einen Primfaktor handelt:
quelle
05AB1E , 17 Bytes
Code:
Erläuterung:
Verwendet die CP-1252- Codierung. Probieren Sie es online!
quelle
Pyth, 17
Testsuite .
Verwendet die gleiche Beobachtung wie von Martins Posten .
Erweiterung:
quelle
JavaScript (ES6),
163158 BytesBearbeiten : Es wurde klargestellt, dass eine Primzahl wie 23 eher eine leere Ergebnismenge zurückgeben sollte [6]. 5 Bytes gespart, indem eine jetzt unbrauchbare Regel entfernt wurde, die dies absichtlich verhinderte.
Der letzte Testfall ist so kommentiert, dass dieses Snippet schnell genug ausgeführt wird, obwohl es auch in weniger als einer Minute abgeschlossen sein sollte.
quelle
PHP 486 Bytes
könnte mit einem Algorithmus, der nicht so aussieht, wahrscheinlich kürzer sein.
(aber ich mag die aktuelle Byteanzahl)
Nervenzusammenbruch
quelle
Eigentlich 27 Bytes
Dabei wird derselbe Algorithmus verwendet, den Martin , Adnan , FryAmTheEggman und Dennis verwendet haben. Golfvorschläge sind willkommen. Probieren Sie es online!
Ungolfing
quelle
Powershell, 147 Bytes (CodeGolf-Version)
Hinweis: Das Skript löst die letzten Testfälle in weniger als 3 Minuten auf meinem lokalen Notebook. Siehe unten stehende Lösung "Leistung".
Weniger Golf-Testskript:
Ausgabe:
Powershell, 215 Bytes ("Performance" -Version)
Hinweis: Ich glaube, dass die Leistungsanforderungen im Widerspruch zum GodeGolf-Prinzip stehen. Da es jedoch eine Regel gab
Your program should solve any of the test cases below in less than a minute
, habe ich zwei Änderungen vorgenommen, um die Regel zu erfüllen:-split'(.)'-ne''
stattdessen der Funktionscode|% t*y
;Jede Änderung reduziert die Auswertungszeit um die Hälfte. Denken Sie bitte nicht, dass ich alle Funktionen genutzt habe, um die Leistung zu verbessern. Nur das genügte, um die Regel zu erfüllen.
Weniger Golf-Testskript:
Ausgabe:
quelle
Japt, 18 Bytes
Versuch es
quelle