Es gibt eine ziemlich merkwürdige Zahl, die manchmal in mathematischen Problemen oder Rätseln auftaucht. Das Pseudofaktorielle (N) ist das kleinste (dh niedrigste) gemeinsame Vielfache der Zahlen 1 bis N; Mit anderen Worten, es ist die niedrigste Zahl, die alle Zahlen von 1 bis N als Faktoren hat.
Zum Beispiel pseudofaktoriell (7) = 3 * 4 * 5 * 7, das ist das Gleiche wie 7! mit der Ausnahme, dass 2 und 6 entfernt wurden, weil sie in anderen Begriffen enthalten sind.
Schreiben Sie ein Programm zur Berechnung von Pseudofaktoren (N), und wie immer gewinnt der kürzeste Code.
Hier ist eine kurze Liste für Ihre Verwendung. Weitere Testfälle finden Sie im OEIS unter A003418 .
Fakultät:
- 1
- 2
- 6
- 24
- 120
- 720
- 5040
Pseudofaktoriell:
- 1
- 2
- 6
- 12
- 60
- 60
- 420
code-golf
math
number-theory
factorial
Tony Ruth
quelle
quelle
2
und6
von der Liste der Vielfachen gestrichen wurde. Können Sie bitte die Regeln klären?Antworten:
Dyalog APL , 3 Bytes
APL schlägt Jelly ‽
⍳
1 obwohl Argument∧/
LCM überquelle
Gelee , 4 Bytes
Probieren Sie es online! oder überprüfen Sie alle Testfälle .
Wie es funktioniert
quelle
C (mit x86), 52 Bytes
Prüft Zahlen von 1 aufwärts. Dividiert es für jede Zahl durch alle Zahlen von n bis 1 und summiert die verbleibenden Zahlen. Stoppt, wenn die Summe 0 ist.
Verwendungszweck:
Es ist nicht offensichtlich, wie ein Wert zurückgegeben wird (es gibt keine
return
Anweisung).Die Aufrufkonvention für x86 besagt, dass die Funktion ihren Wert im
eax
Register zurückgeben muss. Praktischerweiseidiv
erwartet der Divisionsbefehl seine Eingabe ineax
und gibt das Ergebnis ineax
(Quotient) undedx
(Rest) aus. Die letzte Iteration dividierenk
durch1
, soeax
enthält den richtigen Wert , wenn die Funktion beendet.Dies funktioniert nur, wenn Optimierungen aktiviert sind (im Debug-Modus werden diese ausgegeben
421
).quelle
int
standardmäßig (einschließlich des Rückgabewerts). Es funktioniert für Funktionsargumente, wenn sie mit der sogenannten "old-style" -Syntax deklariert werden. Die Deklaration mit explizit definierten Typen wäreint d(n,k,b,t) int n,k,b,t; {...}
cdecl
undstdcall
verwenden die gleiche Methode für den Rückgabewert, alsox86
ist esHaskell, 20 Bytes
Anwendungsbeispiel:
map f [1..7]
->[1,2,6,12,60,60,420]
.Der
lcm
Trick in Haskell.quelle
Python + SymPy, 45 Byte
Ziemlich selbsterklärend.
Python 2,
5754 BytesTeste es auf Ideone .
Wie es funktioniert
Die Eingabe wird in den Variablen i und r gespeichert .
exec
Führt den folgenden Code r- mal aus.Während i von r bis 1 variiert , addieren wir den Anfangswert von r (in t gespeichert ) so oft wie nötig, um selbst ein Vielfaches von i zu erzeugen . Das Ergebnis ist offensichtlich ein Vielfaches von t .
Der Endwert von r ist also ein Vielfaches aller ganzen Zahlen im Bereich [1, ..., n] , wobei n die Eingabe ist.
quelle
exec
Tricks von Drittanbietern gibt es eine 78-Byte-Lösung:from fractions import*;lambda n:reduce(lambda x,y:x*y/gcd(x,y),range(1,n+1),1)
Nutzt die Tatsache, dasslcm(x,y) = x*y/gcd(x,y)
.Python, 46 Bytes
Auf der Suche nach dem Vielfachen
c
vong(n-1)
direkt. Ich hatte zwar vorher, dass diese Methode fälschlicherweise 0 als ein Vielfaches von irgendetwas finden würde, aber dasor
Kurzschließen oder(c%n<1)*c
wird auch überspringen,c==0
weil 0 falsch ist.50 Bytes:
Wie Dennis 'Lösung , aber als rekursive Funktion. Nach der Berechnung
g(n-1)
wird nach dem kleinsten Vielfacheni*n
gesuchtn
, das auch ein Vielfaches von istg(n-1)
. Wirklich langsam.Dank Dennis 4 Bytes um ein Vielfaches von der Suche
n
stattg(n-1)
.quelle
J 9 Bytes
Unkomplizierter Ansatz. Erstellt den Zahlenbereich
[0, ..., n-1]
, fügt dann jeweils einen hinzu und reduziert ihn mithilfe des LCM.Verwendungszweck
quelle
MATL , 4 Bytes
Probieren Sie es online!
Erläuterung
quelle
Mathematica, 13 Bytes
quelle
LCM
undRange
mit@*
?LCM
arbeitet elementweise mit einer Liste, die übergeben werden würdeRange
, was bedeutet, dass dies nur die lcm ( x ) für x von 1 bis n zurückgibt . Außerdem fehlt eine&
Funktion, die die anonyme Funktion schließen würde. So etwas wieLCM@@Range@#&
für 13 Bytes würde funktionieren.Julia, 11 Bytes
Probieren Sie es online!
quelle
Pyth - 8 Bytes
Überprüft alle Zahlen, bis eine teilbare gefunden wird
[1..N]
.Test Suite .
quelle
Oktave, 27 Bytes
Erstellt eine anonyme Funktion, die als aufgerufen werden kann
ans(N)
.Online Demo
Erläuterung
Diese Lösung erstellt eine Liste aller Zahlen zwischen
1
undx
(1:x
), konvertiert sie in ein Zellenfeld mitnum2cell
. Die{:}
Indizierung erstellt dann eine durch Kommas getrennte Liste, dielcm
als mehrere Eingabeargumente übergeben wird, um das am wenigsten verbreitete Vielfache zu berechnen. Eine 1 wird immer als erstes Argument an übergeben,lcm
dalcm
immer mindestens zwei Eingabeargumente benötigt werden.quelle
lcm
in Octave akzeptiert mehr als 2 Eingänge! InteressantMATLAB, 49 Bytes
quelle
bsxfun
Perl 6 , 13 Bytes
Anonymer Codeblock, der einen Bereich von 1 bis zur Eingabe (einschließlich) erstellt und diesen dann mit reduziert
&infix:<lcm>
.Beispiel:
quelle
JavaScript (ES6),
9288807469 Byte:Danke @ConorOBrien und @Neil
quelle
b?g(b,a%b):a
Speichert ein Byte.y*++i/g(y,i)
spart etwas mehr Bytes.05AB1E, 20 Bytes
Erläuterung
Probieren Sie es online aus
quelle
Minkolang 0,15 , 12 Bytes
Ich habe zwei 12-Byte-Lösungen und habe sie beide enthalten.
Probieren Sie es hier aus!
Erläuterung
Ungefähr so einfach wie es nur geht.
Probieren Sie es hier aus!
Erläuterung
Daraus lässt sich eine dritte Lösung ableiten: a entfernen
1
und ad
nach dem Strom hinzufügend
. In beiden Fällen wird die zusätzliche Nummer benötigt, da die for-Schleife ein Mal zu oft ausgeführt wird und das einmalige Ausführen zwei Bytes (1-
kurz vor der[
) dauert .quelle
Ruby, 25 Bytes
Ruby, 25 Bytes
quelle
g=
.GameMaker-Sprache, 60 Byte
Basierend auf der Logik von Anatolygs Antwort.
quelle
PHP,
615248 Bytessparte 9 Bytes dank @ user59178, 4 Bytes durch Zusammenführen der Schleifen.
Rekursion in PHP ist aufgrund des
function
Schlüsselworts umfangreich; Also benutze ich Iteration.Und mit ein paar "kleinen" Tricks habe ich jetzt sogar Arnauld´s JS geschlagen .
Nimmt Eingaben vom Kommandozeilenargument entgegen. Laufen Sie mit
-r
.Nervenzusammenbruch
ungolfed
Das sind eigentlich zwei Loops in einem:
Hinweis: Von meiner Antwort auf das Duplikat kopiert
quelle
AWK, 42 Bytes
Befehlszeilenverwendung:
Ich habe
AWK
gestern keine Lösung und kein Duplikat der Frage gesehen, also dachte ich, ich würde das zusammenwerfen. Es ist ziemlich langsam für19
meine Box oder größer zu lösen , aber es funktioniert.quelle
Japt, 10 Bytes
Kein LCM eingebaut.
Versuch es
quelle
Pyke, 3 Bytes, nicht konkurrierend
Probieren Sie es hier aus!
quelle
Hoon , 67 Bytes
Erstellen Sie die Liste
[1..n]
, falten Sie die Liste mit lcm. Leider gibt es in der Hoon-Stdlib keine vorgefertigte, die ich verwenden kann: /quelle
𝔼𝕊𝕄𝕚𝕟, 7 Zeichen / 9 Bytes
Try it here (ES6 only).
Nur ein LCM von inclusive reicht von 1 bis input.
quelle
QBIC ,
3532 BytesDas hat mich hierher gebracht.
Erläuterung:
Hier ist eine Version, die den Test beendet,
q
wennb
sie nicht sauber aufgeteilt wird. Auch die Reihenfolge der Prüfungb
ist gegenq
in der Annahme , umgekehrt , dass höhereb
's zu teilen sein wird härter durch (nehmen2
,3
,4
zum Beispiel: wenn%2=0
,%4
könnte sein!0
. Umgekehrt nicht so sehr ...).quelle
Axiom, 35 Bytes
Testcode und Ergebnisse
Ich mache einfach die Lösung von Finden Sie die kleinste positive ganze Zahl, die alle ganzen Zahlen von 1 bis n als Faktoren hat, weil Sie sagen, es ist doppelt, ich poste es hier
quelle
Pari / GP , 14 Bytes
Probieren Sie es online!
quelle
8. 23 Bytes
Code
Dieser Code belässt das resultierende Pseudofaktorielle im TOS
Verwendung und Beispiel
Oder klarer
quelle