अनंत लेबिरिंथ


35

पृष्ठभूमि

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

इनपुट

आपका इनपुट पीरियड्स .और हैश का एक दो आयामी ग्रिड है #, जो खाली जगह और दीवारों को दर्शाता है, जिसे एक नईलाइन-सीमांकित स्ट्रिंग के रूप में दिया गया है। हमेशा कम से कम एक .और एक होगा #, और आप तय कर सकते हैं कि एक अनुगामी न्यूलाइन है या नहीं।

यह ग्रिड एक अनंत भूलभुलैया का खाका है, जो एक-दूसरे के बगल में ग्रिड की अनंत रूप से कई प्रतियों को संरेखित करके बनाया गया है। भूलभुलैया को गुहाओं में विभाजित किया गया है , जो खाली स्थानों के जुड़े घटक हैं (तिरछे आसन्न स्थान जुड़े नहीं हैं)। उदाहरण के लिए, ग्रिड

##.####
...##..
#..#..#
####..#
##...##

निम्नलिखित भूलभुलैया में परिणाम (सभी दिशाओं में असीम रूप से जारी):

##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##
##.######.######.####
...##.....##.....##..
#..#..##..#..##..#..#
####..#####..#####..#
##...####...####...##

इस विशेष भूलभुलैया में अनंत क्षेत्र की एक गुहा होती है। दूसरी ओर, यह ब्लूप्रिंट केवल परिमित गुहाओं के साथ एक भूलभुलैया में परिणत होता है:

##.####
##..###
####...
..####.
#..####

उत्पादन

यदि लैब्रिंथ में अनंत गुहा और यदि नहीं, तो एक मिथ्या मूल्य होने पर आपका आउटपुट एक सत्य मूल्य होगा। ध्यान दें कि भूलभुलैया में परिमित और अनंत दोनों गुहाएं हो सकती हैं; उस स्थिति में, आउटपुट सत्य होगा।

नियम

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

अतिरिक्त परीक्षण मामले

अनंत गुहाएँ:

.#

#.#
...
#.#

#.###.#.###.#
#.#...#...#.#
#.#.#####.#.#
..#.#...#.#..
###.#.#.#.###
#...#.#.#...#
#.###.#.###.#

##.###
#..###
..##..
###..#
##..##

..#..#..#..#..#..#
.#..#..#..#..#..#.
#..#..#..#..#..#..

#.####.###.###.####
#...#..#...###..###
###.#..#.######..##
....####.#######...
###..###...########
##########.##....##
..###......##.##...
#.........##..#####
###########..###..#
#...........####..#
#.###########.##..#
#.##....##.....####
#.####.###.###.####

परिमित गुहाएँ:

###
#.#
###

.#
#.

####
.#..
####

#.#.#
..#..
#####
..#..
#.#.#

#.#.#.#.#.#
..#...#.#..
###.###.###
..#.#......
#.#.#######
#.#.......#
#.#######.#
#.#.....#.#
#.#.#.#.#.#

##....#####
.#..#...##.
.##.#..#...
..###.###..
#..##.#####
#...##....#
#.#.#####.#
###..####.#
....####...
###...#####

###....##.#########
####...##....#...##
..####.#######.###.
....##..........##.
###..#####.#..##...
####..#..#....#..##
..###.####.#.#..##.
..###...#....#.#...
..####..##.###...##
#.####.##..#####.##
####...##.#####..##


###########
........#..
#########.#
..........#
.##########
.#.........
##.########
...#.......

वहाँ एक अनुगामी newline चरित्र है?
फ़ूजज़नल

@FUZxxl यह आपके ऊपर है।
जगरब

क्या अनंत भूलभुलैया एक सीधी रेखा हो सकती है जो अनंत तक जाती है।

1
@ नहीं मुझे यकीन नहीं है कि तुम क्या मतलब है। पहले और दूसरे अनंत उदाहरणों में अनंत रेखाएँ हैं, लेकिन इनपुट में कम से कम एक .और एक #है।
ज़र्गब

1
अच्छी चुनौती, इससे ज्यादा कठिन लगता है
edc65

जवाबों:


2

