สี่เหลี่ยมที่ใหญ่ที่สุดในอาร์เรย์ 2d


26

อินพุต

บอร์ด: คอนเทนเนอร์ 2D (เมทริกซ์, รายการลิสต์, ฯลฯ ) ของตัวอักษรที่ชอบ:

  ["B", "C", "C", "C", "C", "B", "B", "C", "A", "A"],
  ["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
  ["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
  ["B", "B", "B", "A", "C", "B", "A", "C", "B", "A"],
  ["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
  ["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
  ["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]

หากคุณเลือกรายการของรายการคุณอาจคิดว่ารายการย่อยทั้งหมดมีความยาวเท่ากัน

กฎระเบียบ

  • ในการสร้างสี่เหลี่ยมที่ถูกต้องคุณต้องใช้มุมสี่เหลี่ยมทั้งหมดด้วยตัวอักษรเดียวกัน
  • ตัวอย่างดูกระดานตัวอย่างด้วย Xร้อง คุณสามารถดู 'X' บน (1,0) เช่นกันใน (4,0) และ (1,3) และ (4,3) จากนั้นคุณมีรูปสี่เหลี่ยมผืนผ้า [1,0,4,3] ซึ่งหมายความว่าจาก (1,0) ถึง (4,3):

บอร์ดตัวอย่างด้วย X :

  ["B", "X", "C", "C", "X", "B", "B", "C", "A", "A"],
  ["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
  ["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
  ["B", "X", "B", "A", "X", "B", "A", "C", "B", "A"],
  ["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
  ["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
  ["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
  • เป้าหมายคือการหาสี่เหลี่ยมหรือหนึ่งในสี่เหลี่ยมที่มีพื้นที่ใหญ่ที่สุดซึ่งคำนวณโดย (ซ้ายขวา + 1) * (ล่างสุด + 1)
  • หากมีหลายรูปสี่เหลี่ยมผืนผ้าที่มีพื้นที่สูงสุดเท่ากันเอาท์พุทใด ๆ เป็นทางเลือกหนึ่งที่มี (พิกัดสูงสุด, พิกัดซ้าย, พิกัดขวา, พิกัดด้านล่าง) มีขนาดเล็กที่สุดในพจนานุกรม
  • สี่เหลี่ยมจะต้องมีขอบขนานกับขอบของบอร์ด
  • ตัวอักษรแต่ละตัวเป็นอักขระ ASCII ที่พิมพ์ได้จาก A ถึง Z (รวมอยู่ด้วย)

เอาท์พุต

ผลลัพธ์ควรเป็นตำแหน่งซ้ายและขึ้น - ลงของมุมสี่เหลี่ยมที่ใหญ่ที่สุด สำหรับตัวอย่างแรก "บอร์ด" สี่เหลี่ยมขนาดใหญ่เป็นสีเหลือง:

enter image description here

และคำตอบควรเป็น:

[1, 1, 8, 4]

กรณีทดสอบตัวอย่างที่สอง

อินพุตของ:

["C", "D", "D", "D", "A", "A"],
["B", "D", "C", "D", "A", "A"],
["B", "D", "D", "C", "A", "C"],
["B", "D", "B", "C", "A", "C"]

ควรให้หนึ่งในสามรายการพิกัดที่ระบุพื้นที่หกสี่เหลี่ยม

[1, 0, 2, 2]
[1, 0, 3, 1]
[3, 2, 5, 3]

คำถามนี้ถูกโพสต์ไว้ใน Stack Overflow ด้วยหัวเรื่อง: วิธีค้นหาสี่เหลี่ยมที่ใหญ่ที่สุดในอาร์เรย์ 2D ที่เกิดขึ้นจากมุมที่เหมือนกันสี่มุม และด้วยวิธีการแก้ปัญหา JS หยาบคาย (ฉันสามารถพูดว่า "หยาบคาย" เพราะเป็นรหัสของฉัน;):

ตกลงเป็นโพสต์แรกของฉันได้โปรดอดทนกับฉัน ฉันจะเปลี่ยนสิ่งที่คุณพูดเพื่อปรับปรุงแบบทดสอบ


7
สวัสดียินดีต้อนรับสู่ PPCG! นี่ดูเหมือนจะเป็นความท้าทายที่ดี แต่ดูเหมือนว่าจะไม่มีเกณฑ์การชนะ โดยทั่วไปแล้วการโพสต์ที่นี่จะติดแท็ก [code-golf] ซึ่งหมายความว่ารหัสสั้นที่สุด (เป็นไบต์) ชนะ
Conor O'Brien

1
ฉันคิดว่าฉันจะแจ้งให้คุณทราบว่าเรามีกล่องทรายที่คุณสามารถใช้เพื่อรับข้อเสนอแนะเกี่ยวกับคำถามก่อนที่พวกเขาจะโพสต์ในเว็บไซต์หลัก กล่องทรายมีประโยชน์มากสำหรับทุกคนที่นี่ แต่โดยเฉพาะกับมือใหม่ที่อาจไม่รู้กฎและความคาดหวังทั้งหมดที่เรามี
ข้าวสาลีตัวช่วยสร้าง

2
คำตอบบางคำสั่งให้พิกัดในการเรียงลำดับสำหรับสี่เหลี่ยม "แรก" (เช่นบน, ซ้าย, ล่าง, ขวา) แทน (ซ้าย, บน, ขวา, ล่าง) ตามที่เห็นในตัวอย่างของคุณ ตกลงไหม
nimi

2
รูปแบบเอาต์พุตที่เข้มงวดน้อยกว่ามักจะสนับสนุนคำตอบเพิ่มเติมดังนั้นสิ่งที่((left,top),(right,bottom))ควรทำก็ดี ฉันลบคำตอบและตอบอีกครั้งเมื่อคำถามได้รับการขัดเกลาอย่างสมบูรณ์
อัง

1
แน่นอนว่าถ้าคุณจะตอบรับมันควรจะเป็นภาพรวมที่สั้นที่สุดนี่คือสิ่งที่คนส่วนใหญ่ชอบทำในเว็บไซต์ อย่างไรก็ตามไม่มีผลที่จะไม่ทำเช่นนั้น นอกจากนี้ยังมีความคิดเห็นที่เพิ่มขึ้นว่าการยอมรับคำตอบเป็นอันตรายต่อเว็บไซต์ ฉันเป็นความเห็นนั้นและดังนั้นฉันจึงไม่เคยยอมรับคำตอบสำหรับความท้าทายของฉัน สิ่งที่คุณทำขึ้นอยู่กับคุณ
ข้าวสาลีตัวช่วยสร้าง

คำตอบ:


6

Python 2 , 148 130 bytes

lambda x,e=enumerate:min(((a-c)*(d-b),b,a,d,c)for a,y in e(x)for c,k in e(x)for b,g in e(y)for d,h in e(y)if g==h==k[b]==k[d])[1:]

ลองออนไลน์!


สวัสดี @ovs มีไว้สำหรับคุณและไม่สะดวกถ้าฉันเปลี่ยนกฎเพื่อคำนวณพื้นที่เป็น: (x2-x1 + 1) × (y2-y1 + 1) ตามที่ Angs แนะนำหรือไม่
danihp

ฉันต้องการผ่อนคลายกฎบางอย่างเพื่อส่งเสริมคำตอบเพิ่มเติม ให้ฉัน?
danihp

@danihp ไปข้างหน้าคำตอบของฉันไม่ถูกต้องใช่มั้ย
ovs

ไม่คำตอบของคุณถูกต้อง! ดี
danihp

5

เรติน่า163 162 ไบต์

Lw$`(?<=(.*\n)*((.)*))(?=(.))((.)*(?<=(.*))\4)((.*\n)*((?>(?<-3>.)*)(?=\4)(?>(?<-6>.)*))\4)?
$.7,$#1,$.2,-$.($5$#9*$5),$.2,$#1,$.7,$.($#1*_$#9*
4{N`
)m`^.*?,

0G`

ลองออนไลน์! แก้ไข: บันทึก 1 ไบต์เนื่องจากการ)จับคู่ส่วนท้าย$.(เป็นนัย คำอธิบาย:

Lw$`(?<=(.*\n)*((.)*))(?=(.))((.)*(?<=(.*))\4)((.*\n)*((?>(?<-3>.)*)(?=\4)(?>(?<-6>.)*))\4)?

การแสดงออกปกตินี้ตรงกับสี่เหลี่ยม กลุ่มมีดังนี้: 1) แถวบนสุด (ตามจำนวนการดักจับ) 2) คอลัมน์ด้านซ้าย (ตามความยาว) 3) สมดุลเพื่อให้แน่ใจว่ามุมซ้ายจัด 4) ตัวอักษรสำหรับมุม 5) ความกว้าง + 1 (ตามความยาว) 6) เพื่อให้แน่ใจว่ามุมที่ถูกต้องสอดคล้อง 7) คอลัมน์ด้านขวา (ตามความยาว) 8) ไม่ได้ใช้งาน 9) ความสูง (ตามจำนวนการจับ) wมั่นใจในตัวเลือกที่เป็นไปได้ทั้งหมดความกว้างของรูปสี่เหลี่ยมมีการจับคู่ด้านบนได้รับในแต่ละมุมซ้าย $ตัวเลือกการแสดงผลลัพธ์โดยใช้รูปแบบการแทนต่อไป

$.7,$#1,$.2,-$.($5$#9*$5),$.2,$#1,$.7,$.($#1*_$#9*

การทดแทนมีดังนี้: คอลัมน์ด้านขวา, แถวบนสุด, คอลัมน์ด้านซ้าย, การปฏิเสธของพื้นที่ของรูปสี่เหลี่ยมผืนผ้า (คำนวณตามความยาวของการทำซ้ำสตริงความกว้างโดยมากกว่าความสูงหนึ่งครั้ง), คอลัมน์ด้านซ้าย , แถวบนสุด, คอลัมน์ขวา, ตามด้วยนิพจน์ที่ประเมินไปยังแถวล่าง (การดักจับจะมีราคา 12 ไบต์บวกกับตัวแปรดิจิตัลหมด) สี่การจับภาพแรกแสดงลำดับการจัดเรียงตามลำดับความสำคัญ ในฐานะที่เป็น Retina เรียงลำดับเสถียรเรียงลำดับหลายคอลัมน์สามารถสร้างขึ้นได้โดยการเรียงลำดับตามคอลัมน์เรียงลำดับแต่ละลำดับจากน้อยไปมาก (พื้นที่จะต้องเรียงลำดับจากมากไปน้อยดังนั้นจึงไม่สามารถใช้การเรียงสตริงเดี่ยวได้)

4{N`

จะทำการเรียงลำดับตัวเลขสี่แบบ

)m`^.*?,

คอลัมน์การเรียงลำดับจะถูกลบหลังจากการจัดเรียงแต่ละครั้ง

0G`

รายการแรกจึงเป็นผลลัพธ์ที่ต้องการในขณะนี้

หมายเหตุ: ข้อ จำกัด ในการเลือกรูปสี่เหลี่ยมผืนผ้าของพื้นที่ที่กำหนดได้ถูกผ่อนคลายและรุ่น144 143 ไบต์ต่อไปนี้ชอบที่กว้างกว่าแทนที่จะเป็นสี่เหลี่ยมผืนผ้าที่สูงขึ้น:

Lw$`(?<=(.*\n)*((.)*))(?=(.))((.)*(?<=(.*))\4)((.*\n)*((?>(?<-3>.)*)(?=\4)(?>(?<-6>.)*))\4)?
-$.($5$#9*$5);$.2,$#1,$.7,$.($#1*_$#9*
N`
0G`
.*;

ลองออนไลน์!


ข้อกำหนด lexicographical-min ล้มเหลว (ลองใช้กรณีทดสอบที่ฉันเพิ่มลงใน OP) (อาจเป็นไปได้ว่าเอาต์พุตผิดปกติหรือไม่?) TIO
Jonathan Allan

(... ใช่สองค่าแรกในการส่งออกเป็นวิธีที่ผิดรอบฉันคิดว่า)
Jonathan Allan

ฉันเพิ่งผ่อนคลายข้อ จำกัด บางอย่าง (ข้อกำหนดเกี่ยวกับคำย่อ - นาที) ฉันหวังว่าจะไม่เป็นปัญหาสำหรับคุณ
danihp

... สิ่งนี้จะต้องตรงกับเส้นและคะแนน
Jonathan Allan

การแก้ไขคำสั่งทางพจนานุกรมค่าใช้จ่าย 20 ไบต์ :-( และฉันสังเกตเห็นว่าการคำนวณพื้นที่เปลี่ยนไปซึ่งมีค่าใช้จ่ายอีก 2 ไบต์ แต่ฉันไม่รู้ว่า @JonathanAllan มีความหมายอย่างไรกับคะแนน
Neil

4

เยลลี่ , (27?)  29  28 ไบต์

27 ถ้าอนุญาตให้สร้างดัชนีแบบ 1 ได้ - ลบส่วนท้าย

Fṙ1s2;Uœị³EaZI‘P
ZLpLŒċÇÞṪF’

โปรแกรมเต็มรูปแบบ

ลองออนไลน์! (หรือดูกรณีทดสอบอื่น ๆ)

อย่างไร?

Fṙ1s2;Uœị³EaZI‘P - Link 1, areaOrZero: list of pairs [[b,l],[t,r]]
F                - flatten the input                 [b,l,t,r]
 ṙ1              - rotate left one                   [l,t,r,b]
   s2            - split into twos                   [[l,t],[r,b]]
      U          - upend the input                   [[l,b],[r,t]]
     ;           - concatenate                       [[l,t],[r,b],[l,b],[r,t]]
         ³       - program's input
       œị        - multidimensional index into
          E      - all equal?                       X
            Z    - transpose the input              [[b,t],[l,r]]
           a     - logical AND (vectorises)         (if not X we now have [[0,0],[0,0]]
             I   - incremental differences          [t-b,r-l] (or [0,0] if not X)
              ‘  - increment (vectorises)           [t-b+1,r-l+1] (or [1,1] if not X)
               P - product                          area (or 1 if not X)

ZLpLŒċÇÞṪF’ - Main link: list of lists
Z           - transpose the input
 L          - length
   L        - length of the input
  p         - Cartesian product
    Œċ      - pairs with replacement
       Þ    - (stable) sort by:
      Ç     -   last link (1) as a monad
        Ṫ   - tail (note that the rightmost pre-sort represents the bottom-right 1x1
            -       so cannot be superseded by a non-matching rectangle)
         F  - flatten
          ’ - decrement (vectorises) (to get to 0-based indexing)

4

Perl 6 , 83 73 ไบต์

{([X] (^$^a[0]X ^$a)xx 2).max:{[eq] $a[.[*;1];.[*;0]]and[*] 1 X-[Z-] $_}}

ลองออนไลน์!

((x0 y0) (x1 y1))กลับรายการของแสดงรายการ

คำอธิบาย

{
  ([X]                   # Cross product of corner pairs.
    (^$^a[0]             # Range of x coords.
     X                   # Cross product of coords.
     ^$a                 # Range of y coords.
    )xx 2                # Duplicate list.
  ).max:                 # Find maximum of all ((x0 y0) (x1 y1)) lists
  {                      # using the following filter.
    [eq]                 # All letters equal?
      $a[.[*;1];.[*;0]]  # Multidimensional subscript with y and x coord pairs.
    and                  # Stop if false.
    [*]                  # Multiply
      1 X-[Z-] $_        # for each axis 1 - (c0 - c1) == c1 - c0 + 1.
  }
}

3

Haskell , 144 ไบต์

import Data.Array
o=assocs
f r=snd$maximum[((c-a+1)*(d-b+1),[a,b,c,d])|((a,b),x)<-o r,((c,d),y)<-o r,x==y,r!(a,d)==r!(c,b),x==r!(a,d),a<=c,b<=d]

ลองออนไลน์!


คุณสามารถลบตราบใดที่คุณให้b<=d a<=c
ข้าวสาลีตัวช่วยสร้าง

@ovs จริง ๆ แล้วก็จะไม่ทำงานเช่นกัน (ดูตัวอย่างที่ฉันเพิ่มTIO )
Jonathan Allan

@nimi: ฉันสามารถโต้แย้งได้ว่าเป็นเพียงเรื่องของการย้ายอินพุต
Angs

มันโอเคสำหรับฉัน. คุณสามารถโอนย้ายอินพุต
danihp


3

JavaScript (ES6), 121 ไบต์

-1 ไบต์ขอบคุณ @ l4m2
-1 ไบต์ขอบคุณ @tsh
+2 ไบต์เพื่อให้สอดคล้องกับกฎการให้คะแนนสี่เหลี่ยมผืนผ้าใหม่

รับอินพุตเป็นเมทริกซ์ของสตริง ผลตอบแทนพิกัด 0 การจัดทำดัชนี: [x0, y0, x1, y1]

a=>a.map(b=(r,y)=>r.map((v,x)=>a.map((R,Y)=>R.map((V,X)=>V+R[x]+r[X]!=v+v+v|(A=(x+~X)*(y+~Y))<b||(o=[x,y,X,Y],b=A)))))&&o

ลองออนไลน์!


a=>a.map(b=(r,y)=>r.map((v,x)=>a.map((R,Y)=>R.map((V,X)=>V+R[x]+r[X]!=v+v+v|(A=(X-x)*(Y-y))<=b||(o=[x,y,X,Y],b=A)))))&&o
l4m2

หากมีหลายรูปสี่เหลี่ยมผืนผ้าที่มีพื้นที่สูงสุดเท่ากันเอาท์พุทหนึ่ง ; อาจจะ(A=...)<=b-> (A=...)<b?
tsh

@tsh ตอนนี้ปลอดภัยแน่นอน ขอบคุณ!
Arnauld


1

Java 8, 208 205 ไบต์

m->{int r=0,R[]={},i=m.length,j,y,z,u,t,T;for(;i-->0;)for(j=m[i].length;j-->0;)for(y=i*j;y-->0;)if((T=m[i][j])==m[u=y/j][z=y%j]&T==m[i][z]&T==m[u][j]&r<(t=(i-u)*(j-z))){r=t;R=new int[]{z,u,j,i};}return R;}

สามารถเล่นกอล์ฟได้แน่นอน .. ตอนนี้ฉันใช้วิธีที่ชัดเจนที่สุดในการใช้ลูปสี่แบบซ้อนกันสามวง

-3 ไบต์ต้องขอบคุณ@ceilingcat ที่รวมลูปด้านในของแถวและคอลัมน์ไว้ในลูปเดียว

คำอธิบาย:

ลองออนไลน์

m->{                         // Method with char-matrix parameter and int-array return-type
  int r=0,                   //  Largest area found, starting at 0
      R[]={},                //  Result coordinates, starting empty
      i=m.length,j,          //  x,y indices of the first corner
      y,z,                   //  x,y indices of the second corner
      u,t,T;                 //  Temp integers to reduce bytes
  for(;i-->0;)               //  Loop `i` over the rows
    for(j=m[i].length;j-->0;)//   Inner loop `j` over the columns
      for(y=i*j;y-->0;)      //    Inner loop over the rows and columns
        if((T=m[i][j])==m[u=y/j][z=y%j]
                             //      If the values at coordinates [i,j] and [y,z] are equal
           &T==m[i][z]       //      as well as the values at [i,j] and [i,z]
           &T==m[u][j]       //      as well as the values at [i,j] and [y,j]
           &r<(t=(i-u)*(j-z))){
                             //      And the current area is larger than the largest
          r=t;               //       Set `r` to this new largest area
          R=new int[]{z,u,j,i};}
                             //       And save the coordinates in `R`
  return R;}                 //  Return the largest rectangle coordinates `R`
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.