কোনও ম্যাট্রিক্স টোপলিটজ ম্যাট্রিক্স কিনা তা পরীক্ষা করুন


11

আপনাকে দ্বি-মাত্রিক অ্যারে এবং একটি নম্বর দেওয়া হবে এবং আপনাকে প্রদত্ত ম্যাট্রিক্স টোপলিটজ কিনা তা জানতে আপনাকে জিজ্ঞাসা করা হবে ।

ছক পূরণ করা:

আপনাকে একটি ফাংশন দেওয়া হবে যা two-dimensionalম্যাট্রিক্সকে যুক্তি হিসাবে গ্রহণ করবে ।

আউটপুট ফরমেট:

1ম্যাট্রিক্স টোপলিটজ হলে ফাংশন থেকে ফিরে আসুন , অন্যথায় ফিরে আসুন -1

সীমাবদ্ধতাসমূহ:

3 < n,m < 10,000,000

nসারিগুলির সংখ্যা কোথায় mএবং কলামগুলির সংখ্যা হবে।

নমুনা পরীক্ষার কেস:

Sample Input :
4 
5
6 7 8 9 2
4 6 7 8 9
1 4 6 7 8
0 1 4 6 7 

Sample Output : 
1 

স্কোরিং

এটি , তাই বাইটের মধ্যে সংক্ষিপ্ত উত্তর ins


8
এটি একটি ভাল চ্যালেঞ্জ, তবে আমরা এখানে ল্যাক্সার I / O প্রয়োজনীয়তা পছন্দ করি। আমি উভয় প্রোগ্রাম এবং ফাংশন ডিফল্ট হিসাবে অনুমতি দেওয়ার পরামর্শ দেব । এবং সত্য / মিথ্যা বা আউটপুট হিসাবে 1/0 অনুমতি দেওয়ার জন্য, বা সম্ভবত কোনও দুটি ধারাবাহিক স্বতন্ত্র ফলাফল আউটপুট হিসাবে বিবেচনা করা পছন্দ হিসাবে মনে হয় ।
xnor

15
এছাড়াও, টোপলিটজ-এর একটি সংজ্ঞা ভাল হবে, যেমন-টোপলিটজ-সহ আরও পরীক্ষার কেস হবে। কোড যুক্ত করার বিষয়ে আপনার অর্থ কী তা নিশ্চিত নয়।
xnor

5
আমি মনে করি আপনার অবশ্যই এন, এম এর সর্বাধিক মান হ্রাস করতে হবে । অন্যথায় এই চ্যালেঞ্জের মূল অংশটি হল 1 টেরাবাইট ম্যাট্রিক্স প্রক্রিয়া করার উপায় খুঁজে পাওয়া।
স্টিভি গ্রিফিন

1
ম্যাট্রিক্স উপাদানগুলি সর্বদা অ-নেতিবাচক পূর্ণসংখ্যার হবে?
মার্টিন এন্ডার

উত্তর:


7

গণিত, 42 বাইট