जावास्क्रिप्ट (ईएस 6), 235 253

@Mac द्वारा उपयोग की गई समान विधि। प्रत्येक नि: शुल्क सेल के लिए, मैं एक पुनरावर्ती भरण की कोशिश करता हूं, मैं उपयोग किए जा रहे समन्वय के साथ इस्तेमाल की गई कोशिकाओं को चिह्नित करता हूं (जो कि मूल टेम्पलेट के बाहर हो सकता है)। यदि भरण के दौरान मैं पहले से ही एक अलग समन्वय के रूप में चिह्नित सेल में पहुंचता हूं, तो मैं एक अनंत रास्ते में हूं।

जेएस में मोडुलो को संभालने का विचित्र तरीका यह काफी कष्टप्रद है।

L=g=>(
  g=g.split('\n').map(r=>[...r]),
  w=g[0].length,h=g.length,
  F=(x,y,t=((x%w)+w)%w,u=((y%h)+h)%h,v=g[u][t],k=0+[x,y])=>
    v<'.'?0:v>'.'?v!=k
    :[0,2,-3,5].some(n=>F(x+(n&3)-1,y+(n>>2)),g[u][t]=k),
  g.some((r,y)=>r.some((c,x)=>c=='.'&&F(x,y)))
)

फ़ायरफ़ॉक्स / फायरबग कंसोल में टेस्ट करें

अनंत

['##.###\n#..###\n..##..\n###..#\n##..##'
,'#.#\n...\n#.#'
,'#.###.#.###.#\n#.#...#...#.#\n#.#.#####.#.#\n..#.#...#.#..\n###.#.#.#.###\n#...#.#.#...#\n#.###.#.###.#'
,'##.###\n#..###\n..##..\n###..#\n##..##'
,'#.####.###.###.####\n#...#..#...###..###\n###.#..#.######..##\n....####.#######...\n###..###...########\n##########.##....##\n..###......##.##...\n#.........##..#####\n###########..###..#\n#...........####..#\n#.###########.##..#\n#.##....##.....####\n#.####.###.###.####'
].forEach(g=>console.log(g,L(g)))

उत्पादन

"##.###
#..###
..##..
###..#
##..##" true

"#.#
...
#.#" true

"#.###.#.###.#
#.#...#...#.#
#.#.#####.#.#
..#.#...#.#..
###.#.#.#.###
#...#.#.#...#
#.###.#.###.#" true

"##.###
#..###
..##..
###..#
##..##" true

"#.####.###.###.####
#...#..#...###..###
###.#..#.######..##
....####.#######...
###..###...########
##########.##....##
..###......##.##...
#.........##..#####
###########..###..#
#...........####..#
#.###########.##..#
#.##....##.....####
#.####.###.###.####" true

सीमित

['###\n#.#\n###', '.#\n#.', '####\n.#..\n####'
,'#.#.#\n..#..\n#####\n..#..\n#.#.#'
,'#.#.#.#.#.#\n..#...#.#..\n###.###.###\n..#.#......\n#.#.#######\n#.#.......#\n#.#######.#\n#.#.....#.#\n#.#.#.#.#.#'
,'##....#####\n.#..#...##.\n.##.#..#...\n..###.###..\n#..##.#####\n#...##....#\n#.#.#####.#\n###..####.#\n....####...\n###...#####'
,'###....##.#########\n####...##....#...##\n..####.#######.###.\n....##..........##.\n###..#####.#..##...\n####..#..#....#..##\n..###.####.#.#..##.\n..###...#....#.#...\n..####..##.###...##\n#.####.##..#####.##\n####...##.#####..##'
].forEach(g=>console.log(g,L(g)))

उत्पादन

"###
#.#
###" false

".#
#." false

"####
.#..
####" false

"#.#.#
..#..
#####
..#..
#.#.#" false

"#.#.#.#.#.#
..#...#.#..
###.###.###
..#.#......
#.#.#######
#.#.......#
#.#######.#
#.#.....#.#
#.#.#.#.#.#" false

"##....#####
.#..#...##.
.##.#..#...
..###.###..
#..##.#####
#...##....#
#.#.#####.#
###..####.#
....####...
###...#####" false

