আরবোরিলি সন্তুষ্ট পয়েন্ট সেটগুলি সনাক্ত করুন


14

একটি আর্বোরেলি সন্তুষ্ট পয়েন্ট সেট পয়েন্টগুলির একটি 2 ডি সেট যা বিপরীত কোণ হিসাবে দুটি বিন্দু ব্যবহার করে যে কোনও অক্ষ-সারিবদ্ধ আয়তক্ষেত্রের জন্য, আয়তক্ষেত্রটি অন্তত একটি অন্য বিন্দু ধারণ করে বা স্পর্শ করে। এখানে উইকিপিডিয়া থেকে একটি সমতুল্য সংজ্ঞা:

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

নীচের চিত্রটি আয়তক্ষেত্রগুলি কীভাবে গঠিত তা চিত্রিত করে। এই পয়েন্ট সেটটি আরবোরিয়ালি সন্তুষ্ট নয় কারণ এই আয়তক্ষেত্রটিতে কমপক্ষে আরও একটি পয়েন্ট থাকা দরকার।

এখানে চিত্র বর্ণনা লিখুন

এএসসিআইআই আর্টে, এই পয়েন্ট সেটটি উপস্থাপিত হতে পারে:

......
....O.
......
.O....
......

সামান্য পরিবর্তন এটিকে তীব্রভাবে সন্তুষ্ট করতে পারে:

......
....O.
......
.O..O.
......

উপরে, আপনি দেখতে পাচ্ছেন যে সমস্ত আয়তক্ষেত্রগুলিতে (যার মধ্যে কেবল একটিই রয়েছে) কমপক্ষে তিনটি পয়েন্ট থাকে।

এখানে আরও জটিল পয়েন্ট সেটটির আর একটি উদাহরণ যা তাত্ত্বিকভাবে সন্তুষ্ট:

এখানে চিত্র বর্ণনা লিখুন

দুটি পয়েন্ট বিস্তৃত যে কোনও আয়তক্ষেত্রের জন্য, আয়তক্ষেত্রে কমপক্ষে একটি অন্য পয়েন্ট থাকে।

চ্যালেঞ্জ

পয়েন্টগুলির একটি আয়তক্ষেত্রাকার গ্রিড দেওয়া হয়েছে (যার সাথে আমি প্রতিনিধিত্ব করি O) এবং খালি স্থান (যার সাথে আমি উপস্থাপন করি .), সত্যবাদী মানটি যদি এটি তত্ক্ষণিতভাবে সন্তুষ্ট হয় তবে আউটপুট দেয় বা এটি যদি না হয় তবে একটি মিথ্যা মান। এটি কোড-গল্ফ।

অতিরিক্ত নিয়ম:

  • আপনি অক্ষরগুলি চয়ন করতে পারেন Oএবং .মুদ্রণযোগ্য এএসসিআইআই অক্ষরের অন্য কোনও জোড়ের সাথে অদলবদল করতে পারেন । আপনার প্রোগ্রামটি কোন চরিত্রের ম্যাপিং ব্যবহার করে তা কেবল নির্দিষ্ট করুন।
  • গ্রিড সবসময় আয়তক্ষেত্রাকার হবে। একটি পেছনের নতুন লাইন অনুমোদিত।

আরও উদাহরণ

তীব্রভাবে সন্তুষ্ট:

.OOO.
OO...
.O.OO
.O..O
....O

..O..
OOOO.
...O.
.O.O.
...OO

O.O.
..O.
OOOO
.O.O
OO..

...
...
...

...
..O
...

O.....
O.O..O
.....O

OOO.OO

তাত্পর্যপূর্ণ সন্তুষ্ট নয়:

..O..
O....
...O.
.O...
....O

..O..
O.OO.
...O.
.O.O.
...OO

O.....
..O...
.....O

1
সুতরাং আমাদেরকে ASCII এর পরিবর্তে স্থানাঙ্কের তালিকা হিসাবে ইনপুট নেওয়ার অনুমতি নেই? যদি না হয় তবে আমি পয়েন্টগুলি উপস্থাপনের জন্য ইনপুটগুলিকে পূর্ণসংখ্যার (2 এবং 1) 2D তালিকা হিসাবে নিতে পারি?
ডেনকার

গ্রিডের 0 টি অঞ্চল থাকতে পারে?
ফেয়ারসাম

উত্তর:


7

শামুক , 29 30 39 বাইট

