Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Олимпиада программистов
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
igorle
Не знаю, разрешено ли здесь такие сообщения давать. Но надеюсь, что модератор не обидится.
Знакомая компания проводит олимпиаду по программированию. Решили поискать программистов в русскоговорящем мире.

Меня попросили рассказать, где могу. А я только на этом форуме и бываю. Причем только в разделе для начинающих.
http://hola.org/challenge_ru.html

Надо написать две простые функции на чистом С.
SyncLair
Уж простите но как то лохотроном попахивает )
igorle
Цитата(SyncLair @ Feb 25 2013, 19:10) *
Уж простите но как то лохотроном попахивает )

sm.gif
Я здесь хоть и не старожил, но достаточно давно общаюсь. Репутацией дорожу.
В чем лохоторон? Людей этих я знаю. Один из них, кстати, написал известный Windriver.

Люди ценят тех, кто умеет писать короткий и элегантный код. И считают, что такой метод поиска дешевле и эффективнее чем многочисленные собеседования. Задачи не так просты, как кажутся. Хотя я считаю, что embedded программистам решить их проще, чем остальным.

От вас ничего, кроме нескольких строчек кода, не требуется.

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

SyncLair
Да я не про вашу репутацию. Я про фирму. Ей наверное надо просто собрать базу ембеддеров. А чей код будет круче -- ведь чисто субъективная оценка.

Ну ладно убедили. На досуге что нить им напишу). Честно говоря с первого вгляда не понял как они в NULL копируют.
igorle
Цитата(SyncLair @ Feb 25 2013, 20:01) *
Да я не про вашу репутацию. Я про фирму. Ей наверное надо просто собрать базу ембеддеров. А чей код будет круче -- ведь чисто субъективная оценка.

База ембедеров им точно ни к чему. Они "чистые программисты". Хороших программистов они да, ищут. Код оценивается просто - есть тесты, которые он должен пройти, чтобы его приняли за идеальный.

Мопед не мой. Я просто знаю этих людей и у меня хорошие с ними отношения. Комментарий на русский я переводил. Они пытались после "google translate" текст оставить sm.gif
_Pasha
Цитата(SyncLair @ Feb 25 2013, 19:01) *
Честно говоря с первого вгляда не понял как они в NULL копируют.

lol.gif
Цитата
требуется имплементировать str_cpy()

т.е с проверкой и malloc() если его не существует, но при этом и вызов должен быть s=str_cpy(s, "Hola Hola"); без необоснованного использования двойных указателей
ReAl
Причём совершенно непонятно, круче будет тот вариант, который после str_cpy(&s, s+5); сразу сделает realloc() на меньший размер, чтобы сразу память освободить, или тот, котрый это дело отложит, а в str_cat() сможет по указателю узнать размер блока и закажет больше, чтобы влезло " Mundo".
Ну а str_printf() как-то сам должен " Mundo" на " World" менять, но реализация его пока не требуется.
Iptash
В функции str_cat перед конкатенации нужно Mundo еще и преобразовать в World что ли?
igorle
Цитата(Iptash @ Feb 25 2013, 22:24) *
В функции str_cat перед конкатенации нужно Mundo еще и преобразовать в World что ли?

Открою немного закулисы. В исходном варианте надо было получить "Hola Mundo". Я сказал, что лично я не знаю что такое мундо, гугл транслейт тоже не знает, и вообще по русски это звучит неприлично. Поэтому они решили заменить эту мунду в русском тесте на World. Вечером я заглянул, а там полмунды осталось....
Не обращайте внимание. Завтра почистят.
ReAl
Цитата(igorle @ Feb 25 2013, 22:00) *
В исходном варианте надо было получить "Hola Mundo".
...
полмунды осталось....
Да это как раз во всём задании понятнее всего.
Я когда про преобразование в str_printf-фе писал, просто обломился смайлик поставить.
ViKo
Цитата(igorle @ Feb 25 2013, 23:00) *
Открою немного закулисы. В исходном варианте надо было получить "Hola Mundo". Я сказал, что лично я не знаю что такое мундо, гугл транслейт тоже не знает, и вообще по русски это звучит неприлично. Поэтому они решили заменить эту мунду в русском тесте на World. Вечером я заглянул, а там полмунды осталось....
Не обращайте внимание. Завтра почистят.

