My word - and min max
Weekly challenge 286 — 9 September 2024
Week 286: 9 Sep 2024
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
Perhaps the hardest part of this is finding the full path to the current script, so that it can be read in. So far as I know, there is no predefined Perl variable that contains it.
In the end I opted for use File::Spec;.
The rest is trivial. I have written it as 3 lines of code for ease of understanding, but they could all be combined into a single line
#!/usr/bin/perl # Blog: http://ccgi.campbellsmiths.force9.co.uk/challenge use v5.26; # The Weekly Challenge - 2024-09-09 use utf8; # Week 286 - task 1 - Self spammer use warnings; # Peter Campbell Smith binmode STDOUT, ':utf8'; use File::Spec; my ($script_path, @words, $rand); # find location of source script $script_path = File::Spec->rel2abs(__FILE__); # split it into 'words' @words = split(/\s+/, `cat $script_path`); # select a random 'word' $rand = int(rand(@words)); say qq[Output: word $rand of ] . (scalar(@words) - 1) . qq[ is '$words[$rand]'];
Output: word 50 of 78 is 'into'
Any content of this website which has been created by Peter Campbell Smith is in the public domain