বেড়া দ্বারা জমি সম্পূর্ণভাবে আবদ্ধ কিনা তা নির্ধারণ করুন


19

বুলিয়ান মানগুলির একটি দ্বি-মাত্রিক অ্যারে কল্পনা করুন, যেখানে 0 টি জমির আয়তক্ষেত্রাকার প্লটে ঘাসের বর্গক্ষেত্রকে প্রতিনিধিত্ব করে এবং 1s বেড়া প্রতিনিধিত্ব করে।

একটি ফাংশন লিখুন যা 2 ডি অ্যারেটিকে একটি ইনপুট হিসাবে গ্রহণ করে এবং আপনি বেড়ায় না গিয়ে কেবল উত্তর / পূর্ব / পশ্চিম / দক্ষিণ গতিবিধি ব্যবহার করে ঘাসের যে কোনও একটি অঞ্চল থেকে ঘাসের অন্য কোনও অঞ্চলে ভ্রমণ করতে পারবেন কিনা তা নির্ধারণ করে।

যদি অ্যারেতে ঘাসের কোনও অঞ্চল বেড়া দ্বারা সম্পূর্ণরূপে আবদ্ধ থাকে (যার অর্থ আপনি অ্যারেতে ঘাসের অন্যান্য অঞ্চলে পৌঁছাতে এন / ই / ডাব্লু / এস ভ্রমণ করতে পারবেন না) ফাংশনটি মিথ্যা প্রত্যাবর্তন করতে হবে; অন্যথায়, এটি সত্য ফিরে আসা উচিত।

নীচে দুটি নমুনা অ্যারে দেওয়া হয়েছে যা আপনি ইনপুট হিসাবে ব্যবহার করতে পারেন, যদিও আপনার ফাংশনটি কেবল এগুলি নয় তবে বুলিয়ান মানগুলির কোনও 2D অ্যারে পরিচালনা করতে সক্ষম হবে:

0 0 0 0 0
0 1 0 0 0 
0 1 1 1 1
0 0 0 0 0
0 0 0 1 1

(should return true)

0 1 0 1 0
0 1 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 1 1 0 

(should return false, since the middle 0 in the top row is fully enclosed)

সবচেয়ে কম ওয়ার্কিং কোড জিতেছে। এক সপ্তাহ কেটে যাওয়ার পরে আমি বিজয়ীকে বাছাই করব বা 24 ঘন্টার মধ্যে কোনও নতুন জমা দেওয়া হয়নি।


আপনি কি বাইনারি অপারেটরদের নিষেধ করতে পারেন? আমি লোকেরা কী সামনে আসবে তা দেখতে পছন্দ করি ।
পিয়ের আরলাড

আমি বিশ্বাস করি এটি গত বছরের (২০১২ / ২০১৩ মরসুম) থেকে ইউএসসিও সমস্যার সাথে অনেক মিল। কিছু বিশাল পরীক্ষার কেস রয়েছে যা সেখানে অ্যাক্সেস করা যায় ...
অ্যাপ্রোনটেন

অ্যারের আকার সর্বদা 5 * 5 হবে?
প্রোগ্রামফক্স 15

1
@ প্রোগ্রামফক্স অনুমান অ্যারে যে কোনও উচ্চতা, যে কোনও প্রস্থ হতে পারে। এবং নিশ্চিত, আউটপুট কিছু বুলিয়ান।
jawns317

1
3X3 ম্যাট্রিক্স সম্পর্কে কি 1 1 1; 1 0 1; 1 1 1? কেন্দ্রে একটি গ্রাস সেল রয়েছে। দৃশ্যত কেন্দ্রের ঘাসের ঘরটি বেড়া দ্বারা সম্পূর্ণরূপে বদ্ধ, তবে আপনার সংজ্ঞা অনুসারে তা নয়।
এমরি

উত্তর:


1

মতলব 45

input('');c=bwconncomp(~ans,4);c.NumObjects<2

1
@ jawns317 আমি কেন জানি না এটি গৃহীত উত্তর। এটি কোনও ফাংশন নয়। কেবলমাত্র অন্য উত্তর যা কোনও ফাংশন নয় স্টাডিনের কাছ থেকে গ্রহণ করে। এই এক এটি না।
টিম সেগুইন

1
স্ট্যান্ডার্ড ইনপুট গ্রহণ করা যেমন করা যেতে পারে input('');c=bwconncomp(~ans,4);c.NumObjects<2এটি এটি 45 টি অক্ষর তৈরি করবে।
ডেনিস জাহেরুদ্দিন

