MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

# Solution 202314

Submitted on 9 Feb 2013 by Richard Zapor

Correct

1548Size
`This solution is locked. To view this solution, you need to provide a solution of the same size or smaller.`

### Test Suite

Test
Code Input and Output
1
Pass

```%%
feval(@assignin,'caller','score',5000);
```

2
Pass

```%%
max_moves=4000; % Interactive approx 1000 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];
[gstartx, gstarty]=find(map>2);
lives=0; % Lives
movepac=0;
while lives<4 && any(mod(map(:),10)==1) && movepac<max_moves
for pac2x=1:2 % PAC Speed Multiplier
if lives>3 || ~any(mod(map(:),10)==1),break;end % Died or Completed
movepac=movepac+1;
[curdir]=PACMAT_2Xsolver(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;
% 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
end % pac2x
if lives>3 || ~any(mod(map(:),10)==1),break;end % Completed
% 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];
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;
% Ghost algor change
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
% Simplified by ghosts are walls: No Ghost Jumping
if ~isinf(gmap(gidx)) % Path(s) to Ghost found
for gmov=1:4 % execute with a find?
if gmap(gidx+mapdelta(gmov))==gmap(gidx)-1,break;end
end
else
gmov=[];
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 % i ghost moves
end % while any dots and < max_moves and lives<4
%
dots=length(find(mod(map,10)==1));
%
fprintf('moves %i\n',movepac)
fprintf('dots %i\n',dots)
fprintf('Lives Spent %i\n',lives)
%
% To Pass need to leave at most 0 dots
assert(dots==0,sprintf('Max Dots 0, Dots Remaining %i\n',dots))
score= movepac + 1000*lives; % All dots must be removed
feval( @assignin,'caller','score',floor(min( 5000,score )) );
```
```moves 548
dots 0
Lives Spent 1
```