ভিজেনেয়ার সাইফার-এর একটি ইমপ্লিমেন্টেশন তৈরি করুন। ভিজেনেয়ার সাইফার একটি সরল সাবস্টিটিউশন সাইফার।
সাইফার হলো একটি অ্যালগরিদম, যা একটি স্ট্রিং এনক্রিপ্ট বা এনকোড করতে ব্যবহৃত হয়। এনক্রিপ্ট না করা স্ট্রিংটিকে বলা হয় প্লেইনটেক্সট এবং এনক্রিপ্ট করা স্ট্রিংটিকে বলা হয় সাইফারটেক্সট। প্লেইনটেক্সটকে সাইফারটেক্সটে রূপান্তর করাকে বলা হয় এনকোডিং, আর এর উল্টো কাজটিকে বলা হয় ডিকোডিং।
একটি সাবস্টিটিউশন সাইফারে প্লেইনটেক্সটের প্রতিটি অক্ষরকে একটি সাইফারটেক্সট অক্ষর দিয়ে প্রতিস্থাপন করা হয়, যা একটি কী-এর সাহায্যে হিসাব করা হয়। (লক্ষ করুন, প্রতিস্থাপিত অক্ষরটি মূল অক্ষরের মতোই হতে পারে।)
এই সাইফারে কী হলো ছোট হাতের অক্ষরের একটি ক্রম, যেমন "abcd"।
প্লেইনটেক্সটের প্রতিটি অক্ষরকে কী-এর সংশ্লিষ্ট একটি অক্ষরের ভিত্তিতে নির্দিষ্ট দূরত্বে শিফট বা রোটেট করা হয়।
কী-তে একটি "a" মানে ০ শিফট (অর্থাৎ কোনো শিফট নেই)।
কী-তে একটি "b" মানে ১ শিফট।
কী-তে একটি "c" মানে ২ শিফট, এবং এভাবে চলতে থাকে।
প্লেইনটেক্সটের প্রথম অক্ষরটি কী-এর প্রথম অক্ষর ব্যবহার করে, প্লেইনটেক্সটের দ্বিতীয় অক্ষরটি কী-এর দ্বিতীয় অক্ষর ব্যবহার করে, এভাবে চলতে থাকে। প্লেইনটেক্সটের অক্ষর শেষ হওয়ার আগেই যদি কী-এর অক্ষর শেষ হয়ে যায়, তাহলে কী-এর শুরু থেকে আবার শুরু করুন।
কী-তে যদি একটিমাত্র অক্ষর থাকে, যেমন "dddddd", তাহলে প্লেইনটেক্সটের সব অক্ষর একই পরিমাণে (এই উদাহরণে তিন) শিফট হয়, যা এটিকে রোটেশনাল সাইফার বা শিফট সাইফারের (যাকে মাঝে মাঝে সিজার সাইফারও বলা হয়) সমান করে তোলে।
উদাহরণস্বরূপ, প্লেইনটেক্সট "iamapandabear" হয়ে যাবে "ldpdsdqgdehdu"।
কী-তে যদি শুধু "a" অক্ষরটি থাকে (একবার বা একাধিকবার), তাহলে শিফটের দূরত্ব শূন্য এবং সাইফারটেক্সট প্লেইনটেক্সটের মতোই থাকে।
তবে সাধারণত কী এর চেয়ে অনেক বেশি জটিল হয়!
কী যদি "abcd" হয়, তাহলে প্লেইনটেক্সটের অক্ষরগুলো ০, ১, ২ আর ৩ দূরত্বে শিফট হবে।
প্লেইনটেক্সট যদি "hello" হয়, তাহলে আমাদের ৫টি শিফট দরকার, তাই কী আবার ঘুরে শুরুতে ফিরে যাবে এবং শিফটের দূরত্ব হবে ০, ১, ২, ৩ আর ০।
"hello"-এর অক্ষরগুলোতে ওই শিফটগুলো প্রয়োগ করলে আমরা পাই "hfnoo"।
কোনো কী দেওয়া না থাকলে, লাতিন বর্ণমালার অন্তত ১০০টি র্যান্ডম ছোট হাতের অক্ষর নিয়ে একটি কী তৈরি করুন।
Cipher ইন্টারফেসের সংজ্ঞা আছে cipher.go ফাইলে।
আপনার ইমপ্লিমেন্টেশনগুলো Cipher ইন্টারফেস মেনে চলা উচিত।
type Cipher interface {
Encode(string) string
Decode(string) string
}
ধরে নেওয়া হয়, Encode স্ট্রিংয়ের মধ্যে A-Za-z ছাড়া বাকি সব মান উপেক্ষা করবে; সেগুলো আউটপুটে থাকবে না।
আউটপুটও ছোট হাতের অক্ষরে রূপান্তর করা হবে।
সাইফারগুলো পাওয়ার জন্য যে ফাংশনগুলো ব্যবহার করা হয়:
func NewCaesar() Cipher { }
func NewShift(distance int) Cipher { }
func NewVigenere(key string) Cipher { }
NewShift-এর আর্গুমেন্ট ১ থেকে ২৫ অথবা -১ থেকে -২৫ এর মধ্যে থাকতে হবে।
শূন্য অনুমোদিত নয়।
অবৈধ আর্গুমেন্টের ক্ষেত্রে NewShift nil রিটার্ন করে।
NewVigenere-এর আর্গুমেন্টে শুধু ছোট হাতের a-z অক্ষর থাকতে হবে।
শুধু 'a' অক্ষর দিয়ে গঠিত মান অনুমোদিত নয়।
অবৈধ আর্গুমেন্টের ক্ষেত্রে NewVigenere nil রিটার্ন করে।
Exercism-এ সাইন আপ করুন, Go ট্র্যাকের 35টি কনসেপ্ট167টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।