একটি দ্রাক্ষালতা সনাক্ত করুন


31

পটভূমি

আমার কাছে একগুচ্ছ পুরানো এবং দানাদার কালো-সাদা চিত্র রয়েছে। তাদের মধ্যে কিছু প্রাচীরের উপরে দ্রাক্ষালতা চিত্রিত করে, অন্যরা তা করে না - আপনার কাজটি আমার জন্য তাদের শ্রেণিবদ্ধ করা।

ইনপুট এবং আউটপুট

আপনার ইনপুট বিট একটি আয়তক্ষেত্রাকার 2D অ্যারে একটি , কোনো সুবিধাজনক বিন্যাসে দেওয়া। এটি খালি হবে না তবে 0 এবং 1 এস উভয়ই রাখার গ্যারান্টি নেই। নিম্নলিখিত শর্তগুলি ধরে থাকলে অ্যারে একটি দ্রাক্ষালতা চিত্রিত করে:

  • এ এর নীচের সারিতে কমপক্ষে একটি রয়েছে These এটি দ্রাক্ষালতার শিকড়।
  • প্রতি 1২ একজন 1s এর একটি পাথ যায় যে শুধুমাত্র বাম ডান এবং নিচে (আপ না এবং তির্যকভাবে নয়) দ্বারা নিচের সারি সাথে সংযুক্ত আছে। এই পথগুলি দ্রাক্ষালতার শাখা হয়।

আপনার ইনপুটটি একটি সামঞ্জস্যপূর্ণ সত্যবাদী মান যদি ইনপুটটি একটি দ্রাক্ষালতা এবং অন্যথায় একটি সামঞ্জস্যপূর্ণ মিথ্যা মানকে চিত্রিত করে।

উদাহরণ

এই অ্যারে একটি দ্রাক্ষালতা চিত্রিত:

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

এই ইনপুটটি একটি দ্রাক্ষালতা চিত্রিত করে না, যেহেতু ডান সীমানার মাঝখানে 1 টি রয়েছে যা একটি শাখার মাধ্যমে শিকড়ের সাথে সংযুক্ত নেই:

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

অল -0 0 টি অ্যারে কখনই একটি দ্রাক্ষালতা চিত্রিত করে না, তবে সমস্ত -1 অ্যারে সর্বদা করে।

বিধি এবং স্কোরিং

আপনি একটি সম্পূর্ণ প্রোগ্রাম বা একটি ফাংশন লিখতে পারেন। সর্বনিম্ন বাইট গণনা জয়, এবং মান লুফোলগুলি অনুমোদিত নয়।

পরীক্ষার মামলা

সত্যবাদী ইনপুট:

1

0
1
1

01
11

0000
0111
1100
1001

1111
1111
1111
1111

001001
011001
010111
110101
011101
001011

1011011
1001001
1111111
0100000
0111111
1111001
1001111
1111101

0000000
0011100
0010100
0011100
0001000
1111111
0001000
0011100
0010100
0010100

মিথ্যা ইনপুট:

0

1
0

10
01

000
000
000

011
110
000

111111
000000
101011
111001

010010
001000
000010
110001

001100
111111
110101
010011
111011

000110
010111
010101
011110
001101

11000000
10110001
10011111
11110001
01100011
00110110
01101100
01100001
01111111

1
যে আঙ্গুরলতা নীচের দিকে বেড়ে উঠতে পারে না বুঝতে পারছি না, একটা চমৎকার ধারণা গ্রাফ এর সংযুক্ত উপাদান, দীর্ঘশ্বাস ব্যবহার ... ছিল
ফিটফাট

@ সুইশ এর সমস্ত অর্থ হ'ল প্রতিটি সারি ঘুরিয়ে অপসারণ করতে হবে নীচের দিকে 1s এর লাইনের সাথে সংযুক্ত একটি গ্রাফের ফলস্বরূপ।
নীল

উত্তর:


26

শামুক , 25 19 17 বাইট

&
\0z),(\1dlr)+d~

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

শামুক একটি রেডেক্স দ্বারা অনুপ্রাণিত একটি 2D প্যাটার্ন-ম্যাচিং ভাষা, যা মূলত আমাদের 2D প্যাটার্নের সাথে ম্যাচিং ভাষার নকশা চ্যালেঞ্জের জন্য তৈরি হয়েছিল ।

