DEV Community

Simon Green
Simon Green

Posted on

Weekly Challenge 097

Challenge 097

TASK #1 › Caesar Cipher

The task

You are given string $S containing alphabets A..Z only and a number $N.

Write a script to encrypt the given string $S using Caesar Cipher with left shift of size $N.

My solution

First thing to note is the tr function does not support string interpolation, as the translation table is built at compile time.

I broke down the task into these steps:

  • Check the string only contains A - Z and spaces. Check the number is an integer between 1 and 25.
  • Use substr to create the cipher table
  • Create a %mapping hash mapping plain text characters to their cipher equivalent.
  • Use split, map and join to generate the cipher text, and then display it

Examples

» ./ch-1.pl "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG" 3
QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD

» ./ch-1.pl "QEB NRFZH YOLTK CLU GRJMP LSBO QEB IXWV ALD" 23
THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
Enter fullscreen mode Exit fullscreen mode

TASK #2 › Binary Substrings

The task

You are given a binary string $B and an integer $S.

Write a script to split the binary string $B of size $S and then find the minimum number of flips required to make it all the same.

The solution

This is one of those tasks where the solution I submit isn't the fastest one, but one that is well explained.

  1. I first check that the binary value contains only 0's and 1's. I also check the second value is a positive integer. While the tasks that $S is an integer, a zero or negative integer is nonsensical in this sense.
  2. I add leading zeros to the binary value if it's length is not dividable by the integer. I think use unpack to break up the binary value into the array @chunks
  3. Next I work through each character position determining whether the bit is set (1) or not set (0) more frequently. If it's half and half, I use '0' but could use '1' as it would give the same result. The resulting value is stored as $most_used
  4. Finally, I go through each @chunk and each character, and add to the $flips value if the bit is different from that in the $most_used string. I then display the minimum number of flips required.

This code could more concise by skipping the last step and doing the calculations in the third step. For example, if the first character was '0, 1, 1, 1' then we would only need one flip to make them all the same.

Examples

» ./ch-2.pl 101100101 3
1

» ./ch-2.pl 10110111 4
2
Enter fullscreen mode Exit fullscreen mode

Top comments (0)