Търся програмисти
27 отговора
1790 прегледа
Търся програмисти
Търся програмисти. Не е работа на заплата. На хонорар е. Давам задача, разбираме се за парите, пишеш - взимаш парата и кои от къде е.
Изисквания: Да си много добър и да можеш да мислиш.
(Не се изисква визше образование.
Не се изисква N години стаж по специалността.
Не се изисква писане на документация (само понякога).
Не се изисква спазване на работното време. и т.н.)
Проектите са сложни. Сроковете кратки.
Тест за желаещите:
Да се напише процедура със следния проторип:
procedure Calculate(var APoint:TPoint;AKey:Integer;ABounds:TRect);
... която да премества точка APoint според параметрите AKey и ABounds.
AKey: код на натиснат клавиш (ляво=1,дясно=2;горе=3;долу=4);
ABounds: граници на правоъгълник (top,left,bottom,right) който не трябва да напуска точката.
Пример:
procedure Calculate(var APoint:TPoint;AKey:Integer; ABounds:TRect);
begin
with ABounds,APoint do
case AKey of
1:if X>Left then X:=X-1; //dec(x)
2:if X<Right then X:=X+1; //inc(x)
3:if Y>Top then Y:=Y-1; //dec(y)
4:if Y<Bottom then Y:=Y+1; //inc(y)
end;
end;
Условие: Да не се ползват операторите "IF", "CASE", WHILE, REPEAT/UNTIL, FOR, и директивата ASM.
Изисквания: Да си много добър и да можеш да мислиш.
(Не се изисква визше образование.
Не се изисква N години стаж по специалността.
Не се изисква писане на документация (само понякога).
Не се изисква спазване на работното време. и т.н.)
Проектите са сложни. Сроковете кратки.
Тест за желаещите:
Да се напише процедура със следния проторип:
procedure Calculate(var APoint:TPoint;AKey:Integer;ABounds:TRect);
... която да премества точка APoint според параметрите AKey и ABounds.
AKey: код на натиснат клавиш (ляво=1,дясно=2;горе=3;долу=4);
ABounds: граници на правоъгълник (top,left,bottom,right) който не трябва да напуска точката.
Пример:
procedure Calculate(var APoint:TPoint;AKey:Integer; ABounds:TRect);
begin
with ABounds,APoint do
case AKey of
1:if X>Left then X:=X-1; //dec(x)
2:if X<Right then X:=X+1; //inc(x)
3:if Y>Top then Y:=Y-1; //dec(y)
4:if Y<Bottom then Y:=Y+1; //inc(y)
end;
end;
Условие: Да не се ползват операторите "IF", "CASE", WHILE, REPEAT/UNTIL, FOR, и директивата ASM.
Re: Търся програмисти
gotova e funkciata a sega napishi kolko shte mi dadesh.
Pak az shte pomislia dali vaobshte da ti otgovoria...
Pak az shte pomislia dali vaobshte da ti otgovoria...
Re: Търся програмисти
obadi mi se: 048917776
az pisha ti plashtash. Dano tova te zadovoli.
procedure TForm1.Calculate(var APoint: TPoint; AKey: Integer; ABounds: TRect);
(*исползвана техника - вложена процедура*)
var
APointGlobal: TPoint;
AKeyGlobal: Integer;
ABoundsGlobal: TRect ;
procedure Button1KeyPress(Sender: TObject; var Key: Char);
begin
with ABounds,APoint do
case AKey of
1:if X>Left then X:=X-1; //dec(x)
2:if X<Right then X:=X+1; //inc(x)
3:if Y>Top then Y:=Y-1; //dec(y)
4:if Y<Bottom then Y:=Y+1; //inc(y)
(*тука пишеш усложието за ABounds:
....
*)
(*tuk prisvoiavash stoinosti na promenlivite i izpolzvash if, else i kvoto si iskash
APointGlobal;
AKeyGlobal;
ABoundsGlobal;
...
*)
end;
end;(*krai na key press procedure*)
begin
(*nachalo na Calculate*)
APoint := APointGlobal;
AKey := AKeyGlobal;
ABounds := ABoundsGlobal;
(*тука повече нищо не пишеш.*)
end;
az pisha ti plashtash. Dano tova te zadovoli.
procedure TForm1.Calculate(var APoint: TPoint; AKey: Integer; ABounds: TRect);
(*исползвана техника - вложена процедура*)
var
APointGlobal: TPoint;
AKeyGlobal: Integer;
ABoundsGlobal: TRect ;
procedure Button1KeyPress(Sender: TObject; var Key: Char);
begin
with ABounds,APoint do
case AKey of
1:if X>Left then X:=X-1; //dec(x)
2:if X<Right then X:=X+1; //inc(x)
3:if Y>Top then Y:=Y-1; //dec(y)
4:if Y<Bottom then Y:=Y+1; //inc(y)
(*тука пишеш усложието за ABounds:
....
*)
(*tuk prisvoiavash stoinosti na promenlivite i izpolzvash if, else i kvoto si iskash
APointGlobal;
AKeyGlobal;
ABoundsGlobal;
...
*)
end;
end;(*krai na key press procedure*)
begin
(*nachalo na Calculate*)
APoint := APointGlobal;
AKey := AKeyGlobal;
ABounds := ABoundsGlobal;
(*тука повече нищо не пишеш.*)
end;
Re: Търся програмисти
procedure Calculate(var APoint:TPoint;AKey:Integer; ABounds:TRect);
var b: Boolean;
function IncDecBool(var z: Integer; step: Integer): Boolean;
begin
Inc(z, step);
Result := True
end;
begin
{$B-}
with ABounds, APoint do
b := (AKey = 1) and (X > Left) and IncDecBool(x,-1) or
(AKey = 2) and (X < Right) and IncDecBool(x, 1) or
(AKey = 3) and (Y > Top) and IncDecBool(y,-1) or
(AKey = 4) and (Y < Bottom) and IncDecBool(y, 1)
end;
Прекалено елементарно.
Re: Търся програмисти
Тук май всички направиха нечия чужда задача или поне така ми се струва.
Re: Търся програмисти
Bravo! Makar che mojeshe da go napishesh na 2 reda, bez inner funkciata...
P.S. Za tebe e elementarno zashtoto mojesh da mislish. Ako imash interes kum predlojenieto pishi na [email protected]
P.S. Za tebe e elementarno zashtoto mojesh da mislish. Ako imash interes kum predlojenieto pishi na [email protected]
Няколко въпроса :)
Няколко въпроса :)
В стила на "Истинския програмист" да попитам:
1. Тая функция колко често ще се вика
2. Тоя правоъгълник (с границите) често ли се променя?
3. Що трябва да е такава функция ами да не е метод на обекта-точка или обекта-правоъгълник (зависи от контекста, кое ще е по-рационално)
Ако ми отговориш на тея въпроси - ще я напиша и без оператор за присвояване :)
В стила на "Истинския програмист" да попитам:
1. Тая функция колко често ще се вика
2. Тоя правоъгълник (с границите) често ли се променя?
3. Що трябва да е такава функция ами да не е метод на обекта-точка или обекта-правоъгълник (зависи от контекста, кое ще е по-рационално)
Ако ми отговориш на тея въпроси - ще я напиша и без оператор за присвояване :)
Re: Няколко въпроса :)
1. Няма значение, това е просто тест, но ако помислиш малко сигурно ще се сетиш че се вика когато е натиснат клавиш :)
2. И един път де се промени ти стига така че...
3. Защото няма значение, условието е точно и ясно - процедура с 2 параметъра, без иф кейс и т.н. (то е написано), контекста го разбирай от условието
4. Ограниченията (условията) имат за цел да провокират и да проверят начина на мислене, т.е. дали насреща имам "кон с капаци"
5. Това не е реална задача и не може да бъде защото както някой тука каза "е прекалено е елементарна"
2. И един път де се промени ти стига така че...
3. Защото няма значение, условието е точно и ясно - процедура с 2 параметъра, без иф кейс и т.н. (то е написано), контекста го разбирай от условието
4. Ограниченията (условията) имат за цел да провокират и да проверят начина на мислене, т.е. дали насреща имам "кон с капаци"
5. Това не е реална задача и не може да бъде защото както някой тука каза "е прекалено е елементарна"
Re: Няколко въпроса :)
Бе тя е елементарна, но ми се струва, че предложеното решение няма да работи за AKey = 2 и 4
Пък и не съм сигурен, дали оптимизатора няма да игнорира това присвояване на b (то и за изключване на оптимизатора си има опция де)
Ти може би търсеше това:
Ако го искаш в стил ИСТИНСКИ ПРОГРАМИСТ на два реда, замести си стойностите в последните два реда.
А ето ти и едно решение, в стил ИНДИЙСКИ ПРОГРАМИСТ

