Tarefa
Dados 2 números inteiros positivos n
e k
, onde n > k
, produz o número de exceções de um conjunto de n
elementos distinguíveis para um conjunto de k
elementos distinguíveis.
Definição
Uma função f: S → T é chamada de rejeição se para cada t∈T houver s∈S tal que f (s) = t.
Exemplo
Quando n=3
e k=2
, a saída é 6
, pois existem 6
exceções de {1,2,3}
para {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
Casos de teste
n k output
5 3 150
8 4 40824
9 8 1451520
Referência
Pontuação
Isso é código-golfe . A resposta mais curta em bytes vence.
Aplicam-se brechas padrão .
code-golf
arithmetic
set-theory
Freira Furada
fonte
fonte
Respostas:
Geléia ,
54 bytesEsta é uma solução de força bruta O (k n ) .
Experimente online!
Como funciona
fonte
Haskell , 48 bytes
Experimente online!
Por que a contagem de rejeição
s(m,n)=n*s(m-1,n-1)+n*s(m-1,n)
?para coletar
n
imagens, eu posso[m]
criação singleton em qualquer um dosn
limites que cercam osn-1
gruposm
a qualquer um dosn
grupos já existentes de[1..m-1]
Haskell , 38 bytes
Experimente online!
fonte
Lean , 66 bytes
Experimente online!
Prova de correção
Experimente online!
Explicação
Vamos desfazer a função:
A função é definida pela correspondência e recursão de padrão, ambas com suporte interno.
Definimos
s(m+1, n+1) = (n+1) * (s(m, n) + s(m, n+1)
es(0, 0) = 1
, que deixa em abertos(m+1, 0)
es(0, n+1)
, os quais são definidos como sendo0
no último caso.O Lean usa a sintaxe do cálculo lamdba, assim
s m n
és(m, n)
.Agora, a prova da correção: afirmei de duas maneiras:
O primeiro é o que realmente está acontecendo: uma bijeção entre
[0 ... s(m, n)-1]
e as exceções de[0 ... m-1]
para[0 ... n-1]
.O segundo é como é geralmente afirmado, que
s(m, n)
é a cardinalidade das sobras de[0 ... m-1]
para[0 ... n-1]
.O Lean usa a teoria dos tipos como base (em vez da teoria dos conjuntos). Na teoria dos tipos, todo objeto tem um tipo que é inerente a ele.
nat
é o tipo de números naturais e a declaração que0
é um número natural é expressa como0 : nat
. Dizemos que0
é do tiponat
, e quenat
tem0
como habitante.Proposições (declarações / asserções) também são tipos: seu habitante é uma prova da proposição.
def
: Vamos introduzir uma definição (porque uma bijeção é realmente uma função, não apenas uma proposição).correctness
: o nome da definição∀ m n
: for everym
en
(o Lean deduz automaticamente o seu tiponat
, pelo que se segue).fin (s m n)
é o tipo de números naturais menor ques m n
. Para formar um habitante, fornece-se um número natural e uma prova de que é menor ques m n
.A ≃ B
: bijeção entre o tipoA
e o tipoB
. Dizer bijeção é enganoso, pois é preciso fornecer a função inversa.{ f : fin m → fin n // function.surjective f }
o tipo de rejeições defin m
parafin n
. Essa sintaxe cria um subtipo a partir do tipofin m → fin n
, ou seja, o tipo de funções defin m
parafin n
. A sintaxe é{ var : base type // proposition about var }
.λ m
:∀ var, proposition / type involving var
é realmente uma função que recebevar
como entrada, entãoλ m
introduz a entrada.∀ m n,
é uma mão curta para∀ m, ∀ n,
nat.rec_on m
: faça recursão emm
. Para definir algo param
, defina a coisa para0
e, em seguida, dê a coisa parak
, construa a coisa parak+1
. Alguém poderia notar que isso é semelhante à indução e, de fato, isso é resultado da correspondência entre Igreja e Howard . A sintaxe énat.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, isso está ficando longo e eu estou apenas na terceira linha de
correctness
...fonte
J , 19 bytes
Experimente online!
Explicação
fonte
-/@(^~*]!0{])]-i.
R , 49 bytes
Experimente online!
Implementa uma das fórmulas de Mario Catalani:
ou alternadamente:
que gera a mesma contagem de bytes em R.
fonte
Python 2 ,
56 5350 bytesExperimente online!
-3 bytes graças a H.PWiz.
-3 bytes graças a Dennis.
n<k
nem todosk
puderem ser mapeados, não haverá exceções.n/k and
cuida disso.f(0,0)=1
nos dá o único caso básico diferente de zero que precisamos.1/k or
consegue isso.fonte
Ruby , 46 bytes
Experimente online!
Abordagem recursiva padrão ...
fonte
Flacidez Cerebral , 142 bytes
Experimente online!
Isso usa a fórmula de inclusão-exclusão padrão.
Não posso escrever uma explicação completa no momento, mas aqui está uma explicação de alto nível:
fonte
Pari / GP , 38 bytes
Experimente online!
Usando a fórmula de Vladimir Kruchinin no OEIS:
fonte
Casca , 7 bytes
Experimente online!
Explicação
fonte
JavaScript (Node.js) , 43 bytes
Experimente online!
fonte
05AB1E , 10 bytes
Experimente online!
Explicação
fonte