Aufgabe
Gegeben 2 positive ganze Zahlen sind n
und k
, wobei der n > k
Ausgang die Anzahl von Surjektionen aus einem Satz von n
unterscheidbaren Elementen in einen Satz von k
unterscheidbaren Elementen.
Definition
Eine Funktion f: S → T heißt Surjektion, wenn für jedes t everyT s∈S gilt, so dass f (s) = t.
Beispiel
Wann n=3
und k=2
, ist die Ausgabe 6
, da es 6
Einwände von {1,2,3}
bis gibt {1,2}
:
1↦1, 2↦1, 3↦2
1↦1, 2↦2, 3↦1
1↦1, 2↦2, 3↦2
1↦2, 2↦1, 3↦1
1↦2, 2↦1, 3↦2
1↦2, 2↦2, 3↦1
Testfälle
n k output
5 3 150
8 4 40824
9 8 1451520
Referenz
Wertung
Das ist Code-Golf . Kürzeste Antwort in Bytes gewinnt.
Es gelten Standardlücken .
code-golf
arithmetic
set-theory
Undichte Nonne
quelle
quelle
Antworten:
Gelee ,
54 BytesDies ist eine O (k n ) Brute-Force-Lösung.
Probieren Sie es online!
Wie es funktioniert
quelle
Haskell , 48 Bytes
Probieren Sie es online!
Warum zählt der Widerspruch
s(m,n)=n*s(m-1,n-1)+n*s(m-1,n)
?Um
n
Bilder zu sammeln , kann ich entweder[m]
Kreation in eine dern
Grenzen, dien-1
Gruppen umgebenm
in eine dern
bereits vorhandenen Gruppen von[1..m-1]
Haskell , 38 Bytes
Probieren Sie es online!
quelle
Mager , 66 Bytes
Probieren Sie es online!
Beweis der Richtigkeit
Probieren Sie es online!
Erläuterung
Lassen Sie uns die Funktion entgolfen:
Die Funktion wird durch Mustervergleich und Rekursion definiert, die beide eine integrierte Unterstützung haben.
Wir definieren
s(m+1, n+1) = (n+1) * (s(m, n) + s(m, n+1)
unds(0, 0) = 1
, was offen lässts(m+1, 0)
und wass(0, n+1)
beide als0
der letzte Fall definiert sind.Lean verwendet, so wie es
s m n
ist, die Lamdba-Kalkülsyntaxs(m, n)
.Nun zum Beweis der Richtigkeit: Ich habe es auf zwei Arten ausgedrückt:
Das erste ist, was wirklich vor sich geht: eine Trennung zwischen
[0 ... s(m, n)-1]
und die Auswüchse von[0 ... m-1]
auf[0 ... n-1]
.Das zweite ist, wie gewöhnlich gesagt wird, das
s(m, n)
ist die Kardinalität der Surjektionen von[0 ... m-1]
auf[0 ... n-1]
.Lean verwendet die Typentheorie als Grundlage (anstelle der Mengenlehre). In der Typentheorie hat jedes Objekt einen Typ, der ihm inhärent ist.
nat
ist die Art der natürlichen Zahlen, und die Aussage, dass0
es sich um eine natürliche Zahl handelt, wird ausgedrückt als0 : nat
. Wir sagen, das0
ist von Typnat
, und dasnat
hat0
als Einwohner.Sätze (Aussagen / Behauptungen) sind ebenfalls Typen: Ihr Bewohner ist ein Beweis für den Satz.
def
: Wir werden eine Definition einführen (weil eine Bijektion wirklich eine Funktion ist, nicht nur ein Satz).correctness
: der Name der Definition∀ m n
: für jedesm
undn
(Lean gibt automatisch an, dass es sich um einen Typ handeltnat
, und zwar aus folgendem Grund).fin (s m n)
ist die Art der natürlichen Zahlen, die kleiner als ists m n
. Um einen Einwohner zu machen, liefert man eine natürliche Zahl und einen Beweis, dass sie kleiner ist alss m n
.A ≃ B
: bijection zwischen dem TypA
und dem TypB
. Bijektion zu sagen ist irreführend, da man tatsächlich die Umkehrfunktion bereitstellen muss.{ f : fin m → fin n // function.surjective f }
die Art der Einwände vonfin m
bisfin n
. Diese Syntax bildet einen Untertyp aus dem Typfin m → fin n
, dh der Art der Funktionen vonfin m
bisfin n
. Die Syntax lautet{ var : base type // proposition about var }
.λ m
:∀ var, proposition / type involving var
ist wirklich eine Funktion, dievar
als Eingabe nimmt, alsoλ m
die Eingabe einführt.∀ m n,
ist Abkürzung für∀ m, ∀ n,
nat.rec_on m
: Rekursion machen aufm
. Um etwas zu definierenm
, definieren Sie das Ding für0
und geben Sie das Ding fürk
, bauen Sie das Ding fürk+1
. Man würde bemerken, dass dies der Induktion ähnlich ist, und dies ist in der Tat ein Ergebnis der Church-Howard-Korrespondenz . Die Syntax lautetnat.rec_on var (thing when var is 0) (for all k, given "thing when k is k", build thing when var is "k+1")
.Heh, das wird lang und ich bin nur in der dritten Zeile von
correctness
...quelle
J , 19 Bytes
Probieren Sie es online!
Erläuterung
quelle
-/@(^~*]!0{])]-i.
R , 49 Bytes
Probieren Sie es online!
Implementiert eine der Formeln von Mario Catalani:
oder alternativ:
das ergibt die gleiche Byteanzahl in R.
quelle
Python 2 ,
56 5350 BytesProbieren Sie es online!
-3 Bytes dank H.PWiz.
-3 Bytes dank Dennis.
n<k
nicht allek
abgebildet werden können, gibt es keine Einwände.n/k and
kümmert sich darum.f(0,0)=1
gibt uns den einzigen Grundfall ungleich Null, den wir brauchen.1/k or
erreicht dies.quelle
Ruby , 46 Bytes
Probieren Sie es online!
Standardrekursiver Ansatz ...
quelle
Brain-Flak , 142 Bytes
Probieren Sie es online!
Dies verwendet die Standard-Einschluss- / Ausschlussformel.
Ich kann derzeit keine vollständige Erklärung verfassen, aber hier eine allgemeine Erklärung:
quelle
Pari / GP , 38 Bytes
Probieren Sie es online!
Mit der Formel von Vladimir Kruchinin auf OEIS:
quelle
Schale , 7 Bytes
Probieren Sie es online!
Erläuterung
quelle
JavaScript (Node.js) , 43 Byte
Probieren Sie es online!
quelle
05AB1E , 10 Bytes
Probieren Sie es online!
Erläuterung
quelle