7

এপিএল (39)

{∧/,⊃{⍺∨⊖⍵}/{⍵∨(∧\~⍵)∨⌽∧\⌽~⍵}¨s,⊖¨s←⊂⍵}

ব্যবহার:

      board1 board2
 0 0 0 0 0  0 1 0 1 0 
 0 1 0 0 0  0 1 1 0 0 
 0 1 1 1 1  0 0 0 0 0 
 0 0 0 0 0  0 0 0 1 0 
 0 0 0 1 1  1 1 1 1 0 
      {∧/,⊃{⍺∨⊖⍵}/{⍵∨(∧\~⍵)∨⌽∧\⌽~⍵}¨s,⊖¨s←⊂⍵} ¨ board1 board2
1 0

9
এপিএলটির সুবিধা হ'ল এটিকে লাইনের শোরগোলের মতো দেখায় যে এটি সঠিক কিনা তা যাচাই করতে চায় না।
টিম সেগুইন

@ টিম যে কেউ এটি চালাতে এবং পরীক্ষা করতে কোনও দোভাষী ডাউনলোড করতে পারে।
গ্যারেথ

3
@ গ্যারেথ হ্যাঁ, মন্তব্যটি গালে জিহ্বা হওয়ার কথা ছিল।
টিম সেগুইন

