?

Log in

No account? Create an account

Badula

Previous Entry Share Next Entry
02:01 pm: Научное

Некоторые люди ходят в университеты не потому, что их туда пинком оформили мама и папа, а потому, что тяга к знаниям перевешивает тягу к гонкам на подержанном мотоцикле с утра до ночи с последующими оргиями.

Закончив универтитеты, эти редкие люди составляют блестящие резюме и начинают искать достойную себя работу.

Один из свежих выпускников торонтского университета с математическим уклоном, изучавший computer science и настоящий канадский китаец пришёл трудоустраиваться программистом в компанию, производящую навороченные микросхемы.

На интервью выпускнику была предложена простенькая задача, для того, чтобы оценить стиль оформления первичных навыков. Задача - написать функцию, преобразующую целое число в строку, так сказать. Без наворотов и обвеса даже.

Первая попытка
char *itoa(int i) {
  char buffer[20);
  return sprintf(buffer, "%d", i);
}
Вторая попытка
char *itoa(int integer) { 
char str[20]; 
for (each digits in integer = i) { 
 
   int in = integer[i]; 
 
   switch  (in) { 
   case 0: 
    str[i] = 0; 
    break; 
   case 1: 
   str[i] = 1; 
   break; 
 
and so on to 9
 
} 
} 
}

But I don't know how to extract a digit from a number...
Третья попытка спасти положение
char *itoa(int integer) { 
int factor = 1; 
char str[20]; 
 
while (round(integer/1) != 0) { 
 
 
factor = factor*10; 
} 
 
factor = factor/10; 
 
while (factor > 1) { 
  
int in = round(integer/factor); 
  
switch  (in) { 
  
case 0:  
str[i] = 0;  
break; 
   
case 1: 
   
str[i] = 1; 
   
break; 
  
and so on to 9
  
} 
 
factor = factor/10; 
} 
}

Дзен? Дзен.

Впрочем, оно и понятно. Вот, скажем, посмотрите на рекламу справа от книги столпа алгоритмического мастерства... На халяву-то, что угодно интересней какого-то там искусства программирования.



Comments

[User Picture]
From:moon_aka_sun
Date:August 11th, 2006 09:49 pm (UTC)
(Link)
Графическая реклама у меня отфильтрована, но внизу можно прочесть:

  Щёлкните по ссылке вверху страницы «Проститутки Москвы»;

:)))

A вообще, офигеть. А ведь устроится (ведь в конце концов), и будет писать промышленный код!
From:igorama
Date:August 11th, 2006 09:59 pm (UTC)
(Link)
Первая попытка вполне себе многообещающая. Откуда вторая и третья взялись, интересно. Если интервьюер до такого довёл, то настоящий мастер.
From:igorama
Date:August 11th, 2006 09:57 pm (UTC)
(Link)
Oh my... Learn C++ in 1 hour... А халява не тянет. Показали бы женщину красивую, а то жеребец какой-то в стерву мастурбирует. Кому такое интересно? И что за пиздёж по поводу ассемблера?
[User Picture]
From:badula
Date:August 11th, 2006 10:00 pm (UTC)
(Link)
Думаю, человек, писавший аннотацию, тоже из торонтского университета с математическим уклоном и для него всё, что не Паскаль - ассемблер.
[User Picture]
From:garm
Date:August 11th, 2006 10:20 pm (UTC)
(Link)
Что забавно, книгу на страничке можно получить на халяву, а то что на картинке - на халяву не получится. Дезинформирует автор страницы.
[User Picture]
From:3a4ot
Date:August 12th, 2006 01:01 am (UTC)
(Link)
Забыл я совсем С, но попробую:

char *itoa(int number)
{
char *str = malloc(20);
int i=0;
if (number < 0) {
number = - number;
str[0] = '-'; i = 1 ;
}
while (number != 0){
int digit = (number - 10*(number/10));
// это если я правильно помню ASCII таблицу
str[i] = '0'+ digit;
number /=10;
i++;
}
str[i] = 0;
return str;
}

