मेरा बाधा कोर्स कितना विविध है?


21

पृष्ठभूमि

मैंने एक आयताकार कमरे में बक्से रखकर एक साधारण बाधा कोर्स का निर्माण किया है। अब मैं अनिवार्य रूप से विभिन्न तरीकों की संख्या को गिनना चाहता हूं जिसमें इसे हल किया जा सकता है। मुझे चाहिए कि आप मुझे इसके लिए एक कार्यक्रम लिखें।

इनपुट

आपका इनपुट वर्णों का एक गैर-रिक्त आयताकार सरणी है .#। डॉट्स .खाली जगह हैं, और #बाधाएं हैं।

बाधा कोर्स के माध्यम से एक रास्ता शीर्ष बाएं कोने से शुरू होता है और नीचे दाएं कोने पर समाप्त होता है, और केवल दाएं या नीचे जाता है। इसके अलावा, एक वैध मार्ग एक बाधा से नहीं गुजर सकता है। यहाँ कुछ उदाहरणों के साथ तैयार किए +गए हैं:

Valid path  Invalid path  Invalid path  Invalid path
++........   ++........    +++++.....    ..+.......
.++++++#..   .+.....#..    ....+++#++    ..++...#..
......+#..   .+.++++#..    .......#.+    ...+++.#..
....#.++++   .+++#.++++    ....#....+    ....#+....

दो रास्ते अनिवार्य रूप से 1 समान हैं यदि +एक समय में एक को स्थानांतरित करके दूसरे में बदला जा सकता है । मध्यवर्ती रास्तों को भी मान्य होना चाहिए, ताकि आप एक बाधा पर एक रास्ता न मोड़ सकें। उदाहरण के लिए, यहां पहले दो रास्ते अनिवार्य रूप से समान हैं, लेकिन तीसरा अनिवार्य रूप से उनसे अलग है, क्योंकि इसे दो बाधाओं से मुक्त नहीं किया जा सकता है:

++........   +.........   +++++++++.
.+++++.#..   ++.....#..   .......#+.
.....+.#..   .++++++#..   .......#++
....#+++++   ....#.++++   ....#....+

उत्पादन

आपका आउटपुट बाधा कोर्स के माध्यम से आवश्यक रूप से विभिन्न रास्तों की संख्या है। दूसरे शब्दों में, यदि सभी मान्य पथों को अनिवार्य रूप से समान पथों के वर्गों में विभाजित किया जाता है, तो आउटपुट कक्षाओं की संख्या है। ध्यान दें कि यह संख्या 0 हो सकती है, अगर कोई वैध रास्ते नहीं हैं।

नियम और स्कोरिंग

आप एक पूर्ण कार्यक्रम या एक फ़ंक्शन लिख सकते हैं। सबसे कम बाइट गिनती जीतता है, और मानक खामियों को रोक दिया जाता है। कोई समय सीमा नहीं है, सिवाय इसके कि आपको इसे जमा करने से पहले प्रत्येक परीक्षण मामले पर अपने कार्यक्रम का मूल्यांकन करना चाहिए।

परीक्षण के मामलों

....
....
.... => 1

...#
....
...# => 0

#..#
..#.
.... => 0

......
......
..##..
......
...... => 2

......
...#..
......
..#...
#..... => 3

......
..#...
......
....#.
#..... => 4

.......
##.....
....###
...#...
..##.#.
#....#.
..#.... => 0

......#.
..##....
...#....
.......#
....#...
.##...#.
....#...
##...... => 7

.........
.#.#.#.#.
.........
#.#...#.#
.........
.#.#.#.#.
......... => 17

..........
.#........
..........
.....#....
#.........
........#.
......#...
.......... => 10

.........
.#.......
.........
...#.....
.........
.....#...
.........
.......#.
......... => 16

1 सही तकनीकी शब्द "होमोटोपिक" है


1
" एक बार में आगे बढ़ने+ " से आपका क्या मतलब है ? क्या इसका मतलब यह है कि अनिवार्य रूप से समान पथ समान लंबाई होना चाहिए?
पीटर टेलर

3
@PeterTaylor सभी रास्तों की लंबाई समान है, क्योंकि वे केवल नीचे और दाईं ओर जा सकते हैं। "एक को आगे बढ़ाने +" से मेरा अनिवार्य रूप से मतलब है कि रास्ते का एक कोना विपरीत दिशा के कोने में उलटा है।
जर्गर्ब

