From b38773bd020c745cf2b40a87a18ac10174ecc4c2 Mon Sep 17 00:00:00 2001 From: Roger Bell_West Date: Mon, 2 Sep 2019 09:47:55 +0100 Subject: Challenge 24 solutions. --- challenge-024/roger-bell-west/ch-1-notes.txt | 9 ++++ challenge-024/roger-bell-west/perl5/ch-1.pl | 1 + challenge-024/roger-bell-west/perl5/ch-2.pl | 73 ++++++++++++++++++++++++++++ challenge-024/roger-bell-west/perl6/ch-1.p6 | 1 + 4 files changed, 84 insertions(+) create mode 100644 challenge-024/roger-bell-west/ch-1-notes.txt create mode 100644 challenge-024/roger-bell-west/perl5/ch-1.pl create mode 100755 challenge-024/roger-bell-west/perl5/ch-2.pl create mode 100755 challenge-024/roger-bell-west/perl6/ch-1.p6 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 () { + $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 -- cgit