То - по испански. Hola - привет. Mundo - мир. Ваши друзья - испанцы!

Подкорректирую ответ. Гугл, естественно, справился с переводом. Нужно было нажать кнопку Автоматически определить язык. Складывается впечатление, что и по программированию вопрос задан так же нетолково.
_Pasha
Цитата(ReAl @ Feb 25 2013, 22:21) *
Причём совершенно непонятно

Функции с кучей побочных эффектов нуждаются в уточнении понятия идеальности.
Lotor
Цитата(ViKo @ Feb 26 2013, 13:37) *
Ваши друзья - испанцы!

Вы слишком категоричны. Они могут быть и колумбийцами.
Сергей Борщ
Мда... Олимпиада - высшее спортивное состязание. Тут же этим словом прикрыт банальный и циничный поиск дешевой, но квалифицированной рабсилы.
gerber
Цитата(SyncLair @ Feb 25 2013, 19:01) *
Честно говоря с первого вгляда не понял как они в NULL копируют.

А вот и не в NULL ... Передаётся-то в функцию ссылка на указатель. wacko.gif
igorle
Цитата(Сергей Борщ @ Feb 26 2013, 16:04) *
Мда... Олимпиада - высшее спортивное состязание. Тут же этим словом прикрыт банальный и циничный поиск дешевой, но квалифицированной рабсилы.

Блин. Это я так перевел. А как бы Вы перевели "Coding Challenge"? Русскоговорящий (но не русскомыслящий) товарищ из Холы перевел это "вызов кодирования". Хорошо еще что он узнал что я скучаю на больничном и попросил прочитать, что он там написал. Если предложите перевод лучше - они могут и поправить. Оригинал - здесь http://hola.org/hola_5min_challenge.html

Они ищут квалифицированных программистов, это да. Про дешевизну речи не было. Мозгоклюи они еще те (работать с ними мало кто может), но в банальности их еще никто не упрекал. Или сейчас все работодатели премии за успешно решенные тесты дают?
Сергей Борщ
QUOTE (igorle @ Feb 26 2013, 14:51) *
Если предложите перевод лучше - они могут и поправить.
А они заплатят за лучший перевод? Не имею никакого желания помогать капиталистам организовывать их набор сотрудников.

И вы и они тщательно убрали из заголовка цель всего мероприятия - набор сотрудников. Подменив ее в заголовке средством достижения этой цели - конкурсом. Банальный, простите, развод.
Возможно мне бы и было интересно соревнование ради соревнования, из спортивного интереса. А вот наниматься никуда не собираюсь и одолжения "может быть мы вам позвоним" мне тем более не нужны.
demiurg_spb
Цитата(ReAl @ Feb 25 2013, 23:21) *
Ну а str_printf() как-то сам должен " Mundo" на " World" менять, но реализация его пока не требуется.

