Test | Status | Code Input and Output |
---|---|---|
1 | Pass |
feval(@assignin,'caller','score',2000);
|
2 | Pass |
max_moves=2000; % Fixed path expect to succeed by 600 moves
map=[...
repmat('a',1,28);
'accccccccccccaacccccccccccca';
'acaaaacaaaaacaacaaaaacaaaaca';
'acaaaacaaaaacaacaaaaacaaaaca';
'acaaaacaaaaacaacaaaaacaaaaca';
'acccccccccccccccccccccccccca';
'acaaaacaacaaaaaaaacaacaaaaca';
'acaaaacaacaaaaaaaacaacaaaaca';
'accccccaaccccaaccccaacccccca';
'aaaaaacaaaaabaabaaaaacaaaaaa';
'aaaaaacaaaaabaabaaaaacaaaaaa';
'aaaaaacaabbbbbbbbbbaacaaaaaa';
'aaaaaacaabaaabbaaabaacaaaaaa';
'aaaaaacaabalbbbblabaacaaaaaa';
'bbbbbbcbbbabbbbbbabbbcbbbbbb';
'aaaaaacaabalbbbblabaacaaaaaa';
'aaaaaacaabaaaaaaaabaacaaaaaa';
'aaaaaacaabbbbbbbbbbaacaaaaaa';
'aaaaaacaabaaaaaaaabaacaaaaaa';
'aaaaaacaabaaaaaaaabaacaaaaaa';
'accccccccccccaacccccccccccca';
'acaaaacaaaaacaacaaaaacaaaaca';
'acaaaacaaaaacaacaaaaacaaaaca';
'acccaacccccccbdcccccccaaccca';
'aaacaacaacaaaaaaaacaacaacaaa';
'aaacaacaacaaaaaaaacaacaacaaa';
'accccccaaccccaaccccaacccccca';
'acaaaaaaaaaacaacaaaaaaaaaaca';
'acaaaaaaaaaacaacaaaaaaaaaaca';
'acccccccccccccccccccccccccca';
repmat('a',1,28);];
map=map-'b';
[nr, nc]=size(map);
gmap=map; % Map used by ghosts to simplify PAC Capture
gmap(15,6)=Inf; %No tunnel ghosts
gmap(15,26)=Inf;
gmap(map==-1)=Inf; % walls to Inf
gmap(map>2)=Inf; % Elim start points as viable moves, quicker box exit
mapdelta=[-1 nr 1 -nr]; % Valid as long as not on an edge
gmovxy=[0 -1;1 0;0 1;-1 0];
tunnel=find(map(:,1)==0); % tunnelptr
tunnel=[tunnel tunnel+nr*(nc-1)]; % Entrance/Exit Tunnel
[pmr, pmc]=find(map==2); % pi 24 row pj 15 column of map
ptrpac=find(map==2);
ptrpac=find(map==2);
ptrpac_start=ptrpac;
ptrg_start=find(map>2);
map(ptrg_start)=[10 20 30 40];% use deal?
[gstartx, gstarty]=find(map>2);
lives=3; % Lives
movepac=0;
while lives && any(mod(map(:),10)==1) && movepac<max_moves
movepac=movepac+1;
[curdir]=pacmat(map);
[pmr, pmc]=find(map==2);
if curdir>0
if map(ptrpac+mapdelta(curdir))==-1
% Do nothing - Ran into a Wall
elseif map(ptrpac+mapdelta(curdir))>2 % ran into ghost
map(ptrpac)=0; % remove PAC from the board
lives=lives-1;
if lives==0,break;end
% reset the board
[ptrgx, ptrgy]=find(map>2);
ptrg=find(map>2);
map(ptrg)=mod(map(ptrg),10);
map(ptrpac_start)=2;
map(ptrg_start)=[10 20 30 40];
ptrpac=find(map==2);
continue;
else % legal move
map(ptrpac)=0; % Eat Dot and clear PAC
ptrpac=ptrpac+mapdelta(curdir);
if ptrpac==tunnel(1),ptrpac=tunnel(2)-nr;end
if ptrpac==tunnel(2),ptrpac=tunnel(1)+nr;end
map(ptrpac)=2;
end
end % curdir >0
% Ghosts
for i=1:4
ghosts=find(map>2);
ptrpac=find(map==2); % Target
dot=false;
[gptrx, gptry]=find(map==10*i);
gidx=find(map==10*i);
if isempty(gidx)
[gptrx, gptry]=find(map==10*i+1); % ghost must be on a dot
gidx=find(map==10*i+1);
dot=true;
end
% Find valid ghost moves using gmap
% mapdelta=[-1 nr 1 -nr];
gmov=find(map(gidx+mapdelta)==2); % adjacent to PACMAT
if ~isempty(gmov) % PAC adjacent
lives=lives-1;
if lives==0,break;end
% reset the board
[pmr, pmc]=find(map==2); % PACMAT erase coords
map(map==2)=0;
[ptrgx, ptrgy]=find(map>2);
ptrg=find(map>2);
map(ptrg)=mod(map(ptrg),10);
map(ptrpac_start)=2;
map(ptrg_start)=[10 20 30 40];
ptrpac=find(map==2);
break; % Ghost move loop
else % gmap no tunnel usage, Walls
gmap=map; gmap(15,1)=-1;gmap(15,28)=-1;
ptctr=0;
gmap(gmap>=0)=Inf;
% gmap(ghosts)=-1; % other ghosts are like walls Ghosts_004/5
gmap(gidx)=Inf; % Ultimate target
gmap(ptrpac)=1; % Start at PACMAT and expand to ghost
while gmap(gidx)>101 && ptctr<100 % potential boxed dot
% find dots, add a counter to distance form location, keep min value
% when ptrpac gets a value it will be from nearest dot
% find side with dmap(ptrpac)-1
ptctr=ptctr+1;
dpts=find(gmap==ptctr);
newpt_idx=repmat(dpts,1,4)+repmat(mapdelta,length(dpts),1);
gmap(newpt_idx(:))=min(gmap(newpt_idx(:)),ptctr+1);
end
gmov=[];
if ~isinf(gmap(gidx)) % Path(s) to Ghost found
for gmovidx=1:4
if map(gidx+mapdelta(gmovidx))>2,continue;end % avoid ghost jumping
gmov=gmovidx;
if gmap(gidx+mapdelta(gmovidx))==gmap(gidx)-1,break;end % valid
gmov=[];
end
end
if ~isempty(gmov) % valid g move : ghost may not stand on ghost
map(gptrx,gptry)=mod(map(gptrx,gptry),10);
map(gidx+mapdelta(gmov))=map(gidx+mapdelta(gmov))+10*i;
end % ~isempty(gmov) standard move - no capture
end % ~isempty(gmov) PACMAT adjacent
end % i ghost moves
end % while alive
fprintf('moves %i\n',movepac)
assert(lives>0,sprintf('Three Captures\n'))
assert(~isempty(any(mod(map(:),10)==1)),sprintf('Moves\n',movepac)) % Test Move Timeout
feval( @assignin,'caller','score',floor(min( 2000,300-100*lives+movepac )) );
moves 408
|
4845 Solvers
398 Solvers
Find state names that start with the letter N
465 Solvers
500 Solvers
Convert hex color specification to MATLAB RGB
91 Solvers