Enjeksiyon sayısı


16

Görev

2 pozitif tamsayı verildiğinde nve kburada n > k, bir dizi nayırt edilebilir elemandan bir dizi ayırt edilebilir elemana yapılan enjeksiyon sayısını verir k.

Tanım

Eğer her t∈T için f (s) = t olacak şekilde s∈S varsa, f: S → T fonksiyonuna bir sapma denir.

Misal

Ne zaman n=3ve k=2çıkış olduğunu 6olmadığından, 6surjections gelen {1,2,3}için {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

testcases

n k output
5 3 150
8 4 40824
9 8 1451520

Referans

puanlama

Bu . Bayt cinsinden en kısa cevap kazanır.

Standart boşluklar geçerlidir.


11
Şaşkınlığın tanımı güzel olurdu.
Stewie Griffin

3
N'nin k'ye eşit olmaması kasıtlı mıdır ?
Dennis

1
@Dennis Mümkün olan her uç vakayı zorluklarımdan hariç tutmayı seviyorum
Leaky Nun

3
Bu dahil edilmesi gereken önemli bir durum gibi görünüyor. Benim tahminim n> k için çalışan çoğu cevap da n == k için çalışacak ama bazı yerlerde sinsi golf izin verebilir
dylnan

@ kapatmaya oy veren kişi nedeniniz nedir?
dylnan

Yanıtlar:


5

Jöle , 5 4 bayt

ṗṬML

Bu, bir O (k , n ) kaba kuvvet çözeltisi.

Çevrimiçi deneyin!

Nasıl çalışır

ṗṬ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 bayt

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

Çevrimiçi deneyin!

Bekleme neden önemlidir s(m,n)=n*s(m-1,n-1)+n*s(m-1,n)?

ngörüntüleri hasat etmek için

  • grupları çevreleyen sınırların [m]herhangi birine tek bir yaratma sıkmaknn-1
  • ya benim yeni eklemek mherhangi birine nzaten mevcut gruplar[1..m-1]

Haskell , 38 bayt

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

Çevrimiçi deneyin!


2
Bir infix operatörü kullanarak 38 bayt: Çevrimiçi deneyin!
Laikoni

4

Yalın , 66 bayt

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

Çevrimiçi deneyin!


Doğruluk kanıtı

Çevrimiçi deneyin!


açıklama

Fonksiyonu çözelim:

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

İşlev, her ikisi de yerleşik desteğe sahip desen eşleştirme ve özyineleme ile tanımlanır.

Biz tanımlamak s(m+1, n+1) = (n+1) * (s(m, n) + s(m, n+1)ve s(0, 0) = 1yapraklar açmak hangi s(m+1, 0)ve s(0, n+1)her ikisi de olduğu tanımlanmıştır, 0son duruma göre.

Yalın lamdba hesabı sözdizimini kullanır, öyle s m nde s(m, n).


Şimdi, doğruluk kanıtı: Bunu iki şekilde ifade ettim:

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

Birincisi gerçekten olup biten şeydir: arasında bir ayrım [0 ... s(m, n)-1]ve onun [0 ... m-1]üzerinden gelen enjeksiyonlar [0 ... n-1].

İkincisi genellikle, belirtilmektedir nasıl s(m, n)gelen surjections kardinalitesi olduğu [0 ... m-1]üzerine [0 ... n-1].


Yalın tip teorisini temel olarak kullanır (küme teorisi yerine). Tür teorisinde, her nesnenin kendine özgü bir türü vardır. natdoğal sayı tipidir ve 0doğal sayı olan ifade olarak ifade edilir 0 : nat. Biz söylemek 0tiptedir natve bu natvardır 0bir sakini olarak.

Öneriler (ifadeler / iddialar) da türlerdir: sakinleri teklifin bir kanıtıdır.


  • def: Bir tanım sunacağız (çünkü bir teklif sadece bir öneri değil, gerçek bir işlevdir).

  • correctness: tanımın adı

  • ∀ m n: Her için mve n(kendi türü olduğunu otomatik olarak infers Lean natçünkü şu ne,).

  • fin (s m n)daha küçük olan doğal sayıların türüdür s m n. Bir sakin yapmak için, kişi doğal bir sayı ve daha küçük olduğuna dair bir kanıt sağlar s m n.

  • A ≃ B: tip Ave tip arasında birleşme B. Bijection demek yanıltıcıdır, çünkü gerçekte ters fonksiyon sağlamak zorundadır.

  • { f : fin m → fin n // function.surjective f }den surjections türü fin miçin fin n. Bu sözdizimi türünden bir alt türü oluşturur fin m → fin n, gelen işlevlerin türünü yani fin miçin fin n. Sözdizimi { var : base type // proposition about var }.

  • λ m: ∀ var, proposition / type involving vargerçekten varbir girdi olarak alan bir işlevdir , bu yüzden λ mgirdiyi tanıtır. ∀ m n,için kısa el∀ m, ∀ n,

  • nat.rec_on m: özyineleme yapmak m. Bir şeyi tanımlamak için m, şeyi tanımlayın 0ve sonra için bir şey verin k, şeyi oluşturun k+1. Bunun indüksiyonla benzer olduğunu ve aslında bunun Church-Howard yazışmasının bir sonucu olduğunu fark eder . Sözdizimi 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, bu uzun sürüyor ve ben sadece üçüncü satırındayım correctness...


3

J , 19 bayt

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

Çevrimiçi deneyin!

açıklama

-/@(^~*]!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 bayt

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

Çevrimiçi deneyin!

Mario Catalani'nin formüllerinden birini uygular:

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

veya dönüşümlü olarak:

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

R'de aynı bayt sayısını verir.


2

Python 2 , 56 53 50 bayt

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

Çevrimiçi deneyin!

H.PWiz sayesinde -3 bayt.

Dennis sayesinde -3 bayt.

  • Eğer n<khepsi kharitalandırılamazsa, hiç enjeksiyon olmaz. n/k andbununla ilgilenir.
  • Almak f(0,0)=1bize ihtiyacımız olan tek sıfır olmayan temel durumu verir. 1/k orbunu başarır.


2

Brain-Flak , 142 bayt

({}<({}()){({}[(())]<<>{({}({})<>)<>}{}>)}{}>)<>{<>(({}<>)<{({}[()]<([])({([{}]()({}))([{}]({}))}{}[{}])>)}{}({}<>)>)<>}<>{}{}{({}<>[{}])<>}<>

Çevrimiçi deneyin!

Bu, standart dahil etme-hariç tutma formülünü kullanır.

Şu anda tam bir açıklama yazamıyorum, ancak burada üst düzey bir açıklama var:

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

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

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


2

Kabuk , 7 bayt

#`¦ḣ¹π²

Çevrimiçi deneyin!

açıklama

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


1

05AB1E , 10 bayt

sLsãʒêgQ}g

Çevrimiçi deneyin!

açıklama

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.