diff options
| author | Roger Bell_West <roger@firedrake.org> | 2019-09-02 09:47:55 +0100 |
|---|---|---|
| committer | Roger Bell_West <roger@firedrake.org> | 2019-09-02 09:47:55 +0100 |
| commit | b38773bd020c745cf2b40a87a18ac10174ecc4c2 (patch) | |
| tree | d5ca9e053667ec93244206bfa207fffafa8de3dd | |
| parent | 7422bd4886a665a42bef1fa30935e1fb936c6122 (diff) | |
| download | perlweeklychallenge-club-b38773bd020c745cf2b40a87a18ac10174ecc4c2.tar.gz perlweeklychallenge-club-b38773bd020c745cf2b40a87a18ac10174ecc4c2.tar.bz2 perlweeklychallenge-club-b38773bd020c745cf2b40a87a18ac10174ecc4c2.zip | |
Challenge 24 solutions.
| -rw-r--r-- | challenge-024/roger-bell-west/ch-1-notes.txt | 9 | ||||
| -rw-r--r-- | challenge-024/roger-bell-west/perl5/ch-1.pl | 1 | ||||
| -rwxr-xr-x | challenge-024/roger-bell-west/perl5/ch-2.pl | 73 | ||||
| -rwxr-xr-x | challenge-024/roger-bell-west/perl6/ch-1.p6 | 1 |
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 |
