ग्रिड को त्रिकोणों में विभाजित करना


18

लक्ष्य

इस चुनौती का लक्ष्य एक फ़ंक्शन का उत्पादन करना है nजो n X 1ग्रिड को त्रिभुज में विभाजित करने के तरीकों की संख्या की गणना करता है जहां सभी त्रिकोण के कोने ग्रिड बिंदुओं पर हैं।

उदाहरण

उदाहरण के लिए, 2 x 1 ग्रिड को विभाजित करने के 14 तरीके हैं, इसलिए f(2) = 14निम्नलिखित विभाजनों के माध्यम से 2 x 1 के विभाजन जहां विभाजन में क्रमशः 2, 2, 2, 2, 4, और 2 अलग-अलग झुकाव हैं।

स्कोरिंग

यह , इसलिए सबसे छोटा कोड जीतता है।


10
कुछ अतिरिक्त परीक्षण मामले फायदेमंद होंगे, इसलिए हम सत्यापित कर सकते हैं कि हमारी प्रस्तुतियाँ सही हैं।
AdmBorkBork

8
आप गैर-पतित त्रिकोण निर्दिष्ट करना चाह सकते हैं ।
अरनौलड

1
मैंने इस व्याख्या को दर्शाने के लिए OEIS अनुक्रम A051708 में संपादन किया है ।
पीटर कैगी

जवाबों:


2

05AB1E , 13 बाइट्स

·LÉœÙεÅγo;P}O

पोर्ट ऑफ @ बबलर जेली जवाब

बिलियन के क्रमपरिवर्तन के कारण बहुत धीमी गति से।

इसे ऑनलाइन आज़माएं या पहले चार इनपुट सत्यापित करें

स्पष्टीकरण:

·                # Double the (implicit) input
 L               # Create a list in the range [1, doubled_input]
  É              # Check for each if they're odd (1 if truthy, 0 is falsey)
                 # We now have a list of n 0s and n 1s (n being the input)
   œ             # Get all permutations of that list
    Ù            # Only leave the unique permutations
     ε     }     # Map each permutation to:
      Åγ         #  Run-length encode the current value (short for `γ€g`)
        o        #  Take 2 to the power for each
         ;       #  Halve each
          P      #  Take the product of the mapped permutation
            O    # Sum all mapped values together (and output implicitly)

19

हास्केल , 60 55 54 52 बाइट्स

एक ड्राइंग और प्रोग्रामिंग के कई उदाहरणों के बाद, यह मुझे समझ में आया कि यह बदमाशों की समस्या के समान है:

A (n+1)×(n+1) शतरंज की बिसात पर,(0,0) से(n,n) तक जाने के लिए एक रास्ते के लिए कितने रास्ते हैं , बस दाहिने+(1,0) या ऊपर कीओर बढ़तेहुए+(0,1) ?

मूल रूप से आपके पास 1×n ग्रिड की ऊपर और नीचे की रेखा है । अब आपको गैर-क्षैतिज रेखा में भरना होगा। प्रत्येक त्रिकोण में दो गैर-क्षैतिज रेखाएं होनी चाहिए। चाहे उसका एक पक्ष ऊपर या नीचे की रेखा का हिस्सा हो, आप उस दिशा और लंबाई से मेल खाते हैं जो आप बदमाश समस्या में जाना चाहते हैं। ये है OEIS A051708 है । इस पत्राचार के दृष्टांत के रूप में निम्नलिखित उदाहरणों पर विचार करें। यहां टॉप लाइन अप-मूव्स से मेल खाती है, जबकि बॉटम लाइन राइट-मूव्स से मेल खाती है।

धन्यवाद @PeterTaylor -6 बाइट्स के लिए और -2 बाइट्स के लिए @PostLeftGarfHunter!

b 0=1
b 1=2
b n=div((10*n-6)*b(n-1)-9*(n-2)*b(n-2))n

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


