Как стать автором
Обновить

Комментарии 113

Если посмотреть на список людей, получивших выплаты, и просуммировать их, то получится $25,250, что уже превышает бюджет в $25k.
То есть никто уже больше выплат не получит до тех пор, пока бюджет снова не увеличат.
Теория заговора интересная, но разгадка как всегда очень простая: страницу забыли обновить. Сейчас попробую это исправить, спасибо.
Заманчиво. Жаль, что я не программист на C.
НЛО прилетело и опубликовало эту надпись здесь
Пару дней.
Что-то мне не нравится, что вместо 5 минут у меня потребовалось 7, и оба решения мне не нравятся.
Да и вообще, API мне не нравится.

И да, есть еще 3е решение, исключительно на одном из инклудов, но мне такой подход кажется вообще маразмом.
В общем, всё выглядит так, будто задание неполное, и реализовывать как бы то ни было при таком ТЗ вообще кажется странным.
использование str_cpy и str_cat небезобасно, вот strl_xxx совсем другое дело
Забавно. Я не С программист, но применил почти забытые знания из университета и гугл-фу — вроде неплохо получилось, отправил решение.
Интересна статистика через пару недель: много ли таких как я — не целевой аудитории, которая польстилась на деньги?
а есть на javascript такое же? хочу 500 долларов
Есть, но там без призов, только работу предлагают.
Вы серьезно? Вы же понимаете сколько сейчас с хабра понабежит ваши задачи решать ради лулзов, это же влетит в копеечку (я уж не стал отправлять просто т.к. не ищу работу на си и разорять вас ни к чему)
Конкурсы это здорово, но на работе не конкурсы а рутина.
Не совсем точное ТЗ.
Должны ли результирующие функции использовать стандартный формат ASCIIZ и оставлять на совести разработчика потенциально возможный вызов с аргументом, указывающим на строку без null-терминатора, что может привести к переполнению буфера?
Как будет реализована str_free? Будет ли это просто враппером над стандартным free, что дает нам использовать стандартный malloc для выделения памяти?
Если я правильно понимаю подразумеваемые моменты, то ответы на оба вопроса будут — да. Но хотелось бы уточнить, прежде чем приступать.
Ответ на первый вопрос вытекает из условий, не обратил внимания сначала.
На второй — остается верить своей догадке.
Отправил решение, не столько ради денег, сколько из любопытства — верно ли я понял ТЗ :)

Правда, мне правда интересно, не слишком ли легкомысленно было писать о подобном конкурс на хабре? Здесь, я полагаю, найдется приличное количество людей, способных легко решить эту задачу.
Согласен со всеми поднятыми вами вопросами. И добавлю: там на самом деле еще больше тонкостей. В связи с этим решение (которое может претендовать на приз) растягивается далеко не на 5 минут, даже если вы опытный программист.
А в чём, собственно, первичная цель? Функции должны быть эффективнее библиотечных?
Непонятно совсем что-то. Если главной целью не является производительность, тогда в чём смысл изобретения велосипеда?
Либо, если нужна максимальная эффективность, тогда может пострадать читаемость или кроссплатформенность.
Ну так главная задача — угадать что организаторы понимают под " хорошим решением" :) А вы думали просто так 500 долларов дают?
Может они как раз и не хотят велосипед и достаточно просто передать параметры далее в библиотечные функции :)
НЛО прилетело и опубликовало эту надпись здесь
Я участвовал в этом конкурсе и по результатам общения с организаторами могу подтвердить вашу догадку. Это именно конкурс «угадай мысли организатора». Например, организаторы считают нормальной практикой допущение undefined behavior в некоторых случаях. Конечно, в пользу этого у них есть множество аргументов.
Справедливости ради замечу, что опытный программист (а именно такие требуются фирме) должен быть способен угадать большинство мыслей организаторов. Не забывайте, что основная цель данного конкурса — поиск подходящих программистов. А просто так красиво решить задачу, чтобы срубить бабла — очень непросто. В общем, совет всем, кто думает сделать попытку — подходите к делу обстоятельно. Обдумывайте каждую мелочь. В интернете, на сайте компании, есть страничка с «рекомендованным чтением» — прочтите ее внимательно.

