diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2023-11-21 10:42:42 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-21 10:42:42 +0000 |
| commit | af62df4e893d45a2dc9dc77004c771b1d9190491 (patch) | |
| tree | 7d70849c2ba0d0bdd089afa9f6bc04bc9d55969b | |
| parent | c4983d3b5ce276f2556441108df72aaf59a8d1eb (diff) | |
| parent | f01ca9e236fb335e75656cb9951b7268974ec4ad (diff) | |
| download | perlweeklychallenge-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.pl | 26 | ||||
| -rw-r--r-- | challenge-224/adam-russell/perl/ch-2.pl | 61 | ||||
| -rw-r--r-- | challenge-224/adam-russell/prolog/ch-1.p | 5 | ||||
| -rw-r--r-- | challenge-224/adam-russell/prolog/ch-2.p | 41 |
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 |
