Einführung
Beobachten wir die folgende Reihenfolge (nicht negative ganze Zahlen):
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
Nehmen wir zum Beispiel die ersten drei Zahlen. Das sind 0, 1, 2
. Die in dieser Sequenz verwendeten Nummern können auf sechs verschiedene Arten bestellt werden:
012 120
021 201
102 210
Nehmen wir also an, dass F (3) = 6 ist . Ein weiteres Beispiel ist F (12) . Dies enthält die Zahlen:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
Oder die verkettete Version:
01234567891011
Um die Anzahl der Möglichkeiten zu finden, dies neu anzuordnen, müssen wir uns zuerst die Länge dieser Zeichenfolge ansehen. Die Länge dieser Zeichenfolge beträgt 14
. Also berechnen wir 14! . Zum Beispiel können diejenigen jedoch Orte austauschen, ohne die endgültige Zeichenfolge zu stören. Es gibt 2 Nullen, also gibt es 2! Möglichkeiten, die Nullen auszutauschen, ohne die Reihenfolge zu stören. Es gibt auch 4, also gibt es 4! Möglichkeiten, die zu wechseln. Wir teilen die Summe durch diese beiden Zahlen:
Das hat 14! / (4! × 2!) = 1816214400 Möglichkeiten zum Anordnen der Zeichenfolge 01234567891011
. Wir können also schließen, dass F (12) = 1816214400 ist .
Die Aufgabe
Bei N wird F (N) ausgegeben . Für diejenigen, die keine Einführung brauchen. Um F (N) zu berechnen, verketten wir zuerst die ersten N nicht-negativen ganzen Zahlen (z. B. für N = 12 wäre die verkettete Zeichenfolge 01234567891011
) und berechnen die Anzahl der Möglichkeiten, diese Zeichenfolge anzuordnen.
Testfälle
Input: Output:
0 1
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 119750400
12 1816214400
13 43589145600
14 1111523212800
15 30169915776000
Hinweis
Die Berechnung der Antwort muss innerhalb einer Frist von 10 Sekunden erfolgen . Brute-Forcing ist nicht zulässig .
Das ist Code-Golf , also gewinnt die Einsendung mit der geringsten Anzahl von Bytes!
10
korrekt? Es fühlt sich an, als sollte es weniger als 10 sein, da hier die sich wiederholenden Ziffern beginnen.10
Ziffern sind0, 1, 2, 3, 4, 5, 6, 7, 8, 9
. Zehn verschiedene Ziffern, also 10 !.0
Fall hat meine Zählung abgebrochen (dumme leere Fäden).F(N)
nicht der Fall istO(N!)
und dasslog F(N)
ist ,O(log N!)
aber das ist nur Ahnungen ...Antworten:
Jelly,
17-15BytesProbieren Sie es online! oder überprüfen Sie alle Testfälle auf einmal .
Wie es funktioniert
quelle
ES6,
1188178 BytesJemand muss mir sagen, dass es einen kürzeren Weg gibt, die Zahlen zu verketten
n
.Sparte coole 37 Bytes, indem du die Idee von @ edc65 auf Steroiden ausführst. (Save ein zusätzliches Byte unter Verwendung von ‚|‘ statt
&&
. Aber dem Grenzen des Ergebnis 31 Bit)Edit: 3 weitere Bytes dank @ edc65 gespeichert.
quelle
reduce
:n=>[...[...Array(n).keys()].join``].reduce((r,c,i)=>r*++i/(o[c]=-~o[c]),1,o=[])
n=>[...[...Array(n).keys()].join``].map(c=>r/=(o[c]=-~o[c])/i++,o=[],i=r=1)&&r
r/=(...)/i++
ist genauer alsr*=i++/(...)
? Das ist das lächerlichste Golf, das ich je gesehen habe!APL (Dyalog Extended) , 13 Byte
Probieren Sie es online!
Ein volles Programm. Verwendet
⎕IO←0
.Wie es funktioniert
Die multinomiale Berechnung ergibt sich aus folgender Tatsache:
quelle
MATL , 21 Bytes
Probieren Sie es online!
Erläuterung
quelle
Python 2,
14213710197 Bytes(Danke @adnan für den Vorschlag über
input
)(Wendet die inkrementelle Berechnung von der C-Version an )
Originalversion mit Fakultät
Wirklich, das einzige, was oben erwähnt wird, ist das Aufrufen
math.factorial
F
und Weglassen einiger Leerzeichen, also gibt es wahrscheinlich eine kürzere Python-Lösung.Wenn eine Erklärung erforderlich ist, wird
v
die Häufigkeit jeder Ziffer gezählt. Die Zählung wird für jede Ziffer in jeder Zahl im angegebenen Bereich aktualisiert.In der Originalversion berechnen wir die Anzahl der Permutationen mit der Standardformel (Σf i )! / Π (f i !). Für die aktuelle Version erfolgt diese Berechnung inkrementell, indem die Multiplikationen und Divisionen so verteilt werden, wie wir die Ziffern sehen. Es mag nicht offensichtlich sein, dass die ganzzahlige Teilung immer genau sein wird, aber es ist leicht zu beweisen, dass jede Division durch mehrere aufeinanderfolgende ganze Zahlen
k
folgen mussk
, sodass eine dieser Multiplikationen durch teilbar sein mussk
. (Das ist eine Intuition, kein Beweis.)Die Originalversion ist schneller für große Argumente, da sie nur 10 Bignum-Teilungen enthält. Obwohl das Teilen eines Bignums durch eine kleine ganze Zahl schneller ist als das Teilen eines Bignums durch ein Bignum, wird es bei Tausenden von Bignum-Teilungen etwas träge.
quelle
Python 2, 197 Bytes (edit: 4 Bytes gespeichert, danke Thomas Kwa!)
Ungolfed:
quelle
range(0,10)
kann seinrange(10)
.CJam,
2119 BytesTeste es hier.
Erläuterung
quelle
JavaScript (ES6), 100
Prüfung
quelle
k[c]=~-k[c]
auch mit--k[c]
?Pyth, 18 Bytes
Probieren Sie es online aus: Demonstration
quelle
Haskell, 92 Bytes
Anwendungsbeispiel:
h 12
->1816214400
.Wie es funktioniert
quelle
C
236174138121 BytesRici gebührt viel Anerkennung für die massive Reduzierung von Bytes.
Ungolfed
Probieren Sie es hier aus .
quelle
#define L long long L d;i,j,k,m,n,s=1,b[10]={1};L f(n){return n?n*f(n-1):1;}main(d){for(scanf("%d",&n);i<n;)for(j=i++;j;j/=10)++b[j%10],++s;for(;m<10;)d*=f(b[m++]);printf("%Ld",f(s)/d);}
for(;m<10;)s+=b[m],d*=f(b[m++])
aber ich denke, das sind ein paar Bytes mehr.C / bc,
233121112 Bytes (unter der Annahme einer 3-Byte-Strafe für|bc
)Inspiriert von Cole Cameron, wurde die hackige Manipulation von Charakteren entfernt und der Argumentwert einfach berechnet.
Geändert in scanf von arg vector.
Muss
bc
tatsächlich die willkürliche Präzisionsberechnung durchführen.Ungolfed und warnfrei:
Illustriert (dem ich vertraue, zeigt der Algorithmus):
Und mit der Pipe durch bc (und addiert die Berechnung von F (1000):
Dies berechnete F (5000) - eine 18.592-stellige Zahl - in weniger als 10 Sekunden.
quelle
Perl 6, 117 Bytes
und in einer lesbareren fasion
quelle
Perl 5, 108 Bytes
Vielen Dank an dev-null für das Speichern von 17 Bytes und an japhy für die faktorielle Idee.
quelle
05AB1E ,
131211 BytesProbieren Sie es online!
quelle
Python 2 , 123 Bytes
Probieren Sie es online!
range
Eingabe in eine einzelne Zeichenfolgequelle
PowerShell, 125 Byte
Nimmt Eingaben auf
$args[0]
, subtrahiert1
, erstellt eine Reihe von Ganzzahlen von0..
dieser Zahl-join
und fügt sie zu einer Zeichenfolge zusammen und speichert sie als$b
. Wir nehmen die.Length
von dieser Zeichenkette, bauen einen anderen Bereich von1..
dieser Länge auf,-join
diese ganzen Zahlen zusammen mit*
, und leiten das dann weiterInvoke-Expression
(ähnlich wieeval
) weiter. Mit anderen Worten, wir haben die Fakultät der Länge der Zahlenfolge basierend auf der Eingabe konstruiert. Das ist unser Zähler.Das teilen wir
/
durch ...Unser Nenner, der aufgebaut wird, indem ein Bereich genommen
0..9
und durch eine for-Schleife gesendet wird|%{...}
. Bei jeder Iteration setzen wir eine Hilfsvariable$c
, die der Häufigkeit entspricht, mit der die aktuelle Ziffer dank des .NET- Aufrufs in Verbindung mit dem Attribut$_
angezeigt wird. Wir konstruieren dann einen neuen Bereich von bis zu diesem Wert, solange er nicht Null ist. Ja, in vielen Fällen wird dies zu einem Bereich führen , der als gerecht bewertet wird . Wir nehmen alle diejenigen , und sie zusammen mit , dann Rohr , das zu wieder. Mit anderen Worten, wir haben das Produkt der Fakultäten der Anzahl der Vorkommen jeder Ziffer konstruiert.$b
[regex]::matches
.count
1..
1..1
1
-join
*
Invoke-Expression
NB
Erledigt Eingaben
90
problemlos und in deutlich weniger als einer Sekunde.... darüber hinaus ergibt sich
Infinity
als Ausgabe, da die Länge der durchlässigen Zeichenkette ergibt,170!
welche in dendouble
Datentyp (7.25741561530799E+306
) passt , dies aber171!
nicht tut. PowerShell hat eine ... Eigenheit ..., die im Falle eines Überlaufs automatisch von[int]
nach[double]
hochwandelt (vorausgesetzt, Sie haben die Variable nicht explizit umgewandelt). Nein, ich weiß nicht, warum es nicht[long]
für ganzzahlige Werte geht.Wenn wir explizite Casting- und Manipulationsvorgänge durchführen (z. B. mit
[uint64]
64-Bit-Ganzzahlen ohne Vorzeichen), könnten wir diese zwar erhöhen, aber der Code würde dadurch erheblich aufgebläht, da wir mit Bedingungen einen Bereich von bis zu 170 Länge benötigen und ihn dann neu erstellen müssten jede Multiplikation von da an. Da die Herausforderung keinen oberen Bereich angibt, gehe ich davon aus, dass dies angemessen ist.quelle
Perl6
Im Moment eher ungolfed - brauche jetzt Schlaf.
quelle
Groovy, 156 Bytes
Meine bescheidene erste Code Golf Lösung. Sie können es hier testen.
Und hier ist eine besser lesbare Version:
Ganz einfach, aber es gab ein paar Highlights für mich:
Durchführen einer Injektion / Reduktion von einem Array von
chars
auf einMap<Character, Integer>
. Dies war immer noch etwas kompliziert, da es keinen Standardwert für die Kartenwerte gab. Dies bezweifle, dass dies möglich ist, aber wenn die Karte alle Werte auf 0 zurücksetzt, könnte ich das Ternäre vermeiden, das notwendig ist, um eine NPE zu vermeiden.Der Groovy Spread Operator (zB
}*.value
) macht immer SpaßEin ärgerliches Merkmal war jedoch die Notwendigkeit, die Fakultätsfunktion mit dem Rückgabetyp zu deklarieren
BigInteger
. Ich hatte den Eindruck, dass Groovy alle Zahlen inBigInteger
oder eingeschlossen hatBigDecimal
, aber dies ist möglicherweise nicht der Fall, wenn es um Rückgabetypen geht. Ich muss noch mehr experimentieren. Ohne diesen explizit angegebenen Rückgabetyp erhalten wir sehr schnell falsche Fakultätswerte.quelle
J, 33 Bytes
Konvertiert den Bereich in eine Folge von Ziffern, zählt jede Ziffer und wendet den Multinomialkoeffizienten an, um das Ergebnis zu berechnen.
Verwendung
quelle
R, 118 Bytes
Ungefähr 8 Monate zu spät zur Party, aber ich dachte, ich würde es versuchen, weil es nach einer interessanten Herausforderung aussah.
Probieren Sie es auf R-Geige
Erklärt
0 ... n-1
und reduzieren Sie ihn zu einem String:paste(1:n-1,collapse="")
x
):x=as.numeric(el(strsplit(...,"")))
factorial(sum(1|x))
was gerade ist#digits!
Um den Nenner zu berechnen, erstellen wir
table
eine Kontingenztabelle, in der die Häufigkeiten aufgelistet sind. Im Fall von F (12) ist die erzeugte Tabelle:Das heißt, wir können die Verwendung
factorial()
(die übrigens vektorisiert ist) für die Zählung verwenden und einfach das Produkt nehmen:prod(factorial(table(x)))
Hinweis: Die Schritte 4 und 5 werden nur ausgeführt, wenn sie
n>0
ansonsten zurückgegeben werden1
.quelle
Mathematica, 65 Bytes
Könnte wahrscheinlich weiter golfen werden.
quelle
Ruby , 64 Bytes
Probieren Sie es online!
quelle
Stax , 12 Bytes
Führen Sie es aus und debuggen Sie es unter staxlang.xyz!
Entpackt (14 Bytes) und Erklärung:
quelle
Jelly , 11 Bytes
Dennis '15-Byte -Gelee-Antwort auf dem Golfplatz ...
Ein monadischer Link, der eine nicht negative Ganzzahl akzeptiert, die eine positive Ganzzahl ergibt.
Probieren Sie es online! Oder sehen Sie sich die Testsuite an .
Wie?
quelle
Python 2 , 190 Bytes
Probieren Sie es online!
quelle
Python 2 , 134 Bytes
Probieren Sie es online!
Ein alternativer Ansatz ...
quelle