Большой Воронежский Форум
Страница 1 из 3
1 23 >
» Программирование>Народ помогите с двумя переменными ...
kazys 10:40 21.08.2008
На днях проходил тестирование в одной фирме ХХХХХ в тесте была задача как поменять содержимое двух переменных местами без участия третей переменной ...
я так понял а = 1, b = 2 и их надо поменять местами .....
я так дамаю с = а, а = b, b = c ..... и получиться а = 2, b = 1
кто знает как ещё проще их поменять местами ??? без участия третей переменной ... [Ответ]
Pengvin 11:31 21.08.2008
int a=1;
nt b=2;
__asm
{
mov eax,a
xchg eax,b
mov a,eax
}

можно элегантней

int a=1;
int b=2;
__asm
{
push a
push b
pop a
pop b
}

ASM Power!!!!1111one!one [Ответ]
Don_Vito 11:33 21.08.2008
a = a+b;
b = a-b;
a = a-b; [Ответ]
The_God 13:27 21.08.2008
a = a xor b
b = a xor b
a = a xor b

на lua так
a, b = b, a
[Ответ]
kazys 14:15 21.08.2008
The_God, Pengvin, Don_Vito народ да вы круты !!!
Да … век живи, век учись и дураком помрёшь ...
Я конечно все понимаю, но вот это действилельно изврещение !!!!!!!!!!!!!!!!!
А если переменные текстовые или вообще объекты ?????
ЭТО ТЕСТ ДЛЯ 1С БЫЛ !!! [Ответ]
The_God 15:06 21.08.2008
xor-ом по битикам ты переставиш всё что захочеш

хотя с 1С не знаком.. там мож как подругому все устроено и работает [Ответ]
Pengvin 17:40 21.08.2008
kazys, неизвращение это: tmp=a; a=b;b=tmp; Использование двух переменных это уже акробатика.
Насколько я себе представляю язык в 1С скриптовой и уж тут зависит будет ли это все работать от того как разработчик организовал представление переменных, тем более в таком самобытном продукте как 1С.
Тут VС не хочет метод с мат операциями применять к char *s, хотя это суть то же число. А вот push и pop работают со строками. [Ответ]
Yandex 18:07 21.08.2008
kazys, радуйся что не прошел. Вопрос школьный, но кодеру ответ на него знать нафиг не надо. Имхо.

Кстати похожая задачка: найти максимум из двух чисел без опрератора сравнения. [Ответ]
Part!zan 23:47 21.08.2008

Сообщение от Yandex:
но кодеру ответ на него знать нафиг не надо

Имхо, тут не тест на кодер/не кодер, а на умение логически мыслить. [Ответ]
The_God 05:07 22.08.2008
ты попробуй догадайся до обмена с помощью xor, тут помоему либо знал (когдато слышал что так можно) либо хрен догадаешся до этого на собеседовании. [Ответ]
Ivan XXX 06:09 22.08.2008

Сообщение от Don_Vito:
a = a+b;
b = a-b;
a = a-b;

