diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-03-27 11:23:17 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-03-27 11:23:17 +0100 |
| commit | 3956a8c4e5c5183ada8eedc291b7dc34a2809b2b (patch) | |
| tree | c02bfaf6b9ed9ba4089540b19ed8f3f97cbe7f6a /challenge-157 | |
| parent | cbd11122265a47230fd6c5eead8bd3d817ccea2f (diff) | |
| download | perlweeklychallenge-club-3956a8c4e5c5183ada8eedc291b7dc34a2809b2b.tar.gz perlweeklychallenge-club-3956a8c4e5c5183ada8eedc291b7dc34a2809b2b.tar.bz2 perlweeklychallenge-club-3956a8c4e5c5183ada8eedc291b7dc34a2809b2b.zip | |
- Updated solutions by Ulrich Rieke.
Diffstat (limited to 'challenge-157')
| -rw-r--r-- | challenge-157/ulrich-rieke/cpp/ch-2.cpp | 38 | ||||
| -rw-r--r-- | challenge-157/ulrich-rieke/haskell/ch-2.hs | 4 | ||||
| -rw-r--r-- | challenge-157/ulrich-rieke/perl/ch-2.pl | 26 |
3 files changed, 52 insertions, 16 deletions
diff --git a/challenge-157/ulrich-rieke/cpp/ch-2.cpp b/challenge-157/ulrich-rieke/cpp/ch-2.cpp index 5f6a402345..f2c7158cff 100644 --- a/challenge-157/ulrich-rieke/cpp/ch-2.cpp +++ b/challenge-157/ulrich-rieke/cpp/ch-2.cpp @@ -1,12 +1,20 @@ #include <iostream> #include <vector> -#include <algorithm> #include <cstdlib> +#include <map> +#include <string> +#include <numeric> +#include <algorithm> -std::vector<int> toBaseDigits( int n , int base ) { - std::vector<int> baseDigits ; +std::vector<std::string> toBaseDigits( int n , int base , + const std::map<int,std::string> & extendedBases ) { + std::vector<std::string> baseDigits ; while ( n != 0 ) { - baseDigits.push_back( n % base ) ; + int remainder = n % base ; + if ( remainder > 10 ) + baseDigits.push_back( extendedBases.find(remainder)->second ) ; + else + baseDigits.push_back( std::to_string( remainder )) ; n /= base ; } return baseDigits ; @@ -14,17 +22,27 @@ std::vector<int> toBaseDigits( int n , int base ) { int main( int argc, char * argv[] ) { int n = std::atoi( argv[1] ) ; - while ( n <= 3 ) { - std::cout << "number must be greater than 3! Re-enter!\n" ; + //we allow bases up to 36 there numbers from 3 to 36 + 2 are admitted + while ( n <= 3 || n > 38 ) { + std::cout << "number must be greater than 3 and smaller than 39! Re-enter!\n" ; std::cin >> n ; } + //every number from 11 to 36 corresponds to a letter from A to Z + //this way remainders greater than 10 can be denoted + std::vector<std::string> alphabet( 26 ) ; + std::iota( alphabet.begin( ) , alphabet.end( ) , 'A' ) ; + std::vector<int> greaterBases( 26 ) ; + std::iota( greaterBases.begin( ) , greaterBases.end( ) , 11 ) ; + std::map<int, std::string> extendedBases ; + for ( int i = 0 ; i < 26 ; i++ ) //26 numbers from 11 to 36 + extendedBases[ *(greaterBases.begin( ) + i)] = *(alphabet.begin( ) + i) ; bool isBrazilian = false ; for ( int i = 2 ; i < n - 1 ; i++ ) { - std::vector<int> digits { toBaseDigits( n , i ) } ; + std::vector<std::string> digits { toBaseDigits( n , i , extendedBases) } ; if ( std::count( digits.begin( ) , digits.end( ) , *(digits.begin( ) )) == - digits.size( ) ) { - isBrazilian = true ; - break ; + digits.size( ) ) { + isBrazilian = true ; + break ; } } if ( isBrazilian ) diff --git a/challenge-157/ulrich-rieke/haskell/ch-2.hs b/challenge-157/ulrich-rieke/haskell/ch-2.hs index be824168b8..5f0e977ad5 100644 --- a/challenge-157/ulrich-rieke/haskell/ch-2.hs +++ b/challenge-157/ulrich-rieke/haskell/ch-2.hs @@ -28,10 +28,10 @@ where askForCorrectNumber ::IO Int askForCorrectNumber = do - putStrLn "Please enter an integer greater than 3!" + putStrLn "Please enter an integer greater than 3 and smaller than 39!" num <- getLine let n = read num - if n > 3 then return n + if (n > 3 && n < 39) then return n else do askForCorrectNumber diff --git a/challenge-157/ulrich-rieke/perl/ch-2.pl b/challenge-157/ulrich-rieke/perl/ch-2.pl index 48a932e8fb..7f445eca57 100644 --- a/challenge-157/ulrich-rieke/perl/ch-2.pl +++ b/challenge-157/ulrich-rieke/perl/ch-2.pl @@ -15,24 +15,42 @@ sub allSame { sub toBase { my $number = shift ; my $base = shift ; + my $extended = shift ; my @digits ; while ( $number != 0 ) { - push @digits , $number % $base ; + my $remainder = $number % $base ; + if ( $remainder > 10 ) { + push @digits , $extended->{$remainder} ; + } + else { + push @digits, $remainder ; + } $number = int( $number / $base ) ; } return @digits ; } my $n = $ARGV[0] ; -while ( $n <= 3 ) { - say "number should be greater than 3! Re-enter!" ; +#the algorithm allows bases from 2 to 36 and therefore numbers from 3 + 1 to +#36 + 2 +while ( $n <= 3 || $n > 38 ) { + say "number should be greater than 3 and smaller than 39! Re-enter!" ; my $line = <STDIN> ; chomp $line ; $n = $line ; } +#if the number base is greater than 10 we introduce letters to denote the rest +#of dividing a number by the base +my @letters = ('A' .. 'Z') ; +my @numbers = (11 .. 36 ) ; +my %extendedBases ; +#each number from 11 to 36 corresponds to a letter +for my $num (0 .. 25 ) { + $extendedBases{ $numbers[$num] } = $letters[$num] ; +} my $isBrazilian = 0 ; for my $i ( 2 .. $n - 2 ) { - my @digits = toBase( $n , $i ) ; + my @digits = toBase( $n , $i , \%extendedBases ) ; if ( allSame( \@digits ) ) { $isBrazilian = 1 ; last ; |
