Большой Воронежский Форум

Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел.
Вернуться   Большой Воронежский Форум » Компьютеры и все, что с ними связано » » Программирование
Философия, технологии, алгоритмы!

Ответ
 
Опции темы
Старый 21.08.2008, 10:40   #1   
Форумец
 
Аватар для kazys
 
Сообщений: 17
Регистрация: 12.08.2007

kazys вне форума Не в сети
Народ помогите с двумя переменными ...

На днях проходил тестирование в одной фирме ХХХХХ в тесте была задача как поменять содержимое двух переменных местами без участия третей переменной ...
я так понял а = 1, b = 2 и их надо поменять местами .....
я так дамаю с = а, а = b, b = c ..... и получиться а = 2, b = 1
кто знает как ещё проще их поменять местами ??? без участия третей переменной ...
  Ответить с цитированием
Старый 21.08.2008, 11:31   #2   
IGBT
 
Аватар для Pengvin
 
Сообщений: 534
Регистрация: 09.10.2005

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
  Ответить с цитированием
Старый 21.08.2008, 11:33   #3   
Кодер
 
Аватар для Don_Vito
 
Сообщений: 132
Регистрация: 27.10.2006

Don_Vito вне форума Не в сети
a = a+b;
b = a-b;
a = a-b;
  Ответить с цитированием
Старый 21.08.2008, 13:27   #4   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 43

The_God вне форума Не в сети
a = a xor b
b = a xor b
a = a xor b

на lua так
a, b = b, a
  Ответить с цитированием
Старый 21.08.2008, 14:15   #5   
Форумец
 
Аватар для kazys
 
Сообщений: 17
Регистрация: 12.08.2007

kazys вне форума Не в сети
The_God, Pengvin, Don_Vito народ да вы круты !!!
Да … век живи, век учись и дураком помрёшь ...
Я конечно все понимаю, но вот это действилельно изврещение !!!!!!!!!!!!!!!!!
А если переменные текстовые или вообще объекты ?????
ЭТО ТЕСТ ДЛЯ 1С БЫЛ !!!
  Ответить с цитированием
Старый 21.08.2008, 15:06   #6   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 43

The_God вне форума Не в сети
xor-ом по битикам ты переставиш всё что захочеш

хотя с 1С не знаком.. там мож как подругому все устроено и работает
  Ответить с цитированием
Старый 21.08.2008, 17:40   #7   
IGBT
 
Аватар для Pengvin
 
Сообщений: 534
Регистрация: 09.10.2005

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

Yandex вне форума Не в сети
kazys, радуйся что не прошел. Вопрос школьный, но кодеру ответ на него знать нафиг не надо. Имхо.

Кстати похожая задачка: найти максимум из двух чисел без опрератора сравнения.
  Ответить с цитированием
Старый 21.08.2008, 23:47   #9   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

Part!zan вне форума Не в сети
Цитата:
Сообщение от Yandex Посмотреть сообщение
но кодеру ответ на него знать нафиг не надо
Имхо, тут не тест на кодер/не кодер, а на умение логически мыслить.
  Ответить с цитированием
Старый 22.08.2008, 05:07   #10   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 43

The_God вне форума Не в сети
ты попробуй догадайся до обмена с помощью xor, тут помоему либо знал (когдато слышал что так можно) либо хрен догадаешся до этого на собеседовании.
  Ответить с цитированием
Старый 22.08.2008, 06:09   #11   
аццкий троглодит
 
Аватар для Ivan XXX
 
Сообщений: 3,234
Регистрация: 28.02.2004
Возраст: 41

Ivan XXX вне форума Не в сети
Цитата:
Сообщение от Don_Vito Посмотреть сообщение
a = a+b;
b = a-b;
a = a-b;
а до такого варианта не догадаешься? по-моему, самый универсальный.
  Ответить с цитированием
Старый 22.08.2008, 11:09   #12   
Форумец
 
Аватар для ][irurg
 
Сообщений: 2,009
Регистрация: 14.07.2006
Возраст: 44
Записей в дневнике: 1

][irurg вне форума Не в сети
Цитата:
Сообщение от Yandex Посмотреть сообщение
Кстати похожая задачка: найти максимум из двух чисел без опрератора сравнения.
в смысле без больше меньше? а если max(a,b)
а = можно?
  Ответить с цитированием
Старый 22.08.2008, 11:39   #13   
IGBT
 
Аватар для Pengvin
 
Сообщений: 534
Регистрация: 09.10.2005

Pengvin вне форума Не в сети
Цитата:
Сообщение от 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)
а = можно?
если = как знак присваивания, то можно. А вы на каком языке кодите?
  Ответить с цитированием
