In this HackerRank Cipher problem, solution Jack and Daniel are friends. They want to encrypt their conversations so that they can save themselves from interception by a detective agency so they invent a new cipher.
Every message is encoded to its binary representation. Then it is written down K times, shifted by 0,1,…, K – 1 bits. Each of the columns is XORed together to get the final encoded string.
Problem solution in Python.
def function(s,k,n): result=[] sum=0 appendence=0 for i in range(n): appendence = (sum+int(s[i]))&1 result.append(appendence) prev=i-k+1 if prev <0: remain = 0 else: remain = result[prev] sum=sum + appendence - remain return ''.join(map(str,result)) n, k = map(int, input().split(' ')) s = input() print(function(s,k,n))
Problem solution in Java.
import java.io.*; import java.util.*; public class Solution { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String[] line = scanner.nextLine().split(" "); int n = Integer.valueOf(line[0]); int k = Integer.valueOf(line[1]); String s = scanner.nextLine(); StringBuilder builder = new StringBuilder(n); int previous = 0; for(int position = 0; position<n; position++) { if(position>=k) { previous ^= builder.charAt(position-k)-48; } int sgap = s.charAt(s.length()-1-position)-48; if((previous^sgap)==1) { builder.append('1'); } else { builder.append('0'); } previous = sgap; } System.out.println(builder.reverse().toString()); } }
Problem solution in C++.
#include <iostream> #include <vector> #include <queue> #include <algorithm> #include <map> #include <string> #include <climits> using namespace std; int main(){ int N,K; cin >> N >> K; string s; cin >> s; vector<int> v(s.size()); for(int i=0; i<s.size(); i++){ v[i] = s[i] - '0'; } vector<int> x = v; for(int i=1; i<s.size(); i++){ x[i] = v[i] ^ v[i-1]; if(i-K >= 0) x[i] ^= x[i-K]; } for(int i=0; i<N; i++){ cout << x[i]; } cout << endl; return 0; }
Problem solution in C.
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> int main() { int k, n, x, i; char *t; int *r; scanf("%d %d", &n, &k); t = (char*) malloc(sizeof(int)*(n + k - 1)); r = (int*) malloc(sizeof(int)*n); scanf("%c", t); for (i = 0; i < n + k - 1; i++) scanf("%c", t + i); r[0] = t[0] - 48; for (i = 1; i < k; i++) { r[i] = (t[i - 1] - 48) ^ (t[i] - 48); } for (i; i < n - k; i++) r[i] = r[i - k] ^ (t[i - 1] - 48) ^ (t[i] - 48); r[n - 1] = (t[n + k - 2] - 48); for (i = 1; i < k; i++) { r[n - 1 - i] = (t[n + k - i - 1] - 48) ^ (t[n + k - 2 - i] - 48); } for (i = 0; i < n; i++) printf("%d", r[i]); free(t); free(r); return 0; }