aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-007/laurent-rosenfeld/blog.txt1
-rw-r--r--challenge-007/laurent-rosenfeld/perl5/ch-1.sh1
-rw-r--r--challenge-007/laurent-rosenfeld/perl5/ch-1a.pl11
-rw-r--r--challenge-007/laurent-rosenfeld/perl5/ch-2.pl19
-rw-r--r--challenge-007/laurent-rosenfeld/perl5/ch-2a.pl86
-rw-r--r--challenge-007/laurent-rosenfeld/perl6/ch-1.sh1
-rw-r--r--challenge-007/laurent-rosenfeld/perl6/ch-1a.sh1
-rw-r--r--challenge-007/laurent-rosenfeld/perl6/ch-1b.p67
-rw-r--r--challenge-007/laurent-rosenfeld/perl6/ch-2.p667
-rw-r--r--challenge-007/laurent-rosenfeld/perl6/lib/Store.pm618
-rw-r--r--challenge-007/laurent-rosenfeld/perl6/word_store_46
-rw-r--r--stats/pwc-current.json159
-rw-r--r--stats/pwc-language-breakdown.json90
-rw-r--r--stats/pwc-leaders.json776
-rw-r--r--stats/pwc-summary-1-30.json58
-rw-r--r--stats/pwc-summary-31-60.json46
-rw-r--r--stats/pwc-summary-61-90.json76
-rw-r--r--stats/pwc-summary.json198
18 files changed, 929 insertions, 692 deletions
diff --git a/challenge-007/laurent-rosenfeld/blog.txt b/challenge-007/laurent-rosenfeld/blog.txt
new file mode 100644
index 0000000000..1594312528
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/blog.txt
@@ -0,0 +1 @@
+http://blogs.perl.org/users/laurent_r/2019/05/perl-weekly-challenge-7-niven-numbers-and-word-ladders.html
diff --git a/challenge-007/laurent-rosenfeld/perl5/ch-1.sh b/challenge-007/laurent-rosenfeld/perl5/ch-1.sh
new file mode 100644
index 0000000000..20e97ea5ba
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/perl5/ch-1.sh
@@ -0,0 +1 @@
+perl -E 'for my $num(1..50) { my $sum = 0; $sum += $_ for (split //, $num); say $num if $num % $sum == 0;}'
diff --git a/challenge-007/laurent-rosenfeld/perl5/ch-1a.pl b/challenge-007/laurent-rosenfeld/perl5/ch-1a.pl
new file mode 100644
index 0000000000..90a9fb4904
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/perl5/ch-1a.pl
@@ -0,0 +1,11 @@
+use strict;
+use warnings;
+use feature qw/say/;
+
+for my $num(1..50) {
+ my $sum = 0;
+ for (split //, $num) {
+ $sum += $_;
+ }
+ say $num if $num % $sum == 0;
+}
diff --git a/challenge-007/laurent-rosenfeld/perl5/ch-2.pl b/challenge-007/laurent-rosenfeld/perl5/ch-2.pl
new file mode 100644
index 0000000000..ddc3c1b082
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/perl5/ch-2.pl
@@ -0,0 +1,19 @@
+use strict;
+use warnings;
+use feature qw/say/;
+sub edit_distance {
+ my ($word1, $word2) = @_;
+ die "Words $word1 and $word2 have different lengths\n" unless length $word1 == length $word2;
+ my @w1 = split //, $word1;
+ my @w2 = split //, $word2;
+ my $dist = 0;
+ for my $i (0..$#w1) {
+ $dist++ if $w1[$i] ne $w2[$i];
+ }
+ return $dist;
+}
+for my $word_pair_ref (["cold", "cord"], ["cord", "core"], ["cord", "cord"],
+ ["cold", "warm"], ["kitten", "sittin"], ["kitten", "sitting"]) {
+ my ($w1, $w2) = @$word_pair_ref;
+ say "Distance between $w1 and $w2 is: \t", edit_distance ($w1, $w2);
+}
diff --git a/challenge-007/laurent-rosenfeld/perl5/ch-2a.pl b/challenge-007/laurent-rosenfeld/perl5/ch-2a.pl
new file mode 100644
index 0000000000..ec41946a3a
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/perl5/ch-2a.pl
@@ -0,0 +1,86 @@
+use strict;
+use warnings;
+use feature qw/say/;
+use Storable;
+use Data::Dumper;
+
+die "Please pass two words as parameters" unless @ARGV == 2;
+my ($word1, $word2)= @ARGV;
+my $length = length $word1;
+die "The two words must have the same length\n" if $length != length $word2;
+
+my $store_file = "word_store_$length";
+my ($store_ref, %words);
+if (-e $store_file) {
+ my $store_ref = retrieve($store_file);
+ %words = %$store_ref;
+} else {
+ my $file = "words$length.txt";
+ open my $IN, '<', $file or die "Cannot open $file$!";
+ while (my $word = <$IN>) {
+ chomp $word;
+ $words{$word} = [];
+ for my $key (keys %words) {
+ if (edit_distance($key, $word) == 1) {
+ push @{$words{$key}}, $word;
+ push @{$words{$word}}, $key;
+ }
+ }
+ }
+ close $IN;
+ my $orphans = "aloof_$length.txt";
+ open my $OUT, ">", $orphans or die "Cannot open file $orphans$!";
+ for my $key (keys %words){
+ if (scalar keys $words{$key} == 0) {
+ say $OUT "$key";
+ delete $words{$key};
+ }
+ }
+ close $OUT;
+ store \%words, $store_file;
+}
+
+my $max = $le ngth * 2;
+
+sub edit_distance {
+ my ($word1, $word2) = @_;
+ # die "Words $word1 and $word2 ..." -> No longer needed as this is checked before
+ my @w1 = split //, $word1;
+ my @w2 = split //, $word2;
+ my $dist = 0;
+ for my $i (0..$#w1) {
+ $dist++ if $w1[$i] ne $w2[$i];
+ }
+ return $dist;
+}
+
+sub ladder {
+ my ($word1, $word2, $tmp_result) = @_;
+ return $tmp_result if $word1 eq $word2;
+ return [] if scalar @$tmp_result >= $max;
+ my @temp_solutions;
+ for my $word (@{$words{$word1}}) {
+ next if $word eq $word1;
+ next if grep { $_ eq $word } @$tmp_result; # not really needed but a bit faster
+ push @temp_solutions, [@$tmp_result, $word] and last if $word eq $word2;
+ my $new_tmp = ladder($word, $word2, [@$tmp_result, $word]);
+ next if scalar @$new_tmp == scalar @$tmp_result;
+ next unless scalar @$new_tmp;
+ push @temp_solutions, $new_tmp;
+ }
+ return [] unless @temp_solutions;
+ my $best_sol = (sort { scalar @$a <=> scalar @$b } @temp_solutions)[0];
+ $max = scalar @$best_sol if scalar @$best_sol < $max;
+ return $best_sol;
+}
+
+for ($word1, $word2) {
+ die "Word $_ not found\n" unless exists $words{$_};
+}
+my $ladder = ladder $word1, $word2, [$word1];
+
+if (@$ladder) {
+ say join "->", @$ladder;
+} else {
+ say "No ladder found for $word1 and $word2"
+}
diff --git a/challenge-007/laurent-rosenfeld/perl6/ch-1.sh b/challenge-007/laurent-rosenfeld/perl6/ch-1.sh
new file mode 100644
index 0000000000..436dd11dc0
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/perl6/ch-1.sh
@@ -0,0 +1 @@
+perl6 -e 'for 1..50 -> $num { my $sum = [+] $num.comb; say $num if $num %% $sum}'
diff --git a/challenge-007/laurent-rosenfeld/perl6/ch-1a.sh b/challenge-007/laurent-rosenfeld/perl6/ch-1a.sh
new file mode 100644
index 0000000000..8469829fcf
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/perl6/ch-1a.sh
@@ -0,0 +1 @@
+perl6 -e '.say if $_ %% [+] $_.comb for 1..50'
diff --git a/challenge-007/laurent-rosenfeld/perl6/ch-1b.p6 b/challenge-007/laurent-rosenfeld/perl6/ch-1b.p6
new file mode 100644
index 0000000000..a8be63bf49
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/perl6/ch-1b.p6
@@ -0,0 +1,7 @@
+use v6;
+.say for gather {
+ for 1..50 -> $num {
+ my $sum = [+] $num.comb;
+ take $num if $num %% $sum
+ }
+}
diff --git a/challenge-007/laurent-rosenfeld/perl6/ch-2.p6 b/challenge-007/laurent-rosenfeld/perl6/ch-2.p6
new file mode 100644
index 0000000000..a2f501e2d8
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/perl6/ch-2.p6
@@ -0,0 +1,67 @@
+#!/usr/bin/env perl6
+
+use v6;
+use lib 'lib';
+use Store;
+
+die "Please pass two words as parameters" unless @*ARGS == 2;
+my ($word1, $word2)= @*ARGS;
+my $length = $word1.chars;
+die "The two words must have the same length\n" if $length != $word2.chars;
+
+my $max = 2 * $length;
+my $store-file = "word_store_$length";
+my ($stored, %words);
+if ($store-file.IO.e) {
+ retrieve %words, $store-file;
+} else {
+ for "words$length.txt".IO.lines -> $word {
+ %words{$word} = [];
+ for keys %words -> $key {
+ if (edit-distance($key, $word) == 1) {
+ push @(%words{$key}), $word;
+ push @(%words{$word}), $key;
+ }
+ }
+ }
+ %words = grep { $_.value.elems > 0 }, %words.pairs;
+ store %words, $store-file;
+}
+
+sub edit-distance (Str $word1, Str $word2) {
+ my @w1 = $word1.comb;
+ my @w2 = $word2.comb;
+ my $dist = 0;
+ $dist++ if @w1[$_] ne @w2[$_] for (0..@w1.end) ;
+ return $dist;
+}
+
+sub ladder (Str $word1, Str $word2, $tmp-result) {
+ return $tmp-result if ($word1 eq $word2);
+ return [] if @$tmp-result.elems >= $max;
+ my @temp-solutions;
+ for @(%words{$word1}) -> $word {
+ next if $word eq $word1;
+ next if grep { $_ eq $word }, @$tmp-result;
+ push @temp-solutions, [|@$tmp-result, $word] and last if $word eq $word2;
+ my $new_tmp = ladder($word, $word2, [|@$tmp-result, $word]);
+ next if @$new_tmp.elems == @$tmp-result.elems;
+ next unless @$new_tmp.elems;
+ push @temp-solutions, $new_tmp;
+ }
+ return [] if @temp-solutions.elems == 0;
+ my $best_sol = (sort { $_.elems }, @temp-solutions)[0];
+ $max = @$best_sol.elems if @$best_sol.elems < $max;
+ return $best_sol;
+}
+
+for ($word1, $word2) {
+ die "Word $_ not found\n" unless %words{$_} :exists;
+}
+my $ladder = ladder $word1, $word2, [$word1];
+
+if (@$ladder) {
+ say join "->", @$ladder;
+} else {
+ say "No ladder found for $word1 and $word2"
+}
diff --git a/challenge-007/laurent-rosenfeld/perl6/lib/Store.pm6 b/challenge-007/laurent-rosenfeld/perl6/lib/Store.pm6
new file mode 100644
index 0000000000..83bd1313bd
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/perl6/lib/Store.pm6
@@ -0,0 +1,18 @@
+unit package Store;
+
+sub store (%hash, $file) is export {
+ # stores a hash or array as lines containing key et values
+ # such as: key | val1 val2 val3
+ my $out;
+ for %hash.kv -> $key, $val {
+ $out ~= "$key | $val \n";
+ }
+ spurt $file, $out;
+}
+sub retrieve (%hash, $file) is export {
+ # populates a hash of arrays with stored data
+ for $file.IO.lines -> $line {
+ my ($key, $val) = split /\s?\|\s?/, $line;
+ %hash{$key} = $val.words;
+ }
+}
diff --git a/challenge-007/laurent-rosenfeld/perl6/word_store_4 b/challenge-007/laurent-rosenfeld/perl6/word_store_4
new file mode 100644
index 0000000000..990c2ea31d
--- /dev/null
+++ b/challenge-007/laurent-rosenfeld/perl6/word_store_4
@@ -0,0 +1,6 @@
+yawl | bawl pawl wawl yawn yawp yaws yowl
+pled | fled bled pied plea peed gled pleb plod sled
+pita | dita pima pica pika pina pith pits pity vita
+keir | heir weir
+quag | quad quai quay
+frug | frig frog frag drug
diff --git a/stats/pwc-current.json b/stats/pwc-current.json
index 4e4c94f658..cac02451b0 100644
--- a/stats/pwc-current.json
+++ b/stats/pwc-current.json
@@ -1,54 +1,49 @@
{
"subtitle" : {
- "text" : "[Champions: 13] Last updated at 2019-05-12 11:35:27 GMT"
+ "text" : "[Champions: 14] Last updated at 2019-05-12 14:19:44 GMT"
},
- "legend" : {
- "enabled" : 0
- },
- "plotOptions" : {
- "series" : {
- "dataLabels" : {
- "format" : "{point.y}",
- "enabled" : 1
- },
- "borderWidth" : 0
- }
- },
- "chart" : {
- "type" : "column"
+ "tooltip" : {
+ "followPointer" : 1,
+ "pointerFormat" : "<span style='color:{point.color}'>{point.name}</span>: <b>{point.y:f}</b><br/>",
+ "headerFormat" : "<span style='font-size:11px'>{series.name}</span><br/>"
},
"yAxis" : {
"title" : {
"text" : "Total Solutions"
}
},
+ "xAxis" : {
+ "type" : "category"
+ },
"series" : [
{
+ "colorByPoint" : 1,
+ "name" : "Champions",
"data" : [
{
- "name" : "Alicia Bielsa",
"y" : 1,
+ "name" : "Alicia Bielsa",
"drilldown" : "Alicia Bielsa"
},
{
- "name" : "Andrezgz",
"drilldown" : "Andrezgz",
- "y" : 1
+ "y" : 1,
+ "name" : "Andrezgz"
},
{
+ "y" : 2,
"name" : "Athanasius",
- "drilldown" : "Athanasius",
- "y" : 2
+ "drilldown" : "Athanasius"
},
{
"y" : 2,
- "drilldown" : "Dave Jacoby",
- "name" : "Dave Jacoby"
+ "name" : "Dave Jacoby",
+ "drilldown" : "Dave Jacoby"
},
{
+ "y" : 2,
"name" : "Finley",
- "drilldown" : "Finley",
- "y" : 2
+ "drilldown" : "Finley"
},
{
"drilldown" : "Francis Whittle",
@@ -56,64 +51,62 @@
"name" : "Francis Whittle"
},
{
- "y" : 2,
"drilldown" : "Gustavo Chaves",
- "name" : "Gustavo Chaves"
+ "name" : "Gustavo Chaves",
+ "y" : 2
},
{
- "y" : 2,
"drilldown" : "Jo Christian Oterhals",
+ "y" : 2,
"name" : "Jo Christian Oterhals"
},
{
+ "drilldown" : "Joelle Maslak",
"name" : "Joelle Maslak",
+ "y" : 4
+ },
+ {
"y" : 4,
- "drilldown" : "Joelle Maslak"
+ "name" : "Laurent Rosenfeld",
+ "drilldown" : "Laurent Rosenfeld"
},
{
- "y" : 2,
"drilldown" : "Maxim Nechaev",
+ "y" : 2,
"name" : "Maxim Nechaev"
},
{
- "drilldown" : "Ozzy",
"y" : 1,
- "name" : "Ozzy"
+ "name" : "Ozzy",
+ "drilldown" : "Ozzy"
},
{
- "name" : "Ruben Westerberg",
+ "drilldown" : "Ruben Westerberg",
"y" : 4,
- "drilldown" : "Ruben Westerberg"
+ "name" : "Ruben Westerberg"
},
{
"drilldown" : "Simon Proctor",
- "y" : 1,
- "name" : "Simon Proctor"
+ "name" : "Simon Proctor",
+ "y" : 1
}
- ],
- "colorByPoint" : 1,
- "name" : "Champions"
+ ]
}
],
- "xAxis" : {
- "type" : "category"
- },
- "tooltip" : {
- "headerFormat" : "<span style='font-size:11px'>{series.name}</span><br/>",
- "pointerFormat" : "<span style='color:{point.color}'>{point.name}</span>: <b>{point.y:f}</b><br/>",
- "followPointer" : 1
+ "legend" : {
+ "enabled" : 0
},
"drilldown" : {
"series" : [
{
+ "id" : "Alicia Bielsa",
"name" : "Alicia Bielsa",
"data" : [
[
"Perl 5",
1
]
- ],
- "id" : "Alicia Bielsa"
+ ]
},
{
"name" : "Andrezgz",
@@ -127,13 +120,13 @@
},
{
"id" : "Athanasius",
+ "name" : "Athanasius",
"data" : [
[
"Perl 5",
2
]
- ],
- "name" : "Athanasius"
+ ]
},
{
"name" : "Dave Jacoby",
@@ -146,47 +139,48 @@
]
},
{
+ "name" : "Finley",
+ "id" : "Finley",
"data" : [
[
"Perl 6",
2
]
- ],
- "id" : "Finley",
- "name" : "Finley"
+ ]
},
{
+ "id" : "Francis Whittle",
+ "name" : "Francis Whittle",
"data" : [
[
"Perl 6",
2
]
- ],
- "id" : "Francis Whittle",
- "name" : "Francis Whittle"
+ ]
},
{
- "name" : "Gustavo Chaves",
"data" : [
[
"Perl 5",
2
]
],
+ "name" : "Gustavo Chaves",
"id" : "Gustavo Chaves"
},
{
+ "name" : "Jo Christian Oterhals",
+ "id" : "Jo Christian Oterhals",
"data" : [
[
"Perl 6",
2
]
- ],
- "id" : "Jo Christian Oterhals",
- "name" : "Jo Christian Oterhals"
+ ]
},
{
"id" : "Joelle Maslak",
+ "name" : "Joelle Maslak",
"data" : [
[
"Perl 5",
@@ -196,31 +190,43 @@
"Perl 6",
2
]
- ],
- "name" : "Joelle Maslak"
+ ]
+ },
+ {
+ "name" : "Laurent Rosenfeld",
+ "id" : "Laurent Rosenfeld",
+ "data" : [
+ [
+ "Perl 5",
+ 2
+ ],
+ [
+ "Perl 6",
+ 2
+ ]
+ ]
},
{
- "id" : "Maxim Nechaev",
"data" : [
[
"Perl 5",
2
]
],
- "name" : "Maxim Nechaev"
+ "name" : "Maxim Nechaev",
+ "id" : "Maxim Nechaev"
},
{
- "id" : "Ozzy",
"data" : [
[
"Perl 6",
1
]
],
- "name" : "Ozzy"
+ "name" : "Ozzy",
+ "id" : "Ozzy"
},
{
- "name" : "Ruben Westerberg",
"data" : [
[
"Perl 5",
@@ -231,21 +237,34 @@
2
]
],
- "id" : "Ruben Westerberg"
+ "id" : "Ruben Westerberg",
+ "name" : "Ruben Westerberg"
},
{
- "name" : "Simon Proctor",
- "id" : "Simon Proctor",
"data" : [
[
"Perl 6",
1
]
- ]
+ ],
+ "id" : "Simon Proctor",
+ "name" : "Simon Proctor"
}
]
},
+ "plotOptions" : {
+ "series" : {
+ "dataLabels" : {
+ "format" : "{point.y}",
+ "enabled" : 1
+ },
+ "borderWidth" : 0
+ }
+ },
"title" : {
"text" : "Perl Weekly Challenge - 007"
+ },
+ "chart" : {
+ "type" : "column"
}
}
diff --git a/stats/pwc-language-breakdown.json b/stats/pwc-language-breakdown.json
index 4a074170ce..7b32920482 100644
--- a/stats/pwc-language-breakdown.json
+++ b/stats/pwc-language-breakdown.json
@@ -1,6 +1,6 @@
{
- "title" : {
- "text" : "Perl Weekly Challenge Language"
+ "chart" : {
+ "type" : "column"
},
"series" : [
{
@@ -12,55 +12,70 @@
},
{
"y" : 95,
- "name" : "#002 [P5=63 P6=32]",
- "drilldown" : "002"
+ "drilldown" : "002",
+ "name" : "#002 [P5=63 P6=32]"
},
{
"y" : 58,
- "name" : "#003 [P5=32 P6=26]",
- "drilldown" : "003"
+ "drilldown" : "003",
+ "name" : "#003 [P5=32 P6=26]"
},
{
- "drilldown" : "004",
"y" : 75,
+ "drilldown" : "004",
"name" : "#004 [P5=46 P6=29]"
},
{
- "drilldown" : "005",
"name" : "#005 [P5=33 P6=22]",
- "y" : 55
+ "y" : 55,
+ "drilldown" : "005"
},
{
+ "drilldown" : "006",
"y" : 41,
- "name" : "#006 [P5=27 P6=14]",
- "drilldown" : "006"
+ "name" : "#006 [P5=27 P6=14]"
},
{
+ "name" : "#007 [P5=16 P6=14]",
"drilldown" : "007",
- "name" : "#007 [P5=14 P6=12]",
- "y" : 26
+ "y" : 30
}
],
"name" : "Perl Weekly Challenge Languages",
"colorByPoint" : "true"
}
],
+ "yAxis" : {
+ "title" : {
+ "text" : "Total Solutions"
+ }
+ },
+ "xAxis" : {
+ "type" : "category"
+ },
+ "title" : {
+ "text" : "Perl Weekly Challenge Language"
+ },
+ "subtitle" : {
+ "text" : "Click the columns to drilldown the language breakdown. Last updated at 2019-05-12 14:20:10 GMT"
+ },
"plotOptions" : {
"series" : {
- "borderWidth" : 0,
"dataLabels" : {
"format" : "{point.y}",
"enabled" : 1
- }
+ },
+ "borderWidth" : 0
}
},
- "subtitle" : {
- "text" : "Click the columns to drilldown the language breakdown. Last updated at 2019-05-12 11:35:33 GMT"
+ "tooltip" : {
+ "headerFormat" : "<span style=\"font-size:11px\"></span>",
+ "followPointer" : "true",
+ "pointFormat" : "<span style=\"color:{point.color}\">{point.name}</span>: <b>{point.y:f}</b><br/>"
},
"drilldown" : {
"series" : [
{
- "id" : "001",
"name" : "001",
"data" : [
[
@@ -71,9 +86,11 @@
"Perl 6",
37
]
- ]
+ ],
+ "id" : "001"
},
{
+ "id" : "002",
"data" : [
[
"Perl 5",
@@ -84,10 +101,11 @@
32
]
],
- "id" : "002",
"name" : "002"
},
{
+ "name" : "003",
+ "id" : "003",
"data" : [
[
"Perl 5",
@@ -97,9 +115,7 @@
"Perl 6",
26
]
- ],
- "id" : "003",
- "name" : "003"
+ ]
},
{
"data" : [
@@ -116,8 +132,6 @@
"name" : "004"
},
{
- "name" : "005",
- "id" : "005",
"data" : [
[
"Perl 5",
@@ -127,9 +141,12 @@
"Perl 6",
22
]
- ]
+ ],
+ "id" : "005",
+ "name" : "005"
},
{
+ "id" : "006",
"data" : [
[
"Perl 5",
@@ -140,7 +157,6 @@
14
]
],
- "id" : "006",
"name" : "006"
},
{
@@ -149,33 +165,17 @@
"data" : [
[
"Perl 5",
- 14
+ 16
],
[
"Perl 6",
- 12
+ 14
]
]
}
]
},
- "xAxis" : {
- "type" : "category"
- },
"legend" : {
"enabled" : "false"
- },
- "yAxis" : {
- "title" : {
- "text" : "Total Solutions"
- }
- },
- "tooltip" : {
- "followPointer" : "true",
- "pointFormat" : "<span style=\"color:{point.color}\">{point.name}</span>: <b>{point.y:f}</b><br/>",
- "headerFormat" : "<span style=\"font-size:11px\"></span>"
- },
- "chart" : {
- "type" : "column"
}
}
diff --git a/stats/pwc-leaders.json b/stats/pwc-leaders.json
index f66d39557b..be1bd3d418 100644
--- a/stats/pwc-leaders.json
+++ b/stats/pwc-leaders.json
@@ -1,90 +1,374 @@
{
+ "tooltip" : {
+ "pointFormat" : "<span style=\"color:{point.color}\">{point.name}</span>: <b>{point.y:f}</b><br/>",
+ "headerFormat" : "<span style=\"font-size:11px\"></span>",
+ "followPointer" : "true"
+ },
+ "title" : {
+ "text" : "Perl Weekly Challenge Leaders (TOP 50)"
+ },
+ "xAxis" : {
+ "type" : "category"
+ },
+ "plotOptions" : {
+ "series" : {
+ "borderWidth" : 0,
+ "dataLabels" : {
+ "enabled" : 1,
+ "format" : "{point.y}"
+ }
+ }
+ },
+ "chart" : {
+ "type" : "column"
+ },
+ "subtitle" : {
+ "text" : "Click the columns to drilldown the score breakdown. Last updated at 2019-05-12 14:19:55 GMT"
+ },
+ "series" : [
+ {
+ "name" : "Perl Weekly Challenge Leaders",
+ "colorByPoint" : "true",
+ "data" : [
+ {
+ "name" : "#1: Laurent Rosenfeld",
+ "drilldown" : "Laurent Rosenfeld",
+ "y" : 70
+ },
+ {
+ "y" : 58,
+ "name" : "#2: Joelle Maslak",
+ "drilldown" : "Joelle Maslak"
+ },
+ {
+ "y" : 48,
+ "name" : "#3: Jaldhar H. Vyas",
+ "drilldown" : "Jaldhar H. Vyas"
+ },
+ {
+ "name" : "#4: Ruben Westerberg",
+ "drilldown" : "Ruben Westerberg",
+ "y" : 48
+ },
+ {
+ "y" : 42,
+ "drilldown" : "Jo Christian Oterhals",
+ "name" : "#5: Jo Christian Oterhals"
+ },
+ {
+ "y" : 42,
+ "name" : "#6: Simon Proctor",
+ "drilldown" : "Simon Proctor"
+ },
+ {
+ "y" : 36,
+ "name" : "#7: Adam Russell",
+ "drilldown" : "Adam Russell"
+ },
+ {
+ "drilldown" : "Dr James A. Smith",
+ "name" : "#8: Dr James A. Smith",
+ "y" : 36
+ },
+ {
+ "drilldown" : "Kian-Meng Ang",
+ "name" : "#9: Kian-Meng Ang",
+ "y" : 32
+ },
+ {
+ "y" : 32,
+ "drilldown" : "Nick Logan",
+ "name" : "#10: Nick Logan"
+ },
+ {
+ "drilldown" : "Arne Sommer",
+ "name" : "#11: Arne Sommer",
+ "y" : 30
+ },
+ {
+ "y" : 30,
+ "drilldown" : "Gustavo Chaves",
+ "name" : "#12: Gustavo Chaves"
+ },
+ {
+ "drilldown" : "Athanasius",
+ "name" : "#13: Athanasius",
+ "y" : 28
+ },
+ {
+ "y" : 28,
+ "drilldown" : "Lars Balker",
+ "name" : "#14: Lars Balker"
+ },
+ {
+ "y" : 26,
+ "drilldown" : "Andrezgz",
+ "name" : "#15: Andrezgz"
+ },
+ {
+ "drilldown" : "Mark Senn",
+ "name" : "#16: Mark Senn",
+ "y" : 26
+ },
+ {
+ "y" : 22,
+ "name" : "#17: Francis Whittle",
+ "drilldown" : "Francis Whittle"
+ },
+ {
+ "y" : 20,
+ "name" : "#18: Doug Schrag",
+ "drilldown" : "Doug Schrag"
+ },
+ {
+ "name" : "#19: Duncan C. White",
+ "drilldown" : "Duncan C. White",
+ "y" : 20
+ },
+ {
+ "y" : 16,
+ "drilldown" : "Robert Gratza",
+ "name" : "#20: Robert Gratza"
+ },
+ {
+ "y" : 14,
+ "drilldown" : "Daniel Mantovani",
+ "name" : "#21: Daniel Mantovani"
+ },
+ {
+ "name" : "#22: Dave Jacoby",
+ "drilldown" : "Dave Jacoby",
+ "y" : 14
+ },
+ {
+ "drilldown" : "John Barrett",
+ "name" : "#23: John Barrett",
+ "y" : 14
+ },
+ {
+ "y" : 12,
+ "name" : "#24: E. Choroba",
+ "drilldown" : "E. Choroba"
+ },
+ {
+ "drilldown" : "Maxim Kolodyazhny",
+ "name" : "#25: Maxim Kolodyazhny",
+ "y" : 12
+ },
+ {
+ "name" : "#26: Ozzy",
+ "drilldown" : "Ozzy",
+ "y" : 12
+ },
+ {
+ "y" : 12,
+ "name" : "#27: Philippe Bruhat",
+ "drilldown" : "Philippe Bruhat"
+ },
+ {
+ "y" : 12,
+ "drilldown" : "Sergio Iglesias",
+ "name" : "#28: Sergio Iglesias"
+ },
+ {
+ "name" : "#29: Arpad Toth",
+ "drilldown" : "Arpad Toth",
+ "y" : 10
+ },
+ {
+ "y" : 10,
+ "name" : "#30: Khalid",
+ "drilldown" : "Khalid"
+ },
+ {
+ "name" : "#31: Steve Rogerson",
+ "drilldown" : "Steve Rogerson",
+ "y" : 10
+ },
+ {
+ "name" : "#32: Veesh Goldman",
+ "drilldown" : "Veesh Goldman",
+ "y" : 10
+ },
+ {
+ "drilldown" : "Alex Daniel",