Старый 22.08.2008, 12:48   #14   
просто Гений
 
Сообщений: 3,133
Регистрация: 22.01.2007
Возраст: 51

RDS вне форума Не в сети
Pengvin,
А можно расшифровать более понятно?
  Ответить с цитированием
Старый 22.08.2008, 12:54   #15   
IGBT
 
Аватар для Pengvin
 
Сообщений: 534
Регистрация: 09.10.2005

Pengvin вне форума Не в сети
RDS, а что там расшифровывать?
sub eax,ebx
есть вычитание, jc - проверка флага переноса CF и переход на метку, поскольку мы вычитаем из а б, то если ответ отрицательный, флаг устанавливается и мы переходим на метку bbig, ну если нет то переходим на метку abig. Собственно примерно вот так.
  Ответить с цитированием
Старый 22.08.2008, 13:00   #16   
Форумец
 
Аватар для Capra hircus
 
Сообщений: 295
Регистрация: 12.01.2008
Возраст: 50

Capra hircus вне форума Не в сети
Цитата:
Сообщение от Yandex Посмотреть сообщение
Кстати похожая задачка: найти максимум из двух чисел без опрератора сравнения.
изврат, имхо, и далее пойдет - как сложить без оператора сложения, умножить без оператора умножения, не касаясь пальцами клавиатуры т.д. и т.п.

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

Тесты немного дурноватые... И даже, если мы тестируем кодера на умение логически мыслить, то при предложении им способа "сравнить без оператора сравнения" следует задуматься, а профессионал ли перед вами? или кодоман-извращенец? Профессионал, даже предложив такой способ, обязательно должен сделать оговорку, что применять этот способ не следует никогда, потому как есть более надежный, легкий способ, легко понимаемый при изучении кода другим человеком.
  Ответить с цитированием
Старый 22.08.2008, 13:21   #17   
просто Гений
 
Сообщений: 3,133
Регистрация: 22.01.2007
Возраст: 51

RDS вне форума Не в сети
Capra hircus,

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



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

кроме того.. тут происходит неявное испльзование операторов сравнения. На языке Ершова, задачу следоволо-бы сфолрмулировать: "Без использования "ЕСЛИ"... У Вас "Если" используеться..
  Ответить с цитированием
Старый 22.08.2008, 13:23   #18   
просто Гений
 
Сообщений: 3,133
Регистрация: 22.01.2007
Возраст: 51

RDS вне форума Не в сети
Цитата:
Сообщение от Capra hircus Посмотреть сообщение
Профессионал, даже предложив такой способ, обязательно должен сделать оговорку, что применять этот способ не следует никогда, потому как есть более надежный, легкий способ, легко понимаемый при изучении кода другим человеком.
И второй раз несогласен! Бывают задачи с ограниченными ресурсами, ну ФИЗИЧЕСКИ нет свободной ячейки памяти... И что отказываться выполнять задачу? Менять ТЗ? Или все-же найти способ сделать задачу?
Тут еще дополнительно раскрываеться характер кодера. В общем нормальный тест..
  Ответить с цитированием
Старый 22.08.2008, 13:57   #19   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 43

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

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

если хочется чтото проверить то надо дать просто задание по теме чем занимается фирма, дать док с кодингстандартом которого придерживается фирма чтобы не оценивать насколько соискатель угадал "правильный" ( фирменный ) стиль программирования.
  Ответить с цитированием
Старый 22.08.2008, 14:00   #20   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 43

The_God вне форума Не в сети
Цитата:
Сообщение от RDS Посмотреть сообщение
И второй раз несогласен! Бывают задачи с ограниченными ресурсами, ну ФИЗИЧЕСКИ нет свободной ячейки памяти... И что отказываться выполнять задачу? Менять ТЗ? Или все-же найти способ сделать задачу?
Тут еще дополнительно раскрываеться характер кодера. В общем нормальный тест..
тамже на 1с програмера брали какие там нафих ограничения ??? ... даж англиские буквы знать наверна не обязательно
  Ответить с цитированием
Старый 22.08.2008, 16:09   #21   
Out There
 
Аватар для Part!zan
 
Сообщений: 5,910
Регистрация: 13.12.2004
Возраст: 47

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

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

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

alexz вне форума Не в сети
Цитата:
Сообщение от 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;
}
}
если корень из разности кидает исключение, значит она отрицательна)) но это уж совсем тормозной способ.
  Ответить с цитированием
