aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2023-11-21 10:42:42 +0000
committerGitHub <noreply@github.com>2023-11-21 10:42:42 +0000
commitaf62df4e893d45a2dc9dc77004c771b1d9190491 (patch)
tree7d70849c2ba0d0bdd089afa9f6bc04bc9d55969b
parentc4983d3b5ce276f2556441108df72aaf59a8d1eb (diff)
parentf01ca9e236fb335e75656cb9951b7268974ec4ad (diff)
downloadperlweeklychallenge-club-af62df4e893d45a2dc9dc77004c771b1d9190491.tar.gz
perlweeklychallenge-club-af62df4e893d45a2dc9dc77004c771b1d9190491.tar.bz2
perlweeklychallenge-club-af62df4e893d45a2dc9dc77004c771b1d9190491.zip
Merge pull request #9108 from adamcrussell/challenge-224
Challenge 224
-rw-r--r--challenge-224/adam-russell/perl/ch-1.pl26
-rw-r--r--challenge-224/adam-russell/perl/ch-2.pl61
-rw-r--r--challenge-224/adam-russell/prolog/ch-1.p5
-rw-r--r--challenge-224/adam-russell/prolog/ch-2.p41
4 files changed, 133 insertions, 0 deletions
diff --git a/challenge-224/adam-russell/perl/ch-1.pl b/challenge-224/adam-russell/perl/ch-1.pl
new file mode 100644
index 0000000000..114db9238c
--- /dev/null
+++ b/challenge-224/adam-russell/perl/ch-1.pl
@@ -0,0 +1,26 @@
+use v5.38;
+##
+# Given two strings $source and $target write a script to find out if
+# using the characters (only once) from source a target string can be
+# created.
+##
+use boolean;
+sub special_notes{
+ my($source, $target) = @_;
+ return special_notes_r([split //, $source], $target);
+}
+
+sub special_notes_r{
+ my($source, $target) = @_;
+ return true if $target eq q//;
+ return false if $target ne q// && @{$source} == 0;
+ my $c = pop @{$source};
+ $target =~ s/$c//;
+ return special_notes_r($source, $target);
+}
+
+MAIN:{
+ say special_notes q/abc/, q/xyz/;
+ say special_notes q/scriptinglanguage/, q/perl/;
+ say special_notes q/aabbcc/, q/abc/;
+}
diff --git a/challenge-224/adam-russell/perl/ch-2.pl b/challenge-224/adam-russell/perl/ch-2.pl
new file mode 100644
index 0000000000..f0c518de25
--- /dev/null
+++ b/challenge-224/adam-russell/perl/ch-2.pl
@@ -0,0 +1,61 @@
+use v5.38;
+##
+# Given a string containing digits 0-9 only write a script to find out
+# if the given string is additive number. An additive number is a
+# string whose digits can form an additive sequence.
+##
+use boolean;
+sub is_additive{
+ my $additive = false;
+ {
+ my $i = @_ - 1;
+ my $x = $_[$i - 2];
+ my $y = $_[$i - 1];
+ my $last = pop @_;
+ return false if $last != $x + $y;
+ redo if @_ > 2;
+ }
+ return true;
+}
+
+sub additive_number{
+ my($digits) = @_;
+ my @numbers;
+ do{
+ my $i = $_;
+ $numbers[$i] = [];
+ push @{$numbers[$i]}, substr($digits, $i, $_) for 1 .. length($digits) - $i;
+ } for 0 .. length($digits) - 1;
+ my @last_numbers = map {pop @{$numbers[$_]}} 0 .. @numbers - 1;
+ my $step = 0;
+ my @additive = map {[$_]} @last_numbers;
+ my @additive_temp;
+ {
+ @last_numbers = map {pop @{$numbers[$_]}} 0 .. @numbers - 1;
+ do{
+ my $i = $_;
+ do{
+ my $j = @{$additive[$i]};
+ push @additive_temp, [$_, @{$additive[$i]}] if defined($_);
+ } for @last_numbers;
+ } for 0 .. @additive - 1;
+ $step++;
+ @additive = ();
+ if($step > 2){
+ do{
+ push @additive, $_ if is_additive @{$_};
+ } for @additive_temp;
+ }
+ else{
+ @additive = @additive_temp;
+ }
+ @additive_temp = ();
+ redo if 0 < grep { @{$_} > 0 } @numbers;
+ }
+ return boolean(@additive > 0);
+}
+
+MAIN:{
+ say additive_number 112358;
+ say additive_number 199100199;
+}
diff --git a/challenge-224/adam-russell/prolog/ch-1.p b/challenge-224/adam-russell/prolog/ch-1.p
new file mode 100644
index 0000000000..ea709f500e
--- /dev/null
+++ b/challenge-224/adam-russell/prolog/ch-1.p
@@ -0,0 +1,5 @@
+special_notes(_, []).
+special_notes(Source, Target):-
+ [H|S] = Source,
+ (select(H, Target, T); T = Target),
+ special_notes(S, T), !.
diff --git a/challenge-224/adam-russell/prolog/ch-2.p b/challenge-224/adam-russell/prolog/ch-2.p
new file mode 100644
index 0000000000..c6642222bf
--- /dev/null
+++ b/challenge-224/adam-russell/prolog/ch-2.p
@@ -0,0 +1,41 @@
+additive_number(Sequence) --> Sequence,
+ { prefix(A, Sequence),
+ append(A, BC, Sequence),
+ prefix(B, BC),
+ append(B, D, BC),
+ prefix(C, D),
+ append(C, T, D),
+ \+ A = [],
+ \+ B = [],
+ \+ C = []},
+ digit_sequence(A), digit_sequence(B), digit_sequence(C),
+ { is_additive_sequence(A, B, C),
+ append(B, C, R0),
+ append(R0, T, R1),
+ T \= []},
+ additive_number(R1).
+additive_number(Sequence) --> Sequence,
+ { prefix(A, Sequence),
+ append(A, BC, Sequence),
+ prefix(B, BC),
+ append(B, D, BC),
+ prefix(C, D),
+ append(C, T, D),
+ \+ A = [],
+ \+ B = [],
+ \+ C = []},
+ digit_sequence(A), digit_sequence(B), digit_sequence(C),
+ { is_additive_sequence(A, B, C),
+ T = []}.
+
+digit_sequence([]) --> [].
+digit_sequence([D]) --> digit(D).
+digit_sequence([D|T]) --> digit(D), digit_sequence(T).
+
+digit(D) --> [D], { D #>= 48, D #=< 57 }.
+
+is_additive_sequence(A, B, C) :-
+ number_codes(NA, A),
+ number_codes(NB, B),
+ number_codes(NC, C),
+ NC #= NA + NB. \ No newline at end of file