Tâche
Étant donné 2 entiers positifs n
et k
, où n > k
, sortir le nombre de surjections d'un ensemble d' n
éléments distinguables à un ensemble d' k
éléments distinguables.
Définition
Une fonction f: S → T est appelée surjection si pour chaque t∈T il y a s∈S tel que f (s) = t.
Exemple
Quand n=3
et k=2
, la sortie est 6
, car il y a des 6
surjections de {1,2,3}
à {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
Cas de test
n k output
5 3 150
8 4 40824
9 8 1451520
Référence
Notation
C'est du code-golf . La réponse la plus courte en octets l'emporte.
Des échappatoires standard s'appliquent.
code-golf
arithmetic
set-theory
Leaky Nun
la source
la source
Réponses:
Gelée ,
54 octetsIl s'agit d'une solution de force brute O (k n ) .
Essayez-le en ligne!
Comment ça fonctionne
la source
Haskell , 48 octets
Essayez-le en ligne!
Pourquoi le nombre de surjection
s(m,n)=n*s(m-1,n-1)+n*s(m-1,n)
?afin de récolter des
n
images, je peux soit[m]
création singleton dans l'une desn
frontières entourant lesn-1
groupesm
dans l'un desn
groupes déjà existants de[1..m-1]
Haskell , 38 octets
Essayez-le en ligne!
la source
Lean , 66 octets
Essayez-le en ligne!
Preuve d'exactitude
Essayez-le en ligne!
Explication
Libérons la fonction:
La fonction est définie par la correspondance de motifs et la récursivité, qui ont toutes deux un support intégré.
Nous définissons
s(m+1, n+1) = (n+1) * (s(m, n) + s(m, n+1)
ets(0, 0) = 1
, qui laisse ouverts(m+1, 0)
ets(0, n+1)
, qui sont tous deux définis pour être0
par le dernier cas.Lean utilise la syntaxe de calcul lamdba, tout
s m n
commes(m, n)
.Maintenant, la preuve d'exactitude: je l'ai dit de deux manières:
Le premier est ce qui se passe vraiment: une bijection entre
[0 ... s(m, n)-1]
et les surjections de[0 ... m-1]
sur[0 ... n-1]
.Le second est la façon dont il est généralement indiqué,
s(m, n)
c'est la cardinalité des surjections de[0 ... m-1]
sur[0 ... n-1]
.Lean utilise la théorie des types comme fondement (au lieu de la théorie des ensembles). En théorie des types, chaque objet a un type qui lui est inhérent.
nat
est le type de nombres naturels, et la déclaration qui0
est un nombre naturel est exprimée par0 : nat
. Nous disons que0
c'est de typenat
, et celanat
a0
comme habitant.Les propositions (déclarations / assertions) sont également des types: leur habitant est une preuve de la proposition.
def
: Nous allons introduire une définition (car une bijection est vraiment une fonction, pas seulement une proposition).correctness
: le nom de la définition∀ m n
: pour chaquem
etn
(Lean déduit automatiquement que leur type estnat
, à cause de ce qui suit).fin (s m n)
est le type de nombres naturels inférieur às m n
. Pour faire un habitant, on fournit un nombre naturel et une preuve qu'il est plus petit ques m n
.A ≃ B
: bijection entre le typeA
et le typeB
. Dire la bijection est trompeur, car il faut en fait fournir la fonction inverse.{ f : fin m → fin n // function.surjective f }
le type de surjections defin m
àfin n
. Cette syntaxe construit un sous-type à partir du typefin m → fin n
, c'est-à-dire le type de fonctions defin m
àfin n
. La syntaxe est{ var : base type // proposition about var }
.λ m
:∀ var, proposition / type involving var
est vraiment une fonction qui prendvar
en entrée, doncλ m
introduit l'entrée.∀ m n,
est raccourci pour∀ m, ∀ n,
nat.rec_on m
: faire récursivité surm
. Pour définir quelque chose pourm
, définir la chose pour0
et puis donner la chose pourk
, construire la chose pourk+1
. On remarquerait que cela est similaire à l'induction, et c'est en fait le résultat de la correspondance Church-Howard . La syntaxe estnat.rec_on var (thing when var is 0) (for all k, given "thing when k is k", build thing when var is "k+1")
.Hé, ça devient long et je ne suis qu'en troisième ligne de
correctness
...la source
J , 19 octets
Essayez-le en ligne!
Explication
la source
-/@(^~*]!0{])]-i.
R , 49 octets
Essayez-le en ligne!
Implémente l'une des formules de Mario Catalani:
ou alternativement:
qui donne le même nombre d'octets dans R.
la source
Python 2 ,
56 5350 octetsEssayez-le en ligne!
-3 octets grâce à H.PWiz.
-3 octets grâce à Dennis.
n<k
tous nek
peuvent pas être cartographiés, il n'y a donc pas de surjections.n/k and
s'occupe de cela.f(0,0)=1
nous donne le seul cas de base non nul dont nous avons besoin.1/k or
y parvient.la source
Rubis , 46 octets
Essayez-le en ligne!
Approche récursive standard ...
la source
Brain-Flak , 142 octets
Essayez-le en ligne!
Celui-ci utilise la formule standard d'inclusion-exclusion.
Je ne peux pas écrire une explication complète pour le moment, mais voici une explication de haut niveau:
la source
Pari / GP , 38 octets
Essayez-le en ligne!
En utilisant la formule de Vladimir Kruchinin sur OEIS:
la source
Husk , 7 octets
Essayez-le en ligne!
Explication
la source
JavaScript (Node.js) , 43 octets
Essayez-le en ligne!
la source
05AB1E , 10 octets
Essayez-le en ligne!
Explication
la source