Вам могут предложить работу, даже если вы не на 100% справитесь с заданием, но при этом продемонстрируете свои профессиональные качества. Но эта работа требует на самом деле много знаний и опыта. Не каждый с ней справится.
Еще пара советов соискателям. По каждой библиотечной функции, которую вы вызываете; по каждому оператору — обязательно почитайте стандарт, обратите внимание на все тонкости. Вас могут завалить на незнании каких-то аспектов работы функций или операторов, которые в реальной жизни редко проявляются. При этом стандарт не панацея — в некоторых случаях можно обоснованно (с точки зрения организаторов) допустить undefined behavior. Тут нужно руководствоваться вашим опытом, интуицией и знанием архитектуры современных компьютеров.

Если из условия вам непонятно, предъявляются ли жесткие или мягкие требования к тому или иному аспекту работы вашей «библиотеки» — считайте, что требования жесткие. Ведь сказано: «library quality code», а не «quick and dirty hack». Представьте себя на месте организаторов. В мире много желающих срубить $500, а призовой фонд ограничен. Также в мире встречаются большие мастера программирования на C, и они тоже присылают свои решения. Ваше должно смотреться очень внушительно на фоне остальных, чтобы иметь шансы получить приз. Поэтому вас будут валить на любой мелочи, и прежде, чем отправлять решение, подумайте, как его можно завалить, и убедительно аргументируйте каждый аспект своего решения исходя из позиции: «library quality», «large-scale application».
Мне нужна работа, но в подобных разводах участвовать отказываюсь.
Правда си я трогал всего то пару раз (на первый взгляд знаю решение).

Обычно надо угадать как составить резюме, что бы был шанс на собеседование, а тут надо угадать решение. А деньги только ради привлечения внимания.
Если применять термин «лотерея», то надо отметить, что билеты тут бесплатные (ну, почти бесплатные: сколько стоят 5 минут вашего времени?).
С этим уточнением лично я не вижу никаких проблем в условиях конкурса. Хотите попробовать «вытянуть удачный билет» — пробуете. Не хотите — не пробуете.
Поэтому от резюме и стараются отказаться, т.к. на должность Senior %language% developer резюме отправляют вообще все, в т.ч. «трогал %language% пару раз» и «ох, мы это вроде проходили в универе, я тогда болел, но все равно напишу».

От этой угадайки приходится тратить время на заведомо неприятные и бессмысленные собеседования. Сам этой фигней раньше занимался, набирали веб-разработчиков на пхп для поддержки одной штуки. В резюме написано – Apache. Спрашиваю, мол, ну расскажи про Apache что-нибудь. «А, ну, это короче там скачиваешь такой Denwer, и в нем вот по-моему что-то такое есть, оно для пхп в общем, такие дела.»

То есть соискатель именно что угадал, как составить резюме – подобрал ключевые слова. С заданиями, даже простыми, так не получится.
То есть соискатель именно что угадал, как составить резюме – подобрал ключевые слова. С заданиями, даже простыми, так не получится.
Не вижу разницы. Даже скажу, что задания выполнять для меня проще, чем составлять какие то странные бумажки, я программист или кто.
задания выполнять для меня проще, чем составлять какие то странные бумажки, я программист или кто
Т.е. цель достигнута: фирме ведь нужен программист, а не кто-то другой.

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

Напомню, что задача нужна совсем не для того, чтобы хороший соискатель страдал. Она не должна быть сложной.
А почему вы спрашиваете?
НЛО прилетело и опубликовало эту надпись здесь
Отправил решение. Жду ответа в любом случае)
Интересно, «размял» мозги. Ради прикола отправил решение.
Неясно за что минусят. Я что, кому-то помешал, тем, что отправил своё решение? Я действительно отправил ради прикола, почему нет? Мне действительно интересно, получить ответ.
Этот коммент «не в струю» видимо :)
Сегодня пришел ответ с просьбой писать комментарии на английском и что им пришло около 400 писем, так что проверка займёт время :D
Интересно, как они поступят, если большая часть из них прислали корректные решения.
не прислали. я уверен что моё решение — некорректное, но мне просто интересно получить уточнённое ТЗ.
Важно прислать не просто корректное, а как я понимаю элегантное, универсальное, оптимизированное. Возможно я допустил косяк, что не откомментил код. Возможно комментарии тоже считаются, возможно код должен быть красивым. Мне стало интересно, потратил 15 минут времени, отправил. Посмотрим.
Мне кажется, что мы все говорим о разных задачах. В особенности MichaelBorisov. Уж больно он нагнетает обстановку. Учитывая название(5min_challenge) и их замечание о 7 строчках на функцию. Хочется уже здесь начать обсуждать конкретный код и прийти к какому-то общему заключению.

