aboutsummaryrefslogtreecommitdiff
path: root/challenge-179
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2022-08-22 15:12:47 +0100
committerGitHub <noreply@github.com>2022-08-22 15:12:47 +0100
commit57c0470254ae5db1240dfd5fcd2b0d8fa4eb545a (patch)
tree24fccedb9424496d576560e035a000892b0257b0 /challenge-179
parentd9e9ed12ce42bbc276f3dc163c5a29cf4b5976bf (diff)
parentf5fd5b95a4dce33551918494e9026941fd915682 (diff)
downloadperlweeklychallenge-club-57c0470254ae5db1240dfd5fcd2b0d8fa4eb545a.tar.gz
perlweeklychallenge-club-57c0470254ae5db1240dfd5fcd2b0d8fa4eb545a.tar.bz2
perlweeklychallenge-club-57c0470254ae5db1240dfd5fcd2b0d8fa4eb545a.zip
Merge pull request #6641 from Firedrake/rogerbw-challenge-179
Solutions for challenge #179
Diffstat (limited to 'challenge-179')
-rwxr-xr-xchallenge-179/roger-bell-west/javascript/ch-2.js35
-rw-r--r--challenge-179/roger-bell-west/kotlin/ch-2.kt34
-rwxr-xr-xchallenge-179/roger-bell-west/lua/ch-2.lua35
-rwxr-xr-xchallenge-179/roger-bell-west/perl/ch-1.pl13
-rwxr-xr-xchallenge-179/roger-bell-west/perl/ch-2.pl26
-rw-r--r--challenge-179/roger-bell-west/postscript/ch-2.ps56
-rwxr-xr-xchallenge-179/roger-bell-west/python/ch-2.py23
-rwxr-xr-xchallenge-179/roger-bell-west/raku/ch-1.p611
-rwxr-xr-xchallenge-179/roger-bell-west/raku/ch-2.p621
-rwxr-xr-xchallenge-179/roger-bell-west/ruby/ch-2.rb31
-rwxr-xr-xchallenge-179/roger-bell-west/rust/ch-2.rs32
11 files changed, 317 insertions, 0 deletions
diff --git a/challenge-179/roger-bell-west/javascript/ch-2.js b/challenge-179/roger-bell-west/javascript/ch-2.js
new file mode 100755
index 0000000000..6c4838eed9
--- /dev/null
+++ b/challenge-179/roger-bell-west/javascript/ch-2.js
@@ -0,0 +1,35 @@
+#! /usr/bin/node
+
+"use strict"
+
+function sparkline(nn) {
+ let bar = [];
+ for (let bc = 9601; bc <= 9608; bc++) {
+ bar.push(String.fromCharCode(bc));
+ }
+ let mn = Math.min(...nn);
+ let mx = Math.max(...nn);
+ let inscale = mx - mn;
+ let outscale = bar.length;
+ let out = "";
+ for (let v of nn) {
+ let va = Math.min(Math.floor((v - mn) / inscale * outscale),
+ outscale - 1);
+ out += bar[va];
+ }
+ return out;
+}
+
+if (sparkline([0, 100]) == "▁█") {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write(" ");
+
+if (sparkline([1, 2, 3, 4, 5, 6, 7, 8]) == "▁▂▃▄▅▆▇█") {
+ process.stdout.write("Pass");
+} else {
+ process.stdout.write("FAIL");
+}
+process.stdout.write("\n");
diff --git a/challenge-179/roger-bell-west/kotlin/ch-2.kt b/challenge-179/roger-bell-west/kotlin/ch-2.kt
new file mode 100644
index 0000000000..d970b9aecf
--- /dev/null
+++ b/challenge-179/roger-bell-west/kotlin/ch-2.kt
@@ -0,0 +1,34 @@
+fun sparkline(nn: List<Int>): String {
+ var bar = ArrayList<Char>();
+ for (bc in 9601..9608) {
+ bar.add(bc.toChar())
+ }
+ val mn = nn.minOrNull()!!
+ val mx = nn.maxOrNull()!!
+ val inscale = mx - mn
+ val outscale = bar.size
+ var out = ""
+ for (v in nn) {
+ var va = ((v-mn).toDouble()/inscale.toDouble() * outscale.toDouble()).toInt()
+ if (va > outscale - 1) {
+ va = outscale - 1
+ }
+ out += bar[va]
+ }
+ return out
+}
+
+fun main() {
+ if (sparkline(listOf(0,100)) == "▁█") {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ print(" ")
+ if (sparkline(listOf(1, 2, 3, 4, 5, 6, 7, 8)) == "▁▂▃▄▅▆▇█") {
+ print("Pass")
+ } else {
+ print("FAIL")
+ }
+ println("")
+}
diff --git a/challenge-179/roger-bell-west/lua/ch-2.lua b/challenge-179/roger-bell-west/lua/ch-2.lua
new file mode 100755
index 0000000000..9225e21744
--- /dev/null
+++ b/challenge-179/roger-bell-west/lua/ch-2.lua
@@ -0,0 +1,35 @@
+#! /usr/bin/lua
+
+function sparkline(nn)
+ local bar = {}
+ for c = 0x2581, 0x2588 do
+ table.insert(bar, utf8.char(c))
+ end
+ local mn = math.min(table.unpack(nn))
+ local mx = math.max(table.unpack(nn))
+ local inscale = mx - mn
+ local outscale = #bar
+ local out = ""
+ for k,v in pairs(nn) do
+ va = 1 + math.floor((v - mn) / inscale * outscale)
+ if va > outscale then
+ va = outscale
+ end
+ out = out .. bar[va]
+ end
+ return out
+end
+
+if sparkline({0, 10}) == "▁█" then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+io.write(" ")
+
+if sparkline({1, 2, 3, 4, 5, 6, 7, 8}) == "▁▂▃▄▅▆▇█" then
+ io.write("Pass")
+else
+ io.write("FAIL")
+end
+print("")
diff --git a/challenge-179/roger-bell-west/perl/ch-1.pl b/challenge-179/roger-bell-west/perl/ch-1.pl
new file mode 100755
index 0000000000..9e762785e4
--- /dev/null
+++ b/challenge-179/roger-bell-west/perl/ch-1.pl
@@ -0,0 +1,13 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use Lingua::EN::Numbers qw(num2en_ordinal);
+
+use Test::More tests => 3;
+
+is(num2en_ordinal(11),"eleventh",'example 1');
+is(num2en_ordinal(62),"sixty-second",'example 2');
+is(num2en_ordinal(99),"ninety-ninth",'example 3');
diff --git a/challenge-179/roger-bell-west/perl/ch-2.pl b/challenge-179/roger-bell-west/perl/ch-2.pl
new file mode 100755
index 0000000000..6538a25638
--- /dev/null
+++ b/challenge-179/roger-bell-west/perl/ch-2.pl
@@ -0,0 +1,26 @@
+#! /usr/bin/perl
+
+use strict;
+use warnings;
+use experimental 'signatures';
+
+use utf8;
+use List::Util qw(min max);
+
+use Test::More tests => 2;
+
+is(sparkline([0, 100]), "▁█", 'example 1');
+
+is(sparkline([1, 2, 3, 4, 5, 6, 7, 8]), "▁▂▃▄▅▆▇█", 'example 1');
+
+sub sparkline($nn) {
+ my @bar = map {chr($_)} (0x2581..0x2588);
+ my $mn = min(@{$nn});
+ my $mx = max(@{$nn});
+ my $inscale = $mx - $mn;
+ my $outscale = scalar @bar;
+ return join('',map {$bar[min(
+ int(($_ - $mn) / $inscale * $outscale),
+ $outscale - 1
+ )]} @{$nn});
+}
diff --git a/challenge-179/roger-bell-west/postscript/ch-2.ps b/challenge-179/roger-bell-west/postscript/ch-2.ps
new file mode 100644
index 0000000000..1cad0dbdcc
--- /dev/null
+++ b/challenge-179/roger-bell-west/postscript/ch-2.ps
@@ -0,0 +1,56 @@
+%!PS
+
+% begin included library code
+% see https://github.com/Firedrake/postscript-libraries/
+/reduce { % array proc -> value
+ 2 dict begin
+ /p exch def
+ /a exch def
+ a 0 get
+ 1 1 a length 1 sub {
+ a exch get
+ p
+ } for
+ end
+} bind def
+
+/listmax {
+ { max } reduce
+} bind def
+
+/listmin {
+ { min } reduce
+} bind def
+
+
+% end included library code
+
+/sparkline {
+ 9 dict begin
+ /nn exch def
+ /bar 8 array def
+ 0 1 7 {
+ /i exch def
+ /cc 3 string def
+ cc 0 16#e2 put
+ cc 1 16#96 put
+ cc 2 16#81 i add put
+ bar i cc put
+ } for
+ /mn nn listmin def
+ /mx nn listmax def
+ /inscale mx mn sub def
+ /outscale bar length def
+ /out nn length 3 mul string def
+ 0 1 nn length 1 sub {
+ /i exch def
+ out i 3 mul
+ bar nn i get mn sub inscale div outscale mul cvi outscale 1 sub min get
+ putinterval
+ } for
+ out
+ end
+} bind def
+
+[ 0 10 ] sparkline print () =
+[ 1 2 3 4 5 6 7 8 ] sparkline print () =
diff --git a/challenge-179/roger-bell-west/python/ch-2.py b/challenge-179/roger-bell-west/python/ch-2.py
new file mode 100755
index 0000000000..73f896e6a7
--- /dev/null
+++ b/challenge-179/roger-bell-west/python/ch-2.py
@@ -0,0 +1,23 @@
+#! /usr/bin/python3
+
+import unittest
+
+def sparkline(nn):
+ bar = [chr(bc) for bc in range(9601, 9608+1)]
+ mn = min(nn)
+ mx = max(nn)
+ inscale = mx - mn
+ outscale = len(bar)
+ return ''.join(bar[min(int((n-mn) / inscale * outscale),outscale - 1)] for n in nn)
+
+class TestSparkline(unittest.TestCase):
+
+ def test_ex1(self):
+ self.assertEqual(sparkline([0, 100]),
+ "▁█", 'example 1')
+
+ def test_ex2(self):
+ self.assertEqual(sparkline([1, 2, 3, 4, 5, 6, 7, 8]),
+ "▁▂▃▄▅▆▇█", 'example 2')
+
+unittest.main()
diff --git a/challenge-179/roger-bell-west/raku/ch-1.p6 b/challenge-179/roger-bell-west/raku/ch-1.p6
new file mode 100755
index 0000000000..9ed24766e0
--- /dev/null
+++ b/challenge-179/roger-bell-west/raku/ch-1.p6
@@ -0,0 +1,11 @@
+#! /usr/bin/perl6
+
+use Lingua::EN::Numbers;
+
+use Test;
+
+plan 3;
+
+is(ordinal(11),"eleventh",'example 1');
+is(ordinal(62),"sixty-second",'example 2');
+is(ordinal(99),"ninety-ninth",'example 3');
diff --git a/challenge-179/roger-bell-west/raku/ch-2.p6 b/challenge-179/roger-bell-west/raku/ch-2.p6
new file mode 100755
index 0000000000..33b03ae459
--- /dev/null
+++ b/challenge-179/roger-bell-west/raku/ch-2.p6
@@ -0,0 +1,21 @@
+#! /usr/bin/perl6
+
+use Test;
+
+plan 2;
+
+is(sparkline([0, 100]), "▁█", 'example 1');
+is(sparkline([1, 2, 3, 4, 5, 6, 7, 8]), "▁▂▃▄▅▆▇█", 'example 2');
+
+sub sparkline(@nn) {
+ my @bar;
+ for (0x2581..0x2588) -> $bc {
+ @bar.push($bc.chr);
+ }
+ my $mn = min(@nn);
+ my $mx = max(@nn);
+ my $inscale = $mx - $mn;
+ my $outscale = @bar.elems;
+ return @nn.map({@bar[min(floor(($_-$mn) / $inscale * $outscale),
+ $outscale - 1)]}).join('');
+}
diff --git a/challenge-179/roger-bell-west/ruby/ch-2.rb b/challenge-179/roger-bell-west/ruby/ch-2.rb
new file mode 100755
index 0000000000..191c427b24
--- /dev/null
+++ b/challenge-179/roger-bell-west/ruby/ch-2.rb
@@ -0,0 +1,31 @@
+#! /usr/bin/ruby
+# coding: utf-8
+
+require 'test/unit'
+
+def sparkline(nn)
+ bar = []
+ 9601.upto(9608) do |bc|
+ bar.push(bc.chr(Encoding::UTF_8))
+ end
+ mn = nn.min
+ mx = nn.max
+ inscale = mx - mn
+ outscale = bar.length
+ return nn.collect {|n| bar[[
+ (((n-mn) * outscale).to_f / inscale.to_f).to_i,
+ outscale - 1
+ ].min]}.join("")
+end
+
+class TestSparkline < Test::Unit::TestCase
+
+ def test_ex1
+ assert_equal("▁█", sparkline([0, 100]))
+ end
+
+ def test_ex2
+ assert_equal("▁▂▃▄▅▆▇█", sparkline([1, 2, 3, 4, 5, 6, 7, 8]))
+ end
+
+end
diff --git a/challenge-179/roger-bell-west/rust/ch-2.rs b/challenge-179/roger-bell-west/rust/ch-2.rs
new file mode 100755
index 0000000000..833fcc05bd
--- /dev/null
+++ b/challenge-179/roger-bell-west/rust/ch-2.rs
@@ -0,0 +1,32 @@
+#! /bin/sh
+//usr/bin/env rustc --test $0 -o ${0}x && ./${0}x --nocapture; rm -f ${0}x ; exit
+
+#[test]
+fn test_ex1() {
+ assert_eq!(sparkline(vec![0, 10]), "▁█".to_string());
+}
+
+#[test]
+fn test_ex2() {
+ assert_eq!(sparkline(vec![1, 2, 3, 4, 5, 6, 7, 8]), "▁▂▃▄▅▆▇█".to_string());
+}
+
+fn sparkline(nn: Vec<i32>) -> String {
+ let bar = (9601..=9608)
+ .map(|i| char::from_u32(i).unwrap())
+ .collect::<Vec<char>>();
+ let mn = *nn.iter().min().unwrap();
+ let mx = *nn.iter().max().unwrap();
+ let inscale = mx - mn;
+ let outscale = bar.len();
+ let mut o = "".to_string();
+ for n in nn {
+ let mut i =
+ (((n - mn) * outscale as i32) as f64 / (inscale as f64)) as usize;
+ if i > outscale - 1 {
+ i = outscale - 1;
+ }
+ o.push(bar[i]);
+ }
+ o
+}