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

Heroku

Amplify your impact where it matters most — building exceptional apps.

Leave the infrastructure headaches to us, while you focus on pushing boundaries, realizing your vision, and making a lasting impression on your users.

Get Started

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

Explore a trove of insights in this engaging article, celebrated within our welcoming DEV Community. Developers from every background are invited to join and enhance our shared wisdom.

A genuine "thank you" can truly uplift someone’s day. Feel free to express your gratitude in the comments below!

On DEV, our collective exchange of knowledge lightens the road ahead and strengthens our community bonds. Found something valuable here? A small thank you to the author can make a big difference.

Okay