325 lines
7.6 KiB
ObjectPascal
325 lines
7.6 KiB
ObjectPascal
|
|
unit undertpu;
|
|
|
|
interface
|
|
procedure start;
|
|
procedure move(ch:char);
|
|
function look(ch:char):char;
|
|
procedure finish(x,y:integer);
|
|
|
|
implementation
|
|
uses dos;
|
|
const
|
|
serdarWALL='W';
|
|
serdarOPEN='O';
|
|
serdarMARK='c';
|
|
OUR_FILE_SIZE =6;
|
|
start_not_called = 1;
|
|
move_to_wall = 2;
|
|
file_size_wrong = 3;
|
|
wrong_argument = 4;
|
|
a_lot_start = 5;
|
|
a_lot_looks = 7;
|
|
var
|
|
serdarn,serdarm :integer;
|
|
serdartahta:array [0..99,0..99] of char;
|
|
serdarch :char;
|
|
serdarx,serdary,serdarmin :integer;
|
|
basx,basy :integer;
|
|
serdarcompetition :boolean;
|
|
serdar_num_looks :word;
|
|
serdarstart :boolean;
|
|
|
|
ffblk:SearchRec;
|
|
our_file:string[10];
|
|
|
|
eval_inp_dosyasi :string[10];
|
|
inp_dosyasi :string[11];
|
|
pla_dosyasi :string[10];
|
|
xy_dosyasi :string[7];
|
|
puan_dosyasi :string[9];
|
|
result_dosyasi:string[11];
|
|
|
|
ten,zero:byte;
|
|
|
|
procedure serdar_error(x:integer);forward;
|
|
|
|
function serdarust(x:integer):integer;
|
|
begin serdarust:=(((x)+serdarn-1) mod serdarn);end;
|
|
|
|
|
|
function serdarsol(x:integer):integer;
|
|
begin serdarsol:=(((x)+serdarm-1) mod serdarm);end;
|
|
|
|
function serdaralt(x:integer):integer;
|
|
begin serdaralt:=(((x)+1) mod serdarn);end;
|
|
|
|
function serdarsag(x:integer):integer;
|
|
begin serdarsag:=(((x)+1) mod serdarm);end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure solve_names;
|
|
var
|
|
i:integer;
|
|
begin
|
|
for i:=1 to Length(inp_dosyasi) do
|
|
inp_dosyasi[i]:=chr(ord(inp_dosyasi[i])+40);
|
|
for i:=1 to Length(eval_inp_dosyasi) do
|
|
eval_inp_dosyasi[i]:=chr(ord(eval_inp_dosyasi[i])+40);
|
|
for i:=1 to Length(pla_dosyasi) do
|
|
pla_dosyasi[i]:=chr(ord(pla_dosyasi[i])+40);
|
|
for i:=1 to Length(xy_dosyasi) do
|
|
xy_dosyasi[i]:=chr(ord(xy_dosyasi[i])+40);
|
|
for i:=1 to Length(our_file) do
|
|
our_file[i]:=chr(ord(our_file[i])+40);
|
|
for i:=1 to Length(puan_dosyasi) do
|
|
puan_dosyasi[i]:=chr(ord(puan_dosyasi[i])+40);
|
|
for i:=1 to Length(result_dosyasi) do
|
|
result_dosyasi[i]:=chr(ord(result_dosyasi[i])+40);
|
|
end;
|
|
|
|
|
|
procedure start;
|
|
var
|
|
i,j:integer;
|
|
f:TEXT;
|
|
begin
|
|
|
|
if (serdarstart) then serdar_error(a_lot_start);
|
|
|
|
solve_names;
|
|
findfirst(our_file,AnyFile,ffblk);
|
|
if(doserror<>0) then
|
|
serdarcompetition:=true
|
|
else
|
|
begin
|
|
if(ffblk.size = OUR_FILE_SIZE) then
|
|
serdarcompetition:=False
|
|
else
|
|
begin
|
|
serdarstart:=true;
|
|
serdar_error(file_size_wrong);
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
if(serdarcompetition) then assign(f,inp_dosyasi) else assign(f,eval_inp_dosyasi);
|
|
reset(f);
|
|
read(f,serdarm,serdarn);
|
|
for i:=0 to serdarn-1 do
|
|
begin
|
|
for j:=0 to serdarm-1 do
|
|
read(f,serdartahta[i,j]);
|
|
readln(f);
|
|
end;
|
|
read(f,serdarch);
|
|
close(f);
|
|
|
|
|
|
if(serdarcompetition) then
|
|
begin
|
|
assign(f,pla_dosyasi);
|
|
reset(f);
|
|
read(f,serdarx,serdary);
|
|
close(f);
|
|
end
|
|
else
|
|
begin
|
|
assign(f,xy_dosyasi);
|
|
reset(f);
|
|
read(f,serdarx,serdarmin,serdary);
|
|
close(f);
|
|
end;
|
|
basx:=serdarx;
|
|
basy:=serdary;
|
|
|
|
serdary:=basx-1;
|
|
serdarx:=serdarn-basy;
|
|
|
|
serdarstart:=true;
|
|
end;
|
|
|
|
procedure serdar_error(x:integer);
|
|
var
|
|
f:TEXT;
|
|
begin
|
|
if(not serdarstart) then solve_names;
|
|
if(serdarcompetition) then
|
|
begin
|
|
assign(f,result_dosyasi);
|
|
rewrite(f);
|
|
write(f,'Error');
|
|
close(f);
|
|
end
|
|
else begin
|
|
assign(f,puan_dosyasi);
|
|
rewrite(f);
|
|
write(f,x,' ',zero);
|
|
close(f);
|
|
end;
|
|
halt;
|
|
end;
|
|
|
|
procedure move(ch:char);
|
|
begin
|
|
if(not serdarstart)then serdar_error(start_not_called);
|
|
case ch of
|
|
'S':serdarx:=serdaralt(serdarx);
|
|
'N':serdarx:=serdarust(serdarx);
|
|
'E':serdary:=serdarsag(serdary);
|
|
'W':serdary:=serdarsol(serdary);
|
|
else serdar_error(wrong_argument);
|
|
end;
|
|
if(serdartahta[serdarx,serdary]<>serdarOPEN)then serdar_error(move_to_wall);
|
|
end;
|
|
|
|
|
|
function look(ch:char):char;
|
|
begin
|
|
if(not serdarstart)then serdar_error(start_not_called);
|
|
if (serdar_num_looks>20000) then serdar_error(a_lot_looks);
|
|
inc(serdar_num_looks);
|
|
case ch of
|
|
'S':if(serdartahta[serdaralt(serdarx),serdary]=serdarOPEN)
|
|
then look:=serdarOPEN else look:=serdarWALL;
|
|
'N':if(serdartahta[serdarust(serdarx),serdary]=serdarOPEN)
|
|
then look:=serdarOPEN else look:=serdarWALL;
|
|
'E':if(serdartahta[serdarx,serdarsag(serdary)]=serdarOPEN)
|
|
then look:=serdarOPEN else look:=serdarWALL;
|
|
'W':if(serdartahta[serdarx,serdarsol(serdary)]=serdarOPEN)
|
|
then look:=serdarOPEN else look:=serdarWALL;
|
|
else serdar_error(wrong_argument);
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure finish(x,y:integer);
|
|
var
|
|
f:TEXT;
|
|
puan:integer;
|
|
begin
|
|
if(not serdarstart)then serdar_error(start_not_called);
|
|
|
|
if (serdarcompetition) then assign(f,result_dosyasi) else assign(f,puan_dosyasi);
|
|
rewrite(f);
|
|
if(serdarcompetition) then
|
|
begin
|
|
writeln(f,x,' ',y);
|
|
write(f,'You used look ',serdar_num_looks,' times');
|
|
end
|
|
else if(x=basx) and (y=basy) then
|
|
begin
|
|
if (serdar_num_looks <= serdarmin) then puan:=ten
|
|
else if (serdar_num_looks >= serdarmin+serdarmin) then puan:=zero
|
|
else puan:= trunc ( ( 10.0 * ( 2.0 * serdarmin - serdar_num_looks ) ) / serdarmin + 0.5);
|
|
|
|
write(f,zero,' ',puan);
|
|
|
|
end
|
|
else
|
|
begin
|
|
write(f,ten,' ',zero);
|
|
end;
|
|
close(f);
|
|
halt;
|
|
end;
|
|
|
|
|
|
|
|
begin
|
|
serdar_num_looks:=0;
|
|
serdarstart:=false;
|
|
|
|
ten:=10;
|
|
zero:=0;
|
|
|
|
eval_inp_dosyasi[0]:=chr(9);
|
|
eval_inp_dosyasi[1]:=chr(65);
|
|
eval_inp_dosyasi[2]:=chr(70);
|
|
eval_inp_dosyasi[3]:=chr(72);
|
|
eval_inp_dosyasi[4]:=chr(77);
|
|
eval_inp_dosyasi[5]:=chr(76);
|
|
eval_inp_dosyasi[6]:=chr(6);
|
|
eval_inp_dosyasi[7]:=chr(76);
|
|
eval_inp_dosyasi[8]:=chr(80);
|
|
eval_inp_dosyasi[9]:=chr(76);
|
|
eval_inp_dosyasi[10]:=chr(0);
|
|
|
|
inp_dosyasi[0]:=chr(9);
|
|
inp_dosyasi[1]:=chr(77);
|
|
inp_dosyasi[2]:=chr(70);
|
|
inp_dosyasi[3]:=chr(60);
|
|
inp_dosyasi[4]:=chr(61);
|
|
inp_dosyasi[5]:=chr(74);
|
|
inp_dosyasi[6]:=chr(6);
|
|
inp_dosyasi[7]:=chr(65);
|
|
inp_dosyasi[8]:=chr(70);
|
|
inp_dosyasi[9]:=chr(72);
|
|
inp_dosyasi[10]:=chr(0);
|
|
|
|
pla_dosyasi[0]:=chr(9);
|
|
pla_dosyasi[1]:=chr(72);
|
|
pla_dosyasi[2]:=chr(68);
|
|
pla_dosyasi[3]:=chr(57);
|
|
pla_dosyasi[4]:=chr(59);
|
|
pla_dosyasi[5]:=chr(61);
|
|
pla_dosyasi[6]:=chr(6) ;
|
|
pla_dosyasi[7]:=chr(76);
|
|
pla_dosyasi[8]:=chr(80);
|
|
pla_dosyasi[9]:=chr(76);
|
|
pla_dosyasi[10]:=chr(0) ;
|
|
|
|
xy_dosyasi[0]:=chr(6);
|
|
xy_dosyasi[1]:=chr(80);
|
|
xy_dosyasi[2]:=chr(81);
|
|
xy_dosyasi[3]:=chr(6) ;
|
|
xy_dosyasi[4]:=chr(63);
|
|
xy_dosyasi[5]:=chr(65);
|
|
xy_dosyasi[6]:=chr(74);
|
|
xy_dosyasi[7]:=chr(0) ;
|
|
|
|
puan_dosyasi[0]:=chr(8);
|
|
puan_dosyasi[1]:=chr(72);
|
|
puan_dosyasi[2]:=chr(77);
|
|
puan_dosyasi[3]:=chr(57);
|
|
puan_dosyasi[4]:=chr(70);
|
|
puan_dosyasi[5]:=chr(6) ;
|
|
puan_dosyasi[6]:=chr(59);
|
|
puan_dosyasi[7]:=chr(65);
|
|
puan_dosyasi[8]:=chr(67);
|
|
puan_dosyasi[9]:=chr(0) ;
|
|
|
|
result_dosyasi[0]:=chr(10);
|
|
result_dosyasi[1]:=chr(74);
|
|
result_dosyasi[2]:=chr(61);
|
|
result_dosyasi[3]:=chr(75);
|
|
result_dosyasi[4]:=chr(77);
|
|
result_dosyasi[5]:=chr(68);
|
|
result_dosyasi[6]:=chr(76);
|
|
result_dosyasi[7]:=chr(6);
|
|
result_dosyasi[8]:=chr(76);
|
|
result_dosyasi[9]:=chr(80);
|
|
result_dosyasi[10]:=chr(76);
|
|
result_dosyasi[11]:=chr(0);
|
|
|
|
our_file[0]:=chr(9);
|
|
our_file[1]:=chr(67);
|
|
our_file[2]:=chr(61);
|
|
our_file[3]:=chr(68);
|
|
our_file[4]:=chr(57);
|
|
our_file[5]:=chr(68);
|
|
our_file[6]:=chr(57);
|
|
our_file[7]:=chr(67);
|
|
our_file[8]:=chr(57);
|
|
our_file[9]:=chr(6) ;
|
|
our_file[10]:=chr(0) ;
|
|
end.
|
|
|
|
|
|
|
|
|