সর্বনিম্ন আয়তক্ষেত্রের কভার


23

আয়তক্ষেত্র কভার

ধরুন আপনার কাছে বিটের একটি ম্যাট্রিক্স রয়েছে, উদাহরণস্বরূপ।

1 1 0 0 0 1 1 0
1 1 1 1 0 1 1 1
0 1 1 1 0 1 1 1
1 1 0 1 1 1 1 0
1 1 0 1 1 1 0 1

আমরা এই ম্যাট্রিক্সের জন্য একটি আয়তক্ষেত্রের কভার খুঁজতে চাই । এটি ম্যাট্রিক্সের আয়তক্ষেত্রাকার উপসর্গগুলির একটি সেট যা কোনও 0 টি ধারণ করে না, তবে একসাথে সমস্ত 1s যুক্ত করে। সাবসেটগুলি বিযুক্ত হওয়ার দরকার নেই। উপরের ম্যাট্রিক্সের জন্য একটি আয়তক্ষেত্র কভারের উদাহরণ এখানে is

+----+         +----+
|1  1| 0  0  0 |1  1| 0
|    |         |    |
|  +-|-----+   |    |+-+
|1 |1| 1  1| 0 |1  1||1|
+----+     |   |    || |
   |       |   |    || |
 0 |1  1  1| 0 |1  1||1|
   +-------+   |    |+-+
+----+   +-----|-+  |
|1  1| 0 |1  1 |1| 1| 0
|    |   |     +----+
|    |   |       |   +-+
|1  1| 0 |1  1  1| 0 |1|
+----+   +-------+   +-+

এই প্রচ্ছদে আয়তক্ষেত্রের সংখ্যা 7 টি।

কাজটি

আপনার ইনপুটটি কোনও যুক্তিসঙ্গত বিন্যাসে নেওয়া বিটের আয়তক্ষেত্রাকার ম্যাট্রিক্স। আপনি ধরে নিতে পারেন এটিতে কমপক্ষে একটি রয়েছে Your আপনার আউটপুটটি ম্যাট্রিক্সের একটি আয়তক্ষেত্রের কভারের আয়তক্ষেত্রের সর্বনিম্ন সংখ্যা।

সর্বনিম্ন বাইট গণনা জিতেছে। স্ট্যান্ডার্ড বিধি প্রযোজ্য।

পরীক্ষার মামলা

[[1]] -> 1
[[1,1]] -> 1
[[1],[1]] -> 1
[[1,0,1]] -> 2
[[1,0],[0,0]] -> 1
[[1,0],[0,1]] -> 2
[[1,0],[1,1]] -> 2
[[1,1,1],[1,0,1]] -> 3
[[0,1,0],[1,1,1],[0,1,0]] -> 2
[[1,1,1],[1,0,1],[1,1,1]] -> 4
[[1,1,0],[1,1,1],[0,1,1]] -> 2
[[1,0,1,0],[1,1,1,1],[1,0,1,0]] -> 3
[[1,1,1,0],[1,0,1,0],[1,1,1,1],[0,0,1,0]] -> 4
[[1,1,1,0],[1,0,1,0],[1,1,1,1],[0,0,1,1]] -> 5
[[1,1,1,0],[1,0,1,0],[1,1,1,1],[0,1,1,1]] -> 4
[[1,1,0,0],[1,1,1,0],[0,1,1,1],[0,0,1,1]] -> 3
[[0,1,0,0],[0,1,1,1],[1,1,1,0],[0,0,1,0]] -> 4
[[0,0,1,0,0],[0,1,1,1,0],[1,1,1,1,1],[0,1,1,1,0],[0,0,1,0,0]] -> 3

এটি কি কর্নোখের মানচিত্রে অনুপ্রাণিত ?

1
@ThePirateBay আরও নির্বিঘ্নবাদী যোগাযোগ জটিলতার দ্বারা
জাগারব

@PirateBay কে-ম্যাপের জন্য সমস্ত আয়তক্ষেত্রে পাওয়ার-অফ-দ্বি মাত্রা থাকতে হবে।
স্পার

@Sparr। হ্যাঁ আমি এটা জানি. আমি কেবল জিজ্ঞাসা করেছি এটিই কি এই চ্যালেঞ্জের অনুপ্রেরণা ছিল?

1
লোভী পদ্ধতির জন্য দরকারী পরীক্ষার কেস [[0,1,0,0],[0,1,1,1],[1,1,1,0],[0,0,1,0]]
:,

উত্তর:


6

পাইথন 2 , 318 315 271 বাইট

মিঃ এক্সকোডার, ওভস এবং জনাথন ফ্রেঞ্চ প্রচুর বাইট সংরক্ষণ করেছেন

p=range
def f(x,i=0,j=-1):z=len(x[0]);j+=1;i+=j/z;j%=z;return i<len(x)and(x[i][j]and-~min([f([[v,v[:j]+[2]*(r-j)+v[r:]][i<=y<=e]for y,v in enumerate(x)],i,j)for e in p(i,len(x))for r in p(j+1,z+1)if all(all(k[j:r])for k in x[i:e+1])]+[f(x,i,j)-1]*(x[i][j]>1))or f(x,i,j))

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


