aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2023-07-09 19:42:06 +0100
committerGitHub <noreply@github.com>2023-07-09 19:42:06 +0100
commitf12f8529dc472587eeb6c6320ad639e15b4f4f4b (patch)
treeef8b048d6666db3096ad209f95ef77e451ae3bab
parent62e96e7d359b82a07b21b62953e478dd8ab9aa5a (diff)
parentbf7245c4af8693190825ee14b80e30ca5196f163 (diff)
downloadperlweeklychallenge-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.txt1
-rw-r--r--challenge-224/polettix/blog1.txt1
-rw-r--r--challenge-224/polettix/perl/ch-1.pl42
-rw-r--r--challenge-224/polettix/perl/ch-2.pl33
-rw-r--r--challenge-224/polettix/raku/ch-1.raku3
-rw-r--r--challenge-224/polettix/raku/ch-2.raku31
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;
+}