К организаторам, неужели до 31 марта нельзя обсуждать конкретный код?
Хотя признаюсь, одну довольно существенную оптимизацию я упустил.
А организаторы разве запрещают обсуждать код?
Мне казалось это правилом по умолчанию в различного рода интернет олимпиадах. Но раз можно, тогда я начну.
Если не секрет, можно ли озвучить статистику. Сколько людей прислало с момента публикации? Сколько успели проверить?
Оставлю свои пять копеек по поводу того как нужно нанимать людей. Контора SlamData (специализируется на Scala и является работадателем очень известных Scala гуру таких как Daniel Spiewak) предлагает такой подход: вы присылаете pull-request в их флагманских продукт Precog и за это сразу-же получаете либо job-offer либо чек с оплатой потраченного времени.
Да, пулл-реквесты это классно.
А не могли бы вы (автор) прокомментировать то, что вылезает на второй ссылке, когда гугл просишь поискать «Hola — Олимпиада программистов»?
Развод для программиста
Запросто. Это называется слабоумием.
По сути ведь нет ноухау в функциях strcat/strcpy. Нет смысла за них как-то «разводить».
Участвовал в этом конкурсе. Отослал свое решение, в итоге мне сказали, что я не гожусь, хотя в условии ясно говорилось, что дадут 2-й шанс, не дали и не сказали почему. Когда спросил почему, ничего внятного не сказали, сказали попробуй еще раз написать. Написал другое решение — в ответ 0 реакции. Также я по реферальной системе предложил решить задачу своему знакомому, он решил, ему что-то ответили, указали на что-то, он послал новое решение, оказалось что не пригоден. В итоге я решил, что это лохотрон. Не знаю каких кодеров там нашли и какое правильное решение с их точки зрения, но на лицо двойные стандарты.
Я тоже отправил, но ещё пока не обидели)) На меня уже произвели неизгладимое влияние Java и Javascript, поэтому я больше не делаю никаких сложных фокусов, даже когда пишу на С. Может быть, фокусы — это то что требуется, или максимально bulletproof-код.
По своему опыту общения с организаторами скажу: требуется доскональное знание стандарта C, стандартной библиотеки. Нужно в деталях знать все функции библиотеки. Нужно иметь большой опыт программирования на Си, знать хорошие и плохие практики. Знать архитектуру современных компьютеров и компиляторов. Иметь опыт разработки, или участия в разработке, крупных программных проектов. Знать методы оптимизации программ по быстродействию и использованию памяти.

Задача, выставленная на конкурс, на самом деле очень сложная, учитывая все требования, предъявляемые к решению. Часть требований в условии не озвучена, и соискатель премии должен сам эти требования додумать. Это тоже часть задачи — дополнить условие.

Читайте и другие мои рекомендации выше.
Это все требуется для того чтобы написать str_cpy? Загляните в glibc. Чем не угодили предложенные там функции?
Да, все это требуется. Без преувеличений. В стандартном Си нет функций с таким интерфейсом и семантикой, как str_cpy и str_cat в данном задании. Может быть, в glibc есть какие-то нестандартные расширения с такими возможностями — не знаю.
решил задание. жду ответ…
НЛО прилетело и опубликовало эту надпись здесь
Что ж, раз habrahabr.ru/post/213529/#comment_7349145 не запрещают обсуждать код, то давайте здесь обсудим возможные решения.
Мой вариант
char * str_cpy(char **s0, const char *s1)
{
  size_t len = strlen(s1);
  char *result = (char *)malloc(len+1);
  memcpy(result, s1, len+1);

  if (*s0)
    free(*s0);
  *s0 = result;

  return *s0;
}

