2 ডি অ্যারের বৃহত্তম আয়তক্ষেত্র


26

ইনপুট

বোর্ড: একটি 2 ডি ধারক (ম্যাট্রিক্স, তালিকার তালিকা ইত্যাদি) এর মতো অক্ষরের:

  ["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' অন (1,0) এছাড়াও (4,0) এছাড়াও (1,3) এবং (4,3) এ দেখতে পারেন তবে আপনার আয়তক্ষেত্র রয়েছে [1,0,4,3] যার অর্থ (1,0) থেকে (4,3):

এক্স সহ নমুনা বোর্ড :

  ["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)
  • যদি একই সর্বোচ্চ অঞ্চল সহ একাধিক আয়তক্ষেত্র থাকে তবে যে কোনও একটিকে আউটপুট দিন। Topচ্ছিকভাবে এক (শীর্ষ স্থানাঙ্ক, বাম স্থানাঙ্ক, ডান স্থানাঙ্ক, নীচের স্থানাঙ্ক) অভিধানিকল্পিতভাবে ক্ষুদ্রতম।
  • আয়তক্ষেত্রগুলির অবশ্যই বোর্ডের প্রান্তের সমান্তরাল প্রান্ত থাকা উচিত।
  • প্রতিটি বর্ণ হ'ল A থেকে Z পর্যন্ত মুদ্রণযোগ্য ASCII চর (উভয়ই অন্তর্ভুক্ত)।

আউটপুট

আউটপুটটি বৃহত্তম আয়তক্ষেত্র কোণগুলির বাম-আপ এবং ডান-ডাউন অবস্থানের হওয়া উচিত। প্রথম নমুনা "বোর্ড" এর জন্য বড় স্কোয়ার হলুদ রঙের:

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

এবং উত্তরটি হওয়া উচিত:

[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]

এই প্রশ্নটি শিরোনাম সহ স্ট্যাক ওভারফ্লোতে পোস্ট করা হয়েছে: চারটি অভিন্ন কোণ দ্বারা গঠিত 2 ডি অ্যারের বৃহত্তম আয়তক্ষেত্রটি কীভাবে খুঁজে পাবেন? এবং এই অভদ্র জেএস সমাধানের সাথে (আমি "অভদ্র" বলতে পারি কারণ এটি আমার কোড;):

ঠিক আছে, এটি আমার প্রথম পোস্ট, দয়া করে আমার সাথে সহনশীল হোন। কুইজের উন্নতি করতে আপনি যা বলেছিলেন তা আমি পরিবর্তন করব।


7
হাই, পিপিসিজিতে আপনাকে স্বাগতম! এটি একটি ভাল চ্যালেঞ্জ বলে মনে হচ্ছে তবে মনে হয় কোনও বিজয়ী মানদণ্ডের অভাব রয়েছে। সাধারণত, এখানে পোস্টগুলিকে ট্যাগ করা হয় [কোড-গল্ফ], যার অর্থ হ'ল সংক্ষিপ্ততম কোড (বাইটে) জিতেছে।
কনর ওব্রায়ান

1
আমি ভেবেছিলাম যে আমি আপনাকে জানাব যে আমাদের কাছে একটি স্যান্ডবক্স রয়েছে যা আপনি মূল সাইটে পোস্ট করার আগে প্রশ্নগুলির প্রতিক্রিয়া জানাতে পারেন। স্যান্ডবক্সটি এখানে বেশিরভাগের জন্য তবে বিশেষত নবজাতকদের জন্য দরকারী যারা আমাদের সমস্ত নিয়ম এবং প্রত্যাশা জানেন না।
গম উইজার্ড

2
কিছু উত্তর আপনার উদাহরণগুলিতে যেমন দেখানো হয়েছে (বাম, উপরের, ডান, নীচে) এর পরিবর্তে "প্রথম" আয়তক্ষেত্রের (যেমন উপরে, বাম, নীচে, ডান) সাজানোর স্থানাঙ্কগুলিকে আউটপুট দেয়। এটা কি ঠিক আছে?
নিমি

2
কম কঠোর আউটপুট ফর্ম্যাটগুলি সাধারণত আরও উত্তরকে উত্সাহ দেয়, তাই এর মতো কিছুও ঠিক ((left,top),(right,bottom))হওয়া উচিত। আমি আমার উত্তর এবং উত্তর মুছে ফেলা যখন প্রশ্ন সম্পূর্ণ পরিমার্জন করা হয়।
অ্যাঙ্গস

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

উত্তর:


6

পাইথন 2 , 148 130 বাইট

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) যেমন অ্যাঙ্গস প্রস্তাব করেছিল?
দানিহপ

আমি আরও উত্তর উত্সাহিত করতে কিছু নিয়ম শিথিল করতে চাই। আমি কি পারি?
দানিহপ

@ ডানিহপ এগিয়ে যান hisএটি আমার উত্তরকে বাতিল করে দেয় না, তাই না?
ovs

না, আপনার উত্তর ঠিক আছে! খুশী হলাম।
দানিহপ

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 বাইট সংরক্ষিত কারণ ট্রেলিংটির সাথে )মিল $.(রয়েছে licit ব্যাখ্যা:

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 বাইটের দাম পড়তে হবে এবং আমি একক-অঙ্কের ভেরিয়েবলের বাইরে চলে এসেছি)। প্রথম চারটি ক্যাপচার অগ্রাধিকারের ক্রম অনুসারে বাছাই করুন order রেটিনা যেমন স্টাইলে বাছাই করে, প্রতিটি ধরণের কলাম অনুসারে সর্বাধিক থেকে সর্বোচ্চ অগ্রাধিকার পর্যন্ত বাছাই করে একটি বহুবিধ সাজানো যায়। (অঞ্চলটি অবশ্যই নিম্নোক্ত ক্রমে বাছাই করা উচিত, সুতরাং একটি একক স্ট্রিং বাছাই করা যাবে না))