А оно ИМХО и не реализуемо. Я было попробовал, но неизбежно переполнение буфера, т.к. нам не известен его требуемый размер...
Код
int str_printf(char** pdst, char* format, ...)
{
    va_list arg_ptr;

    va_start(arg_ptr, format);

    int x = vsprintf(*pdst, format, arg_ptr);

    va_end(arg_ptr);

    return (x);
}
Задания с багами даже на "Олимпиаде":(
ReAl
Цитата(demiurg_spb @ Feb 26 2013, 15:48) *
не известен его требуемый размер...
А чо™ — пробежаться по форматной строке в режиме dry-run :-), вычислить длину.
Потом по указателю на получатель уточнить у менеджера памяти реальный размер выделенного блока (он может отличаться от того, который запрашивали в тех str_cpy() и, возможно, перезапрашивали в str_cat()), например, потому, что менеджер памяти округляет размер блока до 16 или 32 байт. Ну и тогда уже решать, лезет в тот же блок или нет, перезапрашивать новый. Ну и потом уже реально печатать. Всё можно, было бы желание.
Кстати, в str_printf там еще может быть морока, в задании оно печатает в ту же строку, из которой берёт. В случае формата "!%s!" оно начнёт налазить само на себя, нужен какой-от промежуточный буфер либо совсем новый, указатель на который потом записывать в первый аргумент. Так что не зря пока сказано, что str_printf делать не надо :-)
Но и для str_cpy и str_cat подобная беда будет, там всего лишь проще считать необходимую длину.
demiurg_spb
Цитата(ReAl @ Feb 26 2013, 17:56) *
А чо™ — пробежаться по форматной строке в режиме dry-run :-), вычислить длину.
Ага учесть все возможные форматы *%+-0 u l d f s hu hhu .... и нигде не облажаться, ну-ну™....
Я пас!
Проще ещё раз реалоцировать буфер с офигенным запасом и использовать snprint. И это тоже буде та ещё кака, но зато рабочая в большинстве случаев.
ReAl
Цитата(demiurg_spb @ Feb 26 2013, 16:00) *
Ага учесть все возможные форматы *%+-0 u l d f s hu hhu
Ага, и %*.*s c правильной отработкой отрицательной ширины поля в аругменте.
Ну так ведь олимпиада™ и прочий контест™ с челленджем™
Дорога героев.

А буфер с запасом — удел слабаков. На 500 баксов не тянет.
_Pasha
Надо создать поток с переопределенной ф-цией putc() чтобы следила за размером буфера и вызывала realloc() по мере необходимости. Только не хоцца actual_size и cur_pos в статик хранить... некошерно. А, нифига, нормально - в FILE это все есть.
При выходе - ужать буфер до итогового размера и передать ссылку
igorle
про str_printf:
Цитата(demiurg_spb @ Feb 26 2013, 16:48) *
А оно ИМХО и не реализуемо.

Таки реализуемо. Обратите внимание - в английском варианте challengа требование к участникам из Jungo - реализоавть эти функции тоже. И кода должно быть не много 05.gif
SSerge
А потом этих гениев примут в штат и посадят очедную опердень писать.
Вот счастье-то.
_Pasha
Цитата(SSerge @ Feb 26 2013, 18:55) *
Вот счастье-то.

Счастье есть... sm.gif
Слесарь
Цитата(igorle @ Feb 25 2013, 19:18) *
- есть тесты, которые он должен пройти, чтобы его приняли за идеальный.

Помнится в программистском детстве прибаливал получить сертификат программиста ответив на подборку вопросов на сайте. Глупости все это...
А проработав несколько лет программером и казалось бы все знавше в своей области, несмог ответить на вопросы анкеты одной конторки, у них наверно была какая-то своя специфика кодинга. Например, мне ясно дали понять, если буду писать имена классов C++ не с буквы "К", а с буквы "C" как привык, я им не подхожу. у них своя особая идеология.
Олимпиада, это все очень сомнительно. Не подпадаеш под шаблон, выбываешь...
igorle
Цитата(Слесарь @ Feb 26 2013, 19:54) *
... Например, мне ясно дали понять, если буду писать имена классов C++ не с буквы "К", а с буквы "C" как привык, я им не подхожу. у них своя особая идеология


Это не имеет отношения к теме ветки совсем. Но раз уж мы все здесь собрались.... Code Convention - очень полезная вещь. Помогает читать код друг друга. На интервью (и на тестах) не важно как ты писал раньше, но если программист в _работе_ отказывается следовать правилам, принятым в фирме - это сильный аргумент за его увольнение.

А вообще, похоже что на этом форуме концентрация "волков-одиночек" выше, чем в среднем по больнице.
_Pasha
Цитата(igorle @ Feb 26 2013, 20:06) *
А вообще, похоже что на этом форуме концентрация "волков-одиночек" выше, чем в среднем по больнице.

Не ведутся на crappy papers? biggrin.gif
Слесарь
Цитата(igorle @ Feb 26 2013, 20:06) *
На интервью (и на тестах) не важно как ты писал раньше, но если программист в _работе_ отказывается следовать правилам, принятым в фирме - это сильный аргумент за его увольнение.

