পুনরাবৃত্তির 2x2 নির্ধারক


17

2 বাই 2 ম্যাট্রিক্সের নির্ধারক

a b
c d

দ্বারা দেওয়া হয় ad - bc

2 এন দ্বারা 2 এন , এন ≥ 1 মাত্রা সহ একটি সংখ্যার ম্যাট্রিক্স দেওয়া , ফলাফলটি প্রতি 2 দ্বারা 2 উপ-ব্লকের নির্ধারককে পুনরাবৃত্তান্তরে গণনা করে প্রাপ্ত ফলাফল আউটপুট করুন যতক্ষণ না আমরা একটি সংখ্যায় পৌঁছাই।

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

3 1 4 1
5 9 2 6
5 3 5 8
9 7 9 3

এক ধাপ পরে, আমরা প্রাপ্ত:

(3*9 - 1*5)    (4*6 - 1*2)    =    22  22
(5*7 - 3*9)    (5*3 - 8*9)         8  -57

এবং আরও একবার পুনরাবৃত্তি, আমরা পেতে:

(22*-57 - 22*8) = -1430

সুতরাং, আউটপুট হওয়া উচিত -1430

বিধি

  • ম্যাট্রিক্সের উপাদানগুলি সর্বদা একক অঙ্কের পূর্ণসংখ্যার, অর্থাৎ 0 থেকে 9 হবে।
  • আপনি কোনও সুবিধাজনক তালিকা বা স্ট্রিং ফর্ম্যাটে ইনপুট নিতে পারেন, যতক্ষণ না কোনও ডেটা প্রাক প্রসেসিং করা হয় is যেহেতু ম্যাট্রিক্স সর্বদা বর্গক্ষেত্র হয় তাই আপনি চাইলে 2D তালিকার পরিবর্তে একক 1D তালিকা হিসাবে ইনপুট নিতে পারেন।
  • ইনপুট ফাংশন ইনপুট, এসটিডিএন, কমান্ড-লাইন আর্গুমেন্ট বা নিকটতম বিকল্পের মাধ্যমে হতে পারে।
  • আউটপুট, STDOUT বা নিকটতম বিকল্পের কাজ করতে আউটপুট একক পূর্ণসংখ্যা হওয়া উচিত। আপনি একটি তালিকা বা ম্যাট্রিক্সে একক পূর্ণসংখ্যা আউটপুট নাও করতে পারেন।
  • আপনার ভাষা যদি তাদের সমর্থন করে তবে আপনি বিল্টিন নির্ধারক এবং ম্যাট্রিক্স ম্যানিপুলেশন পদ্ধতিগুলি ব্যবহার করতে পারেন।
  • আপনার অ্যালগরিদম কোনও বৈধ ইনপুট জন্য তত্ত্ব কাজ করতে হবে।
  • স্ট্যান্ডার্ড বিধি প্রযোজ্য।

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

নিম্নলিখিত পরীক্ষার কেসগুলি পাইথন-শৈলীর তালিকা হিসাবে দেওয়া হয়েছে:

[[1,0],[0,1]] -> 1
[[1,9],[8,4]] -> -68
[[0,1,2,3],[4,5,6,7],[8,9,0,1],[2,3,4,5]] -> 40
[[3,1,4,1],[5,9,2,6],[5,3,5,8],[9,7,9,3]] -> -1430
[[9,0,0,9],[0,9,9,0],[9,0,9,0],[0,9,0,9]] -> 13122
[[1,0,0,0,0,0,0,0],[2,1,0,0,0,0,0,0],[3,2,1,0,0,0,0,0],[4,3,2,1,0,0,0,0],[5,4,3,2,1,0,0,0],[6,5,4,3,2,1,0,0],[7,6,5,4,3,2,1,0],[8,7,6,5,4,3,2,1]] -> 1
[[7,1,0,5,8,0,1,5],[9,9,6,6,1,2,4,8],[4,8,7,3,8,7,4,7],[4,6,1,9,7,0,1,7],[7,6,7,1,9,4,1,6],[8,0,0,8,5,5,9,9],[4,6,4,8,9,4,8,6],[9,0,8,7,6,2,1,5]] -> 2937504
[[1,2,3,4,5,6,7,8],[2,3,4,5,6,7,8,1],[3,4,5,6,7,8,1,2],[4,5,6,7,8,1,2,3],[5,6,7,8,1,2,3,4],[6,7,8,1,2,3,4,5],[7,8,1,2,3,4,5,6],[8,1,2,3,4,5,6,7]] -> -10549504
[[1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,0],[0,1,1,1,1,0,0,1,0,1,1,1,1,1,1,0],[1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,0],[0,1,1,1,1,0,0,0,0,1,1,1,1,1,0,1],[1,0,1,0,1,1,1,0,0,1,1,1,1,0,1,0],[0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,0],[1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1],[1,1,0,1,1,1,1,1,1,1,1,1,0,1,0,1],[1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1],[0,1,1,1,1,1,1,1,1,0,0,1,0,1,0,1],[1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,1,0,1,1,0,1,1,1,1,1,0,0,1,1,0],[1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,0,1,0,0,1,0,1,0,1,1,1,1,1,0,1],[1,1,1,1,1,1,1,1,1,0,0,1,1,1,0,1]] -> -8

