কম্পিউটার

C++ এ টেক্সট জাস্টিফিকেশন


ধরুন আমাদের কাছে শব্দের একটি অ্যারে এবং একটি প্রস্থ maxWidth আছে, আমাদের টেক্সটটি এমনভাবে ফরম্যাট করতে হবে যাতে প্রতিটি লাইনে অক্ষরগুলির সঠিক maxWidth সংখ্যা থাকে এবং সম্পূর্ণরূপে ন্যায়সঙ্গত হয়। আমরা একটি লোভী পদ্ধতির মধ্যে আমাদের শব্দ প্যাক করা উচিত; তাই, প্রতিটি লাইনে আমরা যতটা পারি শব্দ প্যাক করুন। প্রয়োজনে আমরা অতিরিক্ত স্পেস প্যাড করব ' ' যাতে প্রতিটি লাইনে হুবহু সর্বোচ্চ প্রস্থের অক্ষর থাকে।

এখানে শব্দের মধ্যে অতিরিক্ত স্পেস যতটা সম্ভব সমানভাবে বিতরণ করা উচিত। যদি একটি লাইনে স্পেস সংখ্যা শব্দের মধ্যে সমানভাবে ভাগ না হয়, বাম দিকের খালি স্লটগুলি ডানদিকের স্লটের চেয়ে বেশি স্পেস বরাদ্দ করা হবে। পাঠ্যের চূড়ান্ত লাইনের জন্য, এটিকে ন্যায়সঙ্গত রেখে দেওয়া উচিত এবং শব্দগুলির মধ্যে কোনও অতিরিক্ত স্থান ঢোকানো হবে না।

তাই যদি ইনপুট মত হয়

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • ফলাফল নামে একটি অ্যারে তৈরি করুন

  • 0 থেকে a আকারের রেঞ্জের জন্য, i j

    দ্বারা আপডেট করুন
    • প্রস্থ :=0

    • j এর জন্য i থেকে a এর আকার এবং প্রস্থ + a[j] + j – i <=b,

      • প্রস্থ :=প্রস্থ + a[j]

        এর আকার
    • স্থান :=1, অতিরিক্ত :=0

    • যদি j – 1 !=1 এবং j !=a এর আকার, তাহলে

      • স্থান :=(b - প্রস্থ) / j – i – 1

      • অতিরিক্ত :=(b - প্রস্থ) মোড (j – i – 1)

    • লাইন :=a[i]

    • k এর জন্য i + 1 থেকে j

      পরিসরে
      • রেখার সাথে ফাঁকা স্থানের স্পেস নম্বর সংযুক্ত করুন

      • যদি অতিরিক্ত> 0 হয়, তাহলে লাইন দিয়ে স্পেস সংযুক্ত করুন

      • 1 দ্বারা অতিরিক্ত হ্রাস করুন

      • লাইন :=লাইনের সাথে a[k] সংযুক্ত করুন

    • x :=লাইনের আকার

    • লাইন :=রেখা সহ শূন্যস্থানের (b - x) সংখ্যা

    • ফলাফলে লাইন ঢোকান

  • রিটার্ন রিটার্ন

উদাহরণ

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
void print_vector(vector<vector<auto>> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << "[";
      for(int j = 0; j <v[i].size(); j++){
         cout << v[i][j] << ", ";
      }
      cout << "],";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   vector<string> fullJustify(vector<string> &a, int b) {
      vector <string> result;
      int i, j;
      for(i = 0; i < a.size(); i = j){
         int width = 0;
         for(j = i; j < a.size() && width + a[j].size() + j - i <= b; j++){
            width += a[j].size();
         }
         int space = 1;
         int extra = 0;
         if(j - i != 1 && j != a.size()){
            space = (b - width) / (j - i - 1);
            extra = (b - width) % (j - i - 1);
         }
         string line(a[i]);
         for(int k = i + 1; k < j; k++){
            line += string(space, ' ');
            if(extra-- > 0){
               line += " ";
            }
            line += a[k];
         }
         int x = line.size();
         line += string(b - x, ' ');
         result.push_back(line);
      }
      return result;
   }
};
main(){
   vector<string> v = {"I", "love", "coding.", "here", "we", "will", "write", "some", "program"};
   Solution ob;
   print_vector(ob.fullJustify(v, 16));
}

ইনপুট

["I", "love", "coding.", "here", "we", "will", "write", "some", "program"]
16

আউটপুট

[I love coding.,
here we will,
write some,
program ,
]

  1. C++ এ রেখার প্রতিফলন

  2. C++ এ একটি লাইনের মধ্যবিন্দু খুঁজে বের করার জন্য প্রোগ্রাম

  3. C++ এ একটি লাইনে সর্বোচ্চ পয়েন্ট

  4. একটি লাইন C++ এ একটি বৃত্ত স্পর্শ করে বা ছেদ করে কিনা তা পরীক্ষা করুন