क्या मेरी जेल सुरक्षित है?


58

आपकी चुनौती को जेल लेआउट का एक इनपुट दिया गया है ताकि पता चल सके कि कोई भी कैदी बच सकता है या नहीं।

इनपुट

इनपुट किसी भी उचित प्रारूप में हो सकता है जैसे कि एक स्ट्रिंग, सरणी, सारणियों की सारणी आदि। इनपुट में तीन वर्ण शामिल होंगे, इस मामले में #, Pऔर स्थान। इनपुट में आवश्यक रूप से सभी तीन वर्ण नहीं होंगे।

  • #: एक दीवार
  • P: एक कैदी
  • अंतरिक्ष: एक खाली जगह

एक उदाहरण इनपुट जैसा दिखेगा:

#####
#   #
# P #
#   #
#####

उत्पादन

जेल सुरक्षित है या नहीं, इसका सच / गलत मूल्य। जेल तभी सुरक्षित है जब वह सभी कैदियों को पकड़ सकता है । अगर कोई कैदी बच सकता है तो वह सुरक्षित नहीं है।

एक कैदी बच सकता है अगर वे पूरी तरह से एक दीवार से घिरे नहीं हैं। एक विकर्ण जुड़ाव पूरी तरह से संलग्न है।

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

############# Truthy
# P #  P#   #
#   #   # P #
#############

############# Truthy
# P    P    #
#   #   # P #
#############

############# Falsey
# P #  P#   #
#   #   # P #
########## ##

####          Truthy
#   #
 #   #
  # P ####
  ####

P             Falsey

###           Falsey
# #
# #
### P

8
मुझे लग रहा है कि यह एक डुप्लिकेट है या कम से कम एक समान चुनौती है। वैसे भी अच्छी चुनौती।
जॉन ड्वोरक

2
@JDDvorak यह हो सकता है लेकिन मेरे सीमित Google फू के साथ मुझे डुप्लिकेट नहीं मिल सकता है।
ललथकोदर

2
संबंधित (बाढ़-एक 2 डी ग्रिड भरें)
फल

3
यह अच्छा होगा कि फाल्सी उदाहरणों से बचने के लिए क्षैतिज और ऊर्ध्वाधर आंदोलन की आवश्यकता होती है।
xnor

2
@tfbninja वास्तव में डुप्लिकेट नहीं है। यदि कोई व्यक्ति बॉक्स में है, तो यह निर्धारित करने के लिए दिए गए डेटा से प्रोग्राम को एक्सट्रपलेट करने की कोशिश करने के लिए कहता है। यह एक बीएफएस फ्लडफिल है यह देखने के लिए कि चिह्नित मान रखने वाले अनजाने स्थान हैं या नहीं।
हाइपरएन्यूट्रीनो

जवाबों:


54

घोंघे , 13 बाइट्स

!(t\P(o\ ),o~

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

0असुरक्षित जेलों के लिए प्रिंट और सुरक्षित जेलों के लिए इनपुट के बाउंडिंग बॉक्स का आकार।

विचार यह सुनिश्चित करने के लिए है कि हम केवल रिक्त स्थान के माध्यम से केवल कक्षीय ( ) चलते हुए Pसीमा सेल से बाहर का रास्ता नहीं ढूंढ सकते । यह एक टेलीपोर्ट है, इस पर ध्यान दिए बिना कि जहां हम मैच का प्रयास करते हैं, वह इसे खोजने के लिए हर संभव शुरुआती स्थिति की कोशिश करता है ।~otP


23
सही उपकरण।
जोनाथन एलन

16

सी # (.NET कोर) , 485 480 474 470 421 408 बाइट्स

बिल्कुल गलत उपकरण और दृष्टिकोण, लेकिन फिर भी ...

  • TheLethalCoder के उपयोगी सुझावों के साथ 7 बाइट्स (और अधिक) बचाए गए।
  • पूर्णांक को वापस करके 4 बाइट्स बचाए गए।
  • 4 और बाइट्स की जगह TheLethalCoder को बचाया धन्यवाद (एक बार फिर) ' 'के साथ 32तुलना में।
  • कोड को रीक्रिएट करके सेव किए गए बाइट्स के बहुत सारे।
  • 13 और बाइट्स के लिए धन्यवाद (लगता है कि कौन?) TheLethalCoder। :) मैं उनके सुझावों को भूलता रहता हूं और वह उन्हें याद दिलाता रहता है।
