শুক্রবার, ১১ মার্চ, ২০২২

ASCII

ASCII 


আমরা কি কখনো ভেবে দেখেছি, যে কম্পিউটার 0 আর 1 ছাড়া কিছু বুঝে না, সে কিভাবে ‘a’, ‘b’, ‘c’’, ‘#’, ‘?’ ইত্যাদি character গুলো মনে রাখে? আচ্ছা, যেহেতু কম্পিউটার 0 আর 1 বুঝে, তাহলে আমরা এই character গুলোকে যদি 0 আর 1 এর combination হিসেবে কম্পিউটারের কাছে উপস্থাপন করতে পারি। আর এভাবে পেলেই তো সে এদেরকে মনে রাখতে পারবে, তাই না? এইভাবে কোন character কে কম্পিউটারের বোধগম্য সংখ্যাতে উপস্থাপনের ব্যাপারটিকে character-encoding বলে। ASCII হচ্ছে character-encoding এর একটি standard. এর পূর্ণরূপ হলো American Standard Code for Information Interchange.


কোন একটি character এর ASCII value হচ্ছে একটি unique decimal সংখ্যা, যেটিকে কম্পিউটার তার binary representation হিসেবে মনে রাখে। যেমন, lowercase ‘a’ এর ASCII value 97; আবার uppercase ‘A’ এর ASCII value 65. ‘0’ থেকে ‘9’ এই অঙ্কগুলোর জন্য ASCII value হচ্ছে 48 থেকে 57 এর মধ্য। এভাবে 8-bit ASCII তে 28 টি ভিন্ন ভিন্ন characters আছে। 



8-bit ASCII Table


                                                                                                                     [source: https://text-symbols.com/ascii/ ]



কোন character এর ASCII value কে আমরা integer হিসেবে store বা প্রিন্ট করতে পারি। যেমন, ‘a’ থেকে ‘z’ পর্যন্ত character গুলোকে print করার জন্য আমরা নিচের code snippet টি অনুসরণ  করতে পারি। 



for(char c = 'a'; c <= 'z'; c++){

      int x = c;

      printf("ASCII value of %c is: %d\n",c,x);

}




এখন আমরা উদাহরণ সমস্যা হিসেবে atcoder এর “Case Sensitive” সমস্যাটি (link:https://atcoder.jp/contests/past202005-open/tasks/past202005_a ) দেখবো। এই সমস্যায় আমাদেরকে দুটি string দেওয়া হবে যেগুলো শুধু English alphabet এর character গুলো দিয়ে গঠিত। Uppercase এবং lowercase উভয় ধরনের character-ই থাকতে পারে। যদি string দুটি হুবহু মিলে যায়, তবে আমাদেরকে output হিসেবে “same” print করতে হবে। আর যদি হুবহু না মিলে, তবে দুই ধরনের case হতে পারে। যদি string দুটির সবগুলো character কে একই case (uppercase বা lowercase) এ নিয়ে যাওয়ার পর তারা সমান হয়, তাহলে আমাদেরকে “case-insensitive” print করতে হবে, অন্যথায় “different” print করতে হবে। 


আমরা “same” print করার কাজটি একটি if conditional statement ব্যবহার করেই করতে পারি। যদি same না হয়, তবে string দুটির সকল character কে এবার একই case এ নিয়ে যেতে হবে “case-insensitive” কিনা যাচাই করার জন্য। আমরা সবগুলো character কে lowercase এ convert করতে পারি। যেসব character ইতিমধ্যে lowercase এ আছে, সেগুলোকে কিছু করতে হবে না। তবে যেগুলো uppercase এ আছে সেগুলোকে নিয়ে আমাদের মাথা ব্যাথা। ASCII table এ একটু খেয়াল করলে আমরা দেখবো, যেকোন English letter এর uppercase এবং lowercase character এর মধ্যে ASCII value এর পার্থক্য 32. তাহলে, string এর কোন uppercase character এর জন্য তার ASCII value এর সাথে 32 যোগ করে দিলেই আমরা সেটির lowercase character কে পেয়ে যাবো। এভাবে lowercase এ string দুটিকে convert করার পর equal কিনা তা compare করলেই হবে। তাহলে, আমাদের কোড হবে নিচের মতো। 



string s, t;     cin>> s >> t;


if( s==t )  cout<<"same\n";

else{

          for( int i=0; i<s.size(); i++)   if( s[i] >= 'A' and s[i] <= 'Z' ) s[i] = s[i] + 32;

          for( int i=0; i<t.size(); i++)   if( t[i] >= 'A'  and t[i] <= 'Z' ) t[i] = t[i] + 32;

          

          if( s==t )  cout<<"case-insensitive\n";

          else      cout<<"different\n";

}





কোন মন্তব্য নেই:

একটি মন্তব্য পোস্ট করুন