char * str_cat(char **s0, const char *s1)
{
  if (*s0)
  {
    size_t len0 = strlen(*s0);
    size_t len1 = strlen(s1);
    char *result = (char *)malloc(len0+len1+1);
    memcpy(result, *s0, len0);
    memcpy(result+len0, s1, len1+1);

    free(*s0);
    *s0 = result;
  }

  return *s0;
}

Одна, на мой взгляд, возможная оптимизация в str_cpy: если длина текущей строки больше или равна новой, то память можно не выделять, а сразу копировать на место старой.
по поводу последней фразы — не, сразу копировать нельзя. по крайней мере, не через memcpy а через memmove.
А то они пересекающиеся строки подсунут, типа вот из задания:
str_cpy(&s, s+5);
Там ведь не совсем пересекающиеся строки. Левый указатель всегда будет меньше или равен правому, если правая подстрока подмножество левой. Поэтому при копировании не должно быть проблем.
hola.org/issues.html
Whether these cases happen in the sample main() supplied, or in other valid reasonable use-cases.

так что не всегда, можно и наоборот сделать
str_cpy(&s, «something»);
char* p = s+3;
str_cat(&p, s);

а, тут str_cat… все равно, что-то мне не нравится. у меня такое же решение, я его слать не стал.
str_cpy(&s, "something");
char* p = s+3;
str_cat(&p, s);

А такое использование действительно подразумевается? В этом случае мы не можем и не должны освобождать старую память, а как это определить?
претендентов-то много :)
меня еще вопрос интересует — а если невалидную строку подсунут? или очень длинную, чтоб strlen не справился?
еще, я бы для str_cat воспользовался realloc()
Можно добавить всевозможных защит от дурака, но это всегда в ущерб производительности, ведь использование все же подразумевается корректным. И, кстати, как может strlen не справится с очень длинной, но корректной строкой?

Да, realloc там как нельзя кстати. На пару строк кода меньше. По производительности думаю будет одинаково, выделяем же память без запаса.
и после realloc-таки придется использовать memmove, грабли с пересечением будут и в этой функции ))
Приведите корректный пример, который подразумевает пересечение строк и который не будет работать с memcpy.

То, что вы привели выше:
str_cpy(&s, "something");
char* p = s+3;
str_cat(&p, s);

я считаю некорректным примером, т.к. программа упадет еще на realloc-е. Мы не можем освободить старую память, т.к. указатель указывает не на начало выделенного блока памяти.
НЛО прилетело и опубликовало эту надпись здесь
Именно. А значит можно использовать memcpy без перевыделения памяти в случае, если новая строка меньше или равна по длине старой, перекрытия не будет.
НЛО прилетело и опубликовало эту надпись здесь
кстати, а если malloc вернет null?
Значит что-то действительно пошло не так и пусть лучше упадет. Но, может быть, лучше добавить проверки.
тогда решение не пройдет, по причине
«Invalid memory writes» из списка который я привел выше
Как вы вообще нашли эту страницу — отдельный вопрос)
НЛО прилетело и опубликовало эту надпись здесь
Всевозможная защита от некорректного использования это ваши подводные камни? По остальным пунктам выше уже обсудили.

Если использовать realloc в str_cat, то она может выглядеть как-то так:
char * str_cat(char **s0, const char *s1)
{
  if (*s0)
  {
    size_t len0 = strlen(*s0);
    size_t len1 = strlen(s1);
    *s0 = (char *)realloc(*s0, len0+len1+1);
    memcpy((*s0)+len0, s1, len1+1);
  }

  return *s0;
}
НЛО прилетело и опубликовало эту надпись здесь
Это будет не memory leak, старую память он освободит. И мы опять возвращаемся к тому, что если при выделении памяти вам возвращают NULL, то вряд ли ваша программа будет дальше корректно работать, независимо от того, обработаете ли вы эту ситуацию или нет.

