#!/usr/bin/env perl use feature qw{ say state signatures } ; use strict ; use warnings ; use utf8 ; use Data::Dumper ; my $numbers = [ 3 .. 11 ] ; my $array ; recurse_magic_box( $numbers, $array ) ; sub recurse_magic_box ( $numbers , $array ) { # numbers is the list of allowable numbers for my $n (@$numbers) { push @$array, $n ; if ( check_magic_box($array) ) { recurse_magic_box( $numbers, $array ) ; } pop @$array ; } } sub check_magic_box ( $array ) { for my $n (@$array) { my $c = scalar grep {m{$n}} @$array ; return 0 if $c > 1 ; } do { my $sum = 21 ; my $checks = [ [ 0, 1, 2 ], # first row [ 3, 4, 5 ], # second row [ 6, 7, 8 ], # third row [ 0, 3, 6 ], # first col [ 1, 4, 7 ], # second col [ 2, 5, 8 ], # third col [ 0, 4, 8 ], # diagonal from top right [ 6, 4, 2 ], # diagonal from bottom right ] ; for my $check (@$checks) { my $s = 0 ; for my $p (@$check) { $s += $array->[$p] ; } return 0 if $s != $sum ; } say join "\t", @$array[ 0 .. 2 ] ; say join "\t", @$array[ 3 .. 5 ] ; say join "\t", @$array[ 6 .. 8 ] ; say '' ; } if scalar @$array == 9 ; return 1 ; }