4{N`

চারটি সংখ্যক প্রকারের পরে সঞ্চালিত হয়।

)m`^.*?,

এর পরে সাজানোর কলামটি প্রতিটি সাজানোর পরে মুছে ফেলা হয়।

0G`

প্রথম এন্ট্রি এখন কাঙ্ক্ষিত ফলাফল is

দ্রষ্টব্য: প্রদত্ত অঞ্চলের আয়তক্ষেত্রের পছন্দের উপর থেকে বিধিনিষেধটি শিথিল করা হয়েছে এবং নিম্নলিখিত 144 143-বাইট সংস্করণটি লম্বা আয়তক্ষেত্রের চেয়ে আরও বিস্তৃত পছন্দ করে:

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

এটি অনলাইন চেষ্টা করুন!


লিকক্সোগ্রাফিক্যাল-মিনিট প্রয়োজনীয়তা ব্যর্থ করে (উদাহরণস্বরূপ আমি ওপিতে টেস্টের কেসটি চেষ্টা করেছি) (সম্ভবত আউটপুটটিও ভুল ক্রমে হতে পারে ??) টিআইও
জোনাথন অ্যালান

(... হ্যাঁ, আউটপুটে প্রথম দুটি মানই আমার মনে হয় ভুল পথে)
জোনাথন অ্যালান

আমি সবেমাত্র কিছু বিধিনিষেধ শিথিল করেছি (অভিধানে-মিনি প্রয়োজনীয়তা) আমি আশা করি আপনার সমস্যা হবে না।
দানিহপ

... এটির জন্য এখন লাইন এবং পয়েন্টগুলি মিলিয়ে নেওয়া দরকার।
জোনাথন অ্যালান

20 বাইট স্থির আভিধানিক অর্ডার খরচ :-( এবং আমি যে এলাকায় হিসাব পরিবর্তিত, যা অন্য 2 বাইট খরচ খেয়াল, কিন্তু আমি জানি না কি পয়েন্ট সম্পর্কে উপায়ে @JonathanAllan।
নিল

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

পার্ল 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

হাস্কেল , 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
গম উইজার্ড

@ ওগো আসলে যে কোনও কাজ করবে না (উদাহরণটি আমি টিআইও যোগ করেছি )
জনাথন অ্যালান

@ নিমিমি: আমি যুক্তি দিতে পারি যে এটি কেবল ইনপুট স্থানান্তরের বিষয়।
অ্যাঙ্গস

আমার জন্য ঠিক আছে. আপনি ইনপুট স্থানান্তর করতে পারেন।
দানিহপ


3

জাভাস্ক্রিপ্ট (ES6), 121 বাইট

নতুন আয়তক্ষেত্রের স্কোরিং নিয়ম মেনে চলার জন্য @ 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 এটি এখন সত্যই নিরাপদ। ধন্যবাদ!
আর্নউল্ড


1

জাভা 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 বাইটসকে ধন্যবাদ সিলিংক্যাটটি সারি এবং কলামগুলির অভ্যন্তরীণ লুপগুলি একক লুপের সাথে সংযুক্ত করে।

ব্যাখ্যা:

এটি অনলাইনে চেষ্টা করুন।

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.