अनुमानों की संख्या


16

कार्य

2 सकारात्मक पूर्णांकों को देखते हुए , nऔर k, जहां अंतर तत्वों के एक सेट से अलग- अलग तत्वों के एक सेट n > kसे आउटपुट की संख्या ।nk

परिभाषा

एक फंक्शन f: S → T को एक सर्जेक्शन कहा जाता है यदि हर t thereT के लिए s suchS ऐसा हो जो f (s) = t हो।

उदाहरण

जब n=3और k=2, उत्पादन होता है 6, के बाद से देखते हैं 6से surjections {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
सरोगेसी की एक परिभाषा अच्छी होगी।
स्टिव ग्रिफ़िन

3
क्या यह जानबूझकर है कि n k के बराबर नहीं हो सकता ?
डेनिस

1
@ डेनिस मुझे अपनी चुनौतियों से हर संभव मामले को बाहर करना पसंद है
लीक नून

3
यह शामिल करने के लिए एक महत्वपूर्ण किनारे के मामले की तरह लगता है। मेरा अनुमान है कि अधिकांश उत्तर जो n> k के लिए काम करते हैं, n == k के लिए भी काम करेंगे, लेकिन यह कहीं न कहीं कुछ डरपोक गोल्फिंग के लिए अनुमति दे सकता है
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 बाइट्स: इसे ऑनलाइन आज़माएं!
लकोनी

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को अंतिम मामले से परिभाषित किया जाता है।

लीन लैम्ब्डा कैलकुलस सिंटैक्स का उपयोग करता है, इसलिए 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]और [0 ... m-1]पर से अनुमान [0 ... n-1]

दूसरा तरीका यह है कि आमतौर पर यह कहा जाता है, कि s(m, n)सर्जन्स की कार्डिनैलिटी [0 ... m-1]ऑन है [0 ... n-1]


लीन टाइप थ्योरी का उपयोग इसकी नींव (सेट सिद्धांत के बजाय) के रूप में करता है। प्रकार के सिद्धांत में, प्रत्येक वस्तु का एक प्रकार होता है जो उसके लिए अंतर्निहित होता है। natप्राकृतिक संख्याओं का प्रकार है, और 0एक प्राकृतिक संख्या के रूप में व्यक्त किया गया कथन है 0 : nat। हम कहते हैं कि 0इस प्रकार का है nat, और कहा कि natहै 0एक निवासी के रूप में।

प्रस्ताव (कथन / कथन) भी प्रकार हैं: उनका निवासी प्रस्ताव का प्रमाण है।


  • def: हम एक परिभाषा प्रस्तुत करने जा रहे हैं (क्योंकि एक आक्षेप वास्तव में एक कार्य है, न कि केवल एक प्रस्ताव)।

  • correctness: परिभाषा का नाम

  • ∀ m n: हर के लिए mऔर n(झुक स्वचालित रूप से है कि उनके प्रकार है nat, क्योंकि क्या इस प्रकार है)।

  • fin (s m n)प्राकृतिक संख्याओं का प्रकार है जो की तुलना में छोटा है s m n। एक निवासी बनाने के लिए, एक प्राकृतिक संख्या और एक प्रमाण प्रदान करता है कि यह उससे छोटा है s m n

  • A ≃ B: प्रकार Aऔर प्रकार के बीच की आपत्ति B। यह कहना कि आपत्ति करना भ्रामक है, क्योंकि वास्तव में उलटा कार्य करना है।

  • { f : fin m → fin n // function.surjective f }से surjections के प्रकार 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")

हे, यह लंबा हो रहा है और मैं केवल तीसरी पंक्ति पर हूं correctness...


3

जे , 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

2

आर , 49 बाइट्स

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

इसे ऑनलाइन आज़माएं!

मारियो केटालानी द्वारा सूत्र में से एक को लागू करना:

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

जो आर में एक ही बाइट गिनती पैदा करता है।


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

इसे ऑनलाइन आज़माएं!

-3 बाइट्स H.PWiz को धन्यवाद।

-3 बाइट्स डेनिस की बदौलत।

  • यदि इस प्रकार n<kसभी kको मैप नहीं किया जा सकता है, तो कोई अनुमान नहीं है। n/k andइस बात का ध्यान रखता है।
  • लेने f(0,0)=1से हमें केवल नॉनजरो बेस केस की जरूरत होती है।1/k orइसे प्राप्त करता है।


2

ब्रेन-फ्लैक , 142 बाइट्स

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

इसे ऑनलाइन आज़माएं!

यह मानक समावेश-बहिष्करण सूत्र का उपयोग करता है।

मैं इस समय पूरी व्याख्या नहीं लिख सकता, लेकिन यहाँ एक उच्च-स्तरीय व्याख्या है:

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

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

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




हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.