Robbie Hatley's Solutions To The Weekly Challenge #286

For those not familiar with "The Weekly Challenge", it is a weekly programming puzzle with two parts, cycling every Sunday. You can find it here:

The Weekly Challenge

The Weekly Challenge for the week of 2024-09-08 through 2024-09-14 is #286. Its tasks are as follows:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Task 286-1: "Self Spammer"
Submitted by: David Ferrone

Write a program which outputs one word of its own script
source code at random. A word is anything between whitespace,
including symbols.

Example 1:
If the source code contains a line such as:
'open my $fh, "<", "ch-1.pl" or die;'
then the program would output each of the words
{ open, my, $fh,, "<",, "ch-1.pl", or, die; }
(along with other words in the source) with some
positive probability.

Example 2:
Technically 'print(" hello ");' is *not* an example program,
because it does not assign positive probability to the other
two words in the script. It will never display print(" or ").

Example 3:
An empty script is one trivial solution, and here is another:
echo "42" > ch-1.pl && perl -p -e '' ch-1.pl

I'll use this approach:

  1. Undefine variable "$/" to turn on whole-file slurping.
  2. Open file at path "$0" (that is, my program will open its own source code).
  3. Slurp the contents of the source into into scalar "$source".
  4. Lex the tokens of $source to @tokens using "my @tokens = split /\s+/, $source;".
  5. Print one of those tokens at-random: 'my $token = $tokens[int rand scalar @tokens]; print "$token\n";'

Robbie Hatley's Perl Solution to The Weekly Challenge 286-1

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Task 286-2: "Order Game"
Submitted by: Mohammad Sajid Anwar
You are given an array of integers, @ints, whose length is a
power of 2. Write a script to play the order game (min and max)
and return the last element.

Example 1
Input: @ints = (2, 1, 4, 5, 6, 3, 0, 2)
Output: 1
Operation 1:
min(2, 1) = 1
max(4, 5) = 5
min(6, 3) = 3
max(0, 2) = 2
Operation 2:
min(1, 5) = 1
max(3, 2) = 3
Operation 3:
min(1, 3) = 1

Example 2
Input: @ints = (0, 5, 3, 2)
Output: 0
Operation 1:
min(0, 5) = 0
max(3, 2) = 3
Operation 2:
min(0, 3) = 0

Example 3
Input: @ints = (9, 2, 1, 4, 5, 6, 0, 7, 3, 1, 3, 5, 7, 9, 0, 8)
Output: 2
Operation 1:
min(9, 2) = 2
max(1, 4) = 4
min(5, 6) = 5
max(0, 7) = 7
min(3, 1) = 1
max(3, 5) = 5
min(7, 9) = 7
max(0, 8) = 8
Operation 2:
min(2, 4) = 2
max(5, 7) = 7
min(1, 5) = 1
max(7, 8) = 8
Operation 3:
min(2, 7) = 2
max(1, 8) = 8
Operation 4:
min(2, 8) = 2

I could use one of the "pairwise" functions from one of the "List::Xxxxxxx" CPAN modules, but in this case it's simpler to use recursion, reducing the "condensed" size of the list by a factor of 2 at each level.

Robbie Hatley's Perl Solution to The Weekly Challenge 286-2

That's it for challenge 286; see you on challenge 287!

Comments

Popular posts from this blog

Robbie Hatley's Solutions To The Weekly Challenge #262

Robbie Hatley's Solutions To The Weekly Challenge #239

Robbie Hatley's Solutions To The Weekly Challenge #266