এটি কি এল-উত্তল?


14

পটভূমি

পলিওমিনোকে এল-উত্তল বলা হয় , যদি কোনও এলাকৃতির পথ দিয়ে কোনও টাইল থেকে অন্য কোনও টাইলের যাতায়াত সম্ভব হয় তবে এটি এমন একটি পথ যা মূল দিকের দিকে যায় এবং একবারে একবারে দিক পরিবর্তন করে। উদাহরণস্বরূপ, 1চিত্রের s এর পলিওমিনো

0 0 1 1 1 0

1 1 1 1 0 0

1 1 0 0 0 0

এল-উত্তল নয়, যেহেতু নীচে বাম 1থেকে উপরের ডানদিকে উভয় এল-আকারের পথের 1মধ্যে একটি রয়েছে 0:

0>0>1>1>1 0
^       ^
1 1 1 1 0 0
^       ^
1>1>0>0>0 0

তবে 1এই চিত্রের s এর পলিওমিনো হ'ল এল-উত্তল:

0 1 1 1 0 0

1 1 1 1 1 1

0 1 1 0 0 0

ইনপুট

আপনার ইনপুটটি আপনার ভাষার নেটিভ ফর্ম্যাটে বিটগুলির একটি 2D অ্যারে বা যদি আমাদের ভাষায় অ্যারে না থাকে তবে একটি নিউলাইন-বিস্মৃত স্ট্রিং হিসাবে। এটি অন্তত একটি ধারণের গ্যারান্টিযুক্ত 1

আউটপুট

1S এর সেটটি যদি একটি এল-কনভেক্স পলিওমিনো হয় তবে আপনার আউটপুটটি সত্যই মান হবে এবং যদি না হয় তবে একটি মিথ্যা মান। এই ফলাফলগুলি সামঞ্জস্যপূর্ণ হতে হবে: আপনার অবশ্যই সমস্ত এল-উত্তল ইনপুটগুলির জন্য একই সত্যবাদী মান এবং অন্যদের জন্য একই মিথ্যা মান আউটপুট করতে হবে। নোট করুন যে সংযোগ বিচ্ছিন্ন সেট 1(যা পলিওমিনো নয়) ফলসী আউটপুট দেয়।

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

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

পরীক্ষার কেস

এই পরীক্ষাগুলির ক্ষেত্রেও যদি আপনার অ্যারেগুলি ঘোরানো বা প্রতিফলিত করা হয় বা 0কোনও সীমানায় সারি সারি যুক্ত করা হয় তবে তা কাজ করা উচিত ।

False instances
01
10

111
101
111

1101
1111
1110

1100
1000
0011

01100
11110
01110
00110

011000
011110
001111

True instances
1

01
11

010
111
010

001
011
111

11100
11110
01100
01000

011000
011000
111100
111111
001000

খুব সুন্দর চ্যালেঞ্জ, আমি এটি উপভোগ করেছি =)
flawr

ইনপুট সম্পর্কে: এটি একটি সম্পর্কে newline-সীমা নির্দেশ করা স্ট্রিং , অনুমোদিত যদি আমাদের ভাষা না অ্যারে অভাব ?
edc65

@ edc65 (দুঃখিত, কয়েক দিন ধরে গ্রিডের বাইরে ছিলেন।) অবশ্যই, এটিও অনুমোদিত, এটি আমার পক্ষে ঠিক খারাপভাবে বলা হয়েছে ed
জাগারব

উত্তর:


6

শামুক , 45 24

