HackerRank Encryption Problem Solution
In this post, we will solve HackerRank Encryption Problem Solution.
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:
[√] ≤ row <column ≤ [√], where [x] is floor function and [x] is ceil function
Example
8 = 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 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
Sample Input
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 (2368 so we have to use 3X3.)
chi
llo
ut
Encryption C Solutions
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
char str[99];
int main() {
gets(str);
int len = strlen(str), col;
for(int i=1;;i++) {
if(i*i>=len) {
col = i;
break;
}
if(i*(i+1)>=len>=len) {
col = i+1;
break;
}
}
for(int i=0;i<col;i++) {
if(i) printf(" ");
for(int j=i;j<len;j+=col) {
printf("%c", str[j]);
}
}
puts("");
return 0;
}
Encryption C++ Solutions
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
string s; cin >> s;
size_t len = s.size();
int rows = floor(sqrt(len));
int cols = ceil(sqrt(len));
if (rows*cols < len && rows<cols) ++rows;
cerr << len<<"<="<<rows<<"x"<<cols<<endl;
for (int c=0; c < cols; ++c) {
for (int r=0; r < rows; ++r){
int index = r*cols+c;
if (index < len) cout << s[index];
}
cout << " ";
}
return 0;
}
Encryption C Sharp Solutions
using System;
using System.Collections.Generic;
using System.IO;
class Solution {
static void Main(String[] args) {
string line = Console.ReadLine();
int len = line.Length;
double sqrtLen = Math.Sqrt((double)len);
int floor = (int)Math.Floor(sqrtLen);
int ceiling = (int)Math.Ceiling(sqrtLen);
int row, col;
if (Math.Abs(len - floor * floor) < 1e-6) { //square
row = floor;
col = floor;
} else {
row = ceiling;
col = ceiling;
}
//Console.WriteLine(row.ToString() + " " + col.ToString());
for (int i=0; i<col; ++i) {
for (int j=0; j<row; ++j) {
int idx = i + j * col;
if (idx < len)
Console.Write(line[idx]);
}
Console.Write(" ");
}
}
}
Encryption Java Solutions
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
import java.util.regex.*;
import java.util.stream.*;
import static java.util.stream.Collectors.joining;
import static java.util.stream.Collectors.toList;
class Result {
/*
* Complete the 'encryption' function below.
*
* The function is expected to return a STRING.
* The function accepts STRING s as parameter.
*/
public static String encryption(String s) {
// Write your code here
s = s.replaceAll(" ", "");
double initialCharactersPerWord = Math.ceil(Math.sqrt(s.length()));
int charactersPerWord = (int) initialCharactersPerWord;
int numberOfWords = (int)Math.ceil(s.length()/initialCharactersPerWord);
String[] arrayOfWords = new String[numberOfWords];
for(int i = 0; i < numberOfWords; i++){
int start = i * charactersPerWord;
if(i != numberOfWords - 1){
arrayOfWords[i] = s.substring(start, start + charactersPerWord);
}else{
arrayOfWords[i] = s.substring(start);
}
}
String[] answers = new String[arrayOfWords[0].length()];
Arrays.fill(answers, "");
for(int i = 0; i < numberOfWords; i++){
for(int j = 0; j < arrayOfWords[i].length(); j++){
answers[j] += arrayOfWords[i].charAt(j);
}
}
StringBuilder finalAnswer = new StringBuilder();
for(int i = 0; i < answers.length; i++){
if(i != answers.length -1){
finalAnswer.append(answers[i]).append(" ");
}else{
finalAnswer.append(answers[i]);
}
}
return finalAnswer.toString();
}
}
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
String s = bufferedReader.readLine();
String result = Result.encryption(s);
bufferedWriter.write(result);
bufferedWriter.newLine();
bufferedReader.close();
bufferedWriter.close();
}
}
Encryption JavaScript Solutions
function processData() {
var S = readLine();
var L = S.length;
var row = Math.floor(Math.sqrt(L));
var column = Math.ceil(Math.sqrt(L));
if(row*row > L)
column = row;
if(row*column < L)
row = column;
var arr = [];
var out = '';
for(var i = 0; i < row; i++) {
arr.push(S.substr(column * i,column));
}
for(var i = 0; i < column; i++) {
for(var j = 0; j < row; j++) {
out += String(arr[j]).charAt(i);
}
out += ' ';
}
//console.log(row + ' -- ' + column + ' -- ' + L);
console.log(out);
}
var _input_array = null;
var _input_line = 0;
function readLine() {
return _input_array[_input_line++];
}
_input = "";
process.stdin.resume();
process.stdin.setEncoding("ascii");
process.stdin.on("data", function (input) {
_input += input;
});
process.stdin.on("end", function () {
_input_array = _input.split("\n");
processData();
});
Encryption Python Solutions
import math
def isWithinRange(width, height, lower, upper):
return width >= lower and height >= lower and width <= upper and height <= upper
msg = input()
length = len(msg)
lower = math.floor(math.sqrt(length))
upper = math.ceil(math.sqrt(length))
height = lower
width = upper
while width * height >= length:
if((width - 1) * (height - 1) >= length and isWithinRange(width-1,height-1,lower,upper) ):
width = width - 1
height = height - 1
elif(width * (height - 1) >= length and isWithinRange(width,height-1,lower,upper)):
height = height - 1
elif((width - 1) * height >= length and isWithinRange(width-1,height,lower,upper)):
width = width - 1
else:
break
x = 0
lines = []
while(True):
if x+width < length:
lines.append(msg[x:x+width])
x = x+width
else:
lines.append(msg[x:])
break
encoded = []
result = []
x = 0
while(x < width):
row = []
for line in lines:
if x < len(line):
row.append(line[x])
encoded.insert(x,row)
result.append(''.join(encoded[x]))
x = x+1
print(' '.join(result))
Other Solutions