#!perl -w use strict; sub choose { my ($str, $n) = @_; my @result; choose1(\@result, "", $str, $n, 0); return @result; } sub choose1 { my ($parray, $this, $str, $n, $x) = @_; if ($n == 0) { push @{$parray}, $this; return; } return if $x + $n > length($str); choose1($parray, $this . substr($str, $x, 1), $str, $n - 1, $x+1); choose1($parray, $this, $str, $n, $x+1); } my %edges; my %nodes; my %collinear; for (qw(ab acfi adgj ae bcde bfhj bi ej eghi ij)) { $nodes{$_} = 1 for choose($_, 1); $edges{$_} = 1 for choose($_, 2); $collinear{$_} = 1 for choose($_, 3); } my $allnodes = join "", sort keys %nodes; for my $triple (grep {!$collinear{$_}} choose($allnodes, 3)) { print "$triple\n" if 3 == grep { $edges{$_} } choose($triple, 2); }