#include <stdio.h>
struct Record
{
int start;
int end;
int freq;
};
void display(const struct Record *records, const struct Record *x_axis, const struct Record *y_axis, int length, int width);
int count_digits(int n);
int main(int argc, char *argv[])
{
struct Record x_axis, y_axis;
int length, interval;
scanf("%u %u %u %u\n", &x_axis.
start, &x_axis.
end, &y_axis.
start, &y_axis.
end); scanf("%u\n", &interval
); int size = length / interval;
struct Record records[size];
int k = 0;
int biggest_start = 0, biggest_end = 0;
for(int i = 0; i < length; )
{
int a, b;
struct Record current = {.start = 0, .end = 0, .freq = 0};
for(int j = 0; j < interval; j++, i++)
{
scanf("%u %u\n", &a
, &b
); if(current.start == 0)
current.start = a;
current.freq += b;
}
current.end = a;
//keeping track of the largest boundaries in order to estimate the width of the bars
//eg : 132 and 1934 will give a width of 3 (132) + 4 (1934) + 1 (space inbetween the numbers) = 8
if(current.start > biggest_start)
biggest_start = current.start;
if(current.end > biggest_end)
biggest_end = current.end;
current.freq /= interval;
records[k++] = current;
}
display(records, &x_axis, &y_axis, size, count_digits(biggest_start) + count_digits(biggest_end) + 1);
return 0;
}
void display(const struct Record *records, const struct Record *x_axis, const struct Record *y_axis, int length, int width)
{
int left_pad = count_digits(y_axis->end);
for(int freq = y_axis->end; freq >= 1; freq--)
{
printf("%*d ", left_pad
, freq
); for(int i = 0; i < length; i++)
{
//http://stackoverflow.com/a/16299867/3729391
if(records[i].freq >= freq)
printf("%.*s ", width
, "##########################"); else
}
}
printf("%*c ", left_pad
, ' '); for(int i = 0; i < length; i++)
printf("%d%*d ", records
[i
].
start, width
- count_digits
(records
[i
].
start), records
[i
].
end); }
int count_digits(int n)
{
if(n == 0)
return 1;
for(int i = 1, count = 0; ; i *= 10, count++)
if(n / i == 0)
return count;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgoJc3RydWN0IFJlY29yZAoJewoJCWludCBzdGFydDsKCQlpbnQgZW5kOwoJCWludCBmcmVxOwoJfTsKCXZvaWQgZGlzcGxheShjb25zdCBzdHJ1Y3QgUmVjb3JkICpyZWNvcmRzLCBjb25zdCBzdHJ1Y3QgUmVjb3JkICp4X2F4aXMsIGNvbnN0IHN0cnVjdCBSZWNvcmQgKnlfYXhpcywgaW50IGxlbmd0aCwgaW50IHdpZHRoKTsKCWludCBjb3VudF9kaWdpdHMoaW50IG4pOwoKCWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCgl7CgkJc3RydWN0IFJlY29yZCB4X2F4aXMsIHlfYXhpczsKCQlpbnQgbGVuZ3RoLCBpbnRlcnZhbDsKCQlzY2FuZigiJXUgJXUgJXUgJXVcbiIsICZ4X2F4aXMuc3RhcnQsICZ4X2F4aXMuZW5kLCAmeV9heGlzLnN0YXJ0LCAmeV9heGlzLmVuZCk7CgkJc2NhbmYoIiV1XG4iLCAmaW50ZXJ2YWwpOwoJCXNjYW5mKCIldVxuIiwgJmxlbmd0aCk7CgkJaW50IHNpemUgPSBsZW5ndGggLyBpbnRlcnZhbDsKCQlzdHJ1Y3QgUmVjb3JkIHJlY29yZHNbc2l6ZV07CgkJaW50IGsgPSAwOwoJCWludCBiaWdnZXN0X3N0YXJ0ID0gMCwgYmlnZ2VzdF9lbmQgPSAwOwoJCWZvcihpbnQgaSA9IDA7IGkgPCBsZW5ndGg7ICkKCQl7CgkJCWludCBhLCBiOwoJCQlzdHJ1Y3QgUmVjb3JkIGN1cnJlbnQgPSB7LnN0YXJ0ID0gMCwgLmVuZCA9IDAsIC5mcmVxID0gMH07CgkJCWZvcihpbnQgaiA9IDA7IGogPCBpbnRlcnZhbDsgaisrLCBpKyspCgkJCXsKCQkJCXNjYW5mKCIldSAldVxuIiwgJmEsICZiKTsKCQkJCWlmKGN1cnJlbnQuc3RhcnQgPT0gMCkKCQkJCQljdXJyZW50LnN0YXJ0ID0gYTsKCQkJCWN1cnJlbnQuZnJlcSArPSBiOwoJCQl9CgkJCWN1cnJlbnQuZW5kID0gYTsKCQkJLy9rZWVwaW5nIHRyYWNrIG9mIHRoZSBsYXJnZXN0IGJvdW5kYXJpZXMgaW4gb3JkZXIgdG8gZXN0aW1hdGUgdGhlIHdpZHRoIG9mIHRoZSBiYXJzCgkJCS8vZWcgOiAxMzIgYW5kIDE5MzQgd2lsbCBnaXZlIGEgd2lkdGggb2YgMyAoMTMyKSArIDQgKDE5MzQpICsgMSAoc3BhY2UgaW5iZXR3ZWVuIHRoZSBudW1iZXJzKSA9IDgKCQkJaWYoY3VycmVudC5zdGFydCA+IGJpZ2dlc3Rfc3RhcnQpCgkJCQliaWdnZXN0X3N0YXJ0ID0gY3VycmVudC5zdGFydDsKCQkJaWYoY3VycmVudC5lbmQgPiBiaWdnZXN0X2VuZCkKCQkJCWJpZ2dlc3RfZW5kID0gY3VycmVudC5lbmQ7CgkJCWN1cnJlbnQuZnJlcSAvPSBpbnRlcnZhbDsKCQkJcmVjb3Jkc1trKytdID0gY3VycmVudDsKCQl9CgkJZGlzcGxheShyZWNvcmRzLCAmeF9heGlzLCAmeV9heGlzLCBzaXplLCBjb3VudF9kaWdpdHMoYmlnZ2VzdF9zdGFydCkgKyBjb3VudF9kaWdpdHMoYmlnZ2VzdF9lbmQpICsgMSk7CgoJCXJldHVybiAwOwoJfQoKCXZvaWQgZGlzcGxheShjb25zdCBzdHJ1Y3QgUmVjb3JkICpyZWNvcmRzLCBjb25zdCBzdHJ1Y3QgUmVjb3JkICp4X2F4aXMsIGNvbnN0IHN0cnVjdCBSZWNvcmQgKnlfYXhpcywgaW50IGxlbmd0aCwgaW50IHdpZHRoKQoJewoJCWludCBsZWZ0X3BhZCA9IGNvdW50X2RpZ2l0cyh5X2F4aXMtPmVuZCk7CgkJZm9yKGludCBmcmVxID0geV9heGlzLT5lbmQ7IGZyZXEgPj0gMTsgZnJlcS0tKQoJCXsKCQkJcHJpbnRmKCIlKmQgIiwgbGVmdF9wYWQsIGZyZXEpOwoJCQlmb3IoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCgkJCXsKCQkJCS8vaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMTYyOTk4NjcvMzcyOTM5MQoJCQkJaWYocmVjb3Jkc1tpXS5mcmVxID49IGZyZXEpCgkJCQkJcHJpbnRmKCIlLipzICIsIHdpZHRoLCAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiKTsKCQkJCWVsc2UKCQkJCQlwcmludGYoIiUuKnMgIiwgd2lkdGgsICIgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwoJCQl9CgkJCXByaW50ZigiXG4iKTsKCQl9CgkJcHJpbnRmKCIlKmMgIiwgbGVmdF9wYWQsICcgJyk7CgkJZm9yKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQoJCQlwcmludGYoIiVkJSpkICIsIHJlY29yZHNbaV0uc3RhcnQsIHdpZHRoIC0gY291bnRfZGlnaXRzKHJlY29yZHNbaV0uc3RhcnQpLCByZWNvcmRzW2ldLmVuZCk7Cgl9CgoJaW50IGNvdW50X2RpZ2l0cyhpbnQgbikKCXsKCQlpZihuID09IDApCgkJCXJldHVybiAxOwoJCWZvcihpbnQgaSA9IDEsIGNvdW50ID0gMDsgOyBpICo9IDEwLCBjb3VudCsrKQoJCQlpZihuIC8gaSA9PSAwKQoJCQkJcmV0dXJuIGNvdW50OwoJfQ==