1
@ पेटर: चूंकि आप केवल दाएं या नीचे जा सकते हैं, सभी रास्ते समान लंबाई के हैं।
देउसोवी

जवाबों:


8

घोंघे , 53 49 बाइट्स

A^
\.+d!{.l\.+a3(.|~c!~}\.+r!(.u\.+e(.|~},\.,=~d~

एक बार के लिए, मुझे उपयोग नहीं करना tपड़ा, खूंखार टेलीपोर्ट निर्देश। नतीजतन, परीक्षण के मामले तुरंत एओन लेने के बजाय समाप्त हो जाते हैं।

Ungolfed:

A^
r\.+
{
    d\.+
    !{ r\.u \.+ a3 (.|~)}
    r\.+
    !{ d\.l \.+ a3 (.|~)}
},
d\.,
!(dr .)

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


नौकरी के लिए सही भाषा के बारे में बात करें!
नहीं है कि

10

पायथन 2, 170 131 112 बाइट्स

def f(C,t=1):i="#".join(C).find("#")+1;return([]<C)*(i<1or(i<t
and f([r[i:]for r in C],t-i))+(i>1)*f(C[1:],i-1))

एक फ़ंक्शन, fरोल्स कोर्स को पंक्तियों की सूची के रूप में ले रहा है, और आवश्यक रूप से विभिन्न पथों की संख्या वापस कर रहा है।

व्याख्या

मूल अवधारणा यह है: हम एक निश्चित बाधा चुनते हैं, , जैसे कि बॉक्स बाउंडिंग और शीर्ष-बाएं कोने में कोई अन्य बाधाएं नहीं हैं ।

+--+....
|..|....  
+--#<==== o
.....#..
.#......
........

हम तो पूर्व में और के दक्षिण में दो उप पाठ्यक्रम पर विचार । हम केवल इन उप-पाठ्यक्रमों में से किसी पर विचार करते हैं यदि को वास्तव में एक दिशा से पार किया जा सकता है जो उन्हें ले जाता है, अर्थात्, पूर्व से प्राप्त करने के लिए उत्तर से पार कर गया, और दक्षिण की ओर जाने के लिए पश्चिम से पार कर गया। हम प्रत्येक चयनित उप-पाठ्यक्रमों के लिए समस्या का समाधान करते हैं, और परिणामों का योग लौटाते हैं। ये संख्या क्रमशः बाएं और दाएं से को पार करते समय अनिवार्य रूप से अलग-अलग रास्तों की संख्या के अनुरूप होती है, इसलिए पथ के दो परिणामी सेट अनिवार्य रूप से भिन्न होते हैं। चूंकि शुरुआती बिंदु और ओ के बीच कोई बाधा नहीं है, इन क्षेत्रों में से प्रत्येक में प्रारंभिक बिंदु और किसी भी प्रवेश बिंदु के बीच एक मार्ग है, और ऐसे सभी पथ जो समान बिंदु तक जाते हैं, अनिवार्य रूप से समान हैं, इसलिए उपरोक्त योग पूरे पाठ्यक्रम में आवश्यक रूप से विभिन्न पथों की पूर्ण संख्या है।

                               A
_
........       ...|////      |....
........       ...|////      |....
...#....  -->  ...#////  -->  ....
.#....#.       .#..//#/       ..#.
........       ....////       ....

   |                           |
   v                           v
                  B
........       ___
........       .#....#.
___#....  -->  ........  -->   +
/#////#/       
////////       

चीजें इस तथ्य से थोड़ी जटिल हैं कि बाधा कोर्स अकेले सभी आवश्यक जानकारी को व्यक्त नहीं करता है। उदाहरण के लिए, ऊपर दिए गए आरेख में पाठ्यक्रम बी पर विचार करें । स्वयं द्वारा लिया गया, हम यह निर्धारित नहीं कर सकते कि क्या प्रत्येक बाधा को उत्तर से पार किया जा सकता है। यदि बी इनपुट पाठ्यक्रम था, तो, चूंकि सभी रास्ते शीर्ष-बाएं कोने से शुरू होते हैं, न तो बाधा उत्तर से पार की जा सकती थी, लेकिन, चूंकि हम पूर्व से को पार करते समय बाएं बाधा के दोनों ओर से बी तक पहुंच सकते हैं। , हमें इस बाधा का इलाज करना चाहिए जैसे कि पाठ्यक्रम को हल करते समय इसे उत्तर से पार किया जा सकता है; वही, सही बाधा के लिए नहीं है, हालाँकि, जिसे इस दिशा से पार नहीं किया जा सकता है।

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

O का वास्तविक चयन निम्नानुसार है: हम दिखावा करते हैं कि प्रत्येक पंक्ति, अंतिम के अलावा, एक बाधा (यानी, इसके लिए एक #संलग्न है) के बाद, और परिणामी पाठ्यक्रम में पहली बाधा का चयन करें, पढ़ने के क्रम में। पंक्तियों के लिए (अंतिम के अलावा) जिसमें मूल रूप से कोई बाधा नहीं थी, इसका प्रभावी रूप से मतलब है कि हम उन्हें छोड़ देते हैं (जबकि ध्यान दें कि नीचे का मार्ग शीर्ष पंक्ति के साथ किसी भी वर्ण पर शुरू हो सकता है)। आखिरकार, हम एक ऐसे पाठ्यक्रम के साथ समाप्त होते हैं जिसमें एक भी पंक्ति है जिसमें कोई बाधा नहीं है, जिसके लिए केवल एक ही संभव मार्ग है।


यह बहुत ज्यादा समाधान मैं विचार कर रहा था। मुझे पता था कि किसी को मौका मिलने से पहले मैं इसे पोस्ट कर दूंगा।
क्विंटोपिया

6

CJam, 85 84 82 81 80 79 बाइट्स

qN/:Q,(Qz,(:R_T]2/e~e!{'#Qs@{\(\@>}%s-},{_}{(a\L{@+_@\-_{2$\f.=0fe=2&},}h;}w;],

इसे ऑनलाइन आज़माएं। या पूरा परीक्षण सूट चलाएं।

इस समाधान की दक्षता शायद काफी भयानक है, लेकिन यह प्रत्येक परीक्षण के मामले को कुछ सेकंड के भीतर हल करता है।

व्याख्या

मुझे बाद में कोड का पूर्ण विराम जोड़ना होगा, लेकिन एल्गोरिथम विचार यह है:

  • चौड़ाई और ग्रिड की ऊंचाई हो Wऔर H, क्रमशः।
  • हम (जहां एक क्षैतिज कदम और एक ऊर्ध्वाधर कदम का प्रतिनिधित्व करता है) की W-1प्रतियों 0और H-1प्रतियों के अलग-अलग क्रमपरिवर्तन के रूप में सभी संभव पथ उत्पन्न करते हैं । हम बार-बार ग्रिड के पहले तत्व लेने और फिर लंघन द्वारा उन रास्तों के सभी चलना आदेश पढ़ने में कोशिकाओं (जहां है या )। हम उन सभी रास्तों को त्याग देते हैं जिनमें अ ।W-10W-1stepstep0W-1#
  • फिर हम बार-बार समान रास्तों के एक समूह को हटाते हैं (जो शेष पथों के पहले के समान सभी पथ होंगे)। समान रास्तों के लिए जाँच करना उनके लिए स्थिति को थोड़ा आराम करके थोड़ा आसान हो जाता है: यह जाँचने के बजाय कि क्या कोई xस्थानांतरित हो गया है, हम जाँचते हैं कि क्या पथ बिल्कुल दो स्थानों में भिन्न हैं या नहीं। यदि ऐसा है, तो उन दो स्थानों पर एक ऊर्ध्वाधर और क्षैतिज चाल होगी। यह उन खंडों के बीच पूरे खंड को एक सेल द्वारा तिरछे स्थानांतरित करने का कारण बनता है। लेकिन यदि वे दोनों मार्ग वैध हैं, तो पथ के किसी भी भाग को एक सेल द्वारा तिरछे रूप से स्थानांतरित करना एक बाधा को पार नहीं कर सकता है, इसलिए वे समान हैं। हमें अभी भी सकर्मक बंद को खोजने की आवश्यकता है, इसलिए हम ऐसा तब तक करते रहेंगे जब तक कि हमें अगले समूह में जाने से पहले समान मार्ग न मिलें।
  • अंत में, हम उन समूहों को गिनते हैं जिन्हें हमने पाया है, जिसे हमने स्टैक के निचले भाग पर छोड़ा था।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.