diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-05-02 04:32:05 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2022-05-02 04:32:05 +0100 |
| commit | bec032f9ed6184666bcc342527fbdc0933d463a4 (patch) | |
| tree | 3f1cafb73248702a4b60c745611ebf1bd5ce5edc | |
| parent | a2b36921818173701d96a96c35ee96fbf96b7d42 (diff) | |
| download | perlweeklychallenge-club-bec032f9ed6184666bcc342527fbdc0933d463a4.tar.gz perlweeklychallenge-club-bec032f9ed6184666bcc342527fbdc0933d463a4.tar.bz2 perlweeklychallenge-club-bec032f9ed6184666bcc342527fbdc0933d463a4.zip | |
- Added solutions by Flavio Poletti.
| -rw-r--r-- | challenge-162/polettix/blog.txt | 1 | ||||
| -rw-r--r-- | challenge-162/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-162/polettix/perl/ch-1.pl | 16 | ||||
| -rw-r--r-- | challenge-162/polettix/perl/ch-2.pl | 54 | ||||
| -rw-r--r-- | challenge-162/polettix/raku/ch-1.raku | 11 | ||||
| -rw-r--r-- | challenge-162/polettix/raku/ch-2.raku | 43 | ||||
| -rw-r--r-- | stats/pwc-current.json | 221 | ||||
| -rw-r--r-- | stats/pwc-language-breakdown-summary.json | 56 | ||||
| -rw-r--r-- | stats/pwc-language-breakdown.json | 972 | ||||
| -rw-r--r-- | stats/pwc-leaders.json | 750 | ||||
| -rw-r--r-- | stats/pwc-summary-1-30.json | 104 | ||||
| -rw-r--r-- | stats/pwc-summary-121-150.json | 94 | ||||
| -rw-r--r-- | stats/pwc-summary-151-180.json | 120 | ||||
| -rw-r--r-- | stats/pwc-summary-181-210.json | 98 | ||||
| -rw-r--r-- | stats/pwc-summary-211-240.json | 94 | ||||
| -rw-r--r-- | stats/pwc-summary-241-270.json | 26 | ||||
| -rw-r--r-- | stats/pwc-summary-31-60.json | 92 | ||||
| -rw-r--r-- | stats/pwc-summary-61-90.json | 44 | ||||
| -rw-r--r-- | stats/pwc-summary-91-120.json | 34 | ||||
| -rw-r--r-- | stats/pwc-summary.json | 558 |
20 files changed, 1769 insertions, 1620 deletions
diff --git a/challenge-162/polettix/blog.txt b/challenge-162/polettix/blog.txt new file mode 100644 index 0000000000..386fd7d5b9 --- /dev/null +++ b/challenge-162/polettix/blog.txt @@ -0,0 +1 @@ +https://github.polettix.it/ETOOBUSY/2022/04/26/pwc162-isbn-13/ diff --git a/challenge-162/polettix/blog1.txt b/challenge-162/polettix/blog1.txt new file mode 100644 index 0000000000..8c6476eb94 --- /dev/null +++ b/challenge-162/polettix/blog1.txt @@ -0,0 +1 @@ +https://github.polettix.it/ETOOBUSY/2022/04/27/pwc162-wheatstone-playfair/ diff --git a/challenge-162/polettix/perl/ch-1.pl b/challenge-162/polettix/perl/ch-1.pl new file mode 100644 index 0000000000..edd3efb32a --- /dev/null +++ b/challenge-162/polettix/perl/ch-1.pl @@ -0,0 +1,16 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +no warnings 'experimental::signatures'; +use List::Util qw< pairmap sum >; + +my $input = shift // '978-0-306-40615-7'; +say "ISBN-13 check digit for '$input' is @{[isbn_13($input)]}."; + +sub isbn_13 ($input) { + sum( + pairmap { -$a - 3* $b } + ($input =~ m{(\d)}gmxs)[0 .. 11] + ) % 10; +} diff --git a/challenge-162/polettix/perl/ch-2.pl b/challenge-162/polettix/perl/ch-2.pl new file mode 100644 index 0000000000..0313de531a --- /dev/null +++ b/challenge-162/polettix/perl/ch-2.pl @@ -0,0 +1,54 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +no warnings 'experimental::signatures'; + +say encrypt('playfair example', 'hide the gold in the tree stump'); +say decrypt('perl and raku', 'siderwrdulfipaarkcrw'); + +sub encrypt ($key, $message) { wheatstone_playfair($key, $message, 1) } +sub decrypt ($key, $message) { wheatstone_playfair($key, $message, 5 - 1) } +The main workhorse is then the following function, I hope the comments are sufficient! + +sub wheatstone_playfair ($key, $message, $off) { + + # pre-massage the input, go uppercase and remove all j:s + $_ = lc($_) =~ s{j}{i}rgmxs for $key, $message; + + # we don't need no stinkin' matrix, a bijection in two arrays is OK + my %flag; + my @letter_at = grep { $flag{$_}++ == 0 } + split(m{[^a-z]?}imxs, $key), 'a' .. 'i', 'k' .. 'z', 'j'; + + # the "go back" might be a hash but we are C nostalgic + my $oA = ord('a'); # used to turn lc letters into array indexes + my @pos_of = map { $_->[0] } # get indexes + sort { $a->[1] cmp $b->[1] } # sorted by letter position + map { [$_, $letter_at[$_]] } 0 .. $#letter_at; + + # take only letters into consideration, split on everything else + my @message = split m{[^a-z]?}imxs, $message; + my @output; + while (@message) { + + # first letter is whatever, second letter might be an X + my $A = shift @message; + my $B = @message && $message[0] ne $A ? shift @message : 'x'; + + # get positions, $A and $B are spoiled on the way but it's OK + my ($Ax, $Ay, $Bx, $By) = map { + my $v = $pos_of[ord($_) - $oA]; + ($v % 5, int($v / 5)) + } ($A, $B); + + # apply Wheatstone-Playfair mapping + ($Ax, $Ay, $Bx, $By) = + $Ax == $Bx ? ($Ax, ($Ay + $off) % 5, $Bx, ($By + $off) % 5) + : $Ay == $By ? (($Ax + $off) % 5, $Ay, ($Bx + $off) % 5, $By) + : ($Bx, $Ay, $Ax, $By); + + push @output, @letter_at[$Ax + 5 * $Ay, $Bx + 5 * $By]; + } ## end while (@message) + return join '', @output; +} ## end sub wheatstone_playfair diff --git a/challenge-162/polettix/raku/ch-1.raku b/challenge-162/polettix/raku/ch-1.raku new file mode 100644 index 0000000000..3da9a8f806 --- /dev/null +++ b/challenge-162/polettix/raku/ch-1.raku @@ -0,0 +1,11 @@ +#!/usr/bin/env raku +use v6; +sub MAIN (Str:D $input = '978-0-306-40615-7') { + put "ISBN-13 check digit for '$input' is {isbn_13($input)}."; +} + +sub isbn_13 ($input) { + $input.comb(/\d/)[0..11] # focus on first 12 digits + .map({-$^a - 3 * $^b}) # apply equivalent weights + .sum % 10; # sum and take remainder +} diff --git a/challenge-162/polettix/raku/ch-2.raku b/challenge-162/polettix/raku/ch-2.raku new file mode 100644 index 0000000000..eff3949277 --- /dev/null +++ b/challenge-162/polettix/raku/ch-2.raku @@ -0,0 +1,43 @@ +#!/usr/bin/env raku +use v6; + +put encrypt('playfair example', 'hide the gold in the tree stump'); +put decrypt('perl and raku', 'siderwrdulfipaarkcrw'); + +sub encrypt ($key, $message) { wheatstone-playfair($key, $message, 1) } +sub decrypt ($key, $message) { wheatstone-playfair($key, $message, 5 - 1) } + +sub wheatstone-playfair ($key is copy, $message is copy, $off) { + for $key, $message { $_ = $_.lc; s:g/j/i/ } + + # we don't need no stinkin' matrix, a bijection in two arrays is OK + my %flag; + my @letter-at = ($key.comb(/<[a .. z]>/), 'a' .. 'i', 'k' .. 'z', 'j') + .flat.grep({ %flag{$_}++ == 0 }); + + # in Raku we're not C nostalgic any more + my %pos-of = (0..25).map({ @letter-at[$_] => $_ }); + + # take only letters into consideration, split on everything else + my @message = $message.comb(/<[ a ..z ]>/); + my @output; + while @message { + + # first letter is whatever, second letter might be an X + my $A = shift @message; + my $B = @message && @message[0] ne $A ?? @message.shift !! 'x'; + + # get positions, $A and $B are spoiled on the way but it's OK + my ($Ax, $Ay, $Bx, $By) = + ($A, $B).map({ my $v = %pos-of{$_}; ($v % 5, ($v / 5).Int) }).flat; + + # apply Wheatstone-Playfair mapping + ($Ax, $Ay, $Bx, $By) = + $Ax == $Bx ?? ($Ax, ($Ay + $off) % 5, $Bx, ($By + $off) % 5) + !! $Ay == $By ?? (($Ax + $off) % 5, $Ay, ($Bx + $off) % 5, $By) + !! ($Bx, $Ay, $Ax, $By); + + @output.push: @letter-at[$Ax + 5 * $Ay, $Bx + 5 * $By].Slip; + } ## end while (@message) + return join '', @output; +} diff --git a/stats/pwc-current.json b/stats/pwc-current.json index e2e56b2d81..8e08580bf7 100644 --- a/stats/pwc-current.json +++ b/stats/pwc-current.json @@ -2,21 +2,9 @@ "chart" : { "type" : "column" }, - "xAxis" : { - "type" : "category" - }, - "title" : { - "text" : "The Weekly Challenge - 162" - }, - "yAxis" : { - "title" : { - "text" : "Total Solutions" - } - }, "drilldown" : { "series" : [ { - "name" : "Adam Russell", "data" : [ [ "Perl", @@ -27,7 +15,8 @@ 2 ] ], - "id" : "Adam Russell" + "id" : "Adam Russell", + "name" : "Adam Russell" }, { "id" : "Alexander Pankoff", @@ -40,6 +29,7 @@ "name" : "Alexander Pankoff" }, { + "name" : "Arne Sommer", "data" : [ [ "Raku", @@ -50,11 +40,9 @@ 1 ] ], - "id" : "Arne Sommer", - "name" : "Arne Sommer" + "id" : "Arne Sommer" }, { - "id" : "Athanasius", "data" : [ [ "Perl", @@ -65,9 +53,11 @@ 2 ] ], + "id" : "Athanasius", "name" : "Athanasius" }, { + "id" : "Cheok-Yin Fung", "data" : [ [ "Perl", @@ -78,11 +68,9 @@ 1 ] ], - "id" : "Cheok-Yin Fung", "name" : "Cheok-Yin Fung" }, { - "name" : "Colin Crain", "id" : "Colin Crain", "data" : [ [ @@ -93,11 +81,11 @@ "Blog", 2 ] - ] + ], + "name" : "Colin Crain" }, { "name" : "Dave Jacoby", - "id" : "Dave Jacoby", "data" : [ [ "Perl", @@ -107,17 +95,18 @@ "Blog", 1 ] - ] + ], + "id" : "Dave Jacoby" }, { "name" : "Duncan C. White", - "id" : "Duncan C. White", "data" : [ [ "Perl", 2 ] - ] + ], + "id" : "Duncan C. White" }, { "name" : "E. Choroba", @@ -130,7 +119,25 @@ ] }, { - "name" : "James Smith", + "name" : "Flavio Poletti", + "data" : [ + [ + "Perl", + 2 + ], + [ + "Raku", + 2 + ], + [ + "Blog", + 2 + ] + ], + "id" : "Flavio Poletti" + }, + { + "id" : "James Smith", "data" : [ [ "Perl", @@ -141,39 +148,40 @@ 1 ] ], - "id" : "James Smith" + "name" : "James Smith" }, { - "name" : "Jan Krnavek", - "id" : "Jan Krnavek", "data" : [ [ "Raku", 1 ] - ] + ], + "id" : "Jan Krnavek", + "name" : "Jan Krnavek" }, { - "name" : "Jorg Sommrey", "id" : "Jorg Sommrey", "data" : [ [ "Perl", 2 ] - ] + ], + "name" : "Jorg Sommrey" }, { + "id" : "Julien Fiegehenn", "data" : [ [ "Perl", 2 ] ], - "id" : "Julien Fiegehenn", "name" : "Julien Fiegehenn" }, { + "id" : "Laurent Rosenfeld", "data" : [ [ "Perl", @@ -188,28 +196,27 @@ 1 ] ], - "id" : "Laurent Rosenfeld", "name" : "Laurent Rosenfeld" }, { - "id" : "Lubos Kolouch", "data" : [ [ "Perl", 1 ] ], + "id" : "Lubos Kolouch", "name" : "Lubos Kolouch" }, { - "name" : "Luca Ferrari", "id" : "Luca Ferrari", "data" : [ [ "Raku", 2 ] - ] + ], + "name" : "Luca Ferrari" }, { "name" : "Mark Anderson", @@ -252,27 +259,27 @@ "name" : "Mohammad S Anwar" }, { - "name" : "Niels van Dijke", - "id" : "Niels van Dijke", "data" : [ [ "Perl", 2 ] - ] + ], + "id" : "Niels van Dijke", + "name" : "Niels van Dijke" }, { + "id" : "Paulo Custodio", "data" : [ [ "Perl", 2 ] ], - "id" : "Paulo Custodio", "name" : "Paulo Custodio" }, { - "id" : "Peter Campbell Smith", + "name" : "Peter Campbell Smith", "data" : [ [ "Perl", @@ -283,7 +290,7 @@ 1 ] ], - "name" : "Peter Campbell Smith" + "id" : "Peter Campbell Smith" }, { "name" : "PokGoPun", @@ -296,18 +303,17 @@ ] }, { - "name" : "Rick Bychowski", + "id" : "Rick Bychowski", "data" : [ [ "Raku", 2 ] ], - "id" : "Rick Bychowski" + "name" : "Rick Bychowski" }, { "name" : "Robert DiCicco", - "id" : "Robert DiCicco", "data" : [ [ "Perl", @@ -317,7 +323,8 @@ "Raku", 1 ] - ] + ], + "id" : "Robert DiCicco" }, { "id" : "Robert Ransbottom", @@ -349,6 +356,7 @@ }, { "name" : "Ryan Thompson", + "id" : "Ryan Thompson", "data" : [ [ "Perl", @@ -358,11 +366,10 @@ "Blog", 2 ] - ], - "id" : "Ryan Thompson" + ] }, { - "name" : "Ulrich Rieke", + "id" : "Ulrich Rieke", "data" : [ [ "Perl", @@ -373,11 +380,10 @@ 2 ] ], - "id" : "Ulrich Rieke" + "name" : "Ulrich Rieke" }, { "name" : "W. Luis Mochan", - "id" : "W. Luis Mochan", "data" : [ [ "Perl", @@ -387,48 +393,50 @@ "Blog", 1 ] - ] + ], + "id" : "W. Luis Mochan" } ] }, - "subtitle" : { - "text" : "[Champions: 31] Last updated at 2022-05-01 23:41:38 GMT" + "legend" : { + "enabled" : 0 + }, + "xAxis" : { + "type" : "category" + }, + "title" : { + "text" : "The Weekly Challenge - 162" }, "plotOptions" : { "series" : { + "borderWidth" : 0, "dataLabels" : { "enabled" : 1, "format" : "{point.y}" - }, - "borderWidth" : 0 + } } }, "tooltip" : { + "pointFormat" : "<span style='color:{point.color}'>{point.name}</span>: <b>{point.y:f}</b><br/>", "headerFormat" : "<span style='font-size:11px'>{series.name}</span><br/>", - "followPointer" : 1, - "pointFormat" : "<span style='color:{point.color}'>{point.name}</span>: <b>{point.y:f}</b><br/>" - }, - "legend" : { - "enabled" : 0 + "followPointer" : 1 }, "series" : [ { - "name" : "The Weekly Challenge - 162", - "colorByPoint" : 1, "data" : [ { - "y" : 3, "name" : "Adam Russell", + "y" : 3, "drilldown" : "Adam Russell" }, { - "drilldown" : "Alexander Pankoff", + "y" : 2, "name" : "Alexander Pankoff", - "y" : 2 + "drilldown" : "Alexander Pankoff" }, { - "y" : 3, "name" : "Arne Sommer", + "y" : 3, "drilldown" : "Arne Sommer" }, { @@ -452,9 +460,9 @@ "y" : 3 }, { - "drilldown" : "Duncan C. White", + "name" : "Duncan C. White", "y" : 2, - "name" : "Duncan C. White" + "drilldown" : "Duncan C. White" }, { "y" : 2, @@ -462,9 +470,14 @@ "drilldown" : "E. Choroba" }, { - "drilldown" : "James Smith", + "y" : 6, + "name" : "Flavio Poletti", + "drilldown" : "Flavio Poletti" + }, + { "y" : 3, - "name" : "James Smith" + "name" : "James Smith", + "drilldown" : "James Smith" }, { "drilldown" : "Jan Krnavek", @@ -477,39 +490,39 @@ "y" : 2 }, { - "y" : 2, "name" : "Julien Fiegehenn", + "y" : 2, "drilldown" : "Julien Fiegehenn" }, { - "drilldown" : "Laurent Rosenfeld", "y" : 5, - "name" : "Laurent Rosenfeld" + "name" : "Laurent Rosenfeld", + "drilldown" : "Laurent Rosenfeld" }, { + "drilldown" : "Lubos Kolouch", "y" : 1, - "name" : "Lubos Kolouch", - "drilldown" : "Lubos Kolouch" + "name" : "Lubos Kolouch" }, { - "drilldown" : "Luca Ferrari", + "y" : 2, "name" : "Luca Ferrari", - "y" : 2 + "drilldown" : "Luca Ferrari" }, { "drilldown" : "Mark Anderson", - "name" : "Mark Anderson", - "y" : 2 + "y" : 2, + "name" : "Mark Anderson" }, { + "drilldown" : "Marton Polgar", "y" : 2, - "name" : "Marton Polgar", - "drilldown" : "Marton Polgar" + "name" : "Marton Polgar" }, { - "name" : "Matthew Neleigh", + "drilldown" : "Matthew Neleigh", "y" : 2, - "drilldown" : "Matthew Neleigh" + "name" : "Matthew Neleigh" }, { "drilldown" : "Mohammad S Anwar", @@ -517,29 +530,29 @@ "y" : 1 }, { - "drilldown" : "Niels van Dijke", + "y" : 2, "name" : "Niels van Dijke", - "y" : 2 + "drilldown" : "Niels van Dijke" }, { - "y" : 2, "name" : "Paulo Custodio", + "y" : 2, "drilldown" : "Paulo Custodio" }, { - "drilldown" : "Peter Campbell Smith", "name" : "Peter Campbell Smith", - "y" : 3 + "y" : 3, + "drilldown" : "Peter Campbell Smith" }, { - "y" : 2, "name" : "PokGoPun", + "y" : 2, "drilldown" : "PokGoPun" }, { - "drilldown" : "Rick Bychowski", + "y" : 2, "name" : "Rick Bychowski", - "y" : 2 + "drilldown" : "Rick Bychowski" }, { "name" : "Robert DiCicco", @@ -557,21 +570,31 @@ "y" : 5 }, { - "name" : "Ryan Thompson", + "drilldown" : "Ryan Thompson", "y" : 4, - "drilldown" : "Ryan Thompson" + "name" : "Ryan Thompson" }, { - "name" : "Ulrich Rieke", + "drilldown" : "Ulrich Rieke", "y" : 3, - "drilldown" : "Ulrich Rieke" + "name" : "Ulrich Rieke" }, { "drilldown" : "W. Luis Mochan", - "y" : 3, - "name" : "W. Luis Mochan" + "name" : "W. Luis Mochan", + "y" : 3 } - ] + ], + "colorByPoint" : 1, + "name" : "The Weekly Challenge - 162" } - ] + ], + "yAxis" : { + "title" : { + "text" : "Total Solutions" + } + }, + "subtitle" : { + "text" : "[Champions: 32] Last updated at 2022-05-02 03:30:20 GMT" + } } diff --git a/stats/pwc-language-breakdown-summary.json b/stats/pwc-language-breakdown-summary.json index a696ca667f..b67cca2acb 100644 --- a/stats/pwc-language-breakdown-summary.json +++ b/stats/pwc-language-breakdown-summary.json @@ -1,62 +1,62 @@ { - "yAxis" : { - "min" : 0, - "title" : { - "text" : null - } - }, "title" : { "text" : "The Weekly Challenge Contributions [2019 - 2022]" }, - "xAxis" : { - "type" : "category", - "labels" : { - "style" : { - "fontFamily" : "Verdana, sans-serif", - "fontSize" : "13px" - } - } - }, - "chart" : { - "type" : "column" - }, "tooltip" : { "pointFormat" : "<b>{point.y:.0f}</b>" }, - "subtitle" : { - "text" : "Last updated at 2022-05-01 23:41:37 GMT" + "yAxis" : { + "min" : 0, + "title" : { + "text" : null + } }, "series" : [ { "dataLabels" : { + "rotation" : -90, + "y" : 10, "style" : { - "fontSize" : "13px", - "fontFamily" : "Verdana, sans-serif" + "fontFamily" : "Verdana, sans-serif", + "fontSize" : "13px" }, - "rotation" : -90, "align" : "right", "format" : "{point.y:.0f}", - "enabled" : "true", "color" : "#FFFFFF", - "y" : 10 + "enabled" : "true" }, "name" : "Contributions", "data" : [ [ "Blog", - 2485 + 2487 ], [ "Perl", - 7920 + 7922 ], [ "Raku", - 4693 + 4695 ] ] } ], + "subtitle" : { + "text" : "Last updated at 2022-05-02 03:30:20 GMT" + }, + "chart" : { + "type" : "column" + }, + "xAxis" : { + "labels" : { + "style" : { + "fontFamily" : "Verdana, sans-serif", + "fontSize" : "13px" + } + }, + "type" : "category" + }, "legend" : { "enabled" : "false" } diff --git a/stats/pwc-language-breakdown.json b/stats/pwc-language-breakdown.json index 748926ae98..62a08b85ad 100644 --- a/stats/pwc-language-breakdown.json +++ b/stats/pwc-language-breakdown.json @@ -1,18 +1,7 @@ { - "xAxis" : { - "type" : "category" - }, "chart" : { "type" : "column" }, - "title" : { - "text" : "The Weekly Challenge Language" - }, - "yAxis" : { - "title" : { - "text" : "Total Solutions" - } - }, "drilldown" : { "series" : [ { @@ -52,8 +41,6 @@ "name" : "002" }, { - "name" : "003", - "id" : "003", "data" : [ [ "Perl", @@ -67,10 +54,11 @@ "Blog", 9 ] - ] + ], + "id" : "003", + "name" : "003" }, { - "name" : "004", "id" : "004", "data" : [ [ @@ -85,10 +73,10 @@ "Blog", 10 ] - ] + ], + "name" : "004" }, { - "name" : "005", "id" : "005", "data" : [ [ @@ -103,7 +91,8 @@ "Blog", 12 ] - ] + ], + "name" : "005" }, { "name" : "006", @@ -124,6 +113,7 @@ "id" : "006" }, { + "id" : "007", "data" : [ [ "Perl", @@ -138,11 +128,10 @@ 10 ] ], - "id" : "007", "name" : "007" }, { - "name" : "008", + "id" : "008", "data" : [ [ "Perl", @@ -157,10 +146,10 @@ 12 ] ], - "id" : "008" + "name" : "008" }, { - "id" : "009", + "name" : "009", "data" : [ [ "Perl", @@ -175,10 +164,10 @@ 13 ] ], - "name" : "009" + "id" : "009" }, { - "name" : "010", + "id" : "010", "data" : [ [ "Perl", @@ -193,10 +182,9 @@ 11 ] ], - "id" : "010" + "name" : "010" }, { - "name" : "011", "id" : "011", "data" : [ [ @@ -211,11 +199,10 @@ "Blog", 10 ] - ] + ], + "name" : "011" }, { - "name" : "012", - "id" : "012", "data" : [ [ "Perl", @@ -229,9 +216,12 @@ "Blog", 11 ] - ] + ], + "id" : "012", + "name" : "012" }, { + "name" : "013", "id" : "013", "data" : [ [ @@ -246,11 +236,11 @@ "Blog", 13 ] - ], - "name" : "013" + ] }, { "name" : "014", + "id" : "014", "data" : [ [ "Perl", @@ -264,11 +254,9 @@ "Blog", 15 ] - ], - "id" : "014" + ] }, { - "id" : "015", "data" : [ [ "Perl", @@ -283,6 +271,7 @@ 15 ] ], + "id" : "015", "name" : "015" }, { @@ -304,6 +293,7 @@ "name" : "016" }, { + "id" : "017", "data" : [ [ "Perl", |
