aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuben Westerberg <drclaw@mac.com>2019-08-24 21:29:19 +1000
committerRuben Westerberg <drclaw@mac.com>2019-08-24 21:29:19 +1000
commit84014b58431f94d05607621f5be85454799a6f7d (patch)
treeeea2fe0154931f6b99adfe07cad2a955a39e4bb3
parent92c9dc707443f1d46ec3a84860c280cf190be249 (diff)
downloadperlweeklychallenge-club-84014b58431f94d05607621f5be85454799a6f7d.tar.gz
perlweeklychallenge-club-84014b58431f94d05607621f5be85454799a6f7d.tar.bz2
perlweeklychallenge-club-84014b58431f94d05607621f5be85454799a6f7d.zip
Basic working version for ch-2.p5
-rwxr-xr-xchallenge-022/ruben-westerberg/perl5/ch-2.pl58
1 files changed, 58 insertions, 0 deletions
diff --git a/challenge-022/ruben-westerberg/perl5/ch-2.pl b/challenge-022/ruben-westerberg/perl5/ch-2.pl
new file mode 100755
index 0000000000..aa504468d6
--- /dev/null
+++ b/challenge-022/ruben-westerberg/perl5/ch-2.pl
@@ -0,0 +1,58 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use v5.26;
+
+# implement LZW
+my @symbols= 'A'..'Z';
+my @indexes;
+for (split "","TOBEORNOTTOBEORTOBEORNOT") {
+ my $res=encode(\@symbols, $_);
+ if ($res) {
+ push @indexes, $res
+ }
+}
+my $res=encode(\@symbols, $_);
+if ($res) {
+ push @indexes, $res
+}
+print join ",",@indexes;
+
+for (@indexes) {
+ print decode(\@symbols,$_),"\n";
+}
+sub encode {
+ state $symbol="";
+ my $dict=shift;
+ state $count= @$dict;
+ my $next=shift;
+ $symbol.=$next if defined $next;
+ print "Symbol: ",$symbol,"\n";
+ state $prev="";
+ print "Prev: ",$prev,"\n";
+ my $s=(grep {$symbol eq $_} @$dict)[0];
+ print "$s\n";
+ print "$symbol\n";
+ my $res;
+ if (defined $s and $next) {
+ #found existing keep adding
+ $res=undef;
+ }
+ else {
+ #add new symbol
+ print "New symbol $symbol\n";
+ #$$dict{$symbol}=$count++;
+ push @$dict, $symbol;
+ $res=(grep {$prev eq $$dict[$_]} 0..@$dict-1)[0];
+ $symbol=substr $symbol, -1;
+ }
+ $prev=$symbol;
+ $res;
+}
+
+
+sub decode {
+ my $dict=shift;
+ my $code=shift;
+ @$dict[$code];
+}