"###....##.#########
####...##....#...##
..####.#######.###.
....##..........##.
###..#####.#..##...
####..#..#....#..##
..###.####.#.#..##.
..###...#....#.#...
..####..##.###...##
#.####.##..#####.##
####...##.#####..##" false

हाँ, दफ्त मोदुलो को C # में भी एक दर्द था, लेकिन मुझे लगता है कि मुझे निर्देशकीय कोड के साथ अपने काम की नकल में इसका अच्छा उपयोग करने का एक तरीका मिल गया है (अगर मैं 10% पा सकता हूं तो मैं केवल फिर से पोस्ट करूँगा कमी या बेहतर): (j%4-1)%2एक अच्छा दोहरा पैटर्न देता है।
विजुअलमेल

मेरा मानना ​​है कि अनाम फ़ंक्शंस अनुमेय हैं, और, इस प्रकार, जब तक कि thfunction खुद को कॉल शामिल नहीं करता है (यह ऐसा नहीं होगा) यह L=बाइट काउंट की ओर न गिनने के लिए अनुमत है ।
सुपरजेडी २२४

@ SuperJedi224 आप शायद सही हैं, लेकिन यह काफी कम है जैसा कि सभी के बाद है
edc65

21

सी # - 423 375 बाइट्स

पूरा C # प्रोग्राम, STDIN के माध्यम से इनपुट स्वीकार करता है, उचित रूप में STDOUT को "सही" या "गलत" आउटपुट देता है।

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

using C=System.Console;struct P{int x,y;static void Main(){int w=0,W,k=0,o,i,j;P t;string D="",L;for(;(L=C.ReadLine())!=null;D+=L)w=L.Length;for(i=W=D.Length;i-->0&k<W;){k=1;P[]F=new P[W];for(F[j=0].x=i%w+W*W,F[0].y=i/w+W*W;D[i]>35&j<k;)for(t=F[j++],o=1;o<5&k<W;t.y+=(o++&2)-1){t.x+=o&2;if(D[--t.x%w+t.y%(W/w)*w]>35&System.Array.IndexOf(F,t)<0)F[k++]=t;}}C.WriteLine(k>=W);}}

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

अदम्य कोड:

using C=System.Console;

struct P
{
    int x,y;

    static void Main()
    {
        int w=0, // w is the width
        W, // W is the length of the whole thing
        k=0, // k is visited count
        o, // o is offset, or something (gives -1,0 0,-1 +1,0 0,+1 t offset pattern)
        i, // i is the start cell we are checking currently
        j; // j is the F index of the cell we are looking at

        P t; // t is the cell at offset from the cell we are looking at

        string D="", // D is the map
        L;

        for(;(L=C.ReadLine())!=null; // read a line, while we can
            D+=L) // add the line to the map
            w=L.Length; // record the width

        for(i=W=D.Length;i-->0&k<W;) // for each cell
        {
            k=1;

            P[]F=new P[W]; // F is the list of visited cells,

            for(F[j=0].x=i%w+W*W,F[0].y=i/w+W*W; // there are reasons (broken modulo)
                D[i]>35&j<k;) // for each cell we've visited, until we've run out
                for(t=F[j++], // get the current cell
                    o=1; // o is just a counter which we use to kick t about
                    o<5& // 4 counts
                    k<W; // make sure we havn't filled F
                    t.y+=(o++&2)-1) // kick and nudge y, inc o
                {
                    t.x+=o&2; // kick x
                    if(D[--t.x%w+t.y%(W/w)*w]>35 // nudge x, it's a dot
                       &System.Array.IndexOf(F,t)<0) // and we've not seen it before
                        F[k++]=t; // then add it
                }
        }

        C.WriteLine(k>=W); // result is whether we visited lots of cells
    }
}

1
संभवत: पहली बार मैंने C#यहां शीर्ष वोट पाने वाले के रूप में जवाब देखा है।
माइकल मैकग्रिफ

1
मुख्य () संरचना में, अब प्यारा है।
पीटीओआर

10

अजगर 2 - 258 210 244 बाइट्स

