Maze - a project in two sigs (pm)
(with thanks to Darren and Simon for char hunting!)
There's more maze stuff here
Maze Generator
@m=(_,"|")x345;{my@a;!$v{$_}&$_>0&$_<346?push@a,$_:0for($p-1)%23?$p-1:0,
$p%23?$p+1:0,$p+23,$p-23;$p=pop@v,redo if!@a;(($r=$a[@a*rand])-$p)**2>1?
$m[$r>$p?2*$p-2:2*$r-2]=$":($m[$r>$p?2*$p-1:$r*2-1]=_);push@v,$p;$v{$p}=
$p=$r;keys%v<345&&redo}print$l?"":"\ec"."_"x47,$l++%46?"":"$/|",$_ for@m
Maze Solver
$|=print"\ec",@m=map{s#\ec##;split//}<>;{$v{$p=$r||50}=1;my@a;!$v{$_}&$_
>0&$_<767?push@a,$_:1for$m[$p-2]eq _?$p-2:0,$m[$p]eq _?$p+2:0,$m[$p-1]ne
_?$p+48:0,$m[$p-49]ne _?$p-48:0;select$q,$q,$q,.1;printf"\e[%d;%dH",1+$p
/48,$p%48;$p>765?exit:1;$r=!@a?pop@v:$a[@a*rand];push@v,$p if@a;redo}
How to useperl maze.pl | perl solve.pl(you can also just do perl -e '<maze code>' | perl -e '<solve code')
cat maze.txt | perl solve.pl
You can use the template below to make your own:
_______________________________________________ |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| |_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_And here it is in a single block: (although 6 lines, so unusable as sig)
$p=1;{@a=grep!$v{$_}&$_>47&$_<751,($p-1)%47&&$m[$p-1]ne"|"?$p-2:0,($p+2)
%47&&$m[$p+1]ne"|"?$p+2:0,$m[$p]ne _?$p+47:0,$m[$p-47]ne _?$p-47:0;$m[$p
]||=_;if($l){print$_?$_%47?$p-$_?$m[$_]:o:"$/|":"\e[H"for 0..750;$p>749?
exit:select$q,$q,$q,.1}@a?(($r=$a[rand@a])-$p)**2>4?$m[$r>$p?$p:$r]=$":(
$m[$r>$p?$r-1:$r+1]=_):($p=pop@v,redo);push@v,$v{$p=$r}=$p;if(keys%v>344
&!$l){$m[$_]||=$_<47|$_==$p?_:"|"for 0..750;%v=$p=$l=print"\ec"}redo}