Наверное по этой причине из 30 лет сознательной жизни у меня только 3 года официального трудового стажа.
_Pasha
Цитата(Слесарь @ Feb 26 2013, 20:27) *
Наверное по этой причине из 30 лет сознательной жизни у меня только 3 года официального трудового стажа.

beer.gif У меня из 43-х минус 18 = 25 сознательной sm.gif также 3 года. Виват, новые цыгане!
Слесарь
Незнаю как и кто, но я ощущаю счастье в том, что пока еще могу себе позволить не работать.
ViKo
Воры в законе? disco.gif
_Pasha
Цитата(ViKo @ Feb 26 2013, 20:51) *
Воры в законе? disco.gif

Вы ж поймите, что мы не виноватыя, что определенная категория населения нашей всеобъемлющей Родины живет по такому же распорядку дня sm.gif
Буратино
Может вот так попробовать:

Код
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>

    
void str_cpy (char **a,  const char *b) {  
   int _size = strlen(b)+1;

   *a =realloc(*a, _size);
   memmove(*a, b, _size);
}


void str_cat (char **a, const char *b){
   int _size1 = strlen(b);  

   *a =realloc(*a, _size1);
   memmove(*a + strlen(*a), b, _size1);
}

int main() {
   char *s = NULL;
  
   str_cpy(&s, "Hola Hola");    
   str_cpy(&s, s+5);    
   str_cat(&s," World");    
      
   return 0;
}


"str_cat" можно переписать как вызовс сдвигами "str_cpy".
"memmove" потому как он хитро работает и учитывает перекрытия.
igorle
Цитата(Буратино @ Mar 18 2013, 14:08) *
Может вот так попробовать:
...

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

Сплетнями поделться могу. Я спросил организаторов, как идут дела. Они сказали, что отказались от идеи предлагать удаленную работу программистам из России/Украины. Но от своих обязательств по олимпиаде не отказываются. И если кто сможет решить задачу, то премию получит.

Пока никто не смог.
skripach
Цитата
Незнаю как и кто, но я ощущаю счастье в том, что пока еще могу себе позволить не работать.

А я вот напротив ощущаю счастье в том что могу позволить себе поработать.
Буратино
Цитата(igorle @ Mar 19 2013, 18:39) *
Я обещал не комментировать и никак иначе не помогать участникам. Так что, извините. Скажу только, что направление правильное, но пока что это не годится.

Сплетнями поделться могу. Я спросил организаторов, как идут дела. Они сказали, что отказались от идеи предлагать удаленную работу программистам из России/Украины. Но от своих обязательств по олимпиаде не отказываются. И если кто сможет решить задачу, то премию получит.

Пока никто не смог.


Да фиг с ней с премией, просто интересно!:)
"realloc" не перетирает информацию, ну или точнее дублирует информацию в переразмереном буфере, а это важно и для "str_cpy" и для "str_cat". "memmove" переставляет блоки данных даже если есть перекрытие, учитывая это. Лишнего ничего нет ,но функции свои функции выполняют. Проверка на NULL еще не обдумана, но это в конце концов детали.
demiurg_spb
Цитата(igorle @ Mar 19 2013, 18:39) *
Пока никто не смог.
Ой-ли...
igorle
Цитата(demiurg_spb @ Mar 20 2013, 08:17) *
Ой-ли...

Ничего удивительного.
Когда я говорю "никто не смог", я имею ввиду - из России/Украины никто не смог решить. В целом - они в эту игру играют уже год. Список победителей за это время есть на их сайте.
federal
На олимпиадное тут не тянет, даже далеко не тянет.

p.s. форумчанам просто *бут мозх
am1808
отправил ради интереса

Код
void str_cpy( char** to_str, char* from_str ) {
    if ( !from_str ) {
        return;
    }

      if ( !( *to_str = ( char* )realloc( *to_str, strlen(from_str)*sizeof(char) + sizeof(char) ) ) ) {
                return;
        }

    if ( !memmove( *to_str, from_str, strlen( from_str )*sizeof(char) + sizeof(char) ) ) {
        if ( !*to_str ) {
            free( *to_str );
        }
        *to_str=NULL;
    }
}

