সর্বনিম্ন ব্যয় ব্লক ত্রিভুজ


10

বাইনারি ব্লক ডায়াগোনাল ম্যাট্রিক্সগুলি বিবেচনা করুন যা মূল ত্রিভুজটিতে 1 এর স্কোয়ার ব্লক রয়েছে এবং অন্য কোথাও 0 হয়। আসুন এই জাতীয় ম্যাট্রিকগুলিকে "বৈধ" ম্যাট্রিকগুলি বলি।

উদাহরণস্বরূপ, এখানে কিছু বৈধ 4x4 ম্যাট্রিক রয়েছে:

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

মনে রাখবেন যে এই জাতীয় ম্যাট্রিকগুলি বর্ণনা করার একটি বিকল্প উপায় হ'ল উপরের বাম থেকে নীচে ডানদিকে কোণার কোণে স্পর্শ করে অন্য কোথাও 0 বর্গাকার ব্লকের একটি শৃঙ্খলা রয়েছে।

বিপরীতে, এখানে কিছু অবৈধ 4x4 ম্যাট্রিক রয়েছে:

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

আপনি একটি দেওয়া হবে nদ্বারা nইনপুট হিসাবে বাইনারি ম্যাট্রিক্স - ন্যূনতম নম্বর কি 0আপনাকে সেট করতে হবে বিট 1অর্ডার একটি বৈধ ম্যাট্রিক্স পেতে?

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

এটি , তাই আপনার প্রোগ্রামে বাইটের সংখ্যা হ্রাস করা লক্ষ্য।

উদাহরণ

উদাহরণস্বরূপ, যদি ইনপুট হয়

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

তাহলে উত্তরটি হ'ল 5, যেহেতু আপনি পাঁচটি 0বিট সেট 1করতে পারেন:

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

এবং এটি প্রয়োজনীয় সর্বনিম্ন সংখ্যা। তবে, যদি ইনপুট ছিল

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

তারপরে উত্তরটি 24, যেহেতু একমাত্র বৈধ 5x5 ম্যাট্রিক্স যেখানে উপরের ডানদিকটি 1সমস্ত 1s এর ম্যাট্রিক্স ।

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

টেস্টগুলি এখানে পূর্ণসংখ্যার 2D অ্যারে হিসাবে প্রতিনিধিত্ব করা হয়।

[[0]] -> 1
[[1]] -> 0
[[0,1],[0,0]] -> 3
[[1,0],[0,0]] -> 1
[[0,0,0],[0,1,0],[0,0,0]] -> 2
[[0,1,0],[0,0,0],[0,1,0]] -> 7
[[0,1,0],[1,0,0],[0,0,1]] -> 2
[[1,1,1],[1,1,1],[1,1,1]] -> 0
[[0,0,0,0],[0,0,1,0],[0,1,0,0],[0,0,0,0]] -> 4
[[0,0,1,0],[0,0,0,0],[0,0,0,0],[0,0,0,1]] -> 8
[[0,0,1,0],[0,0,0,0],[0,0,0,0],[0,0,1,0]] -> 14
[[0,0,1,0],[0,0,0,0],[0,0,0,0],[0,1,0,0]] -> 14
[[0,0,0,0,0],[0,0,0,0,0],[0,1,0,0,0],[0,0,0,0,1],[0,0,0,0,0]] -> 7
[[0,0,0,0,0],[0,0,0,0,0],[1,0,0,0,0],[0,0,0,0,1],[0,0,0,0,0]] -> 11
[[0,0,0,0,0],[0,0,1,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,1]] -> 5
[[0,0,0,0,1],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]] -> 24
[[0,0,0,1,0],[0,0,0,0,1],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]] -> 23
[[0,1,0,0,0],[1,0,0,0,0],[0,0,1,0,0],[0,0,0,0,1],[0,0,0,1,0]] -> 4
[[0,1,1,1,0],[0,1,1,0,1],[0,1,1,1,0],[0,1,0,0,1],[0,0,0,0,0]] -> 14

মন্তব্য

উত্তর:


3

এমএটিএল , 46 43 বাইট

nX^tQt:qZ^!tsb=Z)"@!"@1$l]@n$YdG-Q?6MG>zvX<

ইনপুটটি সারি বিভাজক হিসাবে সেমিকোলনযুক্ত একটি 2D অ্যারে। উদাহরণস্বরূপ, শেষ পরীক্ষার ক্ষেত্রে ইনপুটটি

[0,1,1,1,0;0,1,1,0,1;0,1,1,1,0;0,1,0,0,1;0,0,0,0,0]

এটি অনলাইন চেষ্টা করুন! বা সমস্ত পরীক্ষার কেস যাচাই করুন (সমস্ত ইনপুট নিতে কোডটি কিছুটা সংশোধন করা হয়েছে; ফলাফলগুলি কয়েক সেকেন্ড পরে প্রদর্শিত হবে)

