aboutsummaryrefslogtreecommitdiff
path: root/challenge-032
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2019-10-31 14:59:43 +0000
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2019-10-31 14:59:43 +0000
commitf071894759de3f7524b4c2bb9d7898b63980f8a3 (patch)
tree59089d6503c04cc5a16f847611cbcd4b142528d5 /challenge-032
parent9248cd8275c6547fa2f43a8b438b9cd8abdbe543 (diff)
downloadperlweeklychallenge-club-f071894759de3f7524b4c2bb9d7898b63980f8a3.tar.gz
perlweeklychallenge-club-f071894759de3f7524b4c2bb9d7898b63980f8a3.tar.bz2
perlweeklychallenge-club-f071894759de3f7524b4c2bb9d7898b63980f8a3.zip
- Added solutions by Laurent Rosenfeld.
Diffstat (limited to 'challenge-032')
-rw-r--r--challenge-032/laurent-rosenfeld/blog.txt1
-rw-r--r--challenge-032/laurent-rosenfeld/perl5/ch-1.pl14
-rw-r--r--challenge-032/laurent-rosenfeld/perl5/ch-1a.pl19
-rw-r--r--challenge-032/laurent-rosenfeld/perl5/ch-2.pl24
-rw-r--r--challenge-032/laurent-rosenfeld/perl5/ch-2a.pl20
-rw-r--r--challenge-032/laurent-rosenfeld/perl6/ch-1.p68
-rw-r--r--challenge-032/laurent-rosenfeld/perl6/ch-1a.p617
-rw-r--r--challenge-032/laurent-rosenfeld/perl6/ch-2.p621
-rw-r--r--challenge-032/laurent-rosenfeld/perl6/ch-2a.p616
9 files changed, 140 insertions, 0 deletions
diff --git a/challenge-032/laurent-rosenfeld/blog.txt b/challenge-032/laurent-rosenfeld/blog.txt
new file mode 100644
index 0000000000..4f3290bbc4
--- /dev/null
+++ b/challenge-032/laurent-rosenfeld/blog.txt
@@ -0,0 +1 @@
+http://blogs.perl.org/users/laurent_r/2019/10/perl-weekly-challenge-30-word-histogram-and-ascii-bar-chart.html
diff --git a/challenge-032/laurent-rosenfeld/perl5/ch-1.pl b/challenge-032/laurent-rosenfeld/perl5/ch-1.pl
new file mode 100644
index 0000000000..f2bde92eb6
--- /dev/null
+++ b/challenge-032/laurent-rosenfeld/perl5/ch-1.pl
@@ -0,0 +1,14 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+
+my %histo;
+while (<>) {
+ chomp;
+ s/\s+$//;
+ next if /^\s*$/; # skipping empty lines
+ $histo{$_}++;
+}
+for my $key (sort { $histo{$b} <=> $histo{$a} } keys %histo) {
+ printf "%-20s%d\n", $key, $histo{$key};
+}
diff --git a/challenge-032/laurent-rosenfeld/perl5/ch-1a.pl b/challenge-032/laurent-rosenfeld/perl5/ch-1a.pl
new file mode 100644
index 0000000000..111cb96d25
--- /dev/null
+++ b/challenge-032/laurent-rosenfeld/perl5/ch-1a.pl
@@ -0,0 +1,19 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use feature qw/say/;
+
+my %histo;
+my $csv_flag = shift;
+
+while (<>) {
+ chomp;
+ s/\s+$//;
+ next if /^\s*$/; # skipping empty lines
+ $histo{$_}++;
+}
+my $format = $csv_flag ? "%s,%d\n" : "%-20s%d\n";
+
+for my $key (sort { $histo{$b} <=> $histo{$a} } keys %histo) {
+ printf $format, $key, $histo{$key};
+}
diff --git a/challenge-032/laurent-rosenfeld/perl5/ch-2.pl b/challenge-032/laurent-rosenfeld/perl5/ch-2.pl
new file mode 100644
index 0000000000..1d965f19d9
--- /dev/null
+++ b/challenge-032/laurent-rosenfeld/perl5/ch-2.pl
@@ -0,0 +1,24 @@
+use strict;
+use warnings;
+use feature qw/say/;
+
+sub generate_chart {
+ my %data = %{$_[0]};
+ my $sort_type = $_[1] // "val";
+ my ($max, $min);
+ for my $key (keys %data) {
+ ($max, $min) = ($data{$key}, $data{$key}) unless defined $max;
+ $max = $data{$key} if $data{$key} > $max;
+ $min = $data{$key} if $data{$key} < $min;
+ }
+ my $scale_factor = 10 / ($max - $min);
+ my $sort_routine = ($sort_type =~ /val/i)
+ ? sub { $data{$b} <=> $data{$a} }
+ : sub {$a cmp $b };
+ for my $key (sort $sort_routine keys %data) {
+ printf "%15s | %s\n", $key, "#" x ($data{$key} * $scale_factor);
+ }
+}
+my $sort_type = shift;
+my $data = { cherry => 20, apple => 30, banana => 10, pear => 25};
+generate_chart $data, $sort_type;
diff --git a/challenge-032/laurent-rosenfeld/perl5/ch-2a.pl b/challenge-032/laurent-rosenfeld/perl5/ch-2a.pl
new file mode 100644
index 0000000000..3703f53b02
--- /dev/null
+++ b/challenge-032/laurent-rosenfeld/perl5/ch-2a.pl
@@ -0,0 +1,20 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use feature qw/say/;
+
+sub generate_chart {
+ my %data = %{$_[0]};
+ my ($max, $min);
+ for my $key (keys %data) {
+ ($max, $min) = ($data{$key}, $data{$key}) unless defined $max;
+ $max = $data{$key} if $data{$key} > $max;
+ $min = $data{$key} if $data{$key} < $min;
+ }
+ my $scale_factor = 10 / ($max - $min);
+ for my $key (sort { $data{$b} <=> $data{$a} } keys %data) {
+ printf "%15s | %s\n", $key, "#" x ($data{$key} * $scale_factor);
+ }
+}
+my $data = { apple => 30, cherry => 60, banana => 10, pear => 40 };
+generate_chart $data;
diff --git a/challenge-032/laurent-rosenfeld/perl6/ch-1.p6 b/challenge-032/laurent-rosenfeld/perl6/ch-1.p6
new file mode 100644
index 0000000000..e653b600f1
--- /dev/null
+++ b/challenge-032/laurent-rosenfeld/perl6/ch-1.p6
@@ -0,0 +1,8 @@
+use v6;
+
+sub MAIN (*@files) {
+ my $histo = @files.map({.IO.lines}).Bag;
+ for reverse sort {$histo{$_}}, keys $histo -> $key {
+ printf "%-20s%d\n", $key, $histo{$key};
+ }
+}
diff --git a/challenge-032/laurent-rosenfeld/perl6/ch-1a.p6 b/challenge-032/laurent-rosenfeld/perl6/ch-1a.p6
new file mode 100644
index 0000000000..12f1ba2fb9
--- /dev/null
+++ b/challenge-032/laurent-rosenfeld/perl6/ch-1a.p6
@@ -0,0 +1,17 @@
+use v6;
+subset file of Str where *.IO.f;
+
+multi sub MAIN (Int $csv, *@files where all(@files) ~~ file) {
+ my $*format = $csv ?? "%s,%d\n" !! "%-20s%d\n";
+ readfiles @files;
+}
+multi sub MAIN (*@files where all(@files) ~~ file) {
+ my $*format = "%-20s%d\n";
+ readfiles @files;
+}
+sub readfiles (@files) {
+ my $histo = @files.map({.IO.lines}).Bag;
+ for reverse sort {$histo{$_}}, keys $histo -> $key {
+ printf $*format, $key, $histo{$key};
+ }
+}
diff --git a/challenge-032/laurent-rosenfeld/perl6/ch-2.p6 b/challenge-032/laurent-rosenfeld/perl6/ch-2.p6
new file mode 100644
index 0000000000..c0097a550e
--- /dev/null
+++ b/challenge-032/laurent-rosenfeld/perl6/ch-2.p6
@@ -0,0 +1,21 @@
+use v6;
+
+sub generate_chart (%data) {
+ my ($max, $min);
+ for keys %data -> $key {
+ ($max, $min) = (%data{$key}, %data{$key}) unless defined $max;
+ $max = %data{$key} if %data{$key} > $max;
+ $min = %data{$key} if %data{$key} < $min;
+ }
+ my $scale_factor = 10 / ($max - $min);
+ my &sort_routine = ($*sort-type ~~ m:i/val/)
+ ?? { %data{$^b} <=> %data{$^a} }
+ !! {$^a cmp $^b };
+ for sort &sort_routine, keys %data -> $key {
+ printf "%15s | %s\n", $key, "#" x (%data{$key} * $scale_factor);
+ }
+}
+sub MAIN (Str $*sort-type) {
+ my $data = { apple => 3, cherry => 6, banana => 1, pear => 4 };
+ generate_chart $data;
+}
diff --git a/challenge-032/laurent-rosenfeld/perl6/ch-2a.p6 b/challenge-032/laurent-rosenfeld/perl6/ch-2a.p6
new file mode 100644
index 0000000000..0fcbc14e2f
--- /dev/null
+++ b/challenge-032/laurent-rosenfeld/perl6/ch-2a.p6
@@ -0,0 +1,16 @@
+use v6;
+
+sub generate_chart (%data) {
+ my ($max, $min);
+ for keys %data -> $key {
+ ($max, $min) = (%data{$key}, %data{$key}) unless defined $max;
+ $max = %data{$key} if %data{$key} > $max;
+ $min = %data{$key} if %data{$key} < $min;
+ }
+ my $scale_factor = 10 / ($max - $min);
+ for sort { %data{$^b} <=> %data{$^a} }, keys %data -> $key {
+ printf "%15s | %s\n", $key, "#" x (%data{$key} * $scale_factor);
+ }
+}
+my $data = { apple => 3, cherry => 6, banana => 1, pear => 4 };
+generate_chart $data;