void str_cat(char** to_str, char* from_str) {

    if ( !from_str ) {
        return;
    }

      if ( !( *to_str = ( char* )realloc( *to_str, ( !*to_str ? 0: strlen(*to_str)*sizeof(char) ) + strlen(from_str)*sizeof(char) + sizeof(char) ) ) ) {
                return;
        }

    if ( !memmove( *to_str + ( !*to_str ? 0: strlen(*to_str)*sizeof(char) ), from_str, strlen( from_str )*sizeof(char) + sizeof(char) ) ) {
        if ( !*to_str ) {
            free( *to_str );
        }
        *to_str=NULL;
    }

    
}


на что сразу же был получен ответ.
Что,собственно, и ожидаемо

Код
Thank you for taking the time to answer our challenge.

Unfortunately the answer you gave is not the answer we are looking for. I do hope that you at least enjoyed the challenge (-;

In all solutions that don't pass this stage we find at least 2 problems from the list of blocking problems that you can find at http://www.hola.org/issues.html

We realize that the bugs in your solution may have been due to a  hasty submission. Therefore, if this was your 1st submission you  are welcome re-check your code carefully, use the issues list we  gave, and try a 2nd attempt.

You can send this challenge to programmers you know and if they   will answer  the
question perfectly then you and your friend may win 2K NIS...Please remember to CC me when you forward the link to the challenge so I will know they came from you (http://www.TheCodeIL.com/5min_forward_rules.html).

Below is an email that you can use to forward to your friends.

Good Luck and again, Thank you!
Буратино
Да, мне кое какие моменты нужно исправить..

Скажите, а нафига "sizeof(char)" делать? Один ведь будет во всех системах, или нет?
am1808
размер типа правильно определять в runtime
demiurg_spb
Цитата(am1808 @ Mar 20 2013, 14:13) *
размер типа правильно определять в runtime
compiletime всё же cool.gif
Буратино
Цитата(am1808 @ Mar 20 2013, 14:13) *
размер типа правильно определять в runtime


Но ведь char всегда 8 бит, зачем так делать? Я понимаю "int", там могут быть вопросы, но с "char" мне кажется лишним "сайзофать".

Видимо в целом направление не верное в решении этой задачи. Поправлю свой вариант и попробуем иным путем пойтиsm.gif
am1808
Цитата(demiurg_spb @ Mar 20 2013, 14:17) *
compiletime всё же B)

да, конечно же compile-time, извиняюсь
aaarrr
Цитата(Буратино @ Mar 20 2013, 14:23) *
Но ведь char всегда 8 бит...

Далеко не всегда.
gerber
Цитата(Буратино @ Mar 20 2013, 13:09) *
Скажите, а нафига "sizeof(char)" делать?

Есть несколько правил "хорошего", "структурного" стиля программирования на C, которым учат в вузах. Например, "не использовать в С оператор goto", "использовать локальные переменные вместо глобальных, где это возможно", "давать переменным говорящие имена" и т. п.
sizeof(char) - это следствие из усвоенного правила "не использовать прямых констант в тексте программы, заменяя их по возможности дефайнами или константами".
Код
strlen(from_str)*sizeof(char)

Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего.
am1808
Цитата(Буратино @ Mar 20 2013, 14:23) *
Видимо в целом направление не верное в решении этой задачи.

В целом, постановка задачи неправильная.
Что вас в коде не устроило? приведите те ситуации, когда он не отработает?

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



Цитата(gerber @ Mar 20 2013, 14:28) *
Код
strlen(from_str)*sizeof(char)

Хотя в приведённом коде, по-моему, это явный перебор. И свидетельствует, скорее, о формальном подходе к программированию и непониманию происходящего.

Ну, вам виднее, товарисчь. Пиписьками меряться не стану с вами.
Хотя соглашусь, лишнее
demiurg_spb
Цитата(aaarrr @ Mar 20 2013, 14:27) *
Далеко не всегда.
Верно сказать что sizeof(char)==1 байт всегда и везде, ну а байт может быть любой размерности. Поэтому формально Буратино прав и нет никаких доводов в пользу использования sizeof(char) вместо 1 кроме эстетических.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.