Cut a rectangle: Difference between revisions

→‎{{header|Raku}}: get rid of globals, fully transform to idiomatic code
m (→‎{{header|Raku}}: don't be just like C)
(→‎{{header|Raku}}: get rid of globals, fully transform to idiomatic code)
Line 2,959:
(formerly Perl 6)
{{trans|C}}
<lang perl6>subsetsub Bytesolve($hh, of$ww, Int$recurse) where ^256;{
my ($h, $w, $t, @grid) of= Byte$hh, =$ww, 0;
state $cnt++;
$cnt = 0 if $recurse;
 
my Int ($t, $w, $h) = ($w, $lenh, $w) if $h +& 1;
my Int return 0 if $cnth == 01;
return 1 if $cntw +== 21;
return $h = $hh,if $w == $ww2;
return $w if $h == 2;
 
my ($tcy, $cx,) = ($cyh, $xw) «div» 2;
my @next;
my @dir$len = [0,($h -1],+ [-1,) 0],× [0,($w 1],+ [1, 0]);
sub walk(Int $y, Int $x) {
my ($i, $t);
if !$y || $y == $h || !$x || $x == $w {
$cnt += 2;
return;
}
$t = $y * ($w + 1) + $x;
@grid[$t]++, @grid[$len - $t]++;
loop ($i = 0; $i < 4; $i++) {
if !@grid[$t + @next[$i]] {
walk($y + @dir[$i][0], $x + @dir[$i][1]);
}
}
 
@grid[$t]--, @grid[$len - $t]--;
}
 
sub solve(Int $hh, Int $ww, Int $recur) returns Int {
my ($t, $cx, $cy, $x);
$h = $hh, $w = $ww;
 
if $h +& 1 { $t = $w, $w = $h, $h = $t; }
if $h +& 1 { return 0; }
if $w == 1 { return 1; }
if $w == 2 { return $h; }
if $h == 2 { return $w; }
 
$cy = $h div 2, $cx = $w div 2;
 
$len = ($h + 1) * ($w + 1);
@grid = ();
@grid[$len--] = 0;
my @next[3] = -1, -$w-1, +1, $w+1;
 
@next[0]for =$cx+1 ..^ $w -1;> $x {
@next[1] $t = -$cy × ($w -+ 1) + $x;
@nextgrid[2$_] = 1 for $t, $len-$t;
@next[3] = $w + 1;
 
if $recur { $cnt = 0; }
loop ($x = $cx + 1; $x < $w; $x++) {
$t = $cy * ($w + 1) + $x;
@grid[$t] = 1;
@grid[$len - $t] = 1;
walk($cy - 1, $x);
}
$cnt++;
 
ifsub walk($h ==y, $wx) {
$cntconstant @dir *= 2<0 -1 0 1> Z <-1 0 1 0>;
$cnt += 2 and return if !not $y ||or $y == $h ||or not !$x ||or $x == $w {;
} elsif !($w +& 1) && $recur {
solve(my $w,t = $h,y 0× ($w+1) + $x;
@grid[$t_]++ for $t, @grid[$len - $t]++;
walk($y + @dir[$i][_;0], $x + @dir[$i][_;1]) if not @grid[$t + @next[$_]] for 0..3;
if !@grid[$t_]-- +for @next[$i]]t, {$len-$t;
}
 
return $cnt++;
if $h == $w { $cnt ×= 2 }
elsif $recurse and not $w +& 1 { solve($w, $h, False) }
}$cnt
}
 
((1..9 X 1..9).grep:{ .[0] ≥ .[1] }).flat.map: -> $y, $x {
say "$y × $x: " ~ solve $y, $x, 1True unless $x +& 1 and $y +& 1;
}</lang>
{{out}}
2,392

edits