diff options
| author | Mohammad S Anwar <Mohammad.Anwar@yahoo.com> | 2020-07-19 22:44:10 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-07-19 22:44:10 +0100 |
| commit | 2d5357e577aef315bbab2096d721e5b0c436059c (patch) | |
| tree | a44a46a19def74df0ae1bba06721d1246181e747 /challenge-069 | |
| parent | b88240573dfdb412d04d74cbb30dddbc57531075 (diff) | |
| parent | 17553eff091a1b96c4ddd7a118787e8b4d38da5d (diff) | |
| download | perlweeklychallenge-club-2d5357e577aef315bbab2096d721e5b0c436059c.tar.gz perlweeklychallenge-club-2d5357e577aef315bbab2096d721e5b0c436059c.tar.bz2 perlweeklychallenge-club-2d5357e577aef315bbab2096d721e5b0c436059c.zip | |
Merge pull request #1959 from E7-87-83/master
Cheok Yin's submission to Challenge #069
Diffstat (limited to 'challenge-069')
| -rw-r--r-- | challenge-069/cheok-yin-fung/perl/ch-1.pl | 71 | ||||
| -rw-r--r-- | challenge-069/cheok-yin-fung/perl/ch-2.pl | 107 |
2 files changed, 178 insertions, 0 deletions
diff --git a/challenge-069/cheok-yin-fung/perl/ch-1.pl b/challenge-069/cheok-yin-fung/perl/ch-1.pl new file mode 100644 index 0000000000..96d9900c90 --- /dev/null +++ b/challenge-069/cheok-yin-fung/perl/ch-1.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl +# +# Perl Weekly Challenge #069 Task 1 - Strobogrammatic Number +# Usage: ch-1.pl $A $B, where 1 <= $A <= $B <= 10^15 +# the following code goes "out of memory" around $B >= 10^11 + +use Algorithm::Combinatorics qw/variations_with_repetition/; +use strict; +use warnings; + +sub rt180 { + my @digits = split // , $_[0]; + my @newdigits = (); + for (@digits) { + my $nex; + $nex = 1 if $_ == 1; + $nex = 0 if $_ == 0; + $nex = 8 if $_ == 8; + $nex = 9 if $_ == 6; + $nex = 6 if $_ == 9; + unshift @newdigits, $nex; + } + return join '', @newdigits; +} + +my @ans = (); +my $begin = 3; +my $end = 4; +if ($ARGV[0] and $ARGV[1]) { + $begin = $ARGV[0]; + $end = $ARGV[1]; +} + +my $sbegin = length $begin; +my $send = length $end; + +if ($sbegin == 1) { + $sbegin = 2; + if ($send != 1) { + @ans = ($begin..9); + } else { + @ans = ($begin..$end); + } +} + +for my $s ($sbegin .. $send) { + foreach my $r (qw/1 6 8 9/) { + my $o = variations_with_repetition([0, 1, 6, 8, 9],$s-1); + while (my $y = $o->next) { + my $string = $r.(join '', @{$y}); + push @ans, $string if $string eq rt180($string); + } + } +} + + +for (@ans) { + print $_, " " if $_ <= $end and $_ >= $begin; +} + + +print "\n"; + + +# $ time perl ch-1.pl 100000001 999999999 > ans069.txt (10^8+1 to 10^9-1) +# +# real 0m9.288s +# user 0m9.282s +# sys 0m0.004s + +# not very satisfactory diff --git a/challenge-069/cheok-yin-fung/perl/ch-2.pl b/challenge-069/cheok-yin-fung/perl/ch-2.pl new file mode 100644 index 0000000000..f01259207d --- /dev/null +++ b/challenge-069/cheok-yin-fung/perl/ch-2.pl @@ -0,0 +1,107 @@ +#!/usr/bin/perl +# +# Perl Weekly Challenge #069 Task 2 +# Usage: ch-2.pl $N + +# SN = SN-1 + “0” + switch(reverse(SN-1)) +# SN = SN-2 + “0” + switch(reverse(SN-2)) + "0" + SN-2 + "1" + switch(reverse(SN-2)) +# on my computer, ordinary action goes "out of memory" when $N>26. +# Therefore I write a roundabout to tackle $N=30 + + +use strict; +use warnings; + +my $N = 3; + +if ($ARGV[0]) { + $N = $ARGV[0]; +} + +sub sr { + my @digits = split // , $_[0]; + my @newdigits; + for (@digits) { + unshift @newdigits, (1+$_) % 2; + } + return join "", @newdigits; +} + + +my @S = ("", "0"); +my @R; + +for (my $d = $N % 2 + 2; $d <= $N and $d<=26 ; $d += 2) { + $R[$d-2] = sr($S[$d-2]); + $S[$d] = $S[$d-2] . "0" . $R[$d-2]. "0" . $S[$d-2]. "1". $R[$d-2]; +} + +if ($N <= 26) { + print $S[$N]; +} elsif ($N !=30) { + print "too large!"; +} + +print "\n"; + + +#the following are for $N=30 + +# $S[$d] = $S[$d-2] . "0" . $R[$d-2]. "0" . $S[$d-2]. "1". $R[$d-2]; +# $R[$d] = $S[$d-2] . "0" . $R[$d-2]. "1" . $S[$d-2]. "1". $R[$d-2]; +sub print_S28 { + print $S[26]; + print "0"; + print $R[26]; + print "0"; + print $S[26]; + print "1"; + print $R[26]; +} + +sub print_R28 { + print $S[26]; + print "0"; + print $R[26]; + print "1"; + print $S[26]; + print "1"; + print $R[26]; +} +if ($N == 30) { + $R[26] = $S[24]."0".$R[24]."1".$S[24]."1".$R[24]; + print_S28; + print "0"; + print_R28; + print "0"; + print_S28; + print "1"; + print_R28; + +} +print "\n"; + + +# $N = 25 --> +# real 0m7.241s +# user 0m3.701s +# sys 0m0.681s +# +# +#$ perl ch-2.pl 7 +#0010011000110110001001110011011000100110001101110010011100110110001001100011011000100111001101110010011000110111001001110011011 + +# $ time perl ch-2.pl 26 > S26.txt +# +# real 0m8.045s +# user 0m7.172s +# sys 0m0.863s + +#$ time perl ch-2.pl 30 > S30.txt +# +# real 0m12.099s +# user 0m7.873s +# sys 0m1.432s +# +# size of S26.txt : 67.1 MB +# size of S30.txt : 1.1 GB |