4

জেলি ,  25  24 বাইট

FJ‘ṁ×⁸ẆZ€Ẇ€ẎŒPFQP$$ÐṀL€Ṃ

এটি অনলাইন চেষ্টা করুন! একটি সাধারণ গল্ফ-জটিলতার সমাধান, এমনকি বৃহত্তর পরীক্ষার ক্ষেত্রেও বিরক্ত করবেন না, তারা সময় শেষ করবে (সমস্ত সম্ভাব্য আয়তক্ষেত্রের পাওয়ার সেটটি পরিদর্শন করা হবে *)

কিভাবে?

তৈরি করা হতে পারে এমন সমস্ত সম্ভাব্য আয়তক্ষেত্র গঠন করে। এই আয়তক্ষেত্রগুলির পাওয়ার-সেটটি নেয় এবং কেবলমাত্র সেগুলি সেটগুলিতে রাখে যা উভয় জিরো থাকে না এবং অন্তত একবার একবারে প্রতিটি ধারণ করে।

"উভয় জিরো না থাকা এবং কমপক্ষে একবারে প্রত্যেকটি সমন্বিত করে" সেটগুলি অর্জনের জন্য, অংশটি কোডটি প্রথমে একের চেয়ে বড় স্বতন্ত্র পূর্ণসংখ্যার সেটগুলিকে জোর করে, সেগুলি শিরোনামকে রেখে দেয় যাতে এটি হয়ে যায় " অনন্য মানগুলির পণ্যের সর্বাধিক সন্ধান "।

FJ‘ṁ×⁸ẆZ€Ẇ€ẎŒPFQP$$ÐṀL€Ṃ - Link: list of lists of ones and zeros, M
F                        - flatten M into a single list
 J                       - range of length = [1,2,3,...,len(flattened(M))]
  ‘                      - increment       = [2,3,4,...,len(flattened(M))+1]
   ṁ                     - mould like M - reshapes it just like M again
     ⁸                   - chain's left argument, M
    ×                    - multiply (vectorises) - unique integers > 1 at M's 1s and 0s at M's 0s
      Ẇ                  - non-empty sublists - i.e. row selections
       Z€                - transpose €ach
         Ẇ€              - non-empty sublists of €ach - column selections of those
           Ẏ             - tighten - a flat list of all of the rectangles
            ŒP           - power-set - all possible selections of rectangles
                   ÐṀ    - filter keep those for which the following is maximal:
                  $      -   last two links as a monad:
              F          -     flatten
                 $       -     last two links as a monad:
               Q         -       de-duplicate
                P        -       product
                     L€  - length of €ach - # of rectangles used by each full-cover
                       Ṃ - minimum

* একটি জন্য এন দ্বারা মি ম্যাট্রিক্স যে উপায়ে (ঢ, মি) = 2 ^ (টি (ঢ) × টি (ড)) , তাই ...
উপায়ে (3,2) = 2 ^ ((3 + 2 + 1) × (2 + 1)) = 2 ^ 18 = 262,144 (টিআইও লিঙ্ক)
উপায় (3,3) = 2 ^ ((3 + 2 + 1) × (3 + 2 + 1)) = 2 ^ 36 = 68,719,476,736
উপায় (3,4) = 2 ^ ((3 + 2 + 1) × (4 + 3 + 2 + 1)) = 2 ^ 60 = 1,152,921,504,606,846,976
উপায় (5,5) = 2 ^ 225 ~ = 5.4e + 67 (বৃহত্তম পরীক্ষার কেস)
উপায়গুলি (8,5) = 2 ^ 540 ~ = 3.6e + 162 (উদাহরণ)


FJṁ×⁸ẆZ€Ẇ€ẎŒPFQS$$ÐṀL€Ṃ-1 এর জন্য কাজ করবে ? আরএন পরীক্ষা করার সময় নেই।
এরিক আউটগল্ফার

না, কারণ যে প্রচ্ছদকে অবহেলা করা হয়েছে (কেবল) সেই 1প্রচ্ছদে বৈধ কভার হিসাবে একই পণ্য থাকবে (উদাহরণস্বরূপ আটটি পাঁচটি উদাহরণকে অর্ধেক ঘুরিয়ে দেবে এবং এটি (তত্ত্ব অনুসারে) ফিরে আসবে 6কারণ এটি শীর্ষকে coverেকে রাখতে অবহেলা করবে বাম ঘর এবং এটি বৈধ বিবেচনা করুন))
জোনাথন অ্যালান

... আরও সহজ - পরীক্ষার কেস পরিবর্তে [[1,0],[0,1]]ফিরে আসবে । 12
জোনাথন অ্যালান

1

জাভাস্ক্রিপ্ট, 434 বাইট

কোড:

