use strict; use warnings; use Data::Dump qw/pp dd/; # https://perlmonks.org/?node_id=11141490 my $n=8; die "n must not be odd" if $n%2; my @nodes = 0 .. $n-1; my $center = shift @nodes; sub rotate(\@) { my $r = shift @{$_[0]}; push @{$_[0]},$r } sub get_edges { my @verts = @_; my $left = $#verts/2; my @res = map [ $verts[$_-1], $verts[-$_] ], 1..$left; return [@res,[$center,$verts[$left]]]; } 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; } my @colored; for(@nodes){ #pp \@nodes; push @colored, get_edges(@nodes); rotate(@nodes); } pp \@colored; pp get_matrix(@colored);