diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2023-07-09 19:42:06 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-09 19:42:06 +0100 |
| commit | f12f8529dc472587eeb6c6320ad639e15b4f4f4b (patch) | |
| tree | ef8b048d6666db3096ad209f95ef77e451ae3bab | |
| parent | 62e96e7d359b82a07b21b62953e478dd8ab9aa5a (diff) | |
| parent | bf7245c4af8693190825ee14b80e30ca5196f163 (diff) | |
| download | perlweeklychallenge-club-f12f8529dc472587eeb6c6320ad639e15b4f4f4b.tar.gz perlweeklychallenge-club-f12f8529dc472587eeb6c6320ad639e15b4f4f4b.tar.bz2 perlweeklychallenge-club-f12f8529dc472587eeb6c6320ad639e15b4f4f4b.zip | |
Merge pull request #8339 from polettix/polettix/pwc224
Add polettix's solution to challenge-224
| -rw-r--r-- | challenge-224/polettix/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-224/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-224/polettix/perl/ch-1.pl | 42 | ||||
| -rw-r--r-- | challenge-224/polettix/perl/ch-2.pl | 33 | ||||
| -rw-r--r-- | challenge-224/polettix/raku/ch-1.raku | 3 | ||||
| -rw-r--r-- | challenge-224/polettix/raku/ch-2.raku | 31 |
6 files changed, 111 insertions, 0 deletions
diff --git a/challenge-224/polettix/blog.txt b/challenge-224/polettix/blog.txt new file mode 100644 index 0000000000..17191f7604 --- /dev/null +++ b/challenge-224/polettix/blog.txt @@ -0,0 +1 @@ +https://etoobusy.polettix.it/2023/07/06/pwc224-special-notes/ diff --git a/challenge-224/polettix/blog1.txt b/challenge-224/polettix/blog1.txt new file mode 100644 index 0000000000..88b702ecad --- /dev/null +++ b/challenge-224/polettix/blog1.txt @@ -0,0 +1 @@ +https://etoobusy.polettix.it/2023/07/07/pwc224-additive-number/ diff --git a/challenge-224/polettix/perl/ch-1.pl b/challenge-224/polettix/perl/ch-1.pl new file mode 100644 index 0000000000..4db3274e64 --- /dev/null +++ b/challenge-224/polettix/perl/ch-1.pl @@ -0,0 +1,42 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; + +say special_notes(@ARGV) ? 'true' : 'false'; + +sub special_notes_simple ($source, $target) { + my %available; + $available{$_}++ for split m{}mxs, $source; + for my $char (split m{}mxs, $target) { + return unless $available{$char}; + $available{$char}--; + } + return 1; +} + +sub special_notes ($source, $target) { + my $sl = length($source); + my $tl = length($target); + return unless $tl <= $sl; + + my %available; + my $si = 0; # index in $source + TARGET: + for my $ti (0 .. $tl - 1) { + my $tch = substr($target, $ti, 1); + if ($available{$tch}) { + my $residual = --$available{$tch}; + delete $available{$tch} unless $residual; + } + else { + while ($si < $sl) { + my $sch = substr($source, $si++, 1); + next TARGET if $sch eq $tch; + ++$available{$sch}; + } + return; # no luck... + } + } + return 1; +} diff --git a/challenge-224/polettix/perl/ch-2.pl b/challenge-224/polettix/perl/ch-2.pl new file mode 100644 index 0000000000..c813782e9f --- /dev/null +++ b/challenge-224/polettix/perl/ch-2.pl @@ -0,0 +1,33 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; + +say is_additive_number(shift) ? 'true' : 'false'; + +sub is_additive_number ($string) { + my $len = length($string); + return unless $len > 2; + for my $l1 (1 .. ($len - 2)) { + for my $l2 (1 .. ($len - $l1 - 1)) { + return 1 if is_additive_number_arrangement($string, $l1, $l2); + } + } + return; +} + +sub is_additive_number_arrangement ($string, $l1, $l2) { + my $ls = length($string); + my @v = (substr($string, 0, $l1), substr($string, $l1, $l2)); + my $i = $l1 + $l2; + while ($i < $ls) { + my $v = shift @v; + $v += $v[0]; + my $lv = length($v); + return if $lv > $ls - $i; + return if substr($string, $i, $lv) ne $v; + push @v, $v; + $i += $lv; + } + return 1; +} diff --git a/challenge-224/polettix/raku/ch-1.raku b/challenge-224/polettix/raku/ch-1.raku new file mode 100644 index 0000000000..64cb463013 --- /dev/null +++ b/challenge-224/polettix/raku/ch-1.raku @@ -0,0 +1,3 @@ +#!/usr/bin/env raku +use v6; +sub MAIN ($s, $t) { put(([(-)] ($t, $s)».comb».Bag).elems == 0) } diff --git a/challenge-224/polettix/raku/ch-2.raku b/challenge-224/polettix/raku/ch-2.raku new file mode 100644 index 0000000000..442682ff15 --- /dev/null +++ b/challenge-224/polettix/raku/ch-2.raku @@ -0,0 +1,31 @@ +#!/usr/bin/env raku +use v6; +sub MAIN ($string) { put is-additive-number($string) } + +multi sub is-additive-number ($string --> Bool) { + my $len = $string.chars; + return False unless $len > 2; + for 1 .. ($len - 2) -> $l1 { + for 1 .. ($len - $l1 - 1) -> $l2 { + return True if is-additive-number($string, $l1, $l2); + } + } + return False; +} + +multi sub is-additive-number ($string, $l1, $l2 --> Bool) { + my $ls = $string.chars; + my @v = $string.substr(0, $l1), $string.substr($l1, $l2); + my $i = $l1 + $l2; + while $i < $ls { + my $v = @v.shift.Int; + $v += @v[0].Int; + $v = $v.Str; + my $lv = $v.chars; + return False if $lv > $ls - $i; + return False if $string.substr($i, $lv) ne $v; + @v.push: $v; + $i += $lv; + } + return True; +} |
