p
একটি (টাইপ ক্লাস পলিমর্ফিক) ফাংশন যা Int
এর তালিকা হিসাবে ক্রমানুসারে গ্রহণ করে এবং একটি নেস্টেড তালিকা যা Int
এর বহুমাত্রিক অ্যারে উপস্থাপন করে ।
যেমন কল করুন p [2,1] [[10,20,30],[40,50,60]]
, তবে টাইপ ডিফল্ট সফল না হলে, আপনাকে :: [[Int]]
ফলাফলের ধরণটি দেওয়ার মতো (উপযুক্তভাবে নেস্ট করা) টাইপ টিকা যুক্ত করতে হতে পারে ।
import Data.List
class P a where p::[Int]->[a]->[a]
instance P Int where p _=id
instance P a=>P[a]where p(x:r)m|n<-p r<$>m,y:z<-sort r=last$n:[p(x:z)<$>transpose n|x>y]
এটি অনলাইন চেষ্টা করুন!
স্বেচ্ছাসেবী গভীরতার নেস্টেড অ্যারেগুলির সাথে গল্ফিংয়ের চ্যালেঞ্জগুলি হাসকেলে কিছুটা বিশ্রী হয়, কারণ স্থির টাইপিংয়ের পথে যেতে থাকে। হাস্কেল তালিকাগুলি (চ্যালেঞ্জের বর্ণনার মতো ঠিক একই সিনট্যাক্স সহ) নেস্ট করা যেতে পারে, বিভিন্ন নীড়ের গভীরতার তালিকা অসঙ্গত প্রকারের। এছাড়াও, স্ট্যান্ডার্ড হাস্কেল পার্সিং ফাংশনগুলির জন্য আপনি যে মানটি পার্স করতে চেষ্টা করছেন তা ধরণের knowing
ফলস্বরূপ, এটি অনিবার্য বলে মনে হয় যে প্রোগ্রামটি টাইপ-সম্পর্কিত ঘোষণাগুলি অন্তর্ভুক্ত করা দরকার যা তুলনামূলকভাবে ভার্জোজ। গল্ফযুক্ত অংশের জন্য, আমি একটি ধরণের শ্রেণি সংজ্ঞায়নের উপর স্থির করেছি P
, যেমন p
অ্যারের প্রকারের চেয়ে বহুগুণ হতে পারে।
এদিকে, টিআইওর পরীক্ষার জোতা পার্সিংয়ের সমস্যাটি সমাধান করার উপায় দেখায়।
কিভাবে এটা কাজ করে
এই অ্যালগরিদমের সারাংশের সংক্ষিপ্তসার হিসাবে: এটি যথোপযুক্ত তালিকার বুদ্বুদ বাছাই সম্পাদন করে, যখন সংশ্লিষ্ট অনুগতি সূচকগুলি অদলবদল করা হয় তখন প্রতিবেশী মাত্রাগুলি স্থানান্তর করে।
class P a
ঘোষণার দ্বারা প্রদত্ত হিসাবে , যে কোনও পরিস্থিতিতে p
দুটি আর্গুমেন্ট, একটি ক্রমশক্তি (সর্বদা টাইপের [Int]
) এবং একটি অ্যারে লাগে ।
- চ্যালেঞ্জের বিবরণে ফর্মটিতে অনুমতি দেওয়া যেতে পারে, যদিও আলগোরিদিম যেভাবে কাজ করে, সূচকগুলির পছন্দটি তাদের আপেক্ষিক আদেশ ব্যতীত স্বেচ্ছাসেবী। (সুতরাং উভয় 0- এবং 1- ভিত্তিক কাজ।)
- বেসটি
instance P Int
মাত্রা 1 এর অ্যারে পরিচালনা করে, যা p
কেবল অপরিবর্তিত ফিরে আসে, যেহেতু এক মাত্রা কেবল নিজের মধ্যে ম্যাপ করা যায়।
- অন্যটি
instance P a => P [a]
পুনরাবৃত্তভাবে সংজ্ঞায়িত করা হয়, এটি মাত্রা এন + 1 অ্যারেগুলির জন্য সংজ্ঞায়িত করতে ডায়মেনশন এন সাববারিকে p
সাথে কল করে।
p(x:r)m
প্রথমে p r
প্রতিটি উপাদানকে পুনরাবৃত্তভাবে কলগুলি m
, ফলাফল অ্যারে প্রদান করে n
যার মধ্যে প্রথমটি ব্যতীত সমস্ত মাত্রা একে অপরের সাথে তুলনামূলকভাবে সঠিকভাবে অনুমতি দেওয়া হয়েছিল।
- অবশিষ্ট ক্রমুটিশন যা সম্পাদন করা প্রয়োজন
n
তা দিয়ে দেওয়া হয়েছে x:y:z = x:sort r
।
- তবে যদি
x<y
এর প্রথম মাত্রা n
ইতিমধ্যে সঠিকভাবে স্থাপন করা হয় এবং n
কেবল ফিরে আসে।
- যদি
x>y
, তবে প্রথম এবং দ্বিতীয় মাত্রার n
অদলবদল করা দরকার যা transpose
ফাংশনটি দিয়ে সম্পন্ন হয় । অবশেষে p(x:z)
ফলাফলের প্রতিটি উপাদানটিতে পুনরাবৃত্তভাবে প্রয়োগ করা হয়, এটি নিশ্চিত করে যে আসল প্রথম মাত্রাটি সঠিক অবস্থানে স্থানান্তরিত হয়।
exec
দুটি বন্ধনী দরকার নেই (দুটি বাইট সংরক্ষণ করা) , কারণ এটি পাইথন ২