diff options
| author | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2019-07-25 23:48:14 +0100 |
|---|---|---|
| committer | Mohammad S Anwar <mohammad.anwar@yahoo.com> | 2019-07-25 23:48:14 +0100 |
| commit | 8b31784d9239d87e9f76e1f3dffba03c885b0b4e (patch) | |
| tree | 3eb8de12d8d21a05107bf42b4dd79899817cec18 | |
| parent | a6bed07a66cbb56057aefd963a2b155d876f0235 (diff) | |
| download | perlweeklychallenge-club-8b31784d9239d87e9f76e1f3dffba03c885b0b4e.tar.gz perlweeklychallenge-club-8b31784d9239d87e9f76e1f3dffba03c885b0b4e.tar.bz2 perlweeklychallenge-club-8b31784d9239d87e9f76e1f3dffba03c885b0b4e.zip | |
- Added solutions by E. Choroba.
| -rwxr-xr-x | challenge-018/e-choroba/perl5/ch-1.pl | 24 | ||||
| -rwxr-xr-x | challenge-018/e-choroba/perl5/ch-1a.pl | 185 | ||||
| -rwxr-xr-x | challenge-018/e-choroba/perl5/ch-1b.pl | 181 | ||||
| -rw-r--r-- | stats/pwc-current.json | 135 | ||||
| -rw-r--r-- | stats/pwc-language-breakdown-summary.json | 56 | ||||
| -rw-r--r-- | stats/pwc-language-breakdown.json | 300 | ||||
| -rw-r--r-- | stats/pwc-leaders.json | 860 | ||||
| -rw-r--r-- | stats/pwc-summary-1-30.json | 124 | ||||
| -rw-r--r-- | stats/pwc-summary-31-60.json | 122 | ||||
| -rw-r--r-- | stats/pwc-summary-61-90.json | 122 | ||||
| -rw-r--r-- | stats/pwc-summary-91-120.json | 50 | ||||
| -rw-r--r-- | stats/pwc-summary.json | 262 |
12 files changed, 1218 insertions, 1203 deletions
diff --git a/challenge-018/e-choroba/perl5/ch-1.pl b/challenge-018/e-choroba/perl5/ch-1.pl new file mode 100755 index 0000000000..3bb93311c7 --- /dev/null +++ b/challenge-018/e-choroba/perl5/ch-1.pl @@ -0,0 +1,24 @@ +#!/usr/bin/perl +use warnings; +use strict; +use feature qw{ say }; + +my @longest = (""); +my $string = shift; +for my $pos (1 .. length $string) { + for my $length (1 .. 1 - $pos + length $string) { + next if $length < length $longest[0]; + + my $substr = substr $string, $pos - 1, $length; + my $found = 0; + -1 != index $_, $substr and ++$found for @ARGV; + if ($found == @ARGV) { + if ($length == length $longest[0]) { + push @longest, $substr; + } else { + @longest = $substr; + } + } + } +} +say "<$_>" for @longest; diff --git a/challenge-018/e-choroba/perl5/ch-1a.pl b/challenge-018/e-choroba/perl5/ch-1a.pl index 3bb93311c7..fcbdfc0972 100755 --- a/challenge-018/e-choroba/perl5/ch-1a.pl +++ b/challenge-018/e-choroba/perl5/ch-1a.pl @@ -3,22 +3,179 @@ use warnings; use strict; use feature qw{ say }; -my @longest = (""); -my $string = shift; -for my $pos (1 .. length $string) { - for my $length (1 .. 1 - $pos + length $string) { - next if $length < length $longest[0]; - - my $substr = substr $string, $pos - 1, $length; - my $found = 0; - -1 != index $_, $substr and ++$found for @ARGV; - if ($found == @ARGV) { - if ($length == length $longest[0]) { - push @longest, $substr; +{ package My::Node; + sub new { bless { start => $_[1], end => $_[2] }, $_[0] } + sub edge_length { + my ($self, $position) = @_; + ($self->{end} < $position + 1 + ? $self->{end} + : $position + 1 + ) - $self->{start} + } +} + +{ package My::Suffix::Tree; + + sub new { + my ($class) = @_; + bless my $self = {position => -1, + text => "", + active_edge => 0, + active_length => 0, + current_node => -1, + }, $class; + $self->{root} = $self->new_node(-1, -1); + $self->{active_node} = $self->{root}; + return $self + } + + sub add_numbers { + my ($self, $node_index) = @_; + my $node = $self->{nodes}[$node_index]; + for my $next_index (values %{ $node->{next} }) { + undef $node->{numbers}{$_} for $self->add_numbers($next_index); + } + return $node->{number} // () unless exists $node->{numbers}; + + return keys %{ $self->{numbers} } + } + + sub add_words { + my ($self, @words) = @_; + $self->{number_of_words} = @ARGV; + for my $word_index (0 .. $#words) { + $self->add_char($_) + for split //, "$words[$word_index]<$word_index>"; + } + my $text_length = length $self->{text}; + for my $node (@{ $self->{nodes} }) { + next if $node->{start} < 0; + my $text = $node->{end} > $text_length + ? substr $self->{text}, $node->{start} + : substr $self->{text}, $node->{start}, + $node->{end} - $node->{start}; + $node->{text} = $text; + if (my ($number) = $text =~ /<([0-9]+)>/) { + $node->{number} = $number; + } + } + $self->add_numbers(0); + } + + sub _add_suffix_link { + my ($self, $node) = @_; + $self->{nodes}[ $self->{need_suffix_link} ]{link} = $node + if $self->{need_suffix_link} > 0; + $self->{need_suffix_link} = $node; + } + + sub active_edge { substr $_[0]{text}, $_[0]{active_edge}, 1 } + + sub walk_down { + my ($self, $next) = @_; + $next //= 0; + my $position = $self->{position}; + if ($self->{active_length} + >= $self->{nodes}[$next]->edge_length($position) + ) { + $self->{active_edge} + += $self->{nodes}[$next]->edge_length($position); + $self->{active_length} + -= $self->{nodes}[$next]->edge_length($position); + $self->{active_node} = $next; + return 1 + } + return + } + + sub new_node { + my ($self, $start, $end) = @_; + $self->{nodes}[ ++$self->{current_node} ] + = 'My::Node'->new($start, $end); + $self->{current_node} + } + + sub add_char { + my ($self, $char) = @_; + substr $self->{text}, ++$self->{position}, 1, $char; + $self->{need_suffix_link} = -1; + ++$self->{remainder}; + while ($self->{remainder} > 0) { + $self->{active_edge} = $self->{position} + unless $self->{active_length}; + if (! exists + $self->{nodes}[ $self->{active_node} ]{next}{ $self->active_edge } + ) { + $self->{nodes}[ $self->{active_node} ] + {next}{ $self->active_edge } + = $self->new_node($self->{position}, 'INF'); + $self->_add_suffix_link($self->{active_node}); # Rule 2. + } else { + my $next = $self->{nodes}[ $self->{active_node} ] + {next}{ $self->active_edge }; + next if $self->walk_down($next); # Observation 2. + + # Observation 2. + if ($char eq substr $self->{text}, + $self->{nodes}[$next]{start} + $self->{active_length}, 1 + ) { + ++$self->{active_length}; + $self->_add_suffix_link($self->{active_node}); # Observation 3. + last + } + my $split = $self->new_node($self->{nodes}[$next]{start}, + $self->{nodes}[$next]{start} + $self->{active_length}); + $self->{nodes}[ $self->{active_node} ]{next} + { $self->active_edge } = $split; + my $leaf = $self->new_node($self->{position}, 'INF'); + $self->{nodes}[$split]{next}{$char} = $leaf; + $self->{nodes}[$next]{start} += $self->{active_length}; + $self->{nodes}[$split]{next}{ substr $self->{text}, + $self->{nodes}[$next]{start}, 1 } = $next; + $self->_add_suffix_link($split); # Rule 2. + } + -- $self->{remainder}; + + if ($self->{active_node} == $self->{root} + && $self->{active_length} > 0 # Rule 1. + ) { + --$self->{active_length}; + $self->{active_edge} + = $self->{position} - $self->{remainder} + 1; } else { - @longest = $substr; + $self->{nodes}[ $self->{active_node} ]{link} //= 0; + $self->{active_node} + = $self->{nodes}[ $self->{active_node} ]{link} > 0 + ? $self->{nodes}[ $self->{active_node} ]{link} + : $self->{root}; # Rule 3. } } } + + my @lcs; + sub longest_common_substring { + my ($self, $node_index, $string) = @_; + @lcs = ("") unless $node_index; + my $node = $self->{nodes}[$node_index]; + + if ($self->{number_of_words} == keys %{ $node->{numbers} }) { + my $compare_lengths = length $string <=> length $lcs[0]; + push @lcs, $string if $compare_lengths == 0; + @lcs = ($string) if $compare_lengths == 1; + } + + for my $next_char (keys %{ $node->{next} }) { + my $next_index = $node->{next}{$next_char}; + my $next = $self->{nodes}[$next_index]; + $self->longest_common_substring( + $next_index, + "$string$next->{text}"); + } + return @lcs + } } -say "<$_>" for @longest; + +my $o = 'My::Suffix::Tree'->new; +$o->add_words(@ARGV); + +say "<$_>" for $o->longest_common_substring(0, ""); diff --git a/challenge-018/e-choroba/perl5/ch-1b.pl b/challenge-018/e-choroba/perl5/ch-1b.pl deleted file mode 100755 index fcbdfc0972..0000000000 --- a/challenge-018/e-choroba/perl5/ch-1b.pl +++ /dev/null @@ -1,181 +0,0 @@ -#!/usr/bin/perl -use warnings; -use strict; -use feature qw{ say }; - -{ package My::Node; - sub new { bless { start => $_[1], end => $_[2] }, $_[0] } - sub edge_length { - my ($self, $position) = @_; - ($self->{end} < $position + 1 - ? $self->{end} - : $position + 1 - ) - $self->{start} - } -} - -{ package My::Suffix::Tree; - - sub new { - my ($class) = @_; - bless my $self = {position => -1, - text => "", - active_edge => 0, - active_length => 0, - current_node => -1, - }, $class; - $self->{root} = $self->new_node(-1, -1); - $self->{active_node} = $self->{root}; - return $self - } - - sub add_numbers { - my ($self, $node_index) = @_; - my $node = $self->{nodes}[$node_index]; - for my $next_index (values %{ $node->{next} }) { - undef $node->{numbers}{$_} for $self->add_numbers($next_index); - } - return $node->{number} // () unless exists $node->{numbers}; - - return keys %{ $self->{numbers} } - } - - sub add_words { - my ($self, @words) = @_; - $self->{number_of_words} = @ARGV; - for my $word_index (0 .. $#words) { - $self->add_char($_) - for split //, "$words[$word_index]<$word_index>"; - } - my $text_length = length $self->{text}; - for my $node (@{ $self->{nodes} }) { - next if $node->{start} < 0; - my $text = $node->{end} > $text_length - ? substr $self->{text}, $node->{start} - : substr $self->{text}, $node->{start}, - $node->{end} - $node->{start}; - $node->{text} = $text; - if (my ($number) = $text =~ /<([0-9]+)>/) { - $node->{number} = $number; - } - } - $self->add_numbers(0); - } - - sub _add_suffix_link { - my ($self, $node) = @_; - $self->{nodes}[ $self->{need_suffix_link} ]{link} = $node - if $self->{need_suffix_link} > 0; - $self->{need_suffix_link} = $node; - } - - sub active_edge { substr $_[0]{text}, $_[0]{active_edge}, 1 } - - sub walk_down { - my ($self, $next) = @_; - $next //= 0; - my $position = $self->{position}; - if ($self->{active_length} - >= $self->{nodes}[$next]->edge_length($position) - ) { - $self->{active_edge} - += $self->{nodes}[$next]->edge_length($position); - $self->{active_length} - -= $self->{nodes}[$next]->edge_length($position); - $self->{active_node} = $next; - return 1 - } - return - } - - sub new_node { - my ($self, $start, $end) = @_; - $self->{nodes}[ ++$self->{current_node} ] - = 'My::Node'->new($start, $end); - $self->{current_node} - } - - sub add_char { - my ($self, $char) = @_; - substr $self->{text}, ++$self->{position}, 1, $char; - $self->{need_suffix_link} = -1; - ++$self->{remainder}; - while ($self->{remainder} > 0) { - $self->{active_edge} = $self->{position} - unless $self->{active_length}; - if (! exists - $self->{nodes}[ $self->{active_node} ]{next}{ $self->active_edge } - ) { - $self->{nodes}[ $self->{active_node} ] - {next}{ $self->active_edge } - = $self->new_node($self->{position}, 'INF'); - $self->_add_suffix_link($self->{active_node}); # Rule 2. - } else { - my $next = $self->{nodes}[ $self->{active_node} ] - {next}{ $self->active_edge }; - next if $self->walk_down($next); # Observation 2. - - # Observation 2. - if ($char eq substr $self->{text}, - $self->{nodes}[$next]{start} + $self->{active_length}, 1 - ) { - ++$self->{active_length}; - $self->_add_suffix_link($self->{active_node}); # Observation 3. - last - } - my $split = $self->new_node($self->{nodes}[$next]{start}, - $self->{nodes}[$next]{start} + $self->{active_length}); - $self->{nodes}[ $self->{active_node} ]{next} - { $self->active_edge } = $split; - my $leaf = $self->new_node($self->{position}, 'INF'); - $self->{nodes}[$split]{next}{$char} = $leaf; - $self->{nodes}[$next]{start} += $self->{active_length}; - $self->{nodes}[$split]{next}{ substr $self->{text}, - $self->{nodes}[$next]{start}, 1 } = $next; - $self->_add_suffix_link($split); # Rule 2. - } - -- $self->{remainder}; - - if ($self->{active_node} == $self->{root} - && $self->{active_length} > 0 # Rule 1. - ) { - --$self->{active_length}; - $self->{active_edge} - = $self->{position} - $self->{remainder} + 1; - } else { - $self->{nodes}[ $self->{active_node} ]{link} //= 0; - $self->{active_node} - = $self->{nodes}[ $self->{active_node} ]{link} > 0 - ? $self->{nodes}[ $self->{active_node} ]{link} - : $self->{root}; # Rule 3. - } - } - } - - my @lcs; - sub longest_common_substring { - my ($self, $node_index, $string) = @_; - @lcs = ("") unless $node_index; - my $node = $self->{nodes}[$node_index]; - - if ($self->{number_of_words} == keys %{ $node->{numbers} }) { - my $compare_lengths = length $string <=> length $lcs[0]; - push @lcs, $string if $compare_lengths == 0; - @lcs = ($string) if $compare_lengths == 1; - } - - for my $next_char (keys %{ $node->{next} }) { - my $next_index = $node->{next}{$next_char}; - my $next = $self->{nodes}[$next_index]; - $self->longest_common_substring( - $next_index, - "$string$next->{text}"); - } - return @lcs - } -} - -my $o = 'My::Suffix::Tree'->new; -$o->add_words(@ARGV); - -say "<$_>" for $o->longest_common_substring(0, ""); diff --git a/stats/pwc-current.json b/stats/pwc-current.json index 57ac51b970..81990d32e8 100644 --- a/stats/pwc-current.json +++ b/stats/pwc-current.json @@ -1,30 +1,40 @@ { - "xAxis" : { - "type" : "category" + "chart" : { + "type" : "column" }, "drilldown" : { "series" : [ { - "id" : "Andrezgz", + "name" : "Andrezgz", "data" : [ [ "Perl 5", 2 ] ], - "name" : "Andrezgz" + "id" : "Andrezgz" }, { - "id" : "Duane Powell", "data" : [ [ "Perl 5", 2 ] ], + "id" : "Duane Powell", "name" : "Duane Powell" }, { + "name" : "E. Choroba", + "data" : [ + [ + "Perl 5", + 2 + ] + ], + "id" : "E. Choroba" + }, + { "id" : "Laurent Rosenfeld", "data" : [ [ @@ -43,26 +53,27 @@ "name" : "Laurent Rosenfeld" }, { - "name" : "Ozzy", - "id" : "Ozzy", "data" : [ [ "Perl 6", 1 ] - ] + ], + "id" : "Ozzy", + "name" : "Ozzy" }, { + "name" : "Roger Bell West", + "id" : "Roger Bell West", "data" : [ [ "Perl 5", 2 ] - ], - "id" : "Roger Bell West", - "name" : "Roger Bell West" + ] }, { + "id" : "Ruben Westerberg", "data" : [ [ "Perl 5", @@ -73,76 +84,51 @@ 2 ] ], - "id" : "Ruben Westerberg", "name" : "Ruben Westerberg" }, { "name" : "Simon Proctor", - "id" : "Simon Proctor", "data" : [ [ "Perl 6", 2 ] - ] + ], + "id" : "Simon Proctor" }, { + "name" : "Steven Wilson", "data" : [ [ "Perl 5", 1 ] ], - "id" : "Steven Wilson", - "name" : "Steven Wilson" + "id" : "Steven Wilson" } ] }, - "legend" : { - "enabled" : 0 - }, - "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/>" - }, - "yAxis" : { - "title" : { - "text" : "Total Solutions" - } - }, - "title" : { - "text" : "Perl Weekly Challenge - 018" - }, "subtitle" : { - "text" : "[Champions: 8] Last updated at 2019-07-25 11:39:55 GMT" - }, - "plotOptions" : { - "series" : { - "dataLabels" : { - "enabled" : 1, - "format" : "{point.y}" - }, - "borderWidth" : 0 - } - }, - "chart" : { - "type" : "column" + "text" : "[Champions: 9] Last updated at 2019-07-25 22:47:58 GMT" }, "series" : [ { - "colorByPoint" : 1, "name" : "Perl Weekly Challenge - 018", "data" : [ { "y" : 2, - "name" : "Andrezgz", - "drilldown" : "Andrezgz" + "drilldown" : "Andrezgz", + "name" : "Andrezgz" }, { - "name" : "Duane Powell", + "y" : 2, "drilldown" : "Duane Powell", - "y" : 2 + "name" : "Duane Powell" + }, + { + "y" : 2, + "name" : "E. Choroba", + "drilldown" : "E. Choroba" }, { "name" : "Laurent Rosenfeld", @@ -150,31 +136,60 @@ "y" : 4 }, { - "drilldown" : "Ozzy", "name" : "Ozzy", + "drilldown" : "Ozzy", "y" : 1 }, { - "name" : "Roger Bell West", "drilldown" : "Roger Bell West", + "name" : "Roger Bell West", "y" : 2 }, { "y" : 4, - "name" : "Ruben Westerberg", - "drilldown" : "Ruben Westerberg" + "drilldown" : "Ruben Westerberg", + "name" : "Ruben Westerberg" }, { - "y" : 2, + "name" : "Simon Proctor", "drilldown" : "Simon Proctor", - "name" : "Simon Proctor" + "y" : 2 }, { + "y" : 1, "name" : "Steven Wilson", - "drilldown" : "Steven Wilson", - "y" : 1 + "drilldown" : "Steven Wilson" } - ] + ], + "colorByPoint" : 1 + } + ], + "tooltip" : { + "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/>", + "followPointer" : 1 + }, + "title" : { + "text" : "Perl Weekly Challenge - 018" + }, + "yAxis" : { + "title" : { + "text" : "Total Solutions" } - ] + }, + "plotOptions" : { + "series" : { + "dataLabels" : { + "format" : "{point.y}", + "enabled" : 1 + }, + "borderWidth" : 0 + } + }, + "xAxis" : { + "type" : "category" + }, + "legend" : { + "enabled" : 0 + } } diff --git a/stats/pwc-language-breakdown-summary.json b/stats/pwc-language-breakdown-summary.json index 8250cbcd98..1bc4bd34ae 100644 --- a/stats/pwc-language-breakdown-summary.json +++ b/stats/pwc-language-breakdown-summary.json @@ -1,9 +1,19 @@ { - "title" : { - "text" : "Perl Weekly Challenge Contributions - 2019" - }, "series" : [ { + "name" : "Contributions", + "dataLabels" : { + "format" : "{point.y:.0f}", + "color" : "#FFFFFF", + "align" : "right", + "style" : { + "fontSize" : "13px", + "fontFamily" : "Verdana, sans-serif" + }, + "y" : 10, + "enabled" : "true", + "rotation" : -90 + }, "data" : [ [ "Blog", @@ -11,45 +21,26 @@ ], [ "Perl 5", - 728 + 730 ], [ "Perl 6", 417 ] - ], - "name" : "Contributions", - "dataLabels" : { - "enabled" : "true", - "color" : "#FFFFFF", - "format" : "{point.y:.0f}", - "style" : { - "fontSize" : "13px", - "fontFamily" : "Verdana, sans-serif" - }, - "align" : "right", - "y" : 10, - "rotation" : -90 - } + ] } ], "legend" : { "enabled" : "false" }, - "chart" : { - "type" : "column" - }, "xAxis" : { + "type" : "category", "labels" : { "style" : { - "fontFamily" : "Verdana, sans-serif", - "fontSize" : "13px" + "fontSize" : "13px", + "fontFamily" : "Verdana, sans-serif" } - }, - "type" : "category" - }, - "subtitle" : { - "text" : "Last updated at 2019-07-25 11:40:01 GMT" + } }, "yAxis" : { "min" : 0, @@ -59,5 +50,14 @@ }, "tooltip" : { "pointFormat" : "<b>{point.y:.0f}</b>" + }, + "chart" : { + "type" : "column" + }, + "title" : { + "text" : "Perl Weekly Challenge Contributions - 2019" + }, + "subtitle" : { + "text" : "Last updated at 2019-07-25 22:48:06 GMT" } } diff --git a/stats/pwc-language-breakdown.json b/stats/pwc-language-breakdown.json index 14f3098b8b..c1adbe04f3 100644 --- a/stats/pwc-language-breakdown.json +++ b/stats/pwc-language-breakdown.json @@ -1,122 +1,7 @@ { - "title" : { - "text" : "Perl Weekly Challenge Language" - }, - "chart" : { - "type" : "column" - }, - "xAxis" : { - "type" : "category" - }, - "subtitle" : { - "text" : "Click the columns to drilldown the language breakdown. Last updated at 2019-07-25 11:40:01 GMT" - }, - "series" : [ - { - "colorByPoint" : "true", - "name" : "Perl Weekly Challenge Languages", - "data" : [ - { - "drilldown" : "001", - "y" : 123, - "name" : "#001" - }, - { - "name" : "#002", - "y" : 104, - "drilldown" : "002" - }, - { - "name" : "#003", - "drilldown" : "003", - "y" : 66 - }, - { - "y" : 84, - "drilldown" : "004", - "name" : "#004" - }, - { - "name" : "#005", - "y" : 66, - "drilldown" : "005" - }, - { - "name" : "#006", - "drilldown" : "006", - "y" : 47 - }, - { - "drilldown" : "007", - "y" : 54, - "name" : "#007" - }, - { - "name" : "#008", - "drilldown" : "008", - "y" : 67 - }, - { - "name" : "#009", - "drilldown" : "009", - "y" : 65 - }, - { - "name" : "#010", - "drilldown" : "010", - "y" : 58 - }, - { - "y" : 77, - "drilldown" : "011", - "name" : "#011" - }, - { - "name" : "#012", - "drilldown" : "012", - "y" : 81 - }, - { - "y" : 74, - "drilldown" : "013", - "name" : "#013" - }, - { - "name" : "#014", - "drilldown" : "014", - "y" : 94 - }, - { - "drilldown" : "015", - "y" : 90, - "name" : "#015" - }, - { - "drilldown" : "016", - "y" : 64, - "name" : "#016" - }, - { - "name" : "#017", - "drilldown" : "017", - "y" : 77 - }, - { - "name" : "#018", - "drilldown" : "018", - "y" : 18 - } - ] - } - ], "legend" : { "enabled" : "false" }, - "yAxis" : { - "title" : { - "text" : "Total Solutions" - } - }, "drilldown" : { "series" : [ { @@ -157,7 +42,6 @@ }, { "id" : "003", - "name" : "003", "data" : [ [ "Perl 5", @@ -171,10 +55,10 @@ "Blog", 8 ] - ] + ], + "name" : "003" }, { - "name" : "004", "data" : [ [ "Perl 5", @@ -189,10 +73,10 @@ 9 ] ], - "id" : "004" + "id" : "004", + "name" : "004" }, { - "name" : "005", "data" : [ [ "Perl 5", @@ -207,9 +91,11 @@ 11 ] ], - "id" : "005" + "id" : "005", + "name" : "005" }, { + "name" : "006", "id" : "006", "data" : [ [ @@ -224,11 +110,9 @@ "Blog", 6 ] - ], - "name" : "006" + ] }, { - "id" : "007", "data" : [ [ "Perl 5", @@ -243,9 +127,11 @@ 8 ] ], + "id" : "007", "name" : "007" }, { + "id" : "008", "data" : [ [ "Perl 5", @@ -260,12 +146,9 @@ 9 ] ], - "name" : "008", - "id" : "008" + "name" : "008" }, { - "id" : "009", - "name" : "009", "data" : [ [ "Perl 5", @@ -279,10 +162,11 @@ "Blog", 11 ] - ] + ], + "id" : "009", + "name" : "009" }, { - "id" : "010", "name" : "010", "data" : [ [ @@ -297,10 +181,11 @@ "Blog", 9 ] - ] + ], + "id" : "010" }, { - "id" : "011", + "name" : "011", "data" : [ [ "Perl 5", @@ -315,7 +200,7 @@ 8 ] ], - "name" : "011" + "id" : "011" }, { "data" : [ @@ -332,11 +217,10 @@ 9 ] ], - "name" : "012", - "id" : "012" + "id" : "012", + "name" : "012" }, { - "id" : "013", |
