Skip to content
Permalink
57d9b05dac
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
executable file 147 lines (110 sloc) 4.19 KB
#!/usr/bin/perl -w
use strict;
use Getopt::Long;
my $VERSION = '7.0';
sub USAGE {
print <<"eof";
usage: $0 [options]
--numberofwords -nw <n[-m]> : number of words, ranged from n to m
--enumerate -en <n> : create a list of arguments
--namethischicken : tell the chickens name
--printchickenversion : print out "$VERSION"
--seed <n> : feed the random chicken
eof
exit;
}
our %OPT;
my $opt_version = 0;
my $opt_numberOfWords = -1;
my $opt_numberOfWordsRange = '15-75';
my $opt_numberOfWordsRangeStart = 0;
my $numberOfWords = 0;
my $opt_namethischicken = 0;
my $opt_seed = 0;
my ( $f, $t ) = ( 0, 0 );
my $opt_enumerate = 0;
GetOptions(
'numberofwords|nw=s' => \$opt_numberOfWordsRange,
'enumerate|en=i' => \$opt_enumerate,
'namethischicken' => \$opt_namethischicken,
'printchickenversion' => \$opt_version,
'seed=i' => \$opt_seed,
) or USAGE;
if ($opt_version) {
print $VERSION. "\n";
exit;
}
srand( $opt_seed ? $opt_seed : time() );
my @WORDS = ( "puk", "pukaak", "cluck", "cluckity", "bwak", "waak", "bok", "bwok", "cluck-a-buh-gawk", "cock-a-doodle-doo", "bwwwaak", "gobble", "honk" );
my @PUNCTUATIONS = ( ".", "...", "!", "?" );
if ($opt_namethischicken) {
my %ChickenPopulation;
my @ChickenNames = grep { !/-/ } @WORDS;
for my $pn (@ChickenNames) {
for my $ln (@ChickenNames) {
$ChickenPopulation{ ucfirst($pn) . ' ' . ucfirst($ln) } = $pn eq $ln ? 1 : 2;
}
}
# "Waak Bok" could also be married to "Cluck" which would end up in "Waak Bok-Cluck"
for my $pn (@ChickenNames) {
for ( keys %ChickenPopulation ) {
push @_, ucfirst($pn) . ' ' . $_ unless $ChickenPopulation{$_} == 1;
}
}
for (@_) { s/( \w+) /$1-/; $ChickenPopulation{$_} = 3 }
my @CN = keys %ChickenPopulation;
my $chickensname = $CN[ rand( scalar @CN ) ];
print "$chickensname\n";
exit;
}
if ( $opt_numberOfWordsRange =~ m/^\d+$/ ) {
$opt_numberOfWords = $opt_numberOfWordsRange;
}
elsif ( $opt_numberOfWordsRange =~ m/^\d+-\d+$/ ) {
( $f, $t ) = split( /-/, $opt_numberOfWordsRange, 2 );
}
else {
print STDERR "wrong format for --numberofwords\n";
print STDERR "should be either 'n' or 'n-m'. ( '-nw 50' or '-nw 30-90''\n";
exit;
}
my $enumerate = ($opt_enumerate) ? $opt_enumerate : 1;
for ( my $e = 0; $e < $enumerate; $e++ ) {
if ( $opt_numberOfWords >= 0 ) {
$numberOfWords = $opt_numberOfWords;
}
else {
$numberOfWords = int( rand( abs( $f - $t ) + 1 ) + ( ( $f < $t ) ? $f : $t ) );
}
# generate paragraph, with random words, capitalization, and punctuation.
my $paragraph = "";
my $previousWordHadPunctuation = 0;
for ( my $i = 0; $i < $numberOfWords; $i++ ) {
# pick a random word
my $word = $WORDS[ int( rand( scalar @WORDS ) ) ];
# magic multiplier
$word = join( "-", ($word) x ( 4 - int( ( log( rand(7) + 1 ) / log(2) ) + 1 ) ) );
# even more magical multiplier
$word =~ s/([aou]){2,}?/$1 x (rand(7)+1)/ge;
# optionally add punctuation
# note: always add punctuation if it's the last word.
my $shouldAddPunctuation = $i == $numberOfWords - 1 || rand() > 0.9;
my $punctuation = $shouldAddPunctuation ? $PUNCTUATIONS[ int( rand( scalar @PUNCTUATIONS ) ) ] : "";
$word = $word . $punctuation;
# optionally capitalize the word
# note: always capitalize if it's the first words, or if preceded by punctuation
my $shouldCapitalize = $i == 0 || $previousWordHadPunctuation || rand() > 0.7;
$word = $shouldCapitalize ? uc( substr( $word, 0, 1 ) ) . substr( $word, 1 ) : $word;
# preserve info for next iteration
$previousWordHadPunctuation = $shouldAddPunctuation;
# add word to paragraph
$paragraph = $paragraph . $word;
# if not last one, add a space
$paragraph = $i == $numberOfWords - 1 ? $paragraph : $paragraph . " ";
}
if ($opt_enumerate) {
printf "%d. ", $e + 1;
}
print $paragraph;
print "\n";
}