چلنج باحال از سایت CodeWars شماره 2

سلام و درود.فِرست تینگز فِرست حتما شماره 1 این مقاله رو بخوانید که با سبکش و اینکه کلا جریان این چلنجا چیه بیشتر آشنا بشید.یه چلنج کوتاه و مفید گیرم آمد گفتم با شما هم در میان بزارم خوبی چلنج های kyu 8 یا kyu 7 یا حتی kyu 6 اینه که باعث تقویت پایه زبان میشه معمولا زیاد وارد چیز های پیچیده نمیشه و به مرور زمان این باعث میشه که وقتی سراغ مبحث های پیشرفته میرید هم پایه قوی تری دارید و هم قدرت حل مسئله شما بیشتره.چلنج شماره ۱برای حل این چلنج به چه چیزایی نیازه؟FUNDAMENTALS => چیزهای پایه ایBASIC LANGUAGE FEATURES =>قابلیت های پایه ای زبانLOOPS => لوپ یا حلقه هاCONTROL FLOW => همون ایف اِلس خودمانخب حالا چلنج چه میگهاسم چلنج: Fix string caseدرجه سختی: kyu 7فکر کن که یه string یا یه کلمه داری که بعضی از حرف هاش بزرگ و بعضی هاشم کوچیکن مثل:coDEحلا تو یه برنامه بنویس که با کم ترین تغییر بقیه حروف هم به همون شکل تغییر بده و اگه مساوی بود تمام حروف رو کوچیک کن.این متن ترجمه شده سایته خودم اینجوری برای خودم به این صورت ساده ترش کردم که اگه بیشتر حروف بزرگ بودن بقیه حروف هم بزرگ کن و اگه بیشترشان کوچیک بودن بقیرو هم کوچیک کن و اگه مساوی بودن هم طبق گفته خود چلنج همه حروف رو کوچیک کن بزار چنتا مثال برنم:اگه تعداد بزگا بیشتر بود: CODe => CODEاگه تعداد کوچیکا بشتر بود: codE => codeو اگه مساوی بودن: DOde => codeخب همینطور که کار برنامه نویس حل مسئلس و از 100 درصد کار فقط 10 درصدش مربوط میشه به کد نویسی پس ما هم میریم سراغ چرک نویسچرک نویسstring -> mixed of upper and lower string -->convert all of them to upper => if most of them upper -->convert all of them to lower => if most of them lower -->convert all of them to lower => if (upper = lower) =============================================================== coDe => code lower > upper CODe => CODE upper > lower COde => code equal ================================================================ loop if upper was bigger -> upper++ else lower++ if upper > lower => loop -> all to upper else if upper < lower => loop -> all to lower else upper = lower => loop -> all to lowerتوضیح چرک نویسخب توی قسمت اول چرک نویس ما تمام چیزایی که از صورت سوال فهمیدیم رو می نویسیماینکه اگه حروف بزرگ بیشتر باشه چه بشه اگه کوچیکا بشتر باشن و الا آخرتوی قسمت دوم خودم همیشه مثال هارو می نویسمو توی قسمت سوم هم راه حلی که به ذهنم برای حل این چلنج رسیده و اینکه از چه چیز هایی استفاده کنم مثل لوپ یا ایف السحل چلنج#include <string> #include<iostream> using namespace std; // the main code string solve(const string& str){ int upperCount = 0, lowerCount = 0, strLength; string newStr; //length of str strLength = str.length(); //counting the lower and upper cases for(int i = 0; i < strLength; i++){ if(str[i] == toupper(str[i])){ upperCount++; } else{lowerCount++;} } //what to do if lower is bigger or smaller or equal 18 if(upperCount > lowerCount){ for(int i = 0; i < strLength; i++){ newStr += toupper(str[i]); } } else if(upperCount < lowerCount){ for(int i = 0; i < strLength; i++){ newStr += tolower(str[i]); } } else{ for(int i = 0; i < strLength; i++){ newStr += tolower(str[i]); } } return newStr; } //the main function we call the function that we've made to do the job int main(){ string str = &quotcoDE&quot cout <<solve(str); return 0; }توضیح راه حلخب به ترتیب از خط 1 تا 3 ما library(کتابخانه) و namespace رو داریم کتابخانه ها که یک سری کد ها هستن که یه بنده خدایی قبلن زحمتشو کشیده یا یه سری قابلیت هاست که اگه بخوایم ازشان استفاده کنیم باید اول با استفاده از <>include# اونارو صدا بزنیم و بکار بگیریم namespace هم توضیح زیاد نمیدم ولی بعضی از keuword ها برای استفاده به عنوان مثال cout نیاز داره که ::std پشتت قرار بگیره خب ما اینجا از namespace استفاده میکنیم خب توی خط 5 ما function اصلی رو مینویسیم که قراره تمام کارارو انجام بده و توی main صدا زده بشه این function اسمش solve یه string میگیره و یه string هم تحویل میدهتوی خط 6 ما 3 تا int میسازیم به اسم های lowerCount, upperCount که تعداد حروف کوچیک و بزرگ توی اینا ذخیره میشه و همیچنین strLength که طول string توش ذخیره میشهو توی خط 7 هم یه string جدید که تمام تغییراتی که میخایم اینجام بدیم رو توش کپی کنیم بعدا هم ما این string رو تحویل میدیم یا return میکنیمخب توی خط 9 همینطور که توی خب 8 کامنت گفته ما سایز یا طول string رو توی strLength که قبلا ساخته بودیم ذخیره میکنیمتوی خط 11 هم یه for loop میسازیم که به ترتیب حروف رو چک میکنه و با if else داخلش تعداد حروف بزرگ و کوچیک رو توی upperCount و lowerCount ذخیره میکنهتوی خط 18 میگیم که اگه تعداد بزرگا بیشتر بود به ترتیب حروف رو بزرگ کن و توی newStr که بعدا قراره تحویل بدیم ذخیره کن و توی خط 23 هم هیمکار رو برای حروف کوچیک انجام بدهو توی خط 28 اگه حروف مساوی بودن همرو به ترتیب کوچیک و در newStr ذخیره کنو در آخر هم newStr رو تحویل main بده و main هم کلمه مورد نظر رو توی function میزاره و جواب رو پرینت میکنه.روش های دیگه برای حل این چلنج#include <string> #include <numeric> #include <cctype> std::string solve(std::string str) { bool bLower = str.size() <= 2 * std::count_if(str.cbegin(), str.cend(), ::islower); std::transform(str.begin(), str.end(), str.begin(), [&] (auto x) { return bLower ? std::tolower(x) : std::toupper(x); }); return std::move(str); }#include <string> #include <cctype> std::string solve(const std::string& str){ std::string result = str; int count_upper = 0; int count_lower = 0; for(int i=0; i < str.size(); i++){ if(std::isupper(str[i])) count_upper++; else count_lower++; if( (count_upper > (str.size()/2 +1)) || (count_lower >= (str.size()/2 +1) ) ) break; } for(int i=0; i < str.size(); i++) (count_lower < count_upper)? result[i] = toupper(result[i]): result[i] = tolower(result[i]); return result; }#include <algorithm> #include <cctype> #include <string> #include <utility> std::pair<int, int> count_cases(const std::string& str) { int lower = 0, upper = 0; for (const char &c : str) { if (std::isupper(c)) upper++; else if (std::islower(c)) lower++; } return { upper, lower }; } std::string solve(const std::string& str) { auto case_counts = count_cases(str); auto str_cpy = str; if (case_counts.first > case_counts.second) { // upper > lower std::transform(str_cpy.begin(), str_cpy.end(), str_cpy.begin(), ::toupper); } else { // upper < lower || upper == lower std::transform(str_cpy.begin(), str_cpy.end(), str_cpy.begin(), ::tolower); } return str_cpy; }این میم بالایه واقعا حقیقته XDیا علی.