UPD:
Прошу прощения, не освободит, да, mem leak.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Это не требование. Там есть замечание, что есть эффективное решение в 7 строк. Но эффективное не обязательно идеальное
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Организаторы конкурса считают glibc хорошим примером «library quality code». Поэтому, если в своем решении вы будете придерживаться тех же подходов, что встречаются в glibc — то у вас есть хорошие шансы.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Мы же говорим о str_cat, а там не важна длина второй строки, конкатенация же, поэтому всегда(ну или почти всегда) будет происходить malloc/free.
Да, это так, но это будет в любом случае, если мы выделяем новую память, т.к. старую мы обязаны освободить, так что невалидный указатель остается.
НЛО прилетело и опубликовало эту надпись здесь
код-то проверяли? запускали?
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Все, кто сомневается, как нужно отрабатывать ошибки вроде возврата NULL из malloc/realloc, а также по другим вопросам: почитайте внимательно эту страницу:

hola.org/basics

там содержатся ответы на многие вопросы.
Там бред содержится, имхо.
Просто один из coding convention'ов компании, совершенно не претендует на хороший код. Это то, что хотят видеть ОНИ, а не большинство. Почитал и ужаснулся.

Бред раз
Trivial > >= < <= == != expressions should not have spaces around them.
Trivial expressions examples: a_var, array[3].var[1], sizeof(xxx), (x + 1)
Pointers (->) are not counted as trivial expressions for > >= < <=, since its
hard to read x->y>z, while its not hard to read x->y==z.
BAD
    if (x > 5)

GOOD
    if (x>5)

BAD
    if (x+1>5)

GOOD
    if (x+1 > 5)

BAD
    if (f(x, y) > g(y, z))

GOOD
    if (f(x, y)>g(y, z))

BAD
    if (x->y == 5)

GOOD
    if (x->y==5)

BAD
    if (x->y>=5)

GOOD
    if (x->y >= 5)

Разве удобно читать такой ад? А когда десяток флагов проверяется, тоже всё скомкать, чтоб глаза вытекли? А последние 2 примера, вообще противоречат друг другу…

Бред два
Dont use 'const char *' (or 'char const *') in code. It is impossible to
integrate code written with consts into a large system.
BAD
    const char *gen_token(const char *seed);

GOOD
    // Return a static buffer - dont change.
    char *gen_token(char *seed);

Что это? о_О Гугловый конвеншн, например, наоборот говорит: используйте квалификатор const везде, где это возможно. Сами пишут, что нужно писать «как в тру либах типа libc». Что-то я не видел, чтобы в libc запрещали использовать константы.

Открываем документацию для разработчиков libc и внезапно видим:
Character arrays that are declared const cannot be modified either. It's generally good style to declare non-modifiable string pointers to be of type const char *, since this often allows the C compiler to detect accidental modifications as well as providing some amount of documentation about what your program intends to do with the string.

Бред три
don't put a space after increment and decrement. increment after the value, not
before.
BAD
    i --;
    ++j;

GOOD
    i--;
    j++;

Аналогично, видел в каком-то конвеншне указание использовать только пре-(ин\де)кремент, а не пост-.

Бред четыре
no space between function name and opening brackets
no space between opening brackets and first parameter
one space after comma:
BAD
    printf ("hello %s\n", "world");
    printf( "hello world\n" );
    printf("hello world\n","world");

GOOD
    printf("hello world\n", "world");

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

PS Создаётся впечатление, что ищут не программиста\разработчика\«инженера», а быдлокодера — тупого, бестолкового зомби-набивателя_кода_на_клавиатуре, не более.
PPS Опять же, IMHO. Есть там и довольно интересные советы.
Вы правы, именно расстановка пробелов отличает инженера от тупого быдлокодера.
А более конструктивных аргументов против, кроме минусования профиля у вас нет?

Интересует хотя бы пара вопросов:

  1. Почему тогда изначально перед «конкурсом» это условие не было обговорено, что раз уж пишете не пойми что, с не пойми какой задачей, то пишите по такому-то coding convention'у. Изначально нечестный подход. Получается, что что-то выиграет только тот, кто случайно попадёт пальцем в небов ваш стиль программирования. А это будет процентов 5, от силы.
  2. Зачем упоминается качество реализации libc как пример, в то время, как ваши соглашения противоречат соглашению данной библиотеки?
