Categories
General

Rotational Cipher Facebook

One simple way to encrypt a string is to “rotate” every alphanumeric character by a certain amount. Rotating a character means replacing it with another character that is a certain number of steps away in normal alphabetic or numerical order.For example, if the string “Zebra-493?” is rotated 3 places, the resulting string is “Cheud-726?”. Every alphabetic character is replaced with the character 3 letters higher (wrapping around from Z to A), and every numeric character replaced with the character 3 digits higher (wrapping around from 9 to 0). Note that the non-alphanumeric characters remain unchanged.Given a string and a rotation factor, return an encrypted string.

Signature

string rotationalCipher(string input, int rotationFactor)

Input

1 <= |input| <= 1,000,000 0 <= rotationFactor <= 1,000,000

Output

Return the result of rotating input a number of times equal to rotationFactor.

Example 1

input = Zebra-493? rotationFactor = 3 output = Cheud-726?

Example 2

input = abcdefghijklmNOPQRSTUVWXYZ0123456789 rotationFactor = 39 output = nopqrstuvwxyzABCDEFGHIJKLM9012345678

function rotationalCipher($input, $rotation_factor) {
  
            for($i=0; $i< 26;$i++) {
              $letter = chr(97 + $i);
              $alphabetMap[$letter] = $i;
          }   
   
        $newString = '';
        $input = str_split($input);
        foreach ($input as $item) {
            #Da
            //Sanity Check
            if(!ctype_alpha($item) && !is_numeric($item))
            {
                 $newString .= $item;
            }
            //if character
            if(ctype_alpha($item))
            {
                #item D;a
                $initialstateUpperCase = false; 
                if (ctype_upper($item)) {
                    $initialstateUpperCase = true; #D
                    $item = strtolower($item);  #d
                }
                
                $value = $alphabetMap[$item]; #3;0
                $newValue = $value + $rotation_factor; #5;2
                if($newValue > 26) {
                    $newValue = $newValue % 26;
                }
                $newCharacter = array_search($newValue, $alphabetMap); #f;c
                if($initialstateUpperCase === true)
                {
                    $newCharacter = strtoupper($newCharacter);    #F
                }
            
                $newString .= $newCharacter; #Fc
            }
            
            
            //if integer
            if(is_numeric($item))
            {
                $newValue = $item + $rotation_factor;
                if($newValue > 10) {
                    $newValue = $newValue % 10;
                }
                $newString .= $newValue;
            }
        }
            return $newString;            
  
  
}  

Leave a Reply