Nicht zu verwechseln mit Find the factorial!
Einführung
Die Fakultät einer ganzen Zahl n
kann berechnet werden durch
Das ist relativ einfach und nichts Neues. Fakultäten können jedoch auf doppelte Fakultäten erweitert werden , so dass
für gerade Zahlen und
für ungerade Zahlen. Wir sind aber nicht auf doppelte Fakultäten beschränkt. Zum Beispiel
oder
oder
abhängig von Startwert.
Zusammenfassend:
wobei
Oder im Klartext: Subtrahieren Sie die Fakultätszählung wiederholt von der Basiszahl und multiplizieren Sie alle resultierenden positiven ganzen Zahlen.
Die Herausforderung
Schreiben Sie eine Funktion, die jede Art von wiederholten Fakultäten für jede nicht negative ganze Zahl berechnet.
Eingang
Entweder
- Eine Zeichenfolge mit einer nicht negativen Ganzzahl zur Basis zehn, gefolgt von mindestens einem Ausrufezeichen. ZB
"6!"
oder"9!!"
oder"40!!!!!!!!!!!!!!!!!!!!"
.
oder
- Dieselben Werte werden durch zwei Ganzzahlen dargestellt: ein nicht negativer Basiswert und ein positiver Wert, der die Fakultätszählung darstellt. Dies kann gemäß einem beliebigen Format aus den Standard-E / A-Regeln erfolgen.
Ausgabe
Das Ergebnis dieser Berechnung.
Challenge-Bemerkungen
0!
entspricht1
per definitionem. Ihr Code muss dies berücksichtigen.- Die Fakultätszählung wird durch den außerhalb dieses Bereichs begrenzt. Sie können alles ausgeben. Abgesehen davon , das ist die einzige Ausnahme von dieser Regel.
0!
Beispiele
Input Output
3!!! 3
0! 1
6! 720
9!! 945
10!!!!!!!! 20
40!!!!!!!!!!!!!!!!!!!! 800
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 41697106428257280000000000000000
Probieren Sie es mit einer ungolfed Python-Implementierung aus: Probieren Sie es online aus!
Allgemeine Bemerkungen
- Das ist Code-Golf , also gewinnt die Antwort mit den wenigsten Bytes in jeder Sprache.
- Es gelten Standardregeln , E / A-Regeln und Regelungslücken .
- Bitte fügen Sie einen Try it Online- Link hinzu, um die Funktionsweise Ihres Codes zu demonstrieren.
- Bitte begründen Sie Ihre Antwort mit einer Erklärung Ihres Codes.
0!
jedoch in den Hinweisen zur Herausforderung, wird angegeben, dass die Fakultätsanzahl kleiner oder gleich dem Basiswert ist.3!!!!!!!
sollte nicht undefiniert sein - es sollte nur die Antwort geben3
. Es ist dasselbe wie1!!=1
(nicht undefiniert). Außerdem besagt Ihre Eingabespezifikation, dass es immer mindestens eine geben wird!
, sodass das erste Beispiel3
nicht der Spezifikation entspricht.(3!)!
zu entfernen . Es ist ein irreführender Name. Ich ging davon aus, dass die Factorial-Funktion wiederholt in einer Kette angewendet werden würde, und musste sorgfältig lesen, um zu sehen, was es tatsächlich war. Zum Glück erklärt die Frage es klar. Ein besserer Name könnte schrittweise oder schrittweise oder so sein.Antworten:
R , 33 Bytes
Probieren Sie es online!
Behandeltn=0 indem die logische Negation von n addiert wird .
quelle
ArnoldC ,
702 698634 BytesProbieren Sie es online!
Übersetzt in Pseudocode:
Hinweis: ArnoldC hat nur einen Datentyp: 16-Bit-Integer mit Vorzeichen. Daher kann ich den
420!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Fall nicht testen .quelle
c
Variable speichert tatsächlich den Wert des Vergleichs zwischenn
und0
.Gelee , 4 Bytes
Probieren Sie es online!
Wie? Wennn und k , erzeugt es zuerst den Bereich n,⋯,1 (mit kth Element dieses Bereichs bei (also n,n−k,n−2k,⋯,n−⌊n/k⌋k ) und multipliziert sie schließlich mit
RṚ
) undm
behält dann jedesP
.quelle
RṚ
m
P
r1mP
.APL (Dyalog Extended) , 7 Byte SBCS
Anonyme implizite Präfixfunktion. Nimmt
[n,b]
als Argument.Probieren Sie es online!
1¨
eine für jedes Element des Arguments;[1,1]
-\
kumulative Differenz;[n,n-b]
…
Bereich unter Verwendung des zweiten Elements des linken Arguments als Indikator für den Schritt, z. B. geht[9,7]
weiter mit5
×/
Produktquelle
Haskell , 21 Bytes
Probieren Sie es online!
Das Kombinieren der eingebauten Produktfunktion mit einer schrittweisen Bereichsaufzählung übertrifft das, was ich rekursiv codieren könnte (selbst wenn flawr ein Byte speichert).
22 Bytes
Probieren Sie es online!
Hier ist eine Lösung, die Eingaben im String-Format wie
9!!
folgt vornimmt , was meiner Meinung nach interessanter ist.42 Bytes
Probieren Sie es online!
quelle
n%a|n<1=1|m<-n-a=n*m%a
Pyth , 6 Bytes
Dies sind alles äquivalente 6-Byte-Werte:
Probieren Sie es online! (
*F:Q1E
)Oder 11 Bytes , Eingabe als Zeichenfolge:
Testsuite.
quelle
JavaScript (ES6), 21 Byte
Übernimmt die Eingabe als
(k)(n)
.Probieren Sie es online!
Oder 24 Bytes zur Unterstützung von BigInts.
JavaScript (ES6), 55 Byte
Übernimmt die Eingabe als Zeichenfolge in dem in der Challenge beschriebenen Format.
Probieren Sie es online!
quelle
Leerzeichen , 91 Bytes
Buchstaben
S
(Leerzeichen),T
(Tabulator) und (Zeilenvorschub) werdenN
nur als Hervorhebungen hinzugefügt.[..._some_action]
nur als Erklärung hinzugefügt.Probieren Sie es online aus (nur mit Leerzeichen, Tabulatoren und Zeilenumbrüchen).
Erklärung im Pseudocode:
quelle
Python 2 , 29 Bytes
Probieren Sie es online!
quelle
Perl 6 , 22 Bytes
Probieren Sie es online!
Anonymer Codeblock, der das Produkt des Bereichs beginnend mit der ersten Eingabe zurückgibt, absteigend um die Sekunde, bis es unter
1
der letzten Zahl liegt. Dies funktioniert für0
, da der Basisfall für das Reduzieren nach Produkt 1 ist, die Ausgabe also 1 ist.quelle
05AB1E ,
1087 BytesEingabe als zwei getrennte Eingänge: erster Eingang ist
base
; zweiter Eingang istfactorial
.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
-2 Bytes dank @ Mr.Xcoder .
-1 Byte danke an @JonathanAllan .
Erläuterung:
Ursprüngliche 10- Byte- Antwort:
Eingabe als zwei getrennte Eingänge: erster Eingang ist
base
; zweiter Eingang istfactorial
.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
LR²ιнP
( online testen ! ) Funktioniert für jeden Testfall, mit Ausnahme von 0.LR²ιн0KP
für 8 Bytes?0K
Sollte unnötig sein, da0!
es sich um eine ungültige Eingabe in der Spezifikation handelt (obwohl sie in den Beispielen enthalten ist). Ich habe dies kommentiert .0!
in der Eingabedomäne ist,ݦRXιнP
spart ein Byte.x86-64-Maschinencode, 12 Byte
Der gleiche Maschinencode führt im 32-Bit-Modus das Gleiche aus, und für 16-Bit-Ganzzahlen im 16-Bit-Modus.
Dies ist eine Funktion, die mit args
n=RCX
, aufrufbar istk=ESI
. 32-Bit-Rückgabewert inEAX
.Aufrufbar von C mit der x86-64-System-V-Aufrufkonvention mit Dummy-Args, um die reellen Args in die richtigen Register zu bringen.
uint32_t factk(int, uint32_t k, int, uint64_t n);
Ich konnte nicht einfach Windows x64 verwenden, weil ein Operandmul
RDX blockiert und wir nicht möchten, dass REX-Präfixe auf R8 / R9 zugreifen.n
darf keinen Müll in den hohen 32-Bit haben, damit JRCXZ funktioniert, aber ansonsten ist alles 32-Bit.NASM-Auflistung (relative Adresse, Maschinencode, Quelle)
0xc = 12 Bytes
Oder 10 Bytes, wenn wir den
n=0
Sonderfall nicht behandeln mussten , ohne dasjrcxz
.Für standard Fakultät würden Sie
loop
anstelle von sub / ja 2 Bytes speichern, aber ansonsten genau den gleichen Code.Testanrufer, der
argc
alsk
, mitn
fest codiertem bestanden wird.quelle
APL (Dyalog Unicode) , 11 Byte SBCS
Anonyme stillschweigende Infix-Funktion. Nimmt
n
als rechtes Argument undb
als linkes Argument.Probieren Sie es online!
×∘⍳
mehrfachb
durch den ɩ ntegers 1 durchn
⊢-
subtrahiere das vonn
⊢,
voranstellenn
1⌈
max von einem und jedem von denen×/
Produktquelle
Ruby , 25 Bytes
Probieren Sie es online!
quelle
Wolfram Language (Mathematica) ,
2221 BytesProbieren Sie es online!
-1 danke an attinat:
Times --> 1##&
Erläuterung: Verwenden Sie diese Option
Range
, um eine Liste der Werte zu{n, n-k, n-2k, n-3k, ...}
erstellen. Halten Sie an, bevor Sie unter 1 fallen (dh halten Sie genau richtig an). Dann multiplizieren Sie alle Zahlen in dieser Liste mitTimes
(oder1##&
).quelle
1##&
stattTimes
Java 10, 44 Bytes
Nimmt die Fakultät als erste Eingabe, die Basis als zweite.
Probieren Sie es online aus.
Dies funktioniert im größten Testfall aufgrund des begrenzten Integer-Bereichs (32 Bit) nicht. Um dies zu beheben können wir verwenden
BigIntegers
, diezufälligistgenau doppelt so groß - 8879 Bytes :-9 Bytes dank @ OlivierGrégoire .
Probieren Sie es online aus.
Erläuterung:
quelle
Japt , 8 Bytes
Versuch es
-1 Danke an EoI, der darauf hinweist, wie dumm Shaggy ohne Koffein sein kann!
quelle
kT
kann durchf
für 1 Byte ersetzt werdenC (gcc) , 41 Bytes
Probieren Sie es online!
quelle
r;f(n,k){for(r=1;n>0;n-=k)r*=n;n=r;}
für C (gcc)MathGolf ,
76 BytesProbieren Sie es online!
Fand eine clevere Möglichkeit, mit 0 umzugehen! ohne die anderen Testfälle zu ändern. Übernimmt die Eingabe als
k n
(umgekehrte Reihenfolge), was beim impliziten Aufsplittern hilft.Erläuterung
quelle
Attache ,
21 bis19 BytesProbieren Sie es online! Ziemlich direkte rekursive Implementierung. (Hinweis: Dies ist im
true
Wesentlichen so1
, wie es in arithmetischen Operationen verwendet werden kann1
.) Dies ist eines der wenigen Programme, die ich für diese Site geschrieben habe, in denen durch die Verwendung eines Unicode-Operators Bytes gespart werden (1, um genau zu sein).Alternativen
20 Bytes:
${x<y or x*$[x-y,y]}
21 Bytes:
Prod@${{_%y=x%y}\1:x}
27 Bytes:
${x*[`1,$][x>y][x-y,y]∨1}
27 Bytes:
${If[x>y,x*$[x-y,y],_or 1]}
27 Bytes:
${x*[`1,$][x>y][x-y,y]or 1}
29 Bytes:
${If[x>y,x*$[x-y,y],_+not _]}
quelle
Rust ,
927361 BytesIch fange gerade an, Rost zu lernen, also bin ich sicher, dass dies kürzer sein kann. Wird aktualisiert, sobald ich es erfahre. Der Rückgabewert sollte sein
i128
, um den letzten Test zu berechnen.Bearbeiten: Rekursion ist kürzer.
Probieren Sie es online!
Sie können Ihren eigenen Test hinzufügen oder einen der bereits vorhandenen bearbeiten.
quelle
q ,
59 57 5553 BytesErläuterung:
Hier ist auch eine Version in k (gleiche Logik),
4241 Bytesquelle
Physica , 22 Bytes
Probieren Sie es online!
26 Bytes
Erneutes Erlernen der Verwendung meiner eigenen "Sprache" \ o / ... Wenn ich vor 2 Jahren gewusst hätte, wie man einen Parser schreibt, wären dies 20 Bytes gewesen :(
oder
Probieren Sie es online!
quelle
Netzhaut , 66 Bytes
Probieren Sie es online! Link enthält schnellere Testfälle. Mauls-Nummern ohne Ausrufezeichen. Erläuterung:
Repariere es
0!
.In Unary konvertieren
n
und ein Trennzeichen hinzufügen.Subtrahiere wiederholt
k
vonn
whilen>k
und sammle die Ergebnisse.Ersetzen Sie
k
durch1
(in Dezimal).Nacheinander mit jedem Zwischenwert multiplizieren und in Dezimalzahl umrechnen.
quelle
Japt , 8 Bytes
Versuch es
quelle
JavaScript (Node.js) , 35 Byte
Probieren Sie es online!
quelle
Viertens (viertens) , 50 Bytes
Probieren Sie es online!
Code Erklärung
quelle
Perl 5
-Mbigint -p
, 45 BytesProbieren Sie es online!
quelle
Stax , 6 Bytes
Führen Sie es aus und debuggen Sie es
Es werden Eingaben in das Formular übernommen
{count} {base}
.quelle
Gaia , 6 Bytes
Probieren Sie es online!
Nimmt die Eingabe als
n
,k
, so Eingang3 4
wäre3!!!!
.quelle