From cd4b8f149a5a34e8702b9c156659702fe654fa4d Mon Sep 17 00:00:00 2001 From: "Kian-Meng, Ang" Date: Sun, 5 May 2019 21:04:15 +0800 Subject: Challenge #006 answers and challenge #005 blog link --- challenge-005/kian-meng-ang/blog.txt | 1 + challenge-005/kian-meng-ang/ch-1.pl | 40 -------------------------- challenge-005/kian-meng-ang/ch-2.pl | 44 ---------------------------- challenge-005/kian-meng-ang/perl5/ch-1.pl | 40 ++++++++++++++++++++++++++ challenge-005/kian-meng-ang/perl5/ch-2.pl | 44 ++++++++++++++++++++++++++++ challenge-006/kian-meng-ang/perl5/ch-1.pl | 48 +++++++++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 84 deletions(-) create mode 100644 challenge-005/kian-meng-ang/blog.txt delete mode 100644 challenge-005/kian-meng-ang/ch-1.pl delete mode 100644 challenge-005/kian-meng-ang/ch-2.pl create mode 100644 challenge-005/kian-meng-ang/perl5/ch-1.pl create mode 100644 challenge-005/kian-meng-ang/perl5/ch-2.pl create mode 100644 challenge-006/kian-meng-ang/perl5/ch-1.pl diff --git a/challenge-005/kian-meng-ang/blog.txt b/challenge-005/kian-meng-ang/blog.txt new file mode 100644 index 0000000000..c43cc5892a --- /dev/null +++ b/challenge-005/kian-meng-ang/blog.txt @@ -0,0 +1 @@ +https://www.kianmeng.org/2019/05/perl-weekly-challenge-005-2019-week-17.html diff --git a/challenge-005/kian-meng-ang/ch-1.pl b/challenge-005/kian-meng-ang/ch-1.pl deleted file mode 100644 index 7bf4e81372..0000000000 --- a/challenge-005/kian-meng-ang/ch-1.pl +++ /dev/null @@ -1,40 +0,0 @@ -#!/usr/bin/env perl - -use 5.010; -use autodie; -use strict; -use warnings; -use utf8; -use Carp; - -carp 'missing word and dictionary file' if (@ARGV != 2); -my ($word, $dict) = @ARGV; -my $word_hash = join '', sort split //, $word; -my $word_length = length $word_hash; -my @anagrams; - -open my $fh, '<:encoding(UTF-8)', $dict; -while (my $dword = <$fh>) { - chomp $dword; - next if (length $dword != $word_length); - - my $dword_hash = join '', sort split //, $dword; - next if ($dword_hash ne $word_hash); - next if ($dword eq $word); - - push @anagrams, $dword; -} -close $fh; - -say sprintf 'Word: %s', $word; -say sprintf 'Anagrams: %s', join q|, |, @anagrams; - -1; - -__END__ - -$ perl ch-1.pl elbow /usr/share/dict/words -Word: elbow -Anagrams: below, bowel - -# vi:et:sw=4 ts=4 ft=perl diff --git a/challenge-005/kian-meng-ang/ch-2.pl b/challenge-005/kian-meng-ang/ch-2.pl deleted file mode 100644 index 18e659b925..0000000000 --- a/challenge-005/kian-meng-ang/ch-2.pl +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env perl - -use 5.010; -use autodie; -use strict; -use warnings; -use utf8; -use Carp; -use List::Util qw(max); - -carp 'missing dictionary file' if (@ARGV != 1); -my ($dict) = @ARGV; -my %anagram_list; - -open my $fh, '<:encoding(UTF-8)', $dict; -while (my $dword = <$fh>) { - chomp $dword; - - my $dword_hash = join '', sort split //, $dword; - push @{ $anagram_list{$dword_hash} }, $dword; -} -close $fh; - -my $max_anagram_count = max(map { scalar @{$_} } values %anagram_list); - -foreach my $anagrams (values %anagram_list) { - next if (scalar @{$anagrams} != $max_anagram_count); - say sprintf 'Total anagrams: %d', scalar @{$anagrams}; - say sprintf 'Anagrams: %s', join q|, |, @{$anagrams}; - say q||; -} - -1; - -__END__ - -$ perl ch-2.pl /usr/share/dict/words -Total anagrams: 7 -Anagrams: carets, caster, caters, crates, reacts, recast, traces - -Total anagrams: 7 -Anagrams: pares, parse, pears, rapes, reaps, spare, spear - -# vi:et:sw=4 ts=4 ft=perl diff --git a/challenge-005/kian-meng-ang/perl5/ch-1.pl b/challenge-005/kian-meng-ang/perl5/ch-1.pl new file mode 100644 index 0000000000..7bf4e81372 --- /dev/null +++ b/challenge-005/kian-meng-ang/perl5/ch-1.pl @@ -0,0 +1,40 @@ +#!/usr/bin/env perl + +use 5.010; +use autodie; +use strict; +use warnings; +use utf8; +use Carp; + +carp 'missing word and dictionary file' if (@ARGV != 2); +my ($word, $dict) = @ARGV; +my $word_hash = join '', sort split //, $word; +my $word_length = length $word_hash; +my @anagrams; + +open my $fh, '<:encoding(UTF-8)', $dict; +while (my $dword = <$fh>) { + chomp $dword; + next if (length $dword != $word_length); + + my $dword_hash = join '', sort split //, $dword; + next if ($dword_hash ne $word_hash); + next if ($dword eq $word); + + push @anagrams, $dword; +} +close $fh; + +say sprintf 'Word: %s', $word; +say sprintf 'Anagrams: %s', join q|, |, @anagrams; + +1; + +__END__ + +$ perl ch-1.pl elbow /usr/share/dict/words +Word: elbow +Anagrams: below, bowel + +# vi:et:sw=4 ts=4 ft=perl diff --git a/challenge-005/kian-meng-ang/perl5/ch-2.pl b/challenge-005/kian-meng-ang/perl5/ch-2.pl new file mode 100644 index 0000000000..18e659b925 --- /dev/null +++ b/challenge-005/kian-meng-ang/perl5/ch-2.pl @@ -0,0 +1,44 @@ +#!/usr/bin/env perl + +use 5.010; +use autodie; +use strict; +use warnings; +use utf8; +use Carp; +use List::Util qw(max); + +carp 'missing dictionary file' if (@ARGV != 1); +my ($dict) = @ARGV; +my %anagram_list; + +open my $fh, '<:encoding(UTF-8)', $dict; +while (my $dword = <$fh>) { + chomp $dword; + + my $dword_hash = join '', sort split //, $dword; + push @{ $anagram_list{$dword_hash} }, $dword; +} +close $fh; + +my $max_anagram_count = max(map { scalar @{$_} } values %anagram_list); + +foreach my $anagrams (values %anagram_list) { + next if (scalar @{$anagrams} != $max_anagram_count); + say sprintf 'Total anagrams: %d', scalar @{$anagrams}; + say sprintf 'Anagrams: %s', join q|, |, @{$anagrams}; + say q||; +} + +1; + +__END__ + +$ perl ch-2.pl /usr/share/dict/words +Total anagrams: 7 +Anagrams: carets, caster, caters, crates, reacts, recast, traces + +Total anagrams: 7 +Anagrams: pares, parse, pears, rapes, reaps, spare, spear + +# vi:et:sw=4 ts=4 ft=perl diff --git a/challenge-006/kian-meng-ang/perl5/ch-1.pl b/challenge-006/kian-meng-ang/perl5/ch-1.pl new file mode 100644 index 0000000000..ff49fa43a4 --- /dev/null +++ b/challenge-006/kian-meng-ang/perl5/ch-1.pl @@ -0,0 +1,48 @@ +#!/usr/bin/env perl + +use 5.010; +use strict; +use warnings; +use utf8; +use Carp; + +carp 'missing word and dictionary file' if (@ARGV != 1); + +my ($series) = @ARGV; +my @numbers = split /,/, $series; + +my (@sequence, @group); +for my $i (1 .. $#numbers) { + if ($numbers[$i] - $numbers[$i-1] == 1) { + push @group, $numbers[$i-1] if (scalar @group == 0); + push @group, $numbers[$i]; + } + else { + push @sequence, [@group]; + @group = (); + } + + if ($i == $#numbers) { + push @sequence, [@group]; + @group = (); + } +} + +my @shorter_series; +foreach my $s (@sequence) { + if (scalar @{$s} >= 3) { + push @shorter_series, sprintf '%d-%d', shift @{$s}, pop @{$s}; + } + else { + push @shorter_series, @{$s}; + } +} + +say join q|,|, @shorter_series; + +1; + +__END__ +$ perl ch-1.pl 1,2,3,4,9,10,14,15,16 +1-4,9,10,14-16 +# vi:et:sw=4 ts=4 ft=perl -- cgit