কোয়াণ্ডল কোয়ার্ডারি পর্ব প্রথম: সীমাবদ্ধ চক্রগুলি সনাক্তকরণ


20

এমন একটি প্রোগ্রাম লিখুন যা নির্ধারণ করবে যে প্রদত্ত ম্যাট্রিক্স কোনও কান্ডলে প্রতিনিধিত্ব করে কিনা। একটি কান্ডেল এমন একটি সেট যা একটি একক (অ-পরিবহণমূলক, নন-অ্যাসোসিয়েটিভ) অপারেশন দিয়ে সজ্জিত ◃ যা নিম্নলিখিত অক্ষগুলি মেনে চলে:

  • অপারেশনটি বন্ধ রয়েছে, এর অর্থ এটি a◃b = cসর্বদা সেটের উপাদান aএবং যদি সেটের bউপাদান হয়।
  • অপারেশন ডান-স্ব বিভাজক হল: (a◃b)◃c = (a◃c)◃(b◃c)
  • অপারেশন ডান-বিভাজ্য হল: কোন মনোনীত যুগল জন্য aএবং bসেখানে একটি একক অনন্য cযেমন যেc◃a = b
  • অপারেশন আদর্শবান: a◃a = a

একটি সসীম কান্ডেল একটি বর্গ ম্যাট্রিক্স হিসাবে প্রতিনিধিত্ব করা যেতে পারে। নীচে একটি অর্ডার -5 কান্ডেল ( উত্স ) এর উদাহরণ দেওয়া আছে ।

0 0 1 1 1
1 1 0 0 0
3 4 2 4 3
4 2 4 3 2
2 3 3 2 4

N-th সারি এবং m-th কলামে (0-ইনডেক্সড) অবস্থিত মান n◃m এর মান। উদাহরণস্বরূপ, এই কান্ডলে 4◃1 = 3,। কিছু মাতাল বৈশিষ্ট্য এই ম্যাট্রিক্স থেকে দেখতে সহজ:

  • এটি বন্ধ করা হয়েছে কারণ এই 5x5 ম্যাট্রিক্সে কেবল 0-4 এর মান দেখা যায়।
  • এটি আদর্শবান কারণ ম্যাট্রিক্স তির্যক 0 1 2 3 4 হয়
  • এটি ডান-বিভাজ্য কারণ কোনও কলামে কোনও সদৃশ মান নেই। (সারিগুলি পারে এবং সাধারণত হবে।)

ডান-স্ব-বিতরণকারীর সম্পত্তি পরীক্ষা করা শক্ত। একটি শর্টকাট হতে পারে, তবে সবচেয়ে সহজ পদ্ধতিটি যাচাই করার জন্য তিনটি সূচকের প্রতিটি সম্ভাব্য সংমিশ্রণের উপর পুনরাবৃত্তি করা m[m[a][b]][c] = m[m[a][c]][m[b][c]]

ইনপুট

ইনপুটটি 0-ইনডেক্সিং বা 1-সূচক (আপনার পছন্দ) ব্যবহার করে বর্গ ম্যাট্রিক্সের সারিগুলির তালিকা হবে। প্রতিটি ভুক্তি থেকে একটি একক অঙ্ক সংখ্যা হতে হবে 0করার 8(অথবা 1মাধ্যমে 9)। আমি ইনপুট ফর্ম্যাটে নমনীয় হব। কিছু গ্রহণযোগ্য ফর্ম্যাট অন্তর্ভুক্ত:

  • আপনার ভাষা ম্যাট্রিক বা তালিকার জন্য সবচেয়ে প্রাকৃতিক ফর্ম্যাটিং, যেমন [[0 0 0][2 1 1][1 2 2]]বা (0,0,0,2,1,1,1,2,2)
  • হোয়াইটস্পেস, নিউলাইনস, কমা, ইত্যাদি দ্বারা সীমিত মূল্যগুলির তালিকা
  • সমস্ত মান সমন্বিত একটি একক স্ট্রিং যেমন একসাথে জড়িত, যেমন 000211122

আপনাকে ম্যাট্রিক্সের ট্রান্সপোজটি ইনপুট হিসাবে নিতে (কলামগুলির সাথে সারিগুলিকে অদলবদল করতে) অনুমতি দেবে। আপনার উত্তরে এটি উল্লেখ করতে ভুলবেন না।

আউটপুট

একটি একক সত্যবাদী / মিথ্যা মান একটি কোয়াণ্ডল হিসাবে ম্যাট্রিক্সের স্থিতি নির্দেশ করে।

