پاسخ سوال جاستیفای کوئرا
در این نوشته تمرین “جاستیفای” که در وبسایت کوئرا موجود است را برای شما کاربران عزیز حل کردهایم.
پاسخ سوال جاستیفای کوئرا
امین یک متن حاوی کلمه دارد و میخواهد آنها را مرتب کند برای این کار یک عدد صحیح w انتخاب کرده و میخواهد آن را در سطرهایی که ظرفیت حداکثر w کاراکتر دارند، بنویسد. برای نوشتن این کلمات به ترتیب داده شده آنها را یادداشت میکنیم. از کلمه اول شروع کرده و آن را در ابتدای سطر اول مینویسیم. از آن به بعد برای هر کلمه اگر تونستیم آن را با حفظ یک فاصله (یک کاراکتر space یا ' '
) از کلمه قبل در همان سطر بنویسیم (با توجه به ظرفیت آن سطر) این کار را انجام میدهیم و در غیر این صورت کلمه در ابتدای سطر بعدی نوشته خواهد شد و این روند ادامه پیدا میکند. میخواهیم اشکالاتی که در کوچک یا بزرگ بودن حروف وجود دارد را برطرف کنیم. یعنی همه حروف نوشته شده باید کوچک شوند به جز حرف اولِ کلمهی اول جملات. میدانیم که جملات با کلماتی ختم میشوند که در انتهای آنها .
، ؟
یا !
داشت. حال میخواهیم همه این سطرها را جاستیفای کنیم! یعنی تعداد تقریباً مساوی فاصله بین کلمات هر سطر قرار دهیم تا کلمهی آخر هر سطر به انتهای آن سطر برسد. اگر یک کلمه در یک سطر شود، آن را در ابتدای سطر مینویسیم و بقیه سطر را با کاراکتر space پرکنیم. در غیر این صورت فرض کنید کلمه در یک سطر داشتیم. میخواهیم در بین m-1 فاصله ایجاد شده توسط این کلمه تعدادی کاراکتر space قرار دهیم به طوری که اختلاف تعداد spaceهای موجود در این فواصل حداکثر برابر یک شود، همچنین کلمه آخر به انتهای سطر برسد. به عبارت دیگر برای هر سطر عددی مانند k وجود دارد که فاصله بین کلمات آن سطر همگی یا k + 1 شود. فرض کنید برای اینکار باید r از فاصلهها k + 1 اسپیس، و m-1-r تا k تا اسپیس داشت، میخواهیم تا از فواصل k + 1تایی بین کلمات ابتدایی سطر قرار گرفته و تا از فواصل k + 1تایی بین کلمات انتهایی سطر شود. در نهایت تعداد کاراکترهای چاپ شده در هر سطر باید دقیقاً w شود. با احتساب فاصلهها (یا همان spaceها)
ورودی سوال جاستیفای
در ورودی به شما t مثال داده میشود.
در هر مثال در سطر اول عدد n و عدد w داده میشود و در سطر دوم کلمه با فاصله از هم داده میشود.
هر کلمه رشته حداکثر ۲۰ کاراکتری است که از حروف کوچک و بزرگ انگلیسی تشکیل شده است، به انتهای برخی از کلمات حداکثر یکی از کاراکترهای .
یا ؟
یا !
یا,
چسبیده است. تضمین میشود آخرین کلمه با یکی از کاراکترهای .
یا ؟
یا !
ختم میشود. تضمین میشود مقدار w از طول بزرگترین کلمه داده شده در هر مثال کمتر نخواهد بود.
خروجی سوال جاستیفای
خروجی خواسته شده در مسئله را مطابق مثالها چاپ کنید. برای نشان دادن ابتدا و انتهای خطوط از کارکتر |
مطابق با مثالها استفاده کنید.
حل سوال
#include <iostream> #include <cctype> #include <vector> #include <cmath> using namespace std; int main() { int t, n, w; cin >> t; for(int i=0; i<t; i++) { vector<string> satr; cin >> n >> w; string word[n]; for(int j=0; j<n; j++) cin >> word[j]; bool sentenceFirst = true; for(int j=0; j<n; j++) { word[j][0] = sentenceFirst ? toupper(word[j][0]) : tolower(word[j][0]); sentenceFirst = false; for(int k=1; k<word[j].length(); k++) word[j][k] = tolower(word[j][k]); char rchar = word[j].back(); if(rchar == '!' || rchar == '?' || rchar == '.') sentenceFirst = true; } int findex = 0; int len = 0; for(int j=0; j<n; j++) { if(len + word[j].length() == w) { string s = ""; for(int k=findex; k<j; k++) { s += word[k] + " "; } s += word[j]; satr.push_back(s); findex = j+1; len = 0; } else if(len + word[j].length() < w) { len += word[j].length() + 1; } else { string s = ""; int m = j - findex; len -= m; if(m == 1) { s = word[j-1]; for(int k=0; k<w-len; k++) s += " "; satr.push_back(s); findex = j; len = 0; j--; continue; } int e = (w - len); int r = e % (m-1); int fasele = e/(m-1); int space[m-1]; for(int k=0; k<m-1; k++) { if(k < floor(r/2.0) || m-1-k <= ceil(r/2.0)) space[k] = fasele+1; else space[k] = fasele; } for(int k=findex; k<j-1; k++) { s += word[k]; for(int l = 0; l<space[k-findex]; l++) s += " "; } s += word[j-1]; satr.push_back(s); findex = j; len = 0; j--; } } string s = ""; int m = n - findex; len -= m; if(m == 1) { s = word[n-1]; for(int k=0; k<w-len; k++) s += " "; satr.push_back(s); } else if(m > 1) { int e = (w - len); int r = e % (m-1); int fasele = e/(m-1); int space[m-1]; for(int k=0; k<m-1; k++) { if(k < floor(r/2.0) || m-1-k <= ceil(r/2.0)) space[k] = fasele+1; else space[k] = fasele; } for(int k=findex; k<n-1; k++) { s += word[k]; for(int l = 0; l<space[k-findex]; l++) s += " "; } s += word[n-1]; satr.push_back(s); } for(string aSatr : satr) { cout << "|" << aSatr << "|" << endl; } } return 0; }
منبع سوال: وبسایت کوئرا
اگر روش حل بهتری برای “تمرین جاستیفای” دارید برای ما ارسال کنید تا با نام خودتان به اشتراک بگذاریم. اگر سوال خاصی را مدنظر دارید در بخش نظرات برای ما ارسال کنید تا حل آن سوال را در اولویت محتوای سایت بگذاریم.
ارسال پاسخ