ব্যাখ্যা

ইনপুটটি একটি N × N ম্যাট্রিক্স হতে দিন। কোডটি প্রথমে সমস্ত ( এন +1) গণনা করে - উপযুক্ত ম্যাট্রিক্স আকারের উত্পাদনকারী ব্লক আকারের টিপলগুলি। উদাহরণস্বরূপ, জন্য এন = 4 tuples হয় 0 0 0 0 4, 0 0 0 1 3, ..., 4 0 0 0 0। প্রতিটি টিপলের জন্য এটি ব্লক আকারগুলির সাথে ব্লক-ডায়াগোনাল ম্যাট্রিক্স তৈরি করে। এরপরে ম্যাট্রিক্স ইনপুটটিতে থাকা সমস্ত 1এন্ট্রি কভার করে কিনা তা পরীক্ষা করে এবং যদি ইনপুটটিতে 1উপস্থিত ছিল না এমন এনট্রিগুলির সংখ্যা নোট করে। চূড়ান্ত ফলাফলটি প্রাপ্ত সমস্ত সংখ্যার সর্বনিম্ন।

nX^      % Implicit input  an N×N matrix. Get N
t        % Duplicate N
Qt:q     % Vector [0 1 ... N]
Z^       % Cartesian power. Gives 2D array
!ts      % Transpose, duplicate, sum of each column
b=       % Logical vector that equals true if the sum is N
Z)       % Filter columns according to that. Only keep columns that sum to N. Each 
         % column is the size of one block
"        % For each column
  @      %   Push that column
  "      %   For each entry of that column
    @    %     Push that entry
    1$l  %     Square matrix with that size, filled with 1
  ]      %   End
  @n     %   Column size. This is the number of blocks in the block-diagonal matrix
  $Yd    %   Build block-diagonal matrix from those blocks
  G-Q    %   Subtract input matrix element-wise, and add 1
  ?      %   If all entries are nonzero (this means each that entry that is 1 in the
         %   block-diagonal matrix is also 1 in the input matrix)
    6M   %   Push block-diagonal matrix again
    G>   %   For each entry, gives 1 if it exceeds the corresponding entry of the
         %   input, that is, if the block-diagonal matrix is 1 and the input is 0
    z    %   Number of 1 entries
    v    %   Concatenate vertically with previous values
    X<   %   Take minimum so far
         %   Implicit end
         % Implicit end
         % Implicit display

3

অজগর সহ পাইথন, ১০২

from numpy import*
lambda M:sum(diff([k for k in range(len(M)+1)if(M|M.T)[:k,k:].any()-1])**2)-M.sum()

একটি দক্ষ অ্যালগরিদম। তির্যকগুলিতে "ঘাড় পয়েন্টস" সন্ধান করে যা ব্লকগুলি পৃথক করতে পারে। এগুলির উপরের এবং ডানগুলির পাশাপাশি নীচে এবং বামে সমস্ত 0 রয়েছে। ন্যূনতম ব্লকগুলি ঘাড় পয়েন্টগুলির মধ্যে রয়েছে।

??000
??000
00???
00???
00???

একটি ব্লকের দৈর্ঘ্য হ'ল একটানা ঘাড় পয়েন্টগুলির মধ্যে পার্থক্য, সুতরাং এর স্কোয়ারের যোগফলের মোট ক্ষেত্রফল। মূল ম্যাট্রিক্সের যোগফল বিয়োগ করে তারপরে 0 থেকে 1 পর্যন্ত প্রয়োজনীয় ফ্লিপের সংখ্যা দেয়।


2

পাইথ, 45 বাইট

-hSlMf@I.DRlQx1sQTms.b^+LsYN2d+0._ds.pM./lQss

কঠিন কাজ, সুতরাং এটি বেশ দীর্ঘ।

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার স্যুট

ব্যাখ্যা:

