#!/usr/bin/perl
use 5.016;
use warnings;
use List::Util qw(shuffle);

sub _f { [shuffle(('0') x ($_[0] - $_[1]), ('*') x $_[1])] }

sub f { map{ _f($_[0], int rand($_[0] * 0.4)) } (0 .. $_[1]) }


sub bomb { $_[0] eq '*' ? 1 : 0 }

sub __g {
	my @l = (0, @_, 0);

	return map{
		bomb($l[$_ + 1]) ? '*' : $l[$_+ 1] + bomb($l[$_]) + bomb($l[$_ + 2])
	} (0 .. $#l - 2)
}

sub _g { map{ [__g(@{$_})] } @_ }

sub turn {
	map{ my $x = $_; [map{ $_[$_]->[$x] } (0 .. $#_)] } (0 .. $#{$_[0]})
}

sub g { turn _g(turn _g(@_)) }


sub d { join '', map{ (ref() ? (d(@{$_}) . "\n") : $_) } @_ }

say d (my @map = f(10, 10));
say d g(@map);
