সিজার সাইফার ইঙ্ক্রিপ্টর

Approach

একটা ফাংশন লিখতে হবে যার ইনপুট হিসাবে নন-এম্পটি লোয়ার কেস স্ট্রিং এবং একটা নন-নেগেটিভ ইন্টিজার দেয়া হবে। স্ট্রিং এর প্রতিটা অক্ষরকে বর্তমান পজিশন থেকে k পজিশনের অক্ষরে পরিবর্তন করে যে নতুন স্টিং পাওয়া যাবে তা রিটার্ন করতে হবে। এখানে k হচ্ছে ইনপুট হিসেবে নেয়া নন-নেগেটিভ ইন্টিজার।

মনে রাখা দরকার যে, এখানে অক্ষর এর পজিশন র‍্যাপ করতে হবে, মানে হচ্ছে z এর ১ ঘর শিফট হবে a

নমুনা  Input<br/>
string = "xyz"
key = 2

নমুনা Output
"zab"

টুলস

- ASCII Table: a (স্মল a) এর  ASCII ভেলু 97 এবং z (স্মল z) এর  ASCII ভেলু 122 - modulus (%):  Divides the left hand operand by the right hand operand and returns remainder 

  • StringBuilder

টেকনিক  

  • key  যেকোন লেংথ এর হতে পারে কিন্তু  ইংরেজিতে স্মল ক্যারেক্টর আছে 26 টা, তাই  key কে 26 দিয়ে মডুলাস করতে হবে 
  • স্ট্রিং এর লেংথ দিয়ে লুপ চালিয়ে ক্যারেক্টার বের করতে হবে  
  • (ক্যারেক্টর + key) এর ভ্যালু 122 এর বেশি হলে মডুলাস করে রিমাইন্ডার এর সাথে 96 যোগ করতে হবে। 96 কেন? কারণ 97 = a,  মানে যদি 1 রাইন্ড আপ হয় তাহলে z বা 122   থেকে  (96+1) = 97 বা a হবে
@Slf4j
public class CaesarCipherEncryptor {

    public static String caesarCypherEncryptor(String str, int key) {
        
        int newKey  = key % 26;
        StringBuilder sb = new StringBuilder(str.length());
        
        for(int i=0; i < str.length(); i++) {
            int newChar = str.charAt(i) + newKey;
            newChar = newChar > 122 ? 96 + (newChar % 122) : newChar;
            sb.append((char) newChar);
        }
        
        return sb.toString();
    }

    @Test
    public void TestCase1() {
        Assertions.assertEquals("zab", caesarCypherEncryptor("xyz", 2));
    }
}

Code Solution

Related video solution