Търся програмисти

27 отговора 1790 прегледа
#1

Търся програмисти

Търся програмисти. Не е работа на заплата. На хонорар е. Давам задача, разбираме се за парите, пишеш - взимаш парата и кои от къде е.

Изисквания: Да си много добър и да можеш да мислиш.

(Не се изисква визше образование.
Не се изисква 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.

Отговор
в отговор на unknown #2

Re: Търся програмисти

gotova e funkciata a sega napishi kolko shte mi dadesh.
Pak az shte pomislia dali vaobshte da ti otgovoria...

Отговор
в отговор на unknown #3

Re: Търся програмисти

А отговорите на задачката къде да пращаме ?

Отговор
в отговор на unknown #4

Шефче, шефче ....

Безумие отвсякъде, честно!

Отговор
в отговор на unknown #5

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;

Отговор
в отговор на unknown #6

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;


Прекалено елементарно.

Отговор
в отговор на unknown #7

Re: Търся програмисти

Тук май всички направиха нечия чужда задача или поне така ми се струва.

Отговор
в отговор на ok #8

Re: Търся програмисти

Bez komentar

Отговор
в отговор на ptr #9

Re: Търся програмисти

tuk

Отговор
в отговор на Heh #10

Re: Шефче, шефче ....

bez komentar

Отговор
в отговор на gotovo e. #11

Re: Търся програмисти

Ne otgovaria na uslovieto, no mi haresva kak mislish.

Отговор
в отговор на Daniel #12

Re: Търся програмисти

това е 99% сигурно.
но пък е прекалено елементарно.

Отговор
в отговор на vido #13

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]

Отговор
в отговор на Daniel #14

Re: Търся програмисти

Ako mislish che tova moje da e zadacha...

Отговор
в отговор на unknown #15

Re: Търся програмисти

ще проверя останалия 1%

Отговор
в отговор на unknown #16

Няколко въпроса :)

Няколко въпроса :)
В стила на "Истинския програмист" да попитам:
1. Тая функция колко често ще се вика
2. Тоя правоъгълник (с границите) често ли се променя?
3. Що трябва да е такава функция ами да не е метод на обекта-точка или обекта-правоъгълник (зависи от контекста, кое ще е по-рационално)

Ако ми отговориш на тея въпроси - ще я напиша и без оператор за присвояване :)

Отговор
в отговор на NikB #17

Re: Няколко въпроса :)

1. Няма значение, това е просто тест, но ако помислиш малко сигурно ще се сетиш че се вика когато е натиснат клавиш :)
2. И един път де се промени ти стига така че...
3. Защото няма значение, условието е точно и ясно - процедура с 2 параметъра, без иф кейс и т.н. (то е написано), контекста го разбирай от условието
4. Ограниченията (условията) имат за цел да провокират и да проверят начина на мислене, т.е. дали насреща имам "кон с капаци"
5. Това не е реална задача и не може да бъде защото както някой тука каза "е прекалено е елементарна"

Отговор
в отговор на unknown #18

Re: Няколко въпроса :)

Бе тя е елементарна, но ми се струва, че предложеното решение няма да работи за AKey = 2 и 4
Пък и не съм сигурен, дали оптимизатора няма да игнорира това присвояване на 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;



Отговор
в отговор на unknown #19

Re: Няколко въпроса :)

1. Ами тогава няма нужда да се търси ефективност, а трябва да се пести времето на програмсита
2. Не е вярно: ако се сменя рядко, може да е раcионално да се позлват повече променливи за описанието му, така, че другите обработки да се ускорят за сметка на предварителни сметки. Дано си разбрал :)
3. Да, тук ме уцели,
4. Ограниченията са хубави, но не съм питал за тях
5. Е и кой твърди, че е реална?
Впрочем, освен програмисти има и проектанти (понякога - смесено:) - тяхната цел е да сведат всичко до елементарни задачи.

Отговор
в отговор на NDeu #20

Re: Няколко въпроса :)

Ще работи за 2 и 4. Помисли малко как работи компилатора в {$B-} (това не е "Optimization off" ами "Complete boolean evaluation off"). Никаква оптимизация не би трябвало да влиае върху истинността на логически израз.
Също помисли когато имаш and и or кое е с приоритет и дали ако (при {$B-}) имаш "false and ?" където ? е функция тя ще се извика. Предложеното от Vido решение е вярно но има и по просто (без inner финкцията). Това което предлагаш ти е безкрайно сложно и не оптимално (разгледай asm който генерира delphi-то и ще разбереш какво имам в предвид (View/CPU window)).

Колкото до "индийският програмист" - всичко е много хубаво обаче невярно (поне при pascal)

Съвет: Помисли върху сентенцията: "Гениалните неща са прости" (не е моя мисъл)

Отговор