aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Pankoff <ccntrq@screenri.de>2022-01-25 15:15:34 +0100
committerAlexander Pankoff <ccntrq@screenri.de>2022-01-29 11:47:42 +0100
commitd52a62e76494ca56a9a50189f5c2751885f96d5e (patch)
treebbac6aa4b8ac0809d38772ff0f4c4f96bef70ad9
parentdf545bf172e608cbd75c56ac972029da916b0cb0 (diff)
downloadperlweeklychallenge-club-d52a62e76494ca56a9a50189f5c2751885f96d5e.tar.gz
perlweeklychallenge-club-d52a62e76494ca56a9a50189f5c2751885f96d5e.tar.bz2
perlweeklychallenge-club-d52a62e76494ca56a9a50189f5c2751885f96d5e.zip
Add solution for challenge 149 task 2
-rwxr-xr-xchallenge-149/alexander-pankoff/perl/ch-2.pl65
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];
+}