पहले से संतुष्ट बिंदु सेट की पहचान करें


14

एक समतुल्य रूप से संतुष्ट बिंदु सेट बिंदुओं का 2 डी सेट है, जो किसी भी अक्ष-संरेखित आयत के लिए, जो सेट में दो बिंदुओं को विपरीत कोनों के रूप में उपयोग करके बनाया जा सकता है, उस आयत में कम से कम एक अन्य बिंदु होता है या छूता है। यहाँ विकिपीडिया से एक समान परिभाषा दी गई है:

एक बिंदु सेट को कहा जाता है कि अगर संपत्ति निम्नलिखित में से किसी एक में हो, तो वह संतुष्ट हो जाता है: किसी भी जोड़ी के लिए, जो दोनों एक ही क्षैतिज या ऊर्ध्वाधर रेखा पर नहीं होती हैं, एक तीसरा बिंदु मौजूद होता है, जो पहले दो बिंदुओं द्वारा फैलाए गए आयत में निहित होता है ( या तो अंदर या सीमा पर)।

निम्न छवि बताती है कि आयतें कैसे बनती हैं। इस बिंदु सेट को पूरी तरह से संतुष्ट नहीं किया गया है क्योंकि इस आयत में कम से कम एक और बिंदु शामिल करने की आवश्यकता है।

यहाँ छवि विवरण दर्ज करें

ASCII कला में, इस बिंदु सेट को इस प्रकार दर्शाया जा सकता है:

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

एक मामूली संशोधन इस तरह से संतुष्ट कर सकता है:

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

ऊपर, आप देख सकते हैं कि सभी आयतें (जिनमें से केवल एक ही है) में कम से कम तीन बिंदु होते हैं।

यहाँ एक और अधिक जटिल बिंदु सेट का एक और उदाहरण दिया गया है जो पूरी तरह से संतुष्ट है:

यहाँ छवि विवरण दर्ज करें

किसी भी आयत के लिए जिसे दो बिंदुओं के बीच खींचा जा सकता है, उस आयत में कम से कम एक अन्य बिंदु होता है।

चुनौती

अंक की एक आयताकार ग्रिड (जो मैं के साथ प्रतिनिधित्व को देखते हुए O) और खाली जगह (जो मैं के साथ प्रतिनिधित्व करते हैं .), उत्पादन एक truthy मूल्य अगर यह arborally संतुष्ट हो जाता है, या एक falsey मूल्य अगर यह नहीं है। यह कोड-गोल्फ है।

अतिरिक्त नियम:

  • आप वर्णों को चुन सकते हैं Oऔर .मुद्रण योग्य ASCII वर्णों की किसी भी अन्य जोड़ी के साथ स्वैप कर सकते हैं । बस निर्दिष्ट करें कि आपका प्रोग्राम किस चरित्र का उपयोग करता है।
  • ग्रिड हमेशा आयताकार होगा। अनुगामी न्यूलाइन स्वीकार्य है।

और ज्यादा उदाहरण

पूरी तरह से संतुष्ट:

.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 के बजाय निर्देशांक की सूची के रूप में इनपुट लेने की अनुमति नहीं है? यदि मैं अंक का प्रतिनिधित्व करने के लिए इंटेगर (0 और 1) की 2 डी सूची के रूप में इनपुट नहीं ले सकता हूं?
डेनकर

क्या ग्रिड में 0 क्षेत्र हो सकता है?
फ़ेरसम

जवाबों:


7

घोंघे , 29 30 39 बाइट्स

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

यह आयत के 2 किनारों को ट्रेस करके काम करता है, और फिर जाँचता है कि क्या कुछ O वाला वर्ग है जैसे कि कार्डिनल दिशाओं के 2 में वर्ग से एक सीधी रेखा में यात्रा करने से आयत का एक पक्ष टकराने के परिणामस्वरूप होगा।

यदि इनपुट "समीपस्थ रूप से संतुष्ट" है तो अधिकतम 1 और ग्रिड का क्षेत्रफल प्रिंट करता है; अन्यथा ०।


3

Oracle SQL 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));

दृश्य v प्रत्येक O बिंदु के निर्देशांक की गणना करता है।
माइनस का पहला भाग सभी आयतों को लौटाता है, जहाँ क्लॉज यह सुनिश्चित करता है कि एक बिंदु को अपने साथ जोड़ा नहीं जा सकता है।
प्रत्येक आयत में तीसरे भाग के लिए दूसरा भाग खोजता है। उस बिंदु का एक समन्वय, x या y होना आवश्यक है, आयत को परिभाषित करने वाले दो बिंदुओं में से एक के लिए उस समन्वय के बराबर है। आयत को परिभाषित करने वाले प्रत्येक बिंदु के लिए उस तीसरे बिंदु के अन्य समन्वय को उस सीमा से घिरा होना चाहिए।
जहां खंड का अंतिम भाग यह बताता है कि तीसरा बिंदु आयत को परिभाषित करने वाले दो बिंदुओं में से एक नहीं है।
यदि सभी आयतों में कम से कम तीसरा बिंदु है तो माइनस का पहला भाग दूसरे भाग के बराबर है और क्वेरी कुछ भी नहीं देता है।


2

MATL , 38 बाइट्स

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

यह इनपुट के रूप में एक 2 डी चार सरणी का उपयोग करता है, पंक्तियों द्वारा अलग किया जाता है ;। तो पहला उदाहरण है

['......';'....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इनपुट में वर्णों के निर्देशांक मिलते हैं । यह तब दो नेस्टेड छोरों का उपयोग करता है। बाहरी लूप प्रत्येक बिंदु P (इसके निर्देशांक का 2-टपल) को चुनता है, सभी बिंदुओं के साथ तुलना करता है, और उन बिंदुओं को रखता है जो P से दो निर्देशांक में भिन्न होते हैं। उन बिंदुओं की तुलना में पी के साथ एक आयत बना सकते हैं। उन्हें आर सेट करें।

आंतरिक लूप R से प्रत्येक बिंदु T को चुनता है, और जाँचता है कि P और T द्वारा परिभाषित आयत में कम से कम 3 बिंदु शामिल हैं। ऐसा करने के लिए, यह सभी बिंदुओं से पी को घटाता है; यह है कि निर्देशांक की उत्पत्ति को पी। में ले जाता है। एक बिंदु आयत में है, यदि इसके प्रत्येक निर्देशांक को T के इसी समन्वय से विभाजित किया गया है, तो यह बंद अंतराल [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

मुझे डॉन मूसली अधिक पसंद आया, आपने इसे वापस क्यों बदल दिया? :(
डेंकर

@DenkerAffe :-) खैर, मैं अपने असली नाम पर वापस आ गया। दूसरा मज़ेदार था, लेकिन इसका इरादा अस्थायी था
लुइस मेंडो

1
यह वास्तविक जीवन का आदमी नहीं है, हमें यहाँ कुछ और मजेदार चाहिए! :)
डेन्कर

@DenkerAffe मैं भविष्य में उस नाम पर वापस जा सकता हूं, या किसी अन्य के लिए। डेनिम सोल के बारे में कैसे? :
लुइस मेंडो

1
... और आपको 30 दिन भी इंतजार करना होगा (मुझे लगता है)
स्टिव ग्रिफ़िन

2

PHP, 1123 बाइट्स , 851 बाइट्स , 657 बाइट्स

(नौसिखिया php)

<?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 (आर्बरली संतुष्ट)।

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