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

Correct

7329Size
Leading solution size is 534.
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',10000);

                    
2
Pass
 
%%
max_moves=4000; % Expect < 1000
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=12; % Lives
  speed=[12 8 6 4 3 2 2 2 2 2 2 1]; % Faster as fewer lives remain
  movepac=0;
while lives && any(mod(map(:),10)==1) && movepac<max_moves
 for pac2x=1:speed(lives) % G05 Mod
  if ~(lives && any(mod(map(:),10)==1)),continue;end % Died or completed
 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
end % pac2X Speed Loop
% 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 alive
%
assert(lives>0,sprintf('Twelve Captures\n')) % ) Lives allowed
assert(~isempty(any(mod(map(:),10)==1)),sprintf('Moves\n',movepac))
score_array=[ 9000 8000 7500 7000 6500 4000 3000 2000 1000 500 100 0];
score=score_array(lives) + movepac;
fprintf('Moves %i\n',movepac)
fprintf('Lives Remaining %i\n',lives)
fprintf('Score %i\n',score)
feval( @assignin,'caller','score',floor(min( 10000,score )) );
Moves 829
Lives Remaining 5
Score 7329