যদি আপনি 3x3 গ্রিডটিকে স্ট্রিং হিসাবে এনকোড করে এবং নিয়মিত এক্সপ্রেশন ম্যাচ ব্যবহার করেন তবে কোনও নির্দিষ্ট গ্রিড কনফিগারেশন একটি নির্দিষ্ট রেসিপিটির সাথে মেলে কিনা তা সহজ । চেহারাটির গতি বাড়ানো একটি আলাদা বিষয়, যা আমি শেষ পর্যন্ত আলোচনা করব। আরও তথ্যের জন্য পড়ুন।
পদক্ষেপ 1) স্ট্রিং হিসাবে এনকোড গ্রিড
প্রতিটি ধরণের ঘরে সহজেই একটি চর আইডি দিন এবং এই ক্রমের সাথে পাশাপাশি প্রতিটি জিনিসকে সম্মিলিত করুন:
123
456 => 123456789
789
এবং আরও দৃ example় উদাহরণ হিসাবে, স্টিকের রেসিপিটি বিবেচনা করুন, যেখানে ডাব্লু কাঠের জন্য দাঁড়িয়ে আছে এবং ই একটি খালি ঘর (আপনি কেবল খালি চর ব্যবহার করতে পারেন):
EEE
WEE => EEEWEEWEE
WEE
পদক্ষেপ 2) নিয়মিত এক্সপ্রেশন (বা স্ট্রিং.ডাটাতে কিছুটা প্রসেসিংয়ের সাথে যুক্ত) ব্যবহার করে রেসিপি ম্যাচ করুন
উপরের উদাহরণ থেকে অবিরত, এমনকি আমরা চারপাশে গঠনটি সরিয়ে নিলেও, স্ট্রিংটিতে এখনও একটি প্যাটার্ন রয়েছে (উভয় পক্ষের E দ্বারা প্যাড করা WEW):
EEW
EEW => EEWEEWEEE
EEE
সুতরাং আপনি লাঠিটি যেখানেই সরিয়ে নিয়ে যান না কেন এটি নিচের নিয়মিত অভিব্যক্তির সাথে মিলবে: /^E*WEEWE*$/
নিয়মিত প্রকাশগুলি আপনাকে উল্লেখ করা শর্তাধীন আচরণ করতে দেয়। উদাহরণস্বরূপ (তৈরি রেসিপি), যদি আপনি একই ফল দেওয়ার জন্য লোহা বা পাথরের তৈরি একটি পিক্সেস চান, তবে :
III SSS
EWE or EWE
EWE EWE
আপনি উভয়কে নিয়মিত প্রকাশের সাথে একত্রিত করতে পারেন: /^(III)|(SSS)EWEEWE$/
অনুভূমিক ফ্লিপগুলিও ঠিক সহজেই যুক্ত করা যায় (অপারেটরটিও ব্যবহার করে)।
সম্পাদনা করুন: যাইহোক, রেজেক্স অংশটি কঠোরভাবে প্রয়োজনীয় নয়। সমস্যাটিকে একক অভিব্যক্তিতে ছড়িয়ে দেওয়ার কেবলমাত্র একটি উপায় তবে পরিবর্তনশীল অবস্থানের সমস্যার জন্য আপনি কোনও প্যাডিং স্পেসের গ্রিড স্ট্রিংটি ট্রিম করতে পারেন (বা ই এর উদাহরণটিতে) এবং একটি স্ট্রিং.স কনটেনস () করতে পারেন। এবং একাধিক উপাদান সমস্যা বা মিররযুক্ত রেসিপিগুলির জন্য, আপনি কেবল একই আউটপুট সহ সমস্তগুলি একাধিক (অর্থাত্ পৃথক) রেসিপি হিসাবে পরিচালনা করতে পারেন।
পদক্ষেপ 3) গতি বাড়িয়ে দেখুন
অনুসন্ধান হ্রাস করার ক্ষেত্রে, আপনাকে একসাথে গ্রুপের রেসিপিগুলিতে কিছু ডেটা স্ট্রাকচার তৈরি করতে হবে এবং অনুসন্ধানে সহায়তা করতে হবে। গ্রিডটিকে স্ট্রিং হিসাবে চিকিত্সা করার কিছু সুবিধা এখানে রয়েছে :
আপনি প্রথম কোনও শূন্য অক্ষর এবং সর্বশেষ খালি অক্ষরের মধ্যবর্তী দূরত্ব হিসাবে কোনও রেসিপিটির "দৈর্ঘ্য" সংজ্ঞায়িত করতে পারেন। একটি সাধারণ Trim().Length()
আপনাকে এই তথ্য দেবে। রেসিপিগুলি দৈর্ঘ্য অনুসারে ভাগ করা যায় এবং অভিধানে সংরক্ষণ করা যেতে পারে।
অথবা
"দৈর্ঘ্যের" একটি বিকল্প সংজ্ঞা খালি খালি অক্ষরের সংখ্যা হতে পারে। আর কিছুই বদলায় না। আপনি এই মানদণ্ড অনুসারে রেসিপিগুলিও গ্রুপ করতে পারেন।
যদি পয়েন্ট নম্বর 1 পর্যাপ্ত না হয় তবে রেসিপিগুলিতে প্রথমে যে উপাদানটি প্রদর্শিত হবে প্রথম ধরণের ধরণের দ্বারাও আরও গ্রুপ করা যেতে পারে। এটি করা যেমন সহজ হবে Trim().CharAt(0)
(এবং খালি স্ট্রিংয়ের ফলে ট্রিমের বিরুদ্ধে রক্ষা করা)।
সুতরাং উদাহরণস্বরূপ আপনি একটি রেসিপি সংরক্ষণ করতে হবে:
Dictionary<int, Dictionary<char, List<string>>> _recipes;
এবং লুকিংয়ের মতো কিছু সম্পাদন করুন:
// A string encode of your current grid configuration
string grid;
// Get length and first char in our grid
string trim = grid.Trim();
int length = trim.Length();
char firstChar = length==0 ? ' ' : trim[0];
foreach(string recipe in _recipes[length][firstChar])
{
// Check for a match with the recipe
if(Regex.Match(grid, recipe))
{
// We found a matching recipe, do something with it
}
}