Cody

Problem 1246. PACMAT 05 - Optimized Ghosts, PACMAT increasing speed, 12 Lives

Solution 200821

Submitted on 6 Feb 2013 by Alfonso Nieto-Castanon
  • Size: 534
  • This is the leading solution.
This solution is locked. To view this solution, you need to provide a solution of the same size or smaller.

Test Suite

Test Status 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 434 Lives Remaining 11 Score 534

Suggested Problems

More from this Author246

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!