aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAbigail <abigail@abigail.be>2020-09-21 19:30:15 +0200
committerAbigail <abigail@abigail.be>2020-09-21 19:30:15 +0200
commit88acc407f4db3e21ac6701f49886728f2dc846b2 (patch)
treeb503e22ab6a91a3d95f9b4770c0f97ea5c236550
parentfa07704e9e67658e76e89d0b00c9cfeb62d7aa42 (diff)
downloadperlweeklychallenge-club-88acc407f4db3e21ac6701f49886728f2dc846b2.tar.gz
perlweeklychallenge-club-88acc407f4db3e21ac6701f49886728f2dc846b2.tar.bz2
perlweeklychallenge-club-88acc407f4db3e21ac6701f49886728f2dc846b2.zip
Javascript solution for Week 079, part 2.
-rw-r--r--challenge-079/abigail/node/ch-2.js77
1 files changed, 77 insertions, 0 deletions
diff --git a/challenge-079/abigail/node/ch-2.js b/challenge-079/abigail/node/ch-2.js
new file mode 100644
index 0000000000..a3de411e8c
--- /dev/null
+++ b/challenge-079/abigail/node/ch-2.js
@@ -0,0 +1,77 @@
+//
+// Challenge:
+//
+// You are given an array of positive numbers @N.
+// Write a script to represent it as Histogram Chart and find out
+// how much water it can trap.
+//
+
+//
+// Create an interface to read from STDIN
+//
+const rl = require ('readline') . createInterface ({
+ input: process . stdin,
+});
+
+//
+// Read lines of input, calculate the result, and print it.
+//
+rl . on ('line', (line) => {
+ print_histogram (line);
+});
+
+
+//
+// Node doesn't have (s)printf, so we're writing our own formatting function.
+//
+function ff (n, width, pad = " ") {
+ let s = n . toString ();
+ while (s . length < width) {
+ s = pad + s;
+ }
+ return s;
+}
+
+function print_histogram (input) {
+ //
+ // Extract N from the input, find the maximum,
+ // and the width of this maximum.
+ //
+ let N = input . split (" ") . map (Number);
+ let max = Math . max (... N);
+ let w = max . toString () . length;
+
+ //
+ // Count down volumes from the maximum, down to 1.
+ // For each volume, print the volume, and for each entry
+ // in N, print "#" if the volume is equal or less than
+ // the entry in N, else, print " ".
+ //
+ for (let volume = max; volume; volume --) {
+ let line = ff (volume, w);
+ for (let i = 0; i < N . length; i ++) {
+ line += " " + ff (volume <= N [i] ? "#" : " ", w);
+ }
+ console . log (line);
+ }
+
+ //
+ // Print the bars
+ //
+ let line = "";
+ line += ff ("_", w, "_");
+ for (let i = 0; i < N . length; i ++) {
+ line += " " + ff ("_", w, "_");
+ }
+ console . log (line);
+
+ //
+ // Finally, print the totals
+ //
+ line = "";
+ line += ff (" ", w);
+ for (let i = 0; i < N . length; i ++) {
+ line += " " + ff (N [i], w);
+ }
+ console . log (line);
+}