ระบุชุดจุดที่พึงพอใจใน Arborally


14

ชุดจุดพอใจ arborallyเป็นชุด 2D ของจุดดังกล่าวว่าสำหรับรูปสี่เหลี่ยมผืนผ้าแกนชิดใด ๆ ที่สามารถเกิดขึ้นโดยใช้สองจุดในชุดที่เป็นมุมตรงข้ามสี่เหลี่ยมที่มีหรือสัมผัสอย่างน้อยหนึ่งจุดอื่น ๆ นี่คือคำจำกัดความที่เทียบเท่าจาก Wikipedia:

จุดที่ตั้งไว้ว่ามีความพึงพอใจใน Arborally ถ้าทรัพย์สินดังต่อไปนี้: สำหรับคู่ใด ๆ ที่ไม่ได้อยู่บนเส้นแนวนอนหรือแนวตั้งเดียวกันมีจุดที่สามซึ่งอยู่ในรูปสี่เหลี่ยมผืนผ้าทอดสองจุดแรก ( ภายในหรือบนขอบเขต)

ภาพต่อไปนี้แสดงให้เห็นถึงวิธีการสร้างรูปสี่เหลี่ยมผืนผ้า ชุดจุดนี้ไม่ได้รับความพึงพอใจจาก Arborally เนื่องจากสี่เหลี่ยมผืนผ้านี้ต้องมีจุดอย่างน้อยหนึ่งจุด

ป้อนคำอธิบายรูปภาพที่นี่

ใน ASCII art ชุดจุดนี้สามารถแสดงเป็น:

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

การปรับเปลี่ยนเล็กน้อยสามารถทำให้สิ่งนี้น่าพึงพอใจทาง Arborally:

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

ด้านบนคุณจะเห็นว่ารูปสี่เหลี่ยมผืนผ้าทั้งหมด (ซึ่งมีเพียงหนึ่งรูป) มีจุดอย่างน้อยสามจุด

นี่คืออีกตัวอย่างหนึ่งของชุดจุดที่ซับซ้อนมากขึ้นซึ่งเป็นที่พอใจของ Arborally:

ป้อนคำอธิบายรูปภาพที่นี่

สำหรับสี่เหลี่ยมใด ๆ ที่สามารถวาดซึ่งประกอบไปด้วยสองจุดสี่เหลี่ยมนั้นจะมีจุดอื่นอย่างน้อยหนึ่งจุด

ความท้าทาย

กำหนดตารางสี่เหลี่ยมของจุด (ซึ่งผมแทนด้วยO) และพื้นที่ว่างเปล่า (ซึ่งผมแทนด้วย.) เอาท์พุทtruthyค่าถ้ามันเป็นที่พอใจ arborally หรือfalseyค่าถ้ามันไม่ได้ นี่คือรหัสกอล์ฟ

กฎเพิ่มเติม:

  • คุณสามารถเลือกที่จะมีตัวอักษรOและ.สลับกับอักขระ ASCII ที่พิมพ์ได้คู่อื่น ๆ เพียงระบุการแมปอักขระที่โปรแกรมของคุณใช้
  • ตารางจะเป็นรูปสี่เหลี่ยมผืนผ้าเสมอ บรรทัดใหม่ต่อท้ายที่ได้รับอนุญาต

ตัวอย่างเพิ่มเติม

พอใจกับ Arborally:

.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

ไม่พอใจ Arborally:

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

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

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

1
ดังนั้นเราไม่ได้รับอนุญาตให้รับอินพุตเป็นรายการพิกัดแทนที่จะเป็น ASCII? หากฉันไม่สามารถรับอินพุตเป็นรายการ 2 มิติของจำนวนเต็ม (0 และ 1) เพื่อแทนค่าจุดได้?
Denker

กริดสามารถมีพื้นที่ 0 ได้หรือไม่
feersum

คำตอบ:


7

หอยทาก , 29 30 39ไบต์

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

มันทำงานได้โดยการติดตามออกไป 2 ด้านของสี่เหลี่ยมแล้วตรวจสอบว่ามีสี่เหลี่ยมบางอันที่มี O เช่นนั้นหรือไม่ซึ่งการเดินทางเป็นเส้นตรงจากสี่เหลี่ยมจัตุรัสใน 2 ทิศทางของคาร์ดินัลจะส่งผลให้เกิดการชนด้านข้างของสี่เหลี่ยม

พิมพ์สูงสุด 1 และพื้นที่ของกริดถ้าอินพุตเป็น "พอใจ arborally"; มิฉะนั้น 0


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 คือความกว้างของกริด

ส่งคืนไม่มีบรรทัดที่เป็นความจริงส่งคืนสี่เหลี่ยมที่ไม่ตรงกับเกณฑ์ที่เป็นเท็จ

ยกเลิกแข็งแรงเล่นกอล์ฟ

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>*

นี้ใช้แถวถ่าน 2D เป็น input ;กับแถวแยกจากกันโดย ดังนั้นตัวอย่างแรกคือ

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

กรณีทดสอบที่เหลือในรูปแบบนี้มีดังนี้

  • พอใจกับ Arborally:

    ['.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']
    
  • ไม่พอใจ arborally:

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

ลองออนไลน์! นอกจากนี้คุณยังสามารถตรวจสอบกรณีทดสอบทั้งหมดในครั้งเดียว

คำอธิบาย

รหัสแรกจะได้รับพิกัดของตัวละครOในอินพุต จากนั้นใช้ลูปซ้อนกันสองวง ลูปด้านนอกเลือกแต่ละจุด P (2-tuple ของพิกัด) เปรียบเทียบกับทุกจุดและเก็บคะแนนที่แตกต่างจาก P ในสองพิกัด จุดเหล่านี้เป็นจุดที่มากกว่าที่สามารถสร้างเป็นรูปสี่เหลี่ยมผืนผ้าได้ด้วย P. เรียกพวกเขาว่าตั้งค่า R

วงด้านในเลือกแต่ละจุด T จาก R และตรวจสอบว่าสี่เหลี่ยมที่กำหนดโดย P และ T มีอย่างน้อย 3 คะแนน ในการทำเช่นนั้นมันจะลบ P ออกจากทุกจุด นั่นคือย้ายจุดเริ่มต้นของพิกัดไปที่จุด A จุดหนึ่งในสี่เหลี่ยมถ้าแต่ละพิกัดของมันหารด้วยพิกัดที่สอดคล้องกันของ 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

ฉันชอบ Don Muesli มากกว่าทำไมคุณถึงเปลี่ยนกลับ :(
Denker

@DenkerAffe :-) ดีฉันกลับไปที่ชื่อจริงของฉัน คนอื่นสนุก แต่ก็ตั้งใจไว้ชั่วคราว
หลุยส์เมนโด

1
นี่ไม่ใช่คนในชีวิตจริงเราต้องการความสนุกสนานที่นี่มากขึ้น! :)
Denker

@DenkerAffe ฉันอาจกลับไปใช้ชื่อนั้นหรือคนอื่น ๆ ในอนาคต Denim Soul เป็นอย่างไร? :-D
Luis Mendo

1
... และคุณต้องรอ 30 วันด้วย (ฉันคิดว่า)
Stewie Griffin

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

C, 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 (ไม่พอใจใน Arborally) หรือ 1 (พอใจใน Arborally)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.