diff options
| author | holli-holzer <holli.holzer@gmail.com> | 2020-01-14 16:58:59 +0100 |
|---|---|---|
| committer | holli-holzer <holli.holzer@gmail.com> | 2020-01-14 16:58:59 +0100 |
| commit | 79dddd500946c47f2dc942d9a9114516650fd28d (patch) | |
| tree | 192a8ac0b9c17e110259235e1e02ad862cc70df6 /challenge-043 | |
| parent | c597c4bba4a22d1c2b637d983ad12f9911ee0ae6 (diff) | |
| download | perlweeklychallenge-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.p6 | 64 | ||||
| -rw-r--r-- | challenge-043/markus-holzer/perl6/lib/Math/SelfDescriptiveNumbers.pm6 | 29 |
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 ) ) +} + |