मैंने पहले कुछ मूल्यों के साथ खोज करके OEIS अनुक्रम पाया। क्यों मेल खाता है इसके लिए अच्छी व्याख्या। क्या आप इस वैकल्पिक कॉम्बीनेटरियल व्याख्या के बारे में टिप्पणी जोड़ने के लिए इसे संपादित करना चाहते हैं? यदि नहीं, तो मैं कर सकता हूँ।
पीटर टेलर

BTW आपको अनुक्रमण को समायोजित करने की आवश्यकता है, क्योंकि यहां सही उत्तर है A051708(n+1)। इसलिए मैंने पहला सही उत्तर पोस्ट किया :-P
पीटर टेलर

मैं इसे ऊपर और नीचे किनारों के साथ त्रिकोण बनाने के लिए त्रिकोण चालित नक्शे को ऊपर या नीचे की चाल के साथ ले जाता हूँ?
नील

@PeterTaylor लानत, मेरी गलती को इंगित करने के लिए धन्यवाद :)
त्रुटी

5
@ नील ने एक चित्रमय व्याख्या जोड़ी।
दोष नोव

8

हास्केल , 42 बाइट्स

0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n

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

एक सीधा सीधा कार्यान्वयन जो 2 चर पर पुनरावृत्ति करता है।

यहाँ हम इस समाधान को कैसे प्राप्त कर सकते हैं। प्रत्यक्ष पुनरावर्ती सूत्र को लागू करने वाले कोड से शुरू करें:

54 बाइट्स

0%0=1
a%b=sum$map(a%)[0..b-1]++map(b%)[0..a-1]
f n=n%n

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

का उपयोग करते हुए flawr की किश्ती व्याख्या , a%bरास्तों से किश्ती प्राप्त की संख्या है (a,b)करने के लिए (0,0), का उपयोग करते हुए केवल कमी एक समन्वय ले जाता है। पहला कदम या तो घटता है aया घटता है b, दूसरे को समान रखता है, इसलिए पुनरावर्ती सूत्र।

49 बाइट्स

a?b=sum$map(a%)[0..b-1]
0%0=1
a%b=a?b+b?a
f n=n%n

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

हम दोहराए जाने से बच सकते हैं map(a%)[0..b-1]++map(b%)[0..a-1]कि दो हिस्सों के साथ समान हैं aऔर bस्वैप किए गए हैं। सहायक कॉल a?bउन रास्तों को गिनाता है जहां पहली चाल घटती है a, और इसलिए b?aउन स्थानों को गिना जाता है जहां पहली चाल घटती है b। ये सामान्य रूप से अलग हैं, और वे इसमें जोड़ते हैं a%b

में सम्‍मिलन को a?bसूची बोध के रूप में भी लिखा जा सकता है a?b=sum[a%i|i<-[0..b-1]]

42 बाइट्स

0?0=1
a?b=sum[a?i+i?a|i<-[0..b-1]]
f n=n?n

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

अंत में, हम छुटकारा पा लेते हैं %और बस के साथ ?बदलकर पुनरावृत्ति लिखते हैंa%ia?i+i?a पुनरावर्ती कॉल के ।

नए बेस केस के कारण 49-बाइट संस्करण में ?आउटपुट को दोगुना करने का मौका मिलता है ?, तब से 0?0=1, हमारे पास होगा 0%0=0?0+0?0=2। यह उपयोग को f n=n?nबिना रुके परिभाषित करने देता है जिसे हमें करने की आवश्यकता होगी।


आपका 49-बाइट समाधान मेरे उत्तर के रूप में उसी पुनरावृत्ति का उपयोग करता है, लेकिन मैंने अभी तक 42-बाइट का पता नहीं लगाया है। एक स्पष्टीकरण अच्छा होगा।
पीटर टेलर

मुझे लगता है कि मैंने अपने पहले के कार्यक्रमों में एक ही दृष्टिकोण का उपयोग किया था: यह विचार गैर-क्षैतिज रेखाओं को दाईं से बाईं ओर उत्पन्न करके सभी विभाजनों को उत्पन्न (या गिनना) कर रहा है। आप ऊर्ध्वाधर रेखा से शुरू करते हैं। फिर आप पुनरावृत्ति कर सकते हैं: पिछली पंक्ति के अंतिम नोड्स में से एक लें और इसे विपरीत क्षैतिज रेखा पर एक नोड से कनेक्ट करें जो इस पंक्ति के सभी पिछले नोड्स के बाईं ओर आगे है।
दोष

