use v5.12; use warnings; use Data::Dump qw/pp dd/; # https://perlmonks.org/?node_id=11141490 calc($_) for 5..10; exit; sub rotate(\@) { my $r = shift @{$_[0]}; push @{$_[0]},$r } sub get_edges { my @verts = @{+shift}; my $center = shift; my $left = $#verts/2; my @res = map [ $verts[$_-1], $verts[-$_] ], 1..$left; push @res,[$center,$verts[$left]] if defined $center; return \@res; } sub get_matrix{ my (@colored) = @_; my @inc_matrix; while ( my ($color,$color_set) = each @colored ) { for my $edge (@$color_set) { my ($v0,$v1) = @$edge; $inc_matrix[ $v0 ][ $v1 ] = $color; $inc_matrix[ $v1 ][ $v0 ] = $color; } } return \@inc_matrix; } sub calc { my ( $n ) = @_ ; my @nodes = 0 .. $n-1; my $center = $n%2 ? undef : pop @nodes; my @colored; for (@nodes) { push @colored, get_edges(\@nodes, $center); rotate(@nodes); } say "\n"; print "="x10; say " N=$n"; say "=== Colors: ", scalar @colored; say "=== Edges: "; say pp \@colored; say "=== Color Matrix:"; say pp get_matrix(@colored); }