#include <iostream>
unsigned long concatenateArr_Sone( unsigned* first, unsigned* last )
{
unsigned long value = 0,
ct = 1;
while( last-- != first )
{
if( *last > 9 )
{
value += ct * (*last % 10);
*last++ /= 10;
}
else
value += ct * *last;
ct *= 10;
}
return value;
}
unsigned append_number(unsigned x, unsigned y) {
return (y < 10 ? x : append_number(x, y / 10)) * 10 + y % 10;
}
#include <numeric>
unsigned long concatenateArr_Seldon( unsigned* first, unsigned* last )
{
return std::accumulate(first, last, 0ul, append_number);
}
#include <iterator>
#include <random>
#include <algorithm>
#include <iomanip>
#include <chrono>
#include <ctime>
unsigned arr[5];
template<typename Callable>
void check( std::string const& name, Callable&& Foo )
{
std::cout << '\n' << name << ": " << Foo( std::begin(arr), std::end(arr) ) << ", needed ";
using namespace std::chrono;
auto _tp = system_clock::now();
for( unsigned ct = 0; ct < 10000000; ++ct )
auto val = Foo( std::begin(arr), std::end(arr) );
std::cout << (system_clock::now() - _tp).count() << " ticks";
}
int main()
{
std::uniform_int_distribution<unsigned> dist(0, 100);
std::minstd_rand device(time(nullptr));
std::generate( std::begin(arr), std::end(arr), std::bind(dist, device) );
std::cout << "Values: ";
std::copy( std::begin(arr), std::end(arr), std::ostream_iterator<unsigned>(std::cout, ", ") );
check( "Seldon", concatenateArr_Seldon );
check( "Sone ", concatenateArr_Sone );
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdW5zaWduZWQgbG9uZyBjb25jYXRlbmF0ZUFycl9Tb25lKCB1bnNpZ25lZCogZmlyc3QsIHVuc2lnbmVkKiBsYXN0ICkKewogICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDAsCiAgICAgICAgICAgICAgICAgIGN0ID0gMTsKCiAgICB3aGlsZSggbGFzdC0tICE9IGZpcnN0ICkKICAgIHsKICAgICAgICBpZiggKmxhc3QgPiA5ICkKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlICs9IGN0ICogKCpsYXN0ICUgMTApOwogICAgICAgICAgICAqbGFzdCsrIC89IDEwOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhbHVlICs9IGN0ICogKmxhc3Q7CgogICAgICAgIGN0ICo9IDEwOwogICAgfQoKICAgIHJldHVybiB2YWx1ZTsKfQoKdW5zaWduZWQgYXBwZW5kX251bWJlcih1bnNpZ25lZCB4LCB1bnNpZ25lZCB5KSB7CiAgcmV0dXJuICh5IDwgMTAgPyB4IDogYXBwZW5kX251bWJlcih4LCB5IC8gMTApKSAqIDEwICsgeSAlIDEwOwp9CgojaW5jbHVkZSA8bnVtZXJpYz4KCnVuc2lnbmVkIGxvbmcgY29uY2F0ZW5hdGVBcnJfU2VsZG9uKCB1bnNpZ25lZCogZmlyc3QsIHVuc2lnbmVkKiBsYXN0ICkKewogICAgcmV0dXJuIHN0ZDo6YWNjdW11bGF0ZShmaXJzdCwgbGFzdCwgMHVsLCBhcHBlbmRfbnVtYmVyKTsKfQoKI2luY2x1ZGUgPGl0ZXJhdG9yPgojaW5jbHVkZSA8cmFuZG9tPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGN0aW1lPgoKdW5zaWduZWQgYXJyWzVdOwoKdGVtcGxhdGU8dHlwZW5hbWUgQ2FsbGFibGU+CnZvaWQgY2hlY2soIHN0ZDo6c3RyaW5nIGNvbnN0JiBuYW1lLCBDYWxsYWJsZSYmIEZvbyApCnsKICAgIHN0ZDo6Y291dCA8PCAnXG4nIDw8IG5hbWUgPDwgIjogIiA8PCBGb28oIHN0ZDo6YmVnaW4oYXJyKSwgc3RkOjplbmQoYXJyKSApIDw8ICIsIG5lZWRlZCAiOwoKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKICAgIGF1dG8gX3RwID0gc3lzdGVtX2Nsb2NrOjpub3coKTsKCiAgICBmb3IoIHVuc2lnbmVkIGN0ID0gMDsgY3QgPCAxMDAwMDAwMDsgKytjdCApCiAgICAgICAgYXV0byB2YWwgPSBGb28oIHN0ZDo6YmVnaW4oYXJyKSwgc3RkOjplbmQoYXJyKSApOwoKICAgIHN0ZDo6Y291dCA8PCAoc3lzdGVtX2Nsb2NrOjpub3coKSAtIF90cCkuY291bnQoKSA8PCAiIHRpY2tzIjsKfQoKaW50IG1haW4oKQp7CiAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjx1bnNpZ25lZD4gZGlzdCgwLCAxMDApOwogICAgc3RkOjptaW5zdGRfcmFuZCBkZXZpY2UodGltZShudWxscHRyKSk7CiAgICBzdGQ6OmdlbmVyYXRlKCBzdGQ6OmJlZ2luKGFyciksIHN0ZDo6ZW5kKGFyciksIHN0ZDo6YmluZChkaXN0LCBkZXZpY2UpICk7CgogICAgc3RkOjpjb3V0IDw8ICJWYWx1ZXM6ICI7CiAgICBzdGQ6OmNvcHkoIHN0ZDo6YmVnaW4oYXJyKSwgc3RkOjplbmQoYXJyKSwgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPHVuc2lnbmVkPihzdGQ6OmNvdXQsICIsICIpICk7CgogICAgY2hlY2soICJTZWxkb24iLCBjb25jYXRlbmF0ZUFycl9TZWxkb24gKTsKICAgIGNoZWNrKCAiU29uZSAgIiwgY29uY2F0ZW5hdGVBcnJfU29uZSApOwp9