а до такого варианта не догадаешься? по-моему, самый универсальный. [Ответ]
][irurg 11:09 22.08.2008

Сообщение от Yandex:
Кстати похожая задачка: найти максимум из двух чисел без опрератора сравнения.

в смысле без больше меньше? а если max(a,b)
а = можно? [Ответ]
Pengvin 11:39 22.08.2008

Сообщение от Yandex:
Кстати похожая задачка: найти максимум из двух чисел без опрератора сравнения.

__asm
{
mov eax,a
mov ebx,b
sub eax,ebx
jc bigb
jmp biga
}
bigb:
printf("b>a");
biga:
printf("a>b");


Сообщение от ][irurg:
в смысле без больше меньше? а если max(a,b)
а = можно?

если = как знак присваивания, то можно. А вы на каком языке кодите?
[Ответ]
RDS 12:48 22.08.2008
Pengvin,
А можно расшифровать более понятно? [Ответ]
Pengvin 12:54 22.08.2008
RDS, а что там расшифровывать?
sub eax,ebx
есть вычитание, jc - проверка флага переноса CF и переход на метку, поскольку мы вычитаем из а б, то если ответ отрицательный, флаг устанавливается и мы переходим на метку bbig, ну если нет то переходим на метку abig. Собственно примерно вот так. [Ответ]
Capra hircus 13:00 22.08.2008

Сообщение от Yandex:
Кстати похожая задачка: найти максимум из двух чисел без опрератора сравнения.

изврат, имхо, и далее пойдет - как сложить без оператора сложения, умножить без оператора умножения, не касаясь пальцами клавиатуры т.д. и т.п.

Оператор сравнения именно для сравнения и существует - это самый простой и надежный способ сравнения.

Тесты немного дурноватые... И даже, если мы тестируем кодера на умение логически мыслить, то при предложении им способа "сравнить без оператора сравнения" следует задуматься, а профессионал ли перед вами? или кодоман-извращенец? Профессионал, даже предложив такой способ, обязательно должен сделать оговорку, что применять этот способ не следует никогда, потому как есть более надежный, легкий способ, легко понимаемый при изучении кода другим человеком. [Ответ]
RDS 13:21 22.08.2008
Capra hircus,

Э нет не согласен! Такие задачи как раз проверяют умение мыслить логически! Если нашел решение - респект умеешь мыслить (задачи то не тривиальные). Если знал решение - респект большой запаса стандартных алгоритмов...
А вот если не нашел и не знал... то стоит задуматься... Может и не плохой кодер перед тобой.. но врят-ли он что-то оригинальное придумает.. так рутину ему тока и можно доверять.



Pengvin, Нет не интересно... асемблер... машинноорентированно. Вот на языке Ершова то=же самое изобразить слабо?

кроме того.. тут происходит неявное испльзование операторов сравнения. На языке Ершова, задачу следоволо-бы сфолрмулировать: "Без использования "ЕСЛИ"... У Вас "Если" используеться.. [Ответ]
RDS 13:23 22.08.2008

Сообщение от Capra hircus:
Профессионал, даже предложив такой способ, обязательно должен сделать оговорку, что применять этот способ не следует никогда, потому как есть более надежный, легкий способ, легко понимаемый при изучении кода другим человеком.

И второй раз несогласен! Бывают задачи с ограниченными ресурсами, ну ФИЗИЧЕСКИ нет свободной ячейки памяти... И что отказываться выполнять задачу? Менять ТЗ? Или все-же найти способ сделать задачу?
Тут еще дополнительно раскрываеться характер кодера. В общем нормальный тест.. [Ответ]
The_God 13:57 22.08.2008

Сообщение от Capra hircus:
Тесты немного дурноватые... И даже, если мы тестируем кодера на умение логически мыслить, то при предложении им способа "сравнить без оператора сравнения" следует задуматься, а профессионал ли перед вами? или кодоман-извращенец? Профессионал, даже предложив такой способ, обязательно должен сделать оговорку, что применять этот способ не следует никогда, потому как есть более надежный, легкий способ, легко понимаемый при изучении кода другим человеком.

+1

такие тесты ничего не проверяют, это как попросить расказать указаное ( по автору и названию ) стихотворение по памяти, либо знаеш и вспомниш, либо не знаеш и не вспомниш

если хочется чтото проверить то надо дать просто задание по теме чем занимается фирма, дать док с кодингстандартом которого придерживается фирма чтобы не оценивать насколько соискатель угадал "правильный" ( фирменный ) стиль программирования.
[Ответ]
The_God 14:00 22.08.2008

Сообщение от RDS:
И второй раз несогласен! Бывают задачи с ограниченными ресурсами, ну ФИЗИЧЕСКИ нет свободной ячейки памяти... И что отказываться выполнять задачу? Менять ТЗ? Или все-же найти способ сделать задачу?
Тут еще дополнительно раскрываеться характер кодера. В общем нормальный тест..

тамже на 1с програмера брали какие там нафих ограничения ??? ... даж англиские буквы знать наверна не обязательно [Ответ]
Part!zan 16:09 22.08.2008
The_God, можно даже на самом "ограниченном" языке одну и туже задачу решить оптимально и не оптимально. Если чел привык все делать через одно место, то ему какой язык ни дай - он все будет так делать. Ему будет лень придумывать менее очевидный, но более эффективный алгоритм. Это уже не программер, это ремесленник, в плохом смысле этого слова. Он тупо использует вычитанные/подсмотренные чужие наработки, не создавая ничего своего. Отсюда мы и получаем проги, которые используют дохрена озу, работают как черепахи, а ценность их выдачи, прям скажем, сомнительна.

Я вчера проходил, ради развления, онлайновый тест по сям... В общем, у меня сложилось впечатление, что от программер-насильника хотят, чтобы он мог разбирать код лучше компилятора в уме. Задания, типа, скажите где тут синтаксическая ошибка или что же выведет данна прога на экран. Я уж молчу, про вопросы, когда от тебя требуют "справочные" данные. Бред, имхо.

А еще я недавно читал вопросы, которые исользуются при приеме на работу в мелкософт - вот там реально нестандартные вопросы, которые отделяют тех, кто способен на творчество от "ремесленников" http://www.sellsbrothers.com/fun/msi...t=question.htm
А вот еще инфа "из первых рук", о том как люди попадают на работу туда и чем "ихние" собеседования отличаются от "наших" http://blogs.technet.com/not-a-kerne...3/2165208.aspx [Ответ]
alexz 00:49 23.08.2008

Сообщение от Yandex:
kazys
Кстати похожая задачка: найти максимум из двух чисел без опрератора сравнения.

а как красиво сделать максимум без сравнения?


я пока докумекал до варианта, требующего модуль числа:
int max(a,b)
{

int d=(a-b)/abs(a-b); //надо ещё отдельно окучить случай когда a==b
return a*(d+1)/2 +b*(d-1)/(-2)
}

ну модуль, конечно, можно делать правильно через if:int abs(int x){ if(x>=0) return x; else return -x; }
но можно и по-хитрому без if - выделить старший (знаковый) бит у integer'а - а дальше дело техники - ну то есть
int abs(int x)
{
signbit=выделить знаковый бит из x, например signbit=(x>>31) ?
return (1-signbit)*x-signbit*x
}
То есть без if. но уж как-то шибко машинно-зависимо

А, вот еще забавный способ придумал:
int max(int a,int b)
{
try
{
float d=sqrt(a-b);
return a;
}
catch(...)
{
return b;
}
}
если корень из разности кидает исключение, значит она отрицательна
)) но это уж совсем тормозной способ. [Ответ]
Pengvin 09:16 23.08.2008