m=>{var p='P';int a=m.Length,b=m[0].Length,i=0,j,x,y;var c=new System.Collections.Stack();for(;i<a;i++)for(j=0;j<b;j++)if(m[i][j]==p)c.Push(new[]{i,j});while(c.Count>0){var t=(int[])c.Pop();x=t[0];y=t[1];if(x<1|x>a-2|y<1|y>b-2)return 0;foreach(var v in new[]{-1,1}){var z=x>0&x<a-1&y>0&y<b-1;if(z&m[x+v][y]==32){m[x][y]=p;c.Push(new[]{x+v,y});}if(z&m[x][y+v]==32){m[x][y]=p;c.Push(new[]{x,y+v});}}}return 1;}

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

मूल रूप से मैं पी की स्थितियों का विस्तार करता हूं जब भी एक सफेद स्थान चारों ओर होता है जब तक कि यह लेआउट की सीमा तक नहीं पहुंचता (या नहीं)।

कुछ लाइसेंस:

  • मैं char[][]लेआउट के लिए इनपुट के रूप में उपयोग करता हूं ।
  • 0असुरक्षित और 1सुरक्षित के रूप में लौटाता है ।

आप फ़ंक्शन के लिए अतिरिक्त इनपुट नहीं ले सकते हैं ताकि आप आयामों को ग्रहण कर सकें ... जब तक आप मुझे अन्यथा राजी करने के लिए मेटा पोस्ट नहीं पा सकते।
TheLethalCoder

1>0और 1<0की तुलना में कम कर रहे हैं trueऔर false
TheLethalCoder

1
==0बन सकता है <1? आपके पास अप्रासंगिक व्हाट्सएप का कम से कम 1 बाइट है। क्या आप एस हटा सकते हैं new[]? (हमेशा काम नहीं करता है लेकिन कभी-कभी पसंद होता है int[] n = {1,2,3};)।
द लीथलकोडर

