DEV Community

Simon Green
Simon Green

Posted on

Weekly Challenge 098

Weekly Challenge 098

Tasks

TASK #1 › Read N-characters

Task

You are given file $FILE.

Create subroutine readN($FILE, $number) returns the first n-characters and moves the pointer to the (n+1)th character

Solution

I have to say I'm surprised that this is the first task given it is more complex (IMO) than the second task. Perl - like most modern languages - is UTF-8 aware. This makes it easier to read characters rather than bytes. But then maybe I'm over thinking this task and it is expected that only English is used.

This task is also complicated as the readN function takes a file name, and not a file handle. To get around this, I use the state function to contain a mapping of file names to file handles, and open a new file handle if it doesn't already exist.

For the reading of the characters, the read function allows us to read the next $n characters (not bytes) into a scalar, which I then print.

Example

For these examples, input.txt contains 1324567890, and hello.txt contains tēnā koe i tēnei ata.

» ./ch-1.pl input.txt 4 4 4
1234
5678
90

» ./ch-1.pl hello.txt 5 5 5
tēnā 
koe i
 tēne
Enter fullscreen mode Exit fullscreen mode

TASK #2 › Search Insert Position

Task

You are given a sorted array of distinct integers @N and a target $N.

Write a script to return the index of the given target if found otherwise place the target in the sorted array and return the index.

My solution

If this was something I was going to use at work, I'd use firstidx from the List::MoreUtils module. However, I have a policy of not using non-core modules when it comes to Team PWC challenges.

For this task I loop over the array in while / each loop. This gives me both of $index and $value while iterating over an array, and saves me having to manually doing this. Using each on arrays was introduced in Perl 5.12.

If a value is greater or equal to the target, I print the index of that value. If no value is found (i.e. the target is greater than the last value), I print the number of input values. This would be the index position of the next value.

Examples

» ./ch-2.pl "(1, 2, 3, 4)" 3
2

» ./ch-2.pl "(1, 3, 5, 7)" 6
3

» ./ch-2.pl "(12, 14, 16, 18)" 10
0

» ./ch-2.pl "(11, 13, 15, 17)" 19
4
Enter fullscreen mode Exit fullscreen mode

Hostinger image

Get n8n VPS hosting 3x cheaper than a cloud solution

Get fast, easy, secure n8n VPS hosting from $4.99/mo at Hostinger. Automate any workflow using a pre-installed n8n application and no-code customization.

Start now

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