/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static int[] histogram(final int min, final int max, final int bucket, final int count) {
// note, in this method, there's no need to know the actual values, just the range.
final int range = max - min + 1;
final int buckets = (range + bucket - 1) / bucket;
final int[] results = new int[buckets];
for (int i = 0; i < count; i++) {
int value = rand.nextInt(range);
results[value / bucket]++;
}
return results;
}
public static void displayHistogram(final int first, final int bucketsize, final int maxbar, final int[] buckets) {
int maxcount = getMax(buckets);
int scale = ((maxcount + maxbar - 1) / maxbar) + 1;
int width = (maxcount + scale - 1) / scale;
String format
= "%5d-%-5d | %-" + width
+ "s | %d\n"; for (int i = 0; i < buckets.length; i++) {
int start = (bucketsize * i) + first;
int end = start + bucketsize - 1;
System.
out.
printf(format, start, end, buildAsterisks
(buckets
[i
], scale
), buckets
[i
]); }
System.
out.
printf("%11s | %s\n",
"", lines
(width
)); System.
out.
printf("%-11s | %s\n",
"Scale", marks
(maxcount, scale
));
}
private static int getMax(int[] buckets) {
int max = 0;
for (int val : buckets) {
max
= Math.
max(max, val
); }
return max;
}
private static Object marks
(int maxcount,
int scale
) { int width
= (int)Math.
log10(maxcount
- 1) + 2; int count = ((maxcount + scale - 1) / scale) / width;
StringBuilder sb = new StringBuilder();
int mark = 0;
int step = scale * width;
for (int i = 0; i < count; i++) {
mark += step;
sb.
append(String.
format("%" + width
+ "d", mark
)); }
return sb.toString();
}
private static String lines
(int width
) { char[] array = new char[width];
}
private static String buildAsterisks
(int size,
int scale
) { char[] array = new char[(size + scale - 1) / scale];
}
public static void main
(String[] args
) { int min = 1;
int max = 100;
int bsize = 10;
int[] buckets = histogram(min, max, bsize, 1000);
displayHistogram(min, bsize, 40, buckets);
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKICAgIHB1YmxpYyBzdGF0aWMgaW50W10gaGlzdG9ncmFtKGZpbmFsIGludCBtaW4sIGZpbmFsIGludCBtYXgsIGZpbmFsIGludCBidWNrZXQsIGZpbmFsIGludCBjb3VudCkgewogICAgICAgIC8vIG5vdGUsIGluIHRoaXMgbWV0aG9kLCB0aGVyZSdzIG5vIG5lZWQgdG8ga25vdyB0aGUgYWN0dWFsIHZhbHVlcywganVzdCB0aGUgcmFuZ2UuCiAgICAgICAgZmluYWwgaW50IHJhbmdlID0gbWF4IC0gbWluICsgMTsKICAgICAgICBmaW5hbCBpbnQgYnVja2V0cyA9IChyYW5nZSArIGJ1Y2tldCAtIDEpIC8gYnVja2V0OwogICAgICAgIGZpbmFsIGludFtdIHJlc3VsdHMgPSBuZXcgaW50W2J1Y2tldHNdOwogICAgICAgIGZpbmFsIFJhbmRvbSByYW5kID0gbmV3IFJhbmRvbSgpOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICBpbnQgdmFsdWUgPSByYW5kLm5leHRJbnQocmFuZ2UpOwogICAgICAgICAgICByZXN1bHRzW3ZhbHVlIC8gYnVja2V0XSsrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0KICAgIAogICAgcHVibGljIHN0YXRpYyB2b2lkIGRpc3BsYXlIaXN0b2dyYW0oZmluYWwgaW50IGZpcnN0LCBmaW5hbCBpbnQgYnVja2V0c2l6ZSwgZmluYWwgaW50IG1heGJhciwgZmluYWwgaW50W10gYnVja2V0cykgewogICAgICAgIGludCBtYXhjb3VudCA9IGdldE1heChidWNrZXRzKTsKICAgICAgICBpbnQgc2NhbGUgPSAoKG1heGNvdW50ICsgbWF4YmFyIC0gMSkgLyBtYXhiYXIpICsgMTsKICAgICAgICBpbnQgd2lkdGggPSAobWF4Y291bnQgKyBzY2FsZSAtIDEpIC8gc2NhbGU7CiAgICAgICAgU3RyaW5nIGZvcm1hdCA9ICIlNWQtJS01ZCB8ICUtIiArIHdpZHRoICsgInMgfCAlZFxuIjsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1Y2tldHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaW50IHN0YXJ0ID0gKGJ1Y2tldHNpemUgKiBpKSArIGZpcnN0OwogICAgICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyBidWNrZXRzaXplIC0gMTsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGYoZm9ybWF0LCBzdGFydCwgZW5kLCBidWlsZEFzdGVyaXNrcyhidWNrZXRzW2ldLCBzY2FsZSksIGJ1Y2tldHNbaV0pOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJTExcyB8ICVzXG4iLCAiIiwgbGluZXMod2lkdGgpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiJS0xMXMgfCAlc1xuIiwgIlNjYWxlIiwgbWFya3MobWF4Y291bnQsIHNjYWxlKSk7CiAgICAgICAgCiAgICB9ICAgIAogICAgCiAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TWF4KGludFtdIGJ1Y2tldHMpIHsKICAgICAgICBpbnQgbWF4ID0gMDsKICAgICAgICBmb3IgKGludCB2YWwgOiBidWNrZXRzKSB7CiAgICAgICAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgIHZhbCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXg7CiAgICB9CgogICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IG1hcmtzKGludCBtYXhjb3VudCwgaW50IHNjYWxlKSB7CiAgICAgICAgaW50IHdpZHRoID0gKGludClNYXRoLmxvZzEwKG1heGNvdW50IC0gMSkgKyAyOwogICAgICAgIGludCBjb3VudCA9ICgobWF4Y291bnQgKyBzY2FsZSAtIDEpIC8gc2NhbGUpIC8gd2lkdGg7CiAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAgICAgICAgaW50IG1hcmsgPSAwOwogICAgICAgIGludCBzdGVwID0gc2NhbGUgKiB3aWR0aDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgbWFyayArPSBzdGVwOwogICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJSIgKyB3aWR0aCArICJkIiwgbWFyaykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbGluZXMoaW50IHdpZHRoKSB7CiAgICAgICAgY2hhcltdIGFycmF5ID0gbmV3IGNoYXJbd2lkdGhdOwogICAgICAgIEFycmF5cy5maWxsKGFycmF5LCAnLScpOwogICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGFycmF5KTsKICAgIH0KCiAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRBc3Rlcmlza3MoaW50IHNpemUsIGludCBzY2FsZSkgewogICAgICAgIGNoYXJbXSBhcnJheSA9IG5ldyBjaGFyWyhzaXplICsgc2NhbGUgLSAxKSAvIHNjYWxlXTsKICAgICAgICBBcnJheXMuZmlsbChhcnJheSwgJyonKTsKICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhhcnJheSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIGludCBtaW4gPSAxOwogICAgICAgIGludCBtYXggPSAxMDA7CiAgICAgICAgaW50IGJzaXplID0gMTA7CiAgICAgICAgaW50W10gYnVja2V0cyA9IGhpc3RvZ3JhbShtaW4sIG1heCwgYnNpemUsIDEwMDApOwogICAgICAgIGRpc3BsYXlIaXN0b2dyYW0obWluLCBic2l6ZSwgNDAsIGJ1Y2tldHMpOwogICAgfQogICAgCn0=