//https://w...content-available-to-author-only...t.com/r/dailyprogrammer/comments/5st2so/20170208_challenge_302_intermediate_ascii/
#include <iostream>
#include <vector>
class histogram_t
{
public:
histogram_t()
: m_bar_width( 10 )
{}
histogram_t( const std::pair< int, int > xrange, const std::pair< int, int >yrange )
: m_bar_width( 10 ),
m_width_min( xrange.first ),
m_width_max( xrange.second ),
m_height_max( yrange.second ),
m_height_min( yrange.first )
{
create_and_init_bars();
}
void print( const char marker = '*')
{
int fwidth = get_format_width();
for( int height = 0; height <= m_height_max; height++ )
{
printf( "%*d|",fwidth , m_height_max - height );
if ( height != m_height_max )
{
for ( int width = 0; width < m_bars.size(); width++ )
{
printf( "%*.c", fwidth + 1, ( m_bars[width] < m_height_max - height ? ' ' : marker ) );
}
std::cout << std::endl;
}
else
{
for ( int width = 0; width <= m_bars.size(); width++ )
{
printf("%*d ", fwidth, m_width_min + ( width * m_bar_width ) );
}
}
}
}
void set_height( const std::pair< int, int > range )
{
m_height_max = range.second;
m_height_min = range.first;
}
void set_width( const std::pair< int, int > range )
{
m_width_max = range.second;
m_width_min = range.first;
create_and_init_bars();
}
void add_data( std::vector<std::pair<int,int>> values )
{
std::vector<std::pair<int, int>>::iterator it;
for( it = values.begin(); it != values.end(); it++ )
{
add_data( *it );
}
}
void add_data( std::pair<int, int> data )
{
add_data( data.first, data.second );
}
protected:
int calculate_bar( const int number ) const { return ( number - m_width_min ) / m_bar_width; }
void create_and_init_bars( void )
{
m_bars.clear();
int barn = ( m_width_max - m_width_min ) / m_bar_width;
for( int i = 0; i < barn; i++ )
{
m_bars.push_back( 0 );
}
}
int get_format_width( void )
{
int max = m_width_max;
int rc = 0;
while( max > 0)
{
rc++;
max /= 10;
}
return rc;
}
void add_data( const int bar, const int frequency )
{
m_bars[ calculate_bar( bar ) ] += frequency;
}
const int m_bar_width;
int m_height_min,
m_height_max,
m_width_min,
m_width_max;
std::vector<int> m_bars;
};
int main ()
{
histogram_t h( { 0, 50 }, { 1,10 } );
h.add_data({ { 0, 1 }, { 10, 3 }, { 20, 6 }, { 30, 4 }, { 40, 2 } } );
h.print( '|' );
return 0;
}
Ly9odHRwczovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnQuY29tL3IvZGFpbHlwcm9ncmFtbWVyL2NvbW1lbnRzLzVzdDJzby8yMDE3MDIwOF9jaGFsbGVuZ2VfMzAyX2ludGVybWVkaWF0ZV9hc2NpaS8KCiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KCmNsYXNzIGhpc3RvZ3JhbV90CnsKcHVibGljOgogICAgaGlzdG9ncmFtX3QoKQogICAgICAgIDogbV9iYXJfd2lkdGgoIDEwICkKICAgIHt9CiAgICBoaXN0b2dyYW1fdCggY29uc3Qgc3RkOjpwYWlyPCBpbnQsIGludCA+IHhyYW5nZSwgY29uc3Qgc3RkOjpwYWlyPCBpbnQsIGludCA+eXJhbmdlICkKICAgICAgICAgICAgOiBtX2Jhcl93aWR0aCggMTAgKSwKICAgICAgICAgICAgICBtX3dpZHRoX21pbiggeHJhbmdlLmZpcnN0ICksCiAgICAgICAgICAgICAgbV93aWR0aF9tYXgoIHhyYW5nZS5zZWNvbmQgKSwKICAgICAgICAgICAgICBtX2hlaWdodF9tYXgoIHlyYW5nZS5zZWNvbmQgKSwKICAgICAgICAgICAgICBtX2hlaWdodF9taW4oIHlyYW5nZS5maXJzdCApCiAgICB7CiAgICAgICAgY3JlYXRlX2FuZF9pbml0X2JhcnMoKTsKICAgIH0KICAgIHZvaWQgcHJpbnQoIGNvbnN0IGNoYXIgbWFya2VyID0gJyonKQogICAgewoKICAgICAgICBpbnQgZndpZHRoID0gZ2V0X2Zvcm1hdF93aWR0aCgpOwoKICAgICAgICBmb3IoIGludCBoZWlnaHQgPSAwOyBoZWlnaHQgPD0gbV9oZWlnaHRfbWF4OyBoZWlnaHQrKyApCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoICIlKmR8Iixmd2lkdGggLCBtX2hlaWdodF9tYXggLSBoZWlnaHQgKTsKICAgICAgICAgICAgaWYgKCBoZWlnaHQgIT0gbV9oZWlnaHRfbWF4ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yICggaW50IHdpZHRoID0gMDsgd2lkdGggPCBtX2JhcnMuc2l6ZSgpOyB3aWR0aCsrICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBwcmludGYoICIlKi5jIiwgZndpZHRoICsgMSwgKCBtX2JhcnNbd2lkdGhdIDwgbV9oZWlnaHRfbWF4IC0gaGVpZ2h0ID8gJyAnIDogbWFya2VyICkgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgZm9yICggaW50IHdpZHRoID0gMDsgd2lkdGggPD0gbV9iYXJzLnNpemUoKTsgd2lkdGgrKyApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlKmQgIiwgZndpZHRoLCBtX3dpZHRoX21pbiArICggd2lkdGggKiBtX2Jhcl93aWR0aCApICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKICAgIH0KICAgIHZvaWQgc2V0X2hlaWdodCggY29uc3Qgc3RkOjpwYWlyPCBpbnQsIGludCA+IHJhbmdlICkKICAgIHsKICAgICAgICBtX2hlaWdodF9tYXggPSByYW5nZS5zZWNvbmQ7CiAgICAgICAgbV9oZWlnaHRfbWluID0gcmFuZ2UuZmlyc3Q7CiAgICB9CiAgICB2b2lkIHNldF93aWR0aCggY29uc3Qgc3RkOjpwYWlyPCBpbnQsIGludCA+IHJhbmdlICkKICAgIHsKICAgICAgICBtX3dpZHRoX21heCA9IHJhbmdlLnNlY29uZDsKICAgICAgICBtX3dpZHRoX21pbiA9IHJhbmdlLmZpcnN0OwogICAgICAgIGNyZWF0ZV9hbmRfaW5pdF9iYXJzKCk7CiAgICB9CgogICAgdm9pZCBhZGRfZGF0YSggc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCxpbnQ+PiB2YWx1ZXMgKQogICAgewogICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIGludD4+OjppdGVyYXRvciBpdDsKICAgICAgICBmb3IoIGl0ID0gdmFsdWVzLmJlZ2luKCk7IGl0ICE9IHZhbHVlcy5lbmQoKTsgaXQrKyApCiAgICAgICAgewogICAgICAgICAgICBhZGRfZGF0YSggKml0ICk7CiAgICAgICAgfQogICAgfQogICAgdm9pZCBhZGRfZGF0YSggc3RkOjpwYWlyPGludCwgaW50PiBkYXRhICkKICAgIHsKICAgICAgICBhZGRfZGF0YSggZGF0YS5maXJzdCwgZGF0YS5zZWNvbmQgKTsKICAgIH0KCnByb3RlY3RlZDoKICAgIGludCBjYWxjdWxhdGVfYmFyKCBjb25zdCBpbnQgbnVtYmVyICkgY29uc3QgeyByZXR1cm4gKCBudW1iZXIgLSBtX3dpZHRoX21pbiApICAvIG1fYmFyX3dpZHRoOyB9CiAgICB2b2lkIGNyZWF0ZV9hbmRfaW5pdF9iYXJzKCB2b2lkICkKICAgIHsKICAgICAgICBtX2JhcnMuY2xlYXIoKTsKICAgICAgICBpbnQgYmFybiA9ICggbV93aWR0aF9tYXggLSBtX3dpZHRoX21pbiApIC8gbV9iYXJfd2lkdGg7CiAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBiYXJuOyBpKysgKQogICAgICAgIHsKICAgICAgICAgICAgbV9iYXJzLnB1c2hfYmFjayggMCApOwogICAgICAgIH0KICAgIH0KICAgIGludCBnZXRfZm9ybWF0X3dpZHRoKCB2b2lkICkKICAgIHsKICAgICAgICBpbnQgbWF4ID0gbV93aWR0aF9tYXg7CiAgICAgICAgaW50IHJjID0gMDsKICAgICAgICB3aGlsZSggbWF4ID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIHJjKys7CiAgICAgICAgICAgIG1heCAvPSAxMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJjOwogICAgfQogICAgdm9pZCBhZGRfZGF0YSggY29uc3QgaW50IGJhciwgY29uc3QgaW50IGZyZXF1ZW5jeSApCiAgICB7CiAgICAgICAgbV9iYXJzWyBjYWxjdWxhdGVfYmFyKCBiYXIgKSBdICs9IGZyZXF1ZW5jeTsKICAgIH0KICAgIGNvbnN0IGludCBtX2Jhcl93aWR0aDsKICAgIGludCBtX2hlaWdodF9taW4sCiAgICBtX2hlaWdodF9tYXgsCiAgICBtX3dpZHRoX21pbiwKICAgIG1fd2lkdGhfbWF4OwogICAgc3RkOjp2ZWN0b3I8aW50PiBtX2JhcnM7Cgp9OwoKaW50IG1haW4gKCkKewogICAgaGlzdG9ncmFtX3QgaCggeyAwLCA1MCB9LCB7IDEsMTAgfSApOwogICAgaC5hZGRfZGF0YSh7IHsgMCwgMSB9LCB7IDEwLCAzIH0sIHsgMjAsIDYgfSwgeyAzMCwgNCB9LCB7IDQwLCAyIH0gfSApOwogICAgaC5wcmludCggJ3wnICk7CiAgICByZXR1cm4gMDsKfQ==