@ টিম ওহ সরি। মিস করেছেন। :-(
গ্যারেথ

4

গণিত, 60 58 অক্ষর

f=Max@MorphologicalComponents[1-#,CornerNeighbors->1>2]<2&

ব্যবহার:

f[{{0, 0, 0, 0, 0}, {0, 1, 0, 0, 0}, {0, 1, 1, 1, 1}, {0, 0, 0, 0, 0}, {0, 0, 0, 1, 1}}]

সত্য

f[{{0, 1, 0, 1, 0}, {0, 1, 1, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 1, 0}, {1, 1, 1, 1, 0}}]

মিথ্যা


2
একই দৈর্ঘ্যf=Max@WatershedComponents[Image@#,CornerNeighbors->1>2]<2&
ডাঃ বেলিসারিয়াস

3

রুবি, 202 198 193

a=$<.read.split('
').map(&:split)
f=->x,y{a[x][y]=1
[[-1,0],[1,0],[0,-1],[0,1]].map{|o|d,e=x+o[0],y+o[1]
f[d,e]if a[d]&&a[d][e]==?0}}
f[i=a.index{|x|x.index ?0},a[i].index(?0)]
p !(a.join=~/0/)

একটি বন্যা ভরাট করে, তারপরে 0 0 টি বাকী আছে কিনা তা পরীক্ষা করে দেখুন।


অভিশাপ! আমি যদি আগে আমার কোডটি পরীক্ষা না করে থাকি তবে আমি আরও দ্রুত হত। ;)
টিম সেগুইন

@ টিম তবে তবে ভুল হত! : পি
ডুরকনব

3

পিএইচপি 147 202 177 165 149 বাইট

সম্পাদনা করুন আমি আমার জিজিপ হ্যাককে একটি সত্যিকারের পিএইচপি সমাধান দিয়ে মারলাম।

কিছুটা দীর্ঘ .... একটি পাঠ্য স্ট্রিং হিসাবে ইনপুট, কোনও ফাঁকা স্থান নয়, সারিগুলি নিউলাইন দ্বারা সীমাবদ্ধ। এটি বন্যার সাথে পূর্ণ হয় cএবং তারপরে কোনও জিরো বাকি আছে কিনা তা পরীক্ষা করে দেখুন। লুপটিতে আমি expপ্রয়োজনীয় পুনরাবৃত্তির সংখ্যার উপরে অপরিশোধিত উপরের আবদ্ধ হিসাবে ব্যবহার করি । আমি কম কোডে সদৃশ কেসগুলি হ্যান্ডেল করার জন্য প্রতিসমের সুবিধা গ্রহণ করি

function f($s){$r=strpos;$n=$r($s,'
');$s[$r($s,'0')]=c;for(;$i++<1<<$n;)$s=strrev(ereg_replace('0(.{'.$n.'})?c','c\1c',$s));return!1==$r($s,'0');}

এখানে একটি নিরবচ্ছিন্ন পরীক্ষার মামলা রয়েছে:

<?php
$s1="00000
01000
01111
00000
00011";

$s2="01010
01100
00000
00010
11110";

function f($s){
    $n=strpos($s,"\n");
    $s[strpos($s,'0')]=c;
    for(;$i<strlen($s);++$i)
        $s=strrev(ereg_replace(
            '0(.{'.$n.'})?c',
            'c\1c'
            ,$s));
    return!1===strpos($s,'0');
}

var_dump(f($s1));
var_dump(f($s2));

3

এক্সেল ভিবিএ, 305 215 বাইট

হ্যাঁ, হা হা ভিবিএ, তবে সমস্যার ম্যাট্রিক্স প্রকৃতি এক্সেলের একটি ব্যবহারিক সমাধান আকর্ষণীয় হতে পারে (প্লাস কেউ ইতিমধ্যে আমার অন্যান্য ভাষায় একটি উত্তর জমা দিয়েছে!)। স্পষ্টতই ভিবিএ সর্বাধিক সংহত হবে না, তবে আমি মনে করি এটি যুক্তিসঙ্গত।

এই বন্যা একটি স্বেচ্ছাসেবী সূচনা পয়েন্ট থেকে ভরাট করে তারপর কোনও "ঘাস" রেখে গেছে কিনা তা পরীক্ষা করে

আর 1 ও 0 এর একটি ওয়ার্কশিট পরিসীমা যা বেড়া এবং ঘাসের সমস্যা হিসাবে সংজ্ঞায়িত হিসাবে প্রতিনিধিত্ব করে। বোনাস, খেলার ক্ষেত্রটি আয়তক্ষেত্রাকার বা এমনকি সামঞ্জস্যপূর্ণ হতে হবে না।

0 1 1 1 1
0   0 0 0 0
0 1 1 1 1

উদাহরণস্বরূপ, মিথ্যা ফিরবে। বাম দিকের শূন্যগুলি থেকে ডানদিকে শূন্যগুলি পৌঁছানো যায় না। অনিয়মিত ক্ষেত্র এটি ভাঙে না।

Function F(R)
L R, R.Find(0)
F = Not IsNumeric(R.Find(0))
End Function

Sub L(R, S As Range)
If S Or IsEmpty(S) Then Exit Sub
S = 1
L R, S.Offset(1, 0)
L R, S.Offset(-1, 0)
L R, S.Offset(0, 1)
L R, S.Offset(0, -1)
End Sub

গল্ফিং উপর কিছু নোট।

আমি মনে করি যে 1 এবং 0 এর ক্ষেত্রে প্রয়োজনীয়তা উল্টানো থাকলে কিছু অক্ষর ছাঁটাই করা যেতে পারে তবে এটিকে বিপরীত করার পক্ষে যথেষ্ট নয়।

ভিবিএ একটি গুচ্ছকে একটি শ্বেতক্ষেত্রের উপর জোর দেয় (a = b বনাম a = বি), যা চর গণনায়ে সহায়তা করে না।

এস স্পষ্টভাবে একটি ব্যাপ্তি হিসাবে ঘোষণা করা প্রয়োজন। যদি এটির কোনও বৈকল্পিক থাকে তবে এটি একটি পরিসরের পরিবর্তে একটি পরিসরের মানতে পরিবর্তিত হয়।

বন্যার শাখার আরও ভাল উপায় হতে পারে? আমি এমন লুপটি নিয়ে আসতে পারিনি যা এন / ই / এস / ডাব্লু পাঠানোর জন্য কোনও অক্ষর সংরক্ষণ করেছিল

সম্পাদনা করুন: বন্যার ভরাটের উপর ভিত্তি কেস পুনর্বিবেচনা, পুনরাবৃত্তি প্রতিরোধ না করে পুনরাবৃত্তি পরে একটি বেস কেস এটি কিনা তা পরীক্ষা করে বেশ কিছুটা ছাঁটাই পরিচালিত।


2

পাইথন (219 বাইট)

অবশ্যই সংক্ষিপ্ততম নয়, তবে এটি এখানে আমার প্রথম চেষ্টা, তাই আমি এটি নিয়ে গর্বিত:

def f(n):
 m=[int(c) for c in n if c!='\n']
 for i in range(len(m)):
  if m[i]<1:m[i]=2;break
 g(m,n.find('\n'),i);return not 0in m
def g(n,w,i):
 for x in i-w,i-1,i+1,i+w:
  if 0<=x<len(n):
   if n[x]<1:n[x]=2;g(n,w,x)

এটির ইনপুটটি 0s এবং 1 এর স্ট্রিং হওয়া উচিত যেখানে সারিগুলি একটি নতুন লাইন () n) অক্ষর দ্বারা সীমিত করা হয়।

ব্যবহারের উদাহরণ:

>>> f("00000\n01000\n01111\n00000\n00011")
True
>>> f("01010\n01100\n00000\n00010\n11110")
False

আপনি শেষ দুটিকে একত্রিত করতে পারেন যদি বিবৃতিগুলির সাথে andএটির মধ্যে পরিণত হয় তবে আমার মনে হয় এটি কিছু
চরিত্র

আপনি 8 টি স্পেস হিসাবে ট্যাবুলেটরটি ব্যবহার করতে পারেন।
কনরাড বোরোস্কি

2

পাইথন (196)

স্ট্যান্ডার্ড বন্যা ভরাট।

g=raw_input()
m=g.find(' ')
g=g.replace(' ','')
V={}
def D(V,x):
 if V.get(x,0)or g[x]=='1':return
 V[x]=1;[D(V,x+i)for i in 1,-1,m,-m if 0<=x+i<len(g)]
D(V,g.find('0'))
print len(V)==g.count('0')

একক স্পেস দ্বারা বিভক্ত প্রতিটি সারিতে STDIN এর মাধ্যমে ম্যাট্রিক্স নিয়ে যায়। উদাহরণস্বরূপ "01010 01100 00000 00010 11110"।


2

গণিত 53

f=Max@(Symbol@@Names@"I*`i*B*l")[Image[1-#],0,1>2]<2&

এটি অভ্যন্তরীণ ফাংশনটিকে কল করে Image`MorphologicalOperationsDump`imageBinaryLabel, যা এর অনুরূপ MorphologicalComponents

f[{{0, 0, 0, 0, 0}, {0, 1, 0, 0, 0}, {0, 1, 1, 1, 1}, {0, 0, 0, 0, 0}, {0, 0, 0, 1, 1}}]
f[{{0, 1, 0, 1, 0}, {0, 1, 1, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 1, 0}, {1, 1, 1, 1, 0}}]

সত্য

মিথ্যা


1

পিএইচপি (২৮6 টি অক্ষর)

বেশ দীর্ঘ পথ, সম্ভবত আমি দীর্ঘ পথ অতিক্রম করেছি।

function D($a){$x=count($a);$y=count($a[0]);for($i=0;$i<$x;$i++)$a[$i][-1]=$a[$i][$y]=1;for($j=0;$j<$y;$j++)$a[-1][$j]=$a[$x][$j]=1;for($i=0;$i<$x;$i++){for($j=0;$j<$y;$j++){if($a[$i][$j]!=1){if($a[$i][$j-1]==1&&$a[$i][$j+1]==1&&$a[$i-1][$j]==1&&$a[$i+1][$j]==1)return 0;}}}return 1;}

অ golfed:

function D($a)
{
$x=count($a);
$y=count($a[0]);
for ($i=0;$i<$x;$i++)
    $a[$i][-1]=$a[$i][$y]=1;
for ($j=0;$j<$y;$j++)
    $a[-1][$j]=$a[$x][$j]=1;
for ($i=0;$i<$x;$i++)
{
    for ($j=0;$j<$y;$j++)
    {
        if ($a[$i][$j] != 1)
        {
            if ($a[$i][$j-1] == 1 && $a[$i][$j+1] == 1 && $a[$i-1][$j] == 1 && $a[$i+1][$j] == 1)
                return 0;
        }
    }
}
return 1;
}

এটি সঠিক নয়। এটি কেবলমাত্র এটির দ্বারা ঘিরে থাকা কোনও একক শূন্য নেই কিনা তা পরীক্ষা করে দেখুন । জিরো বন্ধ করার আরও জটিল উপায় রয়েছে।
টিম সেগুইন

অবশ্যই আপনি ঠিক। বন্যার জমি ছাড়াই এটি সমাধানের জন্য আমি অন্য কোনও উপায়ের সন্ধান করছিলাম, আমার ধারণা আমার অনুসন্ধান অব্যাহত রয়েছে!
ভেরিয়াস

এটি কেবল একটি গ্রাফের পুনঃব্যবহারযোগ্যতা সমস্যা এবং এ ক্ষেত্রে প্লাবনফিলটি স্পষ্টতভাবে পুনঃব্যবহারযোগ্যতা গ্রাফ তৈরি বা উপস্থাপন না করেই ফ্লয়েড-ওয়ারশাল। আপনি গ্রাফটি বের করার চেষ্টা করতে পারেন এবং নিজেই ট্রানসিটিভ ক্লোজারটি করতে পারেন, তবে আমার ধারণা এটি দীর্ঘতর হবে।
টিম সেগুইন

1

সি #, 235 বাইট

int[][]D;int w,h,n;bool Q(int x,int y){var r=x>=0&&x<w&&y>=0&&y<h&&(D[x][y]++==0);if(r){Q(x-1,y);Q(x+1,y);Q(x,y+1);Q(x,y-1);}return r;}
bool P(int[][]B){D=B;w=D[0].Length;h=D.Length; for(int i=0;i<w*h;i++)if(Q(i%w,i/w))n++;return n==1;}

এটি বোর্ডের প্রতিটি কক্ষ পূরণের চেষ্টা করে, এটি কেবলমাত্র একটি বন্যার পূরণ পূরণ করে returns

bool R( int x, int y)
{
    var r = (x >= 0 && x < w && y >= 0 && y < h && D[x, y]++ == 0);
    if (r)
    {
        R(x-1, y);
        R(x+1, y);
        R(x, y+1);
        R(x, y-1);
    }
    return r;
}

public bool Do()
{
    D = Board1;
    w = D.GetLength(0);
    h = D.GetLength(1);
    for (int x = 0; x < w; x++) for (int y = 0; y< h; y++) if (R(x, y)) n++;
    return n == 1;
}

0

পাইথন 2.X + 3.X: 335 অক্ষর

Golfed:

def f(n):
 x,y=0,0
 z=lambda x,y:y<len(n)and x<len(n[0])and n[x][y]!=1
 while not z(x,y):
  y+=1
  if y==len(n):
   y=0
   x+=1
  if x==len(n[0]):
   return False
 t=set([(x,y)])
 v=set()
 while t:
  (x,y)=t.pop()
  v|=set([(x,y)])
  if z(x+1,y):
   t|=set([(x+1, y)])
  if z(x,y+1):
   t|=set([(x, y+1)])
 return len(v)+sum(map(sum,n))==len(n)*len(n[0])

Ungolfed:

def f(n):
    """In the following filed, starting from a 0: is it possible to
       get to every other 0?

        >>> f([[0,0,0,0,0],\
               [0,1,0,0,0],\
               [0,1,1,1,1],\
               [0,0,0,0,0],\
               [0,0,0,1,1]])
        True
        >>> f([[0,1,0,1,0],\
               [0,1,1,0,0],\
               [0,0,0,0,0],\
               [0,0,0,1,0],\
               [1,1,1,1,0]])
        False
        >>> f([[1,1,1,1,1],\
               [1,1,1,1,1],\
               [1,1,1,1,1],\
               [1,1,1,1,1],\
               [1,1,1,1,1]])
        False
        >>> f([[1,1,1,1,1],\
               [1,1,1,1,1],\
               [1,1,1,1,1],\
               [1,0,1,1,1],\
               [1,1,1,1,1]])
        True
        >>> f([[1,1,1,1,1],\
               [1,1,1,1,1],\
               [0,1,1,1,1],\
               [1,0,1,1,1],\
               [1,1,0,1,1]])
        False
        >>> f([[1,1,1,1,1],\
               [1,1,1,1,1],\
               [1,1,1,1,1],\
               [1,1,1,1,1],\
               [1,1,1,1,0]])
        True
    """
    x, y = 0,0
    isValid = lambda x,y: y<len(n) and x<len(n[0]) and n[x][y] != 1
    for i in range(len(n)*len(n[0])):
        x = i%len(n)
        y = i/len(n)
        if isValid(x,y):
            break

    while not isValid(x,y):
        y += 1
        if y == len(n):
            y = 0
            x += 1
        if x == len(n[0]):
            return False # Problem is not clearly defined here
    toGo=set([(x,y)])
    visited=set()
    while toGo:
        (x,y) = toGo.pop()
        visited |= set([(x,y)])
        if isValid(x+1,y):
            toGo |= set([(x+1, y)])
        if isValid(x,y+1):
            toGo |= set([(x, y+1)])
    return len(visited)+sum(map(sum,n)) == len(n)*len(n[0])

if __name__ == "__main__":
    import doctest
    doctest.testmod()

আপনি কি গল্ফড সংস্করণটিকে শীর্ষে স্থানান্তর করতে পারবেন? কিছু লোকের কাছে এই সাইটের জন্য একটি ব্যবহারকারী স্ক্রিপ্ট রয়েছে যা কোডের প্রথম ব্লকের অক্ষরগুলিকে গণনা করে।
গ্যারেথ

@ গ্যারেথ: সম্পন্ন ..
মার্টিন থোমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.