for(_='),d=...-1||(,Ad<=a,u[o][n]=d,    =0,(e,r,C,m))&&()=>.map((h((A,n,on<e|o<r|n>C|o>mf=u=>(q(s=(e>C[e,C]=[C,e]r>m[r,m]=[m,r]lk=1,k&=!!A)kl|=&1,=2k&lh=f=>uA,$ABf(B,$))))(($,Bae=r=C=m=,d=to-Bt=n$&n>$e   C=nn+1~ee   C=ttn-$t=oB&o>Br    m=oo+1~rr   m=tq+=sg=[],h((ca||g.push(c)gigb,j(p=1,q+=i<j&&s(b)q)';G=/[-]/.exec(_);)with(_.split(G))_=join(shift());eval(_)

হেক্সডাম্প (অরক্ষিত অক্ষরের কারণে):

66 6F 72 28 5F 3D 27 29 2C 13 13 64 3D 12 2E 2E 2E 11 2D 31 10 7C 7C 28 0F 2C 41 0F 64 3C 3D 0E 61 2C 0C 75 5B 6F 5D 5B 6E 5D 0B 3D 64 2C 09 3D 30 2C 08 28 65 2C 72 2C 43 2C 6D 07 29 29 13 06 26 26 28 05 29 3D 3E 04 2E 6D 61 70 28 28 03 68 28 28 41 2C 6E 2C 6F 04 02 02 6E 3C 65 7C 6F 3C 72 7C 6E 3E 43 7C 6F 3E 6D 0F 01 66 3D 75 3D 3E 28 71 08 28 73 3D 07 04 28 65 3E 43 05 5B 65 2C 43 5D 3D 5B 43 2C 65 5D 13 72 3E 6D 05 5B 72 2C 6D 5D 3D 5B 6D 2C 72 5D 13 6C 08 6B 3D 31 2C 01 6B 26 3D 21 21 41 29 13 6B 05 01 6C 7C 3D 0B 26 31 2C 0B 3D 32 06 6B 26 6C 13 68 3D 66 3D 3E 75 03 41 2C 24 04 41 03 0C 42 04 66 28 0C 42 2C 24 29 29 29 29 28 28 0C 24 2C 42 04 61 10 0F 65 3D 72 3D 43 3D 6D 3D 10 2C 64 3D 74 08 02 6F 2D 42 0F 74 3D 6E 0E 24 26 6E 3E 24 05 65 09 43 3D 6E 10 12 6E 2B 31 06 7E 65 0F 65 09 43 3D 74 12 74 08 02 6E 2D 24 0F 74 3D 6F 0E 42 26 6F 3E 42 05 72 09 6D 3D 6F 10 12 6F 2B 31 06 7E 72 0F 72 09 6D 3D 74 13 71 2B 3D 73 07 06 67 3D 5B 5D 2C 68 28 28 0C 11 63 04 61 10 7C 7C 67 2E 70 75 73 68 28 63 29 13 67 03 0C 69 04 67 03 62 2C 6A 04 28 70 3D 31 2C 71 2B 3D 69 3C 6A 26 26 73 28 11 0C 11 62 29 06 71 29 27 3B 47 3D 2F 5B 01 2D 13 5D 2F 2E 65 78 65 63 28 5F 29 3B 29 77 69 74 68 28 5F 2E 73 70 6C 69 74 28 47 29 29 5F 3D 6A 6F 69 6E 28 73 68 69 66 74 28 29 29 3B 65 76 61 6C 28 5F 29

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

এটি খুব গোলাপী নয়, তবে কমপক্ষে এটি খুব দ্রুত কাজ করে। সমস্ত পরীক্ষার কেস কয়েক মিলিসেকেন্ডে গণনা করা যায়।

Ungolfed

f=mat=>(
  iterate=f=>mat.map((A,x)=>A.map((a,y)=>f(a,y,x))),
  fill=(x1,y1,x2,y2)=>(
    x1>x2&&([x1,x2]=[x2,x1]),
    y1>y2&&([y1,y2]=[y2,y1]),
    isFilled=0,

    canBeFilled=1,
    iterate((A,X,Y)=>X<x1|Y<y1|X>x2|Y>y2||(
      canBeFilled&=!!A
    )),

    canBeFilled&&(
      iterate((A,X,Y)=>X<x1|Y<y1|X>x2|Y>y2||(
        isFilled|=mat[Y][X]&1,
        mat[Y][X]=2
      ))
    ),

    canBeFilled&isFilled
  ),

  rectangles=0,

  iterate((a,x,y)=>a-1||(
    x1=y1=x2=y2=-1,

    start=end=0,
    iterate((A,X,Y)=>Y-y||(
      end=X,
      A||(
        start<=x&X>x&&(x1=start,x2=X-1),
        start=X+1
      )
    )),
    ~x1||(x1=start,x2=end),

    start=end=0,
    iterate((A,X,Y)=>X-x||(
      end=Y,
      A||(
        start<=y&Y>y&&(y1=start,y2=Y-1),
        start=Y+1
      )
    )),
    ~y1||(y1=start,y2=end),

    rectangles+=fill(x1,y1,x2,y2)
  )),


  ones=[],
  iterate((a,...c)=>a-1||ones.push(c)),
  ones.map((a,i)=>ones.map((b,j)=>(
    M=1,
    rectangles+=i<j&&fill(...a,...b)
  ))),

  rectangles
)

ব্যাখ্যা

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

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

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