(এই চ্যালেঞ্জের জন্য সহায়তার জন্য @ মার্টিনব্যাটনারকে ধন্যবাদ)


3
মজাদার ঘটনা: আমি এটি নিয়ে কিছু পরীক্ষা-নিরীক্ষা চালিয়েছি এবং শূন্যবিহীন পুনরাবৃত্ত নির্ধারক সহ এক বিস্ময়করভাবে বাইনারি ম্যাট্রিক রয়েছে। আকার 2x2, 4x4, 8x8, 16x16 এর জন্য আমরা 6, 16488, 2229617029168687104, 3349795881591711813037585032680117995553655026185547430764970842694019448832 ম্যাট্রিক সহ যথাক্রমে 37,058%, 25 এর সাথে সম্পর্কিত 3%।
মার্টিন এন্ডার

@ মার্টিনব্যাটনার: আমি 6, 22560, 10160459763342013440 পেয়েছি, ... যা A055165 এর সাথে মেলে ।
চার্লস

@ চার্লস অদ্ভুত, আমি আমার কোডটি যাচাই করব
মার্টিন

@ মার্টিনবাটনার: সম্ভবত আমরা কেবল দুটি ভিন্ন জিনিস গণনা করছি?
চার্লস

@ চার্লস ম্যাট্রিক্স বিবেচনা করুন [1,0,1,0;1,1,1,1;1,1,1,1;0,0,0,1]। এর সম্পূর্ণ নির্ধারক শূন্য হওয়ায় এর দুটি অভিন্ন সারি রয়েছে। এটি একক হিসাবে একক (যার অর্থ অবিবর্তনীয়) 4 × 4 ম্যাট্রিক্স, সুতরাং এটি A055165 দ্বারা গণনা করা হয় না। তবে, এখানে আলোচনা করা "পুনরাবৃত্ত" নির্ধারক 1*1-1*0==1। বিপরীত দিকে, ম্যাট্রিক্সের [0,0,0,1;1,0,0,0;0,1,0,0;0,0,1,0]"পুনরাবৃত্ত" নির্ধারক রয়েছে 0*0-0*0==0। তবে, এর সম্পূর্ণ নির্ধারকটি অবশ্যই শূন্য নয়, কারণ এর সারিগুলি অন্য ক্রমে পরিচয় ম্যাট্রিক্সের সারি; এবং এটি A055165 দ্বারা গণনা করা হয়।
জেপ্প স্টিগ

উত্তর:


8

জে, 21 25 বাইট

0{0{(_2(_2-/ .*\|:)\])^:_

ব্যবহার:

   ]input=.(3,1,4,1),(5,9,2,6),(5,3,5,8),:(9,7,9,3)
