sudoku Puzzling in Perl #43

Daniel's code

#!/usr/bin/perl

use strict;
use warnings;

use List::Util qw(shuffle);

my $board = "1234567894567891237891234562345678915" . 
            "6789123489123456734567891267891234591" .
            "2345678"; # valid board

# sequence:                       boards:
# 1) renumber                     9 
# 2) shuffle rows within blocks   6**3
# 3) flip on x axis?              2
# 4) transpose x for y
# 5) shuffle cols within blocks   6**3
# 6) transpose x for y?           2
# 7) flip on x axis?              2

# total count:                    3359232

my %renumber;

@renumber{1..9} = shuffle 1..9; 
$board =~ s/(.)/$renumber{$1}/g;

my @grid = unpack("A9 "x9, $board); 
@grid = map { [ split //, $_ ] } @grid;

@grid[0..2] = shuffle @grid[0..2];
@grid[3..5] = shuffle @grid[3..5];
@grid[6..8] = shuffle @grid[6..8];

@grid =   reverse(@grid)           if (rand > .5);
@grid = transpose(@grid);

@grid[0..2] = shuffle @grid[0..2];
@grid[3..5] = shuffle @grid[3..5];
@grid[6..8] = shuffle @grid[6..8];

@grid = transpose(@grid)           if (rand > .5);
@grid =   reverse(@grid)           if (rand > .5);

@grid = map { join '', @{$_} } @grid;
$board = join "\n", @grid; # join '' for same form as input
print $board;

sub flip {
    return @_[8,7,6,5,4,3,2,1,0];
}

sub transpose {

    my @AoA = @_;

    for my $x (0..8) {
        for my $y ($x+1..8) {
            ( $AoA[$x][$y], $AoA[$y][$x] ) = ( $AoA[$y][$x], $AoA[$x][$y] );
        }
    }

    return @AoA;
}
© fishbot