&তোলে Snails প্রতি সম্ভব শুরুর অবস্থান এবং কপি করে প্রিন্ট থেকে প্যাটার্ন চেষ্টা 0বা 1কিনা প্যাটার্ন তাদের সব তাদের বা ম্যাচ কোনো ব্যর্থ উপর নির্ভর করে।

এখন শামুকগুলি অন্তর্নিহিত প্রথম বন্ধনীগুলির সাথে কাজ করতে পারে, তাই নীচের জন্য প্যাটার্নটি সংক্ষিপ্ত:

(\0z),(\1dlr)+d~

,একটি মত কাজ করে *, Regex মধ্যে (অর্থাত মেলে শূন্য বা তার বেশি বার) যেহেতু +Regex (এক বা একাধিকবার মেলে) এ সমান। সুতরাং আমরা যতবার \0zপ্রয়োজন ততবার ম্যাচ করে শুরু করি যা একক সাথে মেলে 0এবং তারপরে শামুকটিকে নির্বিচারে তার দিকটি পুনরায় সেট করার অনুমতি দেয় z। এটি ইনপুটটিতে শূন্যকে মঞ্জুরি দেয়, শর্ত দেয় যে কোনও বৈধ দ্রাক্ষা কোষ অন্য কোথাও পাওয়া যায়।

তারপরে আমরা কমপক্ষে একটির সাথে মেলে \1dlrযা কোনও এককটির সাথে মেলে 1এবং তারপরে শামুকটি নীচে, বাম বা ডানদিকে তার দিকটি পুনরায় সেট করতে দেয়। মনে রাখবেন যে আমরা যে ঘরে যে কক্ষে শুরু করেছি সেটিতে 1যদি কেবলমাত্র একটি অংশ থাকে তবে আমরা কেবল এই অংশটির সাথে মেলে। এটি শামুকটি মূলত একটি শাখা থেকে শিকড়ের নীচে একটি দ্রাক্ষালতা অতিক্রম করার অনুমতি দেয়।

অবশেষে, আমাদের নিশ্চিত করতে হবে যে আমরা ( ~) এর নীচে একটি সীমার বাইরে ( ) সন্ধান করে মাটিতে পৌঁছেছি d



3

জাভাস্ক্রিপ্ট (ES6), 135 বাইট

s=>s.replace(/^[^1]*\n/,``).split`
`.map(s=>+`0b${s}`).reverse(g=(n,m,o=(m<<1|m|m>>1)&n)=>n-m?o-m&&g(n,o):n).reduce((m,n,i)=>g(n,n&m))

দ্রষ্টব্য: পূর্ণসংখ্যার ধরণের সীমাবদ্ধতার কারণে, কেবলমাত্র 31 টি অক্ষরের প্রস্থের লাইনগুলির জন্য কাজ করে। ব্যাখ্যা: সংযোগের পয়েন্টগুলি নির্ধারণের জন্য প্রতিটি সারি সংলগ্ন সারিটির সাথে সামান্য দিকে অ্যান্ডড করা হয় এবং তারপরে ক্রমটি পুনরায় ক্রমটি gঅনুভূমিকভাবে প্রসারিত করতে ব্যবহৃত হয় যতক্ষণ না এটি আর প্রসারিত না হয়। উদাহরণস্বরূপ, যদি দুটি সংলগ্ন সারি হয় 1110111এবং 1011100তারপরে সংযোগ পয়েন্টগুলি হয় 1010100এবং এটি এর পরে প্রসারিত হয় 1110110এবং 1110111তারপরে সন্ধানটি সারিটি সংযুক্ত আছে কিনা। যদি gফাংশন ব্যর্থ হয় তবে এটি শূন্যটি ফিরে আসে যার ফলে পরবর্তী সমস্ত gফাংশন খুব ব্যর্থ হয় এবং ফলাফলটি মিথ্যা হয়। যদি gফাংশনটি সফল হয় তবে এটি নতুন সারিটি প্রদান করে যা reduceপরবর্তী সারির পরীক্ষার জন্য প্রসারিত।

s=>s.replace(/^[^1]*\n/,``)         Remove irrelevant leading "blank" rows
    .split`\n`                      Split into lines
    .map(s=>+`0b${s}`)              Convert into binary
    .reverse(                       Process from bottom to top
     g=(n,m,o=(m<<1|m|m>>1)&n)=>     Expand row horizontally
      n-m?o-m&&g(n,o):n)             Check whether rows are connected
    .reduce((m,n,i)=>g(n,n&m))      Check all rows