1
{m[x][y]= p; c.Push(new[]->{m[x][y]=p;c.Push(new[]
TheLethalCoder

1
आप chars से ints की तुलना कर सकते हैं इसलिए मेरा मानना ​​है कि आप बाइट्स को बचाने के ==' 'लिए प्रतिस्थापित कर सकते हैं ==32। आपको इसी तरह की तुलना पर भी ऐसा करने में सक्षम होना चाहिए।
द लीथल कोडर

15

पर्ल 5 , 69 बाइट्स

-10 बाइट्स थैंक्स टू @Grimy

-2 बाइट्स @Neil की बदौलत

कोड + -p0झंडे के 77 बाइट ।

/
/;$_=s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s?redo:!/\A.*P|P.*\Z|^P|P$/m

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

कुछ संक्षिप्त स्पष्टीकरण:
विचार यह है कि Pहर जगह कैदियों को रखा जा सकता है। यदि कोई Pपहली / अंतिम पंक्ति या पहले / अंतिम कॉलम पर है, तो कैदी वहां जा सकते हैं और वहां से भाग सकते हैं, जिसका अर्थ है कि जेल सुरक्षित नहीं है।
s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/sके साथ एक जगह की जगह पर सही या bellow के Pसाथ एक P, या बाईं ओर या के शीर्ष पर एक स्थान P
अंत में, /\A.*P|P.*\Z|^P|P$/mजाँच करता है कि कोई रेखा शुरू होती है या समाप्त होती है P, या यदि Pपहली या अंतिम पंक्ति है।


regexps का उपयोग कर शांत दृष्टिकोण! (लेकिन शायद बहुत महंगा जब अंतरिक्ष बढ़ता है)
ओलिवियर दुलक

दरअसल, यह अक्षम नहीं है । विशेष रूप से, इसमें बहुत सारे बैकट्रैकिंग की आवश्यकता नहीं होती है, *या नहीं +, सबसे लंबा मैच जो यह कर सकता है वह एक लाइन का आकार है ... अब यदि आप दृष्टिकोण के आधार पर अधिक मैनुअल के साथ तुलना करते हैं, तो उदाहरण के लिए। , तो हाँ यह काफी अक्षम है!
दादा

1
दो प्रतिस्थापन को मर्ज करके -6 बाइट्स s/P(.{@{-}})? | (.{@{-}})?P/P$1$2P/s:।
ग्रैमी

1
मर्ज किए गए प्रतिस्थापन गोल्फिंग द्वारा -2 बाइट्स s/(P| )(.{@{-}})?(?!\1)(?1)/P$2P/s:।
ग्रैमी

2
@ रेगीज की बहुत अच्छी गोल्फ! धन्यवाद :)
दादा

7

जावास्क्रिप्ट (ईएस 6), 134 133 बाइट्स

वर्णों के सरणियों के एक सरणी के रूप में इनपुट लेता है। रिटर्न 0(असुरक्षित) या 1(सुरक्षित)।

f=a=>a.map((r,y)=>r.map((c,x)=>c>'O'&&[-1,1,0,0].map((X,i)=>(R=a[y+1-'1102'[i]])&&R[X+=x]?R[X]<'!'?R[o=2,X]=c:0:o=0)),o=1)|o&2?f(a):o

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


क्या &&बस हो सकता है &?
द लीथेलकोडर

@ TheLethalCoder पहला वाला नहीं, लेकिन दूसरा वाला इसे बदल सकता है |। धन्यवाद!
अरनुलद

नहीं पता था कि प्रसार ऑपरेटर ने स्ट्रिंग्स पर काम किया। ठंडा!
ऐनाबिस

6

जावास्क्रिप्ट (ईएस 6), 121 बाइट्स

f=s=>s==(s=s.replace(eval('/( |P)([^]{'+s.search`
`+'})?(?!\\1)[ P]/'),'P$2P'))?!/^.*P|P.*$/.test(s)&!/^P|P$/m.test(s):f(s)

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


2

ऑक्टेव, 64 55 बाइट्स

@(a,z=padarray(a,[1 1]))~nnz(bwfill(z==35,1,1,4)&z>35);

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

या

सभी परीक्षण मामलों की पुष्टि करें!

स्पष्टीकरण:

z=padarray(a,[1 1])       %add a boundary(of 0s) around the scene
F = bwfill(z==35,1,1,4)   %flood fill the prison starting from the boundary
~nnz(F&z>35);             %if position of at least a prisoner  is filled then the prison is not secure 

2

APL (Dyalog Classic) , 40 बाइट्स

{⊃2≠(××{1⊃⌈/⍵,⍉⍵}⌺3 3)⍣≡(⌽1,⍉)⍣4'# '⍳⍵}

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

'# '⍳⍵सांकेतिक शब्दों में बदलना '#', ' ', 'P'0 1 2 के रूप में

(⌽1,⍉)⍣4 1s के साथ चारों ओर

(××{1⊃⌈/⍵,⍉⍵}⌺3 3)⍣≡ अधिकतम शून्य शून्य कोशिकाओं की बाढ़ बाढ़

⊃2≠ क्या हमारे पास शीर्ष पर 2 नहीं है?


1

स्टेक्स , 35 बाइट्स CP437

ä¬my■╡╤▲l@┤êr*⌠\¶ƒläå─▄¶√¿ [Uy⌠Só4↔

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

पथ-खोज को संभालने के लिए आंतरिक के बिना निश्चित रूप से गोल्फिंग भाषा यह भी कर सकती है!

व्याख्या

समझाने के लिए अनपैक्ड प्रारूप का उपयोग करता है।

zLz]Y+Mys+y+{{{" P|P ""PP"Rm}Y!My!Mgphh' =
zLz]Y+Mys+y+                                  Surround the original matrix with four borders of whitespaces
            {                      gp         Iterate until a fixed point is found, return the single fixed point
             {              }Y!               Store the block in register Y and execute it
              {" P|P ""PP"Rm                  For each row, flood every space adjacent to a P with P.
                               My!            Transpose the matrix and do the flooding again
                                     hh' =    The final matrix has a space on the upper left corner that has not been flooded by P 

1

स्माइलबासिक, 154 146 बाइट्स

मैं उम्मीद कर रहा था कि बाढ़ भराव का उपयोग कर उत्तर इससे छोटा होगा।

DEF S P
FOR J=0TO 1X=1Y=1FOR I=0TO LEN(P)-1GPSET X,Y,-(P[I]=="#")GPAINT X,Y,-1,-J*(P[I]>@A)X=X*(P[I]>"31")+1INC Y,X<2NEXT
NEXT?!GSPOIT(0,0)GCLS
END

31इसी ASCII चरित्र के साथ बदलें ।

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