aboutsummaryrefslogtreecommitdiff
path: root/challenge-157
diff options
context:
space:
mode:
authorMohammad S Anwar <mohammad.anwar@yahoo.com>2022-03-27 11:23:17 +0100
committerMohammad S Anwar <mohammad.anwar@yahoo.com>2022-03-27 11:23:17 +0100
commit3956a8c4e5c5183ada8eedc291b7dc34a2809b2b (patch)
treec02bfaf6b9ed9ba4089540b19ed8f3f97cbe7f6a /challenge-157
parentcbd11122265a47230fd6c5eead8bd3d817ccea2f (diff)
downloadperlweeklychallenge-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.cpp38
-rw-r--r--challenge-157/ulrich-rieke/haskell/ch-2.hs4
-rw-r--r--challenge-157/ulrich-rieke/perl/ch-2.pl26
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 ;