জটিল ইমোজিসযুক্ত স্ট্রিংটি কীভাবে বিপরীত করবেন?


193

ইনপুট:

Hello world👩‍🦰👩‍👩‍👦‍👦

পছন্দসই আউটপুট:

👩‍👩‍👦‍👦👩‍🦰dlrow olleH

আমি বেশ কয়েকটি পদ্ধতির চেষ্টা করেছি কিন্তু কেউই আমাকে সঠিক উত্তর দেয়নি।

এটি মিসরব্লি ব্যর্থ হয়েছে:

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦';

const reversed = text.split('').reverse().join('');

console.log(reversed);

এই ধরনের কাজ করে তবে এটি 👩‍👩‍👦‍👦4 টি বিভিন্ন ইমোজিগুলিতে বিভক্ত হয়:

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦';

const reversed = [...text].reverse().join('');

console.log(reversed);

আমি এই প্রশ্নের প্রতিটি উত্তর চেষ্টা করেছিলাম কিন্তু তাদের কোনওটিই কাজ করে না।

পছন্দসই আউটপুট পাওয়ার কোনও উপায় আছে?


26
দ্বিতীয় সমাধান নিয়ে সমস্যাটি দেখতে পাচ্ছি না। আমি কী মিস করছি?
পেড্রো লিমা

13
সুতরাং এই ইমোজিগুলি আসলে একত্রিত ইমোজিস, এটি বেশ আকর্ষণীয়। প্রথমত, আপনার মহিলার মুখ ইমোজি রয়েছে, যা নিজেই আপনার দুটি চরিত্রের প্রতিনিধিত্ব করে এবং তারপরে একটি অতিরিক্ত সংযোগকারী চরিত্র রয়েছে, যা চারকোড 8205, এবং তারপরে আরও দুটি আছে যা "লাল চুল" উপস্থাপন করে এবং সেই 5 টি অক্ষর একসাথে থাকে মানে 'লাল চুলের সাথে
মহিলারা

11
সম্মিলিত ইমোজিসের সাথে একটি স্ট্রিং যথাযথভাবে বিপরীত করা খুব জটিল হবে বলে আমি মনে করি। আপনার প্রতিটি ইমোজি চারকোড 8205 অনুসরণ করেছে কিনা তা পরীক্ষা করে দেখতে হবে এবং যদি এটি হয় তবে এটি আপনার নিজের চরিত্র হিসাবে বিবেচনা করার পরিবর্তে এটি পূর্ববর্তী ইমোজিটির সাথে একত্রী করতে হবে। বেশ জটিল ...
TKoL

18
জাভাস্ক্রিপ্ট আমাকে বিভ্রান্ত করে। এটি নিম্ন এবং উচ্চ স্তরের ভাষা ধারণার মধ্যে সবচেয়ে বিস্ময়কর মিশ্রণ। এটি এমন স্তর যা এটি মেমরিটিকে পুরোপুরি বিমূর্ত করে তোলে (কোনও পয়েন্টার নেই, ম্যানুয়াল মেমরি ম্যানেজমেন্ট) তবে স্ট্রিংগুলিকে বর্ধিত গ্রাফি ক্লাস্টারের পরিবর্তে বোবা কোড পয়েন্ট হিসাবে বিবেচনা করে low এটি সত্যিই বিভ্রান্তিকর এবং এ জিনিসটি নিয়ে কাজ করার সময় কখন কী আশা করা যায় তা আমাকে কখনই বুঝতে দেয় না।
আলেকজান্ডার - মনিকা পুনরায় ইনস্টল করুন

12
@ আলেকজান্ডার-ReinstateMonica সেখানে যে কোনো ভাষা নেই ডিফল্টরূপে গ্রাফিম বিভাজন দ্বারা বিভাজন? জেএস কেবলমাত্র ইউটিএফ -16 এ এনকোড করা স্ট্যান্ডার্ড স্ট্রিং সরবরাহ করে।
আলোক0123

উত্তর:


91

