aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Proctor <simon.proctor@gmail.com>2022-08-23 10:21:18 +0100
committerGitHub <noreply@github.com>2022-08-23 10:21:18 +0100
commit9f8b1ca2ec88433403eb5872887beed474e44ae9 (patch)
tree267d4f48457305a08bf484182fe6f7007a329058
parent641859edbaf5ff044113d719b48ea9775c9cc69e (diff)
parent6a2bfb87f57ececed07aaff17064d862f22b5ec1 (diff)
downloadperlweeklychallenge-club-9f8b1ca2ec88433403eb5872887beed474e44ae9.tar.gz
perlweeklychallenge-club-9f8b1ca2ec88433403eb5872887beed474e44ae9.tar.bz2
perlweeklychallenge-club-9f8b1ca2ec88433403eb5872887beed474e44ae9.zip
Merge branch 'manwar:master' into master
-rw-r--r--challenge-178/jaldhar-h-vyas/blog.txt1
-rwxr-xr-xchallenge-178/jaldhar-h-vyas/perl/ch-1.pl28
-rwxr-xr-xchallenge-178/jaldhar-h-vyas/perl/ch-2.pl60
-rwxr-xr-xchallenge-178/jaldhar-h-vyas/raku/ch-1.sh3
-rwxr-xr-xchallenge-178/jaldhar-h-vyas/raku/ch-2.raku56
-rwxr-xr-xchallenge-179/dario-mazzeo/perl/ch-1.pl52
-rwxr-xr-xchallenge-179/eric-cheung/python/ch-1.py6
-rwxr-xr-xchallenge-179/eric-cheung/python/ch-2.py29
-rw-r--r--challenge-179/luca-ferrari/blog-1.txt1
-rw-r--r--challenge-179/luca-ferrari/blog-2.txt1
-rw-r--r--challenge-179/luca-ferrari/blog-3.txt1
-rw-r--r--challenge-179/luca-ferrari/blog-4.txt1
-rw-r--r--challenge-179/luca-ferrari/blog-5.txt1
-rw-r--r--challenge-179/luca-ferrari/blog-6.txt1
-rw-r--r--challenge-179/luca-ferrari/postgresql/ch-1.plperl54
-rw-r--r--challenge-179/luca-ferrari/postgresql/ch-1.sql79
-rw-r--r--challenge-179/luca-ferrari/postgresql/ch-2.plperl28
-rw-r--r--challenge-179/luca-ferrari/postgresql/ch-2.sql57
-rwxr-xr-xchallenge-179/luca-ferrari/raku/ch-1.p632
-rwxr-xr-xchallenge-179/luca-ferrari/raku/ch-2.p610
-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
-rw-r--r--stats/pwc-challenge-178.json431
-rw-r--r--stats/pwc-current.json383
-rw-r--r--stats/pwc-language-breakdown-summary.json66
-rw-r--r--stats/pwc-language-breakdown.json1261
-rw-r--r--stats/pwc-leaders.json760
-rw-r--r--stats/pwc-summary-1-30.json100
-rw-r--r--stats/pwc-summary-121-150.json54
-rw-r--r--stats/pwc-summary-151-180.json48
-rw-r--r--stats/pwc-summary-181-210.json42
-rw-r--r--stats/pwc-summary-211-240.json112
-rw-r--r--stats/pwc-summary-241-270.json54
-rw-r--r--stats/pwc-summary-31-60.json30
-rw-r--r--stats/pwc-summary-61-90.json40
-rw-r--r--stats/pwc-summary-91-120.json98
-rw-r--r--stats/pwc-summary.json592
46 files changed, 2927 insertions, 1962 deletions
diff --git a/challenge-178/jaldhar-h-vyas/blog.txt b/challenge-178/jaldhar-h-vyas/blog.txt
new file mode 100644
index 0000000000..b71a1d2383
--- /dev/null
+++ b/challenge-178/jaldhar-h-vyas/blog.txt
@@ -0,0 +1 @@
+https://www.braincells.com/perl/2022/08/perl_weekly_challenge_week_178.html \ No newline at end of file
diff --git a/challenge-178/jaldhar-h-vyas/perl/ch-1.pl b/challenge-178/jaldhar-h-vyas/perl/ch-1.pl
new file mode 100755
index 0000000000..ef0f386183
--- /dev/null
+++ b/challenge-178/jaldhar-h-vyas/perl/ch-1.pl
@@ -0,0 +1,28 @@
+#!/usr/bin/perl
+use 5.030;
+use warnings;
+use Math::Prime::Util qw/ todigits /;
+use POSIX qw/ floor /;
+
+# based on http://www.rosettacode.org/wiki/Negative_base_numbers#Perl
+sub quaterImaginaryBase {
+ my($n) = @_;
+ my @result;
+ my $r = 0;
+
+ while ($n) {
+ $r = $n % -4;
+ $n = floor($n / -4);
+ if ($r < 0) {
+ $n++;
+ $r += 4;
+ }
+ push @result, todigits($r, 4) || 0;
+ }
+
+ return join '0', reverse @result;
+}
+
+my ($n) = shift // die "Need an integer\n";
+
+say quaterImaginaryBase($n); \ No newline at end of file
diff --git a/challenge-178/jaldhar-h-vyas/perl/ch-2.pl b/challenge-178/jaldhar-h-vyas/perl/ch-2.pl
new file mode 100755
index 0000000000..1007e7e389
--- /dev/null
+++ b/challenge-178/jaldhar-h-vyas/perl/ch-2.pl
@@ -0,0 +1,60 @@
+#!/usr/bin/perl
+use 5.030;
+use warnings;
+use DateTime;
+use English;
+
+sub nextBusinessDay {
+ my ($dt) = @_;
+ my $next = $dt->clone;
+ if ($dt->day_of_week == 5) {
+ $next->add(days => 3);
+ } elsif ($dt->day_of_week == 6) {
+ $next->add(days => 2);
+ } else {
+ $next->add(days => 1);
+ }
+
+ return $next->set(hour => 9, minute => 0)
+}
+
+sub usage() {
+ print<<"-USAGE-";
+Usage:
+ $PROGRAM_NAME <timestamp> <duration>
+
+ <timestamp> a datetime string in the format YYYY-MM-DD HH:MM
+ <duration> a duration as a decimal number of hours
+-USAGE-
+ exit 0;
+}
+
+if (scalar @ARGV != 2) {
+ usage;
+}
+
+my ($timestamp, $duration) = @ARGV;
+
+my ($year, $month, $day, $hour, $minute);
+if ($timestamp =~ / ^ (\d{4}) [-] (\d{2}) \- (\d{2}) [ ] (\d{2}) [:] (\d{2}) $/msx) {
+ ($year, $month, $day, $hour, $minute) = @{^CAPTURE};
+} else {
+ die "Bad timestamp format\n";
+}
+
+my $start = DateTime->new(
+ year => $year,
+ month => $month,
+ day => $day,
+ hour => $hour,
+ minute => $minute
+);
+
+my $endOfDay = $start->clone->set(hour => 18, minute => 0);
+my $endOfDuration = $start->clone->add(hours => $duration);
+if ($endOfDuration <= $endOfDay) {
+ say $endOfDuration->strftime('%F %H:%M');
+} else {
+ my $difference = $endOfDuration - $endOfDay;
+ say nextBusinessDay($start)->add($difference)->strftime('%F %H:%M');
+}
diff --git a/challenge-178/jaldhar-h-vyas/raku/ch-1.sh b/challenge-178/jaldhar-h-vyas/raku/ch-1.sh
new file mode 100755
index 0000000000..101ac3837b
--- /dev/null
+++ b/challenge-178/jaldhar-h-vyas/raku/ch-1.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+raku -MBase::Any -e 'to-base(@*ARGS[0].Int, 2i).say;' $@ \ No newline at end of file
diff --git a/challenge-178/jaldhar-h-vyas/raku/ch-2.raku b/challenge-178/jaldhar-h-vyas/raku/ch-2.raku
new file mode 100755
index 0000000000..d5a9bf5e8c
--- /dev/null
+++ b/challenge-178/jaldhar-h-vyas/raku/ch-2.raku
@@ -0,0 +1,56 @@
+#!/usr/bin/raku
+
+sub format($self) {
+ sprintf "%04d-%02d-%02d %02d:%02d", .year, .month, .day, .hour, .minute
+ given $self;
+}
+
+sub nextBusinessDay(DateTime $dt) {
+ my $next = DateTime.new(
+ date => $dt.Date,
+ hour => 9,
+ minute => 0,
+ formatter => &format
+ );
+
+ if ($dt.day-of-week == 5) {
+ $next = $next.later(days => 3);
+ } elsif ($dt.day-of-week == 6) {
+ $next = $next.later(days => 2);
+ } else {
+ $next = $next.later(days => 1);
+ }
+
+ return $next;
+}
+
+sub MAIN(
+ Str $timestamp, #= a datetime string in the format YYYY-MM-DD HH:MM
+ Real $duration #= a duration as a decimal number of hours
+) {
+ my ($year, $month, $day, $hour, $minute);
+
+ if $timestamp.match(/ ^ (\d ** 4) '-' (\d ** 2) '-' (\d ** 2) ' ' (\d ** 2) ':' (\d ** 2) $/) {
+ ($year, $month, $day, $hour, $minute) = $/.List;
+ } else {
+ die "Bad timestamp format";
+ }
+
+ my $start = DateTime.new(
+ year => $year,
+ month => $month,
+ day => $day,
+ hour => $hour,
+ minute => $minute,
+ formatter => &format
+ );
+
+ my $endOfDay = DateTime.new(date => $start.Date, hour => 18, minute => 0);
+ my $endOfDuration = $start.clone.later(seconds => 3_600 * $duration);
+ if $endOfDuration <= $endOfDay {
+ say $endOfDuration;
+ } else {
+ my $difference = $endOfDuration - $endOfDay;
+ say nextBusinessDay($start).later(seconds => $difference);
+ }
+} \ No newline at end of file
diff --git a/challenge-179/dario-mazzeo/perl/ch-1.pl b/challenge-179/dario-mazzeo/perl/ch-1.pl
new file mode 100755
index 0000000000..6a09035b3b
--- /dev/null
+++ b/challenge-179/dario-mazzeo/perl/ch-1.pl
@@ -0,0 +1,52 @@
+# THE WEEKLY CHALLENGE - 179
+# Task 1: Ordinal Number Spelling
+# Autore: Dario Mazzeo
+
+my $n=$ARGV[0];
+print NumeroInTesto($n);
+exit;
+
+
+sub NumeroInTesto{
+ my $n=$_[0];
+
+ if (length($n)==1){
+ if ($n==0){return "";}
+ elsif ($n==1){return "uno";}
+ elsif ($n==2){return "due";}
+ elsif ($n==3){return "tre";}
+ elsif ($n==4){return "quattro";}
+ elsif ($n==5){return "cinque";}
+ elsif ($n==6){return "sei";}
+ elsif ($n==7){return "sette";}
+ elsif ($n==8){return "otto";}
+ elsif ($n==9){return "nove";}
+ }
+ elsif (length($n)==2){
+ if ($n==10){return "dieci";}
+ elsif ($n==11){return "undici";}
+ elsif ($n==12){return "dodici";}
+ elsif ($n==13){return "tredici";}
+ elsif ($n==14){return "quattordici";}
+ elsif ($n==15){return "quindici";}
+ elsif ($n==16){return "sedici";}
+ elsif ($n==17){return "diciassette";}
+ elsif ($n==18){return "diciotto";}
+ elsif ($n==19){return "diciannove";}
+
+ my $n1=substr($n,0,1);
+ my $str="";
+ if ($n1==2){$str="venti";}
+ elsif ($n1==3){$str="trenta";}
+ elsif ($n1==4){$str="quaranta";}
+ elsif ($n1==5){$str="cinquanta";}
+ elsif ($n1==6){$str="sessanta";}
+ elsif ($n1==7){$str="settanta";}
+ elsif ($n1==8){$str="ottanta";}
+ elsif ($n1==9){$str="novanta";}
+
+ my $str=$str.(NumeroInTesto(substr($n,1,1)));
+ $str=~s/[ia]([uo])/$1/;
+ return $str;
+ }
+} \ No newline at end of file
diff --git a/challenge-179/eric-cheung/python/ch-1.py b/challenge-179/eric-cheung/python/ch-1.py
new file mode 100755
index 0000000000..6ab2c37ac5
--- /dev/null
+++ b/challenge-179/eric-cheung/python/ch-1.py
@@ -0,0 +1,6 @@
+
+from num2words import num2words
+
+print (num2words(11).replace("-", " "))
+print (num2words(62).replace("-", " "))
+print (num2words(99).replace("-", " "))
diff --git a/challenge-179/eric-cheung/python/ch-2.py b/challenge-179/eric-cheung/python/ch-2.py
new file mode 100755
index 0000000000..94c09ffbfd
--- /dev/null
+++ b/challenge-179/eric-cheung/python/ch-2.py
@@ -0,0 +1,29 @@
+## -*- coding: utf-8 -*-
+
+## Unicode: 9601, 9602, 9603, 9604, 9605, 9606, 9607, 9608
+bar = '▁▂▃▄▅▆▇█'
+barcount = len(bar)
+
+def sparkline(numbers):
+ mn, mx = min(numbers), max(numbers)
+ extent = mx - mn
+ sparkline = ''.join(bar[min([barcount - 1, int((n - mn) / extent * barcount)])] for n in numbers)
+ return mn, mx, sparkline
+
+
+if __name__ == '__main__':
+ import re
+
+ for line in ("0 0 1 1; 0 1 19 20; 0 999 4000 4999 7000 7999;"
+ "1 2 3 4 5 6 7 8 7 6 5 4 3 2 1;"
+ "1.5, 0.5 3.5, 2.5 5.5, 4.5 7.5, 6.5 ").split(';'):
+
+ print("\nNumbers:", line)
+
+ numbers = [float(n) for n in re.split(r'[\s,]+', line.strip())]
+
+ mn, mx, sp = sparkline(numbers)
+
+ print(' min: %5f; max: %5f' % (mn, mx))
+ print(" " + sp)
+
diff --git a/challenge-179/luca-ferrari/blog-1.txt b/challenge-179/luca-ferrari/blog-1.txt
new file mode 100644
index 0000000000..ece2925a72
--- /dev/null
+++ b/challenge-179/luca-ferrari/blog-1.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/08/22/PerlWeeklyChallenge179.html#task1
diff --git a/challenge-179/luca-ferrari/blog-2.txt b/challenge-179/luca-ferrari/blog-2.txt
new file mode 100644
index 0000000000..456d0905ff
--- /dev/null
+++ b/challenge-179/luca-ferrari/blog-2.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/08/22/PerlWeeklyChallenge179.html#task2
diff --git a/challenge-179/luca-ferrari/blog-3.txt b/challenge-179/luca-ferrari/blog-3.txt
new file mode 100644
index 0000000000..a20ed84896
--- /dev/null
+++ b/challenge-179/luca-ferrari/blog-3.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/08/22/PerlWeeklyChallenge179.html#task1plperl
diff --git a/challenge-179/luca-ferrari/blog-4.txt b/challenge-179/luca-ferrari/blog-4.txt
new file mode 100644
index 0000000000..30a4ecbc8d
--- /dev/null
+++ b/challenge-179/luca-ferrari/blog-4.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/08/22/PerlWeeklyChallenge179.html#task2plperl
diff --git a/challenge-179/luca-ferrari/blog-5.txt b/challenge-179/luca-ferrari/blog-5.txt
new file mode 100644
index 0000000000..75ef4f8453
--- /dev/null
+++ b/challenge-179/luca-ferrari/blog-5.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/08/22/PerlWeeklyChallenge179.html#task1plpgsql
diff --git a/challenge-179/luca-ferrari/blog-6.txt b/challenge-179/luca-ferrari/blog-6.txt
new file mode 100644
index 0000000000..7e8929e903
--- /dev/null
+++ b/challenge-179/luca-ferrari/blog-6.txt
@@ -0,0 +1 @@
+https://fluca1978.github.io/2022/08/22/PerlWeeklyChallenge179.html#task2plpgsql
diff --git a/challenge-179/luca-ferrari/postgresql/ch-1.plperl b/challenge-179/luca-ferrari/postgresql/ch-1.plperl
new file mode 100644
index 0000000000..f495dabed6
--- /dev/null
+++ b/challenge-179/luca-ferrari/postgresql/ch-1.plperl
@@ -0,0 +1,54 @@
+-- Perl Weekly Challenge 179
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc179;
+
+CREATE OR REPLACE FUNCTION
+pwc179.task1_plperl( int )
+RETURNS text
+AS $CODE$
+ my @units = qw/
+ first
+ second
+ third
+ foruth
+ fifth
+ sixth
+ seventh
+ eigth
+ nineth
+ tenth
+ /;
+
+ my @teens = qw /
+ eleven
+ twelve
+ thriteen
+ fourteen
+ fifteen
+ sixteen
+ seventeen
+ eigtheen
+ nineteen
+ /;
+ my @non_teens = qw/
+ twenty
+ thirty
+ fourty
+ fifty
+ sixty
+ seventy
+ eighty
+ ninety
+ /;
+
+ my ( $n ) = @_;
+ return 'Cannot spell' if ( $n >= 100 );
+ return $units[ $n - 1 ] if ( $n <= 10 );
+ return $teens[ ( $n - 1 ) % 10 ] if ( $n > 10 && $n < 20 );
+ return $non_teens[ ( $n / 10 ) - 2 ] if ( $n >= 20 && $n % 10 == 0 );
+ return $non_teens[ ( $n / 10 ) - 2 ] . $units[ ( $n % 10 ) - 1 ] if ( $n > 20 );
+
+
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-179/luca-ferrari/postgresql/ch-1.sql b/challenge-179/luca-ferrari/postgresql/ch-1.sql
new file mode 100644
index 0000000000..106916ec2c
--- /dev/null
+++ b/challenge-179/luca-ferrari/postgresql/ch-1.sql
@@ -0,0 +1,79 @@
+-- Perl Weekly Challenge 179
+-- Task 1
+
+CREATE SCHEMA IF NOT EXISTS pwc179;
+
+CREATE TABLE IF NOT EXISTS
+pwc179.number2words
+(
+ v int PRIMARY KEY
+ , t text
+);
+
+TRUNCATE pwc179.number2words;
+
+INSERT INTO pwc179.number2words
+VALUES
+ ( 1, 'first' )
+, ( 2, 'second' )
+, ( 3, 'third' )
+, ( 4, 'fourth' )
+, ( 5, 'fifth' )
+, ( 6, 'sixth' )
+, ( 7, 'seventh' )
+, ( 8, 'eigth' )
+, ( 9, 'nineth' )
+, ( 10, 'tenth' )
+, ( 11, 'eleventh' )
+, ( 12, 'twelveth' )
+, ( 13, 'thirteenth' )
+, ( 14, 'fourtineenth' )
+, ( 15, 'fifteenth' )
+, ( 16, 'sixteenth' )
+, ( 17, 'seventeenth' )
+, ( 18, 'eigthteenth' )
+, ( 19, 'nineteenth' )
+, ( 20, 'twentyth' )
+, ( 30, 'thirtyth' )
+, ( 40, 'fourtyth' )
+, ( 50, 'fiftyth' )
+, ( 60, 'sixtyth' )
+, ( 70, 'seventyth' )
+, ( 80, 'eightyth' )
+, ( 90, 'ninetyth' );
+
+
+CREATE OR REPLACE FUNCTION
+pwc179.task1_plpgsql( n int )
+RETURNS TEXT
+AS $CODE$
+
+DECLARE
+ w text;
+ s text;
+BEGIN
+ SELECT t
+ INTO w
+ FROM pwc179.number2words
+ WHERE v = n;
+
+ IF FOUND THEN
+ RETURN w;
+ ELSE
+ -- not found, compose the word
+ SELECT t
+ INTO w
+ FROM pwc179.number2words
+ WHERE v = ( n / 10 )::int;
+
+ SELECT t
+ INTO s
+ FROM pwc179.number2words
+ WHERE v = ( n % 10 )::int;
+
+ RETURN replace( w, 'th', 'ty') || s;
+ END IF;
+END
+
+$CODE$
+LANGUAGE plpgsql;
diff --git a/challenge-179/luca-ferrari/postgresql/ch-2.plperl b/challenge-179/luca-ferrari/postgresql/ch-2.plperl
new file mode 100644
index 0000000000..1a45a69416
--- /dev/null
+++ b/challenge-179/luca-ferrari/postgresql/ch-2.plperl
@@ -0,0 +1,28 @@
+-- Perl Weekly Challenge 179
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc179;
+
+CREATE OR REPLACE FUNCTION
+pwc179.task2_plperl( int[] )
+RETURNS text
+AS $CODE$
+
+ my ($n) = shift;
+ my @n;
+
+ my @symbols = map {chr($_)} (0x2581..0x2588);
+
+ my ($min, $max) = (-1,-1);
+
+ # compute min and max over the values
+ for my $current ( @$n ) {
+ $max = $current if ( $current > $max );
+ $min = $current if ( $min == -1 || $current < $min );
+ push @n, $current;
+ }
+
+ my @graph = map { ( $_ - $min ) / ( $max - $min ) * scalar( @$n ) } @$n;
+ return join( '', @symbols[ @graph ] );
+$CODE$
+LANGUAGE plperl;
diff --git a/challenge-179/luca-ferrari/postgresql/ch-2.sql b/challenge-179/luca-ferrari/postgresql/ch-2.sql
new file mode 100644
index 0000000000..10e3b13341
--- /dev/null
+++ b/challenge-179/luca-ferrari/postgresql/ch-2.sql
@@ -0,0 +1,57 @@
+-- Perl Weekly Challenge 179
+-- Task 2
+
+CREATE SCHEMA IF NOT EXISTS pwc179;
+
+CREATE TABLE IF NOT EXISTS pwc179.symbols
+(
+ v int PRIMARY KEY
+ , s text
+);
+
+TRUNCATE pwc179.symbols;
+
+INSERT INTO pwc179.symbols
+VALUES
+( 0, '▁')
+,(1, '▁')
+,(2,'▂')
+,(3, '▃')
+,(4, '▄')
+,(5, '▅')
+,(6, '▆')
+,(7,'▇')
+,(8, '█')
+,(9, '█');
+
+
+CREATE OR REPLACE FUNCTION
+pwc179.task2_plpgsql( n int[] )
+RETURNS text
+AS $CODE$
+DECLARE
+ c int;
+ t text;
+ tt text;
+ scale_max int;
+ scale_min int;
+ scale_count int;
+BEGIN
+ t := '';
+
+ SELECT min(v), max(v), count(v)
+ INTO scale_min, scale_max, scale_count
+ FROM pwc179.symbols;
+
+ FOREACH c IN ARRAY n LOOP
+ SELECT s
+ INTO tt
+ FROM pwc179.symbols
+ WHERE v = ( ( c - scale_min ) / ( scale_max - scale_min ) );
+ t := t || tt;
+ END LOOP;
+
+ RETURN t;
+END
+$CODE$
+LANGUAGE plpgsql;
diff --git a/challenge-179/luca-ferrari/raku/ch-1.p6 b/challenge-179/luca-ferrari/raku/ch-1.p6
new file mode 100755
index 0000000000..da58bbe2bb
--- /dev/null
+++ b/challenge-179/luca-ferrari/raku/ch-1.p6
@@ -0,0 +1,32 @@
+#!raku
+
+# Perl Weekly Challenge 179
+
+sub MAIN( Int $n where { 0 < $n < 100 } ) {
+
+ my @units = 'first',
+ 'second',
+ 'third',
+ 'foruth',
+ 'fifth',
+ 'sixth',
+ 'seventh',
+ 'eigth',
+ 'nineth',
+ 'tenth';
+
+ my @teens = 'eleven', 'twelve', 'thriteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen',
+ 'eigtheen', 'nineteen';
+ my @non-teens = 'twenty', 'thirty', 'fourty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety';
+
+ given ( $n ) {
+ when $_ <= 10 { @units[ $n - 1 ].say; }
+ when $_ < 20 { @teens[ ( $n - 1 ) % 10 ].say; }
+ when $_ >= 20 {
+ say @non-teens[ ( $n / 10 ).Int - 2 ]
+ ~ ( $n %% 10 ?? '' !! @units[ ( $n % 10 ) - 1 ] );
+ }
+ default { "Cannot spell $n".say; }
+ }
+
+}
diff --git a/challenge-179/luca-ferrari/raku/ch-2.p6 b/challenge-179/luca-ferrari/raku/ch-2.p6
new file mode 100755
index 0000000000..d6fc43fb4d
--- /dev/null
+++ b/challenge-179/luca-ferrari/raku/ch-2.p6
@@ -0,0 +1,10 @@
+#!raku
+
+# Perl Weekly Challenge 179
+
+sub MAIN( *@n where { @n.grep( * ~~ Int ).elems == @n.elems } ) {
+ my @symbols = '▁' ... '█';
+ my ($min, $max) = @n.min, @n.max;
+ my @graph = @n.map: { ( $_ - $min ) / ( $max - $min ) * @n.elems };
+ @symbols[ @graph ].join.say;
+}
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 = ""
+ fo