А более конструктивных аргументов против
Разве удобно читать такой ад
Coding conventions нужны именно затем, чтобы не переливать из пустого в порожнее и не спорить с каждым юниором про эту фигню. Бессмысленный разговор бессмысленный, не может быть конструктивной аргументации против «разве удобно читать такой ад», «а я вот так привык», «мой текстовый редактор Visual Eclipse++ ставит пробелы лучше» и т.п. бессмысленных вещей.

А вопросы, это всегда пожалуйста:

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

2. См. 1
1. Приведенные соглашения к задаче непосредственного отношения не имеют, это было бы даже немного странно.

Вы правы. Действительно, странно.

Позицию вашу понял, дальнейший разговор считаю бессмысленным, можете не утруждать себя ответами и минусами.
Вы борец за справедливость или вам нужна информация, которая может помочь вам победить в конкурсе?
Ваши слова — да в уши тем, кто проверяет решения. Тихонько скажу по секрету, что Coding Conventions тоже проверяются. Тут вы либо оформите код так, как от вас требует заказчик (или начальство) — либо устроите на эту тему жаркие споры.

Дополнительно замечу по поводу споров о Coding Conventions. Допустим, вас берут на работу, включают в крупный проект, создание которого уже потянуло добрый десяток человеко-лет. В этом проекте все оформлено в соответствии с Coding conventions, которые вам не нравятся. Также от вас требуется соблюдать ненавистные conventions в новом коде, который вы пишете. Ваши действия?
Позволю себе высказать свое мнение. Я, как мне кажется, уже переболел тем, что всем навязывал свой стиль кодирования. Поэтому сейчас просто придерживаюсь того, который уже используется в проекте. Но. В условиях данного конкурса нигде не сказано, что следует соблюдать определенные правила кодирования.
Код, написанный вами, должен соответствовать по качеству библиотечному коду, как в хорошей имплементации libc.
Это слишком расплывчато.

Если организаторы, будем говорить условно, вычитают балл за несоответствие какому-то конкретному code convention, то это действительно бред.
Это слишком расплывчато.

Так в том и дело, что в их coding convention'е куча противоречий с dev-документацией libc.
Зачем было это писать, я не понимаю.
Да я не об этом говорю. Совершенно.
Я нисколько не против соглашений о коде.

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

Выше Thunderbird писал, что докопались до минимизации токенов в коде, а это чистый кодинг конвеншн. Так что какая может быть речь об адекватности конкурса. Обычный хантинг с минимальными затратами.
Вопрос к тем, кто отправил решение и получил ответ.
Сколько времени прошло между отправкой и ответом?
А то я решение отправил, а ответа нет никакого.
Обычно 2-3 дня, но прямо сейчас может пройти неделя – почтовый хабраэффект.
Ровно неделя.
Прошла неделя. Мне написали, что проверяют.
P.S. Есть ощущение, что письмо генерировали умным автопереводом на русский.
На самом деле уставшей девочкой.
Это печально. На самом деле уровень организации конкурса для внешнего наблюдателя является неплохим мерилом того, что происходит внутри компании. Мне кажется, этот уровень можно было бы повысить почти бесплатно.

Я могу сказать, чтобы сделал бы я на месте организатора.
1. По своему опыту, качественно проверять стоит только два-три исходника за один заход. В день можно сделать четыре захода — 8-12 исходников. Итого, на 400 посылок получаем примерно 40 рабочих дней на ответ, т.е. два месяца.
2. Безмолвно заставлять ждать людей два месяца некрасиво. Я бы сообщил о том, как устроена проверка, выдал участнику номер, и где-нибудь вывесил список ориентировочной даты ответа (номер -> дата). Для этого, можно было бы даже написать бота.
3. Условия конкурса можно было бы сформулировать более четко. Нигде не описан формат посылки. Я бы с удовольствием перед проверкой глазами, прогнал решения через автоматические тесты. Приводить к стандартному виду все исходники — лишняя работа для проверяющего.
Согласен, да.
В данный момент этот проект очень факультативный, возможно в будущем что-то такое сделают, я не уверен.

Про внешнего наблюдателя – ну не знаю, мне обычно интуитивно понятно, что девочка-рекрутер и другие предметы и явления в отделе кадров почти никак не связаны с остальной фирмой. Очередь в кассу кинотеатра никак не характеризует сюжет фильма, или характеризует очень опосредованно.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации