(Follow-up zu meiner Frage zum Austausch von Bits mit ihren Nachbarn .)
Aufgabe
Bei einer positiven ganzen Zahl x = (2 a · 3 b ) · (5 c · 7 d ) · (11 e · 13 f ) · ... wird die ganze Zahl gedruckt, die durch Vertauschen der Exponenten in dieser Faktorisierung für jedes aufeinanderfolgende Primpaar erhalten wird. y = (2 b · 3 a ) · (5 d · 7 c ) · (11 f · 13 e ) ·…
A061898 im OEIS. Das ist Code-Golf , also gewinnt das kürzeste Programm (in Bytes)!
Testfälle
1 -> 1
2 -> 3
3 -> 2
10 -> 21
37 -> 31
360 -> 756
12345 -> 11578
67895678 -> 125630871
Antworten:
Gelee , 10 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
Jelly,
171611 Bytes5 Bytes dank Dennis.
Probieren Sie es online!
Erläuterung
Vorherige 16-Byte-Version
Probieren Sie es online!
Erläuterung
Vorherige 17-Byte-Version:
Probieren Sie es online!
Erläuterung
quelle
Mathematica,
7069 BytesEine unbenannte Funktion, die eine Ganzzahl annimmt und zurückgibt. Bei der Eingabe wird ein Fehler
1
ausgegeben, das korrekte Ergebnis wird jedoch berechnet.Erläuterung
Aufgrund des syntaktischen Zuckers ist die Lesereihenfolge wie immer ein bisschen lustig. Ein
&
auf der rechten Seite definiert eine unbenannte Funktion und ihre Argumente werden bezeichnet durch#
,#2
,#3
usw.Wir beginnen mit der Berücksichtigung der Eingabe. Dies gibt eine Liste von Paaren an,
{prime, exponent}
zB12
gibt die Eingabe{{2, 2}, {3, 1}}
. Etwas ungünstig,1
gibt{{1, 1}}
.Dies wendet die Funktion auf der linken Seite auf die Liste der Ganzzahlen auf Ebene 1 an, dh, die Funktion wird für jedes Paar aufgerufen, wobei Prim und Exponent als separate Argumente übergeben werden, und gibt dann eine Liste der Ergebnisse zurück. (Dies ähnelt der Zuordnung der Funktion über die Liste, aber das Empfangen von zwei separaten Argumenten ist bequemer als das Empfangen eines Paares.)
Wir berechnen die Anzahl der Primzahlen bis einschließlich der (Prim) -Eingabe mit Hilfe der eingebauten Funktion
PrimePi
. Dies gibt uns den Index der Primzahl.Das Ergebnis wird inkrementiert, mit XOR verknüpft
1
und erneut dekrementiert. Dies sind Swaps1 <-> 2, 3 <-> 4, 5 <-> 6, ...
, also alle 1-basierten Indizes. Man beachte , dass Eingang1
ergeben wird0
fürPrimePi
welche dann abgebildet-1
in diesem Prozess. Wir werden uns später darum kümmern.Wir erhalten nun die n- te Primzahl (wobei n das Ergebnis der vorherigen Berechnung ist), die die korrekt vertauschte Primzahl ist, und erhöhen sie bei der Faktorisierung der Eingabe auf die Potenz der ursprünglichen Primzahl. An diesem Punkt
Prime[-1]
wird ein Fehler ausgegeben, der sich jedoch nicht ausgewertet zurückgibt. Die Leistung in diesem Fall ist1
so, dass der gesamte bisherige Prozess{Prime[-1]}
für die Eingabe1
und eine Liste der korrekten Primleistungen für alle anderen Eingaben ergibt .Als nächstes multiplizieren wir einfach alle Primkräfte.
1##&
ist ein Standard-Golf-Trick für dieTimes
Funktion. In diesem Tipp (Abschnitt "Folgen von Argumenten") erfahren Sie, wie es funktioniert.Schließlich müssen wir uns um die Eingabe kümmern,
1
für die alle oben genannten Ergebnisse erzielt wurdenPrime[-1]
. Wir können das mit einer einfachen Ersetzungsregel leicht beheben. Denken Sie daran, dasf@x
ist die Abkürzung fürf[x]
. Wir wollen nur einen Ausdruck dieser Form zuordnen (da alle anderen Ergebnisse Ganzzahlen sind, dh atomare Ausdrücke) und ihn durch Folgendes ersetzen1
:Hier
/.
ist kurz fürReplaceAll
,_@_
ist ein Muster für alles von der Formf[x]
(dh jeder zusammengesetzte Ausdruck mit einem einzelnen Kind) und->1
sagt "Ersetzen durch1
".quelle
Python 2,
149139 Bytes10 Bytes dank Dennis.
quelle
input()
funktioniert in Python 2?eval(input())
in Python 3.MATL , 17 Bytes
Probieren Sie es online!
Erläuterung
Hierbei werden die Exponenten nicht direkt verwendet. Stattdessen wird jeder (möglicherweise wiederholte) Primfaktor durch den nächsten oder den vorhergehenden Prim getauscht.
quelle
Julia, 64 Bytes
Probieren Sie es online! Der letzte Testfall benötigt zu viel Speicher für TIO, aber ich habe ihn lokal überprüft.
Wie es funktioniert
Um die Eingabe 1 in Groß- und Kleinschreibung zu vermeiden - das Produkt eines leeren Wörterbuchs ist nicht definiert - multiplizieren wir die Eingabe n mit 2 und dividieren das Endergebnis durch das Paar 3 .
factor(2n)
gibt alle positiven Exponenten der Primfaktoren von 2n als Wörterbuch an. Beim Durchlaufen des Wörterbuchs erhalten wir Schlüssel-Wert / Prim-Exponenten-Paare. Die Funktionprod
übernimmt diese Paare, wendet die anonyme Funktiont->...
auf sie an und gibt das Produkt der Ergebnisse zurück.Für jedes Paar t = (p, e) ,
endof(~t[1])
oderendof(primes(t[1]))
Rückkehr k , die Anzahl der Primzahlen , die kleiner oder gleich p , was bedeutet , dass die p ist die k - te Primzahl.+1$1-1
erhöht k , XOR k + 1 um 1 und dekrementiert das Ergebnis. Wenn k ungerade ist, ist k + 1 gerade, so dass das XOR inkrementiert und das Endergebnis k + 1 ist . Wenn k gerade ist, ist k + 1 ungerade, so dass das XOR dekrementiert und das Endergebnis k - 1 ist .Schließlich berechnen wir alle Primzahlen kleiner oder gleich 3n mit
(~3n)
oderprimes(3n)
(der höchste Primfaktor von 2n ist kleiner oder gleich n, wenn n> 2 , und es gibt immer eine Primzahl zwischen n und 2n ). Wählen Sie die Zahl am Index k + aus 1 oder k - 1 , und heben Sie es mit auf die e- te Potenz^t[2]
.quelle
Python 2,
1121091089594 BytesTeste es auf Ideone .
Wie es funktioniert
Wenn f aufgerufen wird, berechnet es zuerst 1 / n . Wenn das Ergebnis nicht Null ist , n ist 1 und f kehrt 1 .
Wenn n> 1 ist , geschieht Folgendes.
Ist n nicht durch p [1] teilbar (anfangs 2 ),
n%p[1]
ergibt sich ein Wahrheitswert undwird gerufen.
Diese Verzweigung erzeugt eine Primzahl, bis die vorletzte n gleichmäßig teilt . Zu diesem Zweck wird die folgende Folgerung aus dem Satz von Wilson verwendet .
Zu allen Zeiten, m ist die Fakultäts von gleich k - 1 (zunächst 6 = 3! Und 4 In jeder Iteration das Ergebnis.
m*m%k*[k]
Wird in der Liste der Primzahlen voran p Durch die logische Folge.m*m%k
Ist 1 , wenn k eine Primzahl ist und 0 wenn nicht, so dass diese wird vorangestellt k zu p , wenn und nur wenn k eine Primzahl ist.Wenn n durch p [1] teilbar ist ,
n%p[1]
ergibt sich 0 undwird ausgeführt.
Wenn p eine gerade Anzahl von Primzahlen enthält,
len(p)*2%4
ergibt sich 0 und der erste Multiplikand nimmt den Wert von p [0] an . Wenn p eine ungerade Anzahl von Primzahlen enthält,len(p)*2%4
ergibt sich 2 und der erste Multiplikand nimmt den Wert von p [2] an. .In beiden Fällen ist dies die Primzahl, deren Exponenten mit der von p [1] vertauscht werden müssen. Wir teilen also n durch p [1] (Verringern des Exponenten um 1 ) und multiplizieren das Ergebnis
f(n/p[1])
mit der entsprechenden Primzahl (Erhöhen) der Exponent um 1 ).Beachten Sie, dass
f(n/p[1])
Resets k , m und p auf die Standardwerte.f(n/p[1],k,m,p)
Dies würde die Effizienz auf Kosten von sechs zusätzlichen Bytes verbessern.quelle
Pyth, 25 Bytes
Testsuite.
Erläuterung
quelle
Julia,
155131127 BytesDies ist eine anonyme Funktion, die eine Ganzzahl akzeptiert und eine Ganzzahl zurückgibt. Um es aufzurufen, weisen Sie es einer Variablen zu. Es ist eine Julia-Version <0.5 erforderlich, da die Hauptfunktionalität von Base in 0.5 entfernt wurde.
Ungolfed:
Probieren Sie es online! (Beinhaltet alle Testfälle)
quelle
Eigentlich 15 Bytes
Probieren Sie es online!
Erläuterung:
quelle
05AB1E, 22 Bytes
Erklärt
Probieren Sie es online aus
quelle
J, 21 Bytes
Ruft die Primzahlen von n ab als Primkräfte mit Nullen ab. Partitionieren Sie sie dann in nicht überlappende Unterlisten der Größe 2 und füllen Sie sie mit einer zusätzlichen Null. Kehren Sie dann jede Unterliste um und reduzieren Sie sie zu einer Liste. Schließlich konvertieren Sie zurück von Primzahlen in eine Zahl.
Verwendung
Erläuterung
quelle