;{codeIsFun}
;{codeIsFun}
خواندن ۵ دقیقه·۴ سال پیش

چلنج باحال از سایت 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

یا علی.

برنامه نویسینرم افزارprogrammingcplusplusعلوم کامپیوتر
If you think you can do a thing or think you can't do a thing, you're right. Henry Ford
شاید از این پست‌ها خوشتان بیاید