노출 수


16

직무

2 양 개의 정수 감안 n하고 k, 여기서 n > k, 한 세트의 출력 surjections 수를 n세트로 구별 요소 k구별 요소.

정의

함수 t : S → T는 모든 t∈T에 대해 f (s) = t와 같은 s∈S가있는 경우에는 surjection이라고합니다.

n=3k=2, 출력은 6있기 때문에, 6surjections이에서 {1,2,3}에게 {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

테스트 케이스

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

참고

채점

이것은 입니다. 바이트 단위의 최단 답변이 이깁니다.

표준 허점이 적용됩니다.


11
surjection의 정의는 좋을 것입니다.
Stewie Griffin

3
nk와 같을 수 없다는 것은 의도적 인 것 입니까?
데니스

1
@Dennis 저는 도전 과제에서 가능한 모든 최첨단 사례를 제외하고 싶습니다
Leaky Nun

3
그것은 중요한 가장자리 케이스처럼 보입니다. 내 생각 엔 N에 대한 작업> 케이윌도 작업 N에 대한 == k는하지만 일부 비열한 골프 어딘가를 허용 할 수 있다는 대부분의 답변입니다
dylnan

@ 누가 당신의 이유를 마무리하기 위해 투표 했습니까?
dylnan

답변:


5

젤리 , 5 4 바이트

ṗṬML

이것은 O (k n ) 무차별 대입 솔루션입니다.

온라인으로 사용해보십시오!

작동 원리

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

하스켈 , 48 바이트

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

온라인으로 사용해보십시오!

왜 대수는 중요 s(m,n)=n*s(m-1,n-1)+n*s(m-1,n)합니까?

n이미지 를 수확하기 위해

  • 싱글 압박 [m]의 어떤으로 생성을 n둘러싼 경계 n-1그룹
  • 또는 기존 그룹 m중 하나에 새 항목 을 추가하거나n[1..m-1]

하스켈 , 38 바이트

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

온라인으로 사용해보십시오!


2
infix 연산자를 사용하여 38 바이트 : 온라인으로 시도하십시오!
Laikoni

4

, 66 바이트

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

온라인으로 사용해보십시오!


정확성 증명

온라인으로 사용해보십시오!


설명

함수를 풀자 :

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

이 기능은 기본적으로 지원되는 패턴 일치 및 재귀로 정의됩니다.

우리는 정의 s(m+1, n+1) = (n+1) * (s(m, n) + s(m, n+1)하고 s(0, 0) = 1개방합니다.s(m+1, 0) 있고 s(0, n+1), 둘 다 0마지막 경우에 의해 정의됩니다 .

린은 lamdba 미적분학 구문을 사용하므로 s m n 입니다 s(m, n).


이제 정확성의 증거 : 나는 그것을 두 가지 방법으로 진술했다 :

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

첫 번째는 실제로 진행되고있는 것입니다. [0 ... s(m, n)-1] 과에서 surjections [0 ... m-1]위에 [0 ... n-1].

두 번째는 일반적으로 언급되는 방식 s(m, n)입니다. 즉,[0 ... m-1] 방식 [0 ... n-1]입니다.


린 (Lean)은 유형 이론을 기반 이론 대신에 기초로 사용합니다. 유형 이론에서 모든 객체에는 고유 한 유형이 있습니다. nat자연수의 유형이고 자연수 인 문장 0은로 표현됩니다 0 : nat. 우리는 그것이 0유형 이라고 말합니다nat , 그것은 nat0거민한다.

건의안 (명명 서 / 어설 션)도 유형입니다. 주민은 제안서의 증거입니다.


  • def: 우리는 정의를 소개하려고합니다 (투사는 실제로 명제 만이 아니라 함수이기 때문입니다).

  • correctness: 정의의 이름

  • ∀ m n: mand and n(Lean은 nat다음 유형으로 인해 유형이 자동으로 추론 됩니다).

  • fin (s m n)보다 작은 자연수의 유형입니다 s m n. 주민을 만들기 위해 자연수와보다 작은 증거를 제공합니다 s m n.

  • A ≃ B: 유형 A과 유형 사이의 bijection B. 실제로 역함수를 제공해야하므로 bijection을 말하는 것은 잘못된 것입니다.

  • { f : fin m → fin n // function.surjective f }에서 fin m까지 의 노출 유형 fin n. 이 구문은 유형에서 하위 유형 fin m → fin n, 즉 함수 유형에서 fin m~ 까지 를 빌드합니다 fin n. 구문은 { var : base type // proposition about var }입니다.

  • λ m: ∀ var, proposition / type involving var실제로 var입력으로 사용되는 함수 이므로 λ m입력을 소개합니다. ∀ m n,속기입니다∀ m, ∀ n,

  • nat.rec_on m:에 재귀를 수행하십시오 m. 에 대한 m정의,에 대한 정의를 0한 후에 대한 것을 정의 하려면에 k대한 것을 작성하십시오 k+1. 이것은 이것이 유도와 유사하다는 것을 알았을 것입니다. 그리고 이것은 실제로 교회 하워드 통신 의 결과입니다 . 문법은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, 이것은 점점 길어지고 있으며 나는 세 번째 줄에만 있습니다 correctness...


3

J , 19 바이트

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

온라인으로 사용해보십시오!

설명

-/@(^~*]!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 21:06에

2

R , 49 바이트

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

온라인으로 사용해보십시오!

Mario Catalani의 공식 중 하나를 구현합니다.

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

또는 교대로 :

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

R에서 동일한 바이트 수를 생성합니다.


2

파이썬 2 , 56 53 50 바이트

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

온라인으로 사용해보십시오!

H.PWiz 덕분에 -3 바이트

Dennis 덕분에 -3 바이트

  • 경우 n<k모든이 k에 매핑 될 수있다, 따라서 더 surjections 없습니다. n/k and이것을 처리합니다.
  • 복용 f(0,0)=1은 우리에게 필요한 유일한 기본 사례를 제공합니다. 1/k or이것을 달성합니다.


2

Brain-Flak , 142 바이트

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

온라인으로 사용해보십시오!

여기에는 표준 포함 제외 수식이 사용됩니다.

현재 전체 설명을 작성할 수는 없지만 다음은 높은 수준의 설명입니다.

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

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

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




당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.