From fa7cbaee4baf174ee416280d82a60fade6d3eaad Mon Sep 17 00:00:00 2001 From: Raphael McSinyx Date: Mon, 13 Feb 2017 22:00:06 +0700 Subject: Add /r/dailyprogrammer Challenge #302 [Hard] --- daily/302hard/bargroup.pas | 104 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 daily/302hard/bargroup.pas (limited to 'daily/302hard/bargroup.pas') 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. -- cgit 1.4.1