From 1d50a0e5a8b5d70058b677ea19cc4a294f1aba32 Mon Sep 17 00:00:00 2001 From: Mohammad S Anwar Date: Fri, 10 Apr 2020 20:49:34 +0100 Subject: - Added solutions by Ulrich Rieke. --- challenge-055/ulrich-rieke/cpp/ch-2.cpp | 67 +++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 challenge-055/ulrich-rieke/cpp/ch-2.cpp (limited to 'challenge-055/ulrich-rieke/cpp/ch-2.cpp') diff --git a/challenge-055/ulrich-rieke/cpp/ch-2.cpp b/challenge-055/ulrich-rieke/cpp/ch-2.cpp new file mode 100644 index 0000000000..10adfc4756 --- /dev/null +++ b/challenge-055/ulrich-rieke/cpp/ch-2.cpp @@ -0,0 +1,67 @@ +#include +#include +#include +#include +#include +#include + +//this function creates pairs of neighbouring numbers in a vector +std::vector> createDoublets ( const std::vector & numbers ) { + std::vector> doublets ; + int len = numbers.size( ) ; + for ( int i = 0 ; i < len - 1 ; i++ ) { + std::pair p { *(numbers.begin( ) + i ) , + *(numbers.begin( ) + i + 1 ) } ; + doublets.push_back( p ) ; + } + return doublets ; +} + +//in order to create a "wavy list of numbers", a vector of numbers is +//converted into a vector of pairs of neighbouring numbers. To be wavy, +//even-indexed pairs must be descending, odd-indexed ones must ascend. +//if this holds true for all pairs a permutation is "wavy" +bool myCondition( const std::vector & numbers ) { + std::vector> doublets { createDoublets( numbers ) } ; + int len = doublets.size( ) ; + std::vector validWavy ; + for (int i = 0 ; i < len ; i++ ) { + std::pair p = doublets[ i ] ; + validWavy.push_back (( i % 2 == 0 ) && ( p.first >= p.second ) ) ; + validWavy.push_back (( i % 2 == 1 ) && ( p.first <= p.second ) ) ; + } + int i = 0 ; + for ( auto b : validWavy ) { + if ( b ) + i++ ; + } + return ( i == len ) ; +} + +//numbers are entered as arguments on the command line. A minimum number +//of 2 is desirable and requested +int main( int argc, char * argv[] ) { + std::vector input ; + if ( argc < 3 ) { + std::cout << "There is little sense in permuting such short sequences!\n" ; + return 1 ; + } + for ( int i = 1 ; i < argc ; i++ ) { + input.push_back( std::atoi( argv[ i ] ) ) ; + } + std::vector> permus ; + std::vector> wavies ; + do { + permus.push_back( input ) ; + } while ( std::next_permutation( input.begin( ) , input.end( ) )) ; + std::copy_if( permus.begin( ) , permus.end( ) , + std::back_inserter( wavies ) , myCondition ) ; + for ( auto & it : wavies ) { + std::cout << "[ " ; + for ( int i : it ) { + std::cout << i << " " ; + } + std::cout << " ]\n" ; + } + return 0 ; +} -- cgit