aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Pankoff <ccntrq@screenri.de>2020-10-05 15:25:58 +0200
committerAlexander Pankoff <ccntrq@screenri.de>2020-10-11 16:51:54 +0200
commite09cb2388819499fb6b9e2db26823af6a8398674 (patch)
treedf4089ac161a8cff25fecfd681203fc9537ba556
parent550d5ddadd1379345c9e25e451f97f562a2d00d5 (diff)
downloadperlweeklychallenge-club-e09cb2388819499fb6b9e2db26823af6a8398674.tar.gz
perlweeklychallenge-club-e09cb2388819499fb6b9e2db26823af6a8398674.tar.bz2
perlweeklychallenge-club-e09cb2388819499fb6b9e2db26823af6a8398674.zip
add perl solution for wk-081 ch-2
-rw-r--r--challenge-081/alexander-pankoff/perl/ch-2.pl53
1 files changed, 53 insertions, 0 deletions
diff --git a/challenge-081/alexander-pankoff/perl/ch-2.pl b/challenge-081/alexander-pankoff/perl/ch-2.pl
new file mode 100644
index 0000000000..c560ba5cac
--- /dev/null
+++ b/challenge-081/alexander-pankoff/perl/ch-2.pl
@@ -0,0 +1,53 @@
+#!/usr/bin/env perl
+use v5.20;
+use utf8;
+use strict;
+use warnings;
+use autodie;
+use feature qw(say signatures);
+no warnings 'experimental::signatures';
+
+use List::Util qw(reduce);
+
+run_challenge();
+
+sub run_challenge() {
+ my ($input_file) = @ARGV;
+ my $frequencies_to_words =
+ frequency_sort( words( sanitize_input( read_file($input_file) ) ) );
+ print_word_frequencies($frequencies_to_words);
+}
+
+sub print_word_frequencies($frequencies) {
+ say join( ' ', $_, @{ $frequencies->{$_} } )
+ for sort { $a <=> $b } keys %{$frequencies};
+}
+
+sub frequency_sort(@words) {
+ my %word_count;
+ $word_count{$_}++ for @words;
+ my %frequencies;
+ push @{ $frequencies{ $word_count{$_} } }, $_ for sort keys %word_count;
+
+ return \%frequencies;
+}
+
+# split the given string into words
+sub words($str) {
+ return split( /\s+/, $str );
+}
+
+# replace illegal chars with whitespace
+sub sanitize_input($input) {
+ return $input =~ s/[\."\(\),]|--|'s/ /rg;
+}
+
+# read the whole file
+sub read_file($filename) {
+ local $/ = undef;
+ open( my $fh, '<', $filename );
+ my $out = <$fh>;
+ close($fh);
+ return $out;
+}
+