হাস্কেল , 228 227 225 224 বাইট
import Data.List
z=zipWith
a!b=div(max(a*a)(a*b))a
l x=z(!)(z(!)x(0:x))$tail x++[0]
s=(\x->length.($x).filter<$>[(>0),(<0)]).nub.(>>=id).(until=<<((==)=<<))((.)>>=id$transpose.map l).z(\i->z(\j x->2^i*j*(2*x-1))[1,3..])[1..]
এটি অনলাইন চেষ্টা করুন!
ব্যাখ্যা:
এই সমাধানের ধারণাটি নিম্নরূপ: প্রতিটি কক্ষে অনন্য মান সহ ম্যাট্রিক্সের সূচনা করুন, এর জন্য ইতিবাচক 1
এবং .ণাত্মক 0
। তারপরে প্রতিটি কক্ষকে তার প্রতিবেশীদের সাথে বারবার তুলনা করুন এবং, যদি প্রতিবেশীর একই চিহ্ন থাকে তবে একটি বৃহত্তর পরম মান সহ একটি নম্বর থাকে তবে প্রতিবেশীর সংখ্যার সাথে ঘরের নম্বরটি প্রতিস্থাপন করুন। একবার এটি একটি নির্দিষ্ট বিন্দুটিকে আঘাত করে, 1
অঞ্চলগুলির সংখ্যার জন্য স্বতন্ত্র ধনাত্মক সংখ্যার সংখ্যা এবং সংখ্যার জন্য স্বতন্ত্র নেতিবাচক সংখ্যা গণনা করুন0
।
কোডে:
s=(\x->length.($x).filter<$>[(>0),(<0)]).nub.(>>=id).(until=<<((==)=<<))((.)>>=id$transpose.map l).z(\i->z(\j x->2^i*j*(2*x-1))[1,3..])[1..]
প্রিপ্রোসেসিং (কোষগুলিতে সংখ্যা নির্ধারণ করা), পুনরাবৃত্তি এবং পোস্টপ্রসেসিং (গণনাকোষের কক্ষ )গুলিতে পৃথক করা যায়
প্রাক-প্রক্রিয়াকরণ
প্রিপ্রোসেসিং অংশটি হ'ল ফাংশন
z(\i->z(\j x->2^i*j*(2*x-1))[1,3..])[1..]
যা কয়েকটি বাইট শেভ করার z
জন্য সংক্ষেপণ হিসাবে ব্যবহার করে zipWith
। আমরা এখানে যা করি তা হ'ল সারিগুলিতে পূর্ণসংখ্য সূচক এবং কলামগুলিতে বিজোড় পূর্ণসংখ্যার সূচকগুলি সহ দুটি মাত্রিক অ্যারে জিপ করা। আমরা এটি করি যেহেতু আমরা এক জোড়া পূর্ণসংখ্যার থেকে একটি অনন্য পূর্ণসংখ্যার তৈরি করতে পারি(i,j)
সূত্রটি ব্যবহার করে আমরা(2^i)*(2j+1)
। যদি আমরা কেবলমাত্র বিজোড় পূর্ণসংখ্যার উত্পাদন করি তবে আমরা তিনটি বাইট সংরক্ষণ j
করে 2*j+1
, গণনা এড়াতে পারি ।
অনন্য সংখ্যা সহ, আমাদের কেবলমাত্র ম্যাট্রিক্সের মানের উপর ভিত্তি করে একটি চিহ্নটিতে গুণ করতে হবে, যা হিসাবে প্রাপ্ত 2*x-1
পুনরাবৃত্তির
পুনরাবৃত্তি দ্বারা সম্পন্ন হয়
(until=<<((==)=<<))((.)>>=id$transpose.map l)
ইনপুটটি তালিকার তালিকার আকারে হওয়ায় আমরা প্রতিটি সারিতে প্রতিবেশী তুলনা সম্পাদন করি, ম্যাট্রিক্স স্থানান্তর করি, প্রতিটি সারিতে আবার তুলনা করি (যা ট্রান্সপোসের কারণে কলামগুলি আগে ছিল) আবার ট্রান্সপোজ করি। এই পদক্ষেপগুলির একটি সম্পাদন করে এমন কোডটি
((.)>>=id$transpose.map l)
l
তুলনা ফাংশন কোথায় (নীচে বিস্তারিত) এবং transpose.map l
তুলনা এবং স্থানান্তর পদক্ষেপের অর্ধেক সম্পাদন করে। অপারেটর অগ্রাধিকার নিয়মের কারণে (.)>>=id
এক্ষেত্রে পয়েন্টফ্রি ফর্ম \f -> f.f
এবং এক বাইট আরও খাটো করে তার যুক্তিটি দু'বার সম্পাদন করে ।
l
উপরের সারিতে হিসাবে সংজ্ঞায়িত করা হয়েছে l x=z(!)(z(!)x(0:x))$tail x++[0]
। এই কোডটি (!)
প্রথমে তার বাম প্রতিবেশী এবং তার ডান প্রতিবেশীর সাথে প্রতি কক্ষের তুলনামূলক অপারেটর (নীচে দেখুন) সঞ্চালন করে, x
ডান স্থানান্তরিত তালিকার সাথে তালিকায় জিপ করে 0:x
এবং বাম স্থানান্তরিত তালিকার tail x++[0]
পরিবর্তে। স্থানান্তরিত তালিকাগুলি প্যাড করতে আমরা জিরো ব্যবহার করি, যেহেতু তারা প্রিপ্রোসেসড ম্যাট্রিক্সে কখনই না ঘটে।
a!b
উপরের সারিতে এটি হিসাবে সংজ্ঞায়িত করা হয়েছে a!b=div(max(a*a)(a*b))a
। আমরা এখানে যা করতে চাই তা নীচের ক্ষেত্রে পার্থক্য:
- যদি
sgn(a) = -sgn(b)
, ম্যাট্রিক্সে আমাদের দুটি বিপরীত অঞ্চল রয়েছে এবং সেগুলি একত্রিত করতে চান না, তাই a
অপরিবর্তিত থাকে
- যদি
sgn(b) = 0
, আমাদের কোণার কেস থাকে যেখানে b
প্যাডিং হয় এবং তাই a
অপরিবর্তিত থাকে
- যদি
sgn(a) = sgn(b)
, আমরা দুটি ক্ষেত্রকে একীভূত করতে চাই এবং একটিকে বৃহত্তর পরম মানের (সুবিধার জন্য) নিয়ে যাই।
নোট যে sgn(a)
কখনও হতে পারে না 0
। আমরা প্রদত্ত সূত্রটি দিয়ে এটি সম্পন্ন করি। যদি এর লক্ষণগুলি a
এবং b
পৃথক a*b
হয় তবে শূন্যের a*a
তুলনায় কম বা সমান, যখন সর্বদা শূন্যের চেয়ে বড় হয়, তাই আমরা এটিকে সর্বাধিক হিসাবে বেছে নিয়ে a
ফিরে আসার জন্য ভাগ করে নিই a
। অন্যথায়, max(a*a)(a*b)
হয় abs(a)*max(abs(a),(abs(b))
, এবং এর দ্বারা ভাগ করে a
, আমরা পাই sgn(a)*max(abs(a),abs(b))
যা বৃহত্তর পরম মান সহ সংখ্যা।
((.)>>=id$transpose.map l)
কোনও নির্দিষ্ট স্থানে পৌঁছানো পর্যন্ত ফাংশনটি পুনরাবৃত্তি করতে আমরা ব্যবহার করি (until=<<((==)=<<))
, যা এই স্ট্যাকওভারফ্লো উত্তর থেকে নেওয়া হয়েছে ।
পোস্ট প্রসেসিং
পোস্টপ্রসেসিংয়ের জন্য, আমরা অংশটি ব্যবহার করি
(\x->length.($x).filter<$>[(>0),(<0)]).nub.(>>=id)
যা কেবলমাত্র পদক্ষেপের সংগ্রহ।
(>>=id)
তালিকাগুলির তালিকাকে একক তালিকায় স্কোয়াশ করে
nub
ডাবল থেকে মুক্তি
(\x->length.($x).filter<$>[(>0),(<0)])
পেয়ে তালিকার একজোড়া তালিকায় পার্টিশন দেয়, একটি ইতিবাচক এবং একটি নেতিবাচক সংখ্যার জন্য এবং তার দৈর্ঘ্য গণনা করে।
[[1,0];[0,1]]
যাতে নিশ্চিত হয়ে নিন যে তির্যক সংযোগটি অন্তর্ভুক্ত নয়