Discover MakerZone

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

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today
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];
  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;
% 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 % ~isempty(gmov) PACMAT adjacent
 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 537
dots 0
Lives Spent 1