Основы программирования на С++ для начинающих

Задача: “упростите код”

Есть целый класс задач, состоящих не в том, что “напишите свой код для того чтобы…”, а так: “перед вами готовый код – упростите и укоротите его”. Мне такого рода задачу в качестве теста по вакансии прислала крупная израильская фирма. Это очень интересный класс задач, который:

    • учит понимать чужой код;
  • требует тонкого знания синтаксиса для упрощения.

Для практического программиста такие задачи ценнее, чем просто самому написать … Hello World! Интересно то, что код задачи нужно бы упростить почти не разбираясь что этот код должен делать – по правилам формального синтаксиса C++.

В данной задаче:
func1() – в точности исходный код функции, который нужно упростить;
func2() – то что у меня получилось после упрощения;
– … а всё остальное (main) – это тест сравнения выполнения 2-х вариантов на нескольких примерах.


Результат выполнения:

с++ задачи и решение, исходный код, практика программирования на c++

5 thoughts on “Задача: “упростите код”

  1. Ну и результат выполнения теста тогда нужно показать для полноты картины:

    $ ./strsimpl
    1 : => 3[2] ... 3[2]
    2 : => 7[6] ... 7[6]
    3 : => 3[2] ... 3[2]
    4 : => 5[4] ... 5[4]
    5 : => 6[5] ... 6[5]
    6 : => NULL ... NULL
    7 : => NULL ... NULL
    8 : => "" ... ""

  2. Кстати…
    Наши израильские друзья считают такое решение неверным – они мечтали о чём-то более кошерном ;-)

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

    Simplify the implementation below as much as you can.
    Even better if you can also improve performance as part of the simplification!
    FYI: This code is over 35 lines and over 300 tokens, but it can be written in 5 lines and in less than 60 tokens.

    Тестирование показывает полную эквивалентность func1() и func2().

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

  3. Задача состоит в оптимизации кода, ваше же решение обычное переписывание предложенного алгоритма с целью уменьшения количества строк.

  4. ” код задачи нужно бы упростить почти не разбираясь что этот код должен делать — по правилам формального синтаксиса C++.”
    Но это не очень соответствует условию в самом задании – там вроде нужно упростить саму реализацию. А значит, следует сначала постараться понять смысл функции, и тогда лучшее решение станет очевидным:

    1. Чуть-чуть поправил. В вашем варианте, не проверяется условие, когда один из параметров a и b равен ‘\0′, а второй не найден в s, а параметр s != “\0”.

      short i=0;
      do {
      if (s[i]==a || s[i]==b) return s+i;
      } while (s[i++]!=’\0’);
      return NULL;

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *