Inspiriert von digitalen Wurzeln, ist die faktorielle Primwurzel einer Zahl die Zahl, die entsteht, wenn Sie die Primfaktoren einer Zahl nehmen, sie addieren und den Vorgang mit der resultierenden Zahl wiederholen, bis Sie eine Primzahl erhalten ( die sich selbst als einzigen Hauptfaktor hat und somit ihre eigene faktorielle Hauptwurzel ist). Die Primfaktorwurzel von 4 ist 4, da 2 * 2 = 2 + 2, und dies ist die einzige Nicht-Primfaktor-Faktorwurzel einer ganzen Zahl größer als 1 (was ein weiterer Sonderfall ist, da sie keine Primfaktoren enthält). Die OEIS-Sequenz, die von den primären faktoralen Wurzeln gebildet wird, ist A029908 .
Die primäre faktorale Wurzel von 24 ist zum Beispiel:
24=2*2*2*3
2+2+2+3=9=3*3
3+3=6=2*3
2+3=5, and the only prime factor of 5 is 5. Therefore, the prime factoral root of 24 is 5.
Deine Aufgabe:
Schreiben Sie ein Programm oder eine Funktion, die die primäre faktorale Wurzel einer Eingabe-Ganzzahl findet.
Eingang:
Eine Ganzzahl, die mit einer vernünftigen Methode zwischen 2 und der größten Ganzzahl eingegeben wird, die Ihre Sprache unterstützt (einschließlich). Die Auswahl einer Sprache mit einer unangemessen niedrigen maximalen Ganzzahlgröße ist nicht zulässig (und verstößt auch gegen diese Standardlücke) ).
Ausgabe:
Eine Ganzzahl, die primäre faktorale Wurzel der Eingabe.
Testfälle:
4 -> 4
24 -> 5
11 -> 11
250 -> 17
Wertung:
Dies ist Code-Golf , die niedrigste Punktzahl in Bytes gewinnt!
4
in den Testfällen hinzufügen , da dies eine Ausnahme darstellt und Sie es beim Testen einer Antwort leicht vergessen können?Antworten:
05AB1E , 3 Bytes
Probieren Sie es online!
Erklärungen:
quelle
4
.Haskell , 61 Bytes
Probieren Sie es online!
Erläuterung
until=<<((==)=<<)
Nimmt eine Funktionf
und wendet sie auf die Eingabe an,x
bis ein Fixpunkt erreicht ist, derf x
gleich istx
.primeFactors
gibt die Liste der Primfaktoren einer Zahl zurück,sum
ergibt die Summe einer Liste von Zahlen.Aber warte, warum macht
until=<<((==)=<<)
der Job und sieht so komisch aus?Wenn wir annehmen
f=sum.primeFactors
, wäre eine natürlichere Definitionuntil(\x->f x==x)f
, weil sieuntil
ein Prädikat (eine Funktion, die einen BooleschenInt -> Int
Wert zurückgibt), eine Funktion mit demselben Eingabe- und Rückgabetyp (z. B. ) und Wert dieses Typs annimmt und die Funktion dann auf die anwendet Wert, bis das Prädikat erfüllt ist.until(\x->f x==x)f
ist das gleiche wieuntil(\x->(==)(f x)x)f
, und wie es gilt, dasg (h x) x
ist das gleiche wie(g=<<h)x
wir bekommenuntil(\x->((==)=<<f)x)f
. Nach der Eta-Konvertierung wird diesuntil((==)=<<f)f
. Aber wenn wir jetzt behandeln(==)=<<
als eine Funktion , die angewandt wirdf
, können wir sehen , dassuntil(((==)=<<)f)f
wieder von der Formg (h x) x
, mitg=until
,h=((==)=<<)
undx=f
, so kann es neu geschrieben werden(until=<<((==)=<<))f
. Mit Hilfe der$
Bediener der Beseitigung der äußeren Klammern bekommen und Substitutionf
mitsum.primeFactors
Ausbeuten , die Lösung von oben.quelle
=<<((==)=<<)$
Whaaaaaat.Schale , 4 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Pyth , 3 Bytes
Probieren Sie es hier aus.
Erläuterung:
quelle
The trailing GQ is implicit
Python 2 , 84 Bytes
Probieren Sie es online!
quelle
f=lambda n,d=2:n>1and(n%d and f(n,d+1)or d+f(n/d))
? Ich habe noch nie in Python programmiert (hauptsächlich Java und C #), daher bin ich mir nicht sicher, was das Ergebnis dieser Funktion ist. Ändert diese Funktion die Eingaben
und gibt sie anschließend zurück, oder ähnelt sie einem Booleschen Wert, bei demn>1and(n%d and f(n,d+1)or d+f(n/d))
entweder 0 oder 1 oder 0 odern
oder etwas anderes angegeben ist? Ich versuche zu visualisieren, wie ein Port davon in Java / C # aussehen würde, kann dies aber nicht, da ich Python-Lambdas wie dieses im Allgemeinen nicht wirklich verstehe.n>1 ? (n%d!=0 ? f(n, d+1) : d+f(n/d)) : n>1
. Im Allgemeinenx and y
ist äquivalent zux ? y : x
.x and y or z
entsprichtx ? y : z
in den meisten Fällen.f=(n,d=2)->n>1?n%d>0?f(n,d+1):d+f(n/d):0
.x and y
dass ich auchx ? y : x
aus JavaScript stamme. Vielen Dank!Java 8,
175144142141 Bytes-1 Byte dank @Nevay .
Im Gegensatz zu einzelnen Bytes in einigen der Golfsprachen ist Java ziemlich ausführlich für Prim-Checks, Prim-Faktoren, Ziffernsummen und dergleichen, so dass ich vermute, dass weniger als 200 nicht allzu schäbig sind.
Kann höchstwahrscheinlich noch gespielt werden, indem Schleifen kombiniert werden
und keine getrennte rekursive Methode für die Ziffernsumme verwendet wird.Erläuterung:
Probieren Sie es hier aus.
quelle
i,t=n,x
sieht aus wie es in Python gehört, hahaint
(im Gegensatz zu Python). ;)i++<n
anstelle von verwenden++i<=n
.Gelee , 5 Bytes
Erklärungen:
Probieren Sie es online!
quelle
Netzhaut , 30 Bytes
Ein- und Ausgabe in unary .
Probieren Sie es online!(Führt der Einfachheit halber eine Dezimal- / Unär-Konvertierung durch.)
Erläuterung
Das
{
weist Retina an, das gesamte Programm in einer Schleife auszuführen, bis ein vollständiger Durchlauf die Zeichenfolge nicht mehr ändert, dh bis ein fester Punkt erreicht ist. Folglich berechnet das Programm selbst einen Schritt zum Summieren der Primfaktoren des aktuellen Wertes.Diese Stufe berechnet selbst die Primfaktorisierung der Eingabe. Das
+
ist ähnlich wie,{
aber schleift nur diese Phase, bis es aufhört, die Zeichenfolge zu ändern. Der Regex versucht, den endgültigen Lauf von1
s abzugleichen, indem er wiederholt denselben Teilstring (dh den Faktor) abgleicht. Die Art und Weise, wie dies gemacht wird, ist aufgrund der Vorwärtsreferenz etwas verworren\1
. Bei der ersten Iteration hat die Gruppe1
noch nichts erfasst und\1
schlägt daher bedingungslos fehl. Stattdessen müssen wir\b11+?\B
die kleinstmögliche Teilzeichenfolge abgleichen, die am Anfang des Laufs beginnt, mindestens zwei1
s enthält und nicht den gesamten Lauf abdeckt. Nachfolgende Iterationen können diese Alternative aufgrund der nicht mehr verwenden\b
. Bei allen weiteren Iterationen stimmen wir also überein\1
, dh immer wieder dieselbe Teilzeichenfolge. Dieser Prozess muss genau das Ende der Zeichenkette treffen ($
treffen ), um sicherzustellen, dass wir den tatsächlichen Teiler erfasst haben. Der Vorteil dieses etwas kniffligen Ansatzes ist, dass die Gruppe1
genau n / d verwendet wurde Mal verwendet wurde, dh was nach dem Aufteilen des Divisors d übrig bleibt .Wir ersetzen diese Übereinstimmung durch d (
$1
), ein Trennzeichen;
und n / d ($#1$*
wobei$#1
Kopien von eingefügt werden1
, wobei$#1
die Anzahl der von der Gruppe erstellten Erfassungen angegeben wird1
).Dieser Prozess wird beendet, sobald der letzte Lauf in der Zeichenfolge selbst eine Primzahl ist, da die Regex dann nicht mehr übereinstimmt.
Alles, was wir tun müssen, um die Primzahlen zu summieren, ist, alle Trennzeichen zu entfernen.
quelle
Ohm v2 , 4 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Eigentlich 7 Bytes
Probieren Sie es online!
Erläuterung:
quelle
R + pracma , 53 Bytes
Probieren Sie es online! (R-Geige)
R hat bisher keine Primfaktoren builtin, aber zahlreiche Pakete (
pracma
,numbers
usw.) zu tun, so dass ich eine bequem kurzen gepflückt.quelle
Gelee , 6 Bytes
Diese Antwort verwendet eine von Jellys vielen eingebauten Primfaktor-Funktionen
repeat until the results are no longer unique
.Probieren Sie es online!
quelle
1
ist der einzige Fall, in dem die Anzahl der erforderlichen Schritte gleich istn
(was in Ordnung ist;1
wir müssen sie nur einmal ausführen), und es scheint keine Fälle zu geben, in denen die Anzahl der Schritte größer ist alsn
(d. H es scheint keine Gegenbeispiele zu geben). Na ja, ich war überfordert: DMATL , 6 Bytes
Verwendet die Idee von Scottinet, öfter als nötig zu loopen . Danke auch an Shaggy für den Hinweis auf einen Fehler, der jetzt korrigiert wurde.
Probieren Sie es online!
Erläuterung
quelle
4
.PowerShell , 124 Byte
Probieren Sie es online!
In PowerShell ist keine Primfaktor-Funktion integriert, daher wird der Code aus meiner Antwort auf Prime Factors Buddies verwendet für die Durchführung der Faktorisierungsberechnungen der (die oberste Zeile) verwendet.
Die zweite Zeile ist das Fleisch dieses Programms. Wir nehmen eine Eingabe von
$args
in$x
, dannfor
Schleife , bis$l
ist-n
ote
qual zu$x
. (Die erste Iteration$l
ist$null
und$x
ist eine Ganzzahl, wir werden also mindestens einmal eine Schleife durchführen.)Innerhalb der Schleife legen wir
$l = $x
fest, ob wir das Ende der Schleife erreicht haben oder nicht. Dann bekommen wir die Faktoren von$x
mitf($x)
,-join
denen zusammen mit+
und|iex
ihnen (kurz fürInvoke-Expression
und ähnlicheval
). Das ist wieder in gespeichert$x
. Somit haben wir das "Ende" erreicht, an dem die zusammengezählte Primfaktorisierung wieder zu sich selbst zurückkehrt. Dann platzieren wir einfach$x
in der Pipeline und die Ausgabe ist implizit.quelle
Mathematica, 35 Bytes
Probieren Sie es online!
(Mathematik unterstützt nicht
Tr
. Ich muss es manuell implementieren.)quelle
1##&
ist eine Abkürzung fürTimes
undFixedPoint
kann fast immer gekürzt werden mit//.
:#//.x_:>Tr[1##&@@@FactorInteger@x]&
Times
, aber ich habe nichts über denFixedPoint
Trick gewusst .Tr
einiger Zeit eine PR eröffnet, um sie zu Mathics hinzuzufügen .Ruby , 63 Bytes
Probieren Sie es online!
Verwendet das
-rprime
Flag für +6 Bytes, um Prime # prime_division zu verwenden .prime_division
gibt Paare von zurück[prime, exponent]
(zum Beispiel für 24 haben wir die Faktoren[2, 2, 2, 3]
, die es gibt[[2, 3], [3, 1]]
), also multiplizieren wir in jedem Schritt einfach die Mitglieder dieser Paare und summieren die Ergebnisse.quelle
Javascript (ES6), 63 Byte
Ungolfed:
quelle
Java 8, 101 Bytes
Port of @ovs 's erstaunliche Antwort auf Python 2 .
Erläuterung:
Probieren Sie es hier aus.
quelle