2Boole[#==ToeplitzMatrix[#&@@@#,#&@@#]]-1&

কোনও কিছু টোপলিটজ ম্যাট্রিক্স কিনা তা যাচাই করার জন্য ম্যাথামেটিকার অন্তর্নির্মিত কিছু নেই তবে এটি তৈরি করার জন্য বিল্ট-ইন রয়েছে। সুতরাং আমরা ইনপুটটির প্রথম কলাম ( #&@@@#) এবং প্রথম সারি ( #&@@#) থেকে একটি উত্পন্ন করি এবং এটি ইনপুট সমান কিনা তা পরীক্ষা করি। True/ Falseফলাফলটিকে 1/ এ -1আমরা রূপান্তর করতে Boole(দিতে 1বা দিতে 0) এবং তারপরে কেবল ফলাফলটি রূপান্তর করে 2x-1


6

অক্টাভা , 30 বাইট

আমি ধরে নিচ্ছি যে চ্যালেঞ্জটিতে বলা হয়েছে যে আমাকে 1,000,000x1,000,000 ম্যাট্রিকগুলি হ্যান্ডেল করতে হবে না। এটি এমন ম্যাট্রিক্সের জন্য কাজ করে যা উপলব্ধ মেমরির চেয়ে বেশি নয় (আমার ক্ষেত্রে 1 টিবি-র কম নয়)।

@(x)x==toeplitz(x(:,1),x(1,:))

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

এটি xইনপুট হিসাবে একটি ম্যাট্রিক্স গ্রহণ করে এবং প্রথম কলামে এবং প্রথম সারিতে মানগুলির উপর ভিত্তি করে একটি টোপলিটজ ম্যাট্রিক্স তৈরি করে। এটি তারপরে সাম্যতার জন্য ম্যাট্রিকের প্রতিটি উপাদান চেক করবে। যদি সমস্ত উপাদান সমান হয় তবে ইনপুটটি টোপলিটজ ম্যাট্রিক্স।

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

সম্পাদনা:

কেবলমাত্র কঠোর আউটপুট ফর্ম্যাটটি লক্ষ্য করেছেন:

এটি 41 বাইটের জন্য কাজ করে। এই সংস্করণটি থেকে একটি বা দুটি বাইট গল্ফ করা সম্ভব হতে পারে তবে আমি আশা করি আউটপুট নিয়মগুলি কিছুটা শিথিল করা হবে।

@(x)2*(0||(x==toeplitz(x(:,1),x(1,:))))-1



4

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

f(a:b:t)|init a==tail b=f$b:t|1>0= -1
f _=1

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


ডাং, এটি আবারও জটিল করে তুলছে। কৌতূহলজনকভাবে, আমি এটিকে সত্যতা / মিথ্যা আউটপুট দিয়ে 39 বাইটে নামি, তাই টপলিটজ = যদি Falseঅনুমতি দেওয়া হত তবে আমি এটি একটি বাইট দ্বারা পরাজিত করতে পারি।
janrjan জোহানসেন

3

গণিত, 94 বাইট

l=Length;If[l@Flatten[Union/@Table[#~Diagonal~k,{k,-l@#+1,l@#[[1]]-1}]]==l@#+l@#[[1]]-1,1,-1]&

ইনপুট

{6, 7, 8, 9, 2 2, {4, 6, 7, 8, 9}, {1, 4, 6, 7, 8}, {0, 1, 4, 6, 7}

স্টিভি গ্রিফিনের অ্যালগরিদমের উপর ভিত্তি করে অন্য একটি

গণিত, 44 বাইট

If[#==#[[;;,1]]~ToeplitzMatrix~#[[1]],1,-1]&

2
আপনার কি সংজ্ঞা দেওয়া দরকার s? আপনি কেবল #পরিবর্তে ব্যবহার করতে পারবেন না ?
একটি গাছ নয়

হ্যাঁ! তুমি ঠিক!
J42161217

3

জাভা 7, 239 233 220 113 বাইট

int c(int[][]a){for(int i=a.length,j;i-->1;)for(j=a[0].length;j-->1;)if(a[i][j]!=a[i-1][j-1])return -1;return 1;}

-107 করার জন্য একটি আরো দক্ষ এলগরিদম ধন্যবাদ ব্যবহারের একটি টিপ পরে বাইট @Neil

ব্যাখ্যা:

এখানে চেষ্টা করুন।

int c(int[][]a){                // Method with integer-matrix parameter and integer return-type
  for(int i=a.length,j;i-->1;)  //  Loop over the rows (excluding the first)
    for(j=a[0].length;j-->1;)   //   Loop over the columns (excluding the first)
      if(a[i][j]!=a[i-1][j-1])  //    If the current cell doesn't equal the one top-left of it:
        return -1;              //     Return -1
                                //   End of columns loop (implicit / single-line body)
                                //  End of rows loop (implicit / single-line body)
  return 1;                     //  Return 1
}                               // End of method

প্রথম ফাংশনে আর অ্যান্ড সি কী?
মিকি জ্যাক

@ মিকি জ্যাক সারি এবং কলামগুলি ( r= nএবং c= mযদি আপনি এটি চ্যালেঞ্জের সাথে তুলনা করেন)।
কেভিন ক্রুইজসেন

আপনি কি ফাংশনে প্যারামিটার হিসাবে অ্যারেটি পাস করবেন না? এছাড়াও, এর জন্য আরও অনেক কার্যকরী অ্যালগরিদম রয়েছে যা আপনার বাইট গণনাটি প্রায় 50% কেটে দেবে।
নিল

1
@ কেভিনিক্রুজসেন সহজভাবে পরীক্ষা করে দেখুন যে প্রথম সারিতে বা কলামে সমস্ত উপাদান তির্যকভাবে এবং এর থেকে বাম দিকে সমান নয়।
নিল

1
আহ, আপনি এমনকি -->অপারেটর ব্যবহার করতে হবে !
নীল

3

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

t পূর্ণসংখ্যার তালিকার একটি তালিকা নেয় এবং পূর্ণসংখ্যা ফেরত দেয়।

t m=1-sum[2|or$zipWith((.init).(/=).tail)=<<tail$m]

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

এটি সত্য বা মিথ্যা আউটপুট সহ 39 বা 38 বাইট হতে পারে।

ব্যবহার করার ধারণাটি initEmigna এর 05AB1E উত্তরের দ্বারা অনুপ্রাণিত হয়েছিল, যা একটি খুব অনুরূপ পদ্ধতি ব্যবহার করে; তার আগে আমি নেস্টেড জিপিং ব্যবহার করেছি।

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

  • zipWith((.init).(/=).tail)=<<tailএর বিন্দু মুক্ত রূপ \m->zipWith(\x y->tail x/=init y)(tail m)m
  • এটি প্রতিটি পরপর জোড়া সারির সংমিশ্রণ করে m, প্রথম উপাদানটির সাথে প্রথমটি সরানো প্রথম উপাদানটিকে অপসারণের সাথে দ্বিতীয় থেকে আলাদা কিনা তা পরীক্ষা করে।
  • orতারপর সকল সারি বিদ্যমান জোড়া জন্য চেক সম্মিলন।
  • 1-sum[2|...] আউটপুট ফর্ম্যাট রূপান্তর করে।

2

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

a=>a.some((b,i)=>i--&&b.some((c,j)=>c-a[i][j-1]))?-1:1

বা আপনার নিজস্ব কৌশলটি ব্যবহার করে : a=>a.some(b=>b.some((v,i)=>d[i]-(d[i]=v),d=[,...d]),d=[])?-1:1(62 বাইট)
আর্নল্ড

1
@ আর্নল্ড ধন্যবাদ, তবে দেখা যাচ্ছে যে আমি আবারও সমস্যার অতিরিক্ত চিন্তা-ভাবনা করছিলাম ...
নীল

2

রুবি , 54 বাইট

->a,b,m{m.reduce{|x,y|x[0..-2]==y[1,b]?y:[]}.size<=>1}

নির্দিষ্ট হিসাবে নির্দিষ্ট হিসাবে, নমনীয় ইনপুট / আউটপুট গ্রহণ করা হলে আরও গল্ফ করা যায়।

ব্যাখ্যা:

ম্যাট্রিক্সে পরিমার্জন করুন এবং উপরের রেখার সাথে প্রতিটি রেখার তুলনা করুন, এক এক করে ডানে স্থানান্তরিত। যদি সেগুলি পৃথক হয় তবে পরবর্তী পুনরাবৃত্তির জন্য একটি খালি অ্যারে ব্যবহার করুন। শেষে, চূড়ান্ত অ্যারেটি ফাঁকা থাকলে -1 প্রত্যাবর্তন করুন, বা কমপক্ষে 2 টি উপাদান থাকলে 1 টি (যেহেতু ক্ষুদ্রতম সম্ভাব্য ম্যাট্রিক্স 3x3 হয়, সমস্ত তুলনা যদি সত্য হয় তবে এটি সত্য)

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


<=>রেজাল্ট গণনা করতে ভাল ব্যবহার !
নিল

কীভাবে |(*x,_),y|আপনার টুকরো টুকরো করার দরকার নেই x?
স্টিফান পোচম্যান

1

পিএইচপি, 70 বাইট

<?=!preg_match('/\[([\d,]+?),\d+\],\[\d+,(?!\1)/',json_encode($_GET));

1

পাইথন, 108

r=range
f=lambda x,n,m:all([len(set([x[i][j] for i in r(n) for j in r(m) if j-i==k]))==1 for k in r(1-n,m)])

কার্যকরী নয়, কারণ এটি প্রতিটি উপাদান n+mসময়গুলিতে স্পর্শ করে যখন তির্যকগুলি ফিল্টার করে । তারপরে তির্যক প্রতি একাধিক অনন্য উপাদান রয়েছে কিনা তা পরীক্ষা করে দেখুন।


1

এক্সিয়াম, 121 বাইট

f(m)==(r:=nrows(m);c:=ncols(m);for i in 1..r-1 repeat for j in 1..c-1 repeat if m(i,j)~=m(i+1,j+1)then return false;true)

m কে এমন কিছু উপাদানের ম্যাট্রিক্স হতে হবে যা allow = কে অনুমতি দেয়; উচ্ছৃঙ্খল

f m ==
  r := nrows(m)
  c := ncols(m)
  for i in 1..(r - 1) repeat
    for j in 1..(c - 1) repeat
      if m(i,j)~=m(i + 1,j + 1)     then return(false)
  true

1

রেটিনা , 148 বাইট

m(1`\d+
$*#
1`#\n\d+\n
@
+`(#*)#@([^#\n]*(#*)\n)(.*)$
$1# $2$1@$4 #$3
@

+`##
# #
+(+s`^(\d+)\b(.*)^\1\b
$1$2#
s`.*^\d.*^\d.*
-1
)%`^[^- ]+ ?

\s+
1

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

একটি এন × এম ইনপুট ম্যাট্রিক্স

6 7 8 9 2 0
4 6 7 8 9 2
1 4 6 7 8 9
0 1 4 6 7 8

এইভাবে ত্রিভুজগুলি সারিবদ্ধ করে প্রথমে একটি N × (N + M-1) ম্যাট্রিক্সে রূপান্তর করা হয়:

# # # 6 7 8 9 2 0
# # 4 6 7 8 9 2 #
# 1 4 6 7 8 9 # #
0 1 4 6 7 8 # # #

এবং তারপরে প্রথম কলামটিতে বারবার একটি একক অনন্য সংখ্যা রয়েছে কিনা তা পরীক্ষা করা হয় এবং যদি এটি হয় তবে সরিয়ে ফেলা হবে। আউটপুট ফাঁকা থাকলে ম্যাট্রিক্স টোপলিটজ।


ওহ, এটি নেতিবাচক সংখ্যার সাথে কাজ করে না, এটি ঠিক করতে হবে :)
eush77

1

এমএটিএল , 11 বাইট

T&Xd"@Xz&=v

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

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

T&Xd - ইনপুটটির ডায়াগোনালগুলি বের করুন এবং কলাম হিসাবে তাদের সাথে একটি নতুন ম্যাট্রিক্স তৈরি করুন (প্রয়োজনীয়তার সাথে শূন্য সহ প্যাডিং)

" - এটির কলামগুলি দিয়ে পুনরাবৃত্তি করুন

@Xz - পুনরাবৃত্তি পরিবর্তনশীল (বর্তমান কলাম) টিপুন এবং এটি থেকে প্যাডিং (প্যাডিং) জিরোগুলি সরিয়ে দিন

&=- সম্প্রচার সাম্যতা পরীক্ষা - এটি সমস্ত 1 টি (সত্য) দিয়ে একটি ম্যাট্রিক্স তৈরি করে যদি বাকী সমস্ত মান একে অপরের সমান হয়, অন্যথায় ম্যাট্রিক্সে 0 টি রয়েছে যা মিথ্যা

v - একত্রে ফলাফল মানগুলি একসাথে তৈরি করতে, একটি চূড়ান্ত ফলাফল ভেক্টর তৈরি করতে হয় যা হয় সত্যবাদী (সমস্ত 1s) বা মিথ্যা (কিছু 0s)



0

Clojure, 94 বাইট

#(if(=(+ %2 %3 -1)(count(set(for[Z[zipmap][i r](Z(range)%)[j v](Z(range)r)][(- i j)v]))))1 -1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.