Número de exceções


16

Tarefa

Dados 2 números inteiros positivos ne k, onde n > k, produz o número de exceções de um conjunto de nelementos distinguíveis para um conjunto de kelementos 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=3e k=2, a saída é 6, pois existem 6exceções de {1,2,3}para {1,2}:

  1. 1↦1, 2↦1, 3↦2
  2. 1↦1, 2↦2, 3↦1
  3. 1↦1, 2↦2, 3↦2
  4. 1↦2, 2↦1, 3↦1
  5. 1↦2, 2↦1, 3↦2
  6. 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 é . A resposta mais curta em bytes vence.

Aplicam-se brechas padrão .


11
Uma definição de rejeição seria legal.
Stewie Griffin

3
É intencional que n não possa ser igual a k ?
Dennis

1
@ Dennis Eu gosto de excluir todos os casos borda possível dos meus desafios
Leaky Nun

3
Esse parece ser um caso importante a ser incluído. Meu palpite é que a maioria das respostas que o trabalho para n> k também irá trabalhar para n == k mas pode permitir algum lugar golfe sorrateira
dylnan

@ quem votou para fechar qual é o seu motivo?
dylnan

Respostas:


5

Geléia , 5 4 bytes

ṗṬML

Esta é uma solução de força bruta O (k n ) .

Experimente online!

Como funciona

ṗṬML  Main link. Left argument: k. Right argument: n.

ṗ     Cartesian power; yield the list of all n-tuples over {1, ..., k}.
      Each tuple represents a (not necessarily surjective) function from
      {1, ..., n} to {1, ..., k}.
 Ṭ    Apply the "untruth" atom to each tuple.
      Ṭ maps a list of indices to an array with 1's at those indices, and exactly
      as many zeroes as needed to build the array.
      Examples:
           [1, 2, 3, 3, 3] -> [1, 1, 1]
           [1, 3, 5]       -> [1, 0, 1, 0, 1]
           [2, 6, 2, 4, 4] -> [0, 1, 0, 1, 0, 1]
  M   Yield all indices of maximal elements, i.e., all indices of [1] * k.
   L  Take the length.

4

Haskell , 48 bytes

s(_,1)=1
s(1,_)=0
s(m,n)=n*(s(m-1,n-1)+s(m-1,n))

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 nimagens, eu posso

  • espremer uma [m]criação singleton em qualquer um dos nlimites que cercam os n-1grupos
  • ou adicione meu novo ma qualquer um dos ngrupos já existentes de[1..m-1]

Haskell , 38 bytes

m#n|n<2=1|m<2=0|o<-m-1=n*(o#(n-1)+o#n)

Experimente online!


2
38 bytes usando um operador infix: Experimente online!
Laikoni

4

Lean , 66 bytes

def s:_->nat->nat|(m+1)(n+1):=(n+1)*(s m n+s m(n+1))|0 0:=1|_ _:=0

Experimente online!


Prova de correção

Experimente online!


Explicação

Vamos desfazer a função:

def s : nat->nat->nat
| (m+1) (n+1) := (n+1)*(s m n + s m (n+1))
| 0     0     := 1
| _     _     := 0

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)e s(0, 0) = 1, que deixa em aberto s(m+1, 0)e s(0, n+1), os quais são definidos como sendo 0no ú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:

