#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 long append_number(unsigned long 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();
unsigned long val;
for( unsigned ct = 0; ct < 10000000; ++ct )
val = Foo( std::begin(arr), std::end(arr) );
std::cout << (system_clock::now() - _tp).count() << " ticks, result = " << val;
}
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 );
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdW5zaWduZWQgbG9uZyBjb25jYXRlbmF0ZUFycl9Tb25lKCB1bnNpZ25lZCogZmlyc3QsIHVuc2lnbmVkKiBsYXN0ICkKewogICAgdW5zaWduZWQgbG9uZyB2YWx1ZSA9IDAsCiAgICAgICAgICAgICAgICAgIGN0ID0gMTsKCiAgICB3aGlsZSggbGFzdC0tICE9IGZpcnN0ICkKICAgIHsKICAgICAgICBpZiggKmxhc3QgPiA5ICkKICAgICAgICB7CiAgICAgICAgICAgIHZhbHVlICs9IGN0ICogKCpsYXN0ICUgMTApOwogICAgICAgICAgICAqbGFzdCsrIC89IDEwOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhbHVlICs9IGN0ICogKmxhc3Q7CgogICAgICAgIGN0ICo9IDEwOwogICAgfQoKICAgIHJldHVybiB2YWx1ZTsKfQoKdW5zaWduZWQgbG9uZyBhcHBlbmRfbnVtYmVyKHVuc2lnbmVkIGxvbmcgeCwgdW5zaWduZWQgeSkgewogIHJldHVybiAoeSA8IDEwID8geCA6IGFwcGVuZF9udW1iZXIoeCwgeSAvIDEwKSkgKiAxMCArIHkgJSAxMDsKfQoKI2luY2x1ZGUgPG51bWVyaWM+Cgp1bnNpZ25lZCBsb25nIGNvbmNhdGVuYXRlQXJyX1NlbGRvbiggdW5zaWduZWQqIGZpcnN0LCB1bnNpZ25lZCogbGFzdCApCnsKICAgIHJldHVybiBzdGQ6OmFjY3VtdWxhdGUoZmlyc3QsIGxhc3QsIDB1bCwgYXBwZW5kX251bWJlcik7Cn0KCiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPHJhbmRvbT4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvbWFuaXA+CiNpbmNsdWRlIDxjaHJvbm8+CiNpbmNsdWRlIDxjdGltZT4KCnVuc2lnbmVkIGFycls1XTsKCnRlbXBsYXRlPHR5cGVuYW1lIENhbGxhYmxlPgp2b2lkIGNoZWNrKCBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSwgQ2FsbGFibGUmJiBGb28gKQp7CiAgICBzdGQ6OmNvdXQgPDwgJ1xuJyA8PCBuYW1lIDw8ICI6ICIgPDwgRm9vKCBzdGQ6OmJlZ2luKGFyciksIHN0ZDo6ZW5kKGFycikgKSA8PCAiLCBuZWVkZWQgIjsKCiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87CiAgICBhdXRvIF90cCA9IHN5c3RlbV9jbG9jazo6bm93KCk7CiAgICB1bnNpZ25lZCBsb25nIHZhbDsKCiAgICBmb3IoIHVuc2lnbmVkIGN0ID0gMDsgY3QgPCAxMDAwMDAwMDsgKytjdCApCiAgICAgICAgdmFsID0gRm9vKCBzdGQ6OmJlZ2luKGFyciksIHN0ZDo6ZW5kKGFycikgKTsKCiAgICBzdGQ6OmNvdXQgPDwgKHN5c3RlbV9jbG9jazo6bm93KCkgLSBfdHApLmNvdW50KCkgPDwgIiB0aWNrcywgcmVzdWx0ID0gIiA8PCB2YWw7Cn0KCmludCBtYWluKCkKewogICAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248dW5zaWduZWQ+IGRpc3QoMCwgMTAwKTsKICAgIHN0ZDo6bWluc3RkX3JhbmQgZGV2aWNlKHRpbWUobnVsbHB0cikpOwogICAgc3RkOjpnZW5lcmF0ZSggc3RkOjpiZWdpbihhcnIpLCBzdGQ6OmVuZChhcnIpLCBzdGQ6OmJpbmQoZGlzdCwgZGV2aWNlKSApOwoKICAgIHN0ZDo6Y291dCA8PCAiVmFsdWVzOiAiOwogICAgc3RkOjpjb3B5KCBzdGQ6OmJlZ2luKGFyciksIHN0ZDo6ZW5kKGFyciksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjx1bnNpZ25lZD4oc3RkOjpjb3V0LCAiLCAiKSApOwoKICAgIGNoZWNrKCAiU2VsZG9uIiwgY29uY2F0ZW5hdGVBcnJfU2VsZG9uICk7CiAgICBjaGVjayggIlNvbmUgICIsIGNvbmNhdGVuYXRlQXJyX1NvbmUgKTsKfQ==
Values: 37, 41, 7, 82, 8,
Seldon: 37417828, needed 554028 ticks, result = 37417828
Sone : 37417828, needed 148491 ticks, result = 34788