আমি নিয়ম করব যে ৩১ টি অক্ষর যথেষ্ট প্রশস্ত এবং এই পদ্ধতিটি বৈধ।
জাগারব

2

পাইথন 2, 254 বাইট

কোনও গ্রন্থাগার নেই

def f(A,r=0,c=-1):
 B=A[r];R=len(A)-1;C=len(B);i=1 in A[R]
 if c<0:
    for j in range(R*C+C):
        if A[j/C][j%C]:i&=f(A,j/C,j%C)
    return i&1
 _=B[c];B[c]=0;i=_&(r==R)
 if _:
    if c>0:i|=f(A,r,c-1)
    if r<R:i|=f(A,r+1,c)
    if c<C-1:i|=f(A,r,c+1)
 B[c]=_;return i

নোট করুন যে দ্বিতীয় এবং তৃতীয় স্তরের ইনডেন্টগুলি বাইট গণনায় ট্যাবগুলি নিয়ে গঠিত।

এটি অনলাইনে চেষ্টা করুন


1

ওল্ফ্রাম - 254

এই কাজটি করতে কিছুটা সময় ব্যয় করুন, তাই আমি এটি এখানেই রেখে দেব:

f[s_]:=(
v=Characters@StringSplit@s;
{h,w}=Dimensions@v;
g=GridGraph@{w,h};
r=First/@Position[Flatten@v,"0"];
g=VertexDelete[Graph[VertexList@g,
EdgeList@g/.x_y_/;Abs[x-y]>1yx],r];
v=VertexList@g;
v≠{}∧v~Complement~VertexOutComponent[g,Select[v,#>w h-w&]]{}
)

মূলত আমি নির্দেশিত প্রান্তগুলিকে উপরে নির্দেশ করে একটি গ্রিড গ্রাফ তৈরি করি, 0 এর সাথে অনুরূপ উল্লম্ব সরিয়ে ফেলুন, নীচের ভার্টেক্স উপাদানগুলিতে সমস্ত উল্লম্ব রয়েছে তা পরীক্ষা করুন। হাস্যকর, আমি জানি ...


2
কেন এই প্রতিযোগিতা হয়?
ডাউনওয়েট

1
এটি গল্ফ করা হয়নি বলে বর্তমানে আমরা এই "উত্তর নয়" হিসাবে বিবেচনা করব। যদি আপনি কেবল অপ্রয়োজনীয় শ্বেতস্পেস সরান এবং একটি বাইট গণনা যোগ করেন তবে আমি কেন এটি প্রতিযোগী হওয়া উচিত তার কোনও কারণ আমি দেখতে পাচ্ছি না।
অ্যালেক্স এ

0

পাইথন + নুমপি 204 202 195 বাইট

from numpy import*
def f(A):
 r,c=A.shape
 z,s=zeros((r,1)),array([0,2,c+3])
 B=hstack((z,A,z)).flat
 for i in range(1,(r-1)*(c+2)):
    if B[i]and not any(B[s]):return 1<0
    s+=1
 return any(B[i:])

আশা Aএকটি 2 ডি numpy অ্যারের যাবে।

ম্যাট্রিক্স নেয়, বাম এবং ডান শূন্য কলাম প্যাড করে এবং ম্যাট্রিক্স সমতল করে। sএকটি স্টেনসিল যা বাম, ডান এবং নিম্ন উপাদানকে নির্দেশ করে। লুপটি সর্বশেষ লাইনটি বাদে প্রতিটি উপাদান পরীক্ষা করে যদি তা থাকে 1এবং এর স্টেনসিলের অন্তত একটি হয় অন্যথায় 1ফিরে আসে False। পরে, শেষ লাইনে কোনও রয়েছে কিনা তা পরীক্ষা করে দেখুন 1

আপনার জন্য দুটি টেস্টকেস:

I1 = '001001\n011001\n010111\n110101\n011101\n001011'
A1 = array([int(c) for c in I1.replace('\n','')]).reshape(6,6)
print f(A1) #True

I2 = '001100\n111111\n110101\n010011\n111011'
A2 = array([int(c) for c in I2.replace('\n','')]).reshape(5,6)
print f(A2) #False

সম্পাদনা 1: এর 1<0চেয়ে কমFalse

সম্পাদনা 2: লুপের দ্বিতীয় অভিপ্রায়ের জন্য ট্যাবলেটরগুলির flatএকটি দুর্দান্ত বিকল্প flatten()এবং এটির ব্যবহার

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