Старый 23.08.2008, 09:16   #23   
IGBT
 
Аватар для Pengvin
 
Сообщений: 534
Регистрация: 09.10.2005

Pengvin вне форума Не в сети
Цитата:
Сообщение от RDS Посмотреть сообщение
Бывают задачи с ограниченными ресурсами, ну ФИЗИЧЕСКИ нет свободной ячейки памяти..
Если вопрос поставлен так, тот тут как раз задача решается на ассемблере и знание архитектуры бывают важней знаний всяких программистских этюдов.

Вобще если вопрос заходит о таких извращения, тот тут на самом деле надо решать действительно ли выгодно данное решение в плане производительности, код для сравнения чисел вычитанием, который я привел занимает не так уж и много места, а вот будет ли аналогичное решение допустим на С быть меньшим по размеру и по производительности быстрее это вопрос. Эта любовь к сомнительной оптимизации делает код во-первых нечитаемым, во-вторых не всегда приводит к росту производительности, если не делает хуже, надо смотреть по контексту задачи. Я видел иногда очень веселый код, например кодера который помешан на указателях у него параметры передавались примерно так:
int foo(int *i)
причем в аргумент есть одна единственная переменная, т.е. это все передавалось int z; foo(&z). Собственно размер указателя на int равен самому int. Т.е. человек слышал, что указатели это круто, но видимо с трудом понимает что они представляют.
Это имхо
  Ответить с цитированием
Старый 23.08.2008, 17:47   #24   
Форумец
 
Аватар для QuickSilver
 
Сообщений: 691
Регистрация: 01.02.2008
Возраст: 41

QuickSilver вне форума Не в сети
Классика задач для подготовки олимпиадчиков. Только зачем такие задачи в 1С, имхо, не понятно
  Ответить с цитированием
Старый 23.08.2008, 22:00   #25   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,144
Регистрация: 18.09.2006
Возраст: 42

xxx-men вне форума Не в сети
моя в ужосе, какие дебаты!!!!!!!


но возникло пару вопосов не совсем по теме
Цитата:
Сообщение от 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;
и это в некоторых случаях тоже....???
  Ответить с цитированием
Старый 23.08.2008, 22:31   #26   
Форумец
 
Аватар для QuickSilver
 
Сообщений: 691
Регистрация: 01.02.2008
Возраст: 41

QuickSilver вне форума Не в сети
В книге "Особенности национальных задач по информатике" приводится именно вариант с xor. Видимо, оттуда задачку и взяли
  Ответить с цитированием
Старый 24.08.2008, 01:10   #27   
Форумец
 
Сообщений: 16
Регистрация: 05.08.2008

quice вне форума Не в сети
Ну да задачки супер, суть вся сводиться к тому, чтобы с ж.. начать оптимизировать. В 1С насколько я знаю, основная задача чтобы работала, а не выеб...я с написанием кода. Более того все узкие места там с получением и обработкой данных из БД - которое ни 1С нормально делать не умеет, не большинство кодеров, которые в этой сфере работают(только 1С++ и ToySQL спасают, и то не от всех кодеров), а не в расчётах а + б. Впечатление складывается, что конторка то лажовая, ну или отдельные придурки, которые в ней работают, начитались туфты и решили перед начальством рубануться "- типа вот какой у нас крутой тест". Такие задачи в КБ ещё допустимы, а не у франчей))))).
  Ответить с цитированием
Старый 24.08.2008, 08:02   #28   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 43

The_God вне форума Не в сети
Цитата:
Сообщение от xxx-men Посмотреть сообщение
это же с double не прокатет.......???
прокатит с любыми типами если применить эту операцию к битам
  Ответить с цитированием
Старый 24.08.2008, 15:57   #29   
Форумец
 
Аватар для The Fat Old Sun
 
Сообщений: 170
Регистрация: 07.03.2004
Возраст: 41

The Fat Old Sun вне форума Не в сети
Цитата:
Сообщение от 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);
  Ответить с цитированием
Старый 25.08.2008, 08:26   #30   
просто Гений
 
Сообщений: 3,133
Регистрация: 22.01.2007
Возраст: 51

RDS вне форума Не в сети
alexz,
ИМХО
функция МАХ не совсем подходит, она же возвращает максимальное их вдух, а значит сравнивает их.. хотя и не являеться оператором сравнения.

А вот корень из разности, это интересный и оригинальный вариант. Можно поставить подпрограмму обработки ошибок и в этом случе действительно не будем использовать оператор сравнения..
Если ошибки не возникла программа пошла по одному пути, если возникло по дургому.
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind