aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--daily/302hard/README.md90
-rw-r--r--daily/302hard/bargroup.pas104
-rw-r--r--daily/302hard/input43
-rw-r--r--daily/302hard/output102
4 files changed, 339 insertions, 0 deletions
diff --git a/daily/302hard/README.md b/daily/302hard/README.md
new file mode 100644
index 0000000..3afdca3
--- /dev/null
+++ b/daily/302hard/README.md
@@ -0,0 +1,90 @@
+# [[2017-02-10] Challenge #302 [Hard] ASCII Histogram Maker: Part 2 - The Proper Histogram](https://www.reddit.com/r/dailyprogrammer/comments/5t7l07/20170210_challenge_302_hard_ascii_histogram_maker/)
+
+## Description
+
+Most of us are familiar with the histogram chart - a representation of a
+frequency distribution by means of rectangles whose widths represent class
+intervals and whose areas are proportional to the corresponding frequencies. It
+is similar to a bar chart, but a histogram groups numbers into ranges. The area
+of the bar is the total frequency of all of the covered values in the range.
+
+## Input Description
+
+You'll be given four numbers on the first line telling you the start and end of
+the horizontal (X) axis and the vertical (Y) axis, respectively. The next line
+tells you the interval for the X-axis to use (the width of the bar). Then
+you'll have a number on a single line telling you how many records to read.
+Then you'll be given the data as 2 numbers: the first is the variable, the
+second number is the frequency of that variable. Example:
+
+ 1 4 1 10
+ 2
+ 4
+ 1 3
+ 2 3
+ 3 2
+ 4 6
+
+## Challenge Output
+
+Your program should emit an ASCII histogram plotting the data according to the
+specification - the size of the chart and the frequency of the X-axis,
+variables. Example:
+
+ 10
+ 9
+ 8
+ 7
+ 6
+ 5
+ 4 ***
+ 3*** ***
+ 2*** ***
+ 1*** ***
+ 1 2 3 4
+
+# Challenge Input
+
+ 0 40 0 100
+ 8
+ 40
+ 1 56
+ 2 40
+ 3 4
+ 4 67
+ 5 34
+ 6 48
+ 7 7
+ 8 45
+ 9 50
+ 10 54
+ 11 20
+ 12 24
+ 13 44
+ 14 44
+ 15 49
+ 16 28
+ 17 94
+ 18 37
+ 19 46
+ 20 64
+ 21 100
+ 22 43
+ 23 23
+ 24 100
+ 25 15
+ 26 81
+ 27 19
+ 28 92
+ 29 9
+ 30 21
+ 31 88
+ 32 31
+ 33 55
+ 34 87
+ 35 63
+ 36 88
+ 37 76
+ 38 41
+ 39 100
+ 40 6
diff --git a/daily/302hard/bargroup.pas b/daily/302hard/bargroup.pas
new file mode 100644
index 0000000..295c458
--- /dev/null
+++ b/daily/302hard/bargroup.pas
@@ -0,0 +1,104 @@
+uses math, sysutils;
+
+var
+ minx, maxx, miny, maxy, stepx, stepy, i, x0, f: integer;
+ n, j, lenf: byte;
+ raw_freq, freq: array of integer;
+ xtrue, xfalse: array of string;
+
+
+function gcd(a, b: integer): integer;
+ var
+ c: integer;
+
+ begin
+ while b > 0 do
+ begin
+ c := b;
+ b := a mod b;
+ a := c
+ end;
+ gcd := a
+ end;
+
+
+function rjust(
+ s: string;
+ width: byte;
+ fill: char
+): string;
+ begin
+ while length(s) < width do
+ s := fill + s;
+ rjust := s
+ end;
+
+
+begin
+ read(minx, maxx, miny, maxy, stepx, n);
+ setlength(raw_freq, maxx - minx + 1);
+ for i := 0 to length(raw_freq) - 1 do
+ raw_freq[i] := 0;
+ for i := 1 to n do
+ begin
+ readln(x0, f);
+ raw_freq[x0 - minx] := f
+ end;
+
+ setlength(freq, length(raw_freq) div stepx);
+ for i := 0 to length(freq) - 1 do
+ begin
+ freq[i] := 0;
+ for j := 0 to stepx - 1 do
+ inc(freq[i], raw_freq[i * stepx + j]);
+ freq[i] := freq[i] div stepx
+ end;
+
+ stepy := maxy - miny + 1;
+ for i in freq do
+ stepy := gcd(stepy, i - miny + 1);
+
+ lenf := 0;
+ i := miny;
+ repeat
+ lenf := max(length(inttostr(i)), lenf);
+ inc(i, stepy)
+ until i > maxy;
+
+ setlength(xfalse, length(freq));
+ setlength(xtrue, length(freq));
+ for i := 0 to length(freq) - 1 do
+ begin
+ xtrue[i] := rjust('', length(inttostr(minx + stepx * i)), '*');
+ xfalse[i] := rjust('', length(inttostr(minx + stepx * i)), ' ');
+ for j := 1 to stepx - 1 do
+ begin
+ xtrue[i] := xtrue[i] +
+ rjust('', length(inttostr(minx + stepx*i + j)) + 1, '*');
+ xfalse[i] := xfalse[i] +
+ rjust('', length(inttostr(minx + stepx*i + j)) + 1, ' ')
+ end
+ end;
+
+ repeat
+ write(rjust(inttostr(maxy), lenf, ' '));
+ for i := 0 to length(freq) - 2 do
+ begin
+ if freq[i] >= maxy then
+ write(xtrue[i])
+ else
+ write(xfalse[i]);
+ write(' ')
+ end;
+ if freq[length(freq) - 1] >= maxy then
+ writeln(xtrue[length(freq) - 1])
+ else
+ writeln(xfalse[length(freq) - 1]);
+ dec(maxy, stepy)
+ until maxy < miny;
+
+ write(rjust('', lenf, ' '));
+ for i := minx to maxx - 1 do
+ write(i, ' ');
+ writeln(maxx)
+end.
diff --git a/daily/302hard/input b/daily/302hard/input
new file mode 100644
index 0000000..75dd6f8
--- /dev/null
+++ b/daily/302hard/input
@@ -0,0 +1,43 @@
+1 40 0 100
+8
+40
+1 56
+2 40
+3 4
+4 67
+5 34
+6 48
+7 7
+8 45
+9 50
+10 54
+11 20
+12 24
+13 44
+14 44
+15 49
+16 28
+17 94
+18 37
+19 46
+20 64
+21 100
+22 43
+23 23
+24 100
+25 15
+26 81
+27 19
+28 92
+29 9
+30 21
+31 88
+32 31
+33 55
+34 87
+35 63
+36 88
+37 76
+38 41
+39 100
+40 6
diff --git a/daily/302hard/output b/daily/302hard/output
new file mode 100644
index 0000000..e0ccaf4
--- /dev/null
+++ b/daily/302hard/output
@@ -0,0 +1,102 @@
+100
+ 99
+ 98
+ 97
+ 96
+ 95
+ 94
+ 93
+ 92
+ 91
+ 90
+ 89
+ 88
+ 87
+ 86
+ 85
+ 84
+ 83
+ 82
+ 81
+ 80
+ 79
+ 78
+ 77
+ 76
+ 75
+ 74
+ 73
+ 72
+ 71
+ 70
+ 69
+ 68
+ 67
+ 66
+ 65
+ 64 ***********************
+ 63 *********************** ***********************
+ 62 *********************** ***********************
+ 61 *********************** ***********************
+ 60 *********************** ***********************
+ 59 *********************** ***********************
+ 58 *********************** ***********************
+ 57 *********************** ***********************
+ 56 *********************** ***********************
+ 55 *********************** ***********************
+ 54 *********************** ***********************
+ 53 *********************** ***********************
+ 52 *********************** ***********************
+ 51 *********************** ***********************
+ 50 *********************** ***********************
+ 49 *********************** ***********************
+ 48 *********************** ***********************
+ 47 *********************** ***********************
+ 46 *********************** ***********************
+ 45 *********************** ***********************
+ 44 *********************** *********************** ***********************
+ 43 *********************** *********************** ***********************
+ 42 *********************** *********************** ***********************
+ 41 *********************** *********************** ***********************
+ 40 *********************** *********************** ***********************
+ 39 ********************** *********************** *********************** ***********************
+ 38 ********************** *********************** *********************** ***********************
+ 37*************** ********************** *********************** *********************** ***********************
+ 36*************** ********************** *********************** *********************** ***********************
+ 35*************** ********************** *********************** *********************** ***********************
+ 34*************** ********************** *********************** *********************** ***********************
+ 33*************** ********************** *********************** *********************** ***********************
+ 32*************** ********************** *********************** *********************** ***********************
+ 31*************** ********************** *********************** *********************** ***********************
+ 30*************** ********************** *********************** *********************** ***********************
+ 29*************** ********************** *********************** *********************** ***********************
+ 28*************** ********************** *********************** *********************** ***********************
+ 27*************** ********************** *********************** *********************** ***********************
+ 26*************** ********************** *********************** *********************** ***********************
+ 25*************** ********************** *********************** *********************** ***********************
+ 24*************** ********************** *********************** *********************** ***********************
+ 23*************** ********************** *********************** *********************** ***********************
+ 22*************** ********************** *********************** *********************** ***********************
+ 21*************** ********************** *********************** *********************** ***********************
+ 20*************** ********************** *********************** *********************** ***********************
+ 19*************** ********************** *********************** *********************** ***********************
+ 18*************** ********************** *********************** *********************** ***********************
+ 17*************** ********************** *********************** *********************** ***********************
+ 16*************** ********************** *********************** *********************** ***********************
+ 15*************** ********************** *********************** *********************** ***********************
+ 14*************** ********************** *********************** *********************** ***********************
+ 13*************** ********************** *********************** *********************** ***********************
+ 12*************** ********************** *********************** *********************** ***********************
+ 11*************** ********************** *********************** *********************** ***********************
+ 10*************** ********************** *********************** *********************** ***********************
+ 9*************** ********************** *********************** *********************** ***********************
+ 8*************** ********************** *********************** *********************** ***********************
+ 7*************** ********************** *********************** *********************** ***********************
+ 6*************** ********************** *********************** *********************** ***********************
+ 5*************** ********************** *********************** *********************** ***********************
+ 4*************** ********************** *********************** *********************** ***********************
+ 3*************** ********************** *********************** *********************** ***********************
+ 2*************** ********************** *********************** *********************** ***********************
+ 1*************** ********************** *********************** *********************** ***********************
+ 0*************** ********************** *********************** *********************** ***********************
+ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40