কান্ডল এর ​​উদাহরণ

0

0 0
1 1

0 0 0
2 1 1
1 2 2

0 0 1 1
1 1 0 0
3 3 2 2
2 2 3 3

0 3 4 1 2
2 1 0 4 3
3 4 2 0 1
4 2 1 3 0
1 0 3 2 4

নন-কান্ডেলগুলির উদাহরণ

বন্ধ নেই

1

0 0 0
2 1 1
1 9 2

সঠিক-স্ব-বিতরণ নয়

0 0 1 0
1 1 0 1
2 3 2 2
3 2 3 3

(3◃1)◃2 = 2◃2 = 2
(3◃2)◃(1◃2) = 3◃0 = 3

সঠিক বিভাজক নয়

0 2 3 4 1
0 1 2 3 4
3 4 2 2 2
3 3 3 3 3
4 1 1 1 4

0 1 2 3
3 1 2 0
3 1 2 3
0 1 2 3

আদর্শ না

1 1 1 1
3 3 3 3
2 2 2 2
0 0 0 0

2 1 0 4 3
3 4 2 0 1
4 2 1 3 0
1 0 3 2 4
0 3 4 1 2

1
"ম্যাট্রিক্স" শব্দটি বিভ্রান্তিমূলক, কারণ লিনিয়ার বীজগণিতের সাথে এটি করার কিছুই নেই। "টেবিল" আরও ভাল হবে (বা সম্ভবত "কেলে টেবিল", তবে আমি মনে করি যে কঠোরভাবে এটি কেবলমাত্র একটি দলের জন্য উপযুক্ত)।
পিটার টেলর

উত্তর:


7

পাইথন 2 , 104 103 102 বাইট

t=input();e=enumerate
[0%(a==A[a]in B>C[B[a]]==t[C[b]][C[a]])for(a,A)in e(t)for(b,B)in e(t)for C in t]

ইনপুট স্থানান্তরিত হয়। আউটপুটটি প্রস্থান কোডের মাধ্যমে হয়, সুতরাং 0 (সাফল্য) সত্য এবং 1 (ব্যর্থতা) মিথ্যা।

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

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

e(t)ইনপুট ম্যাট্রিক্স টি এর গণিত সারিগুলি প্রদান করে - যা অপারেটরকে উপস্থাপন করে as - হিসাবে (সূচক, সারি) জোড়া। for(a,A)in e(t)যেমন, এই ওভার iterates সূচক সংরক্ষণকারী একটি এবং সারি নিজেই একজন , তাই Aজন্য একটি শর্টকাট হয়ে t[a]

প্রাক্তন, for(b,B)in e(t)এবং এর মধ্যে for C in tআমরা কার্টেসিয়ান পাওয়ার টি 3 এর সমস্ত সম্ভাব্য অর্ডারযুক্ত টিপলস (এ, বি, সি) দিয়ে পুনরাবৃত্তি করি ।

এই প্রতিটি টিপলগুলির জন্য, আমরা অভিব্যক্তিটি মূল্যায়ন করি

0%(a==A[a]in B>C[B[a]]==t[C[b]][C[a]])

প্রথমত পৃথক তুলনাগুলির এক বা একাধিক যদি একই কাজ করে তবেই প্রথম বন্ধনীযুক্ত বুলিয়ানটির মান মিথ্যা

  • a==A[a]ব্যর্থ হবে ( a এর কিছু মূল্যের জন্য ) iff ide আদর্শবান নয়।

  • A[a]in Bবিতে ক এর সমস্ত সূচক না থাকলে ব্যর্থ হবে ।

    যেহেতু A এর n সূচক রয়েছে এবং B এর n উপাদান রয়েছে, অ-ব্যর্থতার অর্থ B এর উপাদানগুলি A এর সূচকের সাথে মিলে যায় তাই বন্ধ এবং ডান-বিভাজক।

  • B>C[B[a]] পাইথন 2 সংখ্যাকে পুনরাবৃত্তের তুলনায় "ছোট" বলে বিবেচনা করে, একটি টাউটোলজি।

  • C[B[a]]==t[C[b]][C[a]]যদি value সঠিক-স্ব-বিতরণ না হয় তবে কিছু মূল্যের জন্য ব্যর্থ হবে ।