def correctness : ∀ m n, fin (s m n) ≃ { f : fin m → fin n // function.surjective f } :=
λ m, nat.rec_on m (λ n, nat.cases_on n s_zero_zero (λ n, s_zero_succ n)) $
λ m ih n, nat.cases_on n (s_succ_zero m) $ λ n,
calc fin (s (nat.succ m) (nat.succ n))
   ≃ (fin (n + 1) × (fin (s m n + s m (n + 1)))) :
  (fin_prod _ _).symm
... ≃ (fin (n + 1) × (fin (s m n) ⊕ fin (s m (n + 1)))) :
  equiv.prod_congr (equiv.refl _) (fin_sum _ _).symm
... ≃ (fin (n + 1) × ({f : fin m → fin n // function.surjective f} ⊕
         {f : fin m → fin (n + 1) // function.surjective f})) :
  equiv.prod_congr (equiv.refl _) (equiv.sum_congr (ih n) (ih (n + 1)))
... ≃ {f // function.surjective f} : s_aux m n

def correctness_2 (m n : nat) : s m n = fintype.card { f : fin m → fin n // function.surjective f } :=
by rw fintype.of_equiv_card (correctness m n); simp

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 que 0é um número natural é expressa como 0 : nat. Dizemos que 0é do tipo nat, e que nattem 0como 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 every me n(o Lean deduz automaticamente o seu tipo nat, pelo que se segue).

  • fin (s m n)é o tipo de números naturais menor que s m n. Para formar um habitante, fornece-se um número natural e uma prova de que é menor que s m n.

  • A ≃ B: bijeção entre o tipo Ae o tipo B. Dizer bijeção é enganoso, pois é preciso fornecer a função inversa.

  • { f : fin m → fin n // function.surjective f }o tipo de rejeições de fin mpara fin n. Essa sintaxe cria um subtipo a partir do tipo fin m → fin n, ou seja, o tipo de funções de fin mpara fin n. A sintaxe é { var : base type // proposition about var }.

  • λ m: ∀ var, proposition / type involving varé realmente uma função que recebe varcomo entrada, então λ mintroduz a entrada. ∀ m n,é uma mão curta para∀ m, ∀ n,

  • nat.rec_on m: faça recursão em m. Para definir algo para m, defina a coisa para 0e, em seguida, dê a coisa para k, construa a coisa para k+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...


3

J , 19 bytes

-/@(^~*]!0{])],i.@-

Experimente online!

Explicação

-/@(^~*]!0{])],i.@-  Input: n (LHS), k (RHS)
                  -  Negate k
               i.@   Range [k-1, k-2, ..., 0]
             ]       Get RHS
              ,      Join, forms [k, k-1, ..., 0]
   (        )        Dyad between n (LHS), [k, k-1, ..., 0] (RHS)
           ]           Get RHS
         0{            Select value at index 0
       ]               Get RHS
        !              Binomial coefficient
    ^~                 Raise each in RHS to power of n
      *                Multiply
-/@                  Reduce from right to left using subtraction (forms alternating sum)

-/@(^~*]!0{])]-i.
FrownyFrog

2

R , 49 bytes

function(n,k,j=0:k)((-1)^(k-j)*j^n)%*%choose(k,j)

Experimente online!

Implementa uma das fórmulas de Mario Catalani:

T(n, k) = Sum_{j=0..k} (-1)^(k-j)*j^n*binomial(k, j)

ou alternadamente:

T(n, k) = Sum_{j=0..k} (-1)^j*binomial(k, j)*(k-j)^n

que gera a mesma contagem de bytes em R.


2

Python 2 , 56 53 50 bytes

f=lambda n,k:n/k and(1/k or f(n-1,k-1)+f(n-1,k))*k

Experimente online!

-3 bytes graças a H.PWiz.

-3 bytes graças a Dennis.

  • Se n<knem todos kpuderem ser mapeados, não haverá exceções. n/k andcuida disso.
  • Tomar f(0,0)=1nos dá o único caso básico diferente de zero que precisamos. 1/k orconsegue isso.


2

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:

# Compute k-th row of Pascal's triangle
({}<({}()){({}[(())]<<>{({}({})<>)<>}{}>)}{}>)<>

# Multiply each element by n^j (and reverse to other stack)
{<>(({}<>)<{({}[()]<([])({([{}]()({}))([{}]({}))}{}[{}])>)}{}({}<>)>)<>}

# Compute alternating sum
<>{}{}{({}<>[{}])<>}<>


2

Casca , 7 bytes

#`¦ḣ¹π²

Experimente online!

Explicação

#`¦ḣ¹π²  Inputs: n (²), implicit k (¹)
     π²  Cartesian power of [1..k] to n
#        Count if:
   ḣ¹      Range [1..k]
 `¦        Is a subset


1

05AB1E , 10 bytes

sLsãʒêgQ}g

Experimente online!

Explicação

sLsã       # Cartesian product of range(k) repeated n times
    ʒ   }  # Filter by ...
     êgQ   # Connected uniquified length == k  (every item in range(k) appears at least once)
         g # Count
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.