&
!{\1t\1!{o\1,nf\1,!.!~

আমার প্রাথমিক সমাধানটি পোস্ট করার পরে, আমি বুঝতে পেরেছিলাম যে আরও অনেক ভাল উপায় ছিল। আসল প্রোগ্রামটি দুটি 1জোয়ারের মধ্য দিয়ে পাথ দ্বারা গঠিত বর্গক্ষেত্রের চারপাশে ভ্রমণ করেছিল , প্রতিটি জোড়ের জোরে 0 টির উপস্থিতির জন্য পরীক্ষা করে। সরলরেখার পথগুলির জন্য এটিতে একটি বিশেষ কেসও থাকতে হয়েছিল। নতুন সংস্করণটি এক থেকে অন্যটিতে টেলিপোর্টিংয়ের মাধ্যমে শুরু হয় এবং এর শুরুতে 1সরাসরি বা এল-আকৃতির পাথের অভাবের জন্য পরীক্ষা করে 1


ঈশ্বর!! এমন কোনও অনলাইন দোভাষী আছে যেখানে আমরা এটির সাথে চারপাশে খেলতে পারি?
flawr

1
@ ফ্লোয়ার আপনি এখানে উত্স কোড সহ উত্স থেকে এটি তৈরি করতে পারেন ।
অ্যালেক্স এ।

6

মতলব, 182 বাইট

আইডিয়া: 1পলিওমিনো ম্যাট্রিক্সের প্রত্যেকের জন্য পুনরাবৃত্তি করুন :

  • শুধুমাত্র প্রদত্ত 1তবে বাকী শূন্য দিয়ে নতুন ম্যাট্রিক্স তৈরি করুন ।
  • 1এই নতুন ম্যাট্রিক্সের প্রত্যেকের জন্য (আর কিছুই পরিবর্তন না হওয়া পর্যন্ত পুনরাবৃত্তি করুন)
    • যোগ 1এক্স দিক প্রতিবেশীদের যেন আছে 1polynomio প্রতিবেশীর মতন
  • 1এই নতুন ম্যাট্রিক্সের প্রত্যেকের জন্য (আর কিছুই পরিবর্তন না হওয়া পর্যন্ত পুনরাবৃত্তি করুন)
    • যোগ 1এক্স দিক প্রতিবেশীদের যেন আছে 1polynomio প্রতিবেশীর মতন

এখন 1নতুন ম্যাট্রিক্সে 1পলিনোমিও-ম্যাট্রিক্সের সমস্তটি কভার করা উচিত যা প্রদত্ত সূচনা বিন্দু থেকে প্রথমে এক্স-দিকে এবং তারপরে y- দিক দিয়ে পৌঁছানো যায়। এখন আমরা একই প্রক্রিয়াটির পুনরাবৃত্তি করতে পারি তবে প্রথমে y- দিক এবং পরে x- দিক দিয়ে চলেছি। এখন প্রতিটি 1পলিওমিনো ম্যাট্রিক্স একবারে বা উভয় সময়ে পৌঁছানো উচিত। যদি তা না হয়, তবে আমরা Lপলিনোমিও ম্যাট্রিক্সে এমন একটি অবস্থান পেয়েছি যা প্রতি-পদে প্রতিটি অবস্থান থেকে পৌঁছানো যায় না ।

Golfed:

function r=f(a);[i,j,b]=find(a);N=nnz(i);r=1;for k=1:N;K=1:3;for l=1:2;c=b;b=a*0;b(i(k),j(k))=1;for z=1:2*N; b=conv2(b+0,K,'s')&a;if z==N;K=K';end;end;end;r=r*all(b(:)|c(:)>=a(:));end

মন্তব্য সহ:

function r=codegolf_L_convex(a);
%a=[0,1;1,1];
[i,j,b]=find(a);%b just needs to be initialized, does not really mattter
N=nnz(i);%number of ones in the matrix
r=1;%return value
for k=1:N;%go throu all '1' in the matrix
    %expand that pixel in x dir:
    K=1:3;%convolution kernel (just three positive values needed)
    for l=1:2;%first horizontal->vertical then vertical->horizontal
        c=b;%backup for considering both runs
        b=a*0;
        b(i(k),j(k))=1; %set the seed
        for z=1:2*N;     
            b=conv2(b+0,K,'s')&a; %expand the seed horizontally (or vertically for the second half) but only within the polyomino
            if z==N;
                K=K'; %change horizontal/vertical 
            end;
        end;
    end;
    r=r*all(b(:)|c(:)>=a(:));%check whether we can really reach every point
end

পরীক্ষার কেস স্ক্রিপ্ট:

disp('all false -------------');
a=[0,1;1,0];
f(a)
a=[1,1,1;1,0,1;1,1,1];
f(a)
a=[1,1,0,1;1,1,1,1;1,1,1,0];
f(a)
a=[1,1,0,0;1,0,0,0;0,0,1,1];
f(a)
a=[0,1,1,0,0;1,1,1,1,0;0,1,1,1,0;0,0,1,1,0];
f(a)
a=[0,1,1,0,0,0;0,1,1,1,1,0;0,0,1,1,1,1];
f(a)
 disp('all true +++++++++++++');
a=[1];
f(a)
a=[0,1;1,1];
f(a)
a=[0,1,0;1,1,1;0,1,0];
f(a)
a=[0,0,1;0,1,1;1,1,1];
f(a)
a=[1,1,1,0,0;1,1,1,1,0;0,1,1,0,0;0,1,0,0,0];
f(a)
a=[0,1,1,0,0,0;0,1,1,0,0,0;1,1,1,1,0,0;1,1,1,1,1,1;0,0,1,0,0,0];
f(a)

2

জাভাস্ক্রিপ্ট ES6, 290 বাইট

ঠিক আছে, সম্ভবত এটি ব্রাভিটির জন্য কোনও পুরস্কার জিতবে না, তবে এটি একটি অভিনব পদ্ধতির ব্যবহার করে। এটি কীভাবে কাজ করে তার জন্য অদ্বিতীয় সংস্করণ দেখুন।

এই পদ্ধতির জন্য প্রমাণগুলি পাওয়া যাবে: সেলুলার অটোমেটা এবং ডিস্রিট কমপ্লেক্স সিস্টেম

L=a=>[1,0,1].every($=>(a=a[0].map((_,col)=>a.map(row=>row[col]))).map(r=>($?r.reverse():r).join``).every((r,i,b)=>r.replace(/^(0*)(1*)(0*)$|(.+)/,(_,s,m,o,e)=>(c=e)?'':!m||b[i-1]&&+b[i-1][s.length]?1:b.every((r,j)=>j<i||(c=c||!+r[l=s.length])?r.search(`0{${l}}.*0{${o.length}}`)+1:1)||'')))

Ungolfed:

function L(a) {
  /* Runs three times and ensure all pass validation
   * 1: horizontally reversed
   * 2: 90 degrees rotated
   * 3: original
   *
   *     | 1:  | 2:  | 3:
   * =====================
   * 001 | 100 | 111 | 001
   * 011 | 110 | 011 | 011
   * 111 | 111 | 001 | 111
   *
   * By finding maximal rectangles with corners on all NW and NE corners
   * (separately) of a HV-convex polyomino and ensuring it doesn't enter the
   * boundaries labelled ABCD for the rectangle X below:
   *
   *   A  |         |  B
   * -----===========-----
   *      |    X    |
   * -----===========-----
   *   C  |         |  D
   *
   * The first iteration tests the NE corners and horizontal convexity.
   * The second iteration test vertical convexity.
   * The third iteration tests the NW corners.
   *
   * If all pass then the polyomino is L-convex.
   */
  return [1,0,1].every(function($){
    return (a=a[0].map((_,col)=>{
      // Transpose rows with columns
      return a.map(row=>row[col])
    })).map(row=>{
      // Join rows as strings and on odd iterations reverse them
      return ($ ? row.reverse() : row).join``
    }).every(function(row, i, b) {
      if (i == 0) console.log(b.join('\n'));
      return row.replace(/^(0*)(1*)(0*)$|(.+)/, function(_, start, middle, end, invalid) {
        // Non H-convex polyomino (0 between 1s)
        if (invalid) return '';
        // Is not a NW corner (character above is 1)
        if (!middle || b[i-1] && +b[i-1][start.length]) return 1;
        c=1;
        return b.every(function(row, j) {
          // Above or below maximal rectangle from corner
          if (j < i || !(c=c&&+row[l=start.length])) {
            // Area before and after maximal rectangle doesn't contain 1
            return row.search(`0{${l}}.*0{${end.length}}`)+1
          }
          return 1;
        }) || '';
      });
    });
  });
}

1
হ্যাঁ, এই নিবন্ধটি যেখানে আমি এই চ্যালেঞ্জের অনুপ্রেরণা পেয়েছি!
Zgarb

@ জাগারব নিবন্ধটি দুর্দান্ত ছিল এবং আমি যে কয়েকটিকে গণিতমুখী নয় তার পক্ষে এটি উপলব্ধি করতে পেরেছিলাম one
জর্জ রিথ

2

গণিত, 129 127 বাইট

3>GraphDiameter@Graph[#,#<->#2&@@@Select[#~Tuples~2,!FreeQ[#-#2&@@#,0]&]]&@Position[#,1]&&{#,Thread@#}~FreeQ~{___,1,0..,1,___}&

ব্যাখ্যা:

প্রথমত, যদি একই সারি বা কলামে 0দুটি 1এর মধ্যে একটি থাকে তবে অ্যারেটি এল-উত্তল নয়, কারণ আমরা দুটি 1গুলি সংযোগ করতে পারি না ।

এই কেসটি বাদ দেওয়ার পরে, 1একই সারি বা কলামের প্রতিটি দুটি সরল পথ দিয়ে সংযুক্ত হতে পারে। আমরা একটি গ্রাফ তৈরি করতে পারি, যার উল্লম্বগুলি 1অ্যারেতে s এর অবস্থান এবং প্রান্তগুলি 1একই সারি বা কলামে গুলি এর জোড়া । তারপরে অ্যারেরটি এল-উত্তল হয় যদি এবং কেবল গ্রাফের ব্যাস 3 এর চেয়ে কম হয়।


1
এটি কীভাবে কাজ করে আপনি একটি ব্যাখ্যা দিতে পারেন? আমি
জিব্বারিশকে উপুড় করে দেখছি

এটি কীভাবে প্রথম এবং চতুর্থ মিথ্যা দৃষ্টান্তগুলি (সংযোগ বিচ্ছিন্ন) স্বীকৃতি দেয়?
Zgarb

1
@ জগারব যদি গ্রাফটি সংযোগ বিচ্ছিন্ন হয় তবে এর ব্যাস অসীম।
আলেফাল্ফ

2

জাভাস্ক্রিপ্ট (ES6) 174

খালি বা ভরাট ঘরগুলির গ্রিডের দিকে তাকিয়ে, কোনও জোড়ায় ভরা কোষের জন্য আমি অন্য সেল কলামের অনুভূমিক পাথগুলি পরীক্ষা করতে পারি (ঘরগুলি একই সারিতে থাকে তবে অন্য 1 বা 2 হতে পারে) এবং এর উল্লম্ব পথগুলি অন্যান্য ঘর সারি (1 বা 2ও হতে পারে)। যদি আমি উভয় উল্লম্ব পাথ বা উভয় অনুভূমিক পাথগুলিতে একটি খালি ঘর পাই তবে কোষগুলির মধ্যে কোনও এল আকৃতির পথ থাকতে পারে না।

(এই ব্যাখ্যাটি দেওয়ার চেষ্টা করতে আমার বেশ কষ্ট হয়েছিল - আমি আশা করি পরিষ্কার হয়েছি)

যে কোনও ইকামাস্ক্রিপ্ট 6 অনুবর্তী ব্রাউজারে নীচে স্নিপেট চালনা পরীক্ষা করুন

F=p=>!p.some((n,y)=>n.some((q,x)=>q&&p.some((o,u)=>o.some((q,t)=>{for(f=0,i=y;q&i<=u;i++)f|=!p[i][x]|2*!p[i][t];if(f<3)for(f=0,j=x;q&j<=t;j++)f|=!n[j]|2*!o[j];return f>2}))))

// TEST
console.log=(...x)=>O.innerHTML+=x+'\n'

tko = [
 [[0,1],[1,0]]
,[[1,1,1],[1,0,1],[1,1,1]]
,[[1,1,0,1],[1,1,1,1],[1,1,1,0]]
,[[1,1,0,0],[1,0,0,0],[0,0,1,1]]
,[[0,1,1,0,0],[1,1,1,1,0],[0,1,1,1,0],[0,0,1,1,0]]
,[[0,1,1,0,0,0],[0,1,1,1,1,0],[0,0,1,1,1,1]]
]
tko.forEach(t=>(console.log(t.join`\n`+`\nFalse? ${F(t)}\n`)));
tok = [
 [[1]]
,[[0,1],[1,1]]
,[[0,1,0],[1,1,1],[0,1,0]]
,[[0,0,1],[0,1,1],[1,1,1]]
,[[1,1,1,0,0],[1,1,1,1,0],[0,1,1,0,0],[0,1,0,0,0]]
,[[0,1,1,0,0,0],[0,1,1,0,0,0],[1,1,1,1,0,0],[1,1,1,1,1,1],[0,0,1,0,0,0]]
]  
tok.forEach(t=>(console.log(t.join`\n`+`\nTrue? ${F(t)}\n`)));

// LESS GOLFED

U=p=>
  !p.some((n,y)=>  
    n.some((q,x)=> 
      q && p.some((o,u)=>  
        o.some((q,t)=>{
          for(f=0,i=y; q&i<=u; i++)f|=!p[i][x]|2*!p[i][t]
          if (f<3)
            for(f=0,j=x; q&j<=t; j++)f|=!n[j]|2*!o[j]
          return f>2
        })
      )
    )
  )
<pre id=O></pre>

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