Не пинать ногами, 10 лет ничего на С не писал :);
[User Picture]
From:badula
Date:August 12th, 2006 01:14 am (UTC)
(Link)
(number - 10*(number/10)); даёт последнюю цифру, а не первую (проще number % radix). Первую хрен получишь и приходится или выворачивать строку наизнанку, или строить её с конца. Оригинальное задание несколько более конкретно - написать itoa.
[User Picture]
From:alexgs
Date:August 12th, 2006 01:35 am (UTC)
(Link)
Это всё элементарно. Надо задавать более весёлые задачи, типа rtrim(s) в один проход, или swap(a,b) без третьей переменной, или кол-во битов в слове без цикла (в т.ч. развёрнутого).
[User Picture]
From:siberian_cat
Date:August 13th, 2006 04:50 am (UTC)
(Link)
Да это-то кому нужно - экономия на байтах. Если, конечно, позиция не для программиста микроконтроллеров с 8 кб памяти. Есть задачки и поадекватнее.

Я уже приводил пример из собственной жизни. Нормальный адекватный парень, работает давно, код его верно служит, не глючит. В Канаде с детства, выпускник университета. Родом даже не из КНР - из Гонконга. Но! когда ему надо узнать, сколько процентов дисковой памяти свободно, если N процентов занято, он пишет:

M = (N - 100) * (-1);

Вот что это - какой-то глубоко национальный способ мышления? Или в канадских университетах так учат? Но у нас работают прирождённые канадцы, ни в чём таком их упрекнуть не могу. И напарника, сербского словака, тоже не упрекну. Себя упрекну, но не в таких вещах.
[User Picture]
From:archer5
Date:August 12th, 2006 06:47 am (UTC)
(Link)
Cорри, Паша Карпенко?
[User Picture]
From:badula
Date:August 12th, 2006 03:13 pm (UTC)
(Link)
Так точно.
From:ex_kleinpo
Date:August 12th, 2006 07:28 am (UTC)
(Link)
Он будет менеджером :)
[User Picture]
From:pfuk_gaer
Date:August 12th, 2006 08:58 am (UTC)
(Link)
Но-но, попрошу!
Какой из него менеджер.
Нормальный менеджер уговорил бы его принять без теста и сразу на руководящую должность! :))

[User Picture]
From:moon_aka_sun
Date:August 12th, 2006 07:57 pm (UTC)
(Link)
Xexe. Самое интересное, что мне действительно надо было написать что-то подобное - только там и плавающие, и hex, и даты - для калькулятора. Ровно 4 года назад. Задача осложнялась тем, что весь код должен был влезть в 2*8 КB. Приходилось подбирать наиболее компактный код. О, нашёл кусок: !(date|i)*4 вместо date==0 && i==0 ? 4 : 0.
[User Picture]
From:qgm
Date:August 16th, 2006 01:58 am (UTC)
(Link)
Кстати, вот не понял, конечно короткая запись гораздо круче и сишнее :-), но вопрос - после компилятора разве они превратятся не в идентичный код? :-)
[User Picture]
From:qgm
Date:August 16th, 2006 01:56 am (UTC)

Сто лет не программировал... :-)

(Link)
Даже интересно.

char * itoa (int number) {

int div = 10000; //int is two bytes, can have only 5 decimal positions (2**16)
int pos = 0; // position in the string
char string[6];


while (div >= 1) {

if ((div==1 ) || ((number/div) != 0) || (pos>0) ) { // excluding leading zeros, but not other zeros and preventing empty string.
string[pos] = '0'+ (number/div);
pos++;
}

number = number - ((number/div)*div); //delete most significant digit
div = div/10;
} //end while

returm string;
}

Это для unsigned int соответственно. Signed почти то же самое, только ещё одна переменная понадобиться - флаг на знак.

Возмёте на работу? :-)
[User Picture]
From:badula
Date:August 16th, 2006 02:03 am (UTC)

Re: Сто лет не программировал... :-)

(Link)
Нам другие навыки нужны, но возвращать указатель на стек, выделенный для вызова - не комильфо. Ну и int - он может быть не только 2 байта, но и 4, или даже 8, а во всяких чипах, перемалывающих видео на лету, так и все 10, 12 или 16.
Powered by LiveJournal.com