Сообщение от RDS:
Бывают задачи с ограниченными ресурсами, ну ФИЗИЧЕСКИ нет свободной ячейки памяти..

Если вопрос поставлен так, тот тут как раз задача решается на ассемблере и знание архитектуры бывают важней знаний всяких программистских этюдов.

Вобще если вопрос заходит о таких извращения, тот тут на самом деле надо решать действительно ли выгодно данное решение в плане производительности, код для сравнения чисел вычитанием, который я привел занимает не так уж и много места, а вот будет ли аналогичное решение допустим на С быть меньшим по размеру и по производительности быстрее это вопрос. Эта любовь к сомнительной оптимизации делает код во-первых нечитаемым, во-вторых не всегда приводит к росту производительности, если не делает хуже, надо смотреть по контексту задачи. Я видел иногда очень веселый код, например кодера который помешан на указателях у него параметры передавались примерно так:
int foo(int *i)
причем в аргумент есть одна единственная переменная, т.е. это все передавалось int z; foo(&z). Собственно размер указателя на int равен самому int. Т.е. человек слышал, что указатели это круто, но видимо с трудом понимает что они представляют.
Это имхо [Ответ]
QuickSilver 17:47 23.08.2008
Классика задач для подготовки олимпиадчиков. Только зачем такие задачи в 1С, имхо, не понятно [Ответ]
xxx-men 22:00 23.08.2008
моя в ужосе, какие дебаты!!!!!!!


но возникло пару вопосов не совсем по теме

Сообщение от The_God:
a = a xor b
b = a xor b
a = a xor b

это же с double не прокатет.......??? (очень интересный вариант
)

Сообщение от Don_Vito:
a = a+b;
b = a-b;
a = a-b;

и это в некоторых случаях тоже....???
[Ответ]
QuickSilver 22:31 23.08.2008
В книге "Особенности национальных задач по информатике" приводится именно вариант с xor. Видимо, оттуда задачку и взяли [Ответ]
quice 01:10 24.08.2008
Ну да задачки супер, суть вся сводиться к тому, чтобы с ж.. начать оптимизировать. В 1С насколько я знаю, основная задача чтобы работала, а не выеб...я с написанием кода. Более того все узкие места там с получением и обработкой данных из БД - которое ни 1С нормально делать не умеет, не большинство кодеров, которые в этой сфере работают(только 1С++ и ToySQL спасают, и то не от всех кодеров), а не в расчётах а + б. Впечатление складывается, что конторка то лажовая, ну или отдельные придурки, которые в ней работают, начитались туфты и решили перед начальством рубануться "- типа вот какой у нас крутой тест". Такие задачи в КБ ещё допустимы, а не у франчей))))). [Ответ]
The_God 08:02 24.08.2008

Сообщение от xxx-men:
это же с double не прокатет.......???

прокатит с любыми типами если применить эту операцию к битам [Ответ]
The Fat Old Sun 15:57 24.08.2008

Сообщение от Pengvin:
int a=1;
nt b=2;
__asm
{
mov eax,a
xchg eax,b
mov a,eax
}

можно элегантней

int a=1;
int b=2;
__asm
{
push a
push b
pop a
pop b
}

ASM Power!!!!1111one!one

ну да. только push и pop используют стек

на РНР:
$a = 1;
$b = 2;
$a .= ':'.$b;
list($b,$a) = split(':',$a); [Ответ]
RDS 08:26 25.08.2008
alexz,
ИМХО
функция МАХ не совсем подходит, она же возвращает максимальное их вдух, а значит сравнивает их.. хотя и не являеться оператором сравнения.

А вот корень из разности, это интересный и оригинальный вариант. Можно поставить подпрограмму обработки ошибок и в этом случе действительно не будем использовать оператор сравнения..
Если ошибки не возникла программа пошла по одному пути, если возникло по дургому. [Ответ]
Страница 1 из 3
1 23 >
Вверх