!{t\Oo\.+c\.,\O!{t\O{w!(.,~}2

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

সর্বাধিক 1 এবং গ্রিডের ক্ষেত্রটি প্রিন্ট করে যদি ইনপুটটি "তীব্রভাবে সন্তুষ্ট" হয়; অন্যথায় 0।


3

ওরাকল এসকিউএল 11.2, 364 344 বাইট

WITH v AS(SELECT MOD(LEVEL-1,:w)x,FLOOR((LEVEL-1)/:w)y FROM DUAL WHERE'O'=SUBSTR(:g,LEVEL,1)CONNECT BY LEVEL<=LENGTH(:g))SELECT a.*,b.*FROM v a,v b WHERE b.x>a.x AND b.y>a.y MINUS SELECT a.*,b.*FROM v a,v b,v c WHERE((c.x IN(a.x,b.x)AND c.y>=a.y AND c.y<=b.y)OR(c.y IN(a.y,b.y)AND c.x>=a.x AND c.x<=b.x))AND(c.x,c.y)NOT IN((a.x,a.y),(b.x,b.y));

: g হ'ল গ্রিডটি স্ট্রিং হিসাবে
: w গ্রিডের প্রস্থ

সত্য হিসাবে কোনও লাইন ফেরত দেয় না, এমন আয়তক্ষেত্রগুলি ফিরিয়ে দেয় যা মানদণ্ডে মিথ্যা হিসাবে মেলে না

আন golfed

WITH v AS
(
  SELECT MOD(LEVEL-1,:w)x,FLOOR((LEVEL-1)/:w)y,SUBSTR(:g,LEVEL,1)p 
  FROM   DUAL 
  WHERE  'O'=SUBSTR(:g,LEVEL,1)
  CONNECT BY LEVEL<=LENGTH(:g)
)
SELECT a.*,b.*FROM v a,v b
WHERE b.x>a.x AND b.y>a.y
MINUS
SELECT a.*,b.*FROM v a,v b,v c
WHERE((c.x IN(a.x,b.x) AND c.y>=a.y AND c.y<=b.y) OR (c.y IN(a.y,b.y) AND c.x>=a.x AND c.x<=b.x))
  AND(c.x,c.y)NOT IN((a.x,a.y),(b.x,b.y));

ভিউ প্রতিটি ও পয়েন্টের স্থানাঙ্কগুলি গণনা করে।
বিয়োগের প্রথম অংশটি সমস্ত আয়তক্ষেত্রগুলি ফিরিয়ে দেয়, যেখানে ধারাটি নিশ্চিত করে যে কোনও বিন্দু নিজেই যুক্ত করা যায় না।
দ্বিতীয় অংশটি প্রতিটি আয়তক্ষেত্রে তৃতীয় পয়েন্টের জন্য অনুসন্ধান করে। সেই বিন্দুটির একটি সমন্বয়, x বা y হওয়া দরকার যা আয়তক্ষেত্র নির্ধারণকারী দুটি পয়েন্টের একটির জন্য এই স্থানাঙ্কের সমান। তৃতীয় পয়েন্টের অন্যান্য স্থানাঙ্কটি আয়তক্ষেত্রকে সংজ্ঞায়িত করে প্রতিটি পয়েন্টের জন্য সেই স্থানাঙ্ক দ্বারা আবদ্ধ সীমার মধ্যে থাকা আবশ্যক।
যেখানে ধারাটির শেষ অংশটি নিশ্চিত করে যে তৃতীয় পয়েন্টটি দুটি আয়তক্ষেত্রকে সংজ্ঞাযুক্ত দুটি বিন্দুর মধ্যে একটি নয়।
যদি সমস্ত আয়তক্ষেত্রের কমপক্ষে তৃতীয় বিন্দু থাকে তবে বিয়োগের প্রথম অংশটি দ্বিতীয় অংশের সমান এবং ক্যোয়ারী কিছুই দেয় না।


2

এমএটিএল , 38 বাইট

Ti2\2#fh!XJ"J@-XKtAZ)"@K-@/Eq|1>~As2>*

এটি ইনপুট হিসাবে একটি 2D চর অ্যারে ব্যবহার করে, সারিগুলি পৃথক করে পৃথক করে ;। সুতরাং প্রথম উদাহরণ

['......';'....O.';'......';'.O..O.';'......']

এই বিন্যাসে পরীক্ষার বাকী কেসগুলি নিম্নরূপ।

  • তীব্রভাবে সন্তুষ্ট:

    ['.OOO.';'OO...';'.O.OO';'.O..O';'....O']
    ['..O..';'OOOO.';'...O.';'.O.O.';'...OO']
    ['O.O.';'..O.';'OOOO';'.O.O';'OO..']
    ['...';'...';'...']
    ['...';'..O';'...']
    ['O.....';'O.O..O';'.....O']
    ['OOO.OO']
    
  • তাত্ত্বিকভাবে সন্তুষ্ট নয়:

    ['..O..';'O....','...O.';'.O...';'....O']
    ['..O..';'O.OO.';'...O.';'.O.O.';'...OO']
    ['O.....';'..O...';'.....O']
    

এটি অনলাইন চেষ্টা করুন! আপনি একবারে সমস্ত পরীক্ষার কেস যাচাই করতে পারেন।

ব্যাখ্যা

কোডটি প্রথমে ইনপুটটিতে অক্ষরগুলির স্থানাঙ্ক পায় O। এরপরে এটি দুটি নেস্টেড লুপ ব্যবহার করে। বাহ্যিক লুপ প্রতিটি বিন্দু পি (তার স্থানাঙ্কের 2-টিপল) বাছায়, সমস্ত পয়েন্টের সাথে তুলনা করে এবং দুটি স্থানাঙ্কে পি থেকে পৃথক হওয়া পয়েন্টগুলি রাখে। সেগুলি পয়েন্টগুলির চেয়ে পি এর সাথে একটি আয়তক্ষেত্র গঠন করতে পারে them

অভ্যন্তরীণ লুপটি প্রতিটি বিন্দু টি আর থেকে ধরে নেয় এবং পি এবং টি দ্বারা নির্ধারিত আয়তক্ষেত্রে কমপক্ষে 3 টি পয়েন্ট অন্তর্ভুক্ত করে কিনা তা পরীক্ষা করে। এটি করতে, এটি সমস্ত পয়েন্ট থেকে পি বিয়োগ করে; এটি স্থানাঙ্কের উত্সকে পি তে সরিয়ে দেয় A একটি বিন্দু আয়তক্ষেত্রের মধ্যে থাকে যদি টি এর সাথে সম্পর্কিত সমন্বয় দ্বারা বিভক্ত এর প্রতিটি স্থানাঙ্ক বন্ধ ব্যবধানে থাকে [0, 1]।

T          % push "true"
i          % take input 2D array
2\         % modulo 2: gives 1 for 'O', 0 for '.'
2#f        % row and column coordinates of ones. Gives two column arrays
h!         % concatenate horizontally. Transpose. Each point is a column
XJ         % copy to clipboard J
"          % for each column
  J        %   push all points
  @-       %   subtract current point (move to origin)
  XK       %   copy to clipboard K
  tA       %   logical index of points whose two coordinates are non-zero
  Z)       %   keep only those points. Each is a column
  "        %   for each column (point)
    @K-    %     push that point. Subtract all others
    @/     %     divide by current point
    Eq|1>~ %     true if in the interval [0,1]
    A      %     true if that happens for the two coordinates
    s      %     sum: find out how many points fulfill that
    2>     %     true if that number is at least 3
    *      %     multiply (logical and). (There's an initial true value at the bottom)
           %   end
           % end
           % implicit display

আমি ডন মুয়েসিলিকে আরও পছন্দ করেছি, কেন আপনি এটি ফিরিয়ে দিয়েছেন? :(
ডেনকার

@ ডেনারএফ :-) ভাল, আমি আমার আসল নামটিতে ফিরে এসেছি। অন্যটি মজাদার ছিল, তবে এটি অস্থায়ী হিসাবে লক্ষ্য করা হয়েছিল
লুইস মেন্ডো

1
এটি বাস্তব জীবনের মানুষ নয়, আমাদের এখানে আরও কিছু মজাদার দরকার! :)
ডেনকার

@ ডেনারএফ আমি ভবিষ্যতে সেই নামটিতে বা অন্য কারও কাছে ফিরে যেতে পারি। ডেনিম সোল সম্পর্কে কীভাবে? :-D
লুইস মেন্ডো

1
... এবং আপনাকে 30 দিনও অপেক্ষা করতে হবে (আমার মনে হয়)
স্টিভি গ্রিফিন

2

পিএইচপি, 1123 বাইট , 851 বাইট , 657 বাইট

(নবাগত পিএইচপি)

<?php
$B=array_map("str_split",array_map("trim",file('F')));$a=[];$b=-1;foreach($B as $c=>$C){foreach($C as $d=>$Z){if($Z=='O'){$a[++$b][]=$c;$a[$b][]=$d;}}}$e=array();foreach($a as $f=>$l){foreach($a as $g=>$m){$h=$l[0];$i=$l[1];$j=$m[0];$k=$m[1];if($h!=$j&&$i!=$k&&!(in_array([$g,$f],$e,1)))$e[]=[$f,$g];}}$A=array();foreach($e as $E){$n=$E[0];$o=$E[1];$q=$a[$n][0];$s=$a[$n][1];$r=$a[$o][0];$t=$a[$o][1];$u=($q<$r)?$q:$r;$v=($s<$t)?$s:$t;$w=($q>$r)?$q:$r;$X=($s>$t)?$s:$t;$Y=0;foreach($a as $p){$x=$p[0];$y=$p[1];if($x>=$u&&$x<=$w&&$y>=$v&&$y<=$X){$Y=($x==$q&&$y==$s)||($x==$r&&$y==$t)?0:1;}if($Y==1)break;}if($Y==1)$A[]=1;}echo count($A)==count($e)?1:0;

ব্যাখ্যা (মন্তব্য কোড):

<?php
//read the file
$lines=array_map("str_split",array_map("trim",file('F'))); // grid in file 'F'

//saving coords
$coords=[]; // new array
$iCoord=-1;
foreach($lines as $rowIndex=>$line) {
    foreach($line as $colIndex=>$value) {
        if ($value=='O'){
            $coords[++$iCoord][]=$rowIndex;//0 is x
            $coords[$iCoord][]=$colIndex;  //1 is y
        }
    }
}

/* for each point, draw as many rectangles as other points
 * without creating 'mirror' rectangles
 */ 
$rectangles=array();

foreach ($coords as $point1Index=>$point1) {
     //draw
     foreach ($coords as $point2Index=>$point2) {
            $point1X=$point1[0];
            $point1Y=$point1[1];
            $point2X=$point2[0];
            $point2Y=$point2[1];
            //if not on the same line or on the same column, ...
            if ($point1X!=$point2X &&   // same line
                $point1Y!=$point2Y &&   // same column
                !(in_array([$point2Index,$point1Index],$rectangles,true)) //... and if no 'mirror one' already
             ) $rectangles[]=[$point1Index,$point2Index]; //create a new rectangle
     }
 }

//now that we have rectangles and coords
//try and put a third point into each
$tests=array();
foreach ($rectangles as $rectangle) {
    $pointA=$rectangle[0];    // points of the rectangle
    $pointB=$rectangle[1];    // __________"____________
    $xA=$coords[$pointA][0];
    $yA=$coords[$pointA][1];
    $xB=$coords[$pointB][0];
    $yB=$coords[$pointB][1];
    $minX=($xA<$xB)?$xA:$xB;
    $minY=($yA<$yB)?$yA:$yB;
    $maxX=($xA>$xB)?$xA:$xB;
    $maxY=($yA>$yB)?$yA:$yB;

    $arborally=false;
    foreach ($coords as $point) {
        $x=$point[0];
        $y=$point[1];
        if ($x>=$minX &&
            $x<=$maxX &&
            $y>=$minY &&
            $y<=$maxY) {
                $arborally=($x==$xA&&$y==$yA) || ($x==$xB&&$y==$yB)?0:1; //same point (pointA or pointB)
        }     
        if ($arborally==true) break;//1 found, check next rectangle
    }
    if ($arborally==true) $tests[]=1;//array of successes

}

echo count($tests)==count($rectangles)?1:0; //if as many successes than rectangles...

?>

1

সি, 289 বাইট

a[99][99],x,X,y,Y,z,Z,i,c;main(k){for(;x=getchar(),x+1;x-10||(y=0,i++))a[y++][i]=x;for(;X<i;X++)for(x=0;a[x][X]-10;x++)for(Y=X+1;Y<i;Y++)for(y=0;a[y][Y]-10;y++)if(x-y&&!(a[x][X]-79||a[y][Y]-79)){c=0;for(Z=X;Z<=Y;Z++)for(z=x<y?x:y;z<=(x>y?x:y);)a[z++][Z]-79||c++;c-2||(k=0);}putchar(k+48);}

ট্রেলিং নিউলাইন প্রয়োজন, যা অনুমোদিত (নতুন লাইন ছাড়া কোডটি দুটি বাইট বৃহত্তর হবে)। আউটপুট 0 (আরবোরিয়ালি সন্তুষ্ট নয়) বা 1 (আরবোরিটি সন্তুষ্ট)।

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