Пък и не съм сигурен, дали оптимизатора няма да игнорира това присвояване на b (то и за изключване на оптимизатора си има опция де)
Ти може би търсеше това:
var
всичко е :integer;
begin
k:=AKey-1;//Нула базиран AKey
//Знака е в нулевия бит
sign:=2*(k and $1)-1;//Знак +-1.
//Направлението е в първия бит
isByY:=((k and $2)div 2);//0 ако е по X, 1 ако е по Y.
isByX:=(isByY+1)mod 2;//1 ако е по X, 0 ако е по Y.
//Да не би да излизаме от областта? 0-излизаме, 1-не
with ABounds, APoint do begin
inBoundX:=integer(((X>Left)and(sign<0))or((X<Right)and(sign>0)));//По Х
inBoundY:=integer(((Y>Bottom)and(sign<0))or((Y<Top)and(sign>0)));//По Y
X:=X+isx*sign*inBoundX;
Y:=Y+isy*sign*inBoundY);
end;
end;
Ако го искаш в стил ИСТИНСКИ ПРОГРАМИСТ на два реда, замести си стойностите в последните два реда.
А ето ти и едно решение, в стил ИНДИЙСКИ ПРОГРАМИСТ
const
Step:array[2..7] of integer=(-1,0,0,1,-1,1);
var
всичко е :integer;
begin
k:=AKey-1;//Нула базиран AKey
//Знака е в нулевия бит
ofsSign:=k and $1;//0-ляво/долу, 1-дясно/горе
ofsBound:=
with ABounds, APoint do begin
X:=X+Step[2*(integer(X>Left)+2*imteger(X<Right))+ofsSign];
Y:=Y+Step[2*(integer(Y>Bottom)+2*imteger(Y<Top))+ofsSign];
end;
end;
Re: Няколко въпроса :)
1. Ами тогава няма нужда да се търси ефективност, а трябва да се пести времето на програмсита
2. Не е вярно: ако се сменя рядко, може да е раcионално да се позлват повече променливи за описанието му, така, че другите обработки да се ускорят за сметка на предварителни сметки. Дано си разбрал :)
3. Да, тук ме уцели,
4. Ограниченията са хубави, но не съм питал за тях
5. Е и кой твърди, че е реална?
Впрочем, освен програмисти има и проектанти (понякога - смесено:) - тяхната цел е да сведат всичко до елементарни задачи.
2. Не е вярно: ако се сменя рядко, може да е раcионално да се позлват повече променливи за описанието му, така, че другите обработки да се ускорят за сметка на предварителни сметки. Дано си разбрал :)
3. Да, тук ме уцели,
4. Ограниченията са хубави, но не съм питал за тях
5. Е и кой твърди, че е реална?
Впрочем, освен програмисти има и проектанти (понякога - смесено:) - тяхната цел е да сведат всичко до елементарни задачи.
Re: Няколко въпроса :)
Ще работи за 2 и 4. Помисли малко как работи компилатора в {$B-} (това не е "Optimization off" ами "Complete boolean evaluation off"). Никаква оптимизация не би трябвало да влиае върху истинността на логически израз.
Също помисли когато имаш and и or кое е с приоритет и дали ако (при {$B-}) имаш "false and ?" където ? е функция тя ще се извика. Предложеното от Vido решение е вярно но има и по просто (без inner финкцията). Това което предлагаш ти е безкрайно сложно и не оптимално (разгледай asm който генерира delphi-то и ще разбереш какво имам в предвид (View/CPU window)).
Колкото до "индийският програмист" - всичко е много хубаво обаче невярно (поне при pascal)
Съвет: Помисли върху сентенцията: "Гениалните неща са прости" (не е моя мисъл)
Също помисли когато имаш and и or кое е с приоритет и дали ако (при {$B-}) имаш "false and ?" където ? е функция тя ще се извика. Предложеното от Vido решение е вярно но има и по просто (без inner финкцията). Това което предлагаш ти е безкрайно сложно и не оптимално (разгледай asm който генерира delphi-то и ще разбереш какво имам в предвид (View/CPU window)).
Колкото до "индийският програмист" - всичко е много хубаво обаче невярно (поне при pascal)
Съвет: Помисли върху сентенцията: "Гениалните неща са прости" (не е моя мисъл)