From df545bf172e608cbd75c56ac972029da916b0cb0 Mon Sep 17 00:00:00 2001 From: Alexander Pankoff Date: Tue, 25 Jan 2022 13:34:22 +0100 Subject: Add solution for challenge-149 part 1 --- challenge-149/alexander-pankoff/perl/ch-1.pl | 79 ++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100755 challenge-149/alexander-pankoff/perl/ch-1.pl diff --git a/challenge-149/alexander-pankoff/perl/ch-1.pl b/challenge-149/alexander-pankoff/perl/ch-1.pl new file mode 100755 index 0000000000..1adf2557f1 --- /dev/null +++ b/challenge-149/alexander-pankoff/perl/ch-1.pl @@ -0,0 +1,79 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use feature qw'say state signatures'; +no warnings qw'experimental::signatures'; + +# TASK #1 › Fibonacci Digit Sum +# Submitted by: Roger Bell_West +# +# Given an input $N, generate the first $N numbers for which the sum of their digits is a Fibonacci number. +# Example +# +# f(20)=[0, 1, 2, 3, 5, 8, 10, 11, 12, 14, 17, 20, 21, 23, 26, 30, 32, 35, 41, 44] + +use List::Util qw(sum0 first); + +run() unless caller(); + +sub run() { + my ($N) = @ARGV; + + if ( !$N || $N !~ m/^\d+$/ || $N < 1 ) { + die < 1, + 1 => 1, + + }; + state $cur = 1; + state $prev = 0; + + while ( $x > $cur ) { + my $next = next_fib( $cur, $prev ); + $prev = $cur; + $cur = $next; + + $fibs->{$next} = 1; + } + + return $fibs->{$x}; +} + +sub digit_sum($x) { + my $sum = sum0 split( '', $x ); + + return $sum; +} + +sub next_fib ( $prev, $cur ) { + my $next = $cur + $prev; + + return $next; +} -- cgit From d52a62e76494ca56a9a50189f5c2751885f96d5e Mon Sep 17 00:00:00 2001 From: Alexander Pankoff Date: Tue, 25 Jan 2022 15:15:34 +0100 Subject: Add solution for challenge 149 task 2 --- challenge-149/alexander-pankoff/perl/ch-2.pl | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 challenge-149/alexander-pankoff/perl/ch-2.pl 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 < 0 ; + $i-- + ) + { + my $perfect_square = dec_to_base( $base, $i**2 ); my @digits = split( '', $perfect_square ); - scalar uniq(@digits) == scalar @digits; - } - reverse( 0 .. int( sqrt( $base**$base - 1 ) ) ); + return $perfect_square if scalar uniq(@digits) == scalar @digits; - return dec_to_base( $base, $x**2 ); + } } sub dec_to_base ( $base, $n ) { @@ -63,3 +69,30 @@ sub dec_to_base ( $base, $n ) { dec_to_base( $base, $next ) . $digits[$rem]; } + +sub base_to_dec ( $base, $n ) { + my $power = 1; + my $num = 0; + + my @digits = split( '', $n ); + + for my $i ( reverse( 0 .. $#digits ) ) { + + $num += value( $digits[$i] ) * $power; + $power = $power * $base; + + } + + return $num; + +} + +sub value($c) { + + if ( $c ge '0' && $c le '9' ) { + return ord($c) - ord('0'); + + } + + return ord($c) - ord('A') + 10; +} -- cgit