पुनरावर्ती रास्ते की जाँच करें, यदि स्टैक ओवरफ्लो 1 लौटे (सत्य) और कोई नहीं (फालसे) वापस लौटें।

import sys
def k(s):
 a=len(s);m=[[c=='.'for c in b]*999for b in s.split('\n')]*999;sys.setrecursionlimit(a)
 for x in range(a*a):
  try:p(m,x/a,x%a)
  except:return 1
def p(m,x,y):
 if m[x][y]:m[x][y]=0;map(p,[m]*4,[x,x,x+1,x-1],[y+1,y-1,y,y])

1
आप ;लाइनों के लिए उपयोग करके कुछ बाइट्स बचा सकते हैं p, जैसा कि आप उन्हें उसी लाइन पर प्राप्त करेंगे if
पुरकाकूदरी

11
"अगर स्टैक ओवरफ्लो सही है" - मुझे वह पुनरावृत्ति अंत की स्थिति पसंद है :)
श्नाडर

3
मुझे यकीन नहीं है कि यह एक वैध तरीका है। "अनंत" क्षेत्र का पता लगाने के लिए स्टैक ओवरफ्लो का उपयोग करने से झूठी सकारात्मकता उत्पन्न होगी। समस्या की युक्ति इनपुट सीमाओं पर कोई सीमा नहीं बताती है, लेकिन 300x300 भूलभुलैया की तरह कुछ अनुचित नहीं लगता है और बहुत लंबे परिमित रास्तों को संलग्न कर सकता है।
जॉन

4
लगभग सभी परिमित mazes भी एक ढेर अतिप्रवाह का कारण होगा। यह एक वैध कार्यक्रम नहीं है।
PyRulez

@ जोहान अपडेट किया गया है ताकि पुनरावृत्ति सीमा लेबिरिंथ के आकार के क्रम पर हो। दुर्भाग्य से 34 बाइट्स जोड़े गए, लेकिन यह अब सही होना चाहिए (कम से कम जितना सही हो उतना हैक भी हो सकता है)।
काइल गुलिऑन

5

पायथन 2 - 297 286 275 बाइट्स

बाढ़ से भरने के लिए एक मनमाना "खुला" सेल शुरू करता है। यदि हम पहले से ही दौरा कर चुके हैं, तो हम पुन: यात्रा करते हैं, लेकिन यह पिछली यात्रा के लिए एक अलग समन्वय है। यदि इस तरह के सेल को खोजने के बिना बाढ़ पूरे क्षेत्र को भर देती है, तो एक अलग क्षेत्र का प्रयास करें। यदि ऐसा क्षेत्र नहीं पाया जा सकता है, तो भूलभुलैया परिमित है।

कमांड लाइन पर प्रोसेस करने के लिए फाइल लेता है, एक्जिट कोड देता है 1 अनंत लिए देता है, और 0परिमित के लिए।

सभी परीक्षण मामलों के लिए सही परिणाम देता है।

import sys
e=enumerate
C=dict([((i,j),1)for i,l in e(open(sys.argv[1]))for j,k in e(l)if'.'==k])
while C:
 d={}
 def f(r,c):
  n=(r%(i+1),c%j)
  if n in d:return(r,c)!=d[n]
  if C.pop(n,0):d[n]=(r,c);return any(map(f,[r-1,r,r+1,r],[c,c+1,c,c-1]))
 if f(*C.keys()[0]):exit(1)

1
आप यह नहीं मान सकते हैं कि कोई भी सेल अनंत गुफाओं का सदस्य होगा, आप आसानी से अनंत और परिमित दोनों प्रकार की गुफाएं रख सकते हैं।
विजुअलमेल

2
@VisualMelon: क्षमा करें, वर्णन पूरी तरह से सही नहीं है। कोड वास्तव में परस्पर कोशिकाओं के हर संभव क्षेत्र की जांच करता है, न कि केवल एक (जैसा कि वर्तमान में निहित है)। यह वही है जब लूप के लिए अंतिम है - क्षेत्रों की जांच करने के लिए चयन करना जबकि अभी भी कोई भी अनियंत्रित कोशिकाएं शेष हैं।
मैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.