پاسخ سوال جاستیفای + کوئرا

پاسخ سوال جاستیفای + کوئرا
پاسخ سوال جاستیفای + کوئرا

پاسخ سوال جاستیفای + کوئرا

در این نوشته تمرین “جاستیفای ” که در وبسایت کوئرا موجود می باشد را برای شما کاربران عزیز حل کرده ایم.

 

در مورد سایت کوئرا بیشتر بخوانید…

 

تمرین جاستیفای کوئرا + سی پلاس پلاس

امین یک متن حاوی  کلمه دارد و می‌خواهد آن‌ها را مرتب کند برای این کار یک عدد صحیح 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;
}

 

 

منبع سوال : وبسایت کوئرا

 

اگر روش حل بهتری برای “تمرین جاستیفای ” دارید برای ما ارسال کنید تا با نام خودتان به اشتراک بگذاریم.

اگر سوال خاصی را مدنظر دارید در بخش نظرات برای ما ارسال کنید تا حل آن سوال را در الویت محتوای سایت بگذاریم.

موفق باشید.

برای امتیاز به این نوشته کلیک کنید!
[کل: 0 میانگین: 0]