3 1 4 1
5 9 2 6
5 3 5 8
9 7 9 3
   (0{0{(_2(_2-/ .*\|:)\])^:_) input
_1430

প্রতিটি পদক্ষেপে আমরা ম্যাট্রিক্স কে 2-বাই -2 এর মধ্যে কাট করি এবং প্রতিটি পদক্ষেপের নির্ধারককে পরবর্তী পদক্ষেপের ইনপুট ম্যাট্রিক্সের ফলাফল হিসাবে গণনা করি। ফলাফল পরিবর্তন না হওয়া পর্যন্ত আমরা এই প্রক্রিয়াটির পুনরাবৃত্তি করি (চূড়ান্ত উপাদানটি নিজেই নির্ধারক হয়)। আমরা চূড়ান্ত ফলাফলকে সাথে স্কেলারে রূপান্তর করি 0{0{

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


এটি করার জন্য কাটের টাইলিং ফাংশনটি ব্যবহার করার চেষ্টা করা হয়েছে তবে এটি আপনার সংস্করণ হিসাবে গল্ফ করতে সক্ষম হয়নি। 29 বাইট: (2 2$2)&(-/ .*;._3^:(2^.#@])) এটি অনলাইন চেষ্টা করুন!
জোনা

4

গণিত, 52 40 বাইট

12 বাইট সংরক্ষণের জন্য মার্টিন বাটনারকে ধন্যবাদ।

Tr[#//.l:{_,__}:>BlockMap[Det,l,{2,2}]]&

ব্যাখ্যা

BlockMap[f,expr,n]প্রতিটি সাবলিস্টে exprআকার nএবং মানচিত্রের সাবলিস্টে বিভক্ত fBlockMap[Det,#,{2,2}]&ইনপুট অ্যারে 2 * 2 ব্লকে বিভক্ত করুন এবং তাদের নির্ধারকের গণনা করুন।


পরীক্ষা ক্ষেত্রে

%[{{3,1,4,1},{5,9,2,6},{5,3,5,8},{9,7,9,3}}]
(* -1430 *)

1
আমি Sp3000 এর সাথে চ্যালেঞ্জ ধারণাটি আলোচনা করার সময় ম্যাথামেটিকায় একটি রেফারেন্স বাস্তবায়ন লিখেছিলাম এবং এটি 40 বাইট। যদিও এটি আপনার সাথে বেশ সমান, তাই আপনার ভাল লাগলে আমি এটি খুঁজতে কিছুটা সময় দেব। :)
মার্টিন এন্ডার

@ মার্টিনবাটনার আমি ব্যর্থ হয়েছি :(
এনজিপিপোরগান

1
আপনি এর [[1,1]]সাথে Trএবং এর Nestসাথে এড়াতে পারেন //.:Tr[#//.l:{_,__}:>BlockMap[Det,l,{2,2}]]&
মার্টিন ইন্ডার

@ মার্টিনব্যাটনার আসলে, আমি // নিয়ে এসেছি। জেতে উত্তর পড়ার সময় ধারণা, তবে অ্যারের সাথে মিলে যাওয়ার একটি ভাল উপায় খুঁজে পেতে আটকে গেল। : পি
এনজিপিপোরগন

আপনার উত্তরটি আপডেট করতে আমার সমাধানটি নির্দ্বিধায় মনে করুন
মার্টিন ইন্ডার

3

জেলি, 20 17 বাইট

s€2s2U×¥/€ḅ-µL¡SS

এটি অনলাইন চেষ্টা করুন! বা একবারে সমস্ত পরীক্ষার কেস যাচাই করুন

কিভাবে এটা কাজ করে

s€2s2U×¥/€ḅ-µL¡SS  Main link. Input: M (matrix)

s€2                Split each row of M into pairs.
   s2              Split the result into pairs of rows.
        /€         Reduce each pair...
       ¥             by applying the following, dyadic chain:
     U                 Reverse each pair of the left argument (1st row).
      ×                Multiply element-wise with the right argument (2nd row).
          ḅ-       Convert each resulting pair from base -1 to integer.
                   This maps [a, b] -> b - a.
            µ      Turn the previous links into a monadic chain. Begin a new one.
             L     Yield the length of the input.
              ¡    Execute the previous chain L times.
                   log2(L) times would do, but who's counting?
               SS  Sum twice to turn the resulting 1x1 matrix into a scalar.

2

হাস্কেল , 93 86 বাইট

সম্পাদনা: এটি পুরো 7 বাইট সংক্ষিপ্ত করার জন্য @ লাইকোনিকে ধন্যবাদ!

f[[a,b],[c,d]]=a*d-b*c
f m|let l=[take,drop]<*>[div(length m)2]=f[f.($b<$>m)<$>l|b<-l]

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

পুরাতন রুপ:

f[[a,b],[c,d]]=a*d-b*c
f m=f[[f$a$map b m|a<-l]|b<-l]where h=length m`div`2;l=[take h,drop h]

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

এটি এমন একটি ফাংশন যা দুটি ভিন্ন উপায়ে নিজেকে পুনরাবৃত্তি করে। প্রথমে প্যাটার্ন মিলেছে বেস কেসটি: একটি 2x2 ম্যাট্রিক্স এবং এটি গণনা করে। আমি জেনারেট করে 2x2 ম্যাট্রিক্স দিয়ে ফাংশনটি কল করে পুনরাবৃত্তির ক্ষেত্রে গণনা করতে এটি ব্যবহার করি যার এতে পুনরাবৃত্ত সমাধান রয়েছে। সেই ম্যাট্রিক্স দুটি ফাংশনের অ্যারেতে পুনরাবৃত্তি করে তৈরি করা হয় যা প্রতিটি তালিকা অর্ধেক কাটা করে। আমি এটিকে একটি সাধারণ কল দিয়ে সারিগুলিতে প্রয়োগ করি এবং এটি ব্যবহার করে কলামগুলিতে প্রয়োগ করি map


পরিবর্তে where h=length m`div`2;l=[take h,drop h], আপনি ব্যবহার করতে পারেন f m|let l=[take,drop]<*>[length m`div`2]=map b mহতে পারে b<$>m, এবং [f$a$b<$>m|a<-l]আরও কাছে সংক্ষিপ্ত করা যেতে পারে f.($b<$>m)<$>lএকসাথে 86 বাইট: [ tio.run/… এটি অনলাইনে চেষ্টা করুন!]
লাইকনি

1

পাইথন, 166 বাইট

def f(m):l=len(m)/2;g=lambda x,y:[(s[:l],s[l:])[x]for s in(m[:l],m[l:])[y]];return f(g(0,0))*f(g(1,1))-f(g(0,1))*f(g(1,0)) if l>1 else m[0][0]*m[1][1]-m[1][0]*m[0][1]

এটি প্রদত্ত সমস্ত পরীক্ষার কেস পাস করে। মি 2 ডি অ্যারে হতে হবে (পরীক্ষার ক্ষেত্রে যেমন), ছ সাব ম্যাট্রিক্স নির্বাচন করে।


1

পাইথ, 26

M-F*VG_HhhumgMCcR2dcG2llQQ

পরীক্ষা স্যুট

এর দুটি অংশ রয়েছে: M-F*VG_Hg একটি দুটি বাই দুটি ম্যাট্রিক্সের নির্ধারক গণনা করার জন্য ফাংশনটিকে নতুন সংজ্ঞা দেয় । এটি বাইটগুলি সংরক্ষণ করে যদিও আমরা কেবল এটি একবার ব্যবহার করি কারণ এটি দুটি সারিকে প্যাক করে দেয়।

অন্য অংশটি হ'ল একটি বৃহত হ্রাস বিবৃতি যা আমরা log_2( len( input() ) )সময়কে কল করি । দুর্ভাগ্যক্রমে, 1 দ্বারা 1 ম্যাট্রিক্স হ্রাস একটি পদক্ষেপ সম্পাদন ফলাফল একটি তালিকায় মোড়ানো কারণ, তাই আমরা একটি নির্দিষ্ট পয়েন্ট পাই না। হ্রাসটি কেবলমাত্র 2 বাই 2 ম্যাট্রিক পেতে ম্যাট্রিক্সকে বিভক্ত করে তারপরে আবেদন করা হয় g


1

এমএটিএল , 26 30 বাইট

`tnX^teHHhZC2Ih2#Y)pwp-tnq

ইনপুট হ'ল একটি 2D অ্যারের সাথে সারি দ্বারা পৃথক করা ;, অর্থাৎ,

[3 1 4 1; 5 9 2 6; 5 3 5 8; 9 7 9 3]

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

`             % do...while loop
  tnX^te      %   reshape into square matrix. Implicitly asks for input the first time
  HHhZC       %   transform each 2x2 block into a column
  2Ih2#Y)     %   push matrix with rows 2,3, and also matrix with remaining rows (1,4)
  pwp-        %   multiplications and subtraction to compute the 2x2 determinants
  tnq         %   condition of do...while loop: is number of elements greater than 1?
              % implicitly end loop
              % implicitly display


0

ES6, 91 বাইট

(a,x=0,y=0,w=a.length)=>(w>>=1)?f(a,x,y,w)*f(a,x+w,y+w,w)-f(a,x,y+w,w)*f(a,x+w,y,w):a[x][y]

সোজা পুনরাবৃত্তি সমাধান।



0

গ্রোভি, 221 189 বাইট (এই সময়ে, জাভা ব্যবহার করতে পারত)

f={x->b=x.size();c=b/2-1;a=(0..c).collect{i->(0..c).collect{j->z=x.toList().subList(i*2,i*2+2).collect{it.toList().subList(j*2,j*2+2)};z[0][0]*z[1][1]-z[0][1]*z[1][0];}};a.size()==1?a:f(a)}

ওল্ড ক্রেপি সংস্করণ, যা জাভা (221 বাইট) হতে পারে:

f={x->b=x.size();a=new int[b/2][b/2];for(i=0;i<b-1;i+=2){for(j=0;j<b-1;j+=2){z=x.toList().subList(i,i+2).collect{it.toList().subList(j,j+2)};a[(int)(i/2)][(int)(j/2)]=z[0][0]*z[1][1]-z[0][1]*z[1][0];}};a.size()==1?a:f(a)}

অবহেলিত কোড:

f=
{x->
  b=x.size();
  int[][]a=new int[b/2][b/2];
  for(i=0;i<b-1;i+=2) {
    for(j=0;j<b-1;j+=2) {
      z=x.toList().subList(i,i+2).collect{
        it.toList().subList(j,j+2)
      };
      a[(int)(i/2)][(int)(j/2)]=z[0][0]*z[1][1]-z[0][1]*z[1][0];
    }
  }
  a.size()==1
    ?
      a:f(a)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.