aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrbaggy <js5@sanger.ac.uk>2022-05-26 10:04:02 +0100
committerdrbaggy <js5@sanger.ac.uk>2022-05-26 10:04:02 +0100
commit0fe69e21788c506e45f3678a3e45c54b2386e727 (patch)
tree0f5bfd66cd4ecabbc03ad9230e72506c10837332
parent2b40a19aa19983c33e0a87842cb6e66a972ca02e (diff)
parentfcd2d4bdde323600dd7022afb0c5374c3d324795 (diff)
downloadperlweeklychallenge-club-0fe69e21788c506e45f3678a3e45c54b2386e727.tar.gz
perlweeklychallenge-club-0fe69e21788c506e45f3678a3e45c54b2386e727.tar.bz2
perlweeklychallenge-club-0fe69e21788c506e45f3678a3e45c54b2386e727.zip
Merge remote-tracking branch 'upstream/master'
-rw-r--r--challenge-165/alexander-pankoff/haskell/Plot.hs170
-rw-r--r--challenge-165/alexander-pankoff/haskell/ch-1.hs19
-rw-r--r--challenge-165/alexander-pankoff/haskell/ch-2.hs51
-rw-r--r--challenge-166/dave-jacoby/blog.txt1
-rw-r--r--challenge-166/wlmb/blog.txt1
-rwxr-xr-xchallenge-166/wlmb/perl/ch-1.pl32
-rwxr-xr-xchallenge-166/wlmb/perl/ch-2.pl31
-rw-r--r--stats/pwc-current.json183
-rw-r--r--stats/pwc-language-breakdown-summary.json78
-rw-r--r--stats/pwc-language-breakdown.json2350
-rw-r--r--stats/pwc-leaders.json456
-rw-r--r--stats/pwc-summary-1-30.json94
-rw-r--r--stats/pwc-summary-121-150.json36
-rw-r--r--stats/pwc-summary-151-180.json96
-rw-r--r--stats/pwc-summary-181-210.json102
-rw-r--r--stats/pwc-summary-211-240.json110
-rw-r--r--stats/pwc-summary-241-270.json84
-rw-r--r--stats/pwc-summary-31-60.json42
-rw-r--r--stats/pwc-summary-61-90.json36
-rw-r--r--stats/pwc-summary-91-120.json54
-rw-r--r--stats/pwc-summary.json566
21 files changed, 2460 insertions, 2132 deletions
diff --git a/challenge-165/alexander-pankoff/haskell/Plot.hs b/challenge-165/alexander-pankoff/haskell/Plot.hs
new file mode 100644
index 0000000000..16669b37ee
--- /dev/null
+++ b/challenge-165/alexander-pankoff/haskell/Plot.hs
@@ -0,0 +1,170 @@
+{-# LANGUAGE DeriveFunctor #-}
+
+module Plot
+ ( Plot,
+ Line (..),
+ Point (..),
+ emptyPlot,
+ addLine,
+ parsePlot,
+ plotLines,
+ plotPoints,
+ ToXML (..),
+ )
+where
+
+import Data.Char (ord)
+
+class ToXML a where
+ toXML :: a -> String
+
+data Plot = MkPlot
+ { plotLines :: [Line],
+ plotPoints :: [Point]
+ }
+ deriving (Show, Eq)
+
+instance Semigroup Plot where
+ a <> b =
+ MkPlot
+ { plotLines = plotLines a <> plotLines b,
+ plotPoints = plotPoints a <> plotPoints b
+ }
+
+instance Monoid Plot where
+ mempty = MkPlot [] []
+ mappend = (<>)
+
+instance ToXML Plot where
+ toXML (MkPlot lines points) =
+ let xmlLines = map toXML lines
+ xmlPoints = map toXML points
+ in unlines $
+ [ "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>",
+ "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">",
+ "<svg height=\"300\" width=\"400\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">",
+ "<g id=\"lines\" stroke=\"#369\" stroke-width=\"4\">"
+ ]
+ ++ xmlLines
+ ++ [ "</g>",
+ "<g fill=\"#f73\" id=\"points\">"
+ ]
+ ++ xmlPoints
+ ++ [ "</g>",
+ "</svg>"
+ ]
+
+emptyPlot :: Plot
+emptyPlot = MkPlot [] []
+
+addLine :: Line -> Plot -> Plot
+addLine l p = p {plotLines = l : plotLines p}
+
+data Point = Point
+ { x :: Double,
+ y :: Double
+ }
+ deriving (Show, Eq)
+
+instance ToXML Point where
+ toXML (Point x y) = "<circle cx=\"" ++ show x ++ "\" cy=\"" ++ show y ++ "\" r=\"3\" />"
+
+data Line = Line
+ { start :: Point,
+ end :: Point
+ }
+ deriving (Show, Eq)
+
+instance ToXML Line where
+ toXML (Line (Point x1 y1) (Point x2 y2)) =
+ concat
+ [ "<line x1=\"",
+ show x1,
+ "\" x2=\"",
+ show x2,
+ "\" y1=\"",
+ show y1,
+ "\" y2=\"",
+ show y2,
+ "\" />"
+ ]
+
+-- Parsing
+
+newtype Parser a = Parser {runParser :: String -> Either ParseError (String, a)} deriving (Functor)
+
+executeParser :: Parser a -> String -> Either ParseError a
+executeParser p = fmap snd . runParser p
+
+instance Applicative Parser where
+ pure x = Parser $ \s -> return (s, x)
+ ab <*> a = Parser $ \s -> do
+ (s', ab') <- runParser ab s
+ (s'', a') <- runParser a s'
+ return (s'', ab' a')
+
+instance Monad Parser where
+ return = pure
+ pa >>= apb = Parser $ \s -> do
+ runParser pa s >>= uncurry (flip (runParser . apb))
+
+data ParseError = InvalidInput
+ deriving (Show, Eq)
+
+(<|>) :: Parser a -> Parser a -> Parser a
+a <|> b = Parser $ \s ->
+ either (const $ runParser b s) return $ runParser a s
+
+eof :: Parser ()
+eof = Parser $ \s -> if null s then return (s, ()) else Left InvalidInput
+
+-- Parsing
+
+parsePlot :: [String] -> Either ParseError Plot
+parsePlot =
+ foldl
+ ( \acc cur -> do
+ p <- executeParser parseInputLine cur
+ (<> p) <$> acc
+ )
+ (Right emptyPlot)
+
+parseInputLine :: Parser Plot
+parseInputLine =
+ ( (lineParser >>= \l -> return $ emptyPlot {plotLines = [l]})
+ <|> (pointParser >>= \p -> return $ emptyPlot {plotPoints = [p]})
+ )
+ <* eof
+
+lineParser :: Parser Line
+lineParser = Line <$> (pointParser <* commaParser) <*> pointParser
+
+pointParser :: Parser Point
+pointParser = Point <$> (fromIntegral <$> (intParser <* commaParser)) <*> (fromIntegral <$> intParser)
+
+intParser :: Parser Integer
+intParser = Parser $ \s ->
+ if null s
+ then Left InvalidInput
+ else go 0 s
+ where
+ go acc "" = return ("", acc)
+ go acc s@(x : xs) =
+ maybe
+ (return (s, acc))
+ (\n -> go (acc * 10 + fromIntegral n) xs)
+ $ digitToInt x
+
+-- see challenge 162 ch-1.hs
+digitToInt :: Char -> Maybe Int
+digitToInt c =
+ let digit = ord c - ord '0'
+ in if 0 <= digit && digit <= 9
+ then return digit
+ else Nothing
+
+commaParser :: Parser ()
+commaParser = Parser $ \s ->
+ if not (null s) && head s == ','
+ then return (tail s, ())
+ else Left InvalidInput \ No newline at end of file
diff --git a/challenge-165/alexander-pankoff/haskell/ch-1.hs b/challenge-165/alexander-pankoff/haskell/ch-1.hs
new file mode 100644
index 0000000000..cf6221003a
--- /dev/null
+++ b/challenge-165/alexander-pankoff/haskell/ch-1.hs
@@ -0,0 +1,19 @@
+{-# LANGUAGE DeriveFunctor #-}
+
+module Main where
+
+import Data.Char (ord)
+import Plot
+import System.Exit (exitFailure)
+import System.IO (hPutStrLn, stderr)
+
+main :: IO ()
+main = do
+ inputLines <- lines <$> getContents
+ either
+ (\err -> putErrLn (show err) >> exitFailure)
+ (putStr . toXML)
+ (parsePlot inputLines)
+
+putErrLn :: String -> IO ()
+putErrLn = hPutStrLn stderr \ No newline at end of file
diff --git a/challenge-165/alexander-pankoff/haskell/ch-2.hs b/challenge-165/alexander-pankoff/haskell/ch-2.hs
new file mode 100644
index 0000000000..16cd38aeaf
--- /dev/null
+++ b/challenge-165/alexander-pankoff/haskell/ch-2.hs
@@ -0,0 +1,51 @@
+module Main where
+
+import Plot (Line (..), Plot (plotPoints), Point (Point, x), ToXML (toXML), addLine, parsePlot)
+import System.Exit (exitFailure)
+import System.IO (hPutStrLn, stderr)
+
+pointInput :: String
+pointInput = "333,129 39,189 140,156 292,134 393,52 160,166 362,122 13,193 341,104 320,113 109,177 203,152 343,100 225,110 23,186 282,102 284,98 205,133 297,114 292,126 339,112 327,79 253,136 61,169 128,176 346,72 316,103 124,162 65,181 159,137 212,116 337,86 215,136 153,137 390,104 100,180 76,188 77,181 69,195 92,186 275,96 250,147 34,174 213,134 186,129 189,154 361,82 363,89"
+
+main :: IO ()
+main = do
+ either
+ (\err -> putErrLn (show err) >> exitFailure)
+ (putStr . toXML . addLineOfBestFit)
+ (parsePlot $ words pointInput)
+
+putErrLn :: String -> IO ()
+putErrLn = hPutStrLn stderr
+
+-- Line of Best Fit
+
+addLineOfBestFit :: Plot -> Plot
+addLineOfBestFit p =
+ addLine (bestFittingLine $ plotPoints p) p
+
+bestFittingLine :: [Point] -> Line
+bestFittingLine ps =
+ let lineEq = leastSquaresRegression ps
+ (minX, maxX) = minmax $ map x ps
+ in Line
+ (Point minX $ lineEq minX)
+ (Point maxX $ lineEq maxX)
+
+leastSquaresRegression :: [Point] -> LineEq
+leastSquaresRegression ps =
+ let n = fromIntegral $ length ps
+ (sx, sy, sxs, sxy) =
+ foldl
+ ( \(sx, sy, sxs, sxy) (Point x y) ->
+ (sx + x, sy + y, sxs + x ^ 2, sxy + x * y)
+ )
+ (0, 0, 0, 0)
+ ps
+ m = (n * sxy - sx * sy) / (n * sxs - sx ^ 2)
+ b = (sy - (m * sx)) / n
+ in \x -> m * x + b
+
+type LineEq = Double -> Double
+
+minmax :: Ord a => [a] -> (a, a)
+minmax = (,) <$> minimum <*> maximum \ No newline at end of file
diff --git a/challenge-166/dave-jacoby/blog.txt b/challenge-166/dave-jacoby/blog.txt
new file mode 100644
index 0000000000..9cbe3db718
--- /dev/null
+++ b/challenge-166/dave-jacoby/blog.txt
@@ -0,0 +1 @@
+https://jacoby.github.io/2022/05/25/0x7e57ab1e-0xc0deba5e-weekly-challenge-166.html
diff --git a/challenge-166/wlmb/blog.txt b/challenge-166/wlmb/blog.txt
new file mode 100644
index 0000000000..fe5db4e1fc
--- /dev/null
+++ b/challenge-166/wlmb/blog.txt
@@ -0,0 +1 @@
+https://wlmb.github.io/2022/05/25/PWC166/
diff --git a/challenge-166/wlmb/perl/ch-1.pl b/challenge-166/wlmb/perl/ch-1.pl
new file mode 100755
index 0000000000..b039038cf0
--- /dev/null
+++ b/challenge-166/wlmb/perl/ch-1.pl
@@ -0,0 +1,32 @@
+#!/usr/bin/env perl
+# Perl weekly challenge 166
+# Task 1: hexadecimal words
+#
+# See https://wlmb.github.io/2022/05/25/PWC166/#task-1-hexadecimal-words
+use v5.12;
+use warnings;
+# Parameters
+my $N_phrases=100; # number of desird phrases
+my $phrase_size=8;
+my $max_trans=1; # maximum characters to transliterate
+my $min_size=2; # bounds on word size
+my $max_size=$phrase_size-$min_size;
+
+my @words; # set of sets of words, one for each size
+while(<>){ # read dictionary words, one perl line
+ chomp;
+ # discard words too small, too large or with non-hex-like characters
+ next unless $min_size <= length($_) <= $max_size and /^\s*[0-9a-folist]+\s*$/;
+ next unless tr/olist/01157/ <= $max_trans; # transliterate letters, but too many
+ push @{$words[length($_)]}, $_; # found a word? save it
+}
+for(1..$N_phrases){
+ my $phrase="";
+ while(length($phrase)<$phrase_size){
+ my $size=$min_size+rand($max_size+1-length($phrase));# choose size of next word
+ my $chosen=$words[$size]; # array of words with chosen size
+ $phrase.=ucfirst $chosen->[rand @$chosen]; # add random word of given length
+ $phrase="" if length($phrase)>$phrase_size; # restart if overshoot
+ }
+ say $phrase;
+}
diff --git a/challenge-166/wlmb/perl/ch-2.pl b/challenge-166/wlmb/perl/ch-2.pl
new file mode 100755
index 0000000000..602f68d477
--- /dev/null
+++ b/challenge-166/wlmb/perl/ch-2.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/env perl
+# Perl weekly challenge 166
+# Task 2: K-directory diff
+#
+# See https://wlmb.github.io/2022/05/25/PWC166/#task-2-k-directory-diff
+use v5.12;
+use warnings;
+use autodie; # so I don't have to check for failures
+use List::Util qw(uniq);
+
+die "Usage: ./ch-2.pl a [b [c ..]]\nto compare directories a b..." unless @ARGV;
+my %present;
+# Prepare data
+foreach(@ARGV){ # iterate over provided directories
+ opendir(my $dir_handle, $_);
+ while(my $file_name=readdir $dir_handle){ # iterate over directory content
+ $file_name.="/" if -d "$_/$file_name"; # flag file if it is a nested directory
+ $present{$file_name}{$_}=1; # $file_name is present in directory $_
+ }
+}
+# Output results
+say join "|", "", @ARGV, ""; # output row of directories
+say "|-"; # separator line
+foreach (sort keys %present){
+ next if (keys %{$present{$_}}==uniq @ARGV); # skip files present everywhere
+ print "| "; # start a row
+ foreach my $directory(@ARGV){
+ print $present{$_}{$directory} ? "$_ |" : " |"; # filename if present, blank if not
+ }
+ say "";
+}
diff --git a/stats/pwc-current.json b/stats/pwc-current.json
index 576fc81982..5e869202d1 100644
--- a/stats/pwc-current.json
+++ b/stats/pwc-current.json
@@ -1,7 +1,83 @@
{
+ "yAxis" : {
+ "title" : {
+ "text" : "Total Solutions"
+ }
+ },
+ "title" : {
+ "text" : "The Weekly Challenge - 166"
+ },
+ "series" : [
+ {
+ "colorByPoint" : 1,
+ "data" : [
+ {
+ "drilldown" : "Dave Jacoby",
+ "name" : "Dave Jacoby",
+ "y" : 3
+ },
+ {
+ "y" : 2,
+ "name" : "E. Choroba",
+ "drilldown" : "E. Choroba"
+ },
+ {
+ "drilldown" : "Luca Ferrari",
+ "name" : "Luca Ferrari",
+ "y" : 8
+ },
+ {
+ "name" : "Mark Anderson",
+ "y" : 2,
+ "drilldown" : "Mark Anderson"
+ },
+ {
+ "y" : 3,
+ "name" : "Peter Campbell Smith",
+ "drilldown" : "Peter Campbell Smith"
+ },
+ {
+ "drilldown" : "Robert DiCicco",
+ "y" : 2,
+ "name" : "Robert DiCicco"
+ },
+ {
+ "name" : "Roger Bell_West",
+ "y" : 4,
+ "drilldown" : "Roger Bell_West"
+ },
+ {
+ "drilldown" : "Ulrich Rieke",
+ "name" : "Ulrich Rieke",
+ "y" : 2
+ },
+ {
+ "y" : 3,
+ "name" : "W. Luis Mochan",
+ "drilldown" : "W. Luis Mochan"
+ }
+ ],
+ "name" : "The Weekly Challenge - 166"
+ }
+ ],
+ "xAxis" : {
+ "type" : "category"
+ },
"chart" : {
"type" : "column"
},
+ "plotOptions" : {
+ "series" : {
+ "borderWidth" : 0,
+ "dataLabels" : {
+ "enabled" : 1,
+ "format" : "{point.y}"
+ }
+ }
+ },
+ "subtitle" : {
+ "text" : "[Champions: 9] Last updated at 2022-05-26 00:54:56 GMT"
+ },
"drilldown" : {
"series" : [
{
@@ -9,14 +85,18 @@
[
"Perl",
2
+ ],
+ [
+ "Blog",
+ 1
]
],
"name" : "Dave Jacoby",
"id" : "Dave Jacoby"
},
{
- "id" : "E. Choroba",
"name" : "E. Choroba",
+ "id" : "E. Choroba",
"data" : [
[
"Perl",
@@ -39,8 +119,8 @@
]
},
{
- "id" : "Mark Anderson",
"name" : "Mark Anderson",
+ "id" : "Mark Anderson",
"data" : [
[
"Raku",
@@ -59,8 +139,8 @@
1
]
],
- "id" : "Peter Campbell Smith",
- "name" : "Peter Campbell Smith"
+ "name" : "Peter Campbell Smith",
+ "id" : "Peter Campbell Smith"
},
{
"id" : "Robert DiCicco",
@@ -77,8 +157,8 @@
]
},
{
- "name" : "Roger Bell_West",
"id" : "Roger Bell_West",
+ "name" : "Roger Bell_West",
"data" : [
[
"Perl",
@@ -103,86 +183,29 @@
1
]
]
+ },
+ {
+ "data" : [
+ [
+ "Perl",
+ 2
+ ],
+ [
+ "Blog",
+ 1
+ ]
+ ],
+ "name" : "W. Luis Mochan",
+ "id" : "W. Luis Mochan"
}
]
},
- "plotOptions" : {
- "series" : {
- "dataLabels" : {
- "format" : "{point.y}",
- "enabled" : 1
- },
- "borderWidth" : 0
- }
- },
- "legend" : {
- "enabled" : 0
- },
- "title" : {
- "text" : "The Weekly Challenge - 166"
- },
- "yAxis" : {
- "title" : {
- "text" : "Total Solutions"
- }
- },
- "subtitle" : {
- "text" : "[Champions: 8] Last updated at 2022-05-24 19:02:24 GMT"
- },
- "series" : [
- {
- "name" : "The Weekly Challenge - 166",
- "data" : [
- {
- "name" : "Dave Jacoby",
- "drilldown" : "Dave Jacoby",
- "y" : 2
- },
- {
- "y" : 2,
- "name" : "E. Choroba",
- "drilldown" : "E. Choroba"
- },
- {
- "y" : 8,
- "name" : "Luca Ferrari",
- "drilldown" : "Luca Ferrari"
- },
- {
- "name" : "Mark Anderson",
- "drilldown" : "Mark Anderson",
- "y" : 2
- },
- {
- "drilldown" : "Peter Campbell Smith",
- "name" : "Peter Campbell Smith",
- "y" : 3
- },
- {
- "y" : 2,
- "name" : "Robert DiCicco",
- "drilldown" : "Robert DiCicco"
- },
- {
- "drilldown" : "Roger Bell_West",
- "name" : "Roger Bell_West",
- "y" : 4
- },
- {
- "y" : 2,
- "name" : "Ulrich Rieke",
- "drilldown" : "Ulrich Rieke"
- }
- ],
- "colorByPoint" : 1
- }
- ],
- "xAxis" : {
- "type" : "category"
- },
"tooltip" : {
- "headerFormat" : "<span style='font-size:11px'>{series.name}</span><br/>",
"followPointer" : 1,
+ "headerFormat" : "<span style='font-size:11px'>{series.name}</span><br/>",
"pointFormat" : "<span style='color:{point.color}'>{point.name}</span>: <b>{point.y:f}</b><br/>"
+ },
+ "legend" : {
+ "enabled" : 0
}
}
diff --git a/stats/pwc-language-breakdown-summary.json b/stats/pwc-language-breakdown-summary.json
index 2fd7ac33fe..3ace823d81 100644
--- a/stats/pwc-language-breakdown-summary.json
+++ b/stats/pwc-language-breakdown-summary.json
@@ -1,63 +1,63 @@
{
- "yAxis" : {
- "title" : {
- "text" : null
- },
- "min" : 0
- },
- "subtitle" : {
- "text" : "Last updated at 2022-05-24 19:02:24 GMT"
- },
- "tooltip" : {
- "pointFormat" : "<b>{point.y:.0f}</b>"
- },
- "xAxis" : {
- "type" : "category",
- "labels" : {
- "style" : {
- "fontSize" : "13px",
- "fontFamily" : "Verdana, sans-serif"
- }
- }
- },
"series" : [
{
+ "name" : "Contributions",
+ "dataLabels" : {
+ "format" : "{point.y:.0f}",
+ "color" : "#FFFFFF",
+ "enabled" : "true",
+ "y" : 10,
+ "align" : "right",
+ "rotation" : -90,
+ "style" : {
+ "fontFamily" : "Verdana, sans-serif",
+ "fontSize" : "13px"
+ }
+ },
"data" : [
[
"Blog",
- 2561
+ 2563
],
[
"Perl",
- 8090
+ 8092
],
[
"Raku",
4793
]
- ],
- "dataLabels" : {
- "color" : "#FFFFFF",
- "y" : 10,
- "rotation" : -90,
- "align" : "right",
- "format" : "{point.y:.0f}",
- "style" : {
- "fontFamily" : "Verdana, sans-serif",
- "fontSize" : "13px"
- },
- "enabled" : "true"
- },
- "name" : "Contributions"
+ ]
}
],
- "chart" : {
- "type" : "column"
+ "subtitle" : {
+ "text" : "Last updated at 2022-05-26 00:54:56 GMT"
},
"title" : {
"text" : "The Weekly Challenge Contributions [2019 - 2022]"
},
+ "yAxis" : {
+ "min" : 0,
+ "title" : {
+ "text" : null
+ }
+ },
+ "chart" : {
+ "type" : "column"
+ },
"legend" : {
"enabled" : "false"
+ },
+ "xAxis" : {
+ "labels" : {
+ "style" : {
+ "fontFamily" : "Verdana, sans-serif",
+ "fontSize" : "13px"
+ }
+ },
+ "type" : "category"
+ },
+ "tooltip" : {
+ "pointFormat" : "<b>{point.y:.0f}</b>"
}
}
diff --git a/stats/pwc-language-breakdown.json b/stats/pwc-language-breakdown.json
index 3ceb921463..6a81240b8c 100644
--- a/stats/pwc-language-breakdown.json
+++ b/stats/pwc-language-breakdown.json
@@ -1,875 +1,14 @@
{
- "series" : [
- {
- "data" : [
- {
- "y" : 161,
- "drilldown" : "001",
- "name" : "#001"
- },
- {
- "y" : 125,
- "name" : "#002",
- "drilldown" : "002"
- },
- {
- "drilldown" : "003",
- "name" : "#003",
- "y" : 83
- },
- {
- "y" : 99,
- "drilldown" : "004",
- "name" : "#004"
- },
- {
- "y" : 78,
- "name" : "#005",
- "drilldown" : "005"
- },
- {
- "name" : "#006",
- "drilldown" : "006",
- "y" : 58
- },
- {
- "y" : 64,
- "drilldown" : "007",
- "name" : "#007"
- },
- {
- "name" : "#008",
- "drilldown" : "008",
- "y" : 78
- },
- {
- "y" : 76,
- "name" : "#009",
- "drilldown" : "009"
- },
- {
- "name" : "#010",
- "drilldown" : "010",
- "y" : 65
- },
- {
- "y" : 85,
- "drilldown" : "011",
- "name" : "#011"
- },
- {
- "y" : 89,
- "drilldown" : "012",
- "name" : "#012"
- },
- {
- "y" : 85,
- "name" : "#013",
- "drilldown" : "013"
- },
- {
- "drilldown" : "014",
- "name" : "#014",
- "y" : 101
- },
- {
- "y" : 99,
- "name" : "#015",
- "drilldown" : "015"
- },
- {
- "y" : 71,
- "drilldown" : "016",
- "name" : "#016"
- },
- {
- "y" : 84,
- "drilldown" : "017",
- "name" : "#017"
- },
- {
- "y" : 81,
- "name" : "#018",
- "drilldown" : "018"
- },
- {
- "y" : 103,
- "name" : "#019",
- "drilldown" : "019"
- },
- {
- "y" : 101,
- "drilldown" : "020",
- "name" : "#020"
- },
- {
- "y" : 72,
- "drilldown" : "021",
- "name" : "#021"
- },
- {
- "drilldown" : "022",
- "name" : "#022",
- "y" : 68
- },
- {
- "y" : 97,
- "name" : "#023",
- "drilldown" : "023"
- },
- {
- "y" : 75,
- "drilldown" : "024",
- "name" : "#024"
- },
- {
- "y" : 59,
- "name" : "#025",
- "drilldown" : "025"
- },
- {
- "y" : 74,
- "drilldown" : "026",
- "name" : "#026"
- },
- {
- "drilldown" : "027",
- "name" : "#027",
- "y" : 62
- },
- {
- "drilldown" : "028",
- "name" : "#028",
- "y" : 82
- },
- {
- "y" : 81,
- "drilldown" : "029",
- "name" : "#029"
- },
- {
- "y" : 119,
- "drilldown" : "030",
- "name" : "#030"
- },
- {
- "drilldown" : "031",
- "name" : "#031",
- "y" : 91
- },
- {
- "y" : 96,
- "drilldown" : "032",
- "name" : "#032"
- },
- {
- "drilldown" : "033",
- "name" : "#033",
- "y" : 112
- },
- {
- "name" : "#034",
- "drilldown" : "034",
- "y" : 66
- },
- {
- "drilldown" : "035",
- "name" : "#035",
- "y" : 66
- },
- {
- "y" : 70,
- "drilldown" : "036",
- "name" : "#036"
- },
- {
- "y" : 69,
- "name" : "#037",
- "drilldown" : "037"
- },
- {
- "y" : 70,
- "name" : "#038",
- "drilldown" : "038"
- },
- {
- "y" : 64,
- "drilldown" : "039",
- "name" : "#039"
- },
- {
- "name" : "#040",
- "drilldown" : "040",
- "y" : 75
- },
- {
- "y" : 78,
- "name" : "#041",
- "drilldown" : "041"
- },
- {
- "y" : 94,
- "name" : "#042",
- "drilldown" : "042"
- },
- {
- "y" : 70,
- "drilldown" : "043",
- "name" : "#043"
- },
- {
- "drilldown" : "044",
- "name" : "#044",
- "y" : 87
- },
- {
- "name" : "#045",
- "drilldown" : "045",
- "y" : 98
- },
- {
- "drilldown" : "046",
- "name" : "#046",
- "y" : 89
- },
- {
- "name" : "#047",
- "drilldown" : "047",
- "y" : 86
- },
- {
- "y" : 110,
- "drilldown" : "048",
- "name" : "#048"
- },
- {
- "drilldown" : "049",
- "name" : "#049",
- "y" : 91
- },
- {
- "name" : "#050",
- "drilldown" : "050",
- "y" : 100
- },
- {
- "name" : "#051",
- "drilldown" : "051",
- "y" : 91
- },
- {
- "drilldown" : "052",
- "name" : "#052",
- "y" : 93
- },
- {
- "drilldown" : "053",
- "name" : "#053",
- "y" : 103
- },
- {
- "y" : 105,
- "drilldown" : "054",
- "name" : "#054"
- },
- {