Cody

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

Solution 200794

Submitted on 6 Feb 2013 by Alfonso Nieto-Castanon
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 901 Lives Remaining 5 Score 7401