#!/usr/bin/perl
$_=$w=q#
$w=~s=\s|\n==sg ;++$L{' FfFffFF fFf'};($b,$B,$bb,$BB)=(10,6,8,6
);$q=int($b/2); ($*,$", $/,$:,$ ;)=split//,"\040:\n\043_";$D=$"
x($b+2);$D=$D.( $".($*x $b).$") x$B.$D;$Z=sub{reverse@_};++$L{'
IIIIi'};$T=sub{ my($x,$ P,$T,$O ,$F)=(0,$b*$q+$q,@_);$_=$"x($b+
$b*$b+$b);my@T= (-2-$b, 1,2+$b, -1);@T=&$Z(@{T})if$F;while($T){
$X=substr($T,0, 1,'');$ x=lc${X }if!$x;
substr($_,$P,1, $x);(${X}ne$x)? ($P+=$T [$O]):($O=($O+1)%(@T))} s=\A$"+
==s;s=$"+\z==s; $_};++$L{'LlLLL l'};$W= sub{$_=shift;eval(qq%y/ $"f-z/.
$*/%);s-(\.{4,} )-'.{'.length($ 1).'}'- ge;qr/$_/};++$L{'NNnnnN nNn'};+
+$L{'PPpPpPp'}; $r=sub{local($_ ,$m)=@_ ;s/$"//g;s/(.)/$1x$bb/g e;$x=$b
b*$b;s|(.{$x})| $1x$BB|eg;s~(?< =(.))(. )~($1eq$2)?$2:$*~eg;$x- -;s~(?<
=(.).{$ x})(.)~ ($2ne$1 )?$*:$2
~ge;s|. (.{$x})|\1$/|g; s!.*?$/ !!s;$x=$w.$;.$w ;s:\S:substr($x
,0,1,'' ):ge;print"$:!$ ^X$/",q @$_=$w=q@,$:,$/ ,$_,"$:",q@=>s=
\s|\n|@ ,$;,$;,q@.*==sg =>eval@ ,$/,"$;$;DATA$; $;$*$m$/";};++$
L{'TTtT ttTTt'};$L=sub{ my($Z,$ O,$F);for$x(key s%L){$L{$x}={};
for$O(0 ..3){for$F(0,1) {$Z=&$T ($x,$O,$F);$L{$ x}{$Z}=&$W($Z);
}}}};++ $L{'UuU
UuUu'};($L5,$L4 ,$L3,$L L)=($b- 4,$b-3, $b-2,$b-1);($S, $s)=("S
-S$LL:","S--S$L L:");$h =["S$b: S-S$b:S ","S$b:${S}S-S$ b:S","S
S$LL:${s}SS","S $b:${S} ${S}S-S $b:S"," SSS$L4:S---S$L4 :SS","S
$b:${S}${s}SS", "S$b:S- S$L3:${ s}SS"," SS$LL:S--S$L3:S -S$b:S"
,"SS$LL:${s}S-S $b:S"," S$b:$S$ S${S}S- S$b:S","SSS$L5: S----S$
L5:SS", "SS$LL: S--S$L3 :${s}SS ","S$b: $S$S$S$
S${S}S- S$b:S"];for(@$h){s=S=\1 34S=g;s =\-=$*= g;s=(\d +):=.{$
1}=g;$_ =qr/$_/}++$L{'VVvVVv'}; $H=sub{ my$X=sh ift;for $x(@$h)
{return ''if$X=~/$x/}1;};++$L{' WwWwwwW wWw'};$ V=sub{m y($I,$D
,$q,$Q) =(0,@_);for$I(0..-1+len gth($Q) ){$_=su bstr($Q ,$I,1);
if($"eq $_){next}substr($D,$I+$ q,1,$_) ;}&$H($ D)&&&$A ($D);};
++$L{'X XxxXxXx xXXx'}; $S=$c=0
;++$L{'YyYyyYYY y'};$A= sub{++$c;my($D)=@_;!@A& &(&$r($D,"SOLUTION".++$
S),return);@ARG V&&(@A< 3)&&&$r($D,"$c$*moves") ;my($aa,$a)=('',pop@A);
for$aa(sort(key s%{$L{$ a}})){while($D=~m/(?=$L {$a}{$aa})/g){&$V($D,po
s($D),$aa);++po s($D);} }push@A,$a;};++$L{'ZzZZ zzzZz'};&$L;@A=&$Z(sort
(keys%L));&$A($ D);__@@ *%&(*%(*@&%(*&@^_$w=~s= \s|\n==sg;++$L{'FfFffFF
#=>s=\s|\n|__.*==sg=>eval
__DATA__ [ e d @ h a l l e y . c c ]
|