যদি তুলনাগুলির মধ্যে যে কোনও একটি মিথ্যা প্রদান করে , এক্সপ্রেশনটি (0%...)একটি জিরো ডিভিশনইরির ফেলে দেবে । এছাড়াও, যদি closed বন্ধ না হয় A[a]বা C[b]একটি সূচিপত্রও ফেলে দিতে পারে । উভয় ক্ষেত্রেই প্রোগ্রামটি স্থিতি কোড 1 (ব্যর্থতা) দিয়ে প্রস্থান করে ।

সমস্ত পরীক্ষা পাস হলে প্রোগ্রামটি স্থিতি কোড 0 (সাফল্য) সহ স্বাভাবিকভাবে প্রস্থান করবে ।


6

হাস্কেল, 100 বাইট

এই উত্তরটি ট্রান্সপোজড ইনপুট ব্যবহার করে ।

q m=and$(elem<$>v<*>m)++[a#a==a&&a#b#c==a#c#(b#c)|a<-v,b<-v,c<-v]where v=[0..length m-1];i#j=m!!j!!i

দেখে মনে হচ্ছে আমি ইনফিক্স অপারেটরটিকে আবদ্ধ করার জন্য কোনও প্যাটার্ন গার্ড ব্যবহার করতে পারি না, তাই আমি whereএই ক্ষেত্রে ব্যবহার করছি ।

(প্রথম সংস্করণটি ছিল 108 বাইট তবে আদর্শের পরীক্ষার হাতছাড়া হয়েছে, স্থির সংস্করণটি 120 বাইট ছিল, পরবর্তী সংস্করণগুলিতে 108, 103 এবং 98 বাইট ছিল তবে আমি @ নিমিকে ধন্যবাদ জানাতে পেরেছিলাম যে তারা সমস্ত ভুল ছিল: অবশ্যই আমার ডানটি করতে হবে - যে কোনও বিপজ্জনক !!অপারেশন করার আগে বিভাজ্যতা পরীক্ষা (যা ক্লোজনেসকে বোঝায়) , তবে আমি এখনও আমার বেশিরভাগ গল্ফিং আইডিয়া ব্যবহার করতে পারতাম এবং আরও একটি দিয়ে এটি এখন ১০২ বাইট ছিল, এখন অপারেন্ড ক্রম পরিবর্তন করে উন্নত হয়েছে #(যা যাইহোক ক্ষতিপূরণ দেওয়ার জন্য ভাল স্থানান্তর) এর সহযোগী বাম দিকে আরও ভাল ব্যবহার করতে)

এটি ব্যবহার করুন:

*Main> q [[0,1,2,3],[0,1,3,2],[1,0,2,3],[0,1,2,3]]
False


4

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

a=>!(a.some((b,i)=>b[i]-i)|a.some(b=>[...new Set(b)].sort()+''!=[...b.keys()])||a.some((_,i)=>a.some((_,j)=>a.some((b,k)=>b[a[j][i]]-a[b[j]][b[i]]))))

পূর্ণসংখ্যার কলাম অ্যারের অ্যারে হিসাবে ইনপুট নেয়।


3

গণিত, 122 বাইট

(n_±m_:=#[[m,n]];#&@@Union[Sort/@#]==Range@l==Array[#±#&,l=Length@#]&&And@@Flatten@Array[±##2±#==(#2±#)±(#3±#)&,{l,l,l}])&

খাঁটি ফাংশনটি 2D অ্যারের পূর্ণসংখ্যা (1-ইনডেক্সড) ইনপুট হিসাবে গ্রহণ করে, প্রশ্নে কনভেনশন থেকে সারি এবং কলামগুলি বিপরীত করে এবং ফিরে আসবে Trueবা False। প্রথম লাইনটি বাইনারি ইনফিক্স অপারেশনকে n_±m_কান্ডেল অপারেশন হিসাবে সংজ্ঞায়িত করে ।

একটি lএক্স lঅ্যারের জন্য, বদ্ধ এবং ডান-বিভাজক প্রতিটি সারির সমতুল্য (আমার ক্ষেত্রে) এর কিছু {1, ..., l}অনুক্রম হ'ল, এবং আদর্শবান্ধব হুবহু মূল তির্যক হওয়ার সমতুল্য {1, ..., l}। সুতরাং #&@@Union[Sort/@#]==Range@l==Array[#±#&,l=Length@#]এই তিনটি শর্তের জন্য সনাক্ত করে। (এখানে ব্যবহারের Sort/@#কারণেই আমি সারি এবং কলামগুলিকে অদলবদল করতে পছন্দ করেছি))

ডান বিতরণের জন্য, আমরা আক্ষরিক ব্যবহার করে সমস্ত সম্ভাবনা পরীক্ষা করে দেখি Array[±##2±#==(#2±#)±(#3±#)&,{l,l,l}])। (নোট করুন যে ±##2±#স্বয়ংক্রিয়ভাবে প্রসারিত হয়েছে (#2±#3)±#, যেহেতু ##2তিনটি ভেরিয়েবল খাঁটি ফাংশনটি সজ্জিত হওয়ার জন্য দ্বিতীয় এবং তৃতীয় আর্গুমেন্টের ক্রম প্রতিনিধিত্ব করে)) তারপরে &&And@@Flatten@প্রতিটি পরীক্ষায় উত্তীর্ণ হয়েছে কিনা তা পরীক্ষা করে দেখুন। কিছু অ-বন্ধ ক্ল্যান্ডলগুলির জন্য, ত্রুটিগুলি নিক্ষেপ করা হতে পারে যখন এটি অস্তিত্বহীন ম্যাট্রিক্সের কোনও অংশ অ্যাক্সেস করার চেষ্টা করে তবে সঠিক উত্তরটি এখনও ফিরে আসে।


±m__:=#[[m]];আমি মনে করি. এবং একটি Diagonalঅন্তর্নির্মিত আছে। এবং ±বাম-সাহচর্যমূলক যাতে আপনি ব্যবহার করতে পারেন #2±#±(#3±#)তবে আমি যদি কোনও ভুল না করি তবে পুনরায় সাইন ইন #করা #3এবং করা কম #±#2±#3==#±#3±±##2&। এবং এটির Flatten@সাথে পুরো অংশটি প্রতিস্থাপন করা উচিত(...&~Array~{l,l,l}<>"")
মার্টিন ইন্ডার

আমি ভাবছি আপনি স্থানান্তর করতে আছে যদি l=Lengthমধ্যে Range@lযদিও কারণ যে এক প্রথম মূল্যায়ন করা উচিত, তাই আপনি যদি ফাংশন বারংবার ব্যবহার করেন, আমি মনে করি Rangeএখনও পায় পূর্ববর্তী l, তাই না?
মার্টিন ইন্ডার

0

সি ++ 14, 175 বাইট

নামবিহীন ল্যাম্বদা হিসাবে, ধরে nনেওয়া std::vector<std::vector<int>>এবং রেফারেন্স প্যারামিটারের মাধ্যমে ফিরে আসা। 0 মিথ্যা, অন্য সব কিছুই সত্য।

#define F(x);for(x=-1;++x<s;){
[](auto m,int&r){int s=r=m.size(),a,b,c F(a)auto A=m[a];r*=s==A.size()&&A[a]==a;int u=0 F(b)u|=1<<m[b][a];r*=A[b]<s F(c)r*=m[A[b]][c]==m[A[c]][m[b][c]];}}r*=!(u-(1<<s)+1);}}

অবহেলিত এবং ব্যবহার:

#include<vector>
#include<iostream>

auto f=
#define F(x);for(x=-1;++x<s;){
[](auto m,int&r){
 int s=r=m.size(),a,b,c
 F(a)
  auto A=m[a];               //shortcut for this row
  r*=s==A.size()&&A[a]==a;   //square and idempotet
  int u=0                    //bitset for uniqueness in col
  F(b)
   u|=1<<m[b][a];            //count this item
   r*=A[b]<s                 //closed
   F(c)
    r*=m[A[b]][c]==m[A[c]][m[b][c]];
   }
  }
  r*=!(u-(1<<s)+1);          //check right-divisibility
 }
}
;

int main(){
 int r;
 std::vector<std::vector<int>>
  A = {
   {0, 0, 1, 1},
   {1, 1, 0, 0},
   {3, 3, 2, 2},
   {2, 2, 3, 3},
  },
  B = {
   {0, 2, 3, 4, 1},
   {0, 1, 2, 3, 4},
   {3, 4, 2, 2, 2},
   {3, 3, 3, 3, 3},
   {4, 1, 1, 1, 4},
  };
 f(A,r);
 std::cout << r << "\n";
 f(B,r);
 std::cout << r << "\n";
}

সুপারিশ int a,b,c,u,s=r=m.size()Fপরিবর্তে int s=r=m.size(),a,b,c F, u=0;r*=s==A.size()&&a==A[a]Fপরিবর্তে r*=s==A.size()&&A[a]==a;int u=0 F, r*=s>A[b]Fপরিবর্তে r*=A[b]<s Fএবং ~u+(1<<s)পরিবর্তেu-(1<<s)+1
ceilingcat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.