15 puzzle solver: Difference between revisions
m
→{{header|Perl}}: twiddles
SqrtNegInf (talk | contribs) (Added Perl) |
SqrtNegInf (talk | contribs) m (→{{header|Perl}}: twiddles) |
||
Line 5,705:
=={{header|Perl}}==
{{trans|Raku}}
<lang perl>
no warnings;
use enum qw(False True);
my ($n, $m) = (0, 0);
my(@N0, @N2, @N3, @N4);
Line 5,720:
}
sub fN
sub common { ++$n; return True if fY(); --$n }
if ($N3[$n] ne 'u' and int($N0[$n] / 4) < 3) { fI();
if ($N3[$n] ne 'd' and int($N0[$n] / 4) > 0) { fG();
if ($N3[$n] ne 'l' and ($N0[$n] % 4) < 3) { fE();
if ($N3[$n] ne 'r' and ($N0[$n] % 4) > 0) { fL();
return False;
}
sub fI
my $g = (11-$N0[$n])*4;
my $a = $N2[$n] & (15 << $g);
$N0[$n+1] = $N0[$n]+4;
$N2[$n+1] = $N2[$n]-$a+($a<<16);
$N4[$n+1] = $N4[$n]+(
$N3[$n+1] = 'd';
}
sub fG
my $g = (19-$N0[$n])*4;
my $a = $N2[$n] & (15 << $g);
$N0[$n+1] = $N0[$n]-4;
$N2[$n+1] = $N2[$n]-$a+($a>>16);
$N4[$n+1] = $N4[$n]+(
$N3[$n+1] = 'u';
}
sub fE
my $g = (14-$N0[$n])*4;
my $a = $N2[$n] & (15 << $g);
$N0[$n+1] = $N0[$n]+1;
$N2[$n+1] = $N2[$n]-$a+($a<<4);
$N4[$n+1] = $N4[$n]+(
$N3[$n+1] = 'r';
}
sub fL
my $g = (16-$N0[$n])*4;
my $a = $N2[$n] & (15 << $g);
$N0[$n+1] = $N0[$n]-1;
$N2[$n+1] = $N2[$n]-$a+($a>>4);
$N4[$n+1] = $N4[$n]+(
$N3[$n+1] = 'l';
}
($N0[0], $N2[0]) = (8, 0xfe169b4c0a73d852); # initial state
while () { fY() or ++$m }</lang>
{{out}}
<pre>Solution found in 52 moves: rrrulddluuuldrurdddrullulurrrddldluurddlulurruldrdrd</pre>
|