diff options
| author | Paulo Custodio <pauloscustodio@gmail.com> | 2021-06-17 20:40:52 +0100 |
|---|---|---|
| committer | Paulo Custodio <pauloscustodio@gmail.com> | 2021-06-17 20:40:52 +0100 |
| commit | 5ad4aad68bdb8b1924f7c4425cd3399d1de41e86 (patch) | |
| tree | af1c675686d406ea7ac4414c0ba54ca473757c63 | |
| parent | 696df97d9f945d7771d40fbfa848aaccfb37200f (diff) | |
| parent | 8282732f9a1003fc54c012c601d85b3451a9f8fc (diff) | |
| download | perlweeklychallenge-club-5ad4aad68bdb8b1924f7c4425cd3399d1de41e86.tar.gz perlweeklychallenge-club-5ad4aad68bdb8b1924f7c4425cd3399d1de41e86.tar.bz2 perlweeklychallenge-club-5ad4aad68bdb8b1924f7c4425cd3399d1de41e86.zip | |
Merge remote-tracking branch 'upstream/master'
| -rwxr-xr-x | challenge-117/jo-37/perl/ch-1.pl | 139 | ||||
| -rwxr-xr-x | challenge-117/jo-37/perl/ch-2.pl | 209 | ||||
| -rw-r--r-- | stats/pwc-current.json | 212 | ||||
| -rw-r--r-- | stats/pwc-language-breakdown-summary.json | 68 | ||||
| -rw-r--r-- | stats/pwc-language-breakdown.json | 860 | ||||
| -rw-r--r-- | stats/pwc-leaders.json | 756 | ||||
| -rw-r--r-- | stats/pwc-summary-1-30.json | 40 | ||||
| -rw-r--r-- | stats/pwc-summary-121-150.json | 38 | ||||
| -rw-r--r-- | stats/pwc-summary-151-180.json | 96 | ||||
| -rw-r--r-- | stats/pwc-summary-181-210.json | 122 | ||||
| -rw-r--r-- | stats/pwc-summary-211-240.json | 58 | ||||
| -rw-r--r-- | stats/pwc-summary-31-60.json | 118 | ||||
| -rw-r--r-- | stats/pwc-summary-61-90.json | 32 | ||||
| -rw-r--r-- | stats/pwc-summary-91-120.json | 108 | ||||
| -rw-r--r-- | stats/pwc-summary.json | 52 |
15 files changed, 1643 insertions, 1265 deletions
diff --git a/challenge-117/jo-37/perl/ch-1.pl b/challenge-117/jo-37/perl/ch-1.pl new file mode 100755 index 0000000000..ad21fc4e73 --- /dev/null +++ b/challenge-117/jo-37/perl/ch-1.pl @@ -0,0 +1,139 @@ +#!/usr/bin/perl -s + +use v5.16; +use Test2::V0; +use warnings; +use autodie; +use experimental 'signatures'; + +our ($tests, $examples, $rows); + +run_tests() if $tests || $examples; # does not return + +die <<EOS unless @ARGV && $rows; +usage: $0 [-examples] [-tests] [-rows=n filename] + +-examples + run the examples from the challenge + +-tests + run some tests + +-rows=n + expect n rows in the given file + +filename + filename containing numbered rows + +EOS + + +### Input and Output + +say join "\n", @{find_missing_rows(*ARGV{IO}, $rows)}; + + +### Implementation + +# The task is certainly over-determined: +# - There are 14 rows of data. +# - It's stated that rows are numbered 1 to 15. +# - It's stated that one row would be missing. +# Either the specification of the number of missing rows or the desired +# number of rows is superfluous. Ignoring the number of missing rows +# here. +# Note: Ignoring both the number of rows *and* the number of missing +# rows prevents the determination of a missing last row. +sub find_missing_rows ($fh, $rows) { + my %rows; + @rows{1 .. $rows} = (1 .. $rows); + # Row numbers shall be separated with a comma from the rest of the + # row and may have leading zeros. + delete @rows{do {local $/; <$fh> =~ /^0*(\d+)(?=,)/mg}}; + + [sort {$a <=> $b} values %rows]; +} + +### Examples and tests + +sub run_tests { + SKIP: { + skip "examples" unless $examples; + + open my $fh, '<', \(<<EOS =~ s/^ +//gmr); + 11, Line Eleven + 1, Line one + 9, Line Nine + 13, Line Thirteen + 2, Line two + 6, Line Six + 8, Line Eight + 10, Line Ten + 7, Line Seven + 4, Line Four + 14, Line Fourteen + 3, Line three + 15, Line Fifteen + 5, Line Five +EOS + is find_missing_rows($fh, 15), [12], 'example'; + close $fh; + + } + + SKIP: { + skip "tests" unless $tests; + + my $fh; + + open $fh, '<', \(<<EOS =~ s/^ +//gmr); + 2, Line two + 3, Line three +EOS + is find_missing_rows($fh, 3), [1], 'missing first row'; + close $fh; + + open $fh, '<', \(<<EOS =~ s/^ +//gmr); + 1, Line one + 2, Line two +EOS + is find_missing_rows($fh, 3), [3], 'missing last row'; + close $fh; + + open $fh, '<', \(<<EOS =~ s/^ +//gmr); + 1, Line one + 2, Line two + 3, Line three +EOS + is find_missing_rows($fh, 3), [], 'nothing missing'; + close $fh; + + open $fh, '<', \(<<EOS =~ s/^ +//gmr); + 01, Line one + 02, Line two + 03, Line three +EOS + is find_missing_rows($fh, 3), [], 'leading zeros'; + close $fh; + + open $fh, '<', \(<<EOS =~ s/^ +//gmr); + 1, Line one + 3, Line three + 5, Line Five +EOS + is find_missing_rows($fh, 5), [2, 4], 'multiple missing rows'; + close $fh; + + open $fh, '<', \(<<EOS =~ s/^ +//gmr); + 1, Line one + 2 Line two + 3, Line three +EOS + is find_missing_rows($fh, 3), [2], 'malformed line number'; + close $fh; + + } + + done_testing; + exit; +} diff --git a/challenge-117/jo-37/perl/ch-2.pl b/challenge-117/jo-37/perl/ch-2.pl new file mode 100755 index 0000000000..4ad624017c --- /dev/null +++ b/challenge-117/jo-37/perl/ch-2.pl @@ -0,0 +1,209 @@ +#!/usr/bin/perl -s + +use v5.16; +use Test2::V0; +use Graph; +use experimental qw(signatures postderef); + +our ($tests, $examples, $triangle, $from, $to); + +run_tests() if $tests || $examples; # does not return + +die <<EOS unless @ARGV && defined($from) && defined($to) || $triangle; +usage: $0 [-examples] [-tests] [-triangle=n | -from=v_f -to=v_t edge ...] + +-examples + run the examples from the challenge + +-tests + run some tests + +-triangle=n + build triangular graph having size n + +-from=v_f + use v_f as starting vertex + +-to=v_t + use v_t as ending vertex + +edge ... + specify the graph by its edges. Each edge has the form + 'h-t-l' with 'h' as the head vertex, 't' as the tail vertex and + 'l' as the edge label. + + Example 1 may have these vertex assignments: + + a + ⇙ ⇘ + b ⇒ c + ⇙ ⇘ ⇙ ⇘ + d ⇒ e ⇒ f + + and it may be run as: + + $0 -from=a -to=f a-b-L a-c-R b-c-H b-d-L b-e-R c-e-L c-f-R d-e-H e-f-H + + or simply: + + $0 -triangle=2 + +EOS + + +### Input and Output + +my $g; +if ($triangle) { + $g = graph_from_edges(triangle($triangle)); + $from = "0 0"; + $to = "$triangle $triangle"; +} else { + $g = graph_from_edges([@ARGV]); +} + +say "@{paths_from_to($g, $from, $to)}"; + + +### Implementation + +# For a highly regular graph as given in the task there is certainly a +# pattern in the solution that permits its straight construction. As a +# lame excuse for not searching for such pattern, I'm going to solve a +# more general task. +# Considering a directed acyclic graph (DAG) with labeled edges. +# Then find all paths between a given start and end vertex and print the +# concatenated edge labels for every path. +# +# This easily earns the N=10-bonus. +# +# Having implemented the lazy solution, it provides the sequence of +# the count of possible paths for a given triangle size as: +# 2, 6, 22, 90, 394, 1806,... +# Consulting OEIS reveals this sequence as the "Large Schröder Numbers". +# See http://oeis.org/A006318 and +# https://en.wikipedia.org/wiki/Schröder_number. Not even thinking +# about generating the 17518619320890 paths for N=20. + +# Find all paths in the given DAG starting in vertex $from and ending in +# vertex $to and collect the concatenated edges' labels. +sub paths_from_to ($g, $from, $to) { + # Apply a single empty prefix to the start vertex. + my %paths = ($from => ['']); + # Process vertices in topological order. + for my $vertex ($g->topological_sort) { + # At the end vertex all paths from the start vertex are known + # due to the topological ordering. + return $paths{$vertex} if $vertex eq $to; + # For every outgoing edge append the edge's label to the label + # sequence for all paths leading to the current vertex and then + # append this list to the path list for the edge's tail vertex. + # This is a no-op until the start vertex is hit. + for my $succ ($g->successors($vertex)) { + my $label = $g->get_edge_attribute($vertex, $succ, 'label'); + push $paths{$succ}->@*, map $_ . $label, $paths{$vertex}->@*; + } + } +} + +# Build a graph from its labeled edges. Edges are expected in the +# form "h-t-l" with "h" as the head vertex, "t" as the tail vertex and +# "l" as the label. +sub graph_from_edges ($edges) { + my $g = Graph->new; + for (@$edges) { + my ($h, $t, $l) = split /-/; + $g->set_edge_attribute($h, $t, label => $l); + } + die "not a DAG\n" unless $g->is_dag; + + $g; +} + +# Generate the edges for a triangular graph of size $n according to the +# task. Edges have the form "head-tail-label", vertices have the form +# "row col" +sub triangle ($n) { + my @edges; + for my $row (0 .. $n) { + for my $col (0 .. $row) { + my @vert = ($row, $col); + if ($col < $row) { + my @horiz = ($row, $col + 1); + push @edges, "@vert-@horiz-H"; + } + if ($row < $n) { + my @left = ($row + 1, $col); + my @right = ($row + 1, $col + 1); + push @edges, "@vert-@left-L", "@vert-@right-R"; + } + } + } + + \@edges; +} + +### Examples and tests + +sub run_tests { + SKIP: { + skip "examples" unless $examples; + + is paths_from_to(graph_from_edges(triangle(2)), '0 0', '2 2'), + bag { + item 'RR'; + item 'LHR'; + item 'LRH'; + item 'RLH'; + item 'LHLH'; + item 'LLHH'; + end; + }, 'example 1'; + + is paths_from_to(graph_from_edges(triangle(1)), '0 0', '1 1'), + bag { + item 'R'; + item 'LH'; + end; + }, 'example 2'; + + is scalar(@{paths_from_to( + graph_from_edges(triangle(10)), '0 0', '10 10')} + ), 1037718, 'N=10'; + + + } + + SKIP: { + skip "tests" unless $tests; + +# A less regular DAG as a test object with two source vertices. +# +# a +# ⇙ ⇘ +# b c d +# ⇙ ⇘ ⇙ ⇘ ⇙ ⇘ +# e ⇐ f g ⇐ h +# ⇘ ⇙ ⇘ ⇙ ⇘ ⇙ +# i j k +# ⇘ ⇙ +# l + + my $g = graph_from_edges([qw( + a-b-L a-c-R + b-e-L b-f-R c-f-L c-g-R d-g-L d-h-R + e-i-R f-e-H f-i-L f-j-R g-j-L g-k-R h-g-H h-k-L + i-l-R j-l-L)]); + + is paths_from_to($g, 'a', 'k'), ['RRR'], 'unique path'; + is paths_from_to($g, 'b', 'k'), [], 'not reachable'; + is paths_from_to($g, 'j', 'c'), [], 'out of topological order'; + + like dies {graph_from_edges([qw(a-b-D b-a-U)])}, qr/not a DAG/, + 'not a directed acyclic graph'; + + } + + done_testing; + exit; +} diff --git a/stats/pwc-current.json b/stats/pwc-current.json index efa74665e2..0f39979c6e 100644 --- a/stats/pwc-current.json +++ b/stats/pwc-current.json @@ -1,32 +1,28 @@ { - "tooltip" : { - "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/>" - }, "drilldown" : { "series" : [ { + "id" : "Abigail", "data" : [ [ "Perl", 2 ] ], - "name" : "Abigail", - "id" : "Abigail" + "name" : "Abigail" }, { + "name" : "Cheok-Yin Fung", + "id" : "Cheok-Yin Fung", "data" : [ [ "Perl", 2 ] - ], - "name" : "Cheok-Yin Fung", - "id" : "Cheok-Yin Fung" + ] }, { + "name" : "Dave Jacoby", "data" : [ [ "Perl", @@ -37,21 +33,21 @@ 2 ] ], - "name" : "Dave Jacoby", "id" : "Dave Jacoby" }, { - "id" : "Feng Chang", "name" : "Feng Chang", "data" : [ [ "Raku", 2 ] - ] + ], + "id" : "Feng Chang" }, { "name" : "Flavio Poletti", + "id" : "Flavio Poletti", "data" : [ [ "Perl", @@ -65,20 +61,30 @@ "Blog", 2 ] - ], - "id" : "Flavio Poletti" + ] }, { - "id" : "James Smith", "data" : [ [ "Perl", 2 ] ], + "id" : "James Smith", "name" : "James Smith" }, { + "id" : "Jorg Sommrey", + "data" : [ + [ + "Perl", + 2 + ] + ], + "name" : "Jorg Sommrey" + }, + { + "name" : "Luca Ferrari", "id" : "Luca Ferrari", "data" : [ [ @@ -89,51 +95,60 @@ "Blog", 2 ] - ], - "name" : "Luca Ferrari" + ] }, { - "name" : "Lucas Ransan", + "id" : "Lucas Ransan", "data" : [ [ "Raku", 2 ] ], - "id" : "Lucas Ransan" + "name" : "Lucas Ransan" }, { + "id" : "Mark Anderson", "data" : [ [ "Raku", 2 ] ], - "name" : "Mark Anderson", - "id" : "Mark Anderson" + "name" : "Mark Anderson" }, { - "id" : "Mohammad S Anwar", "name" : "Mohammad S Anwar", "data" : [ [ "Perl", 1 ] - ] + ], + "id" : "Mohammad S Anwar" }, { - "id" : "Niels van Dijke", "data" : [ [ "Perl", 2 ] ], + "id" : "Niels van Dijke", "name" : "Niels van Dijke" }, { - "name" : "Roger Bell_West", + "name" : "Paulo Custodio", + "id" : "Paulo Custodio", + "data" : [ + [ + "Perl", + 2 + ] + ] + }, + { + "id" : "Roger Bell_West", "data" : [ [ "Perl", @@ -148,10 +163,9 @@ 1 ] ], - "id" : "Roger Bell_West" + "name" : "Roger Bell_West" }, { - "id" : "Simon Green", "name" : "Simon Green", "data" : [ [ @@ -162,31 +176,30 @@ "Blog", 1 ] - ] + ], + "id" : "Simon Green" }, { - "id" : "Simon Proctor", + "name" : "Simon Proctor", "data" : [ [ "Raku", 2 ] ], - "name" : "Simon Proctor" + "id" : "Simon Proctor" }, { - "id" : "Steven Wilson", - "name" : "Steven Wilson", "data" : [ [ "Perl", 1 ] - ] + ], + "id" : "Steven Wilson", + "name" : "Steven Wilson" }, { - "id" : "Stuart Little", - "name" : "Stuart Little", "data" : [ [ "Perl", @@ -196,16 +209,18 @@ "Raku", 2 ] - ] + ], + "id" : "Stuart Little", + "name" : "Stuart Little" }, { - "id" : "Ulrich Rieke", "data" : [ [ "Perl", 2 ] ], + "id" : "Ulrich Rieke", "name" : "Ulrich Rieke" }, { @@ -219,6 +234,8 @@ "name" : "Vinod Kumar K" }, { + "name" : "W. Luis Mochan", + "id" : "W. Luis Mochan", "data" : [ [ "Perl", @@ -228,58 +245,55 @@ "Blog", 1 ] - ], - "name" : "W. Luis Mochan", - "id" : "W. Luis Mochan" + ] } ] }, - "plotOptions" : { - "series" : { - "dataLabels" : { - "format" : "{point.y}", - "enabled" : 1 - }, - "borderWidth" : 0 - } - }, - "subtitle" : { - "text" : "[Champions: 19] Last updated at 2021-06-16 18:51:59 GMT" - }, "title" : { "text" : "Perl Weekly Challenge - 117" }, + "subtitle" : { + "text" : "[Champions: 21] Last updated at 2021-06-17 15:58:11 GMT" + }, "chart" : { "type" : "column" }, - "legend" : { - "enabled" : 0 - }, - "xAxis" : { - "type" : "category" - }, "yAxis" : { "title" : { "text" : "Total Solutions" } }, + "plotOptions" : { + "series" : { + "borderWidth" : 0, + "dataLabels" : { + "enabled" : 1, + "format" : "{point.y}" + } + } + }, + "xAxis" : { + "type" : "category" + }, "series" : [ { + "colorByPoint" : 1, + "name" : "Perl Weekly Challenge - 117", "data" : [ { - "y" : 2, "drilldown" : "Abigail", + "y" : 2, "name" : "Abigail" }, { "drilldown" : "Cheok-Yin Fung", - "name" : "Cheok-Yin Fung", - "y" : 2 + "y" : 2, + "name" : "Cheok-Yin Fung" }, { - "y" : 4, + "drilldown" : "Dave Jacoby", "name" : "Dave Jacoby", - "drilldown" : "Dave Jacoby" + "y" : 4 }, { "y" : 2, @@ -287,83 +301,99 @@ "drilldown" : "Feng Chang" }, { + "drilldown" : "Flavio Poletti", "y" : 6, - "name" : "Flavio Poletti", - "drilldown" : "Flavio Poletti" + "name" : "Flavio Poletti" }, { - "name" : "James Smith", "drilldown" : "James Smith", + "name" : "James Smith", "y" : 2 }, { + "drilldown" : "Jorg Sommrey", + "y" : 2, + "name" : "Jorg Sommrey" + }, + { "y" : 4, "name" : "Luca Ferrari", "drilldown" : "Luca Ferrari" }, { + "name" : "Lucas Ransan", "y" : 2, - "drilldown" : "Lucas Ransan", - "name" : "Lucas Ransan" + "drilldown" : "Lucas Ransan" }, { "y" : 2, - "drilldown" : "Mark Anderson", - "name" : "Mark Anderson" + "name" : "Mark Anderson", + "drilldown" : "Mark Anderson" }, { - "y" : 1, "drilldown" : "Mohammad S Anwar", - "name" : "Mohammad S Anwar" + "name" : "Mohammad S Anwar", + "y" : 1 }, { "y" : 2, - "drilldown" : "Niels van Dijke", - "name" : "Niels van Dijke" + "name" : "Niels van Dijke", + "drilldown" : "Niels van Dijke" + }, + { + "drilldown" : "Paulo Custodio", + "name" : "Paulo Custodio", + "y" : 2 }, { + "name" : "Roger Bell_West", "y" : 5, - "drilldown" : "Roger Bell_West", - "name" : "Roger Bell_West" + "drilldown" : "Roger Bell_West" }, { - "y" : 3, "drilldown" : "Simon Green", + "y" : 3, "name" : "Simon Green" }, { - "y" : 2, "drilldown" : "Simon Proctor", + "y" : 2, "name" : "Simon Proctor" }, { - "name" : "Steven Wilson", "drilldown" : "Steven Wilson", + "name" : "Steven Wilson", "y" : 1 }, { + "name" : "Stuart Little", "y" : 4, - "drilldown" : "Stuart Little", - "name" : "Stuart Little" + "drilldown" : "Stuart Little" }, { "name" : "Ulrich Rieke", - "drilldown" : "Ulrich Rieke", - "y" : 2 + "y" : 2, + "drilldown" : "Ulrich Rieke" }, { - "y" : 1, "drilldown" : "Vinod Kumar K", + "y" : 1, "name" : "Vinod Kumar K" }, { + "drilldown" : "W. Luis Mochan", "y" : 3, - "name" : "W. Luis Mochan", - "drilldown" : "W. Luis Mochan" + "name" : "W. Luis Mochan" } - ], - "name" : "Perl Weekly Challenge - 117", - "colorByPoint" : 1 + ] } - ] + ], + "tooltip" : { + "followPointer" : 1, + "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/>" + }, + "legend" : { + "enabled" : 0 + } } diff --git a/stats/pwc-language-breakdown-summary.json b/stats/pwc-language-breakdown-summary.json index 24c36ced60..4d05d2fe44 100644 --- a/stats/pwc-language-breakdown-summary.json +++ b/stats/pwc-language-breakdown-summary.json @@ -1,24 +1,48 @@ { + "title" : { + "text" : "Perl Weekly Challenge Contributions [2019 - 2020]" + }, "yAxis" : { + "min" : 0, "title" : { "text" : null - }, - "min" : 0 + } + }, + "chart" : { + "type" : "column" + }, + "subtitle" : { + "text" : "Last updated at 2021-06-17 15:58:11 GMT" + }, + "xAxis" : { + "type" : "category", + "labels" : { + "style" : { + "fontSize" : "13px", + "fontFamily" : "Verdana, sans-serif" + } + } + }, + "legend" : { + "enabled" : "false" + }, + "tooltip" : { + "pointFormat" : "<b>{point.y:.0f}</b>" }, "series" : [ { "name" : "Contributions", "dataLabels" : { + "color" : "#FFFFFF", + "y" : 10, "format" : "{point.y:.0f}", + "align" : "right", + "rotation" : -90, + "enabled" : "true", "style" : { "fontSize" : "13px", "fontFamily" : "Verdana, sans-serif" - }, - "y" : 10, - "align" : "right", - "color" : "#FFFFFF", - "enabled" : "true", - "rotation" : -90 + } }, "data" : [ [ @@ -27,7 +51,7 @@ ], [ "Perl", - 5545 + 5549 ], [ "Raku", @@ -35,29 +59,5 @@ ] ] } - ], - "legend" : { - "enabled" : "false" - }, - "xAxis" : { - "type" : "category", - "labels" : { - "style" : { - "fontSize" : "13px", - "fontFamily" : "Verdana, sans-serif" - } - } - }, - "chart" : { - "type" : "column" - }, - "title" : { - "text" : "Perl Weekly Challenge Contributions [2019 - 2020]" - }, - "subtitle" : { - "text" : "Last updated at 2021-06-16 18:51:59 GMT" - }, - "tooltip" : { - "pointFormat" : "<b>{point.y:.0f}</b>" - } + ] } diff --git a/stats/pwc-language-breakdown.json b/stats/pwc-language-breakdown.json index 883d58ff6f..a0161bd679 100644 --- a/stats/pwc-language-breakdown.json +++ b/stats/pwc-language-breakdown.json @@ -2,14 +2,11 @@ "title" : { "text" : "Perl Weekly Challenge Language" }, - "chart" : { - "type" : "column" - }, "drilldown" : { "series" : [ { - "id" : "001", "name" : "001", + "id" : "001", "data" : [ [ "Perl", @@ -26,6 +23,7 @@ ] }, { + "name" : "002", "id" : "002", "data" : [ [ @@ -40,10 +38,11 @@ "Blog", 10 ] - ], - "name" : "002" + ] }, { + "name" : "003", + "id" : "003", "data" : [ [ "Perl", @@ -57,12 +56,10 @@ "Blog", 9 ] - ], - "name" : "003", - "id" : "003" + ] }, { - "name" : "004", + "id" : "004", "data" : [ [ "Perl", @@ -77,10 +74,10 @@ 10 ] ], - "id" : "004" + "name" : "004" }, { - "name" : "005", + "id" : "005", "data" : [ [ "Perl", @@ -95,10 +92,11 @@ 12 ] ], - "id" : "005" + "name" : "005" }, { "name" : "006", + "id" : "006", "data" : [ [ "Perl", @@ -112,12 +110,10 @@ "Blog", 7 ] - ], - "id" : "006" + ] }, { "id" : "007", - "name" : "007", "data" : [ [ "Perl", @@ -131,11 +127,10 @@ "Blog", 10 ] - ] + ], + "name" : "007" }, { - "id" : "008", - "name" : "008", "data" : [ [ "Perl", @@ -149,11 +144,12 @@ "Blog", 12 ] - ] + ], + "id" : "008", + "name" : "008" }, { "id" : "009", - "name" : "009", "data" : [ [ "Perl", @@ -167,9 +163,11 @@ "Blog", 13 ] - ] + ], + "name" : "009" }, { + "name" : "010", "data" : [ [ "Perl", @@ -184,11 +182,9 @@ 11 ] ], - "name" : "010", "id" : "010" }, { - "id" : "011", "data" : [ [ "Perl", @@ -203,10 +199,11 @@ 10 ] ], |