ऑपरेटर शीर्ष रेखा पर a%bनोड्स का उपयोग करके विभाजन की संख्या 0,1,...,aऔर 0,1,..,bनीचे की रेखा पर नोड्स की गणना करता है । ऑपरेटर a?bउन तरीकों की संख्या को गिनाता है जिन्हें आप शीर्ष नोड से एक नई रेखा जोड़ सकते हैं aयदि नीचे का नोड bपहले से उपयोग में है। (आप aसभी नोड्स से कनेक्ट कर सकते हैं [0,1,...,b-1], लेकिन फिर आपको उनमें से प्रत्येक के लिए
पुनरावृत्ति

@flawr, वह 49-बाइट है, जिसे मैं समझता हूं। यह ?42-बाइट एक है जो मैं नहीं करता हूं, और जो विशेष रूप से उत्सुक है वह यह है कि यह सममित नहीं है।
पीटर टेलर

@PeterTaylor इस भ्रम के लिए क्षमा करें, मैंने किसी तरह दो समाधानों को मिलाया। मुझे लगता है कि हम प्रत्येक समाधान में दो समाधानों को आसानी से बदल सकते हैं: पहले चरण में हम map...एक सूची समझ के साथ प्रतिस्थापित कर सकते हैं , दूसरे चरण में हम केवल परिभाषा में प्लग इन करते हैं %:a?b=sum$map(a%)[0..b-1], a%b=a?b+b?a a?b=sum[a%i|i<-[0..b-1]], a%b=a?b+b?a a?b=sum[a?i+i?a|i<-[0..b-1]]
दोष

7

CJam (24 बाइट्स)

{2,*e!{e`0f=:(1b2\#}%1b}

ऑनलाइन डेमो

यह 0 और 1s के क्रमपरिवर्तन के योग के बब्बलर के दृष्टिकोण का उपयोग करता है ।nn

विच्छेदन

{         e# Define a block
  2,*     e#   Given input n, create an array of n 0s and n 1s
  e!      e#   Generate all permutations of that array
  {       e#   Map:
    e`    e#     Run-length encode
    0f=:( e#     Extract just the lengths and decrement them
    1b    e#     Sum
    2\#   e#     Raise 2 to the power of that sum
  }%
  1b      e#  Sum the mapped values
}

वैकल्पिक दृष्टिकोण (28 बाइट्स)

{_1aa{_2$,f{j}@@,f{j}+1b}2j}

ऑनलाइन डेमो

विच्छेदन

त्रिकोण में सभी एक क्षैतिज छोर और दो किनारे होते हैं जो क्षैतिज रेखाओं को जोड़ते हैं। गैर-क्षैतिज किनारों को उनके दो एक्स-कोर्ड्स के एक टपल द्वारा लेबल करें और लेक्सिकोग्राफ़िक रूप से सॉर्ट करें। फिर पहला किनारा है (0,0), आखिरी छोर है (n,n), और दो किनारों में से दो में से एक में लगातार भिन्नता है। यह एक सरल पुनरावृत्ति के लिए बनाता है, जिसे मैंने ज्ञापन पुनरावृत्ति ऑपरेटर का उपयोग करके कार्यान्वित किया हैj :

{            e# Define a block
  _          e#   Duplicate the argument to get n n
  1aa        e#   Base case for recursion: 0 0 => 1
  {          e#   Recursive body taking args a b
    _2$,f{j} e#     Recurse on 0 b up to a-1 b
    @@,f{j}  e#     Recurse on a 0 up to a b-1
    +1b      e#     Combine and sum
  }2j        e#   Memoised recursion with 2 args
}

ध्यान दें

यह पहली बार नहीं है जब मैं fjसीजेएम में समर्थित होना चाहता हूं। यहां यह स्कोर को 24 बाइट्स तक ले जाएगा। शायद मुझे एक पैच लिखने की कोशिश करनी चाहिए ...


हाँ, मैं आपको 10 सेकंड से हराता हूं, मुझे नहीं लगता कि मैं कभी भी करीब था :)
दोष नोव

@flawr, मैंने विच्छेदन लिखने से पहले पोस्ट करने पर विचार किया, लेकिन मुझे लगा कि मेरे पास इसे जल्दी से बाहर दस्तक देने का समय है। फिर मैंने "नया उत्तर" देखा, इसलिए मैंने अपना अंश-लिखित विच्छेदन हटा दिया, पोस्ट किया, और संपादित किया।
पीटर टेलर

1
-5 बाइट्स btw के लिए धन्यवाद: D
दोष

4

जेली , 15 14 बाइट्स

Ø.xŒ!QŒɠ€’§2*S

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

पीटर टेलर की टिप्पणी पर आधारित -1 बाइट।

परिणामी सूत्र के बजाय सीधे त्रुटिपूर्ण चित्रण का उपयोग करता है।

यह काम किस प्रकार करता है

Ø.xŒ!QŒɠ€’§2*S    Main link (monad). Input: positive integer N.
Ø.x               Make an array containing N zeros and ones
   Œ!Q            All unique permutations
      Œɠ€         Run-length encode on each permutation
         ’§       Decrement and sum each
           2*S    Raise to power of 2 and sum

एक वर्ग ग्रिड पर हर संभव मार्ग लें। किश्ती के रूप में एल इकाइयों को एक दिशा में ले जाने के तरीकों की संख्या 2**(L-1)। इसे प्रत्येक मार्ग पर लागू करें और प्रत्येक मार्ग को पार करने के तरीकों की संख्या को योग करें।


अच्छा तरीका। जब मैंने इसे सीजेएम में पोर्ट किया, तो लंबाई, योग, और फिर 2 से बढ़ाकर घटाया गया; 2 की लंबाई बढ़ाने के बजाय, आधा करना, और फिर गुणा करना। पता नहीं क्या यह आपको एक बाइट बचा सकता है।
पीटर टेलर

3

चारकोल , 44 31 बाइट्स

पार किया गया 44 अभी भी नियमित 44 है

F⊕θ«≔⟦⟧ηF⊕θ⊞ηΣ∨⁺ηEυ§λκ¹⊞υη»I⊟⊟υ

इसे ऑनलाइन आज़माएं! स्पष्टीकरण: विपरीत m,nभुजाओं के एक समकोण को त्रिभुजों में विभाजित करने के तरीकों की संख्या की गणना करके काम करता है जो सभी पूर्णांक ऑफसेट पर स्थित होते हैं। यह nप्रश्न में आकार के आयत का केवल एक सामान्य मामला है । विभाजन की संख्या को सभी पक्षों के लिए विभाजन की संख्या के रूप में पुनरावर्ती दिया जाता है m,0..n-1और n,0..m-1। यह बदमाशों की सामान्यीकृत समस्या के बराबर है, OEIS A035002 । कोड बस से काम कर विभाजन की संख्या की गणना करता है 0,0अप करने के लिए n,nपहले से परिकलित मानों का उपयोग कर के रूप में यह हो जाता है।

F⊕θ«

पंक्तियों पर लूप 0..n

≔⟦⟧η

एक खाली पंक्ति से शुरू करें।

F⊕θ

पंक्ति में स्तंभों पर लूप करें 0..n

⊞ηΣ∨⁺ηEυ§λκ¹

वर्तमान कॉलम में पिछली पंक्तियों में अब तक की पंक्ति और मान लें, और कुल योग को वर्तमान पंक्ति में जोड़ें। हालांकि, अगर कोई मूल्य नहीं हैं, तो 1राशि के स्थान पर प्रतिस्थापित करें ।

⊞υη»

तैयार पंक्तियों को अब तक की पंक्तियों की सूची में जोड़ें।

I⊟⊟υ

परिकलित अंतिम मान आउटपुट।




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