From 87756cf5bf5e6407df984b6d922058f62df8ea71 Mon Sep 17 00:00:00 2001 From: Scimon Date: Mon, 27 Sep 2021 14:03:32 +0100 Subject: Challenge 1 --- challenge-132/simon-proctor/raku/ch-1.raku | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 challenge-132/simon-proctor/raku/ch-1.raku diff --git a/challenge-132/simon-proctor/raku/ch-1.raku b/challenge-132/simon-proctor/raku/ch-1.raku new file mode 100644 index 0000000000..5d3ea423e1 --- /dev/null +++ b/challenge-132/simon-proctor/raku/ch-1.raku @@ -0,0 +1,9 @@ +#!/usr/bin/env raku + +#| Given a date string (yyyy-mm-dd format) returns mirror dates for you for today. +sub MAIN( Date(Str) $bday ) { + my $today = Date.today(); + my $diff = $today - $bday; + say $bday - $diff; + say $today + $diff; +} -- cgit From 4654113af779173d91d68a66b245b899325a3b05 Mon Sep 17 00:00:00 2001 From: Abigail Date: Mon, 27 Sep 2021 17:19:19 +0200 Subject: Tests for week 132, part 1 --- challenge-132/abigail/t/ctest.ini | 7 +++++++ challenge-132/abigail/t/input-1-1 | 3 +++ challenge-132/abigail/t/output-1-1.exp | 3 +++ 3 files changed, 13 insertions(+) create mode 100644 challenge-132/abigail/t/ctest.ini create mode 100644 challenge-132/abigail/t/input-1-1 create mode 100644 challenge-132/abigail/t/output-1-1.exp diff --git a/challenge-132/abigail/t/ctest.ini b/challenge-132/abigail/t/ctest.ini new file mode 100644 index 0000000000..d1a3f6baf6 --- /dev/null +++ b/challenge-132/abigail/t/ctest.ini @@ -0,0 +1,7 @@ +# +# Configuration file for running tests, using ctest. +# See https://github.com/Abigail/Misc/blob/master/ctest +# + +[names] +1-1 = Given Examples diff --git a/challenge-132/abigail/t/input-1-1 b/challenge-132/abigail/t/input-1-1 new file mode 100644 index 0000000000..ff1ed673f2 --- /dev/null +++ b/challenge-132/abigail/t/input-1-1 @@ -0,0 +1,3 @@ +2021/09/18 +1975/10/10 +1967/02/14 diff --git a/challenge-132/abigail/t/output-1-1.exp b/challenge-132/abigail/t/output-1-1.exp new file mode 100644 index 0000000000..79ae84b275 --- /dev/null +++ b/challenge-132/abigail/t/output-1-1.exp @@ -0,0 +1,3 @@ +2021/09/14, 2021/09/26 +1929/10/27, 2067/09/05 +1912/07/08, 2076/04/30 -- cgit From 6479fa6a6589e4576564ff0151e9ef9ccb02fe88 Mon Sep 17 00:00:00 2001 From: Dave Jacoby Date: Mon, 27 Sep 2021 18:26:17 -0400 Subject: Coded and Blogged --- challenge-132/dave-jacoby/blog.txt | 1 + challenge-132/dave-jacoby/perl/ch-1.pl | 67 ++++++++++++++++++++++++++++++++++ challenge-132/dave-jacoby/perl/ch-2.pl | 52 ++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 challenge-132/dave-jacoby/blog.txt create mode 100644 challenge-132/dave-jacoby/perl/ch-1.pl create mode 100644 challenge-132/dave-jacoby/perl/ch-2.pl diff --git a/challenge-132/dave-jacoby/blog.txt b/challenge-132/dave-jacoby/blog.txt new file mode 100644 index 0000000000..1b4bd1b6f8 --- /dev/null +++ b/challenge-132/dave-jacoby/blog.txt @@ -0,0 +1 @@ +https://jacoby.github.io/2021/09/27/dates-and-hashes-and-names-oh-my-the-weekly-challenge-132.html diff --git a/challenge-132/dave-jacoby/perl/ch-1.pl b/challenge-132/dave-jacoby/perl/ch-1.pl new file mode 100644 index 0000000000..7b45e60ded --- /dev/null +++ b/challenge-132/dave-jacoby/perl/ch-1.pl @@ -0,0 +1,67 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use feature qw{ say postderef signatures }; +no warnings qw{ experimental }; + +# Do Not Write Your Own Date and Time Manipulation Code! +# Do Not Write Your Own Date and Time Manipulation Code! +# Do Not Write Your Own Date and Time Manipulation Code! +# Do Not Write Your Own Date and Time Manipulation Code! +# Do Not Write Your Own Date and Time Manipulation Code! +use DateTime; + +my @examples; +push @examples, '2021/09/18'; +push @examples, '1975/10/10'; +push @examples, '1967/07/08'; +push @examples, '1970/01/01'; + +for my $input (@examples) { +my $output= mirror_dates($input); + say <<"END"; + Input: $input + Output: $output +END +} + +# takes the date as a string, in the ONE TRUE FORMAT: YYYY/MM/DD +# That makes the epoch 1970/01/01 +# The program CAN handle non-padded days and months, but when you're +# dealling with a LOT of dates, non-zero,padding makes you wonder if +# 1970123 is Jan 23 or Dec 3. +sub mirror_dates ( $date_str ) { + + # The default time zone for new DateTime objects, except where stated + # otherwise, is the "floating" time zone. This concept comes from the + # iCal standard. A floating datetime is one which is not anchored to + # any particular time zone. In addition, floating datetimes do not + # include leap seconds, since we cannot apply them without knowing the + # datetime's time zone. + my $now = DateTime->now()->set_time_zone('floating'); + + my ( $y, $m, $d ) = split m{/}, $date_str; + my $then = DateTime->new( + year => $y, + month => $m, + day => $d, + time_zone => 'floating' + ); + + # the time difference between now and then, expressed in days + my $diff = $now->delta_days($then)->in_units('days'); + + # add and subtract in a DateTime context act on the object, which + # isn't the result I would expect from $semi_numerical_thing->add(number) + # so we clone it and modify the clone. + # I mean, we COULD, but for testing, I was printing now and then as well + # as past and future, just to be sure I was right. + my $past = $then->clone; + $past->subtract( days => $diff ); + + my $future = $now->clone; + $future->add( days => $diff ); + + return join ', ', $future->ymd, $past->ymd; +} diff --git a/challenge-132/dave-jacoby/perl/ch-2.pl b/challenge-132/dave-jacoby/perl/ch-2.pl new file mode 100644 index 0000000000..c2e85ea059 --- /dev/null +++ b/challenge-132/dave-jacoby/perl/ch-2.pl @@ -0,0 +1,52 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use feature qw{ say postderef signatures }; +no warnings qw{ experimental }; + +my @player_ages = ( + [ 20, "Alex" ], + [ 28, "Joe" ], + [ 38, "Mike" ], + [ 18, "Alex" ], + [ 25, "David" ], + [ 18, "Simon" ], +); + +my @player_names = ( + [ "Alex", "Stewart" ], + [ "Joe", "Root" ], + [ "Mike", "Gatting" ], + [ "Joe", "Blog" ], + [ "Alex", "Jones" ], + [ "Simon", "Duane" ], +); + +say join "\n", hash_join( \@player_ages, \@player_names ); + +sub hash_join ( $array1, $array2 ) { + my @output; + my $hash = {}; + for my $e ( $array1->@* ) { + my ( $age, $firstname ) = $e->@*; + push $hash->{$firstname}->{age}->@*, $age; + } + for my $e ( $array2->@* ) { + my ( $firstname, $lastname ) = $e->@*; + push $hash->{$firstname}->{lastname}->@*, $lastname; + } + for my $firstname ( sort keys $hash->%* ) { + next unless defined $hash->{$firstname}{age}; + next unless defined $hash->{$firstname}{lastname}; + my @ages = $hash->{$firstname}{age}->@*; + my @lastnames = $hash->{$firstname}{lastname}->@*; + + for my $age ( reverse sort @ages ) { + for my $lastname ( reverse sort @lastnames ) { + push @output, join ",\t", ' ' . $age, $firstname, $lastname; + } + } + } + return join "\n", @output; +} -- cgit From 7c62a8745bee1afbc33b11ae40ca57b9b46c2f89 Mon Sep 17 00:00:00 2001 From: "E. Choroba" Date: Tue, 28 Sep 2021 22:01:39 +0200 Subject: Add solutions to 132: Mirror Dates & Hash Join by E. Choroba --- challenge-132/e-choroba/perl/ch-1.pl | 37 ++++++++++++++++++++++ challenge-132/e-choroba/perl/ch-2.pl | 61 ++++++++++++++++++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100755 challenge-132/e-choroba/perl/ch-1.pl create mode 100755 challenge-132/e-choroba/perl/ch-2.pl diff --git a/challenge-132/e-choroba/perl/ch-1.pl b/challenge-132/e-choroba/perl/ch-1.pl new file mode 100755 index 0000000000..6d3831dc9e --- /dev/null +++ b/challenge-132/e-choroba/perl/ch-1.pl @@ -0,0 +1,37 @@ +#!/usr/bin/perl +use warnings; +use strict; + +use Time::Piece; + +# This should return localtime, but in order to verify the examples, +# we need to set today to Wednesday September the 22nd. +sub today { + return 'Time::Piece'->strptime('2021/09/22', '%Y/%m/%d'); +} + +sub mirror_dates { + my ($birthdate) = @_; + my $birthday = 'Time::Piece'->strptime($birthdate, '%Y/%m/%d'); + my $today = today(); + my $age = $today - $birthday; + return [map $_->ymd('/'), + $birthday - $age, + $today + $age] +} + +use Test2::V0; +plan 3; + +is mirror_dates('2021/09/18'), + ['2021/09/14', '2021/09/26'], + 'Example 1'; + +is mirror_dates('1975/10/10'), + ['1929/10/27', '2067/09/05'], + 'Example 2'; + +is mirror_dates('1967/02/14'), + ['1912/07/08', '2076/04/30'], + 'Example 3'; + diff --git a/challenge-132/e-choroba/perl/ch-2.pl b/challenge-132/e-choroba/perl/ch-2.pl new file mode 100755 index 0000000000..bea7fb3bf1 --- /dev/null +++ b/challenge-132/e-choroba/perl/ch-2.pl @@ -0,0 +1,61 @@ +#!/usr/bin/perl +use warnings; +use strict; +use feature qw{ say }; + +my @player_ages = ( + [20, "Alex" ], + [28, "Joe" ], + [38, "Mike" ], + [18, "Alex" ], + [25, "David" ], + [18, "Simon" ], +); + +my @player_names = ( + ["Alex", "Stewart"], + ["Joe", "Root" ], + ["Mike", "Gatting"], + ["Joe", "Blog" ], + ["Alex", "Jones" ], + ["Simon","Duane" ], +); + +sub hash_join { + my ($build, $probe, $limit) = @_; + my @out; + my %hash; + my $size = 0; + my $out = sub { + for my $s (@$probe) { + push @out, [$_, $s->[0], $s->[1]] + for @{ $hash{ $s->[0] } // []}; + } + %hash = (); + $size = 0; + }; + for my $r (@$build) { + push @{ $hash{ $r->[1] } }, $r->[0]; + $out->() if ++$size >= $limit; + } + $out->(); + return \@out +} + +use Test2::V0; +plan 6; + +for my $limit (1 .. 6) { + is hash_join(\@player_ages, \@player_names, $limit), + bag { + item [20, "Alex", "Stewart"]; + item [20, "Alex", "Jones"]; + item [18, "Alex", "Stewart"]; + item [18, "Alex", "Jones"]; + item [28, "Joe", "Root"]; + item [28, "Joe", "Blog"]; + item [38, "Mike", "Gatting"]; + item [18, "Simon", "Duane"]; + end(); + }, "Limit $limit"; +} -- cgit From e7363605eaf7aa1a1bda729fa2310e3ca5ff2305 Mon Sep 17 00:00:00 2001 From: drbaggy Date: Tue, 28 Sep 2021 22:57:59 +0100 Subject: f --- challenge-132/james-smith/README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/challenge-132/james-smith/README.md b/challenge-132/james-smith/README.md index 6754349a4c..d4ea80638b 100644 --- a/challenge-132/james-smith/README.md +++ b/challenge-132/james-smith/README.md @@ -44,6 +44,19 @@ sub mirror_days { * Reset the hash table, and continue scanning the build input R * Do a final scan of the probe input S and add the resulting join tuples to the output relation +## Aside + +You may think that this looks an overly convoluted way to join two data-structures together. But there are times when this method is the +best possible one - from an efficiency point of view. + +If the two tables to be joined are not simple perl data structures but files with hundreds of millions of lines. Then this method makes a lot +more sense. You open the first file, and pull out a number of rows and store them in a keyed hash. You then loop through the other file +when you find a match (the key exists in the hash) you output the resultant rows.... You can continue taking chunks from the first file, and looping through the second. + +This method uses least memory - and is therefore much more efficient than trying to do everything in memory. + +*Not this algorithm - but joining two tables genetic variation, alternate names for the variations. We needed to join them together - the MySQL join just wasn't coming back at all (blowing up memory), instead +we dumped out the contens of each table - fortunately ordered by the same key, and walked down the two files joining the rows together, only ever 1 line of each file in memory at once!.* ## Solution -- cgit From 020bc05fdbfee23bf4a51ded58ae5fb320929bc3 Mon Sep 17 00:00:00 2001 From: Luis Mochan Date: Tue, 28 Sep 2021 20:06:48 -0500 Subject: Add solutions to PWC132 --- challenge-132/wlmb/blog.txt | 1 + challenge-132/wlmb/perl/ch-1.pl | 21 +++++++++++++++++++++ challenge-132/wlmb/perl/ch-2.pl | 23 +++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 challenge-132/wlmb/blog.txt create mode 100755 challenge-132/wlmb/perl/ch-1.pl create mode 100755 challenge-132/wlmb/perl/ch-2.pl diff --git a/challenge-132/wlmb/blog.txt b/challenge-132/wlmb/blog.txt new file mode 100644 index 0000000000..4b0b01dfb8 --- /dev/null +++ b/challenge-132/wlmb/blog.txt @@ -0,0 +1 @@ +https://wlmb.github.io/2021/09/28/PWC132/ diff --git a/challenge-132/wlmb/perl/ch-1.pl b/challenge-132/wlmb/perl/ch-1.pl new file mode 100755 index 0000000000..c6f11f61bd --- /dev/null +++ b/challenge-132/wlmb/perl/ch-1.pl @@ -0,0 +1,21 @@ +#!/usr/bin/env perl +# Perl weekly challenge 131 +# Task 1: Consecutive arrays +# +# See https://wlmb.github.io/2021/09/28/PWC132/#task-1-mirror-dates + +use v5.12; +use warnings; +use DateTime; +use DateTime::Format::DateParse; +my ($date_s, $current_s)=@ARGV; +my $date=DateTime::Format::DateParse->parse_datetime($date_s)->truncate(to=>'day'); +die "Wrong date: ", $date_s//"" unless defined $date; +my $current=DateTime::Format::DateParse->parse_datetime($current_s)->truncate(to=>'day'); +die "Wrong date: ", $current_s//"" if not defined $current and defined $current_s; +$current//=DateTime->today->truncate(to=>'day'); +my $difference=$current-$date; +my $previous=$date-$difference; +my $next=$current+$difference; +say sprintf "Input: %s, Current: %s\nOutput: %s, %s", + map {$_->ymd} ($date, $current, $previous, $next); diff --git a/challenge-132/wlmb/perl/ch-2.pl b/challenge-132/wlmb/perl/ch-2.pl new file mode 100755 index 0000000000..2e56377831 --- /dev/null +++ b/challenge-132/wlmb/perl/ch-2.pl @@ -0,0 +1,23 @@ +#!/usr/bin/env perl +# Perl weekly challenge 132 +# Task 2: Hash join +# +# See https://wlmb.github.io/2021/09/28/PWC132/#task-2-hash-join +use v5.24; # To use the funny syntax ->@* +use warnings; +use YAML::XS; + +my ($index_build, $index_probe)= map {shift} @ARGV; # indices for join comparison +$/=''; #slurp +my $input=Load(my $data=<>); # Parse input +my @build=$input->[0]->@*; # Array of build tuples +my @probe=$input->[1]->@*; # Array of probe tuples +my %build; # Build hash. Each entry is array of tuples. +# Build complete 'build' hash. I assume it fits in memory. +push $build{$_->[$index_build]}->@*, $_ foreach(@build); +foreach my $tuple(@probe){ # Iterate over probe tuples + my $key=splice @$tuple,$index_probe,1; # remove and assign key + # Array of all matching build tuples. Empty if none + my @matching=defined $build{$key}?$build{$key}->@*:(); # first parts of + say join ", ", $_->@*, @$tuple foreach @matching; # Join one build one probe tuple +} -- cgit From ea13d0f250000d70f987cec5e94c3c0e6fddce42 Mon Sep 17 00:00:00 2001 From: Tyler Wardhaugh Date: Wed, 29 Sep 2021 09:41:07 -0700 Subject: Ch132 (Clojure): prep for challenge --- challenge-132/tyler-wardhaugh/clojure/README.md | 14 ++++++-------- challenge-132/tyler-wardhaugh/clojure/pom.xml | 8 ++++---- .../tyler-wardhaugh/clojure/src/tw/weekly/c132/core.clj | 12 ++++++++++++ .../tyler-wardhaugh/clojure/src/tw/weekly/c132/t1.clj | 14 ++++++++++++++ .../tyler-wardhaugh/clojure/src/tw/weekly/c132/t2.clj | 14 ++++++++++++++ .../tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj | 12 ++++++++++++ 6 files changed, 62 insertions(+), 12 deletions(-) create mode 100644 challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/core.clj create mode 100644 challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t1.clj create mode 100644 challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t2.clj create mode 100644 challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj diff --git a/challenge-132/tyler-wardhaugh/clojure/README.md b/challenge-132/tyler-wardhaugh/clojure/README.md index 064e23e11f..74b8669aa3 100644 --- a/challenge-132/tyler-wardhaugh/clojure/README.md +++ b/challenge-132/tyler-wardhaugh/clojure/README.md @@ -1,7 +1,7 @@ -# tw.weekly.c130 +# tw.weekly.c132 -The Weekly Challenge - #130 - Tyler Wardhaugh +The Weekly Challenge - #132 - Tyler Wardhaugh ## Usage @@ -9,7 +9,7 @@ Clojure ([installation instructions](https://clojure.org/guides/getting_started# Run the project directly (shows default output from both tasks): - $ clojure -M -m tw.weekly.c130.core + $ clojure -M -m tw.weekly.c132.core # ... or ... $ bb run both @@ -21,15 +21,13 @@ Run the project's tests (which are samples from the task descriptions): Run Task #1 with input - $ clojure -M -m tw.weekly.c130.t1 N - # ... or ... - $ bb run task-1 N + $ clojure -M -m tw.weekly.c132.t1 D Run Task #2 with input: - $ clojure -M -m tw.weekly.c130.t2 D S + $ clojure -M -m tw.weekly.c132.t2 H1 H2 I1 I2 # ... or ... - $ bb run task-2 D S + $ bb run task-2 H1 H2 I1 I2 View available tasks Babashka can run: diff --git a/challenge-132/tyler-wardhaugh/clojure/pom.xml b/challenge-132/tyler-wardhaugh/clojure/pom.xml index b1039ce744..b3edb199c9 100644 --- a/challenge-132/tyler-wardhaugh/clojure/pom.xml +++ b/challenge-132/tyler-wardhaugh/clojure/pom.xml @@ -2,11 +2,11 @@ 4.0.0 tw.weekly - tw.weekly.c131 + tw.weekly.c132 0.1.0-SNAPSHOT - tw.weekly.c131 - Challenge #131 - https://github.com/tw.weekly/tw.weekly.c131 + tw.weekly.c132 + Challenge #132 + https://github.com/tw.weekly/tw.weekly.c132 Eclipse Public License diff --git a/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/core.clj b/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/core.clj new file mode 100644 index 0000000000..4115f99d9b --- /dev/null +++ b/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/core.clj @@ -0,0 +1,12 @@ +(ns tw.weekly.c132.core + (:require [tw.weekly.c132.t1 :as t1]) + (:require [tw.weekly.c132.t2 :as t2]) + (:gen-class)) + +(defn -main + "Run all tasks" + [& _] + (println "Task #1:") + (t1/-main) + (println "\nTask #2:") + (t2/-main)) diff --git a/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t1.clj b/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t1.clj new file mode 100644 index 0000000000..007e4b2067 --- /dev/null +++ b/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t1.clj @@ -0,0 +1,14 @@ +(ns tw.weekly.c132.t1 + (:require [clojure.edn :as edn])) + +;;; +; Task description for TASK #1 › Mirror Dates +;;; +(def DEFAULT-INPUT []) + +(defn -main + "Run Task 1 with a given input N, defaulting to the first example from the + task description." + [& args] + (let [[D] (or args DEFAULT-INPUT)] + )) diff --git a/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t2.clj b/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t2.clj new file mode 100644 index 0000000000..8d237772b6 --- /dev/null +++ b/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t2.clj @@ -0,0 +1,14 @@ +(ns tw.weekly.c132.t2 + (:require [clojure.edn :as :edn)) + +;;; +; Task description for TASK #2, Hash Join +;;; +(def DEFAULT-INPUT []) + +(defn -main + "Run Task 1 with a given input D and S, defaulting to the first example from + the task description." + [& args] + (let [[H1 H2] (or (some->> args (map edn/read-string)) DEFAULT-INPUT)] + )) diff --git a/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj b/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj new file mode 100644 index 0000000000..e4ff9454a9 --- /dev/null +++ b/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj @@ -0,0 +1,12 @@ +(ns tw.weekly.c132-test + (:require [clojure.test :refer [deftest is testing]] + #_[tw.weekly.c132.t1 :refer []] + #_[tw.weekly.c132.t2 :refer []])) + +(deftest task-1 + (testing "Task 1, Mirror Dates" + )) + +(deftest task-2 + (testing "Task 2, Hash Join" + )) -- cgit From 85dc157cc2972c8ca43e467cc825f818afa10326 Mon Sep 17 00:00:00 2001 From: Tyler Wardhaugh Date: Wed, 29 Sep 2021 09:41:07 -0700 Subject: Ch131 (Clojure): Task 1 --- challenge-132/tyler-wardhaugh/clojure/bb.edn | 4 ++- challenge-132/tyler-wardhaugh/clojure/deps.edn | 3 ++- challenge-132/tyler-wardhaugh/clojure/pom.xml | 5 ++++ .../clojure/src/tw/weekly/c132/t1.clj | 29 +++++++++++++++++++--- .../clojure/test/tw/weekly/c132_test.clj | 12 +++++++-- 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/challenge-132/tyler-wardhaugh/clojure/bb.edn b/challenge-132/tyler-wardhaugh/clojure/bb.edn index 4cd11817b8..a0e8b96a48 100644 --- a/challenge-132/tyler-wardhaugh/clojure/bb.edn +++ b/challenge-132/tyler-wardhaugh/clojure/bb.edn @@ -63,7 +63,9 @@ :task (run-task :t1 *command-line-args*)} task-1-bb {:doc "Run Task 1 (via Babashka)" - :task (run-task-bb :t1 *command-line-args*)} + :task (binding [*out* *err*] + (println "error: can't run Task 1 via Babashka because it depends on some incompatible libraries.") + (System/exit 1))} task-2 {:doc "Run Task 2 (via clojure)" :task (run-task :t2 *command-line-args*)} diff --git a/challenge-132/tyler-wardhaugh/clojure/deps.edn b/challenge-132/tyler-wardhaugh/clojure/deps.edn index 5b1400b27e..e821835450 100644 --- a/challenge-132/tyler-wardhaugh/clojure/deps.edn +++ b/challenge-132/tyler-wardhaugh/clojure/deps.edn @@ -1,5 +1,6 @@ {:paths ["src" "resources"] - :deps {org.clojure/clojure {:mvn/version "1.10.3"}} + :deps {org.clojure/clojure {:mvn/version "1.10.3"} + clojure.java-time/clojure.java-time {:mvn/version "0.3.3"}} :aliases {:test {:extra-paths ["test"] :extra-deps {org.clojure/test.check {:mvn/version "1.1.0"} diff --git a/challenge-132/tyler-wardhaugh/clojure/pom.xml b/challenge-132/tyler-wardhaugh/clojure/pom.xml index b3edb199c9..ca7a3f1f2a 100644 --- a/challenge-132/tyler-wardhaugh/clojure/pom.xml +++ b/challenge-132/tyler-wardhaugh/clojure/pom.xml @@ -24,6 +24,11 @@ clojure 1.10.3 + + clojure.java-time + clojure.java-time + 0.3.3 + src diff --git a/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t1.clj b/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t1.clj index 007e4b2067..b24255c143 100644 --- a/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t1.clj +++ b/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t1.clj @@ -1,14 +1,35 @@ (ns tw.weekly.c132.t1 - (:require [clojure.edn :as edn])) + (:require [java-time :as j] + [clojure.pprint :refer [cl-format]])) ;;; ; Task description for TASK #1 › Mirror Dates ;;; -(def DEFAULT-INPUT []) +(def DEFAULT-TODAY "2021/09/22") +(def DEFAULT-INPUT ["2021/09/18" DEFAULT-TODAY]) +(def DATE-FORMAT "yyyy/MM/dd") + +(defn parse-date + [s] + (j/local-date DATE-FORMAT s)) + +(defn format-date + [d] + (-> (j/formatter DATE-FORMAT) + (j/format d))) + +(defn mirror-date + [origin today] + (let [delta (j/time-between :days origin today) + before (j/minus origin (j/days delta)) + after (j/plus today (j/days delta))] + (list before after))) (defn -main "Run Task 1 with a given input N, defaulting to the first example from the task description." [& args] - (let [[D] (or args DEFAULT-INPUT)] - )) + (let [[origin today] (map parse-date (or args DEFAULT-INPUT))] + (->> (mirror-date origin today) + (map format-date) + (cl-format true "~{~a~^, ~}~%")))) diff --git a/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj b/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj index e4ff9454a9..6d2c5f2894 100644 --- a/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj +++ b/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj @@ -1,11 +1,19 @@ (ns tw.weekly.c132-test (:require [clojure.test :refer [deftest is testing]] - #_[tw.weekly.c132.t1 :refer []] + [tw.weekly.c132.t1 :as t1] #_[tw.weekly.c132.t2 :refer []])) +(def today (t1/parse-date t1/DEFAULT-TODAY)) + (deftest task-1 (testing "Task 1, Mirror Dates" - )) + (let [today (t1/parse-date t1/DEFAULT-TODAY)] + (is (= (map t1/parse-date ["2021/09/14" "2021/09/26"]) + (t1/mirror-date (t1/parse-date "2021/09/18") today))) + (is (= (map t1/parse-date ["1929/10/27" "2067/09/05"]) + (t1/mirror-date (t1/parse-date "1975/10/10") today))) + (is (= (map t1/parse-date ["1912/07/08" "2076/04/30"]) + (t1/mirror-date (t1/parse-date "1967/02/14") today)))))) (deftest task-2 (testing "Task 2, Hash Join" -- cgit From ea1fffc2c7a7762111128528607a2a8ffd9b42f3 Mon Sep 17 00:00:00 2001 From: Tyler Wardhaugh Date: Wed, 29 Sep 2021 09:41:07 -0700 Subject: Ch131 (Clojure): Task 2 --- .../clojure/src/tw/weekly/c132/t2.clj | 60 +++++++++++++++++++--- .../clojure/test/tw/weekly/c132_test.clj | 12 ++++- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t2.clj b/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t2.clj index 8d237772b6..0f0930b838 100644 --- a/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t2.clj +++ b/challenge-132/tyler-wardhaugh/clojure/src/tw/weekly/c132/t2.clj @@ -1,14 +1,62 @@ (ns tw.weekly.c132.t2 - (:require [clojure.edn :as :edn)) + (:require [clojure.edn :as edn] + [clojure.pprint :refer [cl-format]])) ;;; ; Task description for TASK #2, Hash Join ;;; -(def DEFAULT-INPUT []) +(def MAXSIZE "The maximum number of build relations to process at one time." 3) +(def DEFAULT-INPUT + [[[20, "Alex" ] + [28, "Joe" ] + [38, "Mike" ] + [18, "Alex" ] + [25, "David" ] + [18, "Simon" ]] + [["Alex", "Stewart"] + ["Joe", "Root" ] + ["Mike", "Gatting"] + ["Joe", "Blog" ] + ["Alex", "Jones" ] + ["Simon","Duane" ]] + 1 + 0]) + +(defn butnth + "Returns all values except the one at index." + [coll index] + (keep-indexed (fn [i v] (when (not= i index) v)) coll)) + +;;; Classic Hash Join +;; Algorithm description: +; https://en.wikipedia.org/wiki/Hash_join#Classic_hash_join +;; Notes: +; - We proactively batch the smaller relation (build) into MAXSIZE chunks to +; ensure it can fit into memory. +; - Order of output relation is not guaranteed. +;;; +(defn hash-join + [a b a-index b-index] + (let [[build build-index probe probe-index] + (if (<= (count a) (count b)) + [a a-index b b-index] + [b b-index a a-index])] + (-> (comp + (partition-all MAXSIZE) + (map (fn [batch] (group-by #(nth % build-index) batch))) + (mapcat + (fn [build-map] + (keep (fn [row] + (when-let [ks (build-map (nth row probe-index))] + (map #(concat % (butnth row probe-index)) ks))) + probe))) + cat) + (sequence build)))) (defn -main - "Run Task 1 with a given input D and S, defaulting to the first example from - the task description." + "Run Task 1 with a given input H1, H2, I1, and I2, defaulting to the first + example from the task description." [& args] - (let [[H1 H2] (or (some->> args (map edn/read-string)) DEFAULT-INPUT)] - )) + (let [[H1 H2 I1 I2] (or (some->> args (map edn/read-string)) DEFAULT-INPUT)] + (->> (hash-join H1 H2 I1 I2) + (cl-format true "~:{~a, ~s, ~s~%~}")))) diff --git a/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj b/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj index 6d2c5f2894..00edee2c66 100644 --- a/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj +++ b/challenge-132/tyler-wardhaugh/clojure/test/tw/weekly/c132_test.clj @@ -1,7 +1,7 @@ (ns tw.weekly.c132-test (:require [clojure.test :refer [deftest is testing]] [tw.weekly.c132.t1 :as t1] - #_[tw.weekly.c132.t2 :refer []])) + [tw.weekly.c132.t2 :as t2])) (def today (t1/parse-date t1/DEFAULT-TODAY)) @@ -17,4 +17,12 @@ (deftest task-2 (testing "Task 2, Hash Join" - )) + (is (= (set '((20 "Alex" "Stewart") + (18 "Alex" "Stewart") + (28 "Joe" "Root") + (38 "Mike" "Gatting") + (28 "Joe" "Blog") + (20 "Alex" "Jones") + (18 "Alex" "Jones") + (18 "Simon" "Duane"))) + (set (apply t2/hash-join t2/DEFAULT-INPUT)))))) -- cgit From a0d30eb80b9cf32ec78b75228cde145db2483770 Mon Sep 17 00:00:00 2001 From: Mohammad S Anwar Date: Wed, 29 Sep 2021 18:21:25 +0100 Subject: - Added solutions by Dave Jacoby. --- stats/pwc-current.json | 171 +++--- stats/pwc-language-breakdown-summary.json | 72 +-- stats/pwc-language-breakdown.json | 836 +++++++++++++++--------------- stats/pwc-leaders.json | 700 ++++++++++++------------- stats/pwc-summary-1-30.json | 54 +- stats/pwc-summary-121-150.json | 106 ++-- stats/pwc-summary-151-180.json | 100 ++-- stats/pwc-summary-181-210.json | 98 ++-- stats/pwc-summary-211-240.json | 98 ++-- stats/pwc-summary-31-60.json | 108 ++-- stats/pwc-summary-61-90.json | 32 +- stats/pwc-summary-91-120.json | 124 ++--- stats/pwc-summary.json | 42 +- 13 files changed, 1280 insertions(+), 1261 deletions(-) diff --git a/stats/pwc-current.json b/stats/pwc-current.json index 4eee7da9a2..1dcee91387 100644 --- a/stats/pwc-current.json +++ b/stats/pwc-current.json @@ -1,81 +1,40 @@ { - "subtitle" : { - "text" : "[Champions: 6] Last updated at 2021-09-27 19:27:51 GMT" - }, - "xAxis" : { - "type" : "category" - }, - "title" : { - "text" : "The Weekly Challenge - 132" - }, - "chart" : { - "type" : "column" - }, - "plotOptions" : { - "series" : { - "dataLabels" : { - "enabled" : 1, - "format" : "{point.y}" - }, - "borderWidth" : 0 - } + "tooltip" : { + "pointFormat" : "{point.name}: {point.y:f}
", + "headerFormat" : "{series.name}
", + "followPointer" : 1 }, - "yAxis" : { - "title" : { - "text" : "Total Solutions" - } + "legend" : { + "enabled" : 0 }, - "series" : [ - { - "data" : [ - { - "name" : "Cheok-Yin Fung", - "drilldown" : "Cheok-Yin Fung", - "y" : 1 - }, - { - "name" : "James Smith", - "drilldown" : "James Smith", - "y" : 3 - }, - { - "drilldown" : "Luca Ferrari", - "y" : 4, - "name" : "Luca Ferrari" - }, - { - "drilldown" : "Mark Anderson", - "y" : 2, - "name" : "Mark Anderson" - }, - { - "name" : "Niels van Dijke", - "y" : 2, - "drilldown" : "Niels van Dijke" - }, - { - "y" : 4, - "drilldown" : "Roger Bell_West", - "name" : "Roger Bell_West" - } - ], - "name" : "The Weekly Challenge - 132", - "colorByPoint" : 1 - } - ], "drilldown" : { "series" : [ { - "id" : "Cheok-Yin Fung", + "name" : "Cheok-Yin Fung", "data" : [ [ "Perl", 1 ] ], - "name" : "Cheok-Yin Fung" + "id" : "Cheok-Yin Fung" }, { + "id" : "Dave Jacoby", + "name" : "Dave Jacoby", + "data" : [ + [ + "Perl", + 2 + ], + [ + "Blog", + 1 + ] + ] + }, + { + "id" : "James Smith", "data" : [ [ "Perl", @@ -86,10 +45,10 @@ 1 ] ], - "name" : "James Smith", - "id" : "James Smith" + "name" : "James Smith" }, { + "id" : "Luca Ferrari", "name" : "Luca Ferrari", "data" : [ [ @@ -100,8 +59,7 @@ "Blog", 2 ] - ], - "id" : "Luca Ferrari" + ] }, { "name" : "Mark Anderson", @@ -124,7 +82,7 @@ ] }, { - "id" : "Roger Bell_West", + "name" : "Roger Bell_West", "data" : [ [ "Perl", @@ -135,16 +93,77 @@ 2 ] ], - "name" : "Roger Bell_West" + "id" : "Roger Bell_West" } ] }, - "legend" : { - "enabled" : 0 + "chart" : { + "type" : "column" }, - "tooltip" : { - "headerFormat" : "{series.name}
", - "followPointer" : 1, - "pointFormat" : "{point.name}: {point.y:f}
" + "yAxis" : { + "title" : { + "text" : "Total Solutions" + } + }, + "xAxis" : { + "type" : "category" + }, + "plotOptions" : { + "series" : { + "borderWidth" : 0, + "dataLabels" : { + "enabled" : 1, + "format" : "{point.y}" + } + } + }, + "subtitle" : { + "text" : "[Champions: 7] Last updated at 2021-09-29 17:20:02 GMT" + }, + "series" : [ + { + "colorByPoint" : 1, + "data" : [ + { + "drilldown" : "Cheok-Yin Fung", + "y" : 1, + "name" : "Cheok-Yin Fung" + }, + { + "name" : "Dave Jacoby", + "drilldown" : "Dave Jacoby", + "y" : 3 + }, + { + "name" : "James Smith", + "y" : 3, + "drilldown" : "James Smith" + }, + { + "name" : "Luca Ferrari", + "drilldown" : "Luca Ferrari", + "y" : 4 + }, + { + "name" : "Mark Anderson", + "drilldown" : "Mark Anderson", + "y" : 2 + }, + { + "name" : "Niels van Dijke", + "drilldown" : "Niels van Dijke", + "y" : 2 + }, + { + "name" : "Roger Bell_West", + "y" : 4, + "drilldown" : "Roger Bell_West" + } + ], + "name" : "The Weekly Challenge - 132" + } + ], + "title" : { + "text" : "The Weekly Challenge - 132" } } diff --git a/stats/pwc-language-breakdown-summary.json b/stats/pwc-language-breakdown-summary.json index 27135678d2..af92ff028c 100644 --- a/stats/pwc-language-breakdown-summary.json +++ b/stats/pwc-language-breakdown-summary.json @@ -1,63 +1,63 @@ { + "chart" : { + "type" : "column" + }, "yAxis" : { + "min" : 0, "title" : { "text" : null - }, - "min" : 0 + } }, - "chart" : { - "type" : "column" + "tooltip" : { + "pointFormat" : "{point.y:.0f}" + }, + "legend" : { + "enabled" : "false" }, "title" : { "text" : "The Weekly Challenge Contributions [2019 - 2021]" }, - "subtitle" : { - "text" : "Last updated at 2021-09-27 19:27:51 GMT" - }, - "xAxis" : { - "type" : "category", - "labels" : { - "style" : { - "fontSize" : "13px", - "fontFamily" : "Verdana, sans-serif" - } - } - }, "series" : [ { - "dataLabels" : { - "format" : "{point.y:.0f}", - "rotation" : -90, - "align" : "right", - "enabled" : "true", - "style" : { - "fontSize" : "13px", - "fontFamily" : "Verdana, sans-serif" - }, - "y" : 10, - "color" : "#FFFFFF" - }, - "name" : "Contributions", "data" : [ [ "Blog", - 1900 + 1901 ], [ "Perl", - 6269 + 6271 ], [ "Raku", 3848 ] - ] + ], + "name" : "Contributions", + "dataLabels" : { + "enabled" : "true", + "format" : "{point.y:.0f}", + "color" : "#FFFFFF", + "rotation" : -90, + "style" : { + "fontSize" : "13px", + "fontFamily" : "Verdana, sans-serif" + }, + "align" : "right", + "y" : 10 + } } ], - "legend" : { - "enabled" : "false" + "subtitle" : { + "text" : "Last updated at 2021-09-29 17:20:02 GMT" }, - "tooltip" : { - "pointFormat" : "{point.y:.0f}" + "xAxis" : { + "type" : "category", + "labels" : { + "style" : { + "fontFamily" : "Verdana, sans-serif", + "fontSize" : "13px" + } + } } } diff --git a/stats/pwc-language-breakdown.json b/stats/pwc-language-breakdown.json index bfb45b07d2..c30fd6f37f 100644 --- a/stats/pwc-language-breakdown.json +++ b/stats/pwc-language-breakdown.json @@ -10,19 +10,19 @@ "name" : "#001" }, { - "name" : "#002", "drilldown" : "002", - "y" : 125 + "y" : 125, + "name" : "#002" }, { - "drilldown" : "003", + "name" : "#003", "y" : 81, - "name" : "#003" + "drilldown" : "003" }, { - "name" : "#004", + "y" : 99, "drilldown" : "004", - "y" : 99 + "name" : "#004" }, { "name" : "#005", @@ -30,9 +30,9 @@ "drilldown" : "005" }, { - "drilldown" : "006", + "name" : "#006", "y" : 58, - "name" : "#006" + "drilldown" : "006" }, { "name" : "#007", @@ -40,9 +40,9 @@ "y" : 64 }, { - "name" : "#008", + "drilldown" : "008", "y" : 78, - "drilldown" : "008" + "name" : "#008" }, { "drilldown" : "009", @@ -50,18 +50,18 @@ "name" : "#009" }, { - "name" : "#010", + "y" : 65, "drilldown" : "010", - "y" : 65 + "name" : "#010" }, { - "name" : "#011", "drilldown" : "011", - "y" : 85 + "y" : 85, + "name" : "#011" }, { - "drilldown" : "012", "y" : 89, + "drilldown" : "012", "name" : "#012" }, { @@ -75,8 +75,8 @@ "name" : "#014" }, { - "y" : 99, "drilldown" : "015", + "y" : 99, "name" : "#015" }, { @@ -85,14 +85,14 @@ "name" : "#016" }, { - "name" : "#017", "y" : 84, - "drilldown" : "017" + "drilldown" : "017", + "name" : "#017" }, { - "name" : "#018", + "y" : 81, "drilldown" : "018", - "y" : 81 + "name" : "#018" }, { "name" : "#019", @@ -100,9 +100,9 @@ "y" : 103 }, { - "name" : "#020", + "drilldown" : "020", "y" : 101, - "drilldown" : "020" + "name" : "#020" }, { "drilldown" : "021", @@ -110,8 +110,8 @@ "name" : "#021" }, { - "y" : 68, "drilldown" : "022", + "y" : 68, "name" : "#022" }, { @@ -120,19 +120,19 @@ "drilldown" : "023" }, { - "name" : "#024", "drilldown" : "024", - "y" : 75 + "y" : 75, + "name" : "#024" }, { - "name" : "#025", + "y" : 59, "drilldown" : "025", - "y" : 59 + "name" : "#025" }, { - "name" : "#026", "drilldown" : "026", - "y" : 74 + "y" : 74, + "name" : "#026" }, { "name" : "#027", @@ -141,8 +141,8 @@ }, { "name" : "#028", - "y" : 80, - "drilldown" : "028" + "drilldown" : "028", + "y" : 80 }, { "name" : "#029", @@ -150,9 +150,9 @@ "drilldown" : "029" }, { - "name" : "#030", "y" : 117, - "drilldown" : "030" + "drilldown" : "030", + "name" : "#030" }, { "drilldown" : "031", @@ -161,8 +161,8 @@ }, { "name" : "#032", - "y" : 94, - "drilldown" : "032" + "drilldown" : "032", + "y" : 94 }, { "name" : "#033", @@ -171,8 +171,8 @@ }, { "name" : "#034", - "drilldown" : "034", - "y" : 64 + "y" : 64, + "drilldown" : "034" }, { "y" : 64, @@ -185,24 +185,24 @@ "y" : 68 }, { - "name" : "#037", "y" : 67, - "drilldown" : "037" + "drilldown" : "037", + "name" : "#037" }, { - "drilldown" : "038", + "name" : "#038", "y" : 68, - "name" : "#038" + "drilldown" : "038" }, { - "name" : "#039", "drilldown" : "039", - "y" : 62 + "y" : 62, + "name" : "#039" }, { - "drilldown" : "040", + "name" : "#040", "y" : 73, - "name" : "#040" + "drilldown" : "040" }, { "name" : "#041", @@ -211,8 +211,8 @@ }, { "name" : "#042", - "y" : 92, - "drilldown" : "042" + "drilldown" : "042", + "y" : 92 }, { "drilldown" : "043", @@ -220,24 +220,24 @@ "name" : "#043" }, { + "name" : "#044", "y" : 85, - "drilldown" : "044", - "name" : "#044" + "drilldown" : "044" }, { "name" : "#045", - "drilldown" : "045", - "y" : 96 + "y" : 96, + "drilldown" : "045" }, { + "name" : "#046", "drilldown" : "046", - "y" : 87, - "name" : "#046" + "y" : 87 }, { + "name" : "#047", "drilldown" : "047", - "y" : 84, - "name" : "#047" + "y" : 84 }, { "y" : 108, @@ -245,14 +245,14 @@ "name" : "#048" }, { - "drilldown" : "049", + "name" : "#049", "y" : 89, - "name" : "#049" + "drilldown" : "049" }, { - "name" : "#050", + "y" : 98, "drilldown" : "050", - "y" : 98 + "name" : "#050" }, { "drilldown" : "051", @@ -266,13 +266,13 @@ }, { "name" : "#053", - "y" : 101, - "drilldown" : "053" + "drilldown" : "053", + "y" : 101 }, { "name" : "#054", - "drilldown" : "054", - "y" : 103 + "y" : 103, + "drilldown" : "054" }, { "name" : "#055", @@ -281,28 +281,28 @@ }, { "name" : "#056", - "drilldown" : "056", - "y" : 95 + "y" : 95, + "drilldown" : "056" }, { - "y" : 80, "drilldown" : "057", + "y" : 80, "name" : "#057" }, { - "y" : 69, "drilldown" : "058", + "y" : 69, "name" : "#058" }, { + "name" : "#059", "y" : 89, - "drilldown" : "059", - "name" : "#059" + "drilldown" : "059" }, { + "name" : "#060", "drilldown" : "060", - "y" : 85, - "name" : "#060" + "y" : 85 }, { "name" : "#061", @@ -310,9 +310,9 @@ "drilldown" : "061" }, { - "name" : "#062", "y" : 58, - "drilldown" : "062" + "drilldown" : "062", + "name" : "#062" }, { "name" : "#063", @@ -326,48 +326,48 @@ }, { "name" : "#065", - "drilldown" : "065", - "y" : 73 + "y" : 73, + "drilldown" : "065" }, { - "name" : "#066", + "drilldown" : "066", "y" : 84, - "drilldown" : "066" + "name" : "#066" }, { - "drilldown" : "067", + "name" : "#067", "y" : 90, - "name" : "#067" + "drilldown" : "067" }, { - "y" : 75, + "name" : "#068", "drilldown" : "068", - "name" : "#068" + "y" : 75 }, { - "y" : 83, "drilldown" : "069", + "y" : 83, "name" : "#069" }, { "name" : "#070", - "y" : 93, - "drilldown" : "070" + "drilldown" : "070", + "y" : 93 }, { - "y" : 78, + "name" : "#071", "drilldown" : "071", - "name" : "#071" + "y" : 78 }, { + "name" : "#072", "drilldown" : "072", - "y" : 112, - "name" : "#072" + "y" : 112 }, { - "drilldown" : "073", + "name" : "#073", "y" : 110, - "name" : "#073" + "drilldown" : "073" }, { "name" : "#074", @@ -375,14 +375,14 @@ "drilldown" : "074" }, { - "y" : 115, "drilldown" : "075", + "y" : 115, "name" : "#075" }, { "name" : "#076", - "y" : 99, - "drilldown" : "076" + "drilldown" : "076", + "y" : 99 }, { "y" : 98, @@ -391,38 +391,38 @@ }, { "name" : "#078", - "drilldown" : "078", - "y" : 127 + "y" : 127, + "drilldown" : "078" }, { - "name" : "#079", + "drilldown" : "079", "y" : 122, - "drilldown" : "079" + "name" : "#079" }, { - "drilldown" : "080", "y" : 127, + "drilldown" : "080", "name" : "#080" }, { - "y" : 114, + "name" : "#081", "drilldown" : "081", - "name" : "#081" + "y" : 114 }, { "name" : "#082", - "drilldown" : "082", - "y" : 114 + "y" : 114, + "drilldown" : "082" }, { - "name" : "#083", + "y" : 127, "drilldown" : "083", - "y" : 127 + "name" : "#083" }, { - "name" : "#084", "drilldown" : "084", - "y" : 119 + "y" : 119, + "name" : "#084" }, { "name" : "#085", @@ -430,9 +430,9 @@ "y" : 114 }, { - "name" : "#086", + "drilldown" : "086", "y" : 104, - "drilldown" : "086" + "name" : "#086" }, { "y" : 101, @@ -440,89 +440,89 @@ "name" : "#087" }, { - "drilldown" : "088", "y" : 121, + "drilldown" : "088", "name" : "#088" }, { - "y" : 113, + "name" : "#089", "drilldown" : "089", - "name" : "#089" + "y" : 113 }, { - "drilldown" : "090", "y" : 113, + "drilldown" : "090", "name" : "#090" }, { - "drilldown" : "091", + "name" : "#091", "y" : 108, - "name" : "#091" + "drilldown" : "091" }, { - "name" : "#092", "y" : 98, - "drilldown" : "092" + "drilldown" : "092", + "name" : "#092" }, { - "name" : "#093", "y" : 87, - "drilldown" : "093" + "drilldown" : "093", + "name" : "#093" }, { - "drilldown" : "094", + "name" : "#094", "y" : 87, - "name" : "#094" + "drilldown" : "094" }, { - "drilldown" : "095", "y" : 108, + "drilldown" : "095", "name" : "#095" }, { - "drilldown" : "096", + "name" : "#096", "y" : 108, - "name" : "#096" + "drilldown" : "096" }, { "name" : "#097", - "y" : 111, - "drilldown" : "097" + "drilldown" : "097", + "y" : 111 }, { "name" : "#098", - "drilldown" : "098", - "y" : 108 + "y" : 108, + "drilldown" : "098" }, { + "name" : "#099", "drilldown" : "099", - "y" : 97, - "name" : "#099" + "y" : 97 }, { - "y" : 120, + "name" : "#100", "drilldown" : "100", - "name" : "#100" + "y" : 120 }, { - "name" : "#101", + "drilldown" : "101", "y" : 83, - "drilldown" : "101" + "name" : "#101" }, { - "y" : 90, "drilldown" : "102", + "y" : 90, "name" : "#102" }, { - "name" : "#103", "y" : 79, - "drilldown" : "103" + "drilldown" : "103", + "name" : "#103" }, { - "name" : "#104", + "drilldown" : "104", "y" : 85, - "drilldown" : "104" + "name" : "#104" }, { "y" : 75, @@ -530,13 +530,13 @@ "name" : "#105" }, { + "name" : "#106", "drilldown" : "106", - "y" : 97, - "name" : "#106" + "y" : 97 }, { - "drilldown" : "107", "y" : 90, + "drilldown" : "107", "name" : "#107" }, { @@ -545,19 +545,19 @@ "y" : 94 }, { - "drilldown" : "109", + "name" : "#109", "y" : 107, - "name" : "#109" + "drilldown" : "109" }, { "name" : "#110", - "y" : 108, - "drilldown" : "110" + "drilldown" : "110", + "y" : 108 }, { "name" : "#111", - "y" : 91, - "drilldown" : "111" + "drilldown" : "111", + "y" : 91 }, { "y" : 92, @@ -570,34 +570,34 @@ "drilldown" : "113" }, { - "y" : 108, "drilldown" : "114", + "y" : 108, "name" : "#114" }, { - "name" : "#115", "y" : 96, - "drilldown" : "115" + "drilldown" : "115", + "name" : "#115" }, { - "name" : "#116", "drilldown" : "116", - "y" : 95 + "y" : 95, + "name" : "#116" }, { "name" : "#117", - "y" : 97, - "drilldown" : "117" + "drilldown" : "117", + "y" : 97 }, { - "y" : 81, "drilldown" : "118", + "y" : 81, "name" : "#118" }, { + "name" : "#119", "y" : 123, - "drilldown" : "119", - "name" : "#119" + "drilldown" : "119" }, { "y" : 114, @@ -615,14 +615,14 @@ "name" : "#122" }, { - "drilldown" : "123", + "name" : "#123", "y" : 101, - "name" : "#123" + "drilldown" : "123" }, { - "name" : "#124", + "y" : 81, "drilldown" : "124", - "y" : 81 + "name" : "#124" }, { "drilldown" : "125", @@ -630,48 +630,65 @@ "name" : "#125" }, { - "drilldown" : "126", "y" : 104, + "drilldown" : "126", "name" : "#126" }, { + "name" : "#127", "drilldown" : "127", - "y" : 108, - "name" : "#127" + "y" : 108 }, { "name" : "#128", - "y" : 67, - "drilldown" : "128" + "drilldown" : "128", + "y" : 67 }, { + "name" : "#129", "y" : 48, - "drilldown" : "129", - "name" : "#129" + "drilldown" : "129" }, { - "name" : "#130", + "y" : 71, "drilldown" : "130", - "y" : 71 + "name" : "#130" }, { - "name" : "#131", "drilldown" : "131", - "y" : 89 + "y" : 89, + "name" : "#131" }, { + "name" : "#132", "drilldown" : "132", - "y" : 16, - "name" : "#132" + "y" : 19 } ] } ], + "subtitle" : { + "text" : "Click the columns to drilldown the language breakdown. Last updated at 2021-09-29 17:20:02 GMT" + }, + "title" : { + "text" : "The Weekly Challenge Language" + }, + "xAxis" : { + "type" : "category" + }, + "plotOptions" : { + "series" : { + "borderWidth" : 0, + "dataLabels" : { + "format" : "{point.y}", + "enabled" : 1 + } + } + }, "drilldown" : { "series" : [ { "id" : "001", - "name" : "001", "data" : [ [ "Perl", @@ -685,9 +702,12 @@ "Blog", 11 ] - ] + ], + "name" : "001" }, { + "id" : "002", + "name" : "002", "data" : [ [ "Perl", @@ -701,9 +721,7 @@ "Blog", 10 ] - ], - "name" : "002", - "id" : "002" + ] }, { "id" : "003", @@ -724,6 +742,7 @@ "name" : "003" }, { + "name" : "004", "data" : [ [ "Perl", @@ -738,11 +757,10 @@ 10 ] ], - "name" : "004", "id" : "004" }, { - "id" : "005", + "name" : "005", "data" : [ [ "Perl", @@ -757,10 +775,9 @@ 12 ] ], - "name" : "005" + "id" : "005" }, { - "id" : "006", "name" : "006", "data" : [ [ @@ -775,11 +792,10 @@ "Blog", 7 ] - ] + ], + "id" : "006" }, { - "id" : "007", - "name" : "007", "data" : [ [ "Perl", @@ -793,9 +809,12 @@ "Blog", 10 ] - ] + ], + "name" : "007", + "id" : "007" }, { + "id" : "008", "name" : "008", "data" : [ [ @@ -810,10 +829,10 @@ "Blog", 12 ] - ], - "id" : "008" + ] }, { + "id" : "009", "name" : "009", "data" : [ [ @@ -828,10 +847,11 @@ "Blog", 13 ] - ], - "id" : "009" + ] }, { + "id" : "010", + "name" : "010", "data" : [ [ "Perl", @@ -845,12 +865,9 @@ "Blog", 11 ] - ], - "name" : "010", - "id" : "010" + ] }, { - "id" : "011", "name" : "011", "data" : [ [ @@ -865,10 +882,11 @@ "Blog", 10 ] - ] + ], + "id" : "011" }, { - "name" : "012", + "id" : "012", "data" : [ [ "Perl", @@ -883,9 +901,10 @@ 11 ] ], - "id" : "012" + "name" : "012" }, { + "id" : "013", "data" : [ [ "Perl", @@ -900,12 +919,10 @@ 13 ] ], - "name" : "013", - "id" : "013" + "name" : "013" }, { "id" : "014", - "name" : "014", "data" : [ [ "Perl", @@ -919,10 +936,11 @@ "Blog", 15 ] - ] + ], + "name" : "014" }, { - "id" : "015", + "name" : "015", "data" : [ [ "Perl", @@ -937,7 +955,7 @@ 15 ] ], - "name" : "015" + "id" : "015" }, { "id" : "016", @@ -958,6 +976,7 @@ ] }, { + "id" : "017", "name" : "017", "data" : [ [ @@ -972,8 +991,7 @@ "Blog", 12 ] - ], - "id" : "017" + ] }, { "id" : "018", @@ -994,6 +1012,7 @@ "name" : "018" }, { + "name" : "019