aboutsummaryrefslogtreecommitdiff
path: root/challenge-043
diff options
context:
space:
mode:
authorholli-holzer <holli.holzer@gmail.com>2020-01-14 16:58:59 +0100
committerholli-holzer <holli.holzer@gmail.com>2020-01-14 16:58:59 +0100
commit79dddd500946c47f2dc942d9a9114516650fd28d (patch)
tree192a8ac0b9c17e110259235e1e02ad862cc70df6 /challenge-043
parentc597c4bba4a22d1c2b637d983ad12f9911ee0ae6 (diff)
downloadperlweeklychallenge-club-79dddd500946c47f2dc942d9a9114516650fd28d.tar.gz
perlweeklychallenge-club-79dddd500946c47f2dc942d9a9114516650fd28d.tar.bz2
perlweeklychallenge-club-79dddd500946c47f2dc942d9a9114516650fd28d.zip
better ways than brute force
Diffstat (limited to 'challenge-043')
-rw-r--r--challenge-043/markus-holzer/perl6/ch-2.p664
-rw-r--r--challenge-043/markus-holzer/perl6/lib/Math/SelfDescriptiveNumbers.pm629
2 files changed, 47 insertions, 46 deletions
diff --git a/challenge-043/markus-holzer/perl6/ch-2.p6 b/challenge-043/markus-holzer/perl6/ch-2.p6
index 11b4b2a19c..f3123b70ce 100644
--- a/challenge-043/markus-holzer/perl6/ch-2.p6
+++ b/challenge-043/markus-holzer/perl6/ch-2.p6
@@ -1,61 +1,33 @@
use Test;
+use Math::SelfDescriptiveNumbers;
-# all self-descriptive numbers
-# - must be at least base digits long
-# - have digit sums equal to their base,
-# - are multiples of that base
-# - each digit d at position n counts how many instances of digit n are in m
-
-multi sub MAIN( Int $base where $_ < 37 )
+multi sub MAIN()
{
- .base( $base ).say for
- self-descriptive-candidates( $base )
- .grep({ is-self-descriptive( $_, $base ) });
+ for self-descriptive-numbers() -> ($base, $numbers)
+ {
+ say output( $base, $numbers );
+ }
}
+multi sub MAIN( Int $base where 1 < $base < 37 )
+{
+ say output( $base, self-descriptive-numbers-of( $base ) );
+}
multi sub MAIN( "test" )
{
- ok base-start( 2 ) == 2;
- ok base-start( 10 ) == 1000000000;
- ok base-start( 16 ) == 0x1000000000000000;
-
# test values from Wikipedia
- ok is-self-descriptive( parse-base('21200',5), 5 );
+ ok is-self-descriptive( :number(parse-base('21200',5)), :base(5) );
+ ok is-self-descriptive( :number('21200'), :base(5) );
+ ok is-self-descriptive( 'C210000000001000', 16 );
ok is-self-descriptive( 0xC210000000001000, 16 );
- ok is-self-descriptive( 6210001000, 10 );
ok !is-self-descriptive( 3210001000, 10 );
- ok self-descriptive-candidates(4).first({ is-self-descriptive( $_, 4) }).base(4) eq "1210";
- ok self-descriptive-candidates(5).first({ is-self-descriptive($_, 5) }).base(5) eq "21200";
- ok self-descriptive-candidates(7).first({ is-self-descriptive($_, 7) }).base(7) eq "3211000";
-}
-
-
-sub is-self-descriptive( $number, $base )
-{
- state @digits = (0 .. 9).Array.append( ('A' .. 'Z').Array );
-
- my $base-str = $number.base( $base );
-
- !so $base-str.comb.pairs.first( -> $p
- {
- my $digit = @digits[ $p.key ];
- my $count-is = ( $base-str ~~ m:g/ ($digit) / ).elems;
- $count-is != parse-base( $p.value.Str, $base );
- });
-}
-
-
-sub self-descriptive-candidates( $base )
-{
- my $base-start = base-start($base);
- return $base-start, $base-start + $base, { $_ + $base } ...^ $base-start * $base;
}
-sub base-start( $base )
+sub output( $base, $numbers )
{
- my $zeroes = $base - 1;
- my $n = "1" ~ ( "0" x $zeroes );
- parse-base( $n, $base );
-}
+ my $num-base = $numbers.map( *.base( $base ) ).join(',');
+ my $num-dec = $numbers.join(',');
+ "Base $base, " ~ ( $numbers.elems ?? "$num-base; $num-dec (decimal)" !! '---' );
+} \ No newline at end of file
diff --git a/challenge-043/markus-holzer/perl6/lib/Math/SelfDescriptiveNumbers.pm6 b/challenge-043/markus-holzer/perl6/lib/Math/SelfDescriptiveNumbers.pm6
new file mode 100644
index 0000000000..8409826549
--- /dev/null
+++ b/challenge-043/markus-holzer/perl6/lib/Math/SelfDescriptiveNumbers.pm6
@@ -0,0 +1,29 @@
+unit module Math::SelfDescriptiveNumbers;
+
+multi sub is-self-descriptive( Int $number, Int $base ) is export {
+ is-self-descriptive( :$number, :$base );
+}
+
+multi sub is-self-descriptive( Int :$number, Int :$base ) is export {
+ $number ∈ self-descriptive-numbers-of( $base );
+}
+
+multi sub is-self-descriptive( Str $number, Int $base ) is export {
+ is-self-descriptive( :$number, :$base );
+}
+
+multi sub is-self-descriptive( Str :$number, Int :$base ) is export {
+ parse-base( $number, $base ) ∈ self-descriptive-numbers-of( $base );
+}
+
+sub self-descriptive-numbers is export {
+ ( 1 .. 36 ).map({ ( $_, self-descriptive-numbers-of( $_ ) ) });
+}
+
+multi sub self-descriptive-numbers-of( Int $base where $_ ~~ 1|2|3|6 ) is export { () }
+multi sub self-descriptive-numbers-of( Int $base where $_ == 4 ) is export { (100, 136) }
+multi sub self-descriptive-numbers-of( Int $base where $_ == 5 ) is export { (1425) }
+multi sub self-descriptive-numbers-of( Int $base ) is export {
+ ( parse-base( ($base - 4).base( $base ) ~ "21" ~ ( '0' x ($base - 7) ) ~ '1000', $base ) )
+}
+