diff options
| author | Alexander Pankoff <ccntrq@screenri.de> | 2022-01-25 15:15:34 +0100 |
|---|---|---|
| committer | Alexander Pankoff <ccntrq@screenri.de> | 2022-01-29 11:47:42 +0100 |
| commit | d52a62e76494ca56a9a50189f5c2751885f96d5e (patch) | |
| tree | bbac6aa4b8ac0809d38772ff0f4c4f96bef70ad9 | |
| parent | df545bf172e608cbd75c56ac972029da916b0cb0 (diff) | |
| download | perlweeklychallenge-club-d52a62e76494ca56a9a50189f5c2751885f96d5e.tar.gz perlweeklychallenge-club-d52a62e76494ca56a9a50189f5c2751885f96d5e.tar.bz2 perlweeklychallenge-club-d52a62e76494ca56a9a50189f5c2751885f96d5e.zip | |
Add solution for challenge 149 task 2
| -rwxr-xr-x | challenge-149/alexander-pankoff/perl/ch-2.pl | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/challenge-149/alexander-pankoff/perl/ch-2.pl b/challenge-149/alexander-pankoff/perl/ch-2.pl new file mode 100755 index 0000000000..fc0116d720 --- /dev/null +++ b/challenge-149/alexander-pankoff/perl/ch-2.pl @@ -0,0 +1,65 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use feature qw'say state signatures'; +use bignum; +no warnings qw'experimental::signatures'; + +# TASK #2 › Largest Square +# Submitted by: Roger Bell_West +# +# Given a number base, derive the largest perfect square with no repeated digits and return it as a string. (For base>10, use ‘A’..‘Z’.) +# Example: +# +# f(2)="1" +# f(4)="3201" +# f(10)="9814072356" +# f(12)="B8750A649321" + +use List::Util qw(sum0 first uniq); + +run() unless caller(); + +sub run() { + + my ($N) = @ARGV; + + if ( !$N || $N !~ m/^\d+$/ || $N < 2 || $N > 36 ) { + die <<EOF; + Usage: + + $0 N + + Options: + + N - a number base (between 2 and 36) +EOF + } + + say "f($N) = " . largest_perfet_square_without_repeated_digits_in_base($N); + +} + +sub largest_perfet_square_without_repeated_digits_in_base($base) { + my $x = first { + my $perfect_square = dec_to_base( $base, $_**2 ); + + my @digits = split( '', $perfect_square ); + + scalar uniq(@digits) == scalar @digits; + } + reverse( 0 .. int( sqrt( $base**$base - 1 ) ) ); + + return dec_to_base( $base, $x**2 ); +} + +sub dec_to_base ( $base, $n ) { + my @digits = ( 0 .. 9, 'A' .. 'Z' ); + + return $digits[$n] if $n <= $base - 1; + + my $rem = $n % $base; + my $next = int( $n / $base ); + + dec_to_base( $base, $next ) . $digits[$rem]; +} |
