#!/usr/bin/perl

use 5.040;

# Cuadrado mágico Sagrada Familia es 4x4, 16 números
# que suman 33 por filas y columnas. Si tomamos 1 al
# 16 suman 34.

my $k = 4; # tamaño 
my $N = $k*$k;

my @pool = 1 .. $N;   # suelen ser consecutivos

my @cuadrado;
my %hash;
while (1){
    my @guess = jlm( @pool );
    my $str = join "-", @guess;
    next if ++$hash{$str} > 1;
    
    for my $i (1 .. $k){
	for my $j (1 .. $k){
	    $cuadrado[$i][$j] = shift @guess;
	}
    }
    if ( comprobar (\@cuadrado) ){
	for my $i ( 1 .. $k ){
	    for my $j (1 .. $k){
		print " $cuadrado[$i][$j]";
	    }
	    say "";
	}
	say "\n";
    }
}

exit 2;


sub jlm {
# An alternate shuffle
    my @deck = @_;
    my @deck2;
    my $n = scalar(@deck);
    while ($n){
	my $t = int ($n)*rand(); 
	push @deck2, splice(@deck,$t,1);
	$n--;
    }
    return @deck2;
}

sub comprobar {
    my ($cuad) = shift;
    my @c = @$cuad;
    my $first = 0;
    for my $fila (1 .. $k){
	my $sumf = 0;
	my $sumc = 0;
	for my $columna (1 .. $k){
	    $sumf += $c[$fila][$columna];
	    $sumc += $c[$columna][$fila];
	}
	if ($sumf != $sumc){
	    return 0;
	}else{
	    if ($first && $sumf != $first){
		return 0;
	    }elsif ($first){
		# va bene
	    }else{
		$first = $sumf;
	    }
	}
    }
    return 1;    # success
}
    

