diff options
| author | Roger Bell_West <roger@firedrake.org> | 2022-08-22 10:00:06 +0100 |
|---|---|---|
| committer | Roger Bell_West <roger@firedrake.org> | 2022-08-22 10:00:06 +0100 |
| commit | f5fd5b95a4dce33551918494e9026941fd915682 (patch) | |
| tree | 3964ea9f9833644356b4bf431aedf5bce1808df1 | |
| parent | dbb96034773a87fc1283697c57b32447850ee644 (diff) | |
| download | perlweeklychallenge-club-f5fd5b95a4dce33551918494e9026941fd915682.tar.gz perlweeklychallenge-club-f5fd5b95a4dce33551918494e9026941fd915682.tar.bz2 perlweeklychallenge-club-f5fd5b95a4dce33551918494e9026941fd915682.zip | |
Solutions for challenge #179
| -rwxr-xr-x | challenge-179/roger-bell-west/javascript/ch-2.js | 35 | ||||
| -rw-r--r-- | challenge-179/roger-bell-west/kotlin/ch-2.kt | 34 | ||||
| -rwxr-xr-x | challenge-179/roger-bell-west/lua/ch-2.lua | 35 | ||||
| -rwxr-xr-x | challenge-179/roger-bell-west/perl/ch-1.pl | 13 | ||||
| -rwxr-xr-x | challenge-179/roger-bell-west/perl/ch-2.pl | 26 | ||||
| -rw-r--r-- | challenge-179/roger-bell-west/postscript/ch-2.ps | 56 | ||||
| -rwxr-xr-x | challenge-179/roger-bell-west/python/ch-2.py | 23 | ||||
| -rwxr-xr-x | challenge-179/roger-bell-west/raku/ch-1.p6 | 11 | ||||
| -rwxr-xr-x | challenge-179/roger-bell-west/raku/ch-2.p6 | 21 | ||||
| -rwxr-xr-x | challenge-179/roger-bell-west/ruby/ch-2.rb | 31 | ||||
| -rwxr-xr-x | challenge-179/roger-bell-west/rust/ch-2.rs | 32 |
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 +} |