s.pM./lQএর সমস্ত সংখ্যার পার্টিশন গণনা করে len(matrix)ms.b^+LsYN2d+0._dএগুলি সমন্বয়-জোড়ায় রূপান্তর করে। উদাহরণস্বরূপ পার্টিশন [1, 2, 2]এর 5রূপান্তরিত মধ্যে পায় [[0,0], [1,1], [1,2], [2,1], [2,2], [3,3], [3,4], [4,3], [4,4]

f@I.DRlQx1sQTতারপরে পার্টিশনের জন্য ফিল্টার করে, যা ম্যাট্রিক্সকে সম্পূর্ণরূপে ওভারল্যাপ করে (ম্যাট্রিক্সের .DRlQx1sQসক্রিয় কোষগুলির সমস্ত স্থানাঙ্ক-জোড়া গণনা করে)।

-hSlM...ss প্রতিটি অবশিষ্ট পার্টিশনের সেলগুলি গণনা করে, সর্বনিম্ন কোষগুলির সাথে একটি চয়ন করে এবং ইতিমধ্যে সক্রিয় কোষগুলিকে বিয়োগ করে।


0

ম্যাট্রিক্স , 180 বাইট ( নন-কেপটিং )

ম্যাট্রিক্স একটি নতুন এসোলেং যা আমি খুব সম্প্রতি ম্যাট্রিক্স সমস্যাগুলি (যেমন এটির মতো) মোকাবিলা করতে তৈরি করেছি, কেবলমাত্র 2 টি ডেটা টাইপ করে: ফ্লোট এবং ম্যাট্রিক্স। এটি এখনও পুরোপুরি বৈশিষ্ট্যযুক্ত নয় এবং এখনও প্রচুর অনুপস্থিত অপারেশন রয়েছে (এই চ্যালেঞ্জের জন্য আমাকে কিছু কার্যকারিতা যোগ করতে হয়েছিল)। যাইহোক, কোড এখানে:

il=1:j3;:bdx;;;s1::L;j1;;
b{q:1;mgr:c;|gc:r;|(r=c)|(gr-1:c;|gr:c+1;)&(rec)|(gr+1:c;|gr:c-1;)&(cer):l:L;};z:(l-1)/2;B1;s1::g1:;-1;ig1:;=0:j2;:j1;;
s1::d{q:1;};;kg1:;-g:;;
kg:;*-1+1;

ব্যাখ্যা

প্রথম অংশটি, il=1:j3;:...;অ্যারের আকার 1 রয়েছে কিনা তা পরীক্ষা করে থাকে যদি এটি হয় তবে এটি শেষ লাইনে লাফ দেয় kg:;*-1+1;, যা একটি সাধারণ 0 <-> 1ফাংশন।

অন্যথায়, এটি বাকী কোড সহ চালিয়ে যায়। bdx;;;ঘরটিকে 0,0বর্তমান যোগফলে সেট করে এবং s1::L;j1;নীচের সারিতে সেলটিতে একটি কাউন্টার তৈরি করে।

পরের লাইনটি কিছুটা জটিল। এটি একটি লুপ যা ম্যাট্রিক্সের আকার হওয়ায় nবার চালায় n। আমি উদাহরণ হিসাবে তৃতীয় পরীক্ষার কেসটি ব্যবহার করব। আমরা যখন প্রথম লাইনে পৌঁছে যাই, ম্যাট্রিক্সটি দেখতে এরকম দেখাচ্ছে:

1 0 1
2 0 0

প্রথমত, আমরা ম্যাট্রিক্স বোঝার মধ্যে যাই {q:1;m...;}। এটি তির্যক করে তোলে এবং 0 পূরণ করার জন্য যথাসাধ্য চেষ্টা করে যা পূরণ করার প্রয়োজন simple এটি সাধারণ বুলিয়ান অপারেটরগুলি ব্যবহার করে সম্পন্ন হয়। তারপরে, আমরা এটিকে বর্তমান ম্যাট্রিক্সে প্রিপেন্ড করি:

    V--data we want to keep
1 1 1 0 1 <-|
1 1 2 0 0 <-- old matrix

তারপরে, আমরা পুরানো ম্যাট্রিক্স ব্যবহার করে কাটা z:(l-1)/2;এবং ব্যবহার করে পুরো ম্যাট্রিক্সটি বাম দিকে ঘোরান B1;। এটি আমাদের পরবর্তী পুনরাবৃত্তির জন্য একটি ম্যাট্রিক্স প্রস্তুত দেখায়, যেমন:

1 1 1
2 1 1

অবশেষে, আমরা কাউন্টারটি হ্রাস করি, এটি পরীক্ষা করে এবং চালিয়ে যাচ্ছি ig1:;=0:j2;:j1;;

লুপটি ভেঙে ফেলার পরে আমরা নতুন যোগফলটি খুঁজে পাই এবং এর সাথে কাউন্টারটির পুরানো স্পট সেট করি s1::d{q:1;};;। অবশেষে, আমরা পার্থক্য গ্রহণ এবং ফিরে kg1:;-g:;;kবর্তমান অ্যারেটিকে একটি মান হিসাবে সেট করে এবং মুদ্রণ জড়িত।

...

আপনি দেখতে পাচ্ছেন, ম্যাট্রিক্স বেশ ভার্জোজ এবং খুব ভাল গল্ফ করার ভাষা নয়। কিন্তু হেক, আমি এটি প্রদর্শন করতে চেয়েছিলাম।

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