আপনি যদি সক্ষম হন _.split()তবে লোডাশের দেওয়া ফাংশনটি ব্যবহার করুন । থেকে সংস্করণ 4.0 অগ্রে,_.split() বিভাজন ইউনিকোড ইমোজি সক্ষম।

.reverse().join('')'অক্ষরগুলি' বিপরীত করতে নেটিভ ব্যবহার করা শূন্য প্রস্থের জোড় যুক্ত ইমোজিসের সাথে ঠিক কাজ করা উচিত

function reverse(txt) { return _.split(txt, '').reverse().join(''); }

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦';
console.log(reverse(text));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script>


4
"V4.9.0 - আপনি নিশ্চয়ই _.স্প্লিট ইমোজিসের সাথে কাজ করে" উল্লেখ করেছেন যে পরিবর্তনগুলি আপনি উল্লেখ করেছেন, আমি মনে করি 4.0 খুব তাড়াতাড়ি হতে পারে। কোডটিতে যে মন্তব্যগুলি স্ট্রিংগুলিকে বিভক্ত করতে ব্যবহৃত হয় ( github.com/lodash/lodash/blob/4.17.15/lodash.js#L261 ) mathiasbynens.be/notes/ javascript- ইউনিকোড যা 2013 থেকে আসে It দেখে মনে হচ্ছে এটি তখন থেকে চলে গেছে, তবে এটি ইউনিকোডের অনেকগুলি রেজিেক্সগুলি বোঝার জন্য বেশ শক্ত ব্যবহার করে। আমি ইউনিকোড বিভাজনের জন্য তাদের কোডবেসে কোনও পরীক্ষা দেখতে পাচ্ছি না। এগুলি উত্পাদনে এটি ব্যবহার থেকে আমাকে সতর্ক করে দেবে।
মাইকেল অ্যান্ডারসন

4
এটি ব্যর্থ হয়েছে reverse("뎌쉐") (2 কোরিয়ান গ্রাফিম) যা "ᅰ셔 ᄃ" (3 গ্রাফিম) দেয় তা খুঁজে পেতে কেবল সামান্য অনুসন্ধান নিয়েছিল ।
মাইকেল অ্যান্ডারসন

4
দেখে মনে হচ্ছে এই সমস্যার কোনও সহজ নেটিভ সমাধান নেই। এটি সমাধান করার জন্য কোনও লাইব্রেরি আমদানি করতে পছন্দ করবেন না, তবে এটি এই মুহূর্তে এটি করার সবচেয়ে নির্ভরযোগ্য / ধারাবাহিক উপায়।
হাও উউ

4
এটিকে সঠিকভাবে কাজ করার জন্য কুডোস Windows উইন্ডোজ 10 তে ফায়ারফক্সে লেখার দিকনির্দেশকে বিপরীত করা এখনও একটি ছোট্ট বাচ্চা (বাচ্চাদের পিছনে শেষ), তাই লোটাস উইন্ডোজ 10 কে পরাজিত করে, আমার ধারণা, যা সম্ভবত কিছুটা কম বাজেট 😅
ইয়োমন

52

আমি \u200dচরিত্রটি ব্যবহারের জন্য টিকোলের ধারণা নিয়েছি এবং এটি একটি ছোট স্ক্রিপ্ট তৈরি করার চেষ্টা করার জন্য ব্যবহার করেছি।

দ্রষ্টব্য: সমস্ত রচনাগুলি শূন্য প্রস্থের সংযুক্তকারী ব্যবহার করে না তাই এটি অন্যান্য রচনা অক্ষরের সাথে বগি হবে।

এটি theতিহ্যবাহী forলুপটি ব্যবহার করে কারণ আমরা সংযুক্ত ইমোটিকনগুলি খুঁজে পাওয়ার ক্ষেত্রে আমরা কিছু পুনরাবৃত্তি বাদ দিই। forলুপের মধ্যে whileনীচের \u200dঅক্ষর আছে কিনা তা পরীক্ষা করার জন্য একটি লুপ রয়েছে । যতক্ষণ না একটি রয়েছে আমরা পরবর্তী 2 টি অক্ষর পাশাপাশি যুক্ত করব এবং for2 টি পুনরাবৃত্তির সাথে লুপটি ফরোয়ার্ড করব যাতে সম্মিলিত ইমোটিকনগুলি বিপরীত হয় না।

এটিকে যে কোনও স্ট্রিংয়ে সহজেই ব্যবহার করতে আমি স্ট্রিং অবজেক্টে এটি একটি নতুন প্রোটোটাইপ ফাংশন হিসাবে তৈরি করেছি।

String.prototype.reverse = function() {
  let textArray = [...this];
  let reverseString = "";

  for (let i = 0; i < textArray.length; i++) {
    let char = textArray[i];
    while (textArray[i + 1] === '\u200d') {
      char += textArray[i + 1] + textArray[i + 2];
      i = i + 2;
    }
    reverseString = char + reverseString;
  }
  return reverseString;
}

const text = "Hello world👩‍🦰👩‍👩‍👦‍👦";

console.log(text.reverse());

//Fun fact, you can chain them to double reverse :)
//console.log(text.reverse().reverse());


4
আমি ভাবছিলাম, যখন আপনি ব্রাউজারগুলিতে পাঠ্যটি টেনে আনুন এবং নির্বাচন করুন, 👩‍👩‍👦‍👦কেবলমাত্র পুরোটিকেই নির্বাচন করা যেতে পারে। ব্রাউজারগুলি কীভাবে জানতে পারে যে এটির একটি চরিত্র? এটি করার কি কোনও অন্তর্নির্মিত উপায় আছে?
হাও উউ

10
@ হাওউউ এটিই "গ্রাফিম ক্লাস্টার্স" এর "ইউনিকোড বিভাজন" নামে পরিচিত। আপনার ব্রাউজারটি (যা আপনার ওএস দ্বারা প্রদত্ত একটি ব্যবহার করতে পারে) প্রতি গ্রাফি ক্লাস্টার রেন্ডার করতে এবং নির্বাচনের অনুমতি দিতে চলেছে। আপনি এখানে অনুমানটি
আলো 0123

7
@ হাওউউ: "ব্রাউজারগুলি কীভাবে জানতে পারে যে এটির একটি চরিত্র?" - এটা না "একটি অক্ষর"। এটি একাধিক একটি একক গঠন মিশ্রন অক্ষর গ্রাফিম ক্লাস্টার , একটি একক হিসাবে অনুষ্ঠিত গ্লিফের
জার্গ ডব্লু মিটাগ

6
এখানে যেমন ; সমস্ত রচনাগুলি শূন্য প্রস্থের সংযোগকারী ব্যবহার করে না।
হলগার

6
এটি ZWJ এর সাথে রচিত অক্ষরগুলি ছাড়া অন্য কোনও কিছুকেই সঠিকভাবে বিপরীত করে না। দয়া করে, কেবল এখানেই নয় তবে একটি সাধারণ নিয়ম হিসাবে, একটি পরীক্ষার ক্ষেত্রে কাজ করার জন্য ঘটে যাওয়া bespoke সমাধানগুলি হ্যাক করার পরিবর্তে লোকেদের দ্বারা লিখিত বাহ্যিক গ্রন্থাগারগুলি ব্যবহার করুন। Runes এবং lodash লাইব্রেরি (আমি হয় সমর্থন জানাতে পারি না) অন্য উত্তর সুপারিশ করা হয়েছে।
1:24

46

ইউনিকোড পাঠ্যটি বিপরীত করা অনেক কারণে জটিল।

প্রথমত, প্রোগ্রামিং ভাষার উপর নির্ভর করে স্ট্রিংগুলি বিভিন্ন উপায়ে উপস্থাপন করা হয়, হয় বাইটের তালিকা হিসাবে, ইউটিএফ -16 কোড ইউনিটের তালিকা (16 বিট প্রশস্ত, প্রায়শই এপিআইতে "অক্ষর" বলা হয়), বা ইউসিএস 4 কোড পয়েন্ট হিসাবে (4 বাইট প্রশস্ত)

দ্বিতীয়ত, পৃথক পৃথক এপিআইগুলি বিভিন্ন ডিগ্রিতে সেই অভ্যন্তরীণ প্রতিনিধিত্ব করে। কিছু বাইটের বিমূর্তকরণ নিয়ে কাজ করে, কিছু ইউটিএফ -16 অক্ষরে, কিছু কোড পয়েন্টে। যখন উপস্থাপনাটি বাইট বা ইউটিএফ -16 অক্ষর ব্যবহার করে, সাধারণত এপিআই এর কিছু অংশ থাকে যা আপনাকে এই উপস্থাপনের উপাদানগুলিতে অ্যাক্সেস দেয় এবং পাশাপাশি অংশগুলি যা বাইটস থেকে (ইউটিএফ -8 এর মাধ্যমে) পেতে বা থেকে প্রয়োজনীয় লজিক সম্পাদন করে প্রকৃত কোড পয়েন্টগুলিতে UTF-16 অক্ষর।

প্রায়শই, API এর অংশগুলি সেই যুক্তিটি সম্পাদন করে এবং এভাবে আপনাকে কোড পয়েন্টগুলিতে অ্যাক্সেস দেয় যা পরে যুক্ত করা হয়েছে, যেমন আগে সেখানে 7 বিট আসকি ছিল, তারপরে কিছুক্ষণ পরে সকলেই ভেবেছিল যে 8 টি বিটই যথেষ্ট, বিভিন্ন কোড পৃষ্ঠা ব্যবহার করে এবং এমনকি পরে ইউনিকোডের জন্য 16 বিট যথেষ্ট ছিল। একটি নির্দিষ্ট উপরের সীমা ছাড়াই পূর্ণসংখ্যা হিসাবে কোড পয়েন্টের ধারণাটি logতিহাসিকভাবে যৌক্তিকভাবে এনকোডিং পাঠ্যের জন্য চতুর্থ সাধারণ অক্ষরের দৈর্ঘ্য হিসাবে যুক্ত করা হয়েছিল।

এমন একটি API ব্যবহার করা যা আপনাকে আসল কোড পয়েন্টগুলিতে অ্যাক্সেস দেয় seems তবে ...

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

চতুর্থত, সব কিছু ধ্রুব প্রবাহে থাকে। উদাহরণ হিসাবে ব্যবহৃত ইমোজিগুলির মধ্যে প্রচুর সংশোধকও রয়েছে এবং প্রতি বছর আরও যোগ করা হয়। সুতরাং, যদি কোনও এআইপিআই আপনাকে কোনও কোড পয়েন্ট পরিবর্তনকারী কিনা তথ্যের অ্যাক্সেস দেয় তবে এপিআইর সংস্করণ নির্ধারণ করবে যে এটি ইতিমধ্যে কোনও নির্দিষ্ট নতুন সংশোধক জানে কিনা।

ইউনিকোড একটি চতুর কৌশল সরবরাহ করে, যদিও এটি যখন কেবলমাত্র ভিজ্যুয়াল উপস্থিতি সম্পর্কে থাকে:

লেখার দিকনির্দেশক সংশোধক রয়েছে। উদাহরণের ক্ষেত্রে, বাম থেকে ডান লেখার দিকনির্দেশ ব্যবহৃত হয়। পাঠ্যের শুরুতে কেবল ডান থেকে বাম লেখার দিকনির্দেশক সংশোধন করুন এবং এপিআই / ব্রাউজারের সংস্করণ অনুসারে এটি সঠিকভাবে বিপরীত দেখাবে 😎

'\ u202e' কে ডান থেকে বাম ওভাররাইড বলা হয়, এটি ডান থেকে বাম চিহ্নিতকারীর সবচেয়ে শক্তিশালী সংস্করণ।

W3.org দ্বারা এই ব্যাখ্যা দেখুন

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦'
console.log('\u202e' + text)

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦'
let original = document.getElementById('original')
original.appendChild(document.createTextNode(text))
let result = document.getElementById('result')
result.appendChild(document.createTextNode('\u202e' + text))
body {
  font-family: sans-serif
}
<p id="original"></p>
<p id="result"></p>


8
বিড়ির +1 খুব সৃজনশীল ব্যবহার (-: '\u202e' + text + '\u202c'নিম্নলিখিত পাঠ্যকে প্রভাবিত করতে এড়াতে একটি পপ ডিরেক্টরাল ফর্ম্যাটিং চর দিয়ে ওভাররাইডটি বন্ধ করা নিরাপদ
বেনি চেরনিয়াভস্কি-পাসকিন

4
ধন্যবাদ 😎 এটি বেশ কৌতুকপূর্ণ কৌশল এবং আমি যে নিবন্ধটি সংযুক্ত করেছি তা এইচটিএমএল বৈশিষ্ট্যগুলি ব্যবহার করার উপায়টি কেন চতুর তা ব্যাখ্যা করে কিন্তু এইভাবে আমি কেবল আমার হ্যাকের জন্য স্ট্রিং কনটেন্টেশন ব্যবহার করতে পারি 😂
ইয়োমন

7
বিটিডব্লিউ এই মেশিনে আমার ফায়ারফক্স (10 টি জয়) পুরোপুরি ডান পায় না, ডান থেকে বামে লেখার সময় বাচ্চারা বাবা-মায়ের পিছনে থাকে, আমি অনুমান করি যে এই বিশাল আকারের জটিল ইমোজি গ্রুপ-অফ-পিপল মডিফায়ারগুলির সাথে লেখার দিকনির্দেশনা পাওয়া শক্ত hard ..
ইয়োমন

4
আর একটি মজাদার প্রান্তের মামলা: পতাকা ইমোজিসের জন্য ব্যবহৃত আঞ্চলিক সূচক প্রতীক। আপনি যদি "🇦🇨" স্ট্রিংটি নেন (দুটি কোড পয়েন্ট U + 1F1E6, U + 1F1E8, অ্যাসেনশন দ্বীপের পতাকা তৈরি করে) এবং নির্লজ্জভাবে এর বিপরীত করার চেষ্টা করেন, আপনি কানাডার পতাকা "🇨🇦" পাবেন।
অ্যাডাম রোজেনফিল্ড

4
@ আইওম্যান এফওয়াইআই: "ইউটিএফ -16 অক্ষর" (আপনি এখানে শব্দটি ব্যবহার করছেন) অন্যথায় "ইউটিএফ -16 কোড ইউনিট " নামে পরিচিত । "চারিত্রিক" একটি শব্দটির সাথে খুব দুর্বোধ্য হতে থাকে কারণ এটি অনেকগুলি বিষয়কে বোঝায় (তবে ইউনিকোডের ক্ষেত্রে সাধারণত একটি কোড পয়েন্ট থাকে)।
ইনক্লিং

38

আমি জানি! আমি RegExp ব্যবহার করব। কি ভুল হতে পারে? (উত্তর পাঠকের জন্য অনুশীলন হিসাবে রেখে গেছে))

const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦';

const reversed = text.match(/.(\u200d.)*/gu).reverse().join('');

console.log(reversed);


4
আপনার উত্তরটি ক্ষোভজনক মনে হলেও সত্য, আমি এই উত্তরটিকে ক্যানোনিকালের কাছে কল করব। ম্যানুয়ালি একই জিনিস করার চেষ্টা করা অন্যান্য জবাবগুলির চেয়ে এটি অবশ্যই উচ্চতর। চরিত্রভিত্তিক পাঠ্য ম্যানিপুলেশন হ'ল রেজেক্সটি কীসের জন্য ডিজাইন করা হয়েছিল এবং এতে ছাড়িয়ে যায় এবং ইউনিকোড কনসোর্টিয়ামটি স্পষ্টভাবে প্রয়োজনীয় রেজেক্স বৈশিষ্ট্যগুলিকে মানক করে তোলে (যা ECMAScript সঠিকভাবে প্রয়োগের জন্য ঘটে, এই উদাহরণে)। তাই বলা হয়, এটা মিশ্রন অক্ষর (যা IIRC Regex হ্যান্ডেল করতে ব্যর্থ উচিত সঙ্গে হ্যান্ডেল .ওয়াইল্ডকার্ড)।
কনরাড রুডল্ফ

14
U+200Dযেমন রচনাগুলি তৈরি করা হয়নি তার সাথে কাজ করে না 🏳️‍🌈। এটি লক্ষণীয় যে রচিত চরিত্রগুলি এমিজোই বিশ্বের বাইরেও রয়েছে ...
হোলার

4
@ স্টিভেনপেনি ‍🌈 এ দুটি রচনা রয়েছে এবং এর মধ্যে একটি ব্যবহার করে না U+200D। এটি যাচাই করা সহজ যে answer‍🌈 এই উত্তরটির কোড নিয়ে কাজ করে না…
হোলগার

4
@ হোলগার এটি সত্য যে 🏳️‍🌈-এ ইউ + 200 ডি দিয়ে নির্মিত না এমন একটি রচনা রয়েছে যা এটির একটি খারাপ উদাহরণ কারণ এটিতে ইউ + 200 ডি সহ একটি রচনাও রয়েছে। এর থেকে আরও ভাল উদাহরণ 🧑🏻 বা 🏳️ এর মতো হতে পারে
স্টিভেন পেনি

4
এখানে অন্য মন্তব্যগুলির বিপরীতে, শূন্য-প্রস্থ-সংযুক্তকারীর প্রতিটি ব্যবহারকে একক গ্রাফিয়াম ক্লাস্টার হিসাবে গণ্য করা উচিত নয়। উদাহরণস্বরূপ, ইউনিকোড 13 গ্রাফেম পরীক্ষার শেষ তিনটি লাইন ( ইউনিকোড.আর / প্রজাতন্ত্র / 13.0.0 / ucd / auxiliary / GraphemeBreakTest.txt ) তিনটি অনুরূপ কেস দেখায় যেখানে ZWJ আলাদাভাবে পরিচালনা করা হয়।
মাইকেল অ্যান্ডারসন

30

বিকল্প সমাধান ব্যবহার করা হবে runes গ্রন্থাগারটি , ছোট কিন্তু কার্যকর সমাধান:

https://github.com/dotcypress/runes

const runes = require('runes')

// String.substring
'👨‍👨‍👧‍👧a'.substring(1) => '�‍👨‍👧‍👧a'

// Runes
runes.substr('👨‍👨‍👧‍👧a', 1) => 'a'

runes('12👩‍👩‍👦‍👦3🍕✓').reverse().join(); 
// results in: "✓🍕3👩‍👩‍👦‍👦21"

4
এটি সেরা উত্তর টিবিএইচ। এই সমস্ত উত্তরগুলির ক্ষেত্রে সেগুলি ব্যর্থ হয় this
কারসন গ্রাহাম

4
এটি মজার বিষয় যে প্রথম চেহারাতে এই জাতীয় "সাধারণ প্রশ্ন" সমাধান করা সহজ কাজ নয়। কারসনের সাথে একমত - লাইব্রেরি, আশা করি, ইমোজিস ক্রমবর্ধমান হিসাবে আপডেট এবং পরিবর্তনগুলি নিয়ে এগিয়ে যাবে।
আরনিস জুরাগা

4
দেখে মনে হচ্ছে এটি প্রায় 3 বছর ধরে আপডেট হয়নি। ইউনিকোড 11 প্রায় সেই সময় প্রকাশিত হয়েছিল, তবে ইউনিকোড 13 পরে প্রকাশিত হওয়ার পরে বিষয়গুলি পরিবর্তিত হয়েছে। ১৩-এ বর্ধিত গ্রাফিয়াম নিয়মে কিছু পরিবর্তন হয়েছিল So তাই কিছু প্রান্তের ক্ষেত্রে এটি পরিচালনা করতে পারে না। (আমি কোডটি সন্ধান করি নি - তবে এটি সাবধান হওয়া ভাল)
মাইকেল অ্যান্ডারসন

4
আমি @ মিশেলএন্ডারসনের সাথে একমত, এই লাইব্রেরিটি একটি নিষ্পাপ বা পুরানো অ্যালগরিদম ব্যবহার করে বলে মনে হচ্ছে। এটি সঠিকভাবে করার জন্য এটি ইউনিকোডে বর্ণিত গ্রাফিম সেগমেন্টেশন অ্যালগরিদম ব্যবহার করা উচিত ।
23-22

20

আপনার কেবল ইমোজি নিয়ে সমস্যা নেই, তবে অন্যান্য সংমিশ্রিত অক্ষরগুলির সাথেও। এই জিনিসগুলি স্বতন্ত্র চিঠিগুলির মতো মনে হয় তবে প্রকৃতপক্ষে এক বা একাধিক ইউনিকোড অক্ষরকে "বর্ধিত গ্রাফি ক্লাস্টার" বলা হয়।

এই ক্লাস্টারগুলিতে একটি স্ট্রিং ভাঙ্গা জটিল (উদাহরণস্বরূপ এই ইউনিকোড ডক্স দেখুন )। আমি নিজে এটি প্রয়োগের উপর নির্ভর করব না তবে বিদ্যমান লাইব্রেরি ব্যবহার করব। গুগল আমাকে গ্রাফিম-স্প্লিটারে দেখিয়েছে লাইব্রেরিতে । এই লাইব্রেরির ডক্সে কিছু দুর্দান্ত উদাহরণ রয়েছে যা বেশিরভাগ বাস্তবায়নকে আরও বাড়িয়ে তুলবে:

এটি ব্যবহার করে আপনার লিখতে সক্ষম হওয়া উচিত:

var splitter = new GraphemeSplitter();
var graphemes = splitter.splitGraphemes(string);
var reversed = graphemes.reverse().join('');

ASIDE: ভবিষ্যতের দর্শকদের জন্য বা রক্তপাতের প্রান্তে বেঁচে থাকতে ইচ্ছুকরা:

একটি প্রস্তাব আছে জাভাস্ক্রিপ্ট মান করার জন্য একটি গ্রাফিম segmenter যোগ করতে। (এটি আসলে অন্যান্য সেগমেন্টিং বিকল্পগুলিও সরবরাহ করে)। এটি এই মুহূর্তে গ্রহণযোগ্যতার জন্য পর্যায়ের 3 পর্যালোচনায় রয়েছে এবং এটি বর্তমানে জেএসসি এবং ভি 8 তে বাস্তবায়িত হয়েছে (দেখুন https://github.com/tc39/proposal-intl-segmenter/issues/114 )।

এই কোডটি ব্যবহার করে দেখতে দেখতে দেখতে এমন হবে:

var segmenter = new Intl.Segmenter("en", {granularity: "grapheme"})
var segment_iterator = segmenter.segment(string)
var graphemes = []
for (let {segment} of segment_iterator) {
    graphemes.push(segment)
}
var reversed = graphemes.reverse().join('');

আপনি যদি আমার চেয়ে আরও আধুনিক জাভাস্ক্রিপ্ট জানেন তবে আপনি সম্ভবত এটি আরও সুন্দর করে তুলতে পারেন ...

এখানে একটি বাস্তবায়ন আছে - তবে এর কী প্রয়োজন তা আমি জানি না।

দ্রষ্টব্য: এটি এমন একটি মজাদার বিষয় নির্দেশ করে যা অন্য উত্তরগুলি এখনও সম্বোধন করে নি। বিভাজনটি আপনি যে লোকেলটি ব্যবহার করছেন তার উপর নির্ভর করতে পারে - কেবল স্ট্রিংয়ের অক্ষর নয়।


4
দেখে মনে হচ্ছে কোডটি প্রায় 2 বছর ধরে আপডেট হয়নি - তাই এর সারণীগুলি আপ টু ডেট নাও হতে পারে। সুতরাং আপনার আরও সাম্প্রতিক কিছু অনুসন্ধানের প্রয়োজন হতে পারে।
মাইকেল অ্যান্ডারসন

4
দেখে মনে হচ্ছে এই লাইব্রেরির আরও সাম্প্রতিক কাঁটাটি পাওয়া যাবে github.com/flmnt/graphemer
মাইকেল অ্যান্ডারসন

4
আমি অবাক হয়েছি যে সত্যটি সঠিক যে কোনও উত্তর পেতে আমাকে এ পর্যন্ত নিচে স্ক্রোল করতে হয়েছিল।
লাম্বদা পরী

4
প্রস্তাব উদাহরণের জন্য আপনি করতে পারেন const graphemes = Array.from(segment_iterator, ({segment}) => segment)
ইনক্লিং

17

আমি ঠিক মজা করার জন্য এটি করার সিদ্ধান্ত নিয়েছি, একটি ভাল চ্যালেঞ্জ ছিল। নিশ্চিত নয় যে এটি সব ক্ষেত্রেই সঠিক, তাই আপনার নিজের ঝুঁকিতে ব্যবহার করুন, তবে এটি এখানে:

function run() {
    const text = 'Hello world👩‍🦰👩‍👩‍👦‍👦';
    const newText = reverseText(text);
    console.log(newText);
}

function reverseText(text) {
    // first, create an array of characters
    let textArray = [...text];
    let lastCharConnector = false;
    textArray = textArray.reduce((acc, char, index) => {
        if (char.charCodeAt(0) === 8205) {
            const lastChar = acc[acc.length-1];
            if (Array.isArray(lastChar)) {
                lastChar.push(char);
            } else {
                acc[acc.length-1] = [lastChar, char];
            }
            lastCharConnector = true;
        } else if (lastCharConnector) {
            acc[acc.length-1].push(char);
            lastCharConnector = false;
        } else {
            acc.push(char);
            lastCharConnector = false;
        }
        return acc;
    }, []);
    
    console.log('initial text array', textArray);
    textArray = textArray.reverse();
    console.log('reversed text array', textArray);

    textArray = textArray.map((item) => {
        if (Array.isArray(item)) {
            return item.join('');
        } else {
            return item;
        }
    });

    return textArray.join('');
}

run();


4
ওয়েল, আসলে এটি দীর্ঘ কারণ ডিবাগ ইনফোগুলি। আমি সত্যিই এর প্রশংসা করি
হাও উউ

4
@ অ্যান্ড্রুস্যাভিনিখ কোনও কোড-গল্ফ নয়, তবে আরও মার্জিত সমাধানের সন্ধান করছেন। ওয়ানলাইনার পাগলের মতো নাও হতে পারে তবে মনে রাখা সহজ। যেমন রেগেক্স সলিউশন সত্যিই ভাল একটি ইমো।
হাও উউ

0

তুমি ব্যবহার করতে পার:

yourstring.split('').reverse().join('')

এটি আপনার স্ট্রিংকে একটি তালিকায় পরিণত করবে, এটিকে বিপরীত করুন এবং এটিকে আবার স্ট্রিং করুন।


4
প্রশ্ন পড়েছেন? আপনার কোডটি হ'ল কোড ওপিতে প্রশ্নটিতে ভুল প্রমাণিত।
ওয়াশিংটন গুডিস

-1

আবদ্ধ পাঠ্য = 'হ্যালো ওয়ার্ল্ড👩‍🦰👩‍👩‍👦‍👦';

কনট রিভার্সড = টেক্সট.স্প্লিট ('') re

কনসোল.লগ (বিপরীত);

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.