aboutsummaryrefslogtreecommitdiff
path: root/challenge-024
diff options
context:
space:
mode:
authorRoger Bell_West <roger@firedrake.org>2019-09-02 09:47:55 +0100
committerRoger Bell_West <roger@firedrake.org>2019-09-02 09:47:55 +0100
commitb38773bd020c745cf2b40a87a18ac10174ecc4c2 (patch)
treed5ca9e053667ec93244206bfa207fffafa8de3dd /challenge-024
parent7422bd4886a665a42bef1fa30935e1fb936c6122 (diff)
downloadperlweeklychallenge-club-b38773bd020c745cf2b40a87a18ac10174ecc4c2.tar.gz
perlweeklychallenge-club-b38773bd020c745cf2b40a87a18ac10174ecc4c2.tar.bz2
perlweeklychallenge-club-b38773bd020c745cf2b40a87a18ac10174ecc4c2.zip
Challenge 24 solutions.
Diffstat (limited to 'challenge-024')
-rw-r--r--challenge-024/roger-bell-west/ch-1-notes.txt9
-rw-r--r--challenge-024/roger-bell-west/perl5/ch-1.pl1
-rwxr-xr-xchallenge-024/roger-bell-west/perl5/ch-2.pl73
-rwxr-xr-xchallenge-024/roger-bell-west/perl6/ch-1.p61
4 files changed, 84 insertions, 0 deletions
diff --git a/challenge-024/roger-bell-west/ch-1-notes.txt b/challenge-024/roger-bell-west/ch-1-notes.txt
new file mode 100644
index 0000000000..52b092e920
--- /dev/null
+++ b/challenge-024/roger-bell-west/ch-1-notes.txt
@@ -0,0 +1,9 @@
+This assumes that the script must be directly executable (./ch-1.pl etc.).
+
+If one can invoke the interpreter separately, then a zero-length file
+is readily usable with perl5, perl6 _and_ GhostScript.
+
+>z
+perl z
+perl6 z
+gs -- z
diff --git a/challenge-024/roger-bell-west/perl5/ch-1.pl b/challenge-024/roger-bell-west/perl5/ch-1.pl
new file mode 100644
index 0000000000..061674ea6f
--- /dev/null
+++ b/challenge-024/roger-bell-west/perl5/ch-1.pl
@@ -0,0 +1 @@
+#! /usr/bin/perl
diff --git a/challenge-024/roger-bell-west/perl5/ch-2.pl b/challenge-024/roger-bell-west/perl5/ch-2.pl
new file mode 100755
index 0000000000..372da02c38
--- /dev/null
+++ b/challenge-024/roger-bell-west/perl5/ch-2.pl
@@ -0,0 +1,73 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+
+my $i=Local::InvIndex->new;
+foreach my $file (@ARGV) {
+ $i->add_doc_file($file);
+}
+my $w=$i->search('chimney');
+foreach my $result (@{$w}) {
+ print join(' ',@{$result}),"\n";
+}
+
+package Local::InvIndex;
+use Lingua::Stem;
+
+sub new {
+ my $class=shift;
+ my $self={};
+ bless $self,$class;
+ $self->{stemmer}=Lingua::Stem->new();
+ $self->{stemmer}->stem_caching({-level => 2});
+ $self->{index}={};
+ return $self;
+}
+
+sub add_doc_string {
+ my $self=shift;
+ my $docname=shift;
+ my @words;
+ my @indices;
+ my $line=0;
+ foreach my $str (@_) {
+ my @l=split /\n/,$str;
+ foreach my $l (@l) {
+ my @w=$self->splitline($l);
+ push @indices,map {[$docname,$line,$_]} (0..$#w);
+ push @words,@w;
+ $line++;
+ }
+ }
+ $self->{stemmer}->stem_in_place(@words);
+ foreach my $i (0..$#words) {
+ push @{$self->{index}{$words[$i]}},$indices[$i];
+ }
+}
+
+sub add_doc_file {
+ my $self=shift;
+ my $filename=shift;
+ my $buf;
+ open I,'<',$filename or die "Can't open filename\n";
+ while (<I>) {
+ $buf.=$_;
+ }
+ close I;
+ $self->add_doc_string($filename,$buf);
+}
+
+sub search {
+ my $self=shift;
+ my @search=shift;
+ $self->{stemmer}->stem_in_place(@search);
+ return $self->{index}{$search[0]} || [];
+}
+
+sub splitline {
+ my $self=shift;
+ my $line=shift;
+ $line =~ s/[^A-za-z ]+/ /g;
+ return grep /./,split ' ',lc($line);
+}
diff --git a/challenge-024/roger-bell-west/perl6/ch-1.p6 b/challenge-024/roger-bell-west/perl6/ch-1.p6
new file mode 100755
index 0000000000..f96b32e61c
--- /dev/null
+++ b/challenge-024/roger-bell-west/perl6/ch-1.p6
@@ -0,0 +1 @@
+#! /usr/bin/perl6