Encryption – HackerRank Solution

In this post, we will solve Encryption HackerRank Solution. This problem (Encryption) is a part of HackerRank Algorithms series.

Task

An English text needs to be encrypted using the following encryption scheme.
First, the spaces are removed from the text. Let L be the length of this text.
Then, characters are written into a grid, whose rows and columns have the following constraints:

[√L] <= row <= column <= [√L] , where [x] is the floor function and [x] is ceil function

Example

s = if man was meant to stay on the ground god would have given us roots

After removing spaces, the string is 54 characters long. √54 is between 7 and 8, so it is written in the form of a grid with 7 rows and 8 columns.

ifmanwas  
meanttos          
tayonthe  
groundgo  
dwouldha  
vegivenu  
sroots
  • Ensure that rows x columns >= L
  • If multiple grids satisfy the above conditions, choose the one with the minimum area, i.e. rows x columns.

The encoded message is obtained by displaying the characters of each column, with a space between column texts. The encoded message for the grid above is:

imtgdvs fearwer mayoogo anouuio ntnnlvt wttddes aohghn sseoau

Create a function to encode a message.

Function Description

Complete the encryption function in the editor below.

encryption has the following parameter(s):

  • string s: a string to encrypt

Returns

  • string: the encrypted string

Input Format

One line of text, the string s

Constraints

  • 1 <= length of s <= 81
  • s contains characters in the range ascii[a-z] and space, ascii(32).

Sample Input 0

haveaniceday

Sample Output 0

hae and via ecy

Explanation 0

L = 12, √12 is between 3 and 4.
Rewritten with 3 rows and 4 columns:

have
anic
eday

Sample Input 1

feedthedog    

Sample Output 1

fto ehg ee dd

Explanation 1

L = 10, √10 is between 3 and 4.
Rewritten with 3 rows and 4 columns:

feed
thed
og

Sample Input 2

chillout

Sample Output 2

clu hlt io

Explanation 2

L = 8, √8 is between 2 and 3.
Rewritten with 3 columns and 3 rows (2 * 3 = 6 < 8 so we have to use 3 X 3.)

Solution – Encryption – HackerRank Solution

C++

#include <cstring>
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>

using namespace std;

#define MAXN 1000
char str[MAXN];
char res[MAXN][MAXN];
int gr,gc;
int r,c;

int main(){
   scanf("%s",str);
   int len = strlen(str); int DIFF = 1<<20; int AREA = 1<<20;
   for(int i=1; i<=100; ++i) {
     if(i*i>=len) {
         r = i; c = i; break;
     }     
     if(i*(i+1)>=len){
         r = i; c = i+1; break;
     }
   }
   int id = 0;
   for(int i=0; i<MAXN; ++i) for(int j=0; j<MAXN; ++j) res[i][j] = '\0';
   for(int i=0; i<r; ++i) for(int j=0; j<c; ++j) res[i][j] = str[id++];
   for(int i=0; i<c; ++i) {
      for(int j=0; res[j][i]!='\0'; ++j) printf("%c",res[j][i]);
      printf(" ");
   } 
   
   return 0;
}

Python

#!/bin/python3

import sys
from math import sqrt
from math import ceil

def get_grid(number):
    root = sqrt(number)
    
    x = int(root//1)
    y = ceil(root)
    
    while x*y < number:
        if x <= y:
            x += 1
        else:
            y += 1
        
    return (x, y)

def encryption(string):
    string = string.strip().replace(' ', '')
    str_len = len(string)
    
    x, y = get_grid(str_len)
    #print("x = {} y = {}".format(x, y))
    grid = [ [ '' for i in range(x) ] for _j in range(y) ]
    
    count = 0
    x_ind = 0
    y_ind = 0
    for ind in range(str_len):
        if count / y == 1 and count % y == 0:
            count = 0
            y_ind += 1
            x_ind = 0
            
        grid[x_ind][y_ind] = string[ind]
        count += 1
        x_ind += 1
        
    #print(grid)
    out = ''
    for _i in range(y):
        for _j in range(x):
            out += grid[_i][_j]
        out += ' '
    #print(out)
        
    #out = ''
    #for _i in range(y):
    #    for _j in range(x):
    #        out += grid[_i][_j]
    #    out += ' '

    return out
        
if __name__ == "__main__":
    s = input().strip()
    result = encryption(s)
    print(result)

Java

import java.util.Scanner;


public class Solution {

    
    public static void main(String[] args) {
        Scanner scan= new Scanner(System.in);
        String s= scan.next();
        int wid,len;
        int l=s.length();
        double f=Math.sqrt(l);
        int test=(int)f;
        if(test*test==l){
            wid=test;
            len=test;
        }else{
        wid=test;
        len=test+1;
        if(wid*len<l)
            wid++;
        }
        int a=0;
        char arr[][] = new char[wid][len];
        for(int i=0;i<wid;i++){
            for(int j=0;j<len;j++){
                if(a==s.length())
                    arr[i][j]=' ';
                else
                arr[i][j]=s.charAt(a++);
                
            }
            if(a==s.length())
                break;
        }
        String temp="";
        boolean go=false;
        for(int i=0;i<len;i++){
            for(int j=0;j<wid;j++){
                if(!(arr[j][i]==' ')){
                temp=temp+arr[j][i];
                go=true;
                }
            }
            if(go)
                temp=temp+" ";
            go=false;
        }
        System.out.println(temp);
    }

}

Note: This problem (Encryption) is generated by HackerRank but the solution is provided by CodingBroz. This tutorial is only for Educational and Learning purpose.

Leave a Comment

Your email address will not be published. Required fields are marked *