Брях!
както се каза тест за "ИСТИНСКИ ПРГОГРАМИСТИ" :)))
кой е по- по - най- :))))
така?
procedure Calculate(var APoint:TPoint;AKey:Integer; ABounds:TRect);
begin
with ABounds,APoint do
begin
x:=x-integer((AKey=1) and (x>Left))+integer((AKey=2) and (x<Right));
y:=y-integer((AKey=3) and (Y>Top)) +integer((AKey=4) and (Y<Bottom));
end;
end;
Ама на един "истински програмист" ще му е накърнено
чуството за естетика, че има два каста към integer.
Няма ли да може един?
така?
procedure Calculate(var APoint:TPoint;AKey:Integer; ABounds:TRect);
begin
with ABounds,APoint do
begin
x:=x+(AKey*2-3)*integer(((AKey=1) and (x>Left)) or ((AKey=2) and (x<Right)));
y:=y+(AKey*2-7)*integer(((AKey=3) and (Y>Top)) or ((AKey=4) and (Y<Bottom)));
end;
end;
Вече е един :) (колко е смислено - това е друг въпрос)
Остана още едно чувство на "неудовлетвореност" - това че
има уможение (знаеш ли човек оптимизатора как разсъждава :) )
да го махнем.
така?
procedure Calculate(var APoint:TPoint;AKey:Integer; ABounds:TRect);
begin
with ABounds,APoint do
begin
x:=x+(AKey shl 2-3)*integer(((AKey=1) and (x>Left)) or ((AKey=2) and (x<Right)));
y:=y+(AKey shl 2-7)*integer(((AKey=3) and (Y>Top)) or ((AKey=4) and (Y<Bottom)));
end;
end;
Е, вече всички критерии са постигнати - кода е максимално неясен :))
И в духа на "сентенцията: "Гениалните неща са прости" -
да се скъсам - по гениално не мога :)
ПП:unknown, ако това го пиша в "истинската" си програма
ще го напиша като твоя примера от първия пост.
ПП2:не съм го пробвал - може пък и да работи