aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2020-07-13 19:35:20 +0100
committerGitHub <noreply@github.com>2020-07-13 19:35:20 +0100
commit3f99799ed05fca680eed2faa9a1e1a168f67fac0 (patch)
tree059f41be1d35750e36d3d95c37aff45c6996b0ab
parent29b45dc080e1a5d10e6211710d5975c4fdde2928 (diff)
parent8e85b42e5756a505e07749b924195f26b624dc68 (diff)
downloadperlweeklychallenge-club-3f99799ed05fca680eed2faa9a1e1a168f67fac0.tar.gz
perlweeklychallenge-club-3f99799ed05fca680eed2faa9a1e1a168f67fac0.tar.bz2
perlweeklychallenge-club-3f99799ed05fca680eed2faa9a1e1a168f67fac0.zip
Merge pull request #1940 from wanderdoc/master
Solutions to challenge-069.
-rw-r--r--challenge-069/wanderdoc/perl/ch-1.pl61
-rw-r--r--challenge-069/wanderdoc/perl/ch-2.pl38
2 files changed, 99 insertions, 0 deletions
diff --git a/challenge-069/wanderdoc/perl/ch-1.pl b/challenge-069/wanderdoc/perl/ch-1.pl
new file mode 100644
index 0000000000..39fdf4a1d5
--- /dev/null
+++ b/challenge-069/wanderdoc/perl/ch-1.pl
@@ -0,0 +1,61 @@
+#!perl
+use strict;
+use warnings FATAL => qw(all);
+
+=prompt
+A strobogrammatic number is a number that looks the same when looked at upside down.
+You are given two positive numbers $A and $B such that 1 <= $A <= $B <= 10^15.
+Write a script to print all strobogrammatic numbers between the given two numbers.
+Example
+Input: $A = 50, $B = 100
+Output: 69, 88, 96
+=cut
+
+
+my $cnt = 1;
+
+my $start = shift || 50;
+my $end = shift || 10**10; # 10**15;
+my $number = $start;
+while ( $number <= $end )
+{
+ if ( $number =~ /[23457]/ )
+ {
+ while ( $number =~ /[23457]/ )
+ {
+
+ my @num_array = split(//,$number);
+ @num_array = map {
+ my $digit = $_;
+ if ( $digit =~ /[23457]/ )
+ {
+ $digit++;
+ };
+ $digit; }
+ @num_array;
+ $number = join('', @num_array);
+ }
+ }
+
+
+ elsif ( $number =~ /0$/ )
+ {
+ $number++;
+
+ }
+ else
+ {
+ print join(": ", $cnt++, $number), $/ if ( $number == make_sgn($number));
+
+ $number++;
+ }
+}
+# 4_995 numbers if $start == 50 and $end == 10**10.
+sub make_sgn
+{
+ my $str = $_[0];
+ $str = reverse $str;
+
+ $str =~ tr/69/96/;
+ return $str;
+} \ No newline at end of file
diff --git a/challenge-069/wanderdoc/perl/ch-2.pl b/challenge-069/wanderdoc/perl/ch-2.pl
new file mode 100644
index 0000000000..9d123cf484
--- /dev/null
+++ b/challenge-069/wanderdoc/perl/ch-2.pl
@@ -0,0 +1,38 @@
+#!perl
+use strict;
+use warnings FATAL => qw(all);
+
+=prompt
+A “0/1 string” is a string in which every character is either 0 or 1.
+Write a script to perform switch and reverse to generate S1000 as described below:
+
+switch: Every 0 becomes 1 and every 1 becomes 0. For example, “101” becomes “010”.
+reverse: The string is reversed. For example, "001” becomes “100”.
+
+To generate S1000 string, please follow the rule as below:
+
+S0 = “”
+S1 = “0”
+S2 = “001”
+S3 = “0010011”
+…
+SN = SN-1 + “0” + switch(reverse(SN-1))
+
+=cut
+
+my $string = '';
+my $counter = 0;
+
+
+while ( $counter < 30 )
+{
+ my $new_part = switch(scalar reverse($string));
+ $string .= '0';
+ $string .= $new_part;
+ printf("S%02d: %10d$/", ++$counter, length($string));
+}
+# print $string, $/; # length($string) = 1_073_741_823.
+sub switch
+{
